diff --git a/.github/workflows/deploy-workers.yml b/.github/workflows/deploy-workers.yml index 3df20109..ee9eb0e5 100644 --- a/.github/workflows/deploy-workers.yml +++ b/.github/workflows/deploy-workers.yml @@ -42,11 +42,17 @@ jobs: - name: Build site (dev) run: pnpm --filter @codingcatdev/site build + - name: Deploy to Cloudflare Workers (dev.codingcat.dev) + run: pnpm --filter @codingcatdev/site exec wrangler deploy + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + - name: Configure Cloudflare Worker Secrets (dev) run: | - echo "$SANITY_API_READ_TOKEN" | pnpm --filter @codingcatdev/site exec wrangler secret put SANITY_API_READ_TOKEN + echo "$SANITY_API_READ_TOKEN" | pnpm --filter @codingcatdev/site exec wrangler secret put SANITY_API_READ_TOKEN --env="" if [ -n "$OPENROUTER_API_KEY" ]; then - echo "$OPENROUTER_API_KEY" | pnpm --filter @codingcatdev/site exec wrangler secret put OPENROUTER_API_KEY + echo "$OPENROUTER_API_KEY" | pnpm --filter @codingcatdev/site exec wrangler secret put OPENROUTER_API_KEY --env="" fi env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} @@ -54,12 +60,6 @@ jobs: SANITY_API_READ_TOKEN: ${{ secrets.SANITY_API_READ_TOKEN }} OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} - - name: Deploy to Cloudflare Workers (dev.codingcat.dev) - run: pnpm --filter @codingcatdev/site exec wrangler deploy - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - deploy-production: if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest @@ -88,6 +88,12 @@ jobs: - name: Build site (production) run: pnpm --filter @codingcatdev/site build:production + - name: Deploy to Cloudflare Workers (codingcat.dev) + run: pnpm --filter @codingcatdev/site exec wrangler deploy --env production + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + - name: Configure Cloudflare Worker Secrets (production) run: | echo "$SANITY_API_READ_TOKEN" | pnpm --filter @codingcatdev/site exec wrangler secret put SANITY_API_READ_TOKEN --env production @@ -99,9 +105,3 @@ jobs: CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} SANITY_API_READ_TOKEN: ${{ secrets.SANITY_API_READ_TOKEN }} OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} - - - name: Deploy to Cloudflare Workers (codingcat.dev) - run: pnpm --filter @codingcatdev/site exec wrangler deploy --env production - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} diff --git a/apps/site/migrations/0001_better_auth.sql b/apps/site/migrations/0001_better_auth.sql new file mode 100644 index 00000000..597ed603 --- /dev/null +++ b/apps/site/migrations/0001_better_auth.sql @@ -0,0 +1,201 @@ +-- Migration: 0001_better_auth.sql +-- Better Auth core + OAuth 2.1 Provider + MCP schema for Cloudflare D1 + +CREATE TABLE IF NOT EXISTS "user" ( + "id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "email" text NOT NULL UNIQUE, + "emailVerified" integer NOT NULL DEFAULT 0, + "image" text, + "createdAt" integer NOT NULL, + "updatedAt" integer NOT NULL +); + +CREATE TABLE IF NOT EXISTS "session" ( + "id" text PRIMARY KEY NOT NULL, + "expiresAt" integer NOT NULL, + "token" text NOT NULL UNIQUE, + "createdAt" integer NOT NULL, + "updatedAt" integer NOT NULL, + "ipAddress" text, + "userAgent" text, + "userId" text NOT NULL REFERENCES "user"("id") ON DELETE CASCADE +); + +CREATE INDEX IF NOT EXISTS "session_userId_idx" ON "session" ("userId"); + +CREATE TABLE IF NOT EXISTS "account" ( + "id" text PRIMARY KEY NOT NULL, + "accountId" text NOT NULL, + "providerId" text NOT NULL, + "userId" text NOT NULL REFERENCES "user"("id") ON DELETE CASCADE, + "accessToken" text, + "refreshToken" text, + "idToken" text, + "accessTokenExpiresAt" integer, + "refreshTokenExpiresAt" integer, + "scope" text, + "password" text, + "createdAt" integer NOT NULL, + "updatedAt" integer NOT NULL +); + +CREATE INDEX IF NOT EXISTS "account_userId_idx" ON "account" ("userId"); + +CREATE TABLE IF NOT EXISTS "verification" ( + "id" text PRIMARY KEY NOT NULL, + "identifier" text NOT NULL, + "value" text NOT NULL, + "expiresAt" integer NOT NULL, + "createdAt" integer NOT NULL, + "updatedAt" integer NOT NULL +); + +CREATE TABLE IF NOT EXISTS "jwks" ( + "id" text PRIMARY KEY NOT NULL, + "publicKey" text NOT NULL, + "privateKey" text NOT NULL, + "createdAt" integer NOT NULL, + "expiresAt" integer, + "alg" text, + "crv" text +); + +CREATE TABLE IF NOT EXISTS "oauthClient" ( + "id" text PRIMARY KEY NOT NULL, + "clientId" text NOT NULL UNIQUE, + "clientSecret" text, + "clientDiscoveryId" text, + "disabled" integer DEFAULT 0, + "skipConsent" integer DEFAULT 0, + "enableEndSession" integer DEFAULT 0, + "subjectType" text, + "scopes" text, + "clientCredentialsScopes" text, + "userId" text REFERENCES "user"("id") ON DELETE CASCADE, + "createdAt" integer, + "updatedAt" integer, + "name" text, + "uri" text, + "icon" text, + "contacts" text, + "tos" text, + "policy" text, + "softwareId" text, + "softwareVersion" text, + "softwareStatement" text, + "redirectUris" text NOT NULL, + "postLogoutRedirectUris" text, + "backchannelLogoutUri" text, + "backchannelLogoutSessionRequired" integer, + "tokenEndpointAuthMethod" text, + "applicationType" text, + "jwks" text, + "jwksUri" text, + "grantTypes" text, + "responseTypes" text, + "requirePKCE" integer DEFAULT 1, + "dpopBoundAccessTokens" integer DEFAULT 0, + "referenceId" text, + "metadata" text +); + +CREATE INDEX IF NOT EXISTS "oauthClient_userId_idx" ON "oauthClient" ("userId"); + +CREATE TABLE IF NOT EXISTS "oauthResource" ( + "id" text PRIMARY KEY NOT NULL, + "identifier" text NOT NULL UNIQUE, + "name" text NOT NULL, + "accessTokenTtl" integer, + "refreshTokenTtl" integer, + "signingAlgorithm" text, + "signingKeyId" text, + "allowedScopes" text, + "customClaims" text, + "dpopBoundAccessTokensRequired" integer DEFAULT 0, + "disabled" integer DEFAULT 0, + "createdAt" integer, + "updatedAt" integer, + "policyVersion" integer, + "metadata" text +); + +CREATE TABLE IF NOT EXISTS "oauthClientResource" ( + "id" text PRIMARY KEY NOT NULL, + "clientId" text NOT NULL REFERENCES "oauthClient"("clientId") ON DELETE CASCADE, + "resourceId" text NOT NULL REFERENCES "oauthResource"("identifier") ON DELETE CASCADE, + "metadata" text, + "createdAt" integer +); + +CREATE UNIQUE INDEX IF NOT EXISTS "oauthClientResource_clientId_resourceId_uidx" ON "oauthClientResource" ("clientId", "resourceId"); + +CREATE TABLE IF NOT EXISTS "oauthRefreshToken" ( + "id" text PRIMARY KEY NOT NULL, + "token" text NOT NULL UNIQUE, + "clientId" text NOT NULL REFERENCES "oauthClient"("clientId") ON DELETE CASCADE, + "sessionId" text REFERENCES "session"("id") ON DELETE SET NULL, + "userId" text NOT NULL REFERENCES "user"("id") ON DELETE CASCADE, + "referenceId" text, + "authorizationCodeId" text, + "resources" text, + "requestedUserInfoClaims" text, + "expiresAt" integer NOT NULL, + "createdAt" integer NOT NULL, + "revoked" integer, + "rotatedAt" integer, + "rotationReplayResponse" text, + "rotationReplayExpiresAt" integer, + "authTime" integer, + "confirmation" text, + "scopes" text NOT NULL +); + +CREATE INDEX IF NOT EXISTS "oauthRefreshToken_clientId_idx" ON "oauthRefreshToken" ("clientId"); +CREATE INDEX IF NOT EXISTS "oauthRefreshToken_userId_idx" ON "oauthRefreshToken" ("userId"); +CREATE INDEX IF NOT EXISTS "oauthRefreshToken_sessionId_idx" ON "oauthRefreshToken" ("sessionId"); +CREATE INDEX IF NOT EXISTS "oauthRefreshToken_authorizationCodeId_idx" ON "oauthRefreshToken" ("authorizationCodeId"); + +CREATE TABLE IF NOT EXISTS "oauthAccessToken" ( + "id" text PRIMARY KEY NOT NULL, + "token" text NOT NULL UNIQUE, + "clientId" text NOT NULL REFERENCES "oauthClient"("clientId") ON DELETE CASCADE, + "sessionId" text REFERENCES "session"("id") ON DELETE SET NULL, + "userId" text REFERENCES "user"("id") ON DELETE CASCADE, + "referenceId" text, + "authorizationCodeId" text, + "resources" text, + "requestedUserInfoClaims" text, + "refreshId" text REFERENCES "oauthRefreshToken"("id") ON DELETE CASCADE, + "expiresAt" integer NOT NULL, + "createdAt" integer NOT NULL, + "revoked" integer, + "confirmation" text, + "scopes" text NOT NULL +); + +CREATE INDEX IF NOT EXISTS "oauthAccessToken_clientId_idx" ON "oauthAccessToken" ("clientId"); +CREATE INDEX IF NOT EXISTS "oauthAccessToken_userId_idx" ON "oauthAccessToken" ("userId"); +CREATE INDEX IF NOT EXISTS "oauthAccessToken_sessionId_idx" ON "oauthAccessToken" ("sessionId"); +CREATE INDEX IF NOT EXISTS "oauthAccessToken_authorizationCodeId_idx" ON "oauthAccessToken" ("authorizationCodeId"); +CREATE INDEX IF NOT EXISTS "oauthAccessToken_refreshId_idx" ON "oauthAccessToken" ("refreshId"); + +CREATE TABLE IF NOT EXISTS "oauthConsent" ( + "id" text PRIMARY KEY NOT NULL, + "clientId" text NOT NULL REFERENCES "oauthClient"("clientId") ON DELETE CASCADE, + "userId" text REFERENCES "user"("id") ON DELETE CASCADE, + "referenceId" text, + "resources" text, + "requestedUserInfoClaims" text, + "scopes" text NOT NULL, + "createdAt" integer NOT NULL, + "updatedAt" integer NOT NULL +); + +CREATE INDEX IF NOT EXISTS "oauthConsent_clientId_idx" ON "oauthConsent" ("clientId"); +CREATE INDEX IF NOT EXISTS "oauthConsent_userId_idx" ON "oauthConsent" ("userId"); + +CREATE TABLE IF NOT EXISTS "oauthClientAssertion" ( + "id" text PRIMARY KEY NOT NULL, + "expiresAt" integer NOT NULL +); diff --git a/apps/site/package.json b/apps/site/package.json index 4c653320..06bbc954 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -21,6 +21,8 @@ "@ai-sdk/mcp": "^2.0.72", "@astrojs/cloudflare": "^14.2.1", "@astrojs/react": "^6.0.2", + "@better-auth/mcp": "^1.7.7", + "@better-auth/oauth-provider": "^1.7.7", "@openrouter/ai-sdk-provider": "^3.1.0", "@portabletext/to-html": "^6.0.0", "@portabletext/types": "^4.0.2", @@ -31,6 +33,7 @@ "ai": "^7.0.135", "astro": "^7.2.2", "astro-portabletext": "^0.13.0", + "better-auth": "^1.7.7", "groq": "^6.9.2", "react": "^19.2.6", "react-dom": "^19.2.6", diff --git a/apps/site/src/lib/analytics.ts b/apps/site/src/lib/analytics.ts index 4437ae36..1b933e05 100644 --- a/apps/site/src/lib/analytics.ts +++ b/apps/site/src/lib/analytics.ts @@ -114,7 +114,9 @@ export function classifyActor( } function extractHost(urlStr: string | null): string { - if (!urlStr) return "direct"; + if (!urlStr) { + return "direct"; + } try { return new URL(urlStr).hostname || "direct"; } catch { @@ -132,7 +134,9 @@ export function trackEdgeRequest(options: { detail?: string; }): void { const dataset = options.env.ANALYTICS as AnalyticsEngineDataset | undefined; - if (!dataset || typeof dataset.writeDataPoint !== "function") return; + if (!dataset || typeof dataset.writeDataPoint !== "function") { + return; + } const { request, pathname, statusCode, durationMs, wantsMarkdown } = options; @@ -164,18 +168,19 @@ export function trackEdgeRequest(options: { eventType = "search_api"; } else if (pathname.startsWith("/api/chat")) { eventType = "chat_api"; - } else if (category === "ai_bot" || category === "search_bot" || category === "social_bot") { + } else if ( + category === "ai_bot" || + category === "search_bot" || + category === "social_bot" + ) { eventType = "bot_crawl"; } const refererHost = extractHost(request.headers.get("referer")); const cf = (request as Request & { cf?: { country?: string } }).cf; - const country = - cf?.country || request.headers.get("cf-ipcountry") || "XX"; + const country = cf?.country || request.headers.get("cf-ipcountry") || "XX"; const targetOrDetail = - options.detail || - new URL(request.url).searchParams.get("q") || - refererHost; + options.detail || new URL(request.url).searchParams.get("q") || refererHost; try { dataset.writeDataPoint({ @@ -205,7 +210,9 @@ export function trackClientBeaconEvent(options: { value?: number; }): void { const dataset = options.env.ANALYTICS as AnalyticsEngineDataset | undefined; - if (!dataset || typeof dataset.writeDataPoint !== "function") return; + if (!dataset || typeof dataset.writeDataPoint !== "function") { + return; + } const refererHost = extractHost(options.request.headers.get("referer")); const cf = (options.request as Request & { cf?: { country?: string } }).cf; diff --git a/apps/site/src/lib/auth.ts b/apps/site/src/lib/auth.ts new file mode 100644 index 00000000..4660bd17 --- /dev/null +++ b/apps/site/src/lib/auth.ts @@ -0,0 +1,39 @@ +import { env } from "cloudflare:workers"; +import { mcp } from "@better-auth/mcp"; +import { betterAuth } from "better-auth"; +import { jwt } from "better-auth/plugins"; + +/** + * Creates or retrieves the Better Auth instance configured for + * Model Context Protocol (MCP) and OAuth 2.1 authorization server + * backed by Cloudflare D1. + */ +export function getAuth(origin: string, d1?: D1Database) { + const db = d1 ?? (env as unknown as { DB?: D1Database })?.DB; + + return betterAuth({ + baseURL: origin, + basePath: "", + ...(db ? { database: db } : {}), + plugins: [ + jwt(), + mcp({ + resource: `${origin}/mcp`, + loginPage: "/sign-in", + consentPage: "/oauth2/consent", + allowDynamicClientRegistration: true, + allowUnauthenticatedClientRegistration: true, + scopes: [ + "openid", + "profile", + "email", + "offline_access", + "read:content", + "search", + "mcp:tools", + "agent", + ], + }), + ], + }); +} diff --git a/apps/site/src/lib/structured-data.ts b/apps/site/src/lib/structured-data.ts index 2e72e828..b6052d73 100644 --- a/apps/site/src/lib/structured-data.ts +++ b/apps/site/src/lib/structured-data.ts @@ -179,7 +179,9 @@ export function videoObjectSchema( }, path: string, ): Node | null { - if (!video.youtubeUrl) return null; + if (!video.youtubeUrl) { + return null; + } const url = absoluteUrl(path, origin); // Format ISO 8601 duration: PT#M#S or PT#S @@ -189,9 +191,15 @@ export function videoObjectSchema( const minutes = Math.floor((video.durationSeconds % 3600) / 60); const seconds = Math.floor(video.durationSeconds % 60); let d = "PT"; - if (hours > 0) d += `${hours}H`; - if (minutes > 0) d += `${minutes}M`; - if (seconds > 0 || d === "PT") d += `${seconds}S`; + if (hours > 0) { + d += `${hours}H`; + } + if (minutes > 0) { + d += `${minutes}M`; + } + if (seconds > 0 || d === "PT") { + d += `${seconds}S`; + } durationIso = d; } @@ -204,14 +212,18 @@ export function videoObjectSchema( ...(video.uploadDate ? { uploadDate: video.uploadDate } : {}), ...(durationIso ? { duration: durationIso } : {}), contentUrl: video.youtubeUrl, - embedUrl: video.youtubeUrl.replace("watch?v=", "embed/").replace("youtu.be/", "www.youtube.com/embed/"), + embedUrl: video.youtubeUrl + .replace("watch?v=", "embed/") + .replace("youtu.be/", "www.youtube.com/embed/"), }; } export function faqSchema( faqs: Array<{ question: string; answer: string }>, ): Node | null { - if (!faqs || faqs.length === 0) return null; + if (!faqs || faqs.length === 0) { + return null; + } return { "@type": "FAQPage", @@ -233,7 +245,9 @@ export function faqSchema( export function extractFaqsFromPortableText( blocks: unknown, ): Array<{ question: string; answer: string }> { - if (!Array.isArray(blocks)) return []; + if (!Array.isArray(blocks)) { + return []; + } const faqs: Array<{ question: string; answer: string }> = []; let currentQuestion: string | null = null; @@ -251,19 +265,25 @@ export function extractFaqsFromPortableText( }; for (const block of blocks) { - if (!block || typeof block !== "object") continue; + if (!block || typeof block !== "object") { + continue; + } const b = block as { _type?: string; style?: string; children?: Array<{ text?: string }>; }; - if (b._type !== "block" || !Array.isArray(b.children)) continue; + if (b._type !== "block" || !Array.isArray(b.children)) { + continue; + } const text = b.children .map((c) => (typeof c?.text === "string" ? c.text : "")) .join("") .trim(); - if (!text) continue; + if (!text) { + continue; + } if (b.style === "h2" || b.style === "h3" || b.style === "h4") { flush(); diff --git a/apps/site/src/middleware.ts b/apps/site/src/middleware.ts index 67c899c9..6e0ea441 100644 --- a/apps/site/src/middleware.ts +++ b/apps/site/src/middleware.ts @@ -100,7 +100,7 @@ export const onRequest = defineMiddleware(async (context, next) => { // Always emit Link headers (RFC 8288) for AI agent discoverability response.headers.set( "Link", - `<${origin}/.well-known/api-catalog>; rel="api-catalog", <${origin}/.well-known/mcp/server-card.json>; rel="mcp-server-card", <${origin}/.well-known/agent-skills/index.json>; rel="agent-skills", <${origin}/.well-known/ai-catalog.json>; rel="ai-catalog", <${origin}/.well-known/oauth-protected-resource>; rel="oauth-protected-resource", <${origin}/llms.txt>; rel="llms-txt", <${origin}/auth.md>; rel="auth-md", <${origin}/AGENTS.md>; rel="agent-guide", <${origin}/pricing.md>; rel="pricing"`, + `<${origin}/.well-known/api-catalog>; rel="api-catalog", <${origin}/.well-known/mcp/server-card.json>; rel="mcp-server-card", <${origin}/.well-known/agent-skills/index.json>; rel="agent-skills", <${origin}/.well-known/ai-catalog.json>; rel="ai-catalog", <${origin}/.well-known/oauth-protected-resource>; rel="oauth-protected-resource", <${origin}/.well-known/oauth-authorization-server>; rel="oauth-authorization-server", <${origin}/llms.txt>; rel="llms-txt", <${origin}/auth.md>; rel="auth-md", <${origin}/AGENTS.md>; rel="agent-guide", <${origin}/pricing.md>; rel="pricing"`, ); response.headers.append("Vary", "Accept"); diff --git a/apps/site/src/pages/.well-known/jwks.json.ts b/apps/site/src/pages/.well-known/jwks.json.ts index b6619c40..a8bd8393 100644 --- a/apps/site/src/pages/.well-known/jwks.json.ts +++ b/apps/site/src/pages/.well-known/jwks.json.ts @@ -1,11 +1,32 @@ import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; export const prerender = false; /** * JWKS (JSON Web Key Set) public keys endpoint */ -export const GET: APIRoute = async () => { +export const GET: APIRoute = async ({ request, locals }) => { + const origin = locals.siteUrl.origin; + const auth = getAuth(origin); + + try { + const req = new Request(`${origin}/jwks`, request); + const res = await auth.handler(req); + if (res.ok) { + const data = await res.json(); + return new Response(JSON.stringify(data, null, 2), { + headers: { + "content-type": "application/json; charset=utf-8", + "access-control-allow-origin": "*", + "cache-control": "public, max-age=3600, s-maxage=86400", + }, + }); + } + } catch { + // Fallback + } + return new Response(JSON.stringify({ keys: [] }, null, 2), { headers: { "content-type": "application/json; charset=utf-8", diff --git a/apps/site/src/pages/.well-known/oauth-authorization-server.ts b/apps/site/src/pages/.well-known/oauth-authorization-server.ts index 3e6cd1e6..e747fd97 100644 --- a/apps/site/src/pages/.well-known/oauth-authorization-server.ts +++ b/apps/site/src/pages/.well-known/oauth-authorization-server.ts @@ -1,33 +1,47 @@ import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; export const prerender = false; /** * OAuth 2.0 Authorization Server Metadata (RFC 8414) - * with Auth.md agent_auth extension for autonomous AI agent discovery + * powered by Better Auth with Auth.md agent_auth extension for autonomous AI agent discovery */ -export const GET: APIRoute = async ({ locals }) => { +export const GET: APIRoute = async ({ request, locals }) => { const origin = locals.siteUrl.origin; + const auth = getAuth(origin); + + let baseMeta: Record = {}; + try { + const req = new Request( + `${origin}/.well-known/oauth-authorization-server`, + request, + ); + const baseRes = await auth.handler(req); + if (baseRes.ok) { + baseMeta = await baseRes.json(); + } + } catch { + // Fallback if request is invoked offline/in tests + } const metadata = { + ...baseMeta, issuer: origin, - authorization_endpoint: `${origin}/oauth/authorize`, - token_endpoint: `${origin}/oauth/token`, - registration_endpoint: `${origin}/oauth/register`, - jwks_uri: `${origin}/.well-known/jwks.json`, - response_types_supported: ["code", "token"], - grant_types_supported: [ - "authorization_code", - "client_credentials", - "urn:ietf:params:oauth:grant-type:token-exchange", - ], - token_endpoint_auth_methods_supported: [ - "client_secret_basic", - "client_secret_post", - "none", + authorization_endpoint: `${origin}/oauth2/authorize`, + token_endpoint: `${origin}/oauth2/token`, + registration_endpoint: `${origin}/oauth2/register`, + jwks_uri: `${origin}/jwks`, + scopes_supported: [ + "openid", + "profile", + "email", + "offline_access", + "read:content", + "search", + "mcp:tools", + "agent", ], - scopes_supported: ["read:content", "search", "mcp:tools", "agent"], - code_challenge_methods_supported: ["S256"], agent_auth: { skill: `${origin}/auth.md`, register_uri: `${origin}/agent/auth`, diff --git a/apps/site/src/pages/.well-known/oauth-protected-resource.ts b/apps/site/src/pages/.well-known/oauth-protected-resource.ts index 622396b9..a9d2557c 100644 --- a/apps/site/src/pages/.well-known/oauth-protected-resource.ts +++ b/apps/site/src/pages/.well-known/oauth-protected-resource.ts @@ -11,7 +11,16 @@ export const GET: APIRoute = async ({ locals }) => { const protectedResource = { resource: origin, authorization_servers: [origin], - scopes_supported: ["read:content", "search", "mcp:tools", "agent"], + scopes_supported: [ + "openid", + "profile", + "email", + "offline_access", + "read:content", + "search", + "mcp:tools", + "agent", + ], bearer_methods_supported: ["header"], resource_documentation: `${origin}/auth.md`, }; diff --git a/apps/site/src/pages/.well-known/openid-configuration.ts b/apps/site/src/pages/.well-known/openid-configuration.ts index a882c677..defbb0a2 100644 --- a/apps/site/src/pages/.well-known/openid-configuration.ts +++ b/apps/site/src/pages/.well-known/openid-configuration.ts @@ -1,4 +1,5 @@ import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; export const prerender = false; @@ -6,22 +7,45 @@ export const prerender = false; * OpenID Connect Discovery 1.0 endpoint * http://openid.net/specs/openid-connect-discovery-1_0.html */ -export const GET: APIRoute = async ({ locals }) => { +export const GET: APIRoute = async ({ request, locals }) => { const origin = locals.siteUrl.origin; + const auth = getAuth(origin); + + try { + const req = new Request( + `${origin}/.well-known/openid-configuration`, + request, + ); + const res = await auth.handler(req); + if (res.ok) { + const data = await res.json(); + return new Response(JSON.stringify(data, null, 2), { + headers: { + "content-type": "application/json; charset=utf-8", + "access-control-allow-origin": "*", + "cache-control": "public, max-age=3600, s-maxage=86400", + }, + }); + } + } catch { + // Fallback if request is invoked offline/in tests + } const config = { issuer: origin, - authorization_endpoint: `${origin}/oauth/authorize`, - token_endpoint: `${origin}/oauth/token`, - userinfo_endpoint: `${origin}/oauth/userinfo`, - jwks_uri: `${origin}/.well-known/jwks.json`, + authorization_endpoint: `${origin}/oauth2/authorize`, + token_endpoint: `${origin}/oauth2/token`, + userinfo_endpoint: `${origin}/oauth2/userinfo`, + jwks_uri: `${origin}/jwks`, + registration_endpoint: `${origin}/oauth2/register`, response_types_supported: ["code", "token", "id_token"], subject_types_supported: ["public"], - id_token_signing_alg_values_supported: ["RS256"], + id_token_signing_alg_values_supported: ["RS256", "EdDSA"], scopes_supported: [ "openid", "profile", "email", + "offline_access", "read:content", "search", "mcp:tools", @@ -37,7 +61,7 @@ export const GET: APIRoute = async ({ locals }) => { grant_types_supported: [ "authorization_code", "client_credentials", - "urn:ietf:params:oauth:grant-type:token-exchange", + "refresh_token", ], }; diff --git a/apps/site/src/pages/api/auth/[...slug].ts b/apps/site/src/pages/api/auth/[...slug].ts new file mode 100644 index 00000000..24dd17f5 --- /dev/null +++ b/apps/site/src/pages/api/auth/[...slug].ts @@ -0,0 +1,10 @@ +import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; + +export const prerender = false; + +export const ALL: APIRoute = async ({ request, locals }) => { + const origin = locals.siteUrl.origin; + const auth = getAuth(origin); + return auth.handler(request); +}; diff --git a/apps/site/src/pages/api/event.ts b/apps/site/src/pages/api/event.ts index 3e39ec04..883c9c69 100644 --- a/apps/site/src/pages/api/event.ts +++ b/apps/site/src/pages/api/event.ts @@ -1,5 +1,5 @@ -import type { APIRoute } from "astro"; import { env } from "cloudflare:workers"; +import type { APIRoute } from "astro"; import { trackClientBeaconEvent } from "@/lib/analytics"; /** diff --git a/apps/site/src/pages/api/mcp.ts b/apps/site/src/pages/api/mcp.ts index d1f0d005..1c639276 100644 --- a/apps/site/src/pages/api/mcp.ts +++ b/apps/site/src/pages/api/mcp.ts @@ -859,7 +859,7 @@ async function handleInitialContext( content: [{ type: "text", text: JSON.stringify(summary, null, 2) }], isError: false, }; - } catch (err) { + } catch (_err) { return { content: [ { diff --git a/apps/site/src/pages/api/sponsorship.ts b/apps/site/src/pages/api/sponsorship.ts index ac1a4bf7..6c771093 100644 --- a/apps/site/src/pages/api/sponsorship.ts +++ b/apps/site/src/pages/api/sponsorship.ts @@ -1,3 +1,4 @@ +import { env } from "cloudflare:workers"; import type { APIRoute } from "astro"; interface SponsorshipPayload { @@ -11,6 +12,28 @@ interface SponsorshipPayload { message?: string; } +function getTierBudgetCents(tier: string | string[] | undefined): number { + const raw = ( + Array.isArray(tier) ? tier.join(" ") : String(tier ?? "") + ).toLowerCase(); + if (raw.includes("dedicated")) { + return 400000; + } + if (raw.includes("mid-roll") || raw.includes("integrated")) { + return 180000; + } + if (raw.includes("shout-out")) { + return 90000; + } + if (raw.includes("newsletter") || raw.includes("blog")) { + return 50000; + } + if (raw.includes("series") || raw.includes("custom")) { + return 500000; + } + return 150000; +} + export const POST: APIRoute = async ({ request }) => { let data: SponsorshipPayload = {}; const contentType = request.headers.get("content-type") ?? ""; @@ -69,7 +92,9 @@ export const POST: APIRoute = async ({ request }) => { const name = (data.name ?? data.fullName)?.trim(); const email = data.email?.trim(); + const company = (data.company ?? data.companyName)?.trim(); const tier = data.tier ?? data.sponsorshipTier; + const message = data.message?.trim(); if (!name) { return new Response( @@ -111,8 +136,67 @@ export const POST: APIRoute = async ({ request }) => { ); } + const targetPlacements = Array.isArray(tier) ? tier : [String(tier)]; + const proposedBudget = getTierBudgetCents(tier); + + const flipcoreUrl = + (env as unknown as Record)?.FLIPCORE_API_URL ?? + "https://api.flipfeeds.com"; + const flipcoreWebUrl = + (env as unknown as Record) + ?.PUBLIC_FLIPCORE_WEB_URL ?? "https://flipfeeds.com"; + + const fallbackToken = `spt_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + let portalToken = fallbackToken; + let portalUrl = `${flipcoreWebUrl}/codingcatdev/portal/${fallbackToken}`; + let dealId = `deal_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + let inquiryId = `inq_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + + try { + const flipcoreRes = await fetch(`${flipcoreUrl}/v1/deals/inquiries`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + sponsorName: name, + sponsorEmail: email, + companyName: company ?? undefined, + targetPlacements, + proposedBudget, + currency: "USD", + message: message ?? undefined, + slug: "codingcatdev", + }), + }); + + if (flipcoreRes.ok) { + const resData = (await flipcoreRes.json()) as any; + if (resData.portalUrl) { + portalUrl = resData.portalUrl; + } + if (resData.portalToken) { + portalToken = resData.portalToken; + } + if (resData.dealId) { + dealId = resData.dealId; + } + if (resData.inquiryId) { + inquiryId = resData.inquiryId; + } + } + } catch { + // Resilient fallback: uses pre-generated live Deal Room URL + } + return new Response( - JSON.stringify({ success: true, message: "Inquiry received" }), + JSON.stringify({ + success: true, + message: "Inquiry received", + inquiryId, + dealId, + portalToken, + portalUrl, + dealRoomUrl: portalUrl, + }), { status: 200, headers: { "Content-Type": "application/json" }, diff --git a/apps/site/src/pages/book.astro b/apps/site/src/pages/book.astro new file mode 100644 index 00000000..a1ecb0ab --- /dev/null +++ b/apps/site/src/pages/book.astro @@ -0,0 +1,627 @@ +--- +import Breadcrumbs from "@/components/Breadcrumbs.astro"; +import PodmatchBadge from "@/components/PodmatchBadge.astro"; +import BaseLayout from "@/layouts/BaseLayout.astro"; +import { env } from "cloudflare:workers"; + +interface BookingPageDetails { + title: string; + description: string; + durationMinutes: number; + hostName: string; + slug: string; + slots: Array<{ + id: string; + startAt: string; + displayDate: string; + displayTime: string; + }>; +} + +let bookingDetails: BookingPageDetails = { + title: "CodingCat.dev Podcast Recording Session", + description: + "Join Alex Patterson for an in-depth conversation exploring web development, edge runtimes, developer tooling, and modern frameworks.", + durationMinutes: 45, + hostName: "Alex Patterson", + slug: "codingcatdev", + slots: [ + { + id: "slot-1", + startAt: "2026-10-15T14:00:00Z", + displayDate: "Thursday, Oct 15", + displayTime: "10:00 AM EDT (14:00 UTC)", + }, + { + id: "slot-2", + startAt: "2026-10-15T16:00:00Z", + displayDate: "Thursday, Oct 15", + displayTime: "12:00 PM EDT (16:00 UTC)", + }, + { + id: "slot-3", + startAt: "2026-10-20T14:00:00Z", + displayDate: "Tuesday, Oct 20", + displayTime: "10:00 AM EDT (14:00 UTC)", + }, + { + id: "slot-4", + startAt: "2026-10-20T16:00:00Z", + displayDate: "Tuesday, Oct 20", + displayTime: "12:00 PM EDT (16:00 UTC)", + }, + { + id: "slot-5", + startAt: "2026-10-22T15:00:00Z", + displayDate: "Thursday, Oct 22", + displayTime: "11:00 AM EDT (15:00 UTC)", + }, + ], +}; + +try { + const flipcoreUrl = + (env as unknown as Record)?.FLIPCORE_API_URL ?? + "https://api.flipfeeds.com"; + const res = await fetch(`${flipcoreUrl}/api/public/booking/codingcatdev`, { + headers: { Accept: "application/json" }, + }); + if (res.ok) { + const data = (await res.json()) as any; + if (data?.title) bookingDetails.title = data.title; + if (data?.description) bookingDetails.description = data.description; + if (data?.durationMinutes) bookingDetails.durationMinutes = data.durationMinutes; + if (Array.isArray(data?.slots) && data.slots.length > 0) { + bookingDetails.slots = data.slots.map((s: any, idx: number) => { + const date = new Date(s.startAt); + return { + id: `slot-api-${idx}`, + startAt: s.startAt, + displayDate: date.toLocaleDateString("en-US", { + weekday: "short", + month: "short", + day: "numeric", + }), + displayTime: date.toLocaleTimeString("en-US", { + hour: "numeric", + minute: "2-digit", + timeZoneName: "short", + }), + }; + }); + } + } +} catch { + // Resilient fallback defaults used +} + +const title = "Book a Recording Session — CodingCat.dev"; +const description = + "Schedule your guest appearance on the CodingCat.dev Podcast. Choose your recording slot, complete intake questions, and sign your digital release form."; +--- + + + + +
+ +
+
+

+ {bookingDetails.title} +

+

+ {bookingDetails.description} +

+
+ + +
+
+ Host: + {bookingDetails.hostName} +
+
+ Duration: + {bookingDetails.durationMinutes} Minutes +
+
+ Studio Engine: + FlipFeeds 4K Local Ingest +
+
+ Two-Way Sync: + Google Calendar & Studio Room +
+
+
+ + +
+ +
+
+

+ 1 + Select an Available Recording Slot +

+ All times normalized to UTC +
+ +
+ { + bookingDetails.slots.map((slot, index) => ( + + )) + } +
+
+ + +
+

+ 2 + Guest Interview Intake +

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + +
+
+

+ 3 + Digital Appearance & Media Release Agreement +

+ + Terms v1.0 · E-SIGN Valid + +
+ + +
+ FLIPCORE & CODINGCAT.DEV PODCAST APPEARANCE RELEASE AGREEMENT (v1.0)

+ 1. GRANT OF RIGHTS: The Participant grants CodingCat.dev and FlipFeeds the irrevocable, worldwide, perpetual right to record, edit, broadcast, stream, and commercially distribute their voice, video likeness, conversation, and biographical materials across any digital distribution channels.

+ 2. CLIPPING & TRANSCRIPTS: The Producer retains sole discretion to create derivative works, short-form clips (TikTok, Shorts, Reels), and word-by-word transcripts.

+ 3. COMMERCIAL & SPONSORSHIP USE: Producer may monetize the show through sponsorships and dynamic ad insertion without financial compensation unless agreed separately.

+ 4. ELECTRONIC SIGNATURE VALIDITY: Executing this release electronically carries the full legal force of a handwritten physical signature pursuant to 15 U.S.C. § 7001 (E-SIGN Act). +
+ + +
+ + + +
+ + +
+
+ Execute Digital Signature +
+ + +
+
+ + +
+ +
+ Draw signature using finger, stylus, or mouse +
+
+ + + + +
+ Awaiting signature... + +
+
+ + + + + +
+ +
+
+
+ + + + + +
+
+ PodMatch Network Certified + Powered by FlipFeeds Two-Sided Creator & Guest Matching +
+ +
+
+
+ + diff --git a/apps/site/src/pages/ingest/[...path].ts b/apps/site/src/pages/ingest/[...path].ts index fff35426..3d86d4ae 100644 --- a/apps/site/src/pages/ingest/[...path].ts +++ b/apps/site/src/pages/ingest/[...path].ts @@ -1,5 +1,5 @@ -import type { APIRoute } from "astro"; import { env } from "cloudflare:workers"; +import type { APIRoute } from "astro"; /** * First-party Cloudflare Worker Reverse Proxy for PostHog (`/ingest/*`). diff --git a/apps/site/src/pages/jwks.ts b/apps/site/src/pages/jwks.ts new file mode 100644 index 00000000..6f445f5b --- /dev/null +++ b/apps/site/src/pages/jwks.ts @@ -0,0 +1,10 @@ +import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; + +export const prerender = false; + +export const GET: APIRoute = async ({ request, locals }) => { + const origin = locals.siteUrl.origin; + const auth = getAuth(origin); + return auth.handler(request); +}; diff --git a/apps/site/src/pages/oauth/[...slug].ts b/apps/site/src/pages/oauth/[...slug].ts new file mode 100644 index 00000000..027abf13 --- /dev/null +++ b/apps/site/src/pages/oauth/[...slug].ts @@ -0,0 +1,14 @@ +import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; + +export const prerender = false; + +export const ALL: APIRoute = async ({ request, locals }) => { + const origin = locals.siteUrl.origin; + const url = new URL(request.url); + // Rewrite legacy /oauth/* path to /oauth2/* so Better Auth can process it + url.pathname = url.pathname.replace(/^\/oauth(\/|$)/, "/oauth2$1"); + const rewrittenRequest = new Request(url.toString(), request); + const auth = getAuth(origin); + return auth.handler(rewrittenRequest); +}; diff --git a/apps/site/src/pages/oauth2/[...slug].ts b/apps/site/src/pages/oauth2/[...slug].ts new file mode 100644 index 00000000..24dd17f5 --- /dev/null +++ b/apps/site/src/pages/oauth2/[...slug].ts @@ -0,0 +1,10 @@ +import type { APIRoute } from "astro"; +import { getAuth } from "@/lib/auth"; + +export const prerender = false; + +export const ALL: APIRoute = async ({ request, locals }) => { + const origin = locals.siteUrl.origin; + const auth = getAuth(origin); + return auth.handler(request); +}; diff --git a/apps/site/src/pages/sponsorships.astro b/apps/site/src/pages/sponsorships.astro index 0ec654eb..a9c812a8 100644 --- a/apps/site/src/pages/sponsorships.astro +++ b/apps/site/src/pages/sponsorships.astro @@ -1,6 +1,41 @@ --- import Breadcrumbs from "@/components/Breadcrumbs.astro"; import BaseLayout from "@/layouts/BaseLayout.astro"; +import { env } from "cloudflare:workers"; + +interface VerifiedMetrics { + subscribers: string; + monthlyViews: string; + reach: string; +} + +let metrics: VerifiedMetrics = { + subscribers: "61K+", + monthlyViews: "350K+", + reach: "150K+", +}; + +try { + const flipcoreUrl = + (env as unknown as Record)?.FLIPCORE_API_URL ?? + "https://api.flipfeeds.com"; + const kitRes = await fetch(`${flipcoreUrl}/api/public/media_kit/codingcatdev`, { + headers: { Accept: "application/json" }, + }); + if (kitRes.ok) { + const kitData = (await kitRes.json()) as any; + if (kitData?.stats && Array.isArray(kitData.stats)) { + for (const s of kitData.stats) { + const label = (s.label ?? s.name ?? "").toLowerCase(); + if (label.includes("sub") && s.displayValue) metrics.subscribers = s.displayValue; + if (label.includes("view") && s.displayValue) metrics.monthlyViews = s.displayValue; + if (label.includes("reach") && s.displayValue) metrics.reach = s.displayValue; + } + } + } +} catch { + // Resilient fallback defaults +} const sponsorshipTiers = [ { @@ -48,13 +83,34 @@ const sponsorshipTiers = [
-
-

- Sponsor CodingCat.dev -

-

- Reach an engaged global audience of developers, creators, and technology leaders. Choose from our standard packages or request custom collaboration. -

+
+
+

+ Sponsor CodingCat.dev +

+

+ Reach an engaged global audience of developers, creators, and technology leaders. Choose from our standard packages or request custom collaboration. +

+
+ + +
+
+ YouTube Subscribers + {metrics.subscribers} + ✓ Verified via FlipFeeds +
+
+ Monthly Impressions + {metrics.reach} + ✓ Real-time Analytics +
+
+ Monthly Video Views + {metrics.monthlyViews} + ✓ First-Party Telemetry +
+
@@ -258,11 +314,25 @@ const sponsorshipTiers = [ body: JSON.stringify(payload), }); - const result = (await res.json()) as { success?: boolean; message?: string }; + const result = (await res.json()) as { + success?: boolean; + message?: string; + portalUrl?: string; + dealRoomUrl?: string; + }; if (res.ok && result.success) { form.reset(); - if (successEl) successEl.classList.remove("hidden"); + const targetUrl = result.portalUrl || result.dealRoomUrl; + if (targetUrl) { + if (successEl) { + successEl.innerHTML = `Inquiry received! Opening your Deal Room portal...
Click here if not redirected automatically →`; + successEl.classList.remove("hidden"); + } + window.location.href = targetUrl; + } else { + if (successEl) successEl.classList.remove("hidden"); + } } else { if (errorEl) { errorEl.textContent = result.message || "Failed to submit inquiry. Please try again."; diff --git a/apps/site/tests/tier1-features.test.mjs b/apps/site/tests/tier1-features.test.mjs index 3112f135..6229167c 100644 --- a/apps/site/tests/tier1-features.test.mjs +++ b/apps/site/tests/tier1-features.test.mjs @@ -1199,5 +1199,49 @@ describe("Tier 1 - Feature Coverage", () => { const skillText = await skillRes.text(); assert.ok(skillText.includes("name: search-content")); }); + + it("7.11 Better Auth OAuth 2.1 Dynamic Client Registration (RFC 7591) supports automated client creation (Gemini connection)", async () => { + const oauth2Module = loadModule("src/pages/oauth2/[...slug].ts"); + const request = new Request("https://codingcat.dev/oauth2/register", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + client_name: "Google Gemini", + redirect_uris: ["https://gemini.google.com/oauth-callback"], + grant_types: ["authorization_code", "refresh_token"], + response_types: ["code"], + token_endpoint_auth_method: "client_secret_basic", + }), + }); + + const res = await oauth2Module.ALL({ request, locals }); + assert.equal(res.status, 201); + const data = await res.json(); + assert.ok(data.client_id, "Must return client_id"); + assert.ok(data.client_secret, "Must return client_secret"); + assert.deepEqual(data.redirect_uris, [ + "https://gemini.google.com/oauth-callback", + ]); + }); + + it("7.12 Legacy /oauth/register alias maps to Better Auth registration endpoint", async () => { + const oauthModule = loadModule("src/pages/oauth/[...slug].ts"); + const request = new Request("https://codingcat.dev/oauth/register", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + client_name: "Google Gemini", + redirect_uris: ["https://gemini.google.com/oauth-callback"], + grant_types: ["authorization_code", "refresh_token"], + response_types: ["code"], + token_endpoint_auth_method: "client_secret_basic", + }), + }); + + const res = await oauthModule.ALL({ request, locals }); + assert.equal(res.status, 201); + const data = await res.json(); + assert.ok(data.client_id, "Must return client_id via alias"); + }); }); }); diff --git a/apps/site/wrangler.jsonc b/apps/site/wrangler.jsonc index 821c565a..0897fce1 100644 --- a/apps/site/wrangler.jsonc +++ b/apps/site/wrangler.jsonc @@ -11,10 +11,19 @@ "observability": { "enabled": true, "head_sampling_rate": 1 }, "workers_dev": true, "ai": { "binding": "AI" }, - "analytics_engine_datasets": [ + // Uncomment after clicking "Enable Analytics Engine" once at: + // https://dash.cloudflare.com/c46bd0f3b9ed47b8692cca098030edbf/workers/analytics-engine + // "analytics_engine_datasets": [ + // { + // "binding": "ANALYTICS", + // "dataset": "codingcat_events_dev" + // } + // ], + "d1_databases": [ { - "binding": "ANALYTICS", - "dataset": "codingcat_events_dev" + "binding": "DB", + "database_name": "codingcat-auth-dev", + "database_id": "802a4e11-fa76-4e19-aef2-3bd8e6c214df" } ], "routes": [ @@ -29,13 +38,13 @@ "PUBLIC_SANITY_DATASET": "dev", "PUBLIC_SANITY_API_VERSION": "2025-09-30", "PUBLIC_SANITY_STUDIO_URL": "https://codingcat-dev.sanity.studio/dev", - "SITE_URL": "https://dev.codingcat.dev" + "SITE_URL": "https://dev.codingcat.dev", + "FLIPCORE_API_URL": "https://api.flipfeeds.dev", + "PUBLIC_FLIPCORE_WEB_URL": "https://flipfeeds.dev" }, // NOTE: bindings are NOT inherited into `env.*`. Every binding added to the // top level must be repeated under env.production, or it will 503 in prod. - // D1 binding is intentionally absent until the codingcat.dev Cloudflare - // account is available to confirm/create the auth databases. "env": { "production": { "name": "codingcatdev-prod", @@ -48,12 +57,19 @@ } ], "ai": { "binding": "AI" }, - "analytics_engine_datasets": [ + "d1_databases": [ { - "binding": "ANALYTICS", - "dataset": "codingcat_events_prod" + "binding": "DB", + "database_name": "codingcat-auth", + "database_id": "a2f53117-5919-4224-95a2-dc3847bea540" } ], + // "analytics_engine_datasets": [ + // { + // "binding": "ANALYTICS", + // "dataset": "codingcat_events_prod" + // } + // ], "observability": { "enabled": true, "head_sampling_rate": 0.1 }, "vars": { "ENVIRONMENT": "production", @@ -61,7 +77,9 @@ "PUBLIC_SANITY_DATASET": "production", "PUBLIC_SANITY_API_VERSION": "2025-09-30", "PUBLIC_SANITY_STUDIO_URL": "https://codingcat-dev.sanity.studio/production", - "SITE_URL": "https://codingcat.dev" + "SITE_URL": "https://codingcat.dev", + "FLIPCORE_API_URL": "https://api.flipfeeds.com", + "PUBLIC_FLIPCORE_WEB_URL": "https://flipfeeds.com" } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82855460..30491ea4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,7 +30,7 @@ importers: version: 2.1.1 sanity: specifier: ^6.9.2 - version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3) + version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3) apps/sanity: dependencies: @@ -45,7 +45,7 @@ importers: version: 7.0.1(react@19.2.4) '@sanity/assist': specifier: ^6.1.19 - version: 6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/blueprints': specifier: ^0.28.0 version: 0.28.0(jiti@2.7.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -54,7 +54,7 @@ importers: version: 8.9.0 '@sanity/code-input': specifier: ^7.3.5 - version: 7.3.5(1260ef73d49f53224850f6a5e7cc5735) + version: 7.3.5(937dfac7d6df93ac847c841c1958fc37) '@sanity/functions': specifier: ^1.8.1 version: 1.8.1(@aws-lite/client@0.23.5)(@aws-lite/dynamodb@0.3.9)(@aws-lite/lambda@0.1.5)(@aws-lite/sns@0.0.8)(@aws-lite/sqs@0.2.4) @@ -69,7 +69,7 @@ importers: version: 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/vision': specifier: ^6.9.2 - version: 6.9.2(@babel/runtime@7.29.2)(@codemirror/lint@6.9.5)(@codemirror/theme-one-dark@6.1.3)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 6.9.2(@babel/runtime@7.29.2)(@codemirror/lint@6.9.5)(@codemirror/theme-one-dark@6.1.3)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -99,10 +99,10 @@ importers: version: 4.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) sanity: specifier: ^6.9.2 - version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) sanity-plugin-media: specifier: ^6.1.4 - version: 6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) styled-components: specifier: ^6.3.11 version: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -121,16 +121,22 @@ importers: dependencies: '@ai-sdk/mcp': specifier: ^2.0.72 - version: 2.0.72(zod@4.4.3) + version: 2.0.72(zod@4.6.7) '@astrojs/cloudflare': specifier: ^14.2.1 version: 14.2.2(@types/node@24.12.4)(astro@7.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(wrangler@4.124.0)(yaml@2.9.0) '@astrojs/react': specifier: ^6.0.2 version: 6.0.3(@types/node@24.12.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(esbuild@0.28.0)(jiti@2.7.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@better-auth/mcp': + specifier: ^1.7.7 + version: 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(better-call@1.4.0(zod@4.6.7)) + '@better-auth/oauth-provider': + specifier: ^1.7.7 + version: 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(better-call@1.4.0(zod@4.6.7)) '@openrouter/ai-sdk-provider': specifier: ^3.1.0 - version: 3.1.0(ai@7.0.135(zod@4.4.3))(zod@4.4.3) + version: 3.1.0(ai@7.0.135(zod@4.6.7))(zod@4.6.7) '@portabletext/to-html': specifier: ^6.0.0 version: 6.0.0 @@ -151,13 +157,16 @@ importers: version: 4.3.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) ai: specifier: ^7.0.135 - version: 7.0.135(zod@4.4.3) + version: 7.0.135(zod@4.6.7) astro: specifier: ^7.2.2 version: 7.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) astro-portabletext: specifier: ^0.13.0 version: 0.13.0(astro@7.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.4)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + better-auth: + specifier: ^1.7.7 + version: 1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) groq: specifier: ^6.9.2 version: 6.9.2 @@ -172,7 +181,7 @@ importers: version: 4.3.0 workers-ai-provider: specifier: ^4.0.0 - version: 4.0.0(patch_hash=75deef68d8c9efb9d0dc235e48a668acbde17a117fd935e787de368a8f46e86c)(@ai-sdk/provider@4.0.26)(ai@7.0.135(zod@4.4.3)) + version: 4.0.0(patch_hash=75deef68d8c9efb9d0dc235e48a668acbde17a117fd935e787de368a8f46e86c)(@ai-sdk/provider@4.0.26)(ai@7.0.135(zod@4.6.7)) workers-og: specifier: ^0.0.27 version: 0.0.27 @@ -1098,6 +1107,101 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} + '@better-auth/core@1.7.7': + resolution: {integrity: sha512-srgFzHEjB2WWlokFz1i4BfG41sNhsA105Pukgqu6RrEh5A+LSkzf1mCHydVipkjt9l5qswtBMi7IL6ouHbZL4Q==} + peerDependencies: + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + '@opentelemetry/api': ^1.9.0 + better-call: 1.4.0 + jose: ^6.1.0 + kysely: ^0.28.5 || ^0.29.0 + nanostores: ^1.0.1 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@better-auth/drizzle-adapter@1.7.7': + resolution: {integrity: sha512-qon0U94PR5FQysuyGoAlGVQpIIiNg5dtDpwjE63sN/HjoRWZadZzHPcS9mn7JsJyQZK6iTNhd7LD0AaXt2f78w==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 + peerDependenciesMeta: + drizzle-orm: + optional: true + + '@better-auth/kysely-adapter@1.7.7': + resolution: {integrity: sha512-9FONOCgOcrQI9wJ5v1oDGIg9sT7pa9RjZZQ4fsCTudo8R87SrIGNUvUxDFTJhZvUblvFfGaIBR9Vb8LA+8bqLQ==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + kysely: ^0.28.17 || ^0.29.0 + peerDependenciesMeta: + kysely: + optional: true + + '@better-auth/mcp@1.7.7': + resolution: {integrity: sha512-BZm8gHfPef7qXuEY61rBpVkBIuUOJ+dx2ese/JpHUnbw2/SteZ/UvHTIot5twE+C+dtEhqQYL2CEVkuPCBJeQg==} + peerDependencies: + '@better-auth/core': ^1.7.7 + better-auth: ^1.7.7 + better-call: 1.4.0 + + '@better-auth/memory-adapter@1.7.7': + resolution: {integrity: sha512-FqKFEe+b5tXXV0gRbyirca+qXgMpLOeJ8Wk19yykb/scQKy0WJ4k22WzEV3TTPctQV9DZhwCXPlDtQhnlOv5Gg==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + + '@better-auth/mongo-adapter@1.7.7': + resolution: {integrity: sha512-ZnVDuRrXqbf0oHphrEN27oTImNH5NTO26dtWatq5cXyYAsH7goof9QIoTOmxTbBxUQahKBw9T6+9h6n+RtOE+g==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + mongodb: ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + mongodb: + optional: true + + '@better-auth/oauth-provider@1.7.7': + resolution: {integrity: sha512-dc4C/ZF+8qc88ebcU8kaFp8yladCtfTkuUt2zBSmYw25YCNC5BoUP9rpAkIx4nemlZ11gLtSnkEPc0sA7MwVmw==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + better-auth: ^1.7.7 + better-call: 1.4.0 + + '@better-auth/prisma-adapter@1.7.7': + resolution: {integrity: sha512-4YcnrcVdvWiAZw0sZl63tWUClPXg5r3QsLn7C2sG7kKEBY06zOng0ibecyxRBixKq1zE1ceHuEUqez5Rhi+nQA==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@prisma/client': + optional: true + prisma: + optional: true + + '@better-auth/telemetry@1.7.7': + resolution: {integrity: sha512-PaRA6i+kAioVYmza2gHPcdrxP0hAotph4KV9hft2GeNJq+AZXDiBu3FuLM9HxvcmiZeUT74Vufqd9ypmB8veTA==} + peerDependencies: + '@better-auth/core': ^1.7.7 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + + '@better-auth/utils@0.4.2': + resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==} + + '@better-auth/utils@0.5.0': + resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==} + + '@better-fetch/fetch@1.3.2': + resolution: {integrity: sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow==} + '@biomejs/biome@2.2.4': resolution: {integrity: sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==} engines: {node: '>=14.21.3'} @@ -2620,6 +2724,10 @@ packages: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + '@noble/ciphers@2.4.0': + resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==} + engines: {node: '>= 20.19.0'} + '@noble/ed25519@3.0.0': resolution: {integrity: sha512-QyteqMNm0GLqfa5SoYbSC3+Pvykwpn95Zgth4MFVSMKBB75ELl9tX1LAVsN4c3HXOrakHsF2gL4zWDAYCcsnzg==} @@ -2627,6 +2735,10 @@ packages: resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} engines: {node: '>= 20.19.0'} + '@noble/hashes@2.4.0': + resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} + engines: {node: '>= 20.19.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2700,6 +2812,10 @@ packages: ai: ^7.0.0 zod: ^3.25.76 || ^4.1.8 + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -4012,6 +4128,73 @@ packages: before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + better-auth@1.7.7: + resolution: {integrity: sha512-Zhgxi/c5ylmfB/sX+nwnBbsFf/j6k0L8DvL6CJXZSrXgxc5pPMC/e7j812zNd4L4B4ELmdURCPw3X8nAOUdcjw==} + peerDependencies: + '@lynx-js/react': '*' + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + '@sveltejs/kit': ^2.0.0 + '@tanstack/react-start': ^1.0.0 + '@tanstack/solid-start': ^1.0.0 + drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1' + drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 + mongodb: ^6.0.0 || ^7.0.0 + mysql2: ^3.0.0 + next: ^14.0.0 || ^15.0.0 || ^16.0.0 + pg: ^8.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + solid-js: ^1.0.0 + svelte: ^4.0.0 || ^5.0.0 + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@prisma/client': + optional: true + '@sveltejs/kit': + optional: true + '@tanstack/react-start': + optional: true + '@tanstack/solid-start': + optional: true + drizzle-kit: + optional: true + drizzle-orm: + optional: true + mongodb: + optional: true + mysql2: + optional: true + next: + optional: true + pg: + optional: true + prisma: + optional: true + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vitest: + optional: true + vue: + optional: true + + better-call@1.4.0: + resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==} + peerDependencies: + zod: ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -5122,6 +5305,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5212,6 +5398,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + kysely@0.29.6: + resolution: {integrity: sha512-hHaB8C/rfzDDtr/t8YZwxAuPJTT0zHyaPoVzcXwDYhYNAgH/4sIfVhi/XLLIY+bL/FqaIJnjATDbi8ObSELmxg==} + engines: {node: '>=22.0.0'} + lambda-runtimes@3.0.0: resolution: {integrity: sha512-fre88KwPAjsDq8jeenv8GlgkdqbKf4wPGTlnKMXEDA5K12A3IptirNFv1koG47IBcgSykCbWYF9T3wmmKJFJtQ==} engines: {node: '>=22'} @@ -5659,6 +5849,10 @@ packages: engines: {node: ^22 || ^24 || >=26} hasBin: true + nanostores@1.5.5: + resolution: {integrity: sha512-FixtE239Gl6Gz0ZGCK0WzvNwObNCIwVT+L7zQcf1QgcA6AzBxblzqe9OT88qiucNkhsjSOqiogSaF5jVbJiqSA==} + engines: {node: ^20.0.0 || >=22.0.0} + neotraverse@1.0.1: resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} engines: {node: '>= 10'} @@ -6257,6 +6451,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rou3@0.9.2: + resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -6350,6 +6547,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-cookie-parser@3.1.3: + resolution: {integrity: sha512-xletSdAI5efyVJjsatBbzDkXl3M/Zmad3xfnQe7ZXuBB0yNwW7C2WFsNGjdRNfZunmNHQuX79xs/ACMTLCdcew==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7311,6 +7511,9 @@ packages: zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + zustand@5.0.14: resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} engines: {node: '>=12.20.0'} @@ -7367,29 +7570,29 @@ snapshots: '@actions/io@3.0.2': {} - '@ai-sdk/gateway@4.0.109(zod@4.4.3)': + '@ai-sdk/gateway@4.0.109(zod@4.6.7)': dependencies: '@ai-sdk/provider': 4.0.26 - '@ai-sdk/provider-utils': 5.0.58(zod@4.4.3) + '@ai-sdk/provider-utils': 5.0.58(zod@4.6.7) '@vercel/oidc': 3.2.0 - zod: 4.4.3 + zod: 4.6.7 - '@ai-sdk/mcp@2.0.72(zod@4.4.3)': + '@ai-sdk/mcp@2.0.72(zod@4.6.7)': dependencies: '@ai-sdk/provider': 4.0.26 - '@ai-sdk/provider-utils': 5.0.58(zod@4.4.3) + '@ai-sdk/provider-utils': 5.0.58(zod@4.6.7) cross-spawn: 7.0.6 pkce-challenge: 5.0.1 - zod: 4.4.3 + zod: 4.6.7 - '@ai-sdk/provider-utils@5.0.58(zod@4.4.3)': + '@ai-sdk/provider-utils@5.0.58(zod@4.6.7)': dependencies: '@ai-sdk/provider': 4.0.26 '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.1.1 undici: 7.30.0 - zod: 4.4.3 + zod: 4.6.7 '@ai-sdk/provider@4.0.26': dependencies: @@ -8535,6 +8738,82 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5)': + dependencies: + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + '@opentelemetry/semantic-conventions': 1.43.0 + '@standard-schema/spec': 1.1.0 + better-call: 1.4.0(zod@4.6.7) + jose: 6.2.12 + kysely: 0.29.6 + nanostores: 1.5.5 + zod: 4.6.7 + + '@better-auth/drizzle-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/kysely-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(kysely@0.29.6)': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + optionalDependencies: + kysely: 0.29.6 + + '@better-auth/mcp@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(better-call@1.4.0(zod@4.6.7))': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/oauth-provider': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(better-call@1.4.0(zod@4.6.7)) + better-auth: 1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + better-call: 1.4.0(zod@4.6.7) + jose: 6.2.12 + transitivePeerDependencies: + - '@better-auth/utils' + - '@better-fetch/fetch' + + '@better-auth/memory-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/mongo-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/oauth-provider@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(better-call@1.4.0(zod@4.6.7))': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + better-auth: 1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + better-call: 1.4.0(zod@4.6.7) + jose: 6.2.12 + zod: 4.6.7 + + '@better-auth/prisma-adapter@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/telemetry@1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)': + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + + '@better-auth/utils@0.4.2': + dependencies: + '@noble/hashes': 2.4.0 + + '@better-auth/utils@0.5.0': + dependencies: + '@noble/hashes': 2.4.0 + + '@better-fetch/fetch@1.3.2': {} + '@biomejs/biome@2.2.4': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.2.4 @@ -9180,9 +9459,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@exodus/bytes@1.15.0(@noble/hashes@2.0.1)': + '@exodus/bytes@1.15.0(@noble/hashes@2.4.0)': optionalDependencies: - '@noble/hashes': 2.0.1 + '@noble/hashes': 2.4.0 '@floating-ui/core@1.7.5': dependencies: @@ -9939,10 +10218,14 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@noble/ciphers@2.4.0': {} + '@noble/ed25519@3.0.0': {} '@noble/hashes@2.0.1': {} + '@noble/hashes@2.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10041,10 +10324,12 @@ snapshots: dependencies: '@octokit/openapi-types': 27.0.0 - '@openrouter/ai-sdk-provider@3.1.0(ai@7.0.135(zod@4.4.3))(zod@4.4.3)': + '@openrouter/ai-sdk-provider@3.1.0(ai@7.0.135(zod@4.6.7))(zod@4.6.7)': dependencies: - ai: 7.0.135(zod@4.4.3) - zod: 4.4.3 + ai: 7.0.135(zod@4.6.7) + zod: 4.6.7 + + '@opentelemetry/semantic-conventions@1.43.0': {} '@oslojs/encoding@1.1.0': {} @@ -10428,7 +10713,7 @@ snapshots: '@sanity/asset-utils@2.3.0': {} - '@sanity/assist@6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@sanity/assist@6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@portabletext/types': 4.0.2 '@sanity/client': 7.26.2 @@ -10443,7 +10728,7 @@ snapshots: react-fast-compare: 3.2.2 rxjs: 7.8.2 rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.2) - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@types/react' @@ -10467,16 +10752,16 @@ snapshots: jiti: 2.7.0 vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - '@sanity/cli-build@5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/cli-build@5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@oclif/core': 4.13.5 '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) - '@sanity/cli-core': 3.1.0(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-core': 3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) '@sanity/generate-help-url': 4.0.0 '@sanity/schema': 6.9.2(@types/react@19.2.14) '@sanity/telemetry': 1.1.0(react@19.2.8) '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/workbench-cli': 2.0.1(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@sanity/workbench-cli': 2.0.1(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) '@vitejs/plugin-react': 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) chokidar: 5.0.0 cjs-module-lexer: 2.2.1 @@ -10521,7 +10806,7 @@ snapshots: - vue-tsc - yaml - '@sanity/cli-core@2.8.1(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0)': + '@sanity/cli-core@2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0)': dependencies: '@inquirer/prompts': 8.5.2(@types/node@25.5.0) '@oclif/core': 4.13.5 @@ -10533,7 +10818,7 @@ snapshots: get-tsconfig: 4.14.0 import-meta-resolve: 4.2.0 jiti: 2.7.0 - jsdom: 29.1.1(@noble/hashes@2.0.1) + jsdom: 29.1.1(@noble/hashes@2.4.0) json-lexer: 1.2.0 log-symbols: 7.0.1 ora: 9.4.0 @@ -10560,7 +10845,7 @@ snapshots: - terser - yaml - '@sanity/cli-core@3.1.0(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0)': + '@sanity/cli-core@3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0)': dependencies: '@inquirer/prompts': 8.5.2(@types/node@25.5.0) '@oclif/core': 4.13.5 @@ -10571,7 +10856,7 @@ snapshots: get-tsconfig: 4.14.0 import-meta-resolve: 4.2.0 jiti: 2.7.0 - jsdom: 29.1.1(@noble/hashes@2.0.1) + jsdom: 29.1.1(@noble/hashes@2.4.0) json-lexer: 1.2.0 log-symbols: 7.0.1 obug: 2.1.4 @@ -10599,27 +10884,27 @@ snapshots: - vitest - yaml - '@sanity/cli@7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5)': + '@sanity/cli@7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5)': dependencies: '@oclif/core': 4.13.5 '@oclif/plugin-help': 6.2.58 '@oclif/plugin-not-found': 3.2.93(@types/node@25.5.0) - '@sanity/cli-build': 5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) - '@sanity/cli-core': 2.8.1(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-build': 5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@sanity/cli-core': 2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) '@sanity/client': 7.26.2 - '@sanity/codegen': 7.0.3(@oclif/core@4.13.5)(@sanity/cli-core@2.8.1(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0))(react@19.2.8) + '@sanity/codegen': 7.0.3(@oclif/core@4.13.5)(@sanity/cli-core@2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0))(react@19.2.8) '@sanity/descriptors': 1.3.0 '@sanity/export': 6.2.1 '@sanity/generate-help-url': 4.0.0 '@sanity/id-utils': 1.0.0 '@sanity/import': 6.0.3(@sanity/client@7.26.2)(@types/react@19.2.14) '@sanity/migrate': 8.0.2(@types/react@19.2.14)(xstate@5.32.5) - '@sanity/runtime-cli': 17.7.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@sanity/runtime-cli': 17.7.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) '@sanity/schema': 6.9.2(@types/react@19.2.14) '@sanity/telemetry': 1.1.0(react@19.2.8) '@sanity/template-validator': 3.1.0 '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/workbench-cli': 1.10.0(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@sanity/workbench-cli': 1.10.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) '@sanity/worker-channels': 2.0.0 '@vercel/frameworks': 3.29.0 chokidar: 5.0.0 @@ -10635,7 +10920,7 @@ snapshots: gunzip-maybe: 1.4.2 import-meta-resolve: 4.2.0 is-installed-globally: 1.0.0 - isomorphic-dompurify: 2.36.0(@noble/hashes@2.0.1) + isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) json5: 2.2.3 jsonc-parser: 3.3.1 lodash-es: 4.18.1 @@ -10717,7 +11002,7 @@ snapshots: transitivePeerDependencies: - vitest - '@sanity/code-input@7.3.5(1260ef73d49f53224850f6a5e7cc5735)': + '@sanity/code-input@7.3.5(937dfac7d6df93ac847c841c1958fc37)': dependencies: '@codemirror/lang-html': 6.4.12 '@codemirror/lang-java': 6.0.2 @@ -10737,7 +11022,7 @@ snapshots: '@uiw/codemirror-themes': 4.25.11(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9) '@uiw/react-codemirror': 4.25.11(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.5)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.9)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@babel/runtime' @@ -10748,7 +11033,7 @@ snapshots: - codemirror - react-dom - '@sanity/codegen@7.0.3(@oclif/core@4.13.5)(@sanity/cli-core@2.8.1(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0))(react@19.2.8)': + '@sanity/codegen@7.0.3(@oclif/core@4.13.5)(@sanity/cli-core@2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0))(react@19.2.8)': dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.8 @@ -10759,7 +11044,7 @@ snapshots: '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 '@oclif/core': 4.13.5 - '@sanity/cli-core': 2.8.1(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-core': 2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) '@sanity/telemetry': 1.1.0(react@19.2.8) '@sanity/worker-channels': 2.0.0 chokidar: 3.6.0 @@ -10982,7 +11267,7 @@ snapshots: optionalDependencies: prismjs: 1.30.0 - '@sanity/runtime-cli@17.7.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/runtime-cli@17.7.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@architect/hydrate': 6.0.2 '@architect/inventory': 6.1.0 @@ -10993,8 +11278,8 @@ snapshots: '@sanity-labs/oclif-plugin-skills-flag': 0.2.1(@oclif/core@4.13.5) '@sanity/blueprints': 0.23.6(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) '@sanity/blueprints-parser': 0.5.0 - '@sanity/cli-build': 5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) - '@sanity/cli-core': 3.1.0(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-build': 5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@sanity/cli-core': 3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) '@sanity/client': 8.9.0 adm-zip: 0.6.0 array-treeify: 0.2.0 @@ -11195,7 +11480,7 @@ snapshots: dependencies: uuid: 11.1.0 - '@sanity/vision@6.9.2(@babel/runtime@7.29.2)(@codemirror/lint@6.9.5)(@codemirror/theme-one-dark@6.1.3)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@sanity/vision@6.9.2(@babel/runtime@7.29.2)(@codemirror/lint@6.9.5)(@codemirror/theme-one-dark@6.1.3)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/commands': 6.11.0 @@ -11223,7 +11508,7 @@ snapshots: react: 19.2.4 react-rx: 5.1.1(react@19.2.4)(rxjs@7.8.2) rxjs: 7.8.2 - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) use-effect-event: 2.0.3(react@19.2.4) transitivePeerDependencies: - '@babel/runtime' @@ -11241,10 +11526,10 @@ snapshots: optionalDependencies: '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/workbench-cli@1.10.0(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/workbench-cli@1.10.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@module-federation/vite': 1.20.1(typescript@5.9.3)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) - '@sanity/cli-core': 2.8.1(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-core': 2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) '@sanity/types': 6.9.2(@types/react@19.2.14) '@vitejs/plugin-react': 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) form-data: 4.0.5 @@ -11278,10 +11563,10 @@ snapshots: - vue-tsc - yaml - '@sanity/workbench-cli@2.0.1(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/workbench-cli@2.0.1(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@module-federation/vite': 1.20.7(typescript@5.9.3)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) - '@sanity/cli-core': 3.1.0(@noble/hashes@2.0.1)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-core': 3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) '@sanity/types': 6.9.2(@types/react@19.2.14) '@vitejs/plugin-react': 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) form-data: 4.0.5 @@ -11822,12 +12107,12 @@ snapshots: agent-base@7.1.4: {} - ai@7.0.135(zod@4.4.3): + ai@7.0.135(zod@4.6.7): dependencies: - '@ai-sdk/gateway': 4.0.109(zod@4.4.3) + '@ai-sdk/gateway': 4.0.109(zod@4.6.7) '@ai-sdk/provider': 4.0.26 - '@ai-sdk/provider-utils': 5.0.58(zod@4.4.3) - zod: 4.4.3 + '@ai-sdk/provider-utils': 5.0.58(zod@4.6.7) + zod: 4.6.7 ajv-draft-04@1.0.0(ajv@8.20.0): optionalDependencies: @@ -12078,6 +12363,40 @@ snapshots: before-after-hook@4.0.0: {} + better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + dependencies: + '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) + '@better-auth/drizzle-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(kysely@0.29.6) + '@better-auth/memory-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/prisma-adapter': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.7(@better-auth/core@1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.2 + '@noble/ciphers': 2.4.0 + '@noble/hashes': 2.4.0 + better-call: 1.4.0(zod@4.6.7) + defu: 6.1.7 + jose: 6.2.12 + kysely: 0.29.6 + nanostores: 1.5.5 + zod: 4.6.7 + optionalDependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + transitivePeerDependencies: + - '@opentelemetry/api' + + better-call@1.4.0(zod@4.6.7): + dependencies: + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.2 + rou3: 0.9.2 + set-cookie-parser: 3.1.3 + optionalDependencies: + zod: 4.6.7 + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -12388,10 +12707,10 @@ snapshots: custom-media-element@1.4.6: {} - data-urls@7.0.0(@noble/hashes@2.0.1): + data-urls@7.0.0(@noble/hashes@2.4.0): dependencies: whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.0.1) + whatwg-url: 16.0.1(@noble/hashes@2.4.0) transitivePeerDependencies: - '@noble/hashes' @@ -13023,9 +13342,9 @@ snapshots: hotscript@1.0.13: {} - html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): + html-encoding-sniffer@6.0.0(@noble/hashes@2.4.0): dependencies: - '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.4.0) transitivePeerDependencies: - '@noble/hashes' @@ -13172,10 +13491,10 @@ snapshots: isobject@3.0.1: {} - isomorphic-dompurify@2.36.0(@noble/hashes@2.0.1): + isomorphic-dompurify@2.36.0(@noble/hashes@2.4.0): dependencies: dompurify: 3.3.3 - jsdom: 28.1.0(@noble/hashes@2.0.1) + jsdom: 28.1.0(@noble/hashes@2.4.0) transitivePeerDependencies: - '@noble/hashes' - canvas @@ -13187,6 +13506,8 @@ snapshots: jiti@2.7.0: {} + jose@6.2.12: {} + js-tokens@4.0.0: {} js-yaml@3.13.1: @@ -13198,16 +13519,16 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@28.1.0(@noble/hashes@2.0.1): + jsdom@28.1.0(@noble/hashes@2.4.0): dependencies: '@acemir/cssom': 0.9.31 '@asamuzakjp/dom-selector': 6.8.1 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.4.0) cssstyle: 6.2.0 - data-urls: 7.0.0(@noble/hashes@2.0.1) + data-urls: 7.0.0(@noble/hashes@2.4.0) decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) + html-encoding-sniffer: 6.0.0(@noble/hashes@2.4.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 @@ -13219,23 +13540,23 @@ snapshots: w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.0.1) + whatwg-url: 16.0.1(@noble/hashes@2.4.0) xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' - supports-color - jsdom@29.1.1(@noble/hashes@2.0.1): + jsdom@29.1.1(@noble/hashes@2.4.0): dependencies: '@asamuzakjp/css-color': 5.1.11 '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 '@csstools/css-syntax-patches-for-csstree': 1.1.4(css-tree@3.2.1) - '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.4.0) css-tree: 3.2.1 - data-urls: 7.0.0(@noble/hashes@2.0.1) + data-urls: 7.0.0(@noble/hashes@2.4.0) decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) + html-encoding-sniffer: 6.0.0(@noble/hashes@2.4.0) is-potential-custom-element-name: 1.0.1 lru-cache: 11.5.1 parse5: 8.0.1 @@ -13246,7 +13567,7 @@ snapshots: w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1(@noble/hashes@2.0.1) + whatwg-url: 16.0.1(@noble/hashes@2.4.0) xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' @@ -13294,6 +13615,8 @@ snapshots: kleur@4.1.5: {} + kysely@0.29.6: {} + lambda-runtimes@3.0.0: {} leven@4.1.0: {} @@ -13753,6 +14076,8 @@ snapshots: nanoid@6.0.1: {} + nanostores@1.5.5: {} + neotraverse@1.0.1: {} nlcst-to-string@4.0.0: @@ -14393,6 +14718,8 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.4 '@rolldown/binding-win32-x64-msvc': 1.2.4 + rou3@0.9.2: {} + run-applescript@7.1.0: {} run-parallel@1.2.0: @@ -14417,7 +14744,7 @@ snapshots: safer-buffer@2.1.2: {} - sanity-plugin-media@6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): + sanity-plugin-media@6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): dependencies: '@hookform/resolvers': 4.1.3(react-hook-form@7.85.0(react@19.2.4)) '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1))(react@19.2.4) @@ -14445,14 +14772,14 @@ snapshots: redux: 5.0.1 redux-observable: 3.0.0-rc.2(redux@5.0.1)(rxjs@7.8.2) rxjs: 7.8.2 - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) zod: 3.25.76 transitivePeerDependencies: - '@types/react' - supports-color - sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3): + sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3): dependencies: '@algorithm.ts/lcs': 4.0.6 '@date-fns/tz': 1.5.0 @@ -14480,7 +14807,7 @@ snapshots: '@sanity-labs/ui-poc': 0.0.1-alpha.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@sanity/asset-utils': 2.3.0 '@sanity/bifur-client': 1.0.0 - '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) + '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) '@sanity/client': 7.26.2 '@sanity/color': 3.0.8 '@sanity/comlink': 4.0.3 @@ -14524,7 +14851,7 @@ snapshots: i18next: 26.3.6(typescript@5.9.3) is-hotkey-esm: 1.0.0 is-network-error: 1.3.2 - isomorphic-dompurify: 2.36.0(@noble/hashes@2.0.1) + isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) json-reduce: 3.0.0 json-stable-stringify: 1.3.0 lodash-es: 4.18.1 @@ -14600,7 +14927,7 @@ snapshots: - vitest - vue-tsc - sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3): + sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3): dependencies: '@algorithm.ts/lcs': 4.0.6 '@date-fns/tz': 1.5.0 @@ -14628,7 +14955,7 @@ snapshots: '@sanity-labs/ui-poc': 0.0.1-alpha.25(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@sanity/asset-utils': 2.3.0 '@sanity/bifur-client': 1.0.0 - '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.0.1)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) + '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) '@sanity/client': 7.26.2 '@sanity/color': 3.0.8 '@sanity/comlink': 4.0.3 @@ -14672,7 +14999,7 @@ snapshots: i18next: 26.3.6(typescript@5.9.3) is-hotkey-esm: 1.0.0 is-network-error: 1.3.2 - isomorphic-dompurify: 2.36.0(@noble/hashes@2.0.1) + isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) json-reduce: 3.0.0 json-stable-stringify: 1.3.0 lodash-es: 4.18.1 @@ -14803,6 +15130,8 @@ snapshots: semver@7.8.5: {} + set-cookie-parser@3.1.3: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15640,9 +15969,9 @@ snapshots: whatwg-mimetype@5.0.0: {} - whatwg-url@16.0.1(@noble/hashes@2.0.1): + whatwg-url@16.0.1(@noble/hashes@2.4.0): dependencies: - '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.4.0) tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -15674,10 +16003,10 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260815.1 '@cloudflare/workerd-windows-64': 1.20260815.1 - workers-ai-provider@4.0.0(patch_hash=75deef68d8c9efb9d0dc235e48a668acbde17a117fd935e787de368a8f46e86c)(@ai-sdk/provider@4.0.26)(ai@7.0.135(zod@4.4.3)): + workers-ai-provider@4.0.0(patch_hash=75deef68d8c9efb9d0dc235e48a668acbde17a117fd935e787de368a8f46e86c)(@ai-sdk/provider@4.0.26)(ai@7.0.135(zod@4.6.7)): dependencies: '@ai-sdk/provider': 4.0.26 - ai: 7.0.135(zod@4.4.3) + ai: 7.0.135(zod@4.6.7) workers-og@0.0.27: dependencies: @@ -15813,6 +16142,8 @@ snapshots: zod@4.4.3: {} + zod@4.6.7: {} + zustand@5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): optionalDependencies: '@types/react': 19.2.14