diff --git a/.env.example b/.env.example index f2efa8dd..c6d9033c 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,8 @@ VITE_GITHUB_APP_SLUG=tripwire-dev # VITE_REACT_SCAN_ENABLED=true # VITE_REACT_GRAB_ENABLED=true +# Optional in local dev. Leave blank to use file-backed PGlite at .tripwire/pglite. +# Required in production. DATABASE_URL= # Unkey rate limiting (optional - allows all requests if not set) diff --git a/.gitignore b/.gitignore index 579131fe..e08b54b9 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ dist-ssr # Tooling caches count.txt todos.json +/.tripwire # Tool-managed dirs (not source of truth) /.agents diff --git a/README.md b/README.md index 6be0c9dc..2c01e3b7 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,8 @@ The required vars: - `GITHUB_CLIENT_ID` / `GITHUB_CLIENT_SECRET` — from your GitHub OAuth App - `GITHUB_APP_ID` / `GITHUB_APP_PRIVATE_KEY` / `GITHUB_WEBHOOK_SECRET` — from your GitHub App - `VITE_GITHUB_APP_SLUG` — the slug from `github.com/apps/{slug}` -- `DATABASE_URL` — Postgres connection string +- `DATABASE_URL` — Postgres connection string. Optional in local dev; leave + blank to use file-backed PGlite at `.tripwire/pglite`. Optional: @@ -63,6 +64,9 @@ Push tables to db: pnpm db:push ``` +If `DATABASE_URL` is blank outside production, `pnpm db:push` and the app use +the local PGlite database. No Docker or local Postgres service is required. + Start the dev server: ```bash diff --git a/apps/web/drizzle.config.ts b/apps/web/drizzle.config.ts index 2158eee1..26a03e30 100644 --- a/apps/web/drizzle.config.ts +++ b/apps/web/drizzle.config.ts @@ -1,14 +1,48 @@ +import { mkdirSync } from "node:fs" +import { dirname, resolve } from "node:path" +import { fileURLToPath } from "node:url" import { config } from "dotenv" import { defineConfig } from "drizzle-kit" +const appDir = dirname(fileURLToPath(import.meta.url)) +const repoRoot = resolve(appDir, "../..") +const DEV_DATABASE_DIR = resolve(repoRoot, ".tripwire/pglite") + // .env lives at the monorepo root so all packages (web, future cli) share it. -config({ path: ["../../.env.local", "../../.env", ".env.local", ".env"] }) +config({ + path: [ + resolve(repoRoot, ".env.local"), + resolve(repoRoot, ".env"), + resolve(appDir, ".env.local"), + resolve(appDir, ".env"), + ], +}) + +const isProduction = process.env.NODE_ENV === "production" +const databaseUrl = process.env.DATABASE_URL + +if (isProduction && !databaseUrl) { + throw new Error("DATABASE_URL is required in production.") +} + +if (!databaseUrl) { + mkdirSync(dirname(DEV_DATABASE_DIR), { recursive: true }) +} export default defineConfig({ - out: "./drizzle", - schema: "../../packages/db/src/schema/index.ts", + out: resolve(appDir, "drizzle"), + schema: resolve(repoRoot, "packages/db/src/schema/index.ts"), dialect: "postgresql", - dbCredentials: { - url: process.env.DATABASE_URL!, - }, + ...(databaseUrl + ? { + dbCredentials: { + url: databaseUrl, + }, + } + : { + driver: "pglite", + dbCredentials: { + url: DEV_DATABASE_DIR, + }, + }), }) diff --git a/apps/web/package.json b/apps/web/package.json index cbd10bc4..a729dee3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -12,6 +12,7 @@ "lint": "biome check . --formatter-enabled=false --assist-enabled=false", "lint:fix": "biome check --write . --formatter-enabled=false --assist-enabled=false", "test": "vitest run", + "dev:seed-login": "NODE_ENV=development tsx src/scripts/seed-dev-login.ts", "typecheck": "tsc --noEmit", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", @@ -26,6 +27,7 @@ "@ai-sdk/react": "^3.0.186", "@base-ui/react": "^1.3.0", "@better-auth/infra": "^0.2.8", + "@electric-sql/pglite": "^0.4.6", "@json-render/core": "^0.18.0", "@json-render/react": "^0.18.0", "@modelcontextprotocol/sdk": "^1.29.0", @@ -43,17 +45,17 @@ "@streamdown/code": "^1.1.1", "@t3-oss/env-core": "^0.13.10", "@tailwindcss/vite": "^4.1.18", - "@tanstack/react-devtools": "latest", - "@tanstack/react-query": "latest", - "@tanstack/react-query-devtools": "latest", + "@tanstack/react-devtools": "0.10.5", + "@tanstack/react-query": "5.100.14", + "@tanstack/react-query-devtools": "5.100.14", "@tanstack/react-router": "1.168.24", "@tanstack/react-table": "^8.21.2", "@tanstack/react-router-devtools": "1.166.13", "@tanstack/react-router-ssr-query": "1.166.12", "@tanstack/react-start": "1.167.49", - "@tanstack/react-store": "latest", + "@tanstack/react-store": "0.11.0", "@tanstack/router-plugin": "1.167.27", - "@tanstack/store": "latest", + "@tanstack/store": "0.11.0", "@tripwire/ai": "workspace:*", "@tripwire/auth": "workspace:*", "@tripwire/core": "workspace:*", @@ -110,10 +112,10 @@ }, "devDependencies": { "@biomejs/biome": "2.2.4", - "@rsbuild/core": "latest", + "@rsbuild/core": "2.0.7", "@tailwindcss/typography": "^0.5.16", - "@tanstack/devtools-event-client": "latest", - "@tanstack/devtools-vite": "latest", + "@tanstack/devtools-event-client": "0.4.3", + "@tanstack/devtools-vite": "0.7.0", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^22.10.2", diff --git a/apps/web/src/components/layout/auth/login-page.tsx b/apps/web/src/components/layout/auth/login-page.tsx index 0c7059fd..9ad84400 100644 --- a/apps/web/src/components/layout/auth/login-page.tsx +++ b/apps/web/src/components/layout/auth/login-page.tsx @@ -1,8 +1,8 @@ -import { useNavigate } from "@tanstack/react-router" import { authClient } from "@tripwire/auth/client" -import { useEffect } from "react" +import { useEffect, useState } from "react" import { Button } from "@tripwire/ui/button" import { TripwireLogo } from "@tripwire/ui/icons/tripwire-logo" +import { Spinner } from "@tripwire/ui/spinner" export function LoginPageSkeleton() { return ( @@ -13,24 +13,56 @@ export function LoginPageSkeleton() { } export function LoginPage() { - const navigate = useNavigate() const { data: session, isPending } = authClient.useSession() + const [devLoginPending, setDevLoginPending] = useState(false) + const [devLoginError, setDevLoginError] = useState(null) - // Redirect to / if already logged in. The root resolver picks up - // from there and routes the user into their org workspace. + // Redirect signed-in users into the app shell. The legacy /home route + // resolves the active workspace and lands on the org-scoped home page. useEffect(() => { if (!isPending && session) { - navigate({ to: "/" }) + window.location.assign("/home") } - }, [session, isPending, navigate]) + }, [session, isPending]) - async function handleLogin() { + async function handleGithubLogin() { await authClient.signIn.social({ provider: "github", callbackURL: "/rules", }) } + async function handleDevLogin() { + setDevLoginPending(true) + setDevLoginError(null) + + try { + const seedResponse = await fetch("/api/dev/login", { + method: "POST", + }) + + if (!seedResponse.ok) { + const responseBody = (await seedResponse.json().catch(() => null)) as { + error?: string + message?: string + } | null + + throw new Error( + responseBody?.error ?? + responseBody?.message ?? + "Dev login is only available while running locally." + ) + } + + window.location.assign("/home") + } catch (error) { + setDevLoginError( + error instanceof Error ? error.message : "Dev login failed." + ) + setDevLoginPending(false) + } + } + if (isPending) { return } @@ -39,13 +71,26 @@ export function LoginPage() {
+ {devLoginError && ( +

+ {devLoginError} +

+ )}
) } diff --git a/apps/web/src/lib/dev-router-timing.ts b/apps/web/src/lib/dev-router-timing.ts index 9a669634..8e366737 100644 --- a/apps/web/src/lib/dev-router-timing.ts +++ b/apps/web/src/lib/dev-router-timing.ts @@ -1,4 +1,4 @@ -import type { AnyRouter, RouterEvents } from "@tanstack/router-core" +import type { AnyRouter, RouterEvents } from "@tanstack/react-router" /** Dev-only: logs client navigations from route resolve through first paint hook. */ export function attachDevRouterTiming(router: AnyRouter): void { diff --git a/apps/web/src/lib/dev-seed.ts b/apps/web/src/lib/dev-seed.ts new file mode 100644 index 00000000..49c4721b --- /dev/null +++ b/apps/web/src/lib/dev-seed.ts @@ -0,0 +1,508 @@ +import { and, eq, inArray } from "drizzle-orm" +import { auth } from "@tripwire/auth" +import { db } from "@tripwire/db/client" +import { + DEFAULT_RULE_CONFIG, + account, + blacklistEntries, + customRules, + events, + member, + onboardingState, + organization, + organizations, + repositories, + ruleConfigs, + user, + userPreferences, + whitelistEntries, + workflows, + type CustomRuleDefinition, + type OnboardingSetupAnswers, + type RuleConfig, + type WorkflowDefinition, +} from "@tripwire/db" + +const DEV_LOGIN_EMAIL = "dev@tripwire.local" +const DEV_LOGIN_PASSWORD = "tripwire-dev-password" + +const DEV_BA_ORG_ID = "dev-workspace" +const DEV_MEMBER_ID = "dev-workspace-owner" +const DEV_INSTALLATION_ID = 93_001 +const DEV_GITHUB_ACCOUNT_ID = 93_002 +const DEV_REPO_GITHUB_ID = 93_003 + +const SEEDED_ONBOARDING_SETUP_ANSWERS = { + useCases: ["ai_prs", "spam_issues"], + priorIncident: "Seeded local demo workspace.", + teamSize: "small", +} satisfies OnboardingSetupAnswers + +const seededRuleConfig: RuleConfig = { + ...DEFAULT_RULE_CONFIG, + accountAge: { enabled: true, action: "warn", days: 21 }, + maxPrsPerDay: { enabled: true, action: "block", limit: 3 }, + aiHoneypot: { enabled: true, action: "block" }, + repoFiles: { + ...DEFAULT_RULE_CONFIG.repoFiles, + prTemplate: { + autoSync: true, + honeypotEnabled: true, + honeypotPhrases: [{ kind: "natural", phrase: "mention the wax seal" }], + customContent: + "Please describe the intent of this change and any security-sensitive files touched.", + }, + }, +} + +const seededWorkflowDefinition: WorkflowDefinition = { + nodes: [ + { + id: "trigger-pr-opened", + type: "trigger", + position: { x: 0, y: 0 }, + data: { subtype: "pr_opened", label: "PR opened" }, + }, + { + id: "rule-account-age", + type: "rule", + position: { x: 260, y: 0 }, + data: { subtype: "accountAge", days: 21 }, + }, + { + id: "action-warn", + type: "action", + position: { x: 520, y: 0 }, + data: { subtype: "warn", message: "Ask for maintainer review" }, + }, + ], + edges: [ + { + id: "trigger-to-age", + source: "trigger-pr-opened", + target: "rule-account-age", + }, + { + id: "age-to-warn", + source: "rule-account-age", + target: "action-warn", + sourceHandle: "fail", + }, + ], +} + +const seededCustomRuleDefinition: CustomRuleDefinition = { + outputNodeId: "condition-suspicious-title", + nodes: [ + { + id: "condition-suspicious-title", + type: "condition", + position: { x: 0, y: 0 }, + data: { + field: "title", + operator: "contains", + value: "urgent", + }, + }, + ], + edges: [], +} + +export async function ensureDevLoginUser(headers = new Headers()) { + if (process.env.NODE_ENV !== "development") { + throw new Error("Dev login user is only available in development.") + } + + const [existing] = await db + .select({ id: user.id }) + .from(user) + .where(eq(user.email, DEV_LOGIN_EMAIL)) + .limit(1) + + if (existing) { + const [credentialAccount] = await db + .select({ id: account.id }) + .from(account) + .where( + and( + eq(account.userId, existing.id), + eq(account.providerId, "credential") + ) + ) + .limit(1) + + if (credentialAccount) return existing + + throw new Error( + `User ${existing.id} has no credential account; aborting dev login to avoid data loss.` + ) + } + + await auth.api.signUpEmail({ + body: { + name: "Dev User", + email: DEV_LOGIN_EMAIL, + password: DEV_LOGIN_PASSWORD, + }, + headers, + }) + + const [created] = await db + .select({ id: user.id }) + .from(user) + .where(eq(user.email, DEV_LOGIN_EMAIL)) + .limit(1) + + if (!created) { + throw new Error("Failed to create the dev login user.") + } + + return created +} + +export async function signInDevLoginUser(headers = new Headers()) { + if (process.env.NODE_ENV !== "development") { + throw new Error("Dev login is only available in development.") + } + + return auth.api.signInEmail({ + body: { + email: DEV_LOGIN_EMAIL, + password: DEV_LOGIN_PASSWORD, + callbackURL: "/home", + }, + headers, + asResponse: true, + }) +} + +export async function seedDevWorkspace() { + if (process.env.NODE_ENV !== "development") { + throw new Error("Dev seed is only available in development.") + } + + return db.transaction(async (tx) => { + const [devUser] = await tx + .select({ id: user.id }) + .from(user) + .where(eq(user.email, DEV_LOGIN_EMAIL)) + .limit(1) + + if (!devUser) { + throw new Error("Create the dev user before seeding workspace data.") + } + + const now = new Date() + + await tx + .insert(organization) + .values({ + id: DEV_BA_ORG_ID, + name: "Tripwire Dev", + slug: "tripwire-dev", + createdAt: now, + }) + .onConflictDoUpdate({ + target: organization.id, + set: { + name: "Tripwire Dev", + slug: "tripwire-dev", + }, + }) + + await tx + .insert(member) + .values({ + id: DEV_MEMBER_ID, + organizationId: DEV_BA_ORG_ID, + userId: devUser.id, + role: "owner", + createdAt: now, + }) + .onConflictDoUpdate({ + target: member.id, + set: { + organizationId: DEV_BA_ORG_ID, + userId: devUser.id, + role: "owner", + }, + }) + + const [tripwireOrg] = await tx + .insert(organizations) + .values({ + githubInstallationId: DEV_INSTALLATION_ID, + githubAccountId: DEV_GITHUB_ACCOUNT_ID, + githubAccountLogin: "tripwire-dev", + githubAccountType: "Organization", + avatarUrl: null, + ownerId: devUser.id, + betterAuthOrgId: DEV_BA_ORG_ID, + createdAt: now, + updatedAt: now, + }) + .onConflictDoUpdate({ + target: organizations.githubInstallationId, + set: { + githubAccountLogin: "tripwire-dev", + ownerId: devUser.id, + betterAuthOrgId: DEV_BA_ORG_ID, + updatedAt: now, + }, + }) + .returning({ id: organizations.id }) + + if (!tripwireOrg) { + throw new Error("Failed to seed Tripwire dev organization.") + } + + const [repo] = await tx + .insert(repositories) + .values({ + orgId: tripwireOrg.id, + githubRepoId: DEV_REPO_GITHUB_ID, + name: "example-repo", + fullName: "tripwire-dev/example-repo", + isPrivate: false, + createdAt: now, + updatedAt: now, + }) + .onConflictDoUpdate({ + target: repositories.githubRepoId, + set: { + orgId: tripwireOrg.id, + name: "example-repo", + fullName: "tripwire-dev/example-repo", + isPrivate: false, + updatedAt: now, + }, + }) + .returning({ id: repositories.id }) + + if (!repo) { + throw new Error("Failed to seed Tripwire dev repository.") + } + + await tx + .insert(ruleConfigs) + .values({ + repoId: repo.id, + config: seededRuleConfig, + createdAt: now, + updatedAt: now, + }) + .onConflictDoUpdate({ + target: ruleConfigs.repoId, + set: { + config: seededRuleConfig, + updatedAt: now, + }, + }) + + await tx + .insert(userPreferences) + .values({ + userId: devUser.id, + activeOrgId: DEV_BA_ORG_ID, + activeRepoId: repo.id, + updatedAt: now, + }) + .onConflictDoUpdate({ + target: userPreferences.userId, + set: { + activeOrgId: DEV_BA_ORG_ID, + activeRepoId: repo.id, + updatedAt: now, + }, + }) + + await tx + .insert(onboardingState) + .values({ + userId: devUser.id, + completedStep1: true, + completedStep2: true, + completedStep3: true, + completedStep4: true, + mainRepoId: repo.id, + source: "other", + setupAnswers: SEEDED_ONBOARDING_SETUP_ANSWERS, + gettingStartedDismissed: false, + configuredRules: true, + reviewedRiskAlerts: true, + vouchedSomeone: true, + createdAt: now, + updatedAt: now, + }) + .onConflictDoUpdate({ + target: onboardingState.userId, + set: { + completedStep1: true, + completedStep2: true, + completedStep3: true, + completedStep4: true, + mainRepoId: repo.id, + source: "other", + setupAnswers: SEEDED_ONBOARDING_SETUP_ANSWERS, + gettingStartedDismissed: false, + configuredRules: true, + reviewedRiskAlerts: true, + vouchedSomeone: true, + updatedAt: now, + }, + }) + + const [existingWorkflow] = await tx + .select({ id: workflows.id }) + .from(workflows) + .where( + and( + eq(workflows.repoId, repo.id), + eq(workflows.name, "Review new contributors") + ) + ) + .limit(1) + + if (existingWorkflow) { + await tx + .update(workflows) + .set({ + description: + "Warn when a new pull request comes from a young account.", + definition: seededWorkflowDefinition, + enabled: true, + updatedAt: now, + }) + .where(eq(workflows.id, existingWorkflow.id)) + } else { + await tx.insert(workflows).values({ + repoId: repo.id, + name: "Review new contributors", + description: "Warn when a new pull request comes from a young account.", + definition: seededWorkflowDefinition, + enabled: true, + createdAt: now, + updatedAt: now, + }) + } + + const [existingCustomRule] = await tx + .select({ id: customRules.id }) + .from(customRules) + .where( + and( + eq(customRules.repoId, repo.id), + eq(customRules.name, "Urgent title check") + ) + ) + .limit(1) + + if (existingCustomRule) { + await tx + .update(customRules) + .set({ + description: "Flags titles that use urgency language.", + definition: seededCustomRuleDefinition, + action: "warn", + enabled: true, + priority: 10, + updatedAt: now, + }) + .where(eq(customRules.id, existingCustomRule.id)) + } else { + await tx.insert(customRules).values({ + repoId: repo.id, + name: "Urgent title check", + description: "Flags titles that use urgency language.", + definition: seededCustomRuleDefinition, + action: "warn", + enabled: true, + priority: 10, + createdAt: now, + updatedAt: now, + }) + } + + await tx + .insert(whitelistEntries) + .values({ + repoId: repo.id, + githubUsername: "trusted-maintainer", + githubUserId: 91_001, + addedById: devUser.id, + createdAt: now, + }) + .onConflictDoNothing() + + await tx + .insert(blacklistEntries) + .values({ + repoId: repo.id, + githubUsername: "drive-by-spammer", + githubUserId: 91_002, + addedById: devUser.id, + createdAt: now, + }) + .onConflictDoNothing() + + const seededPipelineIds = ["dev-seed-1", "dev-seed-2", "dev-seed-3"] + await tx + .delete(events) + .where( + and( + eq(events.repoId, repo.id), + inArray(events.pipelineId, seededPipelineIds) + ) + ) + + await tx.insert(events).values([ + { + repoId: repo.id, + action: "pipeline_blocked", + severity: "error", + description: "@drive-by-spammer was blocked by the AI honeypot rule.", + contentType: "pull_request", + pipelineId: "dev-seed-1", + ruleName: "AI honeypot", + targetGithubUsername: "drive-by-spammer", + targetGithubUserId: 91_002, + githubRef: "PR #42", + metadata: { title: "urgent fix", filesChanged: 18 }, + createdAt: now, + }, + { + repoId: repo.id, + action: "pipeline_warned", + severity: "warning", + description: "@new-contributor triggered the account age warning.", + contentType: "pull_request", + pipelineId: "dev-seed-2", + ruleName: "Account age", + targetGithubUsername: "new-contributor", + targetGithubUserId: 91_003, + githubRef: "PR #43", + metadata: { accountAgeDays: 6 }, + createdAt: now, + }, + { + repoId: repo.id, + action: "whitelist_bypass", + severity: "success", + description: "@trusted-maintainer bypassed checks from the whitelist.", + contentType: "comment", + pipelineId: "dev-seed-3", + targetGithubUsername: "trusted-maintainer", + targetGithubUserId: 91_001, + githubRef: "Comment #44", + metadata: { source: "dev-seed" }, + createdAt: now, + }, + ]) + + return { + userId: devUser.id, + orgId: DEV_BA_ORG_ID, + repoId: repo.id, + } + }) +} diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index fc37a5d1..d6760bd1 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -45,6 +45,7 @@ import { Route as ApiOauthAppInfoRouteImport } from './routes/api/oauth/app-info import { Route as ApiGithubWebhookRouteImport } from './routes/api/github/webhook' import { Route as ApiGithubInstallRouteImport } from './routes/api/github/install' import { Route as ApiGithubCallbackRouteImport } from './routes/api/github/callback' +import { Route as ApiDevLoginRouteImport } from './routes/api/dev/login' import { Route as ApiAuthSplatRouteImport } from './routes/api/auth/$' import { Route as AppUsersUsernameRouteImport } from './routes/_app/users/$username' import { Route as AppSettingsGeneralRouteImport } from './routes/_app/settings/general' @@ -262,6 +263,11 @@ const ApiGithubCallbackRoute = ApiGithubCallbackRouteImport.update({ path: '/api/github/callback', getParentRoute: () => rootRouteImport, } as any) +const ApiDevLoginRoute = ApiDevLoginRouteImport.update({ + id: '/api/dev/login', + path: '/api/dev/login', + getParentRoute: () => rootRouteImport, +} as any) const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({ id: '/api/auth/$', path: '/api/auth/$', @@ -494,6 +500,7 @@ export interface FileRoutesByFullPath { '/settings/general': typeof AppSettingsGeneralRoute '/users/$username': typeof AppUsersUsernameRoute '/api/auth/$': typeof ApiAuthSplatRoute + '/api/dev/login': typeof ApiDevLoginRoute '/api/github/callback': typeof ApiGithubCallbackRoute '/api/github/install': typeof ApiGithubInstallRoute '/api/github/webhook': typeof ApiGithubWebhookRoute @@ -565,6 +572,7 @@ export interface FileRoutesByTo { '/settings/general': typeof AppSettingsGeneralRoute '/users/$username': typeof AppUsersUsernameRoute '/api/auth/$': typeof ApiAuthSplatRoute + '/api/dev/login': typeof ApiDevLoginRoute '/api/github/callback': typeof ApiGithubCallbackRoute '/api/github/install': typeof ApiGithubInstallRoute '/api/github/webhook': typeof ApiGithubWebhookRoute @@ -640,6 +648,7 @@ export interface FileRoutesById { '/_app/settings/general': typeof AppSettingsGeneralRoute '/_app/users/$username': typeof AppUsersUsernameRoute '/api/auth/$': typeof ApiAuthSplatRoute + '/api/dev/login': typeof ApiDevLoginRoute '/api/github/callback': typeof ApiGithubCallbackRoute '/api/github/install': typeof ApiGithubInstallRoute '/api/github/webhook': typeof ApiGithubWebhookRoute @@ -714,6 +723,7 @@ export interface FileRouteTypes { | '/settings/general' | '/users/$username' | '/api/auth/$' + | '/api/dev/login' | '/api/github/callback' | '/api/github/install' | '/api/github/webhook' @@ -785,6 +795,7 @@ export interface FileRouteTypes { | '/settings/general' | '/users/$username' | '/api/auth/$' + | '/api/dev/login' | '/api/github/callback' | '/api/github/install' | '/api/github/webhook' @@ -859,6 +870,7 @@ export interface FileRouteTypes { | '/_app/settings/general' | '/_app/users/$username' | '/api/auth/$' + | '/api/dev/login' | '/api/github/callback' | '/api/github/install' | '/api/github/webhook' @@ -909,6 +921,7 @@ export interface RootRouteChildren { ApiMcpRoute: typeof ApiMcpRoute OauthConsentRoute: typeof OauthConsentRoute ApiAuthSplatRoute: typeof ApiAuthSplatRoute + ApiDevLoginRoute: typeof ApiDevLoginRoute ApiGithubCallbackRoute: typeof ApiGithubCallbackRoute ApiGithubInstallRoute: typeof ApiGithubInstallRoute ApiGithubWebhookRoute: typeof ApiGithubWebhookRoute @@ -1174,6 +1187,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ApiGithubCallbackRouteImport parentRoute: typeof rootRouteImport } + '/api/dev/login': { + id: '/api/dev/login' + path: '/api/dev/login' + fullPath: '/api/dev/login' + preLoaderRoute: typeof ApiDevLoginRouteImport + parentRoute: typeof rootRouteImport + } '/api/auth/$': { id: '/api/auth/$' path: '/api/auth/$' @@ -1629,6 +1649,7 @@ const rootRouteChildren: RootRouteChildren = { ApiMcpRoute: ApiMcpRoute, OauthConsentRoute: OauthConsentRoute, ApiAuthSplatRoute: ApiAuthSplatRoute, + ApiDevLoginRoute: ApiDevLoginRoute, ApiGithubCallbackRoute: ApiGithubCallbackRoute, ApiGithubInstallRoute: ApiGithubInstallRoute, ApiGithubWebhookRoute: ApiGithubWebhookRoute, diff --git a/apps/web/src/routes/api/dev/login.ts b/apps/web/src/routes/api/dev/login.ts new file mode 100644 index 00000000..10b312f0 --- /dev/null +++ b/apps/web/src/routes/api/dev/login.ts @@ -0,0 +1,34 @@ +import { createFileRoute } from "@tanstack/react-router" +import { + ensureDevLoginUser, + seedDevWorkspace, + signInDevLoginUser, +} from "#/lib/dev-seed" + +async function postDevLogin({ request }: { request: Request }) { + if (process.env.NODE_ENV !== "development") { + return Response.json({ error: "Not found" }, { status: 404 }) + } + + try { + await ensureDevLoginUser(request.headers) + await seedDevWorkspace() + } catch (error) { + return Response.json( + { + error: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + + return signInDevLoginUser(request.headers) +} + +export const Route = createFileRoute("/api/dev/login")({ + server: { + handlers: { + POST: postDevLogin, + }, + }, +}) diff --git a/apps/web/src/scripts/seed-dev-login.ts b/apps/web/src/scripts/seed-dev-login.ts new file mode 100644 index 00000000..ff2312d4 --- /dev/null +++ b/apps/web/src/scripts/seed-dev-login.ts @@ -0,0 +1,10 @@ +import { ensureDevLoginUser, seedDevWorkspace } from "#/lib/dev-seed" + +const user = await ensureDevLoginUser() +const seeded = await seedDevWorkspace() + +console.info( + `Seeded dev login for ${user.id}: org ${seeded.orgId}, repo ${seeded.repoId}` +) + +process.exit(0) diff --git a/package.json b/package.json index e2e5cbe6..047661d9 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,11 @@ "typescript": "^5.7.2" }, "pnpm": { + "overrides": { + "@rsbuild/core": "2.0.7", + "@rspack/binding": "2.0.4", + "@rspack/core": "2.0.4" + }, "onlyBuiltDependencies": [ "esbuild", "lightningcss" diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts index 3b8e6cb3..ed83746f 100644 --- a/packages/auth/src/index.ts +++ b/packages/auth/src/index.ts @@ -42,6 +42,9 @@ export const auth = betterAuth({ scope: ["read:user", "user:email", "read:org"], }, }, + emailAndPassword: { + enabled: env.NODE_ENV === "development", + }, user: { deleteUser: { enabled: true, @@ -223,15 +226,16 @@ export const auth = betterAuth({ console.error("[Tripwire] Failed to auto-create org:", err) } - // Create Autumn billing customer (idempotent) - try { - await autumnClient.customers.getOrCreate({ - customerId: user.id, - name: user.name, - email: user.email, - }) - } catch (err) { - console.error("[Tripwire] Failed to create Autumn customer:", err) + if (env.AUTUMN_SECRET_KEY) { + try { + await autumnClient.customers.getOrCreate({ + customerId: user.id, + name: user.name, + email: user.email, + }) + } catch (err) { + console.error("[Tripwire] Failed to create Autumn customer:", err) + } } }, }, diff --git a/packages/db/package.json b/packages/db/package.json index 55484b2b..ed789ae2 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -13,6 +13,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@electric-sql/pglite": "^0.4.6", "@tripwire/env": "workspace:*", "drizzle-orm": "^0.45.1", "pg": "^8.16.3", diff --git a/packages/db/src/connection.ts b/packages/db/src/connection.ts index 79e02734..2cbb6025 100644 --- a/packages/db/src/connection.ts +++ b/packages/db/src/connection.ts @@ -1,11 +1,51 @@ -import { drizzle } from "drizzle-orm/node-postgres" +import { existsSync, mkdirSync } from "node:fs" +import { createRequire } from "node:module" +import { dirname, resolve } from "node:path" +import { fileURLToPath } from "node:url" +import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres" import { env } from "@tripwire/env/server" import * as schema from "./schema" -if (!env.DATABASE_URL) { +type PgliteDrizzleModule = typeof import("drizzle-orm/pglite") + +function findMonorepoRoot(startDir: string): string { + let dir = startDir + for (let i = 0; i < 10; i++) { + if (existsSync(resolve(dir, "pnpm-workspace.yaml"))) return dir + const parent = dirname(dir) + if (parent === dir) break + dir = parent + } + return process.cwd() +} + +const here = dirname(fileURLToPath(import.meta.url)) +const require = createRequire(import.meta.url) +const monorepoRoot = findMonorepoRoot(here) +const DEV_DATABASE_DIR = resolve(monorepoRoot, ".tripwire/pglite") +const isProduction = process.env.NODE_ENV === "production" +const shouldUseDevDatabase = !isProduction && !env.DATABASE_URL + +if (isProduction && !env.DATABASE_URL) { throw new Error("DATABASE_URL is required for @tripwire/db.") } -export const db = drizzle(env.DATABASE_URL, { schema }) +if (shouldUseDevDatabase) { + mkdirSync(dirname(DEV_DATABASE_DIR), { recursive: true }) +} + +const createPostgresDatabase = () => + drizzlePostgres(env.DATABASE_URL!, { schema }) +type AppDatabase = ReturnType + +const createDevDatabase = () => { + const pgliteDriver = "drizzle-orm/pglite" + const { drizzle } = require(pgliteDriver) as PgliteDrizzleModule + return drizzle(DEV_DATABASE_DIR, { schema }) as unknown as AppDatabase +} + +export const db: AppDatabase = shouldUseDevDatabase + ? createDevDatabase() + : createPostgresDatabase() export type Database = typeof db diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b608a2fa..3a2459ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@rsbuild/core': 2.0.7 + '@rspack/binding': 2.0.4 + '@rspack/core': 2.0.4 + importers: .: @@ -49,7 +54,10 @@ importers: version: 1.4.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@better-auth/infra': specifier: ^0.2.8 - version: 0.2.8(f6aba15f7298c83ad20760884f7a5591) + version: 0.2.8(ca635e65c532e154708b0fa02055fd51) + '@electric-sql/pglite': + specifier: ^0.4.6 + version: 0.4.6 '@json-render/core': specifier: ^0.18.0 version: 0.18.0(zod@4.3.6) @@ -102,13 +110,13 @@ importers: specifier: ^4.1.18 version: 4.2.4(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-devtools': - specifier: latest + specifier: 0.10.5 version: 0.10.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12) '@tanstack/react-query': - specifier: latest + specifier: 5.100.14 version: 5.100.14(react@19.2.5) '@tanstack/react-query-devtools': - specifier: latest + specifier: 5.100.14 version: 5.100.14(@tanstack/react-query@5.100.14(react@19.2.5))(react@19.2.5) '@tanstack/react-router': specifier: 1.168.24 @@ -118,12 +126,12 @@ importers: version: 1.166.13(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-router-ssr-query': specifier: 1.166.12 - version: 1.166.12(@tanstack/query-core@5.100.14)(@tanstack/react-query@5.100.14(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 1.166.12(@tanstack/query-core@5.101.0)(@tanstack/react-query@5.100.14(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-start': specifier: 1.167.49 version: 1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-store': - specifier: latest + specifier: 0.11.0 version: 0.11.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-table': specifier: ^8.21.2 @@ -132,7 +140,7 @@ importers: specifier: 1.167.27 version: 1.167.27(@rsbuild/core@2.0.7)(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/store': - specifier: latest + specifier: 0.11.0 version: 0.11.0 '@tripwire/ai': specifier: workspace:* @@ -190,10 +198,10 @@ importers: version: 6.0.184(zod@4.3.6) autumn-js: specifier: ^1.2.12 - version: 1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) + version: 1.2.12(c808154b541409adedb88d3b35bdb7c7) better-auth: specifier: ^1.5.3 - version: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -205,13 +213,13 @@ importers: version: 0.31.10 drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.2.5) evlog: specifier: ^2.17.0 - version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) framer-motion: specifier: ^12.38.0 version: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -235,7 +243,7 @@ importers: version: 1.1.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) nitro: specifier: ^3.0.260311-beta - version: 3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) nuqs: specifier: ^2.8.9 version: 2.8.9(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) @@ -298,16 +306,16 @@ importers: specifier: 2.2.4 version: 2.2.4 '@rsbuild/core': - specifier: latest + specifier: 2.0.7 version: 2.0.7 '@tailwindcss/typography': specifier: ^0.5.16 version: 0.5.19(tailwindcss@4.2.4) '@tanstack/devtools-event-client': - specifier: latest + specifier: 0.4.3 version: 0.4.3 '@tanstack/devtools-vite': - specifier: latest + specifier: 0.7.0 version: 0.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@testing-library/dom': specifier: ^10.4.1 @@ -365,7 +373,7 @@ importers: version: 2.0.0-beta.0(ai@6.0.184(zod@4.3.6))(react@19.2.5) '@ai-sdk-tools/memory': specifier: 2.0.0-beta.0 - version: 2.0.0-beta.0(ai@6.0.184(zod@4.3.6))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(redis@4.7.1) + version: 2.0.0-beta.0(ai@6.0.184(zod@4.3.6))(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(redis@4.7.1) '@tripwire/auth': specifier: workspace:* version: link:../auth @@ -380,16 +388,16 @@ importers: version: 6.0.184(zod@4.3.6) autumn-js: specifier: ^1.2.12 - version: 1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) + version: 1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) evlog: specifier: ^2.17.0 - version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta - version: 3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) react: specifier: ^19.2.0 version: 19.2.5 @@ -414,7 +422,7 @@ importers: dependencies: '@better-auth/infra': specifier: ^0.2.8 - version: 0.2.8(dd57db0571ca17b25b242dbb191dd2e6) + version: 0.2.8(edc5640e000683c325b3677d7b6efbc6) '@tanstack/react-router': specifier: 1.168.24 version: 1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -429,13 +437,13 @@ importers: version: link:../github autumn-js: specifier: ^1.2.12 - version: 1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) + version: 1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) better-auth: specifier: ^1.5.3 - version: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) react: specifier: ^19.2.0 version: 19.2.5 @@ -463,10 +471,10 @@ importers: version: link:../github drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) evlog: specifier: ^2.17.0 - version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: ^4.3.6 version: 4.3.6 @@ -483,12 +491,15 @@ importers: packages/db: dependencies: + '@electric-sql/pglite': + specifier: ^0.4.6 + version: 0.4.6 '@tripwire/env': specifier: workspace:* version: link:../env drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) pg: specifier: ^8.16.3 version: 8.20.0 @@ -566,10 +577,10 @@ importers: version: link:../env drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) evlog: specifier: ^2.17.0 - version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) jose: specifier: 5.9.6 version: 5.9.6 @@ -616,7 +627,7 @@ importers: version: 2.1.4 evlog: specifier: ^2.17.0 - version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) devDependencies: '@types/node': specifier: ^22.10.2 @@ -666,10 +677,10 @@ importers: version: 6.0.184(zod@4.3.6) drizzle-orm: specifier: ^0.45.1 - version: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + version: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) evlog: specifier: ^2.17.0 - version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: ^4.3.6 version: 4.3.6 @@ -1222,6 +1233,9 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@electric-sql/pglite@0.4.6': + resolution: {integrity: sha512-qmlmfN8UyKCee35qkV0r/MBp+Znl8FjBz7OpoglNvww3GJpw0/DLP0o1ZymvLNmcD5DTLOQdzKPtF8Hd3mdl1w==} + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -4281,6 +4295,9 @@ packages: '@tanstack/query-core@5.100.14': resolution: {integrity: sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew==} + '@tanstack/query-core@5.101.0': + resolution: {integrity: sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow==} + '@tanstack/query-devtools@5.100.14': resolution: {integrity: sha512-g96SmSSQecYTYcyuAMRXr895GplJv01UGt7qttQWPOUyZ5EGz5tbRc589bMc2m5BsPFD6O0PCEAHdbDYNP6UBw==} @@ -4344,7 +4361,7 @@ packages: resolution: {integrity: sha512-rSEXRHAyP1iKTyzawdm2N44m1y9lP+f4K/BnTTGv2R9jPALmWXQZHWYw3mevjzGiXw2TTzQEZ0tJFuXc64MywQ==} engines: {node: '>=22.12.0'} peerDependencies: - '@rspack/core': '>=2.0.0-0' + '@rspack/core': 2.0.4 '@vitejs/plugin-rsc': '>=0.5.20' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -4369,7 +4386,7 @@ packages: engines: {node: '>=22.12.0'} hasBin: true peerDependencies: - '@rsbuild/core': ^2.0.0 + '@rsbuild/core': 2.0.7 '@vitejs/plugin-rsc': '*' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -4425,7 +4442,7 @@ packages: engines: {node: '>=20.19'} hasBin: true peerDependencies: - '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@rsbuild/core': 2.0.7 '@tanstack/react-router': ^1.168.24 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 @@ -4466,7 +4483,7 @@ packages: resolution: {integrity: sha512-gbPmbelQI7aLWxJn5M5XPoGvFKMf3rRU7J3RXNB9WO5lfrNVTEltKV6zBsW7HuJGxIspJRhsrA1c0AtjTsJAvw==} engines: {node: '>=22.12.0'} peerDependencies: - '@rsbuild/core': ^2.0.0 + '@rsbuild/core': 2.0.7 vite: '>=7.0.0' peerDependenciesMeta: '@rsbuild/core': @@ -9186,12 +9203,12 @@ snapshots: - supports-color - zod - '@ai-sdk-tools/memory@2.0.0-beta.0(ai@6.0.184(zod@4.3.6))(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(redis@4.7.1)': + '@ai-sdk-tools/memory@2.0.0-beta.0(ai@6.0.184(zod@4.3.6))(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(redis@4.7.1)': dependencies: zod: 4.3.6 optionalDependencies: ai: 6.0.184(zod@4.3.6) - drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) redis: 4.7.1 '@ai-sdk-tools/store@2.0.0-beta.0(@ai-sdk/react@3.0.186(react@19.2.5)(zod@4.3.6))(react@19.2.5)(zod@4.3.6)(zustand@5.0.13(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)))': @@ -9460,37 +9477,37 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.1 - '@better-auth/drizzle-adapter@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))': + '@better-auth/drizzle-adapter@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0) '@better-auth/utils': 0.4.0 optionalDependencies: - drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) - '@better-auth/drizzle-adapter@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))': + '@better-auth/drizzle-adapter@1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) '@better-auth/utils': 0.4.0 optionalDependencies: - drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) - '@better-auth/infra@0.2.8(dd57db0571ca17b25b242dbb191dd2e6)': + '@better-auth/infra@0.2.8(ca635e65c532e154708b0fa02055fd51)': dependencies: - '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) - '@better-auth/sso': 1.6.9(6559e4c72fc3d887f3fca4da37520e74) + '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0) + '@better-auth/sso': 1.6.9(4dfaf1bd1561cb4fcf091731981e9a6a) '@better-fetch/fetch': 1.1.21 - better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) better-call: 1.3.5(zod@4.3.6) jose: 6.2.2 libphonenumber-js: 1.13.2 zod: 4.3.6 - '@better-auth/infra@0.2.8(f6aba15f7298c83ad20760884f7a5591)': + '@better-auth/infra@0.2.8(edc5640e000683c325b3677d7b6efbc6)': dependencies: - '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0) - '@better-auth/sso': 1.6.9(8508c6f534b0740184f29160f40ce5fe) + '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) + '@better-auth/sso': 1.6.9(0b553cb428c1c612ba323abd85ddf3ac) '@better-fetch/fetch': 1.1.21 - better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) better-call: 1.3.5(zod@4.3.6) jose: 6.2.2 libphonenumber-js: 1.13.2 @@ -9540,12 +9557,12 @@ snapshots: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) '@better-auth/utils': 0.4.0 - '@better-auth/sso@1.6.9(6559e4c72fc3d887f3fca4da37520e74)': + '@better-auth/sso@1.6.9(0b553cb428c1c612ba323abd85ddf3ac)': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) '@better-auth/utils': 0.4.0 '@better-fetch/fetch': 1.1.21 - better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) better-call: 1.3.5(zod@4.3.6) fast-xml-parser: 5.7.2 jose: 6.2.2 @@ -9553,12 +9570,12 @@ snapshots: tldts: 6.1.86 zod: 4.3.6 - '@better-auth/sso@1.6.9(8508c6f534b0740184f29160f40ce5fe)': + '@better-auth/sso@1.6.9(4dfaf1bd1561cb4fcf091731981e9a6a)': dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0) '@better-auth/utils': 0.4.0 '@better-fetch/fetch': 1.1.21 - better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) better-call: 1.3.5(zod@4.3.6) fast-xml-parser: 5.7.2 jose: 6.2.2 @@ -9672,6 +9689,8 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} + '@electric-sql/pglite@0.4.6': {} + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -12593,6 +12612,8 @@ snapshots: '@tanstack/query-core@5.100.14': {} + '@tanstack/query-core@5.101.0': {} + '@tanstack/query-devtools@5.100.14': {} '@tanstack/react-devtools@0.10.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)': @@ -12630,12 +12651,12 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/react-router-ssr-query@1.166.12(@tanstack/query-core@5.100.14)(@tanstack/react-query@5.100.14(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@tanstack/react-router-ssr-query@1.166.12(@tanstack/query-core@5.101.0)(@tanstack/react-query@5.100.14(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/query-core': 5.100.14 + '@tanstack/query-core': 5.101.0 '@tanstack/react-query': 5.100.14(react@19.2.5) '@tanstack/react-router': 1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-ssr-query-core': 1.168.0(@tanstack/query-core@5.100.14)(@tanstack/router-core@1.168.16) + '@tanstack/router-ssr-query-core': 1.168.0(@tanstack/query-core@5.101.0)(@tanstack/router-core@1.168.16) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) transitivePeerDependencies: @@ -12788,9 +12809,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.168.0(@tanstack/query-core@5.100.14)(@tanstack/router-core@1.168.16)': + '@tanstack/router-ssr-query-core@1.168.0(@tanstack/query-core@5.101.0)(@tanstack/router-core@1.168.16)': dependencies: - '@tanstack/query-core': 5.100.14 + '@tanstack/query-core': 5.101.0 '@tanstack/router-core': 1.168.16 '@tanstack/router-utils@1.161.7': @@ -13586,26 +13607,26 @@ snapshots: auto-bind@5.0.1: {} - autumn-js@1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5): + autumn-js@1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5): dependencies: query-string: 9.3.1 rou3: 0.6.3 zod: 4.3.6 optionalDependencies: - better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) better-call: 1.3.5(zod@4.3.6) express: 5.2.1 hono: 4.12.18 next: 16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: 19.2.5 - autumn-js@1.2.12(better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(better-call@1.3.5(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5): + autumn-js@1.2.12(c808154b541409adedb88d3b35bdb7c7): dependencies: query-string: 9.3.1 rou3: 0.6.3 zod: 4.3.6 optionalDependencies: - better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) better-call: 1.3.5(zod@4.3.6) express: 5.2.1 hono: 4.12.18 @@ -13651,10 +13672,10 @@ snapshots: baseline-browser-mapping@2.10.21: {} - better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): + better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) - '@better-auth/drizzle-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) + '@better-auth/drizzle-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) '@better-auth/kysely-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(kysely@0.28.16) '@better-auth/memory-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0) '@better-auth/mongo-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@5.9.6)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0) @@ -13673,7 +13694,7 @@ snapshots: optionalDependencies: '@tanstack/react-start': 1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) drizzle-kit: 0.31.10 - drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) next: 16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) pg: 8.20.0 react: 19.2.5 @@ -13684,10 +13705,10 @@ snapshots: - '@cloudflare/workers-types' - '@opentelemetry/api' - better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): + better-auth@1.6.9(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.20.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(jiti@2.6.1)(jsdom@28.1.0(@noble/hashes@2.2.0))(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@better-auth/core': 1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0) - '@better-auth/drizzle-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) + '@better-auth/drizzle-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) '@better-auth/kysely-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(kysely@0.28.16) '@better-auth/memory-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0) '@better-auth/mongo-adapter': 1.6.9(@better-auth/core@1.6.9(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.2)(kysely@0.28.16)(nanostores@1.3.0))(@better-auth/utils@0.4.0) @@ -13706,7 +13727,7 @@ snapshots: optionalDependencies: '@tanstack/react-start': 1.167.49(@rsbuild/core@2.0.7)(@rspack/core@2.0.4(@swc/helpers@0.5.21))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) drizzle-kit: 0.31.10 - drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) next: 16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) pg: 8.20.0 react: 19.2.5 @@ -14276,9 +14297,10 @@ snapshots: dayjs@1.11.20: {} - db0@0.3.4(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)): + db0@0.3.4(@electric-sql/pglite@0.4.6)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)): optionalDependencies: - drizzle-orm: 0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) + '@electric-sql/pglite': 0.4.6 + drizzle-orm: 0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0) debounce-fn@6.0.0: dependencies: @@ -14379,8 +14401,9 @@ snapshots: esbuild: 0.25.12 tsx: 4.21.0 - drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0): + drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0): optionalDependencies: + '@electric-sql/pglite': 0.4.6 '@opentelemetry/api': 1.9.1 '@types/pg': 8.20.0 kysely: 0.28.16 @@ -14649,23 +14672,13 @@ snapshots: dependencies: eventsource-parser: 3.0.8 - evlog@2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): - optionalDependencies: - ai: 6.0.184(zod@4.3.6) - express: 5.2.1 - hono: 4.12.18 - next: 16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - nitro: 3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) - react: 19.2.5 - vite: 7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) - - evlog@2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): + evlog@2.17.0(ai@6.0.184(zod@4.3.6))(express@5.2.1)(hono@4.12.18)(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)))(ofetch@2.0.0-alpha.3)(react@19.2.5)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: ai: 6.0.184(zod@4.3.6) express: 5.2.1 hono: 4.12.18 next: 16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - nitro: 3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + nitro: 3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) ofetch: 2.0.0-alpha.3 react: 19.2.5 vite: 7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) @@ -16138,11 +16151,11 @@ snapshots: nf3@0.3.16: {} - nitro@3.0.260311-beta(dotenv@17.4.2)(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): + nitro@3.0.260311-beta(@electric-sql/pglite@0.4.6)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0))(jiti@2.6.1)(lru-cache@11.3.5)(rollup@4.60.2)(vite@7.3.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.5(srvx@0.11.15) - db0: 0.3.4(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) + db0: 0.3.4(@electric-sql/pglite@0.4.6)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) env-runner: 0.1.7 h3: 2.0.1-rc.20(crossws@0.4.5(srvx@0.11.15)) hookable: 6.1.1 @@ -16153,7 +16166,7 @@ snapshots: rolldown: 1.0.0-rc.17 srvx: 0.11.15 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(db0@0.3.4(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)))(lru-cache@11.3.5)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(db0@0.3.4(@electric-sql/pglite@0.4.6)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)))(lru-cache@11.3.5)(ofetch@2.0.0-alpha.3) optionalDependencies: dotenv: 17.4.2 jiti: 2.6.1 @@ -17508,9 +17521,9 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unstorage@2.0.0-alpha.7(db0@0.3.4(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)))(lru-cache@11.3.5)(ofetch@2.0.0-alpha.3): + unstorage@2.0.0-alpha.7(db0@0.3.4(@electric-sql/pglite@0.4.6)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)))(lru-cache@11.3.5)(ofetch@2.0.0-alpha.3): optionalDependencies: - db0: 0.3.4(drizzle-orm@0.45.2(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) + db0: 0.3.4(@electric-sql/pglite@0.4.6)(drizzle-orm@0.45.2(@electric-sql/pglite@0.4.6)(@opentelemetry/api@1.9.1)(@types/pg@8.20.0)(kysely@0.28.16)(pg@8.20.0)) lru-cache: 11.3.5 ofetch: 2.0.0-alpha.3 diff --git a/screenshots/dev-login-review/01-dev-login-button.png b/screenshots/dev-login-review/01-dev-login-button.png new file mode 100644 index 00000000..dd120c1e Binary files /dev/null and b/screenshots/dev-login-review/01-dev-login-button.png differ diff --git a/screenshots/dev-login-review/02-after-dev-login.png b/screenshots/dev-login-review/02-after-dev-login.png new file mode 100644 index 00000000..d105b86a Binary files /dev/null and b/screenshots/dev-login-review/02-after-dev-login.png differ