deepspace 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1193 -169
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +47 -425
- package/dist/index.js +272 -1688
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +207 -28
- package/dist/server.js +713 -26
- package/dist/server.js.map +1 -1
- package/dist/worker.d.ts +207 -28
- package/dist/worker.js +713 -26
- package/dist/worker.js.map +1 -1
- package/features/admin-page/src/AdminPage.tsx +1 -1
- package/features/canvas/src/CanvasListPage.tsx +1 -1
- package/features/canvas/src/components/CanvasView.tsx +1 -1
- package/features/docs/src/DocsEditorPage.tsx +1 -1
- package/features/docs/src/InviteDialog.tsx +130 -139
- package/features/file-attachments/src/AttachmentsPage.tsx +1 -4
- package/features/file-manager/src/FileManagerPage.tsx +2 -1
- package/features/items/src/ItemsPage.tsx +1 -1
- package/features/landing/src/LandingPage.tsx +1 -1
- package/features/landing/src/primitives.tsx +1 -1
- package/features/leaderboard/src/LeaderboardPage.tsx +1 -1
- package/features/leaderboard/src/leaderboard-constants.ts +1 -1
- package/features/search-bar/src/SearchOverlay.tsx +1 -1
- package/features/tasks/src/TasksPage.tsx +1 -1
- package/features/tasks/src/tasks-constants.ts +1 -1
- package/package.json +1 -18
- package/dist/testing.d.ts +0 -115
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/cli.ts","../src/cli/commands/login.ts","../src/cli/lib/spinner.ts","../src/cli/env.ts","../src/cli/lib/wrangler-env.ts","../src/server/rooms/app-name.ts","../src/cli/session.ts","../src/cli/commands/logout.ts","../src/cli/commands/dev.ts","../src/cli/auth.ts","../src/cli/jwt.ts","../src/cli/lib/app-context.ts","../src/cli/lib/install-status.ts","../src/cli/lib/preflight.ts","../src/cli/commands/kill.ts","../src/cli/commands/test.ts","../src/cli/lib/playwright.ts","../src/cli/commands/screenshot.ts","../src/cli/commands/test-accounts.ts","../src/cli/commands/deploy.ts","../src/server/rooms/binding-manifest.ts","../src/cli/commands/undeploy.ts","../src/cli/commands/whoami.ts","../src/cli/commands/add.ts","../src/cli/commands/skills.ts","../src/cli/commands/domain.ts","../src/cli/commands/integrations.ts","../src/cli/commands/_invoke-impl.ts","../src/cli/commands/invoke.ts","../src/cli/commands/managed-repos.ts","../src/cli/commands/library.ts","../src/cli/commands/admin.ts"],"sourcesContent":["/**\n * DeepSpace CLI\n *\n * Commands:\n * login — authenticate with your DeepSpace account\n * deploy — build and deploy your app to *.app.space\n * undeploy — remove a deployed app\n * managed-repos — manage DeepSpace-owned GitHub repos\n * create — redirects to `npm create deepspace`\n */\n\nimport { defineCommand, runMain } from 'citty'\nimport { execSync } from 'node:child_process'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport login from './commands/login'\nimport logout from './commands/logout'\nimport dev from './commands/dev'\nimport kill from './commands/kill'\nimport test from './commands/test'\nimport screenshot from './commands/screenshot'\nimport testAccounts from './commands/test-accounts'\nimport deploy from './commands/deploy'\nimport undeploy from './commands/undeploy'\nimport whoami from './commands/whoami'\nimport add from './commands/add'\nimport skills from './commands/skills'\nimport domain from './commands/domain'\nimport integrations from './commands/integrations'\nimport invoke from './commands/invoke'\nimport managedRepos from './commands/managed-repos'\nimport library from './commands/library'\nimport admin from './commands/admin'\n\n// Read own version from package.json so the CLI banner stays in sync with publishes.\n// __dirname of the bundled output is <pkg>/dist; package.json sits one level up.\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'))\n\n// workerd doesn't auto-discover system CAs in containers — outbound HTTPS to the\n// auth/api workers fails with \"TLS peer's certificate is not trusted\" until we\n// point it at the standard Debian/Ubuntu cert bundle. Harmless on macOS (path\n// doesn't exist, env var not set).\nif (\n process.platform === 'linux' &&\n !process.env.SSL_CERT_FILE &&\n existsSync('/etc/ssl/certs/ca-certificates.crt')\n) {\n process.env.SSL_CERT_FILE = '/etc/ssl/certs/ca-certificates.crt'\n}\n\nconst create = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a new DeepSpace app',\n },\n args: {\n name: {\n type: 'positional',\n description: 'App name',\n required: false,\n },\n },\n run({ args }) {\n const name = args.name ? ` ${args.name}` : ''\n console.log(`Running: npm create deepspace${name}\\n`)\n execSync(`npm create deepspace@latest${name}`, { stdio: 'inherit' })\n },\n})\n\nconst main = defineCommand({\n meta: {\n name: 'deepspace',\n version: pkg.version,\n description: 'DeepSpace SDK CLI',\n },\n subCommands: {\n create,\n login,\n logout,\n whoami,\n dev,\n kill,\n test,\n screenshot,\n 'test-accounts': testAccounts,\n add,\n skills,\n integrations,\n 'managed-repos': managedRepos,\n invoke,\n deploy,\n undeploy,\n domain,\n library,\n admin,\n },\n // No `run()` here — citty cascades parent run() AFTER subcommand finishes,\n // which corrupts agent-friendly output (`--json`) and prints noise on every\n // command. Citty's default behavior when no subcommand matches is to print\n // help, which is what we want for `deepspace` with no args.\n})\n\nrunMain(main)\n","/**\n * deepspace login\n *\n * Opens the browser to sign in with GitHub or Google.\n * CLI polls the auth worker until login is complete.\n *\n * deepspace login # browser-based OAuth\n * deepspace login --email x --password y # non-interactive (CI/agents)\n */\n\nimport { defineCommand } from 'citty'\nimport { writeFileSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { exec } from 'node:child_process'\nimport { platform } from 'node:os'\nimport { randomBytes, createHash } from 'node:crypto'\nimport * as p from '@clack/prompts'\n\nimport { createSpinner } from '../lib/spinner'\nimport { DASHBOARD_URL, ENVS } from '../env'\nimport { exchangeSession, SESSION_COOKIE } from '../session'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nexport default defineCommand({\n meta: {\n name: 'login',\n description: 'Log in to your DeepSpace account',\n },\n args: {\n email: {\n type: 'string',\n description: 'Email address (non-interactive mode)',\n required: false,\n },\n password: {\n type: 'string',\n description: 'Password (non-interactive mode)',\n required: false,\n },\n },\n async run({ args }) {\n // Non-interactive mode for CI/agents with email+password\n if (args.email && args.password) {\n console.log(`Signing in as ${args.email}...`)\n await doEmailLogin(args.email, args.password)\n console.log('Logged in')\n return\n }\n\n // Browser-based OAuth flow\n p.intro('DeepSpace Login')\n\n const s = createSpinner()\n s.start('Creating login session...')\n\n // PKCE: generate a random verifier and send only its SHA-256 hash to the\n // server. The verifier never leaves this process, so the loginUrl alone\n // can't be used to drain credentials at /status — only this CLI can.\n const codeVerifier = base64url(randomBytes(32))\n const codeChallenge = base64url(createHash('sha256').update(codeVerifier).digest())\n\n // 1. Create a CLI session\n const sessionRes = await fetch(`${AUTH_URL}/api/auth/cli/session`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code_challenge: codeChallenge }),\n })\n if (!sessionRes.ok) {\n s.stop('Failed')\n p.cancel('Could not create login session')\n process.exit(1)\n }\n const sessionData = (await sessionRes.json()) as {\n sessionId?: string\n loginUrl?: string\n }\n if (!sessionData.sessionId || !sessionData.loginUrl) {\n s.stop('Failed')\n p.cancel('Could not create login session')\n process.exit(1)\n }\n\n const { sessionId, loginUrl } = sessionData as {\n sessionId: string\n loginUrl: string\n }\n\n s.stop('Opening browser...')\n p.log.info(`If the browser doesn't open, visit:\\n ${loginUrl}`)\n\n // 2. Open browser\n openBrowser(loginUrl)\n\n // 3. Poll for completion\n s.start('Waiting for authentication...')\n const result = await pollForCompletion(sessionId, codeVerifier)\n\n if (!result) {\n s.stop('Timed out')\n p.cancel('Login timed out. Run `deepspace login` to try again.')\n process.exit(1)\n }\n\n // 4. Store credentials\n storeCredentials(result.sessionToken, result.jwt)\n\n s.stop('Authenticated')\n p.log.success(`Logged in as ${result.name ?? result.email}`)\n p.note(\n `Manage your account, deployed apps, billing, and subscription\\nplans on the web dashboard:\\n\\n ${DASHBOARD_URL}`,\n 'Dashboard',\n )\n p.outro('Done')\n },\n})\n\ninterface LoginResult {\n sessionToken: string\n jwt: string\n email: string\n name: string | null\n}\n\nasync function pollForCompletion(\n sessionId: string,\n codeVerifier: string,\n): Promise<LoginResult | null> {\n const maxAttempts = 120 // 10 minutes at 5s intervals\n const interval = 5000\n\n for (let i = 0; i < maxAttempts; i++) {\n await sleep(interval)\n\n try {\n const res = await fetch(`${AUTH_URL}/api/auth/cli/status/${sessionId}`, {\n headers: { 'x-code-verifier': codeVerifier },\n })\n\n if (res.status === 410 || res.status === 404) return null // expired / not found\n if (!res.ok) continue\n\n const data = (await res.json()) as {\n state?: string\n sessionToken?: string\n jwt?: string\n email?: string\n name?: string\n }\n\n if (data.state === 'complete' && data.sessionToken && data.jwt) {\n return {\n sessionToken: data.sessionToken,\n jwt: data.jwt,\n email: data.email ?? '',\n name: data.name ?? null,\n }\n }\n } catch {\n // Network error, keep polling\n }\n }\n\n return null\n}\n\nfunction storeCredentials(sessionToken: string, jwt: string) {\n const dir = join(homedir(), '.deepspace')\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n writeFileSync(join(dir, 'session'), sessionToken, { mode: 0o600 })\n writeFileSync(join(dir, 'token'), jwt, { mode: 0o600 })\n}\n\nfunction openBrowser(url: string) {\n const cmd =\n platform() === 'darwin'\n ? `open \"${url}\"`\n : platform() === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`\n\n exec(cmd, () => {\n // Ignore errors — we already showed the URL\n })\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction base64url(bytes: Buffer): string {\n return bytes.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n// ── Email/password login (for test accounts and CI) ────────────────\n\nasync function doEmailLogin(email: string, password: string): Promise<void> {\n const res = await fetch(`${AUTH_URL}/api/auth/sign-in/email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Origin: AUTH_URL },\n body: JSON.stringify({ email, password }),\n redirect: 'manual',\n })\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { message?: string }\n throw new Error(body.message ?? `Authentication failed (${res.status})`)\n }\n\n const setCookie = res.headers.get('set-cookie') ?? ''\n const cookieMatch = setCookie.match(new RegExp(`${SESSION_COOKIE}=([^;]+)`))\n if (!cookieMatch) {\n throw new Error('No session cookie returned')\n }\n const sessionToken = decodeURIComponent(cookieMatch[1])\n\n const jwt = await exchangeSession(AUTH_URL, sessionToken)\n if (!jwt) {\n throw new Error('JWT issuance failed')\n }\n\n storeCredentials(sessionToken, jwt)\n}\n","import * as p from '@clack/prompts'\n\n// In a real terminal, @clack/prompts repaints the spinner by writing `\\r`\n// to overwrite the previous frame. In non-TTY contexts (agents, CI logs,\n// pipes, `tee`-ed output) `\\r` does nothing and every frame becomes a new\n// line — a single long phase floods the log with thousands of repeats.\n// When stdout is not a TTY we fall back to one static line per phase.\nexport function createSpinner(): {\n start: (msg?: string) => void\n stop: (msg?: string) => void\n message: (msg?: string) => void\n} {\n if (process.stdout.isTTY) return p.spinner()\n return {\n start: (msg?: string) => { if (msg) console.log(msg) },\n stop: (msg?: string) => { if (msg) console.log(msg) },\n message: (msg?: string) => { if (msg) console.log(msg) },\n }\n}\n","/**\n * DeepSpace environment configuration.\n *\n * Shared between `dev`, `test`, and `deploy` commands.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport {\n resolveAppNameForEnv,\n readWranglerConfig,\n hasWranglerConfig,\n} from './lib/wrangler-env'\n\nconst ENV_URLS = {\n auth: 'https://auth.deep.space',\n api: 'https://api-worker.deep.space',\n platform: 'https://platform-worker.deep.space',\n deploy: 'https://deploy-worker.deep.space',\n} as const\n\nexport const ENVS = {\n dev: ENV_URLS,\n prod: ENV_URLS,\n} as const\n\nexport type EnvName = keyof typeof ENVS\n\n/**\n * Web dashboard for managing deployed apps, billing, subscription plans,\n * earnings, etc. Linked from `login` and `whoami` so developers\n * discover it (the CLI alone gives no hint that it exists).\n */\nexport const DASHBOARD_URL = 'https://dashboard.deep.space'\n\n/**\n * Fetch the JWT public key from an auth worker's /api/auth/jwks endpoint.\n */\nexport async function fetchPublicKey(authUrl: string): Promise<string> {\n const res = await fetch(`${authUrl}/api/auth/jwks`)\n if (!res.ok) {\n throw new Error(`Failed to fetch JWT public key (${res.status})`)\n }\n const data = (await res.json()) as { publicKey?: string }\n if (!data.publicKey) {\n throw new Error('JWKS response missing publicKey')\n }\n return data.publicKey\n}\n\n/**\n * Read the app name from the app's wrangler.toml. A non-canonical `name`\n * (e.g. `My_App` vs. `my-app`) is rejected with a clear error so wrangler.toml\n * stays the single source of truth — otherwise the canonical form would land\n * on deployed bindings and the registry while the raw form persisted in\n * `[vars].APP_NAME` and the client `SCOPE_ID`, splitting identity across\n * surfaces.\n *\n * `deepspace dev` runs in an app directory; the name is required.\n */\nfunction readAppName(appDir: string, wranglerEnv?: string): string {\n if (!hasWranglerConfig(appDir)) {\n throw new Error('No wrangler.toml found. Are you in a DeepSpace app directory?')\n }\n const config = readWranglerConfig(appDir)\n // Single source of truth — every command (deploy, dev, undeploy)\n // resolves through `resolveAppNameForEnv` so the validation rules\n // (missing block, empty name, collision with the top-level name,\n // canonical form) can never drift between them.\n const resolved = resolveAppNameForEnv(config, wranglerEnv)\n if (!resolved.ok) throw new Error(resolved.reason)\n\n // Refuse to proceed when the declared name doesn't already match the\n // canonical form. Otherwise the canonical name lands on deployed bindings\n // and the registry, while the raw name persists in `[vars].APP_NAME` and\n // client-side `SCOPE_ID = app:${APP_NAME}` — splitting the identity across\n // surfaces. Failing here forces the dev to fix wrangler.toml once, after\n // which every surface reads from the same source of truth.\n const rawName = wranglerEnv ? config.env?.[wranglerEnv]?.name : config.name\n if (rawName !== resolved.name) {\n const where = wranglerEnv ? `[env.${wranglerEnv}].name` : '`name`'\n throw new Error(\n `wrangler.toml: ${where} \"${rawName}\" is not in canonical form. ` +\n `Update it to \"${resolved.name}\" and re-run.`,\n )\n }\n return resolved.name\n}\n\n/**\n * Mint a long-lived app-owner JWT from the auth worker.\n *\n * The caller passes their own short-lived user JWT (obtained via\n * `ensureToken()` from auth.ts) and the target env's auth URL. The auth\n * worker verifies the caller, signs a 10-year owner-scoped token bound to\n * `appName`, and returns it. This same token is used in dev (written into\n * `.dev.vars`) and in production (injected as a secret at deploy time).\n */\nexport async function mintAppOwnerJwt(\n authUrl: string,\n callerJwt: string,\n appName: string,\n): Promise<string> {\n const res = await fetch(`${authUrl}/api/auth/mint-app-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${callerJwt}`,\n },\n body: JSON.stringify({ appName }),\n })\n if (!res.ok) {\n const err = await res.text().catch(() => '')\n throw new Error(`Failed to mint APP_OWNER_JWT (${res.status}): ${err}`)\n }\n const body = (await res.json()) as { token?: string; error?: string }\n if (!body.token) {\n throw new Error(`Auth worker returned no token: ${body.error ?? 'unknown error'}`)\n }\n return body.token\n}\n\n/**\n * Fetch the per-app HMAC identity token from the deploy worker. The starter's\n * /_deepspace/* proxy attaches this token on every call to the API worker so\n * the platform can verify the request originated from a known app. In\n * production this is minted at deploy time and injected as a Worker binding;\n * in local dev we fetch it via this endpoint, which is gated by app ownership.\n */\nexport async function fetchAppIdentityToken(\n deployUrl: string,\n callerJwt: string,\n appName: string,\n): Promise<string | null> {\n const res = await fetch(\n `${deployUrl}/api/apps/${encodeURIComponent(appName)}/identity-token`,\n {\n method: 'POST',\n headers: { Authorization: `Bearer ${callerJwt}` },\n },\n )\n if (res.status === 404) {\n // App hasn't been deployed yet — pre-deploy dev workflow. The proxy will\n // 401 calls under /_deepspace/* until first deploy registers the app.\n return null\n }\n if (!res.ok) {\n const err = await res.text().catch(() => '')\n throw new Error(`Failed to fetch APP_IDENTITY_TOKEN (${res.status}): ${err}`)\n }\n const body = (await res.json()) as { token?: string; error?: string }\n if (!body.token) {\n throw new Error(`Deploy worker returned no token: ${body.error ?? 'unknown error'}`)\n }\n return body.token\n}\n\n/**\n * Keys the SDK manages in the top section of .dev.vars. They're rewritten\n * on every `deepspace dev`/`test`/`deploy` run from the platform's truth\n * (auth URL, owner JWT, identity token, etc.). Keys that match this set\n * are stripped from the top section on read so they don't double-write.\n *\n * Critically: this set is only consulted ABOVE the user-managed divider.\n * Once we cross the divider into the \"user owns it\" section, EVERYTHING\n * is preserved — including a user-supplied `ALLOW_DEBUG_ROUTES=true`,\n * which is how an app opts /api/debug/* into prod (the value lands as a\n * secret_text binding on the deployed worker). See extractCustomDevVars.\n */\nconst SDK_MANAGED_KEYS = new Set([\n 'AUTH_JWT_PUBLIC_KEY',\n 'AUTH_JWT_ISSUER',\n 'AUTH_WORKER_URL',\n 'API_WORKER_URL',\n 'PLATFORM_WORKER_URL',\n 'OWNER_USER_ID',\n 'APP_OWNER_JWT',\n 'APP_IDENTITY_TOKEN',\n 'ALLOW_DEBUG_ROUTES',\n])\n\n// Marker the SDK writes between its own keys and user-managed content. We\n// recognize and strip this line on read so it doesn't accumulate across runs.\nexport const DEV_VARS_DIVIDER =\n '# --- not managed by the SDK; preserved across dev/test runs ---'\n\n/**\n * Strip SDK-managed lines from an existing .dev.vars file, preserving all\n * other content (comments, blank lines, custom KEY=value pairs, multi-line\n * quoted values). Also strips the SDK divider marker so it doesn't double\n * up across runs.\n *\n * Exported for testing.\n */\nexport function extractCustomDevVars(content: string): string {\n const lines = content.split('\\n')\n const out: string[] = []\n // SDK-managed keys are only stripped ABOVE the divider. Once we cross\n // into the user-owned section, every line is preserved verbatim — so\n // an app can opt into shipping a key the SDK happens to also write\n // (today: `ALLOW_DEBUG_ROUTES=true`) by setting it in that section.\n let belowDivider = false\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n if (line.trim() === DEV_VARS_DIVIDER.trim()) {\n // Drop our own divider — writeDevVars will re-add a single one.\n belowDivider = true\n i++\n continue\n }\n const eq = line.indexOf('=')\n const keyMatch = eq >= 0 ? line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/) : null\n if (!keyMatch) {\n // Comment, blank, or non-key line — preserve verbatim.\n out.push(line)\n i++\n continue\n }\n const key = keyMatch[1]\n const valStart = line.slice(eq + 1)\n const block: string[] = [line]\n // Multi-line quoted value: opens with `\"` and the rest of the line has no\n // closing quote. Keep accumulating until a closing `\"` lands.\n if (valStart.startsWith('\"') && !hasUnescapedQuote(valStart.slice(1))) {\n i++\n while (i < lines.length) {\n block.push(lines[i])\n const closed = hasUnescapedQuote(lines[i])\n i++\n if (closed) break\n }\n } else {\n i++\n }\n if (belowDivider || !SDK_MANAGED_KEYS.has(key)) {\n out.push(...block)\n }\n }\n // Trim trailing blanks so we don't accumulate them across runs.\n while (out.length && out[out.length - 1].trim() === '') out.pop()\n return out.join('\\n')\n}\n\nfunction hasUnescapedQuote(s: string): boolean {\n let escaped = false\n for (const ch of s) {\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') return true\n }\n return false\n}\n\n/**\n * Parse a `.dev.vars` (dotenv) string into a key→value map.\n *\n * Handles:\n * - bare KEY=value\n * - KEY=\"quoted value\"\n * - multi-line KEY=\"-----BEGIN ...\\n-----END ...\"\n * - escaped quotes inside (`KEY=\"he said \\\"hi\\\"\"`)\n * - comments and blank lines (skipped)\n *\n * Used for two things:\n * 1. parsing the user-managed section of `.dev.vars` so the CLI can ship\n * app-defined secrets to production at deploy time (Option B,\n * `feedback_app_secrets_via_dev_vars`)\n * 2. round-tripping for tests\n *\n * Exported.\n */\nexport function parseDevVars(content: string): Record<string, string> {\n const result: Record<string, string> = {}\n const lines = content.split('\\n')\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) {\n i++\n continue\n }\n const eq = line.indexOf('=')\n if (eq < 0) {\n i++\n continue\n }\n const keyMatch = line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/)\n if (!keyMatch) {\n i++\n continue\n }\n const key = keyMatch[1]\n let value = line.slice(eq + 1)\n\n // Multi-line quoted value: opens with `\"` and the rest of the line has\n // no closing quote. Keep accumulating until a closing `\"` lands.\n let closed = !value.startsWith('\"') || hasUnescapedQuote(value.slice(1))\n if (!closed) {\n i++\n while (i < lines.length) {\n value += '\\n' + lines[i]\n if (hasUnescapedQuote(lines[i])) {\n closed = true\n i++\n break\n }\n i++\n }\n } else {\n i++\n }\n\n // Reject unterminated quoted values rather than silently corrupting the\n // secret. Without this guard, a `KEY=\"value with no closing quote` line\n // would round-trip through deploy as a literal leading `\"` in the value\n // — a near-impossible bug to debug in production.\n if (value.startsWith('\"') && !closed) {\n throw new Error(\n `parseDevVars: unterminated quoted value for key \"${key}\" — check your .dev.vars file for a missing closing quote.`,\n )\n }\n\n // Strip surrounding quotes (and unescape \\\" within) for quoted values.\n if (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) {\n value = value.slice(1, -1).replace(/\\\\\"/g, '\"')\n }\n\n result[key] = value\n }\n return result\n}\n\n/**\n * Write .dev.vars for an app, pointing to the specified environment's workers.\n *\n * Only the SDK-managed keys (see `SDK_MANAGED_KEYS`) are rewritten on each\n * call. Anything else in `.dev.vars` — third-party API tokens, R2 creds for\n * cross-account buckets, custom feature flags — is preserved verbatim.\n *\n * Includes a freshly-minted `APP_OWNER_JWT` so server-side code in the app\n * (DO alarms, cron handlers, autonomous agents) can call the API worker\n * proxy without any further auth plumbing. Uses the same flow as production:\n * the auth-worker mints the token, we store it as an env var.\n */\nexport async function writeDevVars(\n appDir: string,\n env: EnvName,\n ownerId: string,\n callerJwt: string,\n /** Wrangler [env.<name>] block to target. When set, mints\n * APP_OWNER_JWT for the env's app name and writes to\n * `.dev.vars.<wranglerEnv>` instead of `.dev.vars`. */\n wranglerEnv?: string,\n): Promise<void> {\n const urls = ENVS[env]\n const publicKey = await fetchPublicKey(urls.auth)\n const appName = readAppName(appDir, wranglerEnv)\n const appOwnerJwt = await mintAppOwnerJwt(urls.auth, callerJwt, appName)\n // Pre-first-deploy this returns null (the app isn't in the registry yet)\n // — that's expected. The /_deepspace/* proxy will start working after the\n // first `deepspace deploy` registers the app and a follow-up\n // `deepspace dev` re-runs this writer.\n const appIdentityToken = await fetchAppIdentityToken(urls.deploy, callerJwt, appName)\n\n // Wrangler's .dev.vars parser is dotenv-style: bare multi-line values are\n // truncated to the first line. The PEM public key spans multiple lines, so\n // it MUST be wrapped in double quotes (dotenv multi-line value syntax).\n // Without this, AUTH_JWT_PUBLIC_KEY ends up as just \"-----BEGIN PUBLIC KEY-----\"\n // and `importSPKI` throws `DataError: Invalid SPKI input`, which silently\n // breaks JWT verification on every WS connection (anonymous fallback).\n const sdkVars = [\n `AUTH_JWT_PUBLIC_KEY=\"${publicKey}\"`,\n `AUTH_JWT_ISSUER=${urls.auth}/api/auth`,\n `AUTH_WORKER_URL=${urls.auth}`,\n `API_WORKER_URL=${urls.api}`,\n `PLATFORM_WORKER_URL=${urls.platform}`,\n `OWNER_USER_ID=${ownerId}`,\n `APP_OWNER_JWT=${appOwnerJwt}`,\n ...(appIdentityToken ? [`APP_IDENTITY_TOKEN=${appIdentityToken}`] : []),\n // Open /api/debug/* (proxied to RecordRoom) for dev + tests only.\n // Production secrets never set this, so deployed apps 404 the route.\n `ALLOW_DEBUG_ROUTES=true`,\n ].join('\\n')\n\n // Per-env file. Matches the Cloudflare Vite plugin's own naming\n // convention (`.dev.vars.<env>` when `CLOUDFLARE_ENV` is set), so the\n // CLI and the plugin agree on which file is the source of truth for\n // each environment's secrets.\n const devVarsPath = join(appDir, wranglerEnv ? `.dev.vars.${wranglerEnv}` : '.dev.vars')\n const existing = existsSync(devVarsPath) ? readFileSync(devVarsPath, 'utf-8') : ''\n const custom = extractCustomDevVars(existing)\n const body = custom\n ? `${sdkVars}\\n\\n${DEV_VARS_DIVIDER}\\n${custom}\\n`\n : `${sdkVars}\\n`\n\n writeFileSync(devVarsPath, body)\n}\n","/**\n * Wrangler env resolution for DeepSpace's multi-environment deploys.\n *\n * Lets a single repo deploy to `<app>.app.space` and `<app>-staging.app.space`\n * (or any other named environment) from one `wrangler.toml`:\n *\n * name = \"hopkins\"\n * [vars]\n * APP_NAME = \"hopkins\"\n *\n * [env.staging]\n * name = \"hopkins-staging\"\n * [env.staging.vars]\n * APP_NAME = \"hopkins-staging\"\n *\n * Then `npx deepspace deploy --env staging` reads the override and ships to\n * `hopkins-staging.app.space`. The platform treats it as a fully separate\n * app — its own DO state, OAuth tokens, Stripe products, cron schedule.\n * No platform-side change needed beyond letting the CLI register a second\n * app under the same owner.\n *\n * `CLOUDFLARE_ENV` is the wire format. The Cloudflare Vite plugin honors\n * it natively when it builds the worker bundle + emits `dist/wrangler.json`,\n * so the same env var the SDK CLI passes around is also the one Vite reads.\n * `.dev.vars.<env>` is read by the same plugin during preview/build, so we\n * use the matching naming convention for the user-managed secrets file too.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { parse as parseToml } from 'smol-toml'\nimport { resolveAppName } from '../../server/rooms/app-name'\n\n/** Shape of the bits of wrangler.toml that DeepSpace CLI commands read.\n * Add an optional field here whenever a new command starts consulting\n * the config — avoids one-off `WranglerConfig & { … }` casts at\n * call sites and keeps the canonical type in one place. */\nexport interface WranglerConfig {\n name?: string\n env?: Record<string, { name?: string } | undefined>\n /** `[assets]` block (`directory`, `binding`, `not_found_handling`,\n * `run_worker_first`). Consumed by deploy.ts to merge extra\n * worker-first routes into the deployed metadata. */\n assets?: {\n directory?: string\n binding?: string\n not_found_handling?: string\n run_worker_first?: unknown\n }\n /** `[vars]` block — string-valued environment variables baked into\n * the worker at deploy time. */\n vars?: Record<string, unknown>\n}\n\n/**\n * Resolve the appName that this CLI invocation should target.\n *\n * Without `envName`: returns the top-level `name`.\n * With `envName`: returns `[env.<envName>].name` and requires that the\n * env block exists and declares a name. We refuse to\n * fall back to the top-level name because that would\n * silently deploy staging code to production.\n *\n * Returns a discriminated union so callers can surface a precise error\n * (matches the existing `resolveAppName` contract).\n */\nexport function resolveAppNameForEnv(\n config: WranglerConfig,\n envName: string | undefined,\n): { ok: true; name: string; warning?: string } | { ok: false; reason: string } {\n if (!envName) {\n return resolveAppName(config.name)\n }\n const envBlock = config.env?.[envName]\n if (!envBlock) {\n return {\n ok: false,\n reason: `wrangler.toml: no [env.${envName}] block found. ` +\n `Add one with a distinct \\`name\\` to deploy this environment.`,\n }\n }\n if (typeof envBlock.name !== 'string' || envBlock.name.trim() === '') {\n return {\n ok: false,\n reason: `wrangler.toml: [env.${envName}].name is missing. ` +\n `Set a distinct app name (e.g. \"${typeof config.name === 'string' ? config.name : 'myapp'}-${envName}\") so this environment doesn't overwrite the default.`,\n }\n }\n if (envBlock.name === config.name) {\n return {\n ok: false,\n reason: `wrangler.toml: [env.${envName}].name \"${envBlock.name}\" is the same as the top-level name. ` +\n `Pick a distinct name (e.g. \"${config.name}-${envName}\") so deploys don't collide.`,\n }\n }\n return resolveAppName(envBlock.name)\n}\n\n/**\n * The .dev.vars filename for an environment. Matches the convention the\n * Cloudflare Vite plugin already uses when `CLOUDFLARE_ENV` is set, so the\n * SDK CLI and the plugin agree on which file holds the per-env secrets.\n */\nexport function devVarsPathFor(appDir: string, envName: string | undefined): string {\n return envName ? join(appDir, `.dev.vars.${envName}`) : join(appDir, '.dev.vars')\n}\n\n/**\n * Read + parse wrangler.toml. Caller checks existence first via\n * `hasWranglerConfig`. Throws a `WranglerConfigError` with the absolute\n * path embedded on a malformed file — saves the user from staring at\n * a raw smol-toml parser stack trace when they have one stray\n * unquoted character in their config.\n */\nexport class WranglerConfigError extends Error {\n constructor(public readonly path: string, public readonly cause: unknown) {\n const detail = cause instanceof Error ? cause.message : String(cause)\n super(`wrangler.toml: malformed TOML at ${path}: ${detail}`)\n this.name = 'WranglerConfigError'\n }\n}\n\nexport function readWranglerConfig(appDir: string): WranglerConfig {\n const path = join(appDir, 'wrangler.toml')\n const raw = readFileSync(path, 'utf-8')\n try {\n return parseToml(raw) as WranglerConfig\n } catch (err) {\n throw new WranglerConfigError(path, err)\n }\n}\n\n/** Convenience: true when wrangler.toml exists at the standard path. */\nexport function hasWranglerConfig(appDir: string): boolean {\n return existsSync(join(appDir, 'wrangler.toml'))\n}\n","/**\n * App-name validation + sanitization helpers.\n *\n * Strategy: validate strictly so we have a precise definition of \"valid\",\n * but DON'T reject non-conforming names — sanitize them, warn the user, and\n * proceed. Hard rejection would break apps whose `wrangler.toml name` was\n * something like `My_App` (previously deployed as `my-app` via silent\n * server-side sanitization). The new behavior preserves \"still deploys,\"\n * but the CLI now surfaces a warning so the user can fix the name when\n * convenient instead of being silently surprised by their hostname.\n *\n * Rules track Cloudflare's WfP script-name constraints (RFC 1035 host label,\n * no consecutive dashes) plus our 2-char minimum so subdomains read sensibly.\n */\n\nexport const APP_NAME_RULES = {\n /** ^[a-z0-9](-?[a-z0-9])+$ — RFC 1035 host label, no consecutive dashes. */\n pattern: /^[a-z0-9](?:-?[a-z0-9])+$/,\n minLength: 2,\n maxLength: 63,\n} as const\n\nexport type AppNameValidation =\n | { valid: true; name: string }\n | { valid: false; reason: string }\n\n/**\n * Strict validation: returns valid only if the name already conforms.\n * Useful as a precondition test or for CI lints.\n */\nexport function validateAppName(raw: unknown): AppNameValidation {\n if (typeof raw !== 'string') {\n return { valid: false, reason: 'App name must be a string' }\n }\n const name = raw.trim()\n if (!name) {\n return { valid: false, reason: 'App name is required' }\n }\n if (name.length < APP_NAME_RULES.minLength) {\n return { valid: false, reason: `App name \"${name}\" is too short (min ${APP_NAME_RULES.minLength} chars)` }\n }\n if (name.length > APP_NAME_RULES.maxLength) {\n return { valid: false, reason: `App name \"${name}\" is too long (max ${APP_NAME_RULES.maxLength} chars)` }\n }\n if (!APP_NAME_RULES.pattern.test(name)) {\n return {\n valid: false,\n reason:\n `App name \"${name}\" is invalid. Use lowercase letters, digits, and single hyphens only ` +\n `(must start + end with alphanumeric). Examples: my-app, search-v2, unison-search.`,\n }\n }\n return { valid: true, name }\n}\n\nexport type AppNameResolution =\n | { ok: true; name: string; warning?: string }\n | { ok: false; reason: string }\n\n/**\n * Resolve an app name for deploy: prefer the input as-is if valid, otherwise\n * sanitize and warn. Hard-fail only if even sanitization can't produce a\n * valid name (empty, all-non-alphanumeric, too short, too long).\n *\n * The intent is \"what previously worked still works, with a friendly warning\n * about non-conforming names.\"\n */\nexport function resolveAppName(raw: unknown): AppNameResolution {\n const strict = validateAppName(raw)\n if (strict.valid) return { ok: true, name: strict.name }\n\n if (typeof raw !== 'string') return { ok: false, reason: strict.reason }\n const trimmed = raw.trim()\n if (!trimmed) return { ok: false, reason: 'App name is required' }\n\n const sanitized = sanitizeAppName(trimmed)\n const sanitizedStrict = validateAppName(sanitized)\n if (!sanitizedStrict.valid) {\n return {\n ok: false,\n reason: `App name \"${trimmed}\" can't be sanitized into a valid name (${sanitizedStrict.reason}). Pick something matching: lowercase letters, digits, single hyphens, ${APP_NAME_RULES.minLength}-${APP_NAME_RULES.maxLength} chars.`,\n }\n }\n return {\n ok: true,\n name: sanitized,\n warning:\n `App name \"${trimmed}\" doesn't conform to deploy rules — using \"${sanitized}\" instead. ` +\n `Update wrangler.toml's \\`name\\` to silence this warning.`,\n }\n}\n\n/**\n * Lossy normalization that mirrors what the deploy-worker historically did\n * server-side. Keep only [a-z0-9-], collapse consecutive dashes, trim leading\n * and trailing dashes.\n */\nfunction sanitizeAppName(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-{2,}/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","/**\n * CLI session helpers — exchange a Better Auth session cookie for a short-lived\n * JWT against the auth worker. Shared by `auth.ts` (token refresh for all\n * authenticated commands) and `login.ts` (email/password flow).\n */\n\nexport const SESSION_COOKIE = '__Secure-better-auth.session_token'\n\n/**\n * Exchange a Better Auth session token for a fresh JWT.\n * Returns null if the session is invalid or expired.\n */\nexport async function exchangeSession(\n authUrl: string,\n sessionToken: string,\n): Promise<string | null> {\n const res = await fetch(`${authUrl}/api/auth/token`, {\n method: 'POST',\n headers: {\n Cookie: `${SESSION_COOKIE}=${encodeURIComponent(sessionToken)}`,\n Origin: authUrl,\n },\n })\n if (!res.ok) return null\n const data = (await res.json()) as { token?: string | null }\n return data.token ?? null\n}\n","/**\n * deepspace logout\n *\n * Revokes the session on the auth worker, then removes the cached session\n * token and JWT from ~/.deepspace/. Test accounts (managed by `deepspace\n * test-accounts`) are not touched.\n */\n\nimport { defineCommand } from 'citty'\nimport { existsSync, readFileSync, rmSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nimport { ENVS } from '../env'\nimport { SESSION_COOKIE } from '../session'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nconst DIR = join(homedir(), '.deepspace')\nconst SESSION_PATH = join(DIR, 'session')\nconst TOKEN_PATH = join(DIR, 'token')\n\nexport default defineCommand({\n meta: {\n name: 'logout',\n description: 'Sign out and remove cached credentials',\n },\n async run() {\n // Read the session token before deleting it so we can revoke server-side.\n const sessionToken = existsSync(SESSION_PATH)\n ? readFileSync(SESSION_PATH, 'utf-8').trim()\n : null\n\n if (sessionToken) {\n try {\n await fetch(`${AUTH_URL}/api/auth/sign-out`, {\n method: 'POST',\n headers: {\n Cookie: `${SESSION_COOKIE}=${encodeURIComponent(sessionToken)}`,\n Origin: AUTH_URL,\n },\n })\n } catch {\n // Network failure — still wipe local credentials so the user can\n // re-authenticate. Server-side session will expire on its own.\n }\n }\n\n let removed = 0\n for (const path of [SESSION_PATH, TOKEN_PATH]) {\n if (existsSync(path)) {\n rmSync(path)\n removed++\n }\n }\n\n if (removed === 0) {\n console.log('Already logged out.')\n return\n }\n console.log('Logged out.')\n },\n})\n","/**\n * deepspace dev [--prod] [--port N]\n *\n * Starts local development:\n * 1. Ensures you're logged in\n * 2. Writes .dev.vars pointing to dev or prod workers\n * 3. Starts vite dev (Cloudflare Vite plugin runs the worker in-process)\n *\n * deepspace dev # uses dev workers, port 5173 (strict)\n * deepspace dev --prod # uses production workers\n * deepspace dev --port 5180 # bind to a different port (multi-app dev)\n *\n * Port is `--port` > $DEEPSPACE_PORT > 5173. We always pass --strictPort to\n * vite so a busy port fails loudly instead of silently jumping to 5174 (which\n * would diverge from anything Playwright/test config is expecting).\n */\n\nimport { defineCommand } from 'citty'\nimport { resolve, basename } from 'node:path'\nimport spawn from 'cross-spawn'\nimport { ensureToken } from '../auth'\nimport { detectAppName, findAppDir, findChildApps, writeLaunchConfigIfMissing } from '../lib/app-context'\nimport { writeDevVars } from '../env'\nimport { decodeJwtPayload } from '../jwt'\nimport { ensureInstallReady } from '../lib/install-status'\nimport { preflightWindowsWorkerd } from '../lib/preflight'\n\nconst DEFAULT_PORT = 5173\n\nexport default defineCommand({\n meta: {\n name: 'dev',\n description: 'Start local development server',\n },\n args: {\n dir: {\n type: 'positional',\n description: 'App directory (default: current directory)',\n required: false,\n },\n prod: {\n type: 'boolean',\n description: 'Use production workers (real auth, real API calls)',\n default: false,\n },\n env: {\n type: 'string',\n description:\n 'wrangler.toml [env.<name>] block to run (e.g. --env staging). ' +\n 'Reads .dev.vars.<name> and applies the env\\'s overrides at build time.',\n required: false,\n },\n port: {\n type: 'string',\n description: `Port to bind (default ${DEFAULT_PORT}, or $DEEPSPACE_PORT)`,\n required: false,\n },\n },\n async run({ args }) {\n const env = args.prod ? 'prod' : 'dev'\n const wranglerEnv = typeof args.env === 'string' && args.env.trim() ? args.env.trim() : undefined\n const port = resolvePort(args.port)\n\n // Resolve the app root by walking up from the requested dir (default cwd),\n // so running from a subdirectory still works instead of hard-failing.\n const start = resolve(args.dir ?? '.')\n const appDir = findAppDir(start)\n if (!appDir) {\n console.error(`No wrangler.toml found at or above ${start}.`)\n const children = findChildApps(start)\n if (children.length > 0) {\n console.error('Did you mean to run inside one of these app directories?')\n for (const c of children) console.error(` cd ${c}`)\n } else {\n console.error('Run from a DeepSpace app directory (one containing wrangler.toml).')\n }\n process.exit(1)\n }\n\n // Seed an app-local .claude/launch.json (only if absent) so the Claude Code\n // preview tool launches this app on the resolved port, instead of walking\n // up and latching onto an ancestor repo's config.\n writeLaunchConfigIfMissing(appDir, detectAppName(appDir) ?? basename(appDir), port)\n\n ensureInstallReady(appDir)\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err: any) {\n console.error(err.message)\n process.exit(1)\n }\n\n let payload: { sub: string; name?: string; email?: string }\n try {\n payload = decodeJwtPayload<{ sub: string; name?: string; email?: string }>(token)\n } catch {\n console.error('Malformed session token. Run `npx deepspace login`.')\n process.exit(1)\n }\n // Two distinct concepts both colloquially called \"environment\":\n // - Platform : which DeepSpace stack we point at (dev vs prod\n // auth-worker / api-worker / platform-worker URLs)\n // - Wrangler env : which `[env.<name>]` block of wrangler.toml\n // we apply (renames the app, swaps vars, etc.)\n // Labeling them differently in the startup log makes the override\n // surface obvious when debugging which app slot a session is\n // hitting.\n console.log(`Logged in as ${payload.name ?? payload.email}`)\n console.log(`Platform: ${env}`)\n if (wranglerEnv) console.log(`Wrangler env: ${wranglerEnv}`)\n console.log(`Port: ${port}`)\n\n await writeDevVars(appDir, env, payload.sub, token, wranglerEnv)\n preflightWindowsWorkerd(appDir)\n console.log('Starting dev server...\\n')\n\n const vite = spawn(\n 'npx',\n ['vite', '--port', String(port), '--strictPort', '--host'],\n {\n cwd: appDir,\n stdio: 'inherit',\n // CLOUDFLARE_ENV is what the Cloudflare Vite plugin keys off — it\n // applies `[env.<name>]` overrides and loads `.dev.vars.<name>`\n // instead of `.dev.vars`. Set only when --env was passed so the\n // default invocation behaves exactly as before.\n env: {\n ...process.env,\n DEEPSPACE_PORT: String(port),\n ...(wranglerEnv ? { CLOUDFLARE_ENV: wranglerEnv } : {}),\n },\n },\n )\n process.on('SIGINT', () => vite.kill())\n process.on('SIGTERM', () => vite.kill())\n vite.on('close', (code) => process.exit(code ?? 0))\n },\n})\n\nfunction resolvePort(arg?: string): number {\n const raw = arg ?? process.env.DEEPSPACE_PORT\n if (!raw) return DEFAULT_PORT\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n console.error(`Invalid port: ${raw}. Must be an integer between 1 and 65535.`)\n process.exit(1)\n }\n return n\n}\n","/**\n * CLI auth utilities — shared across all commands.\n *\n * Reads the session token from ~/.deepspace/session and ensures\n * a fresh JWT is available at ~/.deepspace/token.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nimport { ENVS } from './env'\nimport { decodeJwtPayload } from './jwt'\nimport { exchangeSession } from './session'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nconst DIR = join(homedir(), '.deepspace')\nexport const SESSION_PATH = join(DIR, 'session')\nexport const TOKEN_PATH = join(DIR, 'token')\n\n/**\n * Ensure a valid JWT exists. Refreshes from the session token if expired.\n * Returns the JWT string or throws if not logged in / session expired.\n */\nexport async function ensureToken(): Promise<string> {\n // Try existing token first — if it's still valid, skip the refresh\n if (existsSync(TOKEN_PATH)) {\n const existing = readFileSync(TOKEN_PATH, 'utf-8').trim()\n if (isTokenValid(existing)) {\n return existing\n }\n }\n\n if (!existsSync(SESSION_PATH)) {\n throw new Error('Not logged in. Run `deepspace login` first.')\n }\n\n const sessionToken = readFileSync(SESSION_PATH, 'utf-8').trim()\n\n // Refresh from session\n const token = await exchangeSession(AUTH_URL, sessionToken)\n if (!token) {\n throw new Error('Session expired. Run `deepspace login` to re-authenticate.')\n }\n\n mkdirSync(DIR, { recursive: true, mode: 0o700 })\n writeFileSync(TOKEN_PATH, token, { mode: 0o600 })\n\n return token\n}\n\n/** Check if a JWT has at least 30 seconds of validity remaining. */\nfunction isTokenValid(jwt: string): boolean {\n try {\n const payload = decodeJwtPayload<{ exp?: number }>(jwt)\n return typeof payload.exp === 'number' && payload.exp * 1000 > Date.now() + 30_000\n } catch {\n return false\n }\n}\n","export function decodeJwtPayload<T = Record<string, unknown>>(token: string): T {\n const payloadSegment = token.split('.')[1]\n if (!payloadSegment) {\n throw new Error('JWT payload is missing')\n }\n return JSON.parse(Buffer.from(payloadSegment, 'base64url').toString('utf8')) as T\n}\n","/**\n * Shared helper: read the current project's app name from `./wrangler.toml`.\n *\n * Used by commands that operate on \"the current app\" — `deploy`, `domain buy`,\n * `domain attach`, etc. Lets agents and scripts run from inside a project\n * directory without redundantly passing `--app <name>`.\n */\n\nimport { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { join, resolve, dirname } from 'node:path'\nimport { parse as parseToml } from 'smol-toml'\n\n/**\n * Read the app name from `wrangler.toml` in the given directory (default cwd).\n * Returns null if no wrangler.toml exists or the file lacks a `name` field.\n */\nexport function detectAppName(cwd: string = process.cwd()): string | null {\n const wranglerPath = join(resolve(cwd), 'wrangler.toml')\n if (!existsSync(wranglerPath)) return null\n try {\n const cfg = parseToml(readFileSync(wranglerPath, 'utf-8')) as { name?: string }\n return typeof cfg.name === 'string' && cfg.name.length > 0 ? cfg.name : null\n } catch {\n return null\n }\n}\n\n/**\n * Resolve the app name from explicit arg or wrangler.toml.\n * Throws with a clear message if neither is available.\n */\nexport function requireAppName(explicit: string | undefined, cwd?: string): string {\n if (explicit) return explicit\n const detected = detectAppName(cwd)\n if (detected) return detected\n throw new Error(\n 'No app specified. Pass --app <name>, or run from an app directory with a wrangler.toml.',\n )\n}\n\n/**\n * Walk upward from `start` (default cwd) to the nearest directory containing a\n * `wrangler.toml`, returning that directory — or null if none is found before\n * the filesystem root.\n *\n * This makes the dev-loop commands robust to being run from a *subdirectory*\n * of an app instead of hard-failing the moment cwd isn't exactly the app root.\n * (It does NOT recover the inverse case — cwd sitting at the app's *parent*;\n * for that, `findChildApps` powers a \"did you mean cd <app>\" hint.)\n */\nexport function findAppDir(start: string = process.cwd()): string | null {\n let dir = resolve(start)\n for (;;) {\n if (existsSync(join(dir, 'wrangler.toml'))) return dir\n const parent = dirname(dir)\n if (parent === dir) return null // reached filesystem root\n dir = parent\n }\n}\n\n/**\n * Immediate subdirectories of `dir` that look like an app (contain a\n * `wrangler.toml`). Used to turn a bare \"no wrangler.toml here\" failure into an\n * actionable hint when the caller is sitting one level above the app — the\n * exact situation a harness creates when it resets cwd to the parent.\n */\nexport function findChildApps(dir: string): string[] {\n try {\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && existsSync(join(dir, e.name, 'wrangler.toml')))\n .map((e) => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * Seed `<appDir>/.claude/launch.json` so the Claude Code preview tool launches\n * THIS app. Without an app-local launch.json the tool walks up the directory\n * tree and can latch onto an ancestor repo's config — pointing at a different\n * app and port — which is a real failure when a DeepSpace app lives inside\n * another repo.\n *\n * Writes only when the file is absent, so a user- or tool-customized config\n * (different name, port, or runner) is never clobbered. Best-effort: a write\n * failure must never block `dev` from starting.\n */\nexport function writeLaunchConfigIfMissing(appDir: string, appName: string, port: number): void {\n const launchPath = join(appDir, '.claude', 'launch.json')\n if (existsSync(launchPath)) return\n const config = {\n version: '0.0.1',\n configurations: [\n {\n name: appName,\n runtimeExecutable: 'npx',\n runtimeArgs: ['deepspace', 'dev', '--port', String(port)],\n port,\n },\n ],\n }\n try {\n mkdirSync(join(appDir, '.claude'), { recursive: true })\n writeFileSync(launchPath, JSON.stringify(config, null, 2) + '\\n')\n } catch {\n // best-effort only\n }\n}\n","/**\n * Verifies the app's dependencies are installed before running a command that\n * needs them (dev, test, deploy, add).\n *\n * `create-deepspace` runs `npm install` (and `deepspace skills add`) in a\n * detached background process so the user gets their prompt back immediately.\n * The background worker writes three sentinels under `<appDir>/.deepspace/`:\n *\n * install.started — created before the worker is spawned\n * install.done — written on successful completion\n * install.err — written on failure (contains the error message)\n * install.log — combined stdout/stderr of the install\n *\n * The presence of `node_modules/deepspace/package.json` is the ground truth\n * for \"ready\"; the sentinels only shape the error message.\n */\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport function ensureInstallReady(appDir: string): void {\n if (existsSync(join(appDir, 'node_modules', 'deepspace', 'package.json'))) return\n\n const sentinelDir = join(appDir, '.deepspace')\n const errPath = join(sentinelDir, 'install.err')\n const startedPath = join(sentinelDir, 'install.started')\n const donePath = join(sentinelDir, 'install.done')\n const logPath = join(sentinelDir, 'install.log')\n\n if (existsSync(errPath)) {\n console.error('Background install failed:')\n console.error(readFileSync(errPath, 'utf-8').trimEnd())\n if (existsSync(logPath)) console.error(`\\nFull log: ${logPath}`)\n console.error('\\nRun `npm install` (or `bun install`) manually, then retry.')\n process.exit(1)\n }\n\n if (existsSync(startedPath) && !existsSync(donePath)) {\n console.error('Dependencies are still installing in the background.')\n if (existsSync(logPath)) console.error(`Tail progress: tail -f ${logPath}`)\n console.error('Retry once it finishes.')\n process.exit(1)\n }\n\n console.error('Dependencies not installed. Run `npm install` (or `bun install`) first.')\n process.exit(1)\n}\n","import { execFileSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n// 0xC0000135 = STATUS_DLL_NOT_FOUND on Windows. Node reports it as a signed int.\nconst DLL_NOT_FOUND = -1073741515\n\n/**\n * On Windows, the Cloudflare Workers runtime (`workerd.exe`) is built with\n * MSVC and links against `vcruntime140.dll`. A bare Windows install (Server\n * 2022, Server Core, minimal Windows 11) does not ship those DLLs, so workerd\n * exits immediately with STATUS_DLL_NOT_FOUND. Miniflare then surfaces this as\n * \"Error: write EOF\" because workerd closed the stdin pipe before reading its\n * config — an error with no JS stack trace and no hint at the cause.\n *\n * This preflight catches the case and prints the actual fix (install VC++\n * Redistributable). Skip silently if workerd isn't installed yet or runs fine.\n */\nexport function preflightWindowsWorkerd(appDir: string): void {\n if (process.platform !== 'win32') return\n\n const workerdExe = resolve(\n appDir,\n 'node_modules',\n '@cloudflare',\n 'workerd-windows-64',\n 'bin',\n 'workerd.exe',\n )\n if (!existsSync(workerdExe)) return\n\n try {\n execFileSync(workerdExe, ['--help'], { stdio: 'pipe', timeout: 10_000 })\n return\n } catch (err: unknown) {\n const status = (err as { status?: number }).status\n if (status !== DLL_NOT_FOUND) return\n\n console.error('')\n console.error(' workerd (Cloudflare Workers runtime) cannot start on this system.')\n console.error(' It needs the Microsoft Visual C++ Redistributable, which is not installed.')\n console.error('')\n console.error(' Install it with any of:')\n console.error(' winget install Microsoft.VCRedist.2015+.x64')\n console.error(' choco install -y vcredist140')\n console.error(' https://aka.ms/vs/17/release/vc_redist.x64.exe')\n console.error('')\n console.error(' Then restart this terminal and re-run the command.')\n console.error('')\n process.exit(1)\n }\n}\n","/**\n * deepspace kill [--port N] [--all]\n *\n * Stops a local dev server bound to the given port, plus the workerd\n * child processes that wrangler/Vite would normally clean up but\n * sometimes leak when the parent dies ungracefully (Ctrl-C in a\n * detached terminal, IDE close, sandbox deny on signal, etc).\n *\n * deepspace kill # kill listener on 5173 + its workerd children\n * deepspace kill --port 5180 # kill listener on a different port\n * deepspace kill --all # also sweep ALL stray workerd/wrangler procs on the machine\n *\n * Cross-platform: uses lsof/pgrep on macOS and Linux, and PowerShell\n * (Get-NetTCPConnection / Get-CimInstance) on Windows. PowerShell ships\n * with every supported Windows version since 7; no extra install required.\n *\n * Always sends SIGTERM first, waits briefly, then SIGKILL anything\n * still alive — same shape as `vite`'s own shutdown handler so we\n * don't trample DO state mid-write. (On Windows, SIGTERM is best-effort:\n * Win32 has no real signals, so node maps both to TerminateProcess. We\n * still issue them in the same order for consistent log output.)\n */\n\nimport { defineCommand } from 'citty'\nimport { spawnSync } from 'node:child_process'\nimport { setTimeout as wait } from 'node:timers/promises'\n\nconst DEFAULT_PORT = 5173\nconst SIGTERM_GRACE_MS = 1500\nconst IS_WIN = process.platform === 'win32'\n\nexport default defineCommand({\n meta: {\n name: 'kill',\n description: 'Kill the local dev server and any orphaned workerd processes',\n },\n args: {\n port: {\n type: 'string',\n description: `Port the dev server is bound to (default ${DEFAULT_PORT}, or $DEEPSPACE_PORT)`,\n required: false,\n },\n all: {\n type: 'boolean',\n description: 'Also kill stray workerd/wrangler processes across all ports',\n default: false,\n },\n },\n async run({ args }) {\n const port = resolvePort(args.port)\n const targets = new Set<number>()\n\n // 1. Anything LISTENing on the dev port (vite + the workerd child it\n // publishes through, occasionally a stray inspector).\n for (const pid of listenerPids(port)) targets.add(pid)\n\n // 2. Children of those listeners — wrangler/vite tend to spawn workerd\n // as a sibling, but in some shells it ends up as a child instead.\n for (const pid of [...targets]) {\n for (const child of childPids(pid)) targets.add(child)\n }\n\n // 3. With --all, sweep workerd / wrangler / vite anywhere on the box.\n // Useful when port 5173 is \"free\" but a leftover workerd from a\n // previous run is still holding D1 / DO state in .wrangler/.\n if (args.all) {\n for (const pid of processPidsByName(['workerd', 'wrangler', 'vite'])) {\n targets.add(pid)\n }\n }\n\n if (targets.size === 0) {\n console.log(\n args.all\n ? `Nothing listening on :${port} and no stray workerd/wrangler/vite processes found.`\n : `Nothing listening on :${port}. (Pass --all to sweep stray workerd/wrangler.)`,\n )\n return\n }\n\n // SIGTERM pass.\n for (const pid of targets) {\n if (sendSignal(pid, 'SIGTERM')) {\n console.log(`SIGTERM → pid ${pid}`)\n }\n }\n await wait(SIGTERM_GRACE_MS)\n\n const stillAlive: number[] = []\n for (const pid of targets) {\n if (isAlive(pid)) stillAlive.push(pid)\n }\n\n // SIGKILL holdouts.\n for (const pid of stillAlive) {\n if (sendSignal(pid, 'SIGKILL')) {\n console.log(`SIGKILL → pid ${pid} (did not exit on SIGTERM)`)\n }\n }\n\n // Re-verify the port is free.\n await wait(200)\n const remaining = listenerPids(port)\n if (remaining.length > 0) {\n console.error(\n `Port ${port} is still held by pid(s) ${remaining.join(', ')} — try \\`deepspace kill --port ${port}\\` again, or kill manually.`,\n )\n process.exit(1)\n }\n\n console.log(`Port ${port} is free.`)\n },\n})\n\nfunction resolvePort(arg?: string): number {\n const raw = arg ?? process.env.DEEPSPACE_PORT\n if (!raw) return DEFAULT_PORT\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n console.error(`Invalid port: ${raw}. Must be an integer between 1 and 65535.`)\n process.exit(1)\n }\n return n\n}\n\n// ── Platform-specific helpers ─────────────────────────────────────────────\n\nfunction listenerPids(port: number): number[] {\n if (IS_WIN) {\n // Get-NetTCPConnection is the modern replacement for netstat -ano.\n // -ErrorAction SilentlyContinue swallows \"No matching connection\" so\n // the command exits 0 with empty stdout instead of a noisy red error.\n return runPowershell(\n `Get-NetTCPConnection -LocalPort ${port} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess`,\n )\n }\n // -t prints PIDs only, one per line; -nP avoids DNS / service lookups.\n return run(['lsof', '-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-t'])\n}\n\nfunction childPids(parentPid: number): number[] {\n if (IS_WIN) {\n return runPowershell(\n `Get-CimInstance Win32_Process -Filter \"ParentProcessId=${parentPid}\" | Select-Object -ExpandProperty ProcessId`,\n )\n }\n return run(['pgrep', '-P', String(parentPid)])\n}\n\nfunction processPidsByName(names: string[]): number[] {\n const all = new Set<number>()\n if (IS_WIN) {\n // Match against process Name (e.g. \"workerd\") AND CommandLine (catches\n // npx-launched scripts like \"vite\" that show up as node.exe with vite\n // in the args).\n const orClauses = names\n .map((n) => `($_.Name -like '*${n}*') -or ($_.CommandLine -like '*${n}*')`)\n .join(' -or ')\n const script = `Get-CimInstance Win32_Process | Where-Object { ${orClauses} } | Select-Object -ExpandProperty ProcessId`\n for (const pid of runPowershell(script)) {\n if (pid !== process.pid) all.add(pid)\n }\n return [...all]\n }\n for (const name of names) {\n for (const pid of run(['pgrep', '-f', name])) {\n if (pid !== process.pid) all.add(pid)\n }\n }\n return [...all]\n}\n\n// ── Process primitives ────────────────────────────────────────────────────\n\n/** Run a command and return whitespace-separated PIDs (empty array on failure). */\nfunction run(cmd: string[]): number[] {\n try {\n const r = spawnSync(cmd[0], cmd.slice(1), { encoding: 'utf-8' })\n if (r.status !== 0) return []\n return parsePidLines(r.stdout)\n } catch {\n return []\n }\n}\n\n/**\n * Run a PowerShell snippet. Prefers `pwsh` (PowerShell 7+) when available\n * and falls back to `powershell.exe` (Windows PowerShell 5.1, ships with\n * every Windows version we care about).\n */\nfunction runPowershell(script: string): number[] {\n const exe = pwshOrPowershell()\n try {\n const r = spawnSync(\n exe,\n ['-NoProfile', '-NonInteractive', '-Command', script],\n { encoding: 'utf-8' },\n )\n if (r.status !== 0) return []\n return parsePidLines(r.stdout)\n } catch {\n return []\n }\n}\n\nfunction pwshOrPowershell(): string {\n // `pwsh` is the modern cross-platform binary; `powershell.exe` is the\n // legacy Windows-only one. Try modern first, fall back if missing.\n const probe = spawnSync('pwsh', ['-NoProfile', '-Command', '$PSVersionTable.PSVersion.Major'], {\n encoding: 'utf-8',\n })\n if (probe.status === 0) return 'pwsh'\n return 'powershell.exe'\n}\n\nfunction parsePidLines(stdout: string): number[] {\n return stdout\n .split(/\\s+/)\n .map((s) => Number.parseInt(s, 10))\n .filter((n) => Number.isFinite(n) && n > 0)\n}\n\nfunction sendSignal(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(pid, signal)\n return true\n } catch {\n return false\n }\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n // signal 0 = \"do nothing, just check\"\n process.kill(pid, 0)\n return true\n } catch {\n return false\n }\n}\n","/**\n * deepspace test [suite] [--port N]\n *\n * Runs tests for a DeepSpace app. Always uses dev workers.\n *\n * deepspace test # smoke + api (quick check)\n * deepspace test smoke # smoke tests only\n * deepspace test api # API tests only\n * deepspace test e2e # all Playwright tests\n * deepspace test unit # vitest unit tests\n * deepspace test all # everything\n * deepspace test <file> # run specific test file\n *\n * Port is `--port` > $DEEPSPACE_PORT > 5173. The chosen port is exported as\n * DEEPSPACE_PORT to the Playwright child so the config + webServer both bind\n * to the same address. Pass a different port per app to run multiple apps\n * (and test suites) in parallel.\n */\n\nimport { defineCommand } from 'citty'\nimport { resolve } from 'node:path'\nimport { sync as spawnSync } from 'cross-spawn'\nimport { ensureToken } from '../auth'\nimport { findAppDir, findChildApps } from '../lib/app-context'\nimport { writeDevVars } from '../env'\nimport { decodeJwtPayload } from '../jwt'\nimport { ensureInstallReady } from '../lib/install-status'\nimport { ensurePlaywright } from '../lib/playwright'\nimport { preflightWindowsWorkerd } from '../lib/preflight'\n\nconst DEFAULT_PORT = 5173\n\nexport default defineCommand({\n meta: {\n name: 'test',\n description: 'Run tests for your DeepSpace app',\n },\n args: {\n suite: {\n type: 'positional',\n description: 'Test suite: smoke, api, e2e, unit, all (default: smoke+api)',\n required: false,\n },\n port: {\n type: 'string',\n description: `Port for vite/webServer (default ${DEFAULT_PORT}, or $DEEPSPACE_PORT)`,\n required: false,\n },\n },\n async run({ args }) {\n const suite = args.suite ?? 'default'\n const port = resolvePort(args.port)\n\n // Resolve the app root by walking up from cwd, matching `deepspace dev`.\n const start = resolve('.')\n const appDir = findAppDir(start)\n if (!appDir) {\n console.error(`No wrangler.toml found at or above ${start}.`)\n const children = findChildApps(start)\n if (children.length > 0) {\n console.error('Did you mean to run inside one of these app directories?')\n for (const c of children) console.error(` cd ${c}`)\n } else {\n console.error('Run from a DeepSpace app directory (one containing wrangler.toml).')\n }\n process.exit(1)\n }\n\n ensureInstallReady(appDir)\n\n // Always write .dev.vars pointing to dev workers. A logged-in user is\n // required so writeDevVars can mint APP_OWNER_JWT via the auth-worker.\n let token: string\n let ownerId: string\n try {\n token = await ensureToken()\n const payload = decodeJwtPayload<{ sub: string }>(token)\n ownerId = payload.sub\n } catch (err) {\n console.error('`deepspace test` requires you to be logged in. Run `deepspace login` first.')\n process.exit(1)\n }\n\n await writeDevVars(appDir, 'dev', ownerId, token)\n\n if (suite !== 'unit') {\n preflightWindowsWorkerd(appDir)\n ensurePlaywright(appDir)\n }\n\n let exitCode = 0\n\n switch (suite) {\n case 'smoke':\n exitCode = runPlaywright(appDir, ['tests/smoke.spec.ts'], port)\n break\n case 'api':\n exitCode = runPlaywright(appDir, ['tests/api.spec.ts'], port)\n break\n case 'e2e':\n exitCode = runPlaywright(appDir, [], port)\n break\n case 'unit':\n exitCode = runVitest(appDir)\n break\n case 'all':\n exitCode = runVitest(appDir)\n if (exitCode === 0) exitCode = runPlaywright(appDir, [], port)\n break\n case 'default':\n exitCode = runPlaywright(appDir, ['tests/smoke.spec.ts', 'tests/api.spec.ts'], port)\n break\n default:\n if (suite.endsWith('.spec.ts')) {\n exitCode = runPlaywright(appDir, [suite], port)\n } else {\n console.error(`Unknown test suite: ${suite}`)\n console.error('Available: smoke, api, e2e, unit, all')\n process.exit(1)\n }\n }\n\n process.exit(exitCode)\n },\n})\n\nfunction runPlaywright(appDir: string, testFiles: string[], port: number): number {\n const result = spawnSync('npx', [\n 'playwright', 'test',\n '--config', 'tests/playwright.config.ts',\n ...testFiles,\n ], {\n cwd: appDir,\n stdio: 'inherit',\n env: { ...process.env, DEEPSPACE_PORT: String(port) },\n })\n return result.status ?? 1\n}\n\nfunction runVitest(appDir: string): number {\n const result = spawnSync('npx', ['vitest', 'run', '--passWithNoTests'], {\n cwd: appDir, stdio: 'inherit',\n })\n return result.status ?? 1\n}\n\nfunction resolvePort(arg?: string): number {\n const raw = arg ?? process.env.DEEPSPACE_PORT\n if (!raw) return DEFAULT_PORT\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n console.error(`Invalid port: ${raw}. Must be an integer between 1 and 65535.`)\n process.exit(1)\n }\n return n\n}\n","import { execSync } from 'node:child_process'\nimport { sync as spawnSync } from 'cross-spawn'\n\nexport function ensurePlaywright(appDir: string) {\n try {\n // execSync interprets the command via shell, so it handles npx/npx.cmd\n // resolution on its own. Only spawn()/spawnSync() need cross-spawn.\n execSync('npx playwright --version', { cwd: appDir, stdio: 'pipe' })\n } catch {\n console.log('Installing Playwright...')\n execSync('npm install -D @playwright/test', { cwd: appDir, stdio: 'pipe' })\n }\n\n // `playwright install` is idempotent: a fast no-op when Chromium already\n // exists, and the first real browser download only when a browser command\n // actually needs it.\n const isLinux = process.platform === 'linux'\n const isRoot = isLinux && typeof process.getuid === 'function' && process.getuid() === 0\n const args = isRoot ? ['install', '--with-deps', 'chromium'] : ['install', 'chromium']\n const result = spawnSync('npx', ['playwright', ...args], {\n cwd: appDir,\n stdio: 'inherit',\n })\n\n if (result.status !== 0) {\n console.error('\\nPlaywright install failed. On Linux, system libs may be missing. Try:')\n console.error(' sudo npx playwright install --with-deps chromium')\n process.exit(1)\n }\n}\n","/**\n * deepspace screenshot <url> <output> [--full-page] [--wait-for-timeout ms]\n *\n * Takes a Playwright Chromium screenshot, installing the browser on demand.\n */\n\nimport { defineCommand } from 'citty'\nimport { sync as spawnSync } from 'cross-spawn'\nimport { resolve } from 'node:path'\nimport { ensurePlaywright } from '../lib/playwright'\n\nexport default defineCommand({\n meta: {\n name: 'screenshot',\n description: 'Take a Playwright screenshot, installing Chromium on demand',\n },\n args: {\n url: {\n type: 'positional',\n description: 'URL to capture, for example http://localhost:5173/',\n required: true,\n },\n output: {\n type: 'positional',\n description: 'Output image path, for example screenshot.png',\n required: true,\n },\n 'full-page': {\n type: 'boolean',\n description: 'Capture the full scrollable page',\n required: false,\n },\n 'wait-for-timeout': {\n type: 'string',\n description: 'Milliseconds to wait before capture',\n required: false,\n },\n },\n run({ args }) {\n const appDir = resolve('.')\n ensurePlaywright(appDir)\n\n const playwrightArgs = ['playwright', 'screenshot', args.url, args.output]\n if (args['full-page']) playwrightArgs.push('--full-page')\n if (args['wait-for-timeout']) {\n playwrightArgs.push('--wait-for-timeout', String(args['wait-for-timeout']))\n }\n\n const result = spawnSync('npx', playwrightArgs, {\n cwd: appDir,\n stdio: 'inherit',\n })\n\n process.exit(result.status ?? 1)\n },\n})\n","/**\n * deepspace test-accounts\n *\n * Manage test accounts for local development and CI.\n * Test accounts use @deepspace.test emails and are clearly\n * demarcated in the database. Max 10 per developer.\n *\n * Credentials are saved to ~/.deepspace/test-accounts.json (0600)\n * so they persist across projects and sessions.\n *\n * deepspace test-accounts create --email bot@deepspace.test --password Pass123!\n * deepspace test-accounts list\n * deepspace test-accounts delete --email bot@deepspace.test\n * deepspace test-accounts delete --id <id>\n * deepspace test-accounts clear # delete all (with confirm)\n * deepspace test-accounts clear --label e2e # delete only label=e2e\n * deepspace test-accounts clear --yes # skip confirm (CI)\n */\n\nimport { defineCommand } from 'citty'\nimport * as p from '@clack/prompts'\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { ensureToken, SESSION_PATH } from '../auth'\nimport { ENVS } from '../env'\n\nconst SESSION_COOKIE = '__Secure-better-auth.session_token'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\nconst DIR = join(homedir(), '.deepspace')\nconst ACCOUNTS_PATH = join(DIR, 'test-accounts.json')\n\n// ── Local credential store ─────────────────────────────────────────\n\ninterface StoredAccount {\n id: string\n email: string\n password: string\n userId: string\n name?: string\n label?: string | null\n createdAt: number\n}\n\nfunction loadAccounts(): StoredAccount[] {\n if (!existsSync(ACCOUNTS_PATH)) return []\n try {\n return JSON.parse(readFileSync(ACCOUNTS_PATH, 'utf-8'))\n } catch {\n return []\n }\n}\n\nfunction saveAccounts(accounts: StoredAccount[]) {\n mkdirSync(DIR, { recursive: true })\n writeFileSync(ACCOUNTS_PATH, JSON.stringify(accounts, null, 2), { mode: 0o600 })\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction sessionCookie(): string {\n const token = readFileSync(SESSION_PATH, 'utf-8').trim()\n return `${SESSION_COOKIE}=${encodeURIComponent(token)}`\n}\n\ninterface RemoteAccount {\n id: string\n email: string\n userId: string\n label: string | null\n createdAt: number\n}\n\nasync function fetchRemoteAccounts(): Promise<RemoteAccount[]> {\n const res = await fetch(`${AUTH_URL}/api/auth/test-accounts`, {\n headers: { Cookie: sessionCookie(), Origin: AUTH_URL },\n })\n const data = (await res.json().catch(() => ({}))) as {\n accounts?: RemoteAccount[]\n error?: string\n }\n if (!res.ok || !data.accounts) {\n throw new Error(data.error ?? 'Failed to list test accounts')\n }\n return data.accounts\n}\n\nasync function deleteRemote(id: string): Promise<void> {\n const res = await fetch(`${AUTH_URL}/api/auth/test-accounts/${id}`, {\n method: 'DELETE',\n headers: { Cookie: sessionCookie(), Origin: AUTH_URL },\n })\n if (!res.ok) {\n const data = (await res.json().catch(() => ({}))) as { error?: string }\n throw new Error(data.error ?? `DELETE returned ${res.status}`)\n }\n}\n\n// ── Subcommands ────────────────────────────────────────────────────\n\nconst create = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a test account',\n },\n args: {\n email: {\n type: 'string',\n description: 'Email (must end with @deepspace.test)',\n required: true,\n },\n password: {\n type: 'string',\n description: 'Password (min 8 characters)',\n required: true,\n },\n name: {\n type: 'string',\n description: 'Display name',\n required: false,\n },\n label: {\n type: 'string',\n description: 'Label for this test account',\n required: false,\n },\n },\n async run({ args }) {\n await ensureToken()\n\n const res = await fetch(`${AUTH_URL}/api/auth/test-accounts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Cookie: sessionCookie(),\n Origin: AUTH_URL,\n },\n body: JSON.stringify({\n email: args.email,\n password: args.password,\n name: args.name,\n label: args.label,\n }),\n })\n\n const data = (await res.json().catch(() => ({}))) as {\n id?: string\n email?: string\n userId?: string\n label?: string | null\n createdAt?: number\n error?: string\n }\n\n if (!res.ok || !data.id) {\n console.error(`Failed: ${data.error ?? 'Unknown error'}`)\n process.exit(1)\n }\n\n const account = data as { id: string; email: string; userId: string; label: string | null; createdAt: number }\n\n // Save credentials locally\n const accounts = loadAccounts()\n accounts.push({\n id: account.id,\n email: args.email,\n password: args.password,\n userId: account.userId,\n name: args.name,\n label: account.label,\n createdAt: account.createdAt,\n })\n saveAccounts(accounts)\n\n console.log(`Created test account:`)\n console.log(` ID: ${account.id}`)\n console.log(` Email: ${account.email}`)\n console.log(` Password: ${args.password}`)\n console.log(` UserID: ${account.userId}`)\n if (account.label) console.log(` Label: ${account.label}`)\n console.log(`\\nSaved to ${ACCOUNTS_PATH}`)\n },\n})\n\nconst list = defineCommand({\n meta: {\n name: 'list',\n description: 'List your test accounts',\n },\n async run() {\n await ensureToken()\n\n let remote: RemoteAccount[]\n try {\n remote = await fetchRemoteAccounts()\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n\n if (remote.length === 0) {\n console.log('No test accounts. Create one with: deepspace test-accounts create --email <email> --password <password>')\n return\n }\n\n // Merge with local credentials (passwords are only stored locally)\n const local = loadAccounts()\n const localByEmail = new Map(local.map((a) => [a.email, a]))\n\n console.log(`Test accounts (${remote.length}/10):\\n`)\n for (const a of remote) {\n const stored = localByEmail.get(a.email)\n const date = new Date(a.createdAt).toLocaleDateString()\n console.log(` ${a.email}${a.label ? ` (${a.label})` : ''}`)\n console.log(` ID: ${a.id} UserID: ${a.userId} Created: ${date}`)\n if (stored?.password) {\n console.log(` Password: ${stored.password}`)\n } else {\n console.log(` Password: (not saved locally)`)\n }\n }\n },\n})\n\nconst del = defineCommand({\n meta: {\n name: 'delete',\n description: 'Delete a test account by --email or --id',\n },\n args: {\n email: {\n type: 'string',\n description: 'Email of the test account to delete',\n required: false,\n },\n id: {\n type: 'string',\n description: 'ID of the test account to delete',\n required: false,\n },\n },\n async run({ args }) {\n if (!args.email && !args.id) {\n console.error('Provide --email <email> or --id <id>.')\n process.exit(1)\n }\n if (args.email && args.id) {\n console.error('Provide either --email or --id, not both.')\n process.exit(1)\n }\n\n await ensureToken()\n\n let targetId = args.id as string | undefined\n let targetEmail = args.email as string | undefined\n\n if (targetEmail && !targetId) {\n let remote: RemoteAccount[]\n try {\n remote = await fetchRemoteAccounts()\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n const match = remote.find((a) => a.email === targetEmail)\n if (!match) {\n console.error(`No test account with email ${targetEmail}.`)\n process.exit(1)\n }\n targetId = match.id\n }\n\n try {\n await deleteRemote(targetId!)\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n\n // Remove from local store\n const accounts = loadAccounts().filter(\n (a) => a.id !== targetId && (!targetEmail || a.email !== targetEmail),\n )\n saveAccounts(accounts)\n\n console.log(`Test account deleted${targetEmail ? `: ${targetEmail}` : `: ${targetId}`}`)\n },\n})\n\nconst clear = defineCommand({\n meta: {\n name: 'clear',\n description: 'Delete all your test accounts (or those matching --label)',\n },\n args: {\n label: {\n type: 'string',\n description: 'Only delete accounts with this label (e.g. e2e, slack-clone)',\n required: false,\n },\n yes: {\n type: 'boolean',\n description: 'Skip confirmation prompt (for CI scripts)',\n default: false,\n },\n },\n async run({ args }) {\n await ensureToken()\n\n let remote: RemoteAccount[]\n try {\n remote = await fetchRemoteAccounts()\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n\n const targets = args.label\n ? remote.filter((a) => a.label === args.label)\n : remote\n\n if (targets.length === 0) {\n const suffix = args.label ? ` with label '${args.label}'` : ''\n console.log(`No test accounts${suffix} to delete.`)\n return\n }\n\n if (!args.yes) {\n const subject = args.label\n ? `${targets.length} test account(s) labeled '${args.label}'`\n : `all ${targets.length} test account(s)`\n const confirmed = await p.confirm({\n message: `Delete ${subject}? This is not reversible.`,\n initialValue: false,\n })\n if (p.isCancel(confirmed) || !confirmed) {\n console.log('Cancelled.')\n return\n }\n }\n\n let ok = 0\n const failures: Array<{ email: string; error: string }> = []\n for (const a of targets) {\n try {\n await deleteRemote(a.id)\n ok++\n } catch (err) {\n failures.push({ email: a.email, error: (err as Error).message })\n }\n }\n\n // Sync local store with what's actually deleted.\n const deletedIds = new Set(\n targets.filter((t) => !failures.find((f) => f.email === t.email)).map((t) => t.id),\n )\n saveAccounts(loadAccounts().filter((a) => !deletedIds.has(a.id)))\n\n console.log(`Deleted ${ok}/${targets.length} test account(s).`)\n if (failures.length > 0) {\n console.error(`\\nFailed:`)\n for (const f of failures) console.error(` ${f.email}: ${f.error}`)\n process.exit(1)\n }\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'test-accounts',\n description: 'Manage test accounts for development',\n },\n subCommands: {\n create,\n list,\n delete: del,\n clear,\n },\n})\n","/**\n * deepspace deploy\n *\n * Builds the app with Vite (Cloudflare plugin bundles both client + worker),\n * then uploads to the deploy worker which handles Cloudflare WfP deployment.\n *\n * Uses the same build pipeline as dev for full fidelity. Reads the output\n * wrangler.json (via .wrangler/deploy/config.json) to find the built assets\n * and worker bundle — the same contract that `wrangler deploy` uses.\n */\n\nimport { defineCommand } from 'citty'\nimport { execSync } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join, resolve, dirname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport * as p from '@clack/prompts'\nimport { createSpinner } from '../lib/spinner'\nimport { ensureInstallReady } from '../lib/install-status'\nimport { ensureToken } from '../auth'\nimport { ENVS, extractCustomDevVars, parseDevVars } from '../env'\nimport {\n bindingManifestFromOutputConfig,\n validateBindingManifest,\n RESERVED_BINDING_NAMES,\n} from '../../server/rooms/binding-manifest'\nimport { resolveAppName } from '../../server/rooms/app-name'\nimport {\n resolveAppNameForEnv, devVarsPathFor, readWranglerConfig, hasWranglerConfig,\n type WranglerConfig,\n} from '../lib/wrangler-env'\n\nconst DEPLOY_URL = process.env.DEEPSPACE_DEPLOY_URL ?? ENVS.prod.deploy\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\n\nconst CLOUDFLARE_DEPLOY_ERROR_HINT =\n 'Deployment reached the DeepSpace deploy worker, but Cloudflare\\'s deployment ' +\n 'control-plane API failed. This is often caused by a Cloudflare Dashboard/API ' +\n 'incident or Workers for Platforms entitlement outage. Already deployed apps ' +\n 'should keep serving; wait for Cloudflare to recover and retry.'\n\n/**\n * SDK-reserved `run_worker_first` prefixes. Apps can't override or\n * shadow these; only declare additional patterns. The CLI strips the\n * reserved ones before forwarding so the platform never sees them\n * twice — keeps the deploy-side merge a clean set-union.\n */\nconst RESERVED_RUN_WORKER_FIRST = new Set([\n '/api/*',\n '/ws/*',\n '/internal/*',\n '/v1/*',\n '/_deepspace/*',\n])\n\nfunction extractRunWorkerFirst(cfg: { assets?: { run_worker_first?: unknown } }): string[] {\n const raw = cfg.assets?.run_worker_first\n if (!Array.isArray(raw)) return []\n const out: string[] = []\n const seen = new Set<string>()\n for (const entry of raw) {\n if (typeof entry !== 'string') continue\n const trimmed = entry.trim()\n if (!trimmed.startsWith('/')) continue\n if (RESERVED_RUN_WORKER_FIRST.has(trimmed)) continue\n if (seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction isLikelyCloudflareDeployFailure(status: number, error: string | undefined): boolean {\n if (status >= 500) return true\n if (!error) return false\n return [\n 'Upload session failed',\n 'Asset upload failed',\n 'Worker deploy failed',\n 'entitlements.not_available',\n 'Internal Server Error',\n ].some((needle) => error.includes(needle))\n}\n\nfunction formatDeployWorkerError(status: number, error: string | undefined): string {\n const detail = error ?? `Deployment error (${status})`\n if (!isLikelyCloudflareDeployFailure(status, error)) return detail\n return `${CLOUDFLARE_DEPLOY_ERROR_HINT}\\n\\nUnderlying error: ${detail}`\n}\n\n/**\n * Must stay <= the deploy worker's MAX_UPLOAD_GROUP_BYTES, otherwise the worker\n * rejects a group with a 413 that postWithRetry won't retry (it's a 4xx),\n * dead-ending the deploy. The DEEPSPACE_DEPLOY_GROUP_BYTES override is clamped\n * to this.\n */\nconst MAX_GROUP_BYTES = 40 * 1024 * 1024\n\n/**\n * Soft cap on the serialized size of one asset *group*. We pack whole asset\n * entries into groups under this size and POST each group on its own, so no\n * single request carries the entire payload (a ~40MB+ body stalls and gets\n * reset mid-upload on a marginal uplink: `write EPIPE`). A single asset larger\n * than this is sent alone in its own group — we never split an individual\n * asset. Overridable via DEEPSPACE_DEPLOY_GROUP_BYTES, clamped to MAX_GROUP_BYTES.\n */\nconst GROUP_BYTES = (() => {\n const raw = Number(process.env.DEEPSPACE_DEPLOY_GROUP_BYTES)\n const v = Number.isInteger(raw) && raw > 0 ? raw : 3 * 1024 * 1024\n return Math.min(v, MAX_GROUP_BYTES)\n})()\n\n/**\n * Pack whole asset entries into groups whose serialized JSON stays under\n * `maxBytes`. We never split an individual asset across groups, so a single\n * asset larger than `maxBytes` becomes its own (oversized) group.\n */\nexport function packAssetGroups<T>(assets: T[], maxBytes: number): T[][] {\n const groups: T[][] = []\n let current: T[] = []\n let currentBytes = 2 // \"[]\"\n for (const a of assets) {\n const entryBytes = Buffer.byteLength(JSON.stringify(a), 'utf-8') + 1 // +1 ≈ comma\n if (current.length > 0 && currentBytes + entryBytes > maxBytes) {\n groups.push(current)\n current = []\n currentBytes = 2\n }\n current.push(a)\n currentBytes += entryBytes\n }\n if (current.length > 0) groups.push(current)\n return groups\n}\n\n/**\n * POST with retry + backoff. Chunked upload exists to survive a flaky uplink,\n * so we always retry on network errors (fetch throws — e.g. `write EPIPE` when\n * the edge resets a stalled upload). Transient server statuses (408/429/5xx)\n * are only retried when `retryServerErrors` is set; client 4xx are always\n * returned as-is (caller surfaces the message). `makeInit` is called per\n * attempt so the request body is rebuilt fresh each time.\n *\n * The group-staging endpoint is an idempotent PUT, so retrying its 5xx is safe.\n * The commit endpoint runs a real (non-idempotent) deploy, so it passes\n * `retryServerErrors: false` — a 5xx means the server already received and\n * possibly acted on the request, and re-sending could double-deploy. Only a\n * thrown fetch (connection reset before/without a response) is retried there.\n */\nexport async function postWithRetry(\n url: string,\n makeInit: () => RequestInit,\n { attempts = 4, retryServerErrors = true }: { attempts?: number; retryServerErrors?: boolean } = {},\n): Promise<Response> {\n let lastRes: Response | undefined\n let lastErr: unknown\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n const res = await fetch(url, makeInit())\n const isTransient =\n retryServerErrors && (res.status >= 500 || res.status === 408 || res.status === 429)\n if (!isTransient) {\n return res\n }\n lastRes = res\n } catch (err) {\n lastErr = err\n }\n if (attempt < attempts) {\n await new Promise((r) => setTimeout(r, Math.min(8_000, 500 * 2 ** (attempt - 1))))\n }\n }\n if (lastRes) return lastRes\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr))\n}\n\n/**\n * Best-effort cleanup of an upload's staged groups after a deploy gives up.\n * Fire-and-forget: a failed deploy must surface its real error, not a cleanup\n * error, so this never throws. It's not the only safety net either — the\n * deploy worker's R2 staging prefix carries a lifecycle rule that reaps\n * anything this misses (e.g. the CLI process is killed before it can abort).\n */\nasync function abortStagedUpload(\n appName: string,\n uploadId: string,\n totalGroups: number,\n token: string,\n): Promise<void> {\n try {\n await fetch(\n `${DEPLOY_URL}/api/deploy/${appName}/assets` +\n `?uploadId=${uploadId}&totalGroups=${totalGroups}`,\n { method: 'DELETE', headers: { Authorization: `Bearer ${token}` } },\n )\n } catch {\n // best-effort — orphaned groups are reaped by the staging lifecycle rule\n }\n}\n\nexport default defineCommand({\n meta: {\n name: 'deploy',\n description: 'Build and deploy your DeepSpace app',\n },\n args: {\n dir: {\n type: 'positional',\n description: 'App directory (default: current directory)',\n required: false,\n },\n env: {\n type: 'string',\n description:\n 'wrangler.toml [env.<name>] block to deploy (e.g. --env staging). ' +\n 'Omit to deploy the top-level config.',\n required: false,\n },\n },\n async run({ args }) {\n const appDir = resolve(args.dir ?? '.')\n const envName = typeof args.env === 'string' && args.env.trim() ? args.env.trim() : undefined\n\n // ── Read app name from wrangler.toml ──────────────────────\n if (!hasWranglerConfig(appDir)) {\n console.error('No wrangler.toml found. Are you in a DeepSpace app directory?')\n process.exit(1)\n }\n\n ensureInstallReady(appDir)\n\n p.intro('Deploying DeepSpace app')\n\n const wranglerConfig: WranglerConfig = readWranglerConfig(appDir)\n const nameRes = resolveAppNameForEnv(wranglerConfig, envName)\n if (!nameRes.ok) {\n p.cancel(nameRes.reason)\n process.exit(1)\n }\n // Refuse noncanonical names the same way `deepspace dev` does. Without\n // this, deploy would canonicalize server bindings while client constants\n // (`SCOPE_ID = app:${APP_NAME}`) and `[vars].APP_NAME` continued to use\n // the raw name — splitting identity across surfaces. Fail-fast so the\n // dev fixes wrangler.toml once and every surface reads from the same\n // source of truth.\n const declaredName = envName\n ? wranglerConfig.env?.[envName]?.name\n : wranglerConfig.name\n if (declaredName !== nameRes.name) {\n const where = envName ? `[env.${envName}].name` : '`name`'\n p.cancel(\n `wrangler.toml: ${where} \"${declaredName}\" is not in canonical form. ` +\n `Update it to \"${nameRes.name}\" and re-run.`,\n )\n process.exit(1)\n }\n const appName = nameRes.name\n p.log.info(envName ? `App: ${appName} (env: ${envName})` : `App: ${appName}`)\n\n // ── Ensure valid JWT ───────────────────────────────────────\n let token: string\n try {\n token = await ensureToken()\n } catch (err: any) {\n p.cancel(err.message)\n process.exit(1)\n }\n\n // ── Build with Vite (Cloudflare plugin bundles client + worker) ──\n // The Cloudflare Vite plugin reads `CLOUDFLARE_ENV` and applies the\n // matching `[env.<name>]` overrides from wrangler.toml when emitting\n // the built `dist/<app>/wrangler.json` and worker bundle. Set the env\n // var on the child process only — we don't want it leaking into other\n // shells the user might fan out from this one.\n const s = createSpinner()\n s.start('Building...')\n try {\n execSync('npx vite build', {\n cwd: appDir,\n stdio: 'pipe',\n env: envName\n ? { ...process.env, CLOUDFLARE_ENV: envName }\n : process.env,\n })\n } catch (err: any) {\n s.stop('Build failed')\n // Show both streams. Vite writes build errors to stderr, but the Rules of\n // Hooks checker (vite-plugin-checker) prints its diagnostics to stdout —\n // showing only stderr would collapse a hooks violation into a bare\n // \"Command failed\" and hide the exact fix the developer needs.\n const detail = [err.stdout?.toString(), err.stderr?.toString()]\n .filter(Boolean)\n .join('\\n')\n .trim()\n console.error(detail || err.message)\n process.exit(1)\n }\n s.stop('Built')\n\n // ── Locate build output via .wrangler/deploy/config.json ──\n // This is the same contract that `wrangler deploy` uses after `vite build`.\n const deployConfigPath = join(appDir, '.wrangler', 'deploy', 'config.json')\n if (!existsSync(deployConfigPath)) {\n p.cancel('Build output config not found at .wrangler/deploy/config.json')\n process.exit(1)\n }\n\n const deployConfig = JSON.parse(readFileSync(deployConfigPath, 'utf-8')) as { configPath: string }\n const outputWranglerPath = resolve(dirname(deployConfigPath), deployConfig.configPath)\n\n if (!existsSync(outputWranglerPath)) {\n p.cancel(`Output wrangler.json not found at ${outputWranglerPath}`)\n process.exit(1)\n }\n\n const outputConfig = JSON.parse(readFileSync(outputWranglerPath, 'utf-8')) as {\n name?: string\n main: string\n assets?: { directory: string }\n durable_objects?: { bindings: Array<{ name: string; class_name: string }> }\n migrations?: Array<{ new_sqlite_classes?: string[] }>\n }\n\n // Defense in depth: the deploy CLI sends `appName` as the registry\n // slot and Cloudflare Vite plugin bakes a `name` field into the\n // built wrangler.json. They MUST agree — if the plugin ever regresses\n // on `CLOUDFLARE_ENV` application, we'd otherwise ship one\n // configuration's worker bundle under another configuration's name.\n // Fail loudly before the upload starts.\n if (outputConfig.name && outputConfig.name !== appName) {\n const envHint = envName ? ` (--env ${envName})` : ''\n p.cancel(\n `Build output mismatch: expected name \"${appName}\"${envHint}, ` +\n `but the built wrangler.json declares \"${outputConfig.name}\". ` +\n `This usually means the Cloudflare Vite plugin didn't apply ` +\n `the requested env block. Check the plugin version and re-run.`,\n )\n process.exit(1)\n }\n\n const workerDir = dirname(outputWranglerPath)\n const workerBundlePath = join(workerDir, outputConfig.main)\n const clientDir = outputConfig.assets?.directory\n ? resolve(workerDir, outputConfig.assets.directory)\n : null\n\n if (!existsSync(workerBundlePath)) {\n p.cancel(`Worker bundle not found at ${workerBundlePath}`)\n process.exit(1)\n }\n if (!clientDir || !existsSync(clientDir)) {\n p.cancel(`Client assets not found at ${clientDir}`)\n process.exit(1)\n }\n\n // ── Collect assets ────────────────────────────────────────\n s.start('Collecting assets...')\n const assets = collectAssets(clientDir)\n s.stop(`Collected ${assets.length} assets`)\n\n const workerJs = readFileSync(workerBundlePath, 'utf-8')\n\n // ── Extract DO manifest from build output config ───────────\n const doBindings = outputConfig.durable_objects?.bindings as Array<{ name: string; class_name: string }> | undefined\n const sqliteClasses = new Set(\n (outputConfig.migrations as Array<{ new_sqlite_classes?: string[] }> | undefined)\n ?.flatMap(m => m.new_sqlite_classes ?? []) ?? []\n )\n const doManifest = doBindings?.map(b => ({\n binding: b.name,\n className: b.class_name,\n sqlite: sqliteClasses.has(b.class_name),\n }))\n if (doManifest?.length) {\n p.log.info(`DO manifest: ${doManifest.length} binding(s)`)\n }\n\n // ── Extract custom (non-DO) bindings: Vectorize, AI, R2, KV, D1, etc.\n const customBindings = bindingManifestFromOutputConfig(outputConfig)\n const validation = validateBindingManifest(customBindings)\n if (!validation.valid) {\n p.cancel(\n `Invalid binding(s) in wrangler.toml:\\n` +\n validation.errors.map((e) => ` • ${e.reason}`).join('\\n'),\n )\n process.exit(1)\n }\n if (customBindings.length) {\n p.log.info(\n `Custom bindings: ${customBindings.map((b) => `${b.name} (${b.type})`).join(', ')}`,\n )\n }\n\n // ── Extract user-managed secrets from .dev.vars ───────────\n // The user-managed section of .dev.vars (everything below the SDK divider)\n // is the same set of values the dev server uses. Shipping them to prod as\n // secret_text bindings means a route that works against `deepspace dev`\n // also works after deploy without a separate `wrangler secret put` step.\n // Per-env: `.dev.vars.staging` for `--env staging`, plain `.dev.vars`\n // otherwise. Matches the Cloudflare Vite plugin's own resolution so\n // the file the SDK ships to prod is the same one the local preview\n // reads — no drift surface between dev and deploy for the same env.\n const devVarsPath = devVarsPathFor(appDir, envName)\n let userSecrets: Record<string, string> = {}\n if (existsSync(devVarsPath)) {\n const customSection = extractCustomDevVars(readFileSync(devVarsPath, 'utf-8'))\n if (customSection) {\n try {\n userSecrets = parseDevVars(customSection)\n } catch (err: any) {\n p.cancel(`.dev.vars: ${err.message}`)\n process.exit(1)\n }\n }\n }\n const userSecretNames = Object.keys(userSecrets)\n\n // Pre-flight: fail with a clear, file-pointing error rather than letting\n // the deploy-worker reject mid-deploy. Reserved names are platform-owned\n // (ASSETS, USAGE_EVENTS, …) and clashes with declared bindings would\n // otherwise produce duplicate-name metadata that CF rejects opaquely.\n const declaredBindingNames = new Set([\n ...customBindings.map((b) => b.name),\n ...(doManifest ?? []).map((d) => d.binding),\n ])\n for (const name of userSecretNames) {\n if (RESERVED_BINDING_NAMES.has(name)) {\n p.cancel(\n `.dev.vars: \"${name}\" is a reserved binding name and cannot be used as an app secret.`,\n )\n process.exit(1)\n }\n if (declaredBindingNames.has(name)) {\n p.cancel(\n `.dev.vars: \"${name}\" collides with a binding declared in wrangler.toml — rename one or the other.`,\n )\n process.exit(1)\n }\n }\n if (userSecretNames.length) {\n p.log.info(`App secrets (from .dev.vars): ${userSecretNames.join(', ')}`)\n }\n\n // ── Upload to deploy worker ───────────────────────────────\n s.start(`Deploying to ${appName}.app.space...`)\n\n // ── Forward custom worker-first asset routes ───────────────\n // CF Workers `[assets]` config supports a `run_worker_first` array\n // that wins over the SPA 404 fallback for matching paths. We always\n // reserve the SDK baseline (/api/*, /ws/*, /internal/*, /v1/*,\n // /_deepspace/*) on the platform side, but apps can declare extra\n // dynamic routes (e.g. /preview/*, /oauth/*, /.well-known/*) in\n // their wrangler.toml under `[assets] run_worker_first`. Pass those\n // through so the platform merges them into the deployed metadata.\n const extraRoutes = extractRunWorkerFirst(wranglerConfig)\n if (extraRoutes.length) {\n p.log.info(`Custom worker-first routes: ${extraRoutes.join(', ')}`)\n }\n\n // ── Choose transport: inline vs grouped ────────────────────\n // The assets array (base64-inlined file bytes) is the bulk of the upload.\n // Sending it all in one request stalls and gets reset mid-body on a\n // marginal uplink (`write EPIPE`). When it doesn't fit in a single group we\n // pack whole asset entries into groups under GROUP_BYTES, POST each group\n // on its own (retry-able) into the deploy worker's R2 staging, and\n // reference them by `uploadId` in the small commit request below. Small\n // deploys keep the original single-request inline transport.\n const assetGroups = packAssetGroups(assets, GROUP_BYTES)\n let inlineAssets: string | null = null\n let uploadId: string | null = null\n let totalGroups = 0\n if (assetGroups.length <= 1) {\n inlineAssets = JSON.stringify(assets)\n } else {\n uploadId = randomUUID()\n totalGroups = assetGroups.length\n try {\n for (let i = 0; i < totalGroups; i++) {\n const groupJson = JSON.stringify(assetGroups[i])\n s.message(`Uploading assets — group ${i + 1}/${totalGroups}...`)\n const groupRes = await postWithRetry(\n `${DEPLOY_URL}/api/deploy/${appName}/assets` +\n `?uploadId=${uploadId}&groupIndex=${i}&totalGroups=${totalGroups}`,\n () => ({\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: groupJson,\n }),\n )\n if (!groupRes.ok) {\n const errBody = (await groupRes.json().catch(() => ({}))) as { error?: string }\n // Reap the groups already staged for this upload before bailing —\n // a fresh deploy mints a new uploadId, so these would otherwise\n // never be reused.\n await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(\n `Asset upload failed on group ${i + 1}/${totalGroups}: ` +\n `${errBody.error ?? `HTTP ${groupRes.status}`}`,\n )\n process.exit(1)\n }\n }\n } catch (err: any) {\n // postWithRetry exhausted its network-error retries and threw.\n await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(`Asset upload failed (network): ${err?.message ?? err}`)\n process.exit(1)\n }\n s.message(`Deploying to ${appName}.app.space...`)\n }\n\n // Rebuilt per attempt so retried requests get a fresh body.\n const makeForm = (): FormData => {\n const form = new FormData()\n form.append('worker', new Blob([workerJs], { type: 'application/javascript' }), 'worker.js')\n if (inlineAssets !== null) {\n form.append('assets', inlineAssets)\n } else {\n form.append('uploadId', uploadId as string)\n form.append('totalGroups', String(totalGroups))\n }\n if (doManifest) {\n form.append('doManifest', JSON.stringify(doManifest))\n }\n if (customBindings.length) {\n form.append('bindingManifest', JSON.stringify(customBindings))\n }\n if (userSecretNames.length) {\n form.append('userSecrets', JSON.stringify(userSecrets))\n }\n if (extraRoutes.length) {\n form.append('extraRunWorkerFirst', JSON.stringify(extraRoutes))\n }\n return form\n }\n\n let res: Response\n try {\n res = await postWithRetry(\n `${DEPLOY_URL}/api/deploy/${appName}`,\n () => ({\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n body: makeForm(),\n }),\n // Commit runs a real deploy — don't retry its 5xx (could double-deploy);\n // only a thrown fetch (dropped connection) is retried, and the staged\n // groups survive on the worker until this request succeeds.\n { retryServerErrors: false },\n )\n } catch (err: any) {\n // The commit never got a response after its retries (dropped connection).\n // Reap the staged groups — a fresh deploy mints a new uploadId.\n if (uploadId) await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(`Deploy request failed: ${err?.message ?? err}`)\n process.exit(1)\n }\n\n const body = (await res.json().catch(() => ({}))) as {\n success?: boolean\n url?: string\n error?: string\n }\n\n if (!res.ok || !body.success) {\n // Definitive failure — the worker won't reuse these groups (a re-run mints\n // a new uploadId), so reap them now rather than leaving them for the\n // lifecycle rule.\n if (uploadId) await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(formatDeployWorkerError(res.status, body.error))\n process.exit(1)\n }\n\n // ── Wait for assets propagation ───────────────────────────\n // Cloudflare's deploy API returns \"success\" once the script + bindings are\n // accepted, but the assets binding can still be indexing for ~10–60s.\n // During that window any request hits CF's transitional \"Assets have not\n // yet deployed\" page (HTML), even on `/api/*` routes that should run the\n // worker first. Block here until we see the worker actually serving so\n // CI / smoke checks that fire immediately don't hit the flake.\n if (body.url) {\n s.message('Waiting for edge propagation...')\n const ok = await waitForAssetsReady(body.url, 90_000)\n if (!ok) {\n s.stop('Deployed (edge propagation still in progress after 90s)')\n p.log.warn('First requests may briefly hit the assets transitional page; retry in a minute.')\n p.log.success(`Live at: ${body.url}`)\n await syncSubscriptionPlans(appDir, appName, token)\n await syncOneTimeProducts(appDir, appName, token)\n p.outro('Done')\n return\n }\n }\n\n s.stop('Deployed!')\n p.log.success(`Live at: ${body.url}`)\n\n // ── Reconcile subscription plans + one-time products (optional files) ──\n // Each surfaces its own result inline but never fails the deploy — a\n // developer who hasn't finished Stripe Connect onboarding still gets a\n // working deploy; they just see a warning telling them to connect first.\n await syncSubscriptionPlans(appDir, appName, token)\n await syncOneTimeProducts(appDir, appName, token)\n\n p.outro('Done')\n },\n})\n\n/**\n * Bundle the app's `src/subscriptions.ts` with esbuild, dynamic-import the\n * resulting ESM, and POST the declarations to /api/subscriptions/sync.\n * No-op when the file is absent.\n */\nasync function syncSubscriptionPlans(appDir: string, appName: string, token: string): Promise<void> {\n const subsPath = join(appDir, 'src', 'subscriptions.ts')\n if (!existsSync(subsPath)) return\n\n const s = createSpinner()\n s.start('Syncing subscription plans...')\n\n let plans: unknown\n try {\n const esbuild = await import('esbuild')\n const outDir = join(appDir, '.wrangler', 'deploy')\n const outFile = join(outDir, 'subscriptions.bundle.mjs')\n await esbuild.build({\n entryPoints: [subsPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'node18',\n outfile: outFile,\n logLevel: 'silent',\n write: true,\n })\n // Cache-bust the import — repeat deploys in the same Node process would\n // otherwise reuse a stale module from the loader cache.\n const mod = (await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`)) as {\n subscriptionPlans?: unknown\n }\n plans = mod.subscriptionPlans\n } catch (err: any) {\n s.stop('Plan sync skipped')\n p.log.warn(`Could not load src/subscriptions.ts: ${err.message}`)\n return\n }\n\n if (!Array.isArray(plans)) {\n s.stop('Plan sync skipped')\n p.log.warn(\n 'src/subscriptions.ts must `export const subscriptionPlans = [...] as const`',\n )\n return\n }\n\n // The deploy has already succeeded by the time we get here — a network blip\n // or malformed response on /sync must NOT throw, or the user sees a stack\n // trace after their app is live. Anything unexpected becomes a warning.\n let res: Response\n try {\n res = await fetch(`${API_URL}/api/subscriptions/sync`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ appName, plans }),\n })\n } catch (err: any) {\n s.stop('Plan sync skipped')\n p.log.warn(`Plan sync request failed (network): ${err.message ?? err}`)\n return\n }\n const body = (await res.json().catch(() => ({}))) as {\n ok?: boolean\n error?: string\n hint?: string\n onboardingUrl?: string\n planChanges?: PlanChange[]\n connectMissing?: boolean\n }\n\n if (res.ok && body.ok) {\n s.stop(`Synced ${plans.length} plan${plans.length === 1 ? '' : 's'} to Stripe`)\n // Connect-not-yet-set-up is no longer a sync-blocking error. Plans land\n // in Stripe normally; the warning tells the developer their earnings\n // will queue in the platform balance until they finish Stripe Connect\n // onboarding. Once they connect, the first payout sweeps everything.\n if (body.connectMissing) {\n p.log.warn(\n 'Stripe Connect not yet set up. Customers can subscribe and earnings ' +\n 'will queue in your platform balance until you finish onboarding at ' +\n '/earnings on the dashboard. The first payout after you connect ' +\n 'will sweep everything that accumulated in the meantime.',\n )\n }\n // Any plan change that stranded existing subscribers — whether the plan\n // was removed entirely or just had its price swapped — flows through one\n // prompt. The platform has no way to know whether the developer wants\n // those subscribers cancelled or grandfathered; this is the moment they\n // get to decide. Skipping is fine (silent grandfathering is the safe\n // default); they can always cancel later via the SDK helper.\n const changes = (body.planChanges ?? []).filter((c) => c.affectedSubscribers > 0)\n if (changes.length > 0) {\n await promptAndCancelChangedPlans(appName, token, changes)\n }\n return\n }\n\n s.stop('Plan sync skipped')\n p.log.warn(\n `Plan sync failed: ${body.error ?? `HTTP ${res.status}`}${\n body.hint ? ` — ${body.hint}` : ''\n }`,\n )\n}\n\n// Plan-change events the deploy CLI surfaces to the developer. Mirrors the\n// /sync response shape on the platform side; kept inline here so the helper\n// is self-contained.\ninterface PlanChange {\n slug: string\n reason: 'removed' | 'repriced'\n affectedSubscribers: number\n intervals?: Array<{ interval: 'month' | 'year'; oldCents: number; newCents: number }>\n}\n\nfunction formatCents(c: number): string {\n return c === 0 ? 'free' : `$${(c / 100).toFixed(2)}`\n}\n\nfunction summaryLine(c: PlanChange): string {\n const n = c.affectedSubscribers\n const suffix = `${n} subscriber${n === 1 ? '' : 's'}`\n if (c.reason === 'removed') {\n return ` • ${c.slug} — removed (${suffix} still on it)`\n }\n // repriced: include the interval diffs for context.\n const diffs = (c.intervals ?? [])\n .map((i) => `${i.interval}: ${formatCents(i.oldCents)} → ${formatCents(i.newCents)}`)\n .join('; ')\n return ` • ${c.slug} — repriced (${diffs}; ${suffix} grandfathered on old price)`\n}\n\n/**\n * After /sync reports plans that stranded existing subscribers (removed\n * outright OR repriced with grandfathered customers), ask the developer\n * whether to cancel those subscriptions at the end of their current billing\n * period. Skipping is fine — they can run their own cleanup later via the\n * SDK's `cancelSubscription` helper.\n *\n * One yes/no prompt covers every affected plan. Granular per-plan control\n * is intentionally not surfaced; if a developer wants to cancel for plan A\n * but keep plan B, they can re-declare A in their next deploy.\n *\n * Errors here are warnings, never deploy failures: the deploy itself\n * succeeded; cleanup is the polite-but-optional tail.\n */\nasync function promptAndCancelChangedPlans(\n appName: string,\n token: string,\n changes: PlanChange[],\n): Promise<void> {\n const summary = changes.map(summaryLine).join('\\n')\n p.log.warn(\n `Plan change${changes.length === 1 ? '' : 's'} from this deploy left subscribers stranded:\\n${summary}\\n\\n` +\n 'Stripe will keep charging them until you cancel. Cancel at the end of their\\n' +\n 'current billing period? (Skip to leave them grandfathered.)',\n )\n const choice = await p.confirm({\n message: `Cancel ${changes.length === 1 ? 'these subscribers' : 'all of them'} at period end?`,\n initialValue: false,\n })\n if (p.isCancel(choice) || !choice) {\n p.log.info('Skipped — existing subscribers stay on their current plan/price.')\n return\n }\n\n // The admin-cancel endpoint batches at 50 and returns `hasMore` when there\n // are more rows to process. Loop until done so a plan with hundreds of\n // stranded subscribers gets fully cleaned up — without this, the deploy\n // prompt's confirmation (\"cancel these subscribers\") would silently leave\n // the tail being charged. The cap on iterations is a safety net for the\n // unlikely \"nothing makes progress\" path; a fresh deploy can resume.\n const MAX_ITERATIONS = 100 // 50/batch × 100 = 5000 subs/plan max per deploy\n for (const c of changes) {\n const s = createSpinner()\n s.start(`Canceling ${c.affectedSubscribers} subscriber${c.affectedSubscribers === 1 ? '' : 's'} on ${c.slug}...`)\n let totalCanceled = 0\n let totalFailed = 0\n let iteration = 0\n let lastError: string | null = null\n let stopped = false\n try {\n while (iteration < MAX_ITERATIONS) {\n const res = await fetch(`${API_URL}/api/subscriptions/admin-cancel`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n appName,\n planSlug: c.slug,\n atPeriodEnd: true,\n reason: `plan ${c.reason} via deploy`,\n }),\n })\n const body = (await res.json().catch(() => ({}))) as {\n success?: boolean\n canceled?: number\n failures?: Array<{ stripeSubscriptionId: string; error: string }>\n hasMore?: boolean\n error?: string\n }\n if (!res.ok || !body.success) {\n // Genuine failure (auth, 5xx, etc.) — surface and stop. The empty-\n // match case returns 200 with hasMore=false, not an error, so this\n // branch only fires for real problems.\n lastError = body.error ?? `HTTP ${res.status}`\n s.stop(`Cancel failed for ${c.slug}: ${lastError}`)\n stopped = true\n break\n }\n const batchCanceled = body.canceled ?? 0\n totalCanceled += batchCanceled\n totalFailed += body.failures?.length ?? 0\n if (!body.hasMore) break\n // Progress guard: if a batch returned hasMore=true but canceled=0\n // (every row failed), we'd loop forever. Stop and report.\n if (batchCanceled === 0) {\n lastError = 'no progress (all rows failed this batch)'\n break\n }\n iteration++\n }\n if (!stopped) {\n const tail =\n totalFailed > 0\n ? `; ${totalFailed} failed (see Stripe)`\n : ''\n const cap =\n iteration >= MAX_ITERATIONS\n ? ` (batch cap reached — re-run deploy to finish remaining)`\n : ''\n const errSuffix = lastError ? ` — ${lastError}` : ''\n s.stop(`Canceled ${totalCanceled} on ${c.slug}${tail}${cap}${errSuffix}`)\n }\n } catch (err: any) {\n s.stop(`Cancel failed for ${c.slug}: ${err.message}`)\n }\n }\n}\n\n/**\n * Bundle the app's `src/products.ts` with esbuild, dynamic-import the\n * resulting ESM, and POST the declarations to /api/charges/products/sync.\n * No-op when the file is absent. Mirrors syncSubscriptionPlans — products are\n * the one-time-charge equivalent of subscription plans, and the platform\n * resolves amount/name from this catalog at checkout time so the browser\n * can't pick (productId, amount) together.\n */\nasync function syncOneTimeProducts(appDir: string, appName: string, token: string): Promise<void> {\n const productsPath = join(appDir, 'src', 'products.ts')\n if (!existsSync(productsPath)) return\n\n const s = createSpinner()\n s.start('Syncing one-time products...')\n\n let products: unknown\n try {\n const esbuild = await import('esbuild')\n const outDir = join(appDir, '.wrangler', 'deploy')\n const outFile = join(outDir, 'products.bundle.mjs')\n await esbuild.build({\n entryPoints: [productsPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'node18',\n outfile: outFile,\n logLevel: 'silent',\n write: true,\n })\n const mod = (await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`)) as {\n oneTimeProducts?: unknown\n }\n products = mod.oneTimeProducts\n } catch (err: any) {\n s.stop('Product sync skipped')\n p.log.warn(`Could not load src/products.ts: ${err.message}`)\n return\n }\n\n if (!Array.isArray(products)) {\n s.stop('Product sync skipped')\n p.log.warn(\n 'src/products.ts must `export const oneTimeProducts = [...] as const`',\n )\n return\n }\n\n // See syncSubscriptionPlans for rationale — the deploy is already live by\n // the time we get here, so network/parse failures degrade to warnings.\n let res: Response\n try {\n res = await fetch(`${API_URL}/api/charges/products/sync`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ appName, products }),\n })\n } catch (err: any) {\n s.stop('Product sync skipped')\n p.log.warn(`Product sync request failed (network): ${err.message ?? err}`)\n return\n }\n const body = (await res.json().catch(() => ({}))) as {\n ok?: boolean\n count?: number\n error?: string\n details?: unknown\n }\n\n if (res.ok && body.ok) {\n const n = body.count ?? products.length\n s.stop(`Synced ${n} one-time product${n === 1 ? '' : 's'}`)\n return\n }\n\n s.stop('Product sync skipped')\n p.log.warn(\n `Product sync failed: ${body.error ?? `HTTP ${res.status}`}${\n body.details ? ` — ${JSON.stringify(body.details)}` : ''\n }`,\n )\n}\n\n/**\n * Poll the deployed URL until it stops returning Cloudflare's\n * \"Assets have not yet deployed\" transitional page. Returns true when the\n * worker is actually serving, false on timeout.\n */\nasync function waitForAssetsReady(url: string, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n let attempt = 0\n while (Date.now() < deadline) {\n attempt++\n try {\n const res = await fetch(url, { redirect: 'manual' })\n const body = await res.text()\n // The transitional page is HTML with the literal phrase below. Any\n // other body — worker JSON, the app's index.html, even a 404 from the\n // worker's catch-all — means the deploy is live.\n if (!body.includes('Assets have not yet deployed')) {\n return true\n }\n } catch {\n // network blip — try again\n }\n // Exponential backoff capped at 8s: 1s → 2s → 4s → 8s → 8s …\n const wait = Math.min(8_000, 1_000 * 2 ** (attempt - 1))\n await new Promise((r) => setTimeout(r, wait))\n }\n return false\n}\n\nfunction collectAssets(dir: string): Array<{ path: string; contentBase64: string }> {\n const assets: Array<{ path: string; contentBase64: string }> = []\n function walk(d: string, prefix: string) {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === '.assetsignore') continue\n const full = join(d, entry.name)\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isDirectory()) {\n walk(full, rel)\n } else {\n assets.push({\n path: '/' + rel,\n contentBase64: readFileSync(full).toString('base64'),\n })\n }\n }\n }\n walk(dir, '')\n return assets\n}\n","/**\n * Binding Manifest — non-DO bindings declared by an app's wrangler.toml that\n * the deploy-worker should pass through to Cloudflare's WfP upload API.\n *\n * Apps don't export a `__BINDING_MANIFEST__`; the CLI extracts these from the\n * normalized vite/wrangler output config at deploy time. This file just owns\n * the types + validation so both sides (CLI client and deploy-worker server)\n * agree on the shape.\n */\n/// <reference types=\"@cloudflare/workers-types\" />\n\n/**\n * A single non-DO binding the app declares. Mirrors CF's WfP binding API.\n *\n * Provisionable resources (d1, kv_namespace, vectorize, r2_bucket, queue) accept\n * the literal string `\"auto\"` in their ID field to request platform-side\n * provisioning at deploy time. When `\"auto\"` is used, the deploy-worker creates\n * the resource on the platform CF account, persists the resulting CF ID in the\n * app registry, and substitutes the real ID before forwarding to WfP. The\n * sentinel sticks around in this type because:\n * 1. `wrangler` parsing requires a non-empty string in the id field\n * 2. The CLI passes the unresolved manifest through to the deploy-worker\n * 3. The deploy-worker is the only side with CF API credentials\n *\n * Companion fields (`database_name`, `title`, `dimensions`, `metric`) are only\n * used when `\"auto\"` is set — they tell the provisioner how to create the\n * resource. After provisioning these fields are still present on the wire but\n * ignored by WfP.\n */\nexport type CustomBinding =\n | {\n type: 'vectorize'\n name: string\n /** Either a pre-existing index name or the literal `\"auto\"`. */\n index_name: string\n /** Required when `index_name === \"auto\"`. */\n dimensions?: number\n /** Required when `index_name === \"auto\"`. */\n metric?: 'cosine' | 'euclidean' | 'dot-product'\n }\n | { type: 'ai'; name: string }\n | {\n type: 'r2_bucket'\n name: string\n /** Either a pre-existing bucket name or the literal `\"auto\"`. */\n bucket_name: string\n }\n | {\n type: 'kv_namespace'\n name: string\n /** Either a pre-existing KV namespace ID or the literal `\"auto\"`. */\n namespace_id: string\n /** Required when `namespace_id === \"auto\"`. Human-readable namespace title. */\n title?: string\n }\n | {\n type: 'd1'\n name: string\n /** Either a pre-existing D1 database UUID or the literal `\"auto\"`. */\n id: string\n /** Required when `id === \"auto\"`. Human-readable database name. */\n database_name?: string\n }\n | {\n type: 'queue'\n name: string\n /** Either a pre-existing queue name or the literal `\"auto\"`. */\n queue_name: string\n }\n | { type: 'browser_rendering'; name: string }\n | { type: 'analytics_engine'; name: string; dataset?: string }\n | { type: 'hyperdrive'; name: string; id: string }\n\nexport type CustomBindingManifest = CustomBinding[]\n\n/** Sentinel string in an ID field that requests platform-side provisioning. */\nexport const AUTO_PROVISION_SENTINEL = 'auto'\n\n/** Binding types whose ID field accepts the `\"auto\"` sentinel for provisioning. */\nexport const AUTO_PROVISIONABLE_TYPES = new Set([\n 'd1',\n 'kv_namespace',\n 'vectorize',\n 'r2_bucket',\n 'queue',\n])\n\n/** Vectorize metric values accepted by CF when creating an index. */\nconst VECTORIZE_METRICS = new Set(['cosine', 'euclidean', 'dot-product'])\n\n/**\n * True if a binding has the `\"auto\"` sentinel in its primary ID field. Used by\n * the deploy-worker to decide which entries need provisioning and by the\n * validator to enforce companion-field requirements.\n */\nexport function isAutoProvision(b: CustomBinding): boolean {\n switch (b.type) {\n case 'd1':\n return b.id === AUTO_PROVISION_SENTINEL\n case 'kv_namespace':\n return b.namespace_id === AUTO_PROVISION_SENTINEL\n case 'vectorize':\n return b.index_name === AUTO_PROVISION_SENTINEL\n case 'r2_bucket':\n return b.bucket_name === AUTO_PROVISION_SENTINEL\n case 'queue':\n return b.queue_name === AUTO_PROVISION_SENTINEL\n default:\n return false\n }\n}\n\n/** Binding `type` values an app is allowed to declare. */\nexport const ALLOWED_BINDING_TYPES = new Set([\n 'vectorize',\n 'ai',\n 'r2_bucket',\n 'kv_namespace',\n 'd1',\n 'queue',\n 'browser_rendering',\n 'analytics_engine',\n 'hyperdrive',\n])\n\n/**\n * Binding NAMES the SDK reserves on every app — apps may not redeclare them.\n *\n * Includes:\n * - Static-asset + service bindings the platform sets up automatically.\n * - SDK-managed env (auth, identity, owner JWT).\n * - The auto-attached cost-tracking AE dataset (`USAGE_EVENTS`).\n *\n * DO binding names (RECORD_ROOMS, YJS_ROOMS, etc.) are NOT in this set\n * because they live in a separate manifest (`__DO_MANIFEST__`).\n */\nexport const RESERVED_BINDING_NAMES = new Set([\n 'ASSETS',\n 'PLATFORM_WORKER',\n 'API_WORKER',\n 'APP_NAME',\n 'OWNER_USER_ID',\n 'AUTH_JWT_PUBLIC_KEY',\n 'AUTH_JWT_ISSUER',\n 'AUTH_WORKER_URL',\n 'APP_IDENTITY_TOKEN',\n 'APP_OWNER_JWT',\n 'USAGE_EVENTS',\n])\n\n/**\n * Per-binding validation error. `binding` is undefined for top-level\n * shape failures (e.g. manifest is not an array).\n */\nexport interface ValidationError {\n binding?: CustomBinding\n reason: string\n}\n\n/**\n * Validate a binding manifest. Returns errors; an empty array means valid.\n *\n * Used both client-side (CLI) for friendly fail-fast and server-side\n * (deploy-worker) as a security boundary — apps can't sneak in reserved\n * binding names by editing the wire format.\n */\nexport function validateBindingManifest(\n manifest: unknown,\n): { valid: true; bindings: CustomBindingManifest } | { valid: false; errors: ValidationError[] } {\n if (!Array.isArray(manifest)) {\n return { valid: false, errors: [{ reason: 'Manifest must be an array' }] }\n }\n const errors: ValidationError[] = []\n const seenNames = new Set<string>()\n for (const entry of manifest) {\n if (!entry || typeof entry !== 'object') {\n errors.push({ reason: `Entry must be an object (got ${entry === null ? 'null' : typeof entry})` })\n continue\n }\n const e = entry as Record<string, unknown>\n const type = e.type\n const name = e.name\n if (typeof type !== 'string' || !ALLOWED_BINDING_TYPES.has(type)) {\n errors.push({\n reason: `Disallowed binding type: ${typeof type === 'string' ? type : `(${typeof type})`}. Allowed: ${[...ALLOWED_BINDING_TYPES].sort().join(', ')}`,\n })\n continue\n }\n if (typeof name !== 'string' || !name) {\n errors.push({ reason: `Binding of type \"${type}\" missing 'name' (string)` })\n continue\n }\n if (RESERVED_BINDING_NAMES.has(name)) {\n errors.push({ reason: `Binding name \"${name}\" is reserved by the SDK` })\n continue\n }\n if (seenNames.has(name)) {\n errors.push({ reason: `Duplicate binding name \"${name}\"` })\n continue\n }\n seenNames.add(name)\n // Now safely typed: type is in ALLOWED_BINDING_TYPES + name is a string.\n const binding = entry as CustomBinding\n const fieldErr = requiredFieldError(binding)\n if (fieldErr) errors.push({ binding, reason: fieldErr })\n }\n if (errors.length) return { valid: false, errors }\n return { valid: true, bindings: manifest as CustomBindingManifest }\n}\n\nfunction requiredFieldError(b: CustomBinding): string | null {\n switch (b.type) {\n case 'vectorize': {\n if (!b.index_name) return `vectorize binding \"${b.name}\" missing index_name (or \"auto\")`\n if (b.index_name === AUTO_PROVISION_SENTINEL) {\n // Auto-provisioning needs the index shape upfront — CF requires both\n // dimensions and metric at index-create time.\n if (typeof b.dimensions !== 'number' || b.dimensions <= 0) {\n return `vectorize binding \"${b.name}\" with index_name=\"auto\" requires \"dimensions\" (positive number)`\n }\n if (!b.metric || !VECTORIZE_METRICS.has(b.metric)) {\n return `vectorize binding \"${b.name}\" with index_name=\"auto\" requires \"metric\" (one of: ${[...VECTORIZE_METRICS].join(', ')})`\n }\n }\n return null\n }\n case 'r2_bucket':\n return b.bucket_name ? null : `r2_bucket binding \"${b.name}\" missing bucket_name (or \"auto\")`\n case 'kv_namespace': {\n if (!b.namespace_id) return `kv_namespace binding \"${b.name}\" missing namespace_id (or \"auto\")`\n if (b.namespace_id === AUTO_PROVISION_SENTINEL && !b.title) {\n return `kv_namespace binding \"${b.name}\" with namespace_id=\"auto\" requires \"title\"`\n }\n return null\n }\n case 'd1': {\n if (!b.id) return `d1 binding \"${b.name}\" missing id (or \"auto\")`\n if (b.id === AUTO_PROVISION_SENTINEL && !b.database_name) {\n return `d1 binding \"${b.name}\" with id=\"auto\" requires \"database_name\"`\n }\n return null\n }\n case 'queue':\n return b.queue_name ? null : `queue binding \"${b.name}\" missing queue_name (or \"auto\")`\n case 'hyperdrive':\n // Hyperdrive auto-provisioning is out of scope for v1 (needs upstream\n // connection-string management). Only pre-existing IDs accepted.\n if (!b.id) return `hyperdrive binding \"${b.name}\" missing id`\n if (b.id === AUTO_PROVISION_SENTINEL) {\n return `hyperdrive binding \"${b.name}\": auto-provisioning not yet supported (provide a real id)`\n }\n return null\n case 'ai':\n case 'browser_rendering':\n case 'analytics_engine':\n return null // no required fields beyond `name`\n default: {\n // Exhaustiveness guard — adding a new variant without a case fails here.\n const _exhaustive: never = b\n void _exhaustive\n return null\n }\n }\n}\n\n/**\n * Convert vite/wrangler's normalized config (from `.wrangler/deploy/config.json`)\n * into a CustomBindingManifest.\n *\n * Vite normalizes wrangler.toml into object/array structures with shapes like\n * `{ ai: { binding: 'AI' } }`, `{ vectorize: [{ binding, index_name }] }`,\n * etc. We extract each known shape with explicit field plucks (no broad\n * `as` casts) and return a flat array.\n */\nexport function bindingManifestFromOutputConfig(\n outputConfig: Record<string, unknown>,\n): CustomBindingManifest {\n const out: CustomBindingManifest = []\n\n // ai: single object\n const aiBinding = pluckString(outputConfig.ai, 'binding')\n if (aiBinding) out.push({ type: 'ai', name: aiBinding })\n\n // vectorize: array of { binding, index_name, dimensions?, metric? }\n // `dimensions` and `metric` are only required when index_name === \"auto\"\n // (auto-provisioning); the validator enforces that, so we just pluck both\n // here and let it decide.\n for (const v of asObjectArray(outputConfig.vectorize)) {\n const name = pluckString(v, 'binding')\n const index_name = pluckString(v, 'index_name')\n if (!name || !index_name) continue\n const dimensions = pluckNumber(v, 'dimensions')\n const metric = pluckString(v, 'metric')\n out.push({\n type: 'vectorize',\n name,\n index_name,\n ...(dimensions != null && { dimensions }),\n ...(metric && (metric === 'cosine' || metric === 'euclidean' || metric === 'dot-product') && { metric }),\n })\n }\n\n // r2_buckets: array of { binding, bucket_name }\n for (const r of asObjectArray(outputConfig.r2_buckets)) {\n const name = pluckString(r, 'binding')\n const bucket_name = pluckString(r, 'bucket_name')\n if (name && bucket_name) out.push({ type: 'r2_bucket', name, bucket_name })\n }\n\n // kv_namespaces: array of { binding, id, title? }\n // `title` is only required when id === \"auto\"; pluck both here and let\n // the validator enforce the dependency.\n for (const k of asObjectArray(outputConfig.kv_namespaces)) {\n const name = pluckString(k, 'binding')\n const namespace_id = pluckString(k, 'id')\n if (!name || !namespace_id) continue\n const title = pluckString(k, 'title')\n out.push({\n type: 'kv_namespace',\n name,\n namespace_id,\n ...(title && { title }),\n })\n }\n\n // d1_databases: array of { binding, database_id, database_name? }\n // `database_name` is only required when database_id === \"auto\"; pluck both\n // and let the validator enforce.\n for (const d of asObjectArray(outputConfig.d1_databases)) {\n const name = pluckString(d, 'binding')\n const id = pluckString(d, 'database_id')\n if (!name || !id) continue\n const database_name = pluckString(d, 'database_name')\n out.push({\n type: 'd1',\n name,\n id,\n ...(database_name && { database_name }),\n })\n }\n\n // queues.producers: array of { binding, queue }\n const queues = isObject(outputConfig.queues) ? outputConfig.queues : null\n for (const q of asObjectArray(queues?.producers)) {\n const name = pluckString(q, 'binding')\n const queue_name = pluckString(q, 'queue')\n if (name && queue_name) out.push({ type: 'queue', name, queue_name })\n }\n\n // browser: { binding } (Cloudflare names this `browser` not `browser_rendering`)\n const browserBinding = pluckString(outputConfig.browser, 'binding')\n if (browserBinding) out.push({ type: 'browser_rendering', name: browserBinding })\n\n // analytics_engine_datasets: array of { binding, dataset? }\n for (const a of asObjectArray(outputConfig.analytics_engine_datasets)) {\n const name = pluckString(a, 'binding')\n const dataset = pluckString(a, 'dataset')\n if (name) out.push({ type: 'analytics_engine', name, dataset: dataset ?? undefined })\n }\n\n // hyperdrive: array of { binding, id }\n for (const h of asObjectArray(outputConfig.hyperdrive)) {\n const name = pluckString(h, 'binding')\n const id = pluckString(h, 'id')\n if (name && id) out.push({ type: 'hyperdrive', name, id })\n }\n\n return out\n}\n\n// ---- internal helpers (no broad `as` casts) ----\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v)\n}\n\nfunction pluckString(v: unknown, key: string): string | null {\n if (!isObject(v)) return null\n const val = v[key]\n return typeof val === 'string' && val.length > 0 ? val : null\n}\n\nfunction pluckNumber(v: unknown, key: string): number | null {\n if (!isObject(v)) return null\n const val = v[key]\n return typeof val === 'number' && Number.isFinite(val) ? val : null\n}\n\nfunction asObjectArray(v: unknown): Record<string, unknown>[] {\n if (!Array.isArray(v)) return []\n return v.filter(isObject)\n}\n","/**\n * deepspace undeploy\n *\n * Removes a deployed app from *.app.space via the deploy worker.\n */\n\nimport { defineCommand } from 'citty'\nimport * as p from '@clack/prompts'\nimport { createSpinner } from '../lib/spinner'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\nimport {\n resolveAppNameForEnv, readWranglerConfig, hasWranglerConfig,\n} from '../lib/wrangler-env'\n\nconst DEPLOY_URL = process.env.DEEPSPACE_DEPLOY_URL ?? ENVS.prod.deploy\n\nexport default defineCommand({\n meta: {\n name: 'undeploy',\n description: 'Remove a deployed DeepSpace app',\n },\n args: {\n name: {\n type: 'positional',\n description: 'App name to undeploy (reads from wrangler.toml if omitted)',\n required: false,\n },\n env: {\n type: 'string',\n description:\n 'wrangler.toml [env.<name>] block whose deployed app to remove ' +\n '(e.g. --env staging). Ignored if a positional name is given.',\n required: false,\n },\n },\n async run({ args }) {\n let appName = args.name as string | undefined\n const envName = typeof args.env === 'string' && args.env.trim() ? args.env.trim() : undefined\n\n // If no name given, try to read from wrangler.toml in cwd. With --env\n // we look up `[env.<name>].name`; without it, the top-level `name`.\n if (!appName) {\n if (hasWranglerConfig(process.cwd())) {\n const config = readWranglerConfig(process.cwd())\n const nameRes = resolveAppNameForEnv(config, envName)\n if (!nameRes.ok) {\n p.cancel(nameRes.reason)\n process.exit(1)\n }\n appName = nameRes.name\n }\n }\n\n if (!appName) {\n p.cancel('Provide an app name or run from a DeepSpace app directory.')\n process.exit(1)\n }\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err: any) {\n p.cancel(err.message)\n process.exit(1)\n }\n\n p.intro(`Undeploying ${appName}`)\n const s = createSpinner()\n s.start('Removing...')\n\n const res = await fetch(`${DEPLOY_URL}/api/deploy/${appName}`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${token}` },\n })\n\n const body = (await res.json().catch(() => ({}))) as { success?: boolean; error?: string }\n\n if (!res.ok || !body.success) {\n s.stop('Failed')\n p.cancel(body.error ?? `Undeploy error (${res.status})`)\n process.exit(1)\n }\n\n s.stop('Removed')\n p.outro(`${appName}.app.space has been taken down`)\n },\n})\n","/**\n * deepspace whoami\n *\n * Shows the currently logged-in user. Auto-refreshes the JWT if expired.\n *\n * Prints all the identity fields a developer cares about (email, name,\n * userId, issuer) so you don't have to peek into ~/.deepspace/token.\n * Also flags whether the session is for a test account (`@deepspace.test`\n * email), since that's a meaningful distinction for who can do what — see\n * docs/auth/dev-vs-test-accounts.md.\n *\n * `--json` emits a parseable single-line JSON object for scripts.\n */\n\nimport { defineCommand } from 'citty'\nimport { ensureToken } from '../auth'\nimport { DASHBOARD_URL } from '../env'\nimport { decodeJwtPayload } from '../jwt'\n\ninterface JwtPayload {\n sub?: string\n name?: string\n email?: string\n image?: string | null\n iss?: string\n iat?: number\n exp?: number\n}\n\nexport default defineCommand({\n meta: {\n name: 'whoami',\n description: 'Show the currently logged-in user',\n },\n args: {\n json: {\n type: 'boolean',\n description: 'Emit a single-line JSON object instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n let jwt: string\n try {\n jwt = await ensureToken()\n } catch (err: any) {\n console.error(err.message ?? 'Not signed in. Run `deepspace login`.')\n process.exit(1)\n }\n\n let payload: JwtPayload\n try {\n payload = decodeJwtPayload<JwtPayload>(jwt)\n } catch {\n console.error('Malformed session token. Run `deepspace login` again.')\n process.exit(1)\n }\n\n const isTestAccount = !!payload.email?.endsWith('@deepspace.test')\n const accountType: 'developer' | 'test-account' | 'unknown' = isTestAccount\n ? 'test-account'\n : payload.email\n ? 'developer'\n : 'unknown'\n\n if (args.json) {\n console.log(JSON.stringify({\n name: payload.name ?? null,\n email: payload.email ?? null,\n userId: payload.sub ?? null,\n accountType,\n issuer: payload.iss ?? null,\n expiresAt: payload.exp ? new Date(payload.exp * 1000).toISOString() : null,\n }))\n return\n }\n\n console.log(`Name: ${payload.name ?? '(none)'}`)\n console.log(`Email: ${payload.email ?? '(none)'}`)\n console.log(`UserID: ${payload.sub ?? '(none)'}`)\n console.log(`Type: ${accountType}`)\n if (payload.iss) console.log(`Issuer: ${payload.iss}`)\n console.log(`Dashboard: ${DASHBOARD_URL}`)\n if (isTestAccount) {\n console.log('')\n console.log('Note: this is a test account, not a real OAuth developer.')\n console.log('See docs/auth/dev-vs-test-accounts.md.')\n }\n },\n})\n","/**\n * deepspace add <feature> [dir]\n *\n * Installs a DeepSpace feature into the current app.\n *\n * deepspace add --list # list available features\n * deepspace add messaging # install into current dir\n * deepspace add messaging ./my-app # install into specific dir\n * deepspace add --info messaging # show feature details\n */\n\nimport { defineCommand } from 'citty'\nimport { existsSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport { ensureInstallReady } from '../lib/install-status'\n\nfunction findScript(from: string): string | null {\n // Preferred: ships inside the deepspace npm package at\n // node_modules/deepspace/scripts/add-feature.cjs, so the script and its\n // sibling features/ dir are delivered by `npm install`.\n const inNodeModules = join(from, 'node_modules', 'deepspace', 'scripts', 'add-feature.cjs')\n if (existsSync(inNodeModules)) return inNodeModules\n // Fallback for apps scaffolded before features moved into the SDK; their\n // .deepspace/ folder still works with newer deepspace versions.\n const inDotDeepspace = join(from, '.deepspace', 'scripts', 'add-feature.cjs')\n if (existsSync(inDotDeepspace)) return inDotDeepspace\n return null\n}\n\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add a feature to your DeepSpace app',\n },\n args: {\n list: {\n type: 'boolean',\n alias: 'l',\n description: 'List available features',\n required: false,\n },\n info: {\n type: 'string',\n description: 'Show details about a feature',\n required: false,\n },\n feature: {\n type: 'positional',\n description: 'Feature to install',\n required: false,\n },\n dir: {\n type: 'positional',\n description: 'App directory (default: current directory)',\n required: false,\n },\n },\n run({ args }) {\n const appDir = resolve(args.dir ?? '.')\n ensureInstallReady(appDir)\n const script = findScript(appDir)\n\n if (!script) {\n console.error('Could not find the deepspace feature installer.')\n console.error('Looked in:')\n console.error(` ${join(appDir, 'node_modules', 'deepspace', 'scripts', 'add-feature.cjs')}`)\n console.error(` ${join(appDir, '.deepspace', 'scripts', 'add-feature.cjs')}`)\n console.error('Are you in a DeepSpace app directory? Try `npm install` first.')\n process.exit(1)\n }\n\n const passArgs: string[] = []\n\n if (args.list) {\n passArgs.push('--list')\n } else if (args.info) {\n passArgs.push('--info', args.info)\n } else if (args.feature) {\n passArgs.push(args.feature, appDir)\n } else {\n passArgs.push('--help')\n }\n\n execSync(`node ${JSON.stringify(script)} ${passArgs.map(a => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n cwd: appDir,\n })\n },\n})\n","/**\n * deepspace skills <subcommand>\n *\n * Wraps `npx skills@latest add deepdotspace/deepspace-skill` so installation\n * lives under our verb (mirrors `npx remotion skills add`). The upstream\n * `skills` CLI owns repo fetch, idempotency, and agent layouts.\n *\n * deepspace skills add # multi-agent install\n * deepspace skills add -g # install globally\n * deepspace skills add --agent codex # single agent\n * deepspace skills add -y # non-interactive\n *\n * Pre-install fixup for vercel-labs/skills#1138: upstream's project-local\n * install silently skips the Claude Code symlink when `.claude/` doesn't\n * already exist. Pre-creating `.claude/` lets the upstream CLI do the right\n * thing itself, so we don't have to know its layout.\n */\n\nimport { defineCommand } from 'citty'\nimport spawn from 'cross-spawn'\nimport { mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nconst SKILL_REPO = 'deepdotspace/deepspace-skill'\nconst SKILL_NAME = 'deepspace'\n\n/**\n * Run `npx -y skills@latest add <repo> [extraArgs]`. Inherits stdio so the\n * `skills` CLI's own prompts / progress bars show through.\n */\nfunction runSkillsAdd(extraArgs: string[]): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(\n 'npx',\n ['-y', 'skills@latest', 'add', SKILL_REPO, ...extraArgs],\n { stdio: 'inherit' },\n )\n child.on('close', (code) => resolve(code ?? 1))\n child.on('error', (err) => {\n console.error(`Failed to invoke npx: ${err.message}`)\n console.error('Is Node.js installed and on PATH?')\n resolve(1)\n })\n })\n}\n\n/**\n * Workaround for https://github.com/vercel-labs/skills/issues/1138 — the\n * upstream installer's project-local branch silently returns success without\n * creating the Claude Code symlink when `<baseDir>/.claude/` doesn't exist.\n * Pre-creating an empty `.claude/` flips that check and lets the upstream CLI\n * create the symlink itself. Idempotent.\n *\n * @param baseDir cwd for project-local install, $HOME for `-g` global.\n */\nfunction precreateClaudeDir(baseDir: string): void {\n mkdirSync(join(baseDir, '.claude'), { recursive: true })\n}\n\nconst add = defineCommand({\n meta: {\n name: 'add',\n description: 'Install the DeepSpace skill for your coding agent',\n },\n args: {\n global: {\n type: 'boolean',\n alias: 'g',\n description: 'Install globally (~/.agents/skills/) instead of into the current directory',\n default: false,\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts (assume yes for any confirmation)',\n default: false,\n },\n agent: {\n type: 'string',\n description: 'Target a single agent (e.g. claude-code, codex, opencode). Default: install for all detected agents.',\n required: false,\n },\n },\n async run({ args }) {\n const extra: string[] = []\n if (args.global) extra.push('-g')\n if (args.yes) extra.push('-y')\n if (args.agent) extra.push('--agent', args.agent)\n\n // Pre-create .claude/ so upstream's install picks up Claude Code.\n // Skip when --agent targets a non-claude agent — no point creating\n // an empty .claude/ the user doesn't want.\n if (!args.agent || args.agent === 'claude-code') {\n const baseDir = args.global ? homedir() : process.cwd()\n try {\n precreateClaudeDir(baseDir)\n } catch (err: any) {\n // Non-fatal: upstream will still install for other agents.\n console.warn(`\\n Note: could not pre-create .claude/ for Claude Code: ${err?.message ?? err}`)\n }\n }\n\n const code = await runSkillsAdd(extra)\n if (code !== 0) process.exit(code)\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'skills',\n description: 'Manage the DeepSpace agent skill (Claude Code, Codex, OpenCode, Cursor, ...)',\n },\n subCommands: {\n add,\n },\n})\n","/**\n * deepspace domain — purchase and manage custom domains for your apps.\n *\n * Designed to be both human-friendly and agent/script-friendly:\n * - All destructive commands accept `--yes` to skip prompts.\n * - All read commands accept `--json` for structured stdout.\n * - `--app` defaults to the cwd's wrangler.toml name (matches `deepspace deploy`).\n * - `domain buy` opens Stripe Checkout in a browser and polls until live;\n * pass `--no-open` to print the URL only, `--no-wait` to skip polling.\n *\n * Subcommands:\n * search <query> — find available domains and prices\n * buy <domain> — buy a domain via Stripe Checkout (browser)\n * list — list domains you own\n * status <domain> — detail view for one domain\n * attach <domain> — re-point a domain at a different app\n * detach <domain> — stop routing the domain (keeps registration)\n * renew <domain> --auto X — toggle auto-renew on/off at the registrar\n */\n\nimport { defineCommand } from 'citty'\nimport { execSync } from 'node:child_process'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\nimport { requireAppName, detectAppName } from '../lib/app-context'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\n\ninterface SearchResult {\n name: string\n registrable: boolean\n registrar?: 'cloudflare' | 'namesilo'\n pricing?: { currency: string; registrationCost: string; renewalCost: string }\n registrationCost?: number\n renewalCost?: number\n chargedCents?: number | null\n costCents?: number | null\n reason?: string\n premium?: boolean\n}\n\ninterface DomainPurchase {\n id: string\n domain: string\n appName: string\n status: string\n statusError?: string | null\n registeredAt?: string | null\n expiresAt?: string | null\n chargedCents: number\n autoRenew: boolean\n registrar: string\n}\n\nasync function api<T>(token: string, path: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${API_URL}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n })\n const text = await res.text()\n if (!res.ok) {\n let msg = text\n try {\n msg = (JSON.parse(text) as { error?: string }).error ?? text\n } catch {\n // not JSON\n }\n throw new Error(`API ${path} (${res.status}): ${msg}`)\n }\n return JSON.parse(text) as T\n}\n\n/**\n * Strip internal-only pricing fields from any value before emitting it to\n * stdout. The api-worker exposes both the user-facing `chargedCents` and the\n * platform's at-cost `costCents`; only the former should reach the CLI user.\n */\nfunction scrubInternal<T>(value: T): T {\n if (Array.isArray(value)) return value.map(scrubInternal) as unknown as T\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (k === 'costCents') continue\n out[k] = scrubInternal(v)\n }\n return out as T\n }\n return value\n}\n\nfunction fmtCents(cents: number | null | undefined): string {\n if (cents === null || cents === undefined) return '—'\n return `$${(cents / 100).toFixed(2)}`\n}\n\nfunction fmtDate(iso: string | null | undefined): string {\n if (!iso) return '—'\n return iso.slice(0, 10)\n}\n\n/**\n * Plain stdin Y/N prompt — no clack, agent can pipe `yes` or pass --yes.\n */\nasync function confirm(message: string): Promise<boolean> {\n if (!process.stdin.isTTY) {\n // Non-interactive (piped, agent) — refuse rather than hang\n throw new Error(`${message} — pass --yes to confirm non-interactively`)\n }\n process.stdout.write(`${message} [y/N] `)\n return new Promise((resolve) => {\n process.stdin.setEncoding('utf-8')\n process.stdin.once('data', (data) => {\n const answer = data.toString().trim().toLowerCase()\n resolve(answer === 'y' || answer === 'yes')\n })\n })\n}\n\n// ============================================================================\n// search\n// ============================================================================\n\nconst search = defineCommand({\n meta: { name: 'search', description: 'Search for available domains' },\n args: {\n query: { type: 'positional', description: 'Domain or keyword', required: true },\n limit: { type: 'string', description: 'Max results (default 10)', default: '10' },\n json: { type: 'boolean', description: 'Emit JSON instead of a table' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const limit = parseInt(args.limit ?? '10', 10) || 10\n const result = await api<{ domains: SearchResult[] }>(\n token,\n `/api/domains/search?q=${encodeURIComponent(args.query)}&limit=${limit}`,\n )\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal(result), null, 2) + '\\n')\n return\n }\n if (result.domains.length === 0) {\n console.log('No matches.')\n return\n }\n for (const d of result.domains) {\n const tag = d.registrable ? '✓' : '✗'\n const price = d.registrable ? `${fmtCents(d.chargedCents)}/yr` : d.reason ?? '—'\n // Annotate slow-path TLDs so users have realistic expectations.\n const slowFlag = d.registrar && d.registrar !== 'cloudflare' ? ' (15-60 min provisioning)' : ''\n console.log(`${tag} ${d.name.padEnd(40)} ${price}${slowFlag}`)\n }\n },\n})\n\n// ============================================================================\n// buy\n// ============================================================================\n\nconst buy = defineCommand({\n meta: { name: 'buy', description: 'Buy a domain and attach it to an app' },\n args: {\n domain: { type: 'positional', description: 'Domain to buy', required: true },\n app: { type: 'string', description: 'App to attach (defaults to ./wrangler.toml)' },\n yes: { type: 'boolean', description: 'Skip the confirmation prompt', default: false },\n open: { type: 'boolean', description: 'Open browser at Stripe URL (use --no-open to print URL only)', default: true },\n wait: { type: 'boolean', description: 'Poll until provisioning completes (use --no-wait to exit after session creation)', default: true },\n json: { type: 'boolean', description: 'Emit JSON to stdout', default: false },\n },\n async run({ args }) {\n const token = await ensureToken()\n const appName = requireAppName(args.app)\n\n // Re-check pricing\n const priceCheck = await api<{ domains: SearchResult[] }>(token, '/api/domains/check', {\n method: 'POST',\n body: JSON.stringify({ domains: [args.domain] }),\n })\n const result = priceCheck.domains[0]\n if (!result || !result.registrable) {\n console.error(`Not available: ${result?.reason ?? 'unknown'}`)\n process.exit(1)\n }\n\n const price = fmtCents(result.chargedCents)\n // Provisioning time depends on registrar:\n // CF Registrar (.com/.dev/.app/.xyz/etc): ~60-90s — registry publishes\n // CF nameservers atomically with registration.\n // Porkbun fallback (.ai/.io/.me/.co/etc + ccTLDs): 15-60 min — depends\n // on the destination registry (Verisign/.me, NIC.AI, etc) batch-\n // publishing our NS records to public DNS. The platform side is\n // done in <30s; the wait is registry-side.\n const expectedTime =\n result.registrar === 'cloudflare'\n ? '~60-90 seconds'\n : '15-60 minutes (registry NS propagation)'\n\n if (!args.yes) {\n const ok = await confirm(\n `Buy ${args.domain} for ${price}/yr (auto-renews; non-refundable), attach to ${appName}? Provisioning takes ${expectedTime}.`,\n )\n if (!ok) {\n console.log('Cancelled.')\n return\n }\n }\n\n const checkout = await api<{ purchaseId: string; sessionId: string; url: string; chargedCents: number }>(\n token,\n '/api/domains/checkout',\n {\n method: 'POST',\n body: JSON.stringify({ domain: args.domain, appName }),\n },\n )\n\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal({ ...checkout, expectedTime, registrar: result.registrar }), null, 2) + '\\n')\n } else {\n console.log(`Stripe Checkout: ${checkout.url}`)\n }\n\n if (args.open && process.stdin.isTTY) {\n openBrowser(checkout.url)\n }\n\n if (!args.wait) return\n\n // Poll until active or failed.\n // Timeout depends on registrar — CF can take 5 min worst case, Porkbun\n // up to 60 min for slow registries. User can Ctrl-C and resume polling\n // later via `deepspace domain status <domain>` — provisioning runs\n // server-side regardless.\n const timeoutMs = result.registrar === 'cloudflare' ? 5 * 60 * 1000 : 60 * 60 * 1000\n if (!args.json) {\n console.log(`Waiting for payment & provisioning (up to ${expectedTime}). Press Ctrl-C anytime —`)\n console.log(`provisioning continues server-side; check later with \\`deepspace domain status ${args.domain}\\`.`)\n }\n const deadline = Date.now() + timeoutMs\n let lastStatus = ''\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 5000))\n try {\n const detail = await api<{ domain: DomainPurchase }>(\n token,\n `/api/domains/${checkout.purchaseId}`,\n )\n if (detail.domain.status !== lastStatus) {\n lastStatus = detail.domain.status\n if (!args.json) console.log(` → ${lastStatus}`)\n }\n if (detail.domain.status === 'active') {\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal({ ...checkout, status: 'active', domain: args.domain }), null, 2) + '\\n')\n } else {\n console.log(`✓ ${args.domain} is live and pointing at ${appName}`)\n }\n return\n }\n if (detail.domain.status.startsWith('failed:')) {\n console.error(`Provisioning failed: ${detail.domain.statusError ?? detail.domain.status}`)\n process.exit(1)\n }\n } catch (err) {\n // Transient — keep polling\n if (!args.json) console.error(`(poll error: ${err instanceof Error ? err.message : String(err)})`)\n }\n }\n console.error(`Polling timed out. Provisioning may still be in progress; check with:`)\n console.error(` deepspace domain status ${args.domain}`)\n process.exit(1)\n },\n})\n\n// ============================================================================\n// list\n// ============================================================================\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List your domains' },\n args: {\n json: { type: 'boolean', description: 'Emit JSON' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const result = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal(result), null, 2) + '\\n')\n return\n }\n if (result.domains.length === 0) {\n console.log('No domains. Try `deepspace domain search <name>`.')\n return\n }\n console.log(`DOMAIN APP STATUS EXPIRES AUTO-RENEW`)\n for (const d of result.domains) {\n console.log(\n `${d.domain.padEnd(35)} ${d.appName.padEnd(20)} ${d.status.padEnd(20)} ${fmtDate(d.expiresAt).padEnd(12)} ${d.autoRenew ? 'on' : 'off'}`,\n )\n }\n },\n})\n\n// ============================================================================\n// status\n// ============================================================================\n\nconst status = defineCommand({\n meta: { name: 'status', description: 'Show details for one domain' },\n args: {\n domain: { type: 'positional', description: 'Domain', required: true },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal(found), null, 2) + '\\n')\n return\n }\n console.log(`Domain: ${found.domain}`)\n console.log(`Status: ${found.status}${found.statusError ? ` (${found.statusError})` : ''}`)\n console.log(`Attached app: ${found.appName}`)\n console.log(`Registrar: ${found.registrar}`)\n console.log(`Registered: ${fmtDate(found.registeredAt)}`)\n console.log(`Expires: ${fmtDate(found.expiresAt)}`)\n console.log(`Auto-renew: ${found.autoRenew ? 'on' : 'off'}`)\n console.log(`Charged: ${fmtCents(found.chargedCents)}/yr`)\n },\n})\n\n// ============================================================================\n// attach\n// ============================================================================\n\nconst attach = defineCommand({\n meta: { name: 'attach', description: 'Re-point a domain at a different app' },\n args: {\n domain: { type: 'positional', description: 'Domain to re-point', required: true },\n app: { type: 'string', description: 'Target app (defaults to ./wrangler.toml)' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const targetApp = requireAppName(args.app)\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n const result = await api<{ success: boolean; appName: string }>(\n token,\n `/api/domains/${found.id}/reattach`,\n {\n method: 'POST',\n body: JSON.stringify({ appName: targetApp }),\n },\n )\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n console.log(`✓ ${args.domain} now points at ${targetApp}`)\n },\n})\n\n// ============================================================================\n// detach\n// ============================================================================\n\nconst detach = defineCommand({\n meta: {\n name: 'detach',\n description: 'Stop routing the domain (keeps the registration; auto-renew unchanged)',\n },\n args: {\n domain: { type: 'positional', description: 'Domain to detach', required: true },\n yes: { type: 'boolean', description: 'Skip the confirmation prompt' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n if (!args.yes) {\n const ok = await confirm(\n `Detach ${args.domain}? Routing will stop; the domain stays registered (auto-renew is unchanged).`,\n )\n if (!ok) {\n console.log('Cancelled.')\n return\n }\n }\n await api(token, `/api/domains/${found.id}`, { method: 'DELETE' })\n console.log(`✓ ${args.domain} detached. Use \\`deepspace domain attach\\` to re-route, or \\`renew --auto off\\` to stop auto-renewal.`)\n },\n})\n\n// ============================================================================\n// renew\n// ============================================================================\n\nconst renew = defineCommand({\n meta: { name: 'renew', description: 'Toggle auto-renewal at the registrar' },\n args: {\n domain: { type: 'positional', description: 'Domain', required: true },\n auto: { type: 'string', description: '\"on\" or \"off\"', required: true },\n },\n async run({ args }) {\n if (args.auto !== 'on' && args.auto !== 'off') {\n console.error('--auto must be \"on\" or \"off\"')\n process.exit(1)\n }\n const token = await ensureToken()\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n const enabled = args.auto === 'on'\n await api(token, `/api/domains/${found.id}/auto-renew`, {\n method: 'POST',\n body: JSON.stringify({ autoRenew: enabled }),\n })\n console.log(`✓ ${args.domain} auto-renew ${enabled ? 'enabled' : 'disabled'}`)\n },\n})\n\n// ============================================================================\n// open in browser — best-effort\n// ============================================================================\n\nfunction openBrowser(url: string): void {\n try {\n if (process.platform === 'darwin') execSync(`open ${JSON.stringify(url)}`)\n else if (process.platform === 'win32') execSync(`start \"\" ${JSON.stringify(url)}`)\n else execSync(`xdg-open ${JSON.stringify(url)} 2>/dev/null || true`)\n } catch {\n // Best-effort — user can open the URL manually\n }\n}\n\n// ============================================================================\n// Top-level\n// ============================================================================\n\n// Note: no `run()` on the parent — citty otherwise calls it after every\n// subcommand finishes, which prints spurious help text.\n//\n// `detectAppName` is imported for type-checking the `--app` defaulting in\n// each subcommand; not used here directly.\nvoid detectAppName\n\nexport default defineCommand({\n meta: { name: 'domain', description: 'Buy and manage custom domains' },\n subCommands: { search, buy, list, status, attach, detach, renew },\n})\n","/**\n * deepspace integrations <subcommand>\n *\n * Namespace for working with platform integrations from the command line.\n *\n * deepspace integrations # prints help\n * deepspace integrations list # list all\n * deepspace integrations info openai/chat-completion # schema + example\n * deepspace integrations invoke openai/chat-completion --body '{...}'\n *\n * `deepspace invoke ...` is a top-level alias for `integrations invoke ...`.\n * `deepspace invoke --list` is a shortcut for `integrations list`.\n *\n * All calls are made as the currently logged-in user (`deepspace whoami`).\n * That user is billed.\n *\n * No `run()` is defined on the parent — that matches the convention used\n * by `test-accounts` and prevents citty from firing both the parent and\n * a matched subcommand. Bare `deepspace integrations` (no subcommand)\n * prints citty's auto-generated help.\n */\n\nimport { defineCommand } from 'citty'\nimport { runInvoke, runInfo, runList } from './_invoke-impl'\n\nconst list = defineCommand({\n meta: {\n name: 'list',\n description: 'List all available integrations',\n },\n args: {\n json: {\n type: 'boolean',\n description: 'Print raw JSON (machine-readable)',\n default: false,\n },\n },\n async run({ args }) {\n try {\n await runList({ json: args.json })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n\nconst info = defineCommand({\n meta: {\n name: 'info',\n description: 'Print schema + example body for an integration endpoint',\n },\n args: {\n target: {\n type: 'positional',\n description: \"<integration>/<endpoint> (e.g. 'openai/chat-completion')\",\n required: true,\n },\n json: {\n type: 'boolean',\n description: 'Print raw JSON (machine-readable)',\n default: false,\n },\n },\n async run({ args }) {\n try {\n await runInfo({ target: args.target as string, json: args.json })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n\nconst invoke = defineCommand({\n meta: {\n name: 'invoke',\n description: 'Invoke a platform integration as the logged-in user',\n },\n args: {\n target: {\n type: 'positional',\n description: \"<integration>/<endpoint> (e.g. 'openai/chat-completion')\",\n required: true,\n },\n body: {\n type: 'string',\n alias: 'd',\n description: 'Inline JSON body',\n required: false,\n },\n 'body-file': {\n type: 'string',\n alias: 'f',\n description: 'Read JSON body from file (use - for stdin)',\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the response JSON (machine-readable)',\n default: false,\n },\n timeout: {\n type: 'string',\n description: 'Request timeout in milliseconds (default: 120000)',\n required: false,\n },\n },\n async run({ args }) {\n try {\n const timeout = args.timeout != null ? Number(args.timeout) : undefined\n if (timeout != null && (!Number.isFinite(timeout) || timeout <= 0)) {\n throw new Error(`Invalid --timeout '${args.timeout}'. Must be a positive number of milliseconds.`)\n }\n await runInvoke({\n target: args.target as string,\n body: args.body,\n bodyFile: args['body-file'],\n json: args.json,\n timeout,\n })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'integrations',\n description: 'List, inspect, and invoke platform integrations',\n },\n subCommands: {\n list,\n info,\n invoke,\n },\n})\n","/**\n * Shared implementation for `deepspace invoke` and `deepspace integrations *`.\n *\n * The CLI invokes platform integrations as the currently logged-in user\n * (the same identity shown by `deepspace whoami`). That user is billed.\n *\n * This module is the single source of truth for:\n * - listing the integration catalog\n * - showing per-endpoint info (schema + example body)\n * - making the actual POST call\n *\n * Both `commands/invoke.ts` (top-level alias) and `commands/integrations.ts`\n * (namespaced subcommands) delegate here so the behavior never drifts.\n *\n * Why `flushAndExit` is used (only on the --json paths):\n * After every subcommand runs, citty resumes the root command's run(),\n * which prints \"deepspace CLI — run `npx deepspace --help` for usage\" to\n * stdout. That trailing line corrupts --json output for any downstream\n * consumer that JSON.parses stdout (jq, file redirects, agent scripts,\n * the e2e tests). We can't suppress the root run() without modifying\n * cli.ts (out of scope), so on the --json paths we exit the process\n * before citty resumes — but we must wait for stdout to drain first,\n * because piped writes are async via libuv and large JSON outputs (the\n * full catalog is ~78KB) exceed the pipe buffer. See flushAndExit().\n *\n * Human-mode paths don't need this: the trailing line is just one more\n * line of prose, harmless. Those paths return / process.exit() normally.\n */\n\nimport { readFileSync } from 'node:fs'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\nconst DEFAULT_TIMEOUT_MS = 120_000\n\ninterface EndpointInfo {\n endpoint: string\n billing: { model: string; baseCost: number; currency: string }\n inputSchema: Record<string, unknown> | null\n example: Record<string, unknown> | null\n}\n\ninterface Catalog {\n integrations: Record<string, EndpointInfo[]>\n}\n\nexport interface InvokeArgs {\n target: string\n body?: string\n bodyFile?: string\n json?: boolean\n timeout?: number\n}\n\nexport interface InfoArgs {\n target: string\n json?: boolean\n}\n\nexport interface ListArgs {\n json?: boolean\n}\n\n/**\n * Parse \"<integration>/<endpoint>\" into its two segments.\n * Throws on malformed input.\n */\nfunction parseTarget(target: string): { integration: string; endpoint: string } {\n if (!target || typeof target !== 'string') {\n throw new Error(\"Missing target. Expected '<integration>/<endpoint>' (e.g. 'openai/chat-completion').\")\n }\n const parts = target.split('/')\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new Error(`Bad target '${target}'. Expected '<integration>/<endpoint>' (e.g. 'openai/chat-completion').`)\n }\n return { integration: parts[0], endpoint: parts[1] }\n}\n\n/**\n * Resolve the request body from --body, --body-file, or default to '{}'.\n * Errors if both --body and --body-file are provided, or the body isn't\n * valid JSON.\n */\nfunction resolveBody(opts: { body?: string; bodyFile?: string }): string {\n if (opts.body != null && opts.bodyFile != null) {\n throw new Error('Pass either --body or --body-file, not both.')\n }\n\n let raw: string\n if (opts.body != null) {\n raw = opts.body\n } else if (opts.bodyFile != null) {\n raw = opts.bodyFile === '-' ? readFileSync(0, 'utf-8') : readFileSync(opts.bodyFile, 'utf-8')\n } else {\n return '{}'\n }\n\n // Validate it parses as JSON so we fail fast with a clear message.\n try {\n JSON.parse(raw)\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'invalid JSON'\n throw new Error(`Body is not valid JSON: ${msg}`)\n }\n return raw\n}\n\n/**\n * Exit the process after stdout has drained.\n *\n * Used only on --json paths. Two problems it solves:\n * 1. Plain `process.exit()` truncates piped stdout for outputs larger\n * than the pipe buffer (~64KB on macOS) — `integrations --json | jq`\n * would lose data because libuv flushes asynchronously.\n * 2. Plain `return` lets citty fire the root command's run(), which\n * appends a trailing prose line that breaks JSON.parse on stdout.\n *\n * The pattern: schedule a zero-byte write so its callback fires only\n * after all prior writes have been flushed, then exit from the callback.\n * Returns a Promise that never resolves so the caller can `await` it\n * with no chance of citty continuing past us.\n */\nfunction flushAndExit(code: number): Promise<never> {\n return new Promise<never>(() => {\n process.stdout.write('', () => process.exit(code))\n })\n}\n\nasync function fetchCatalog(opts: { summary?: boolean } = {}): Promise<Catalog> {\n // `list` uses the summary view (names + billing); the full catalog with every\n // endpoint's schema is large enough to be truncated in an agent's terminal.\n // `info` omits the flag so it still gets the schema + example.\n const url = opts.summary ? `${API_URL}/api/integrations?summary=1` : `${API_URL}/api/integrations`\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`Failed to fetch integration catalog (${res.status})`)\n }\n return (await res.json()) as Catalog\n}\n\nfunction findEndpoint(catalog: Catalog, integration: string, endpoint: string): EndpointInfo | null {\n const endpoints = catalog.integrations[integration]\n if (!endpoints) return null\n return endpoints.find((e) => e.endpoint === endpoint) ?? null\n}\n\nfunction formatCurrency(value: number, currency: string): string {\n if (currency === 'USD') return `$${value}`\n return `${value} ${currency}`\n}\n\n/**\n * `deepspace integrations` (default action) / `--list`\n * Prints the catalog grouped by integration.\n */\nexport async function runList(args: ListArgs): Promise<void> {\n const catalog = await fetchCatalog({ summary: true })\n\n if (args.json) {\n process.stdout.write(JSON.stringify(catalog) + '\\n')\n await flushAndExit(0)\n }\n\n const names = Object.keys(catalog.integrations).sort()\n if (names.length === 0) {\n console.log('No integrations available.')\n return\n }\n\n for (const name of names) {\n console.log(name)\n const endpoints = [...catalog.integrations[name]].sort((a, b) => a.endpoint.localeCompare(b.endpoint))\n const widest = Math.max(...endpoints.map((e) => e.endpoint.length))\n for (const ep of endpoints) {\n const pad = ep.endpoint.padEnd(widest)\n const cost = formatCurrency(ep.billing.baseCost, ep.billing.currency)\n console.log(` ${pad} ${ep.billing.model.padEnd(12)} ${cost}`)\n }\n console.log()\n }\n\n console.log(\"Run 'deepspace integrations info <integration>/<endpoint>' for the request schema.\")\n}\n\n/**\n * `deepspace integrations info <target>` / `--info`\n * Prints the schema + example body for a single endpoint.\n */\nexport async function runInfo(args: InfoArgs): Promise<void> {\n const { integration, endpoint } = parseTarget(args.target)\n const catalog = await fetchCatalog()\n const info = findEndpoint(catalog, integration, endpoint)\n\n if (!info) {\n const available = catalog.integrations[integration]\n if (!available) {\n const names = Object.keys(catalog.integrations).sort().join(', ')\n throw new Error(`Unknown integration '${integration}'. Available: ${names}`)\n }\n const endpoints = available.map((e) => e.endpoint).join(', ')\n throw new Error(`Unknown endpoint '${endpoint}' for '${integration}'. Available: ${endpoints}`)\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify(info) + '\\n')\n await flushAndExit(0)\n }\n\n console.log(`${integration}/${endpoint}`)\n console.log(` billing: ${info.billing.model}, ${formatCurrency(info.billing.baseCost, info.billing.currency)} per call`)\n console.log()\n console.log('Input schema:')\n console.log(info.inputSchema ? JSON.stringify(info.inputSchema, null, 2) : ' (no schema registered)')\n console.log()\n console.log('Example body:')\n console.log(info.example ? JSON.stringify(info.example, null, 2) : ' (no example available)')\n}\n\n/**\n * `deepspace invoke <target>` / `deepspace integrations invoke <target>`\n * Performs the actual integration call.\n */\nexport async function runInvoke(args: InvokeArgs): Promise<void> {\n const { integration, endpoint } = parseTarget(args.target)\n const body = resolveBody({ body: args.body, bodyFile: args.bodyFile })\n const timeoutMs = args.timeout ?? DEFAULT_TIMEOUT_MS\n\n let jwt: string\n try {\n jwt = await ensureToken()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(msg)\n }\n\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n const startedAt = Date.now()\n\n let res: Response\n try {\n res = await fetch(`${API_URL}/api/integrations/${integration}/${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${jwt}`,\n },\n body,\n signal: controller.signal,\n })\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(`Request timed out after ${timeoutMs}ms`)\n }\n throw new Error(err instanceof Error ? err.message : 'Request failed')\n } finally {\n clearTimeout(timer)\n }\n\n const elapsed = Date.now() - startedAt\n let payload: Record<string, unknown>\n try {\n payload = (await res.json()) as Record<string, unknown>\n } catch {\n throw new Error(`Request failed (${res.status}) with non-JSON response`)\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify(payload) + '\\n')\n await flushAndExit(payload?.success === false || !res.ok ? 1 : 0)\n }\n\n const ok = payload?.success !== false && res.ok\n if (ok) {\n const data = 'data' in payload ? payload.data : payload\n console.log(JSON.stringify(data, null, 2))\n console.error(`\\n✓ ${integration}/${endpoint} (${elapsed}ms)`)\n return\n }\n\n // Error path\n const errMsg = (payload.error as string) ?? `Request failed (${res.status})`\n console.error(`✗ ${integration}/${endpoint} (${res.status}, ${elapsed}ms): ${errMsg}`)\n if (Array.isArray(payload.issues)) {\n for (const issue of payload.issues as Array<{ path?: string[]; message: string }>) {\n const path = issue.path?.length ? issue.path.join('.') : '(root)'\n console.error(` - ${path}: ${issue.message}`)\n }\n }\n if (res.status === 401) {\n console.error(\"\\nHint: run 'deepspace login' to authenticate.\")\n }\n process.exit(1)\n}\n","/**\n * deepspace invoke <integration>/<endpoint> [options]\n *\n * Top-level alias for `deepspace integrations invoke ...`. Calls a platform\n * integration as the currently logged-in user — the same identity shown by\n * `deepspace whoami`. That user is billed.\n *\n * deepspace invoke openai/chat-completion --body '{\"messages\":[...]}'\n * deepspace invoke openai/chat-completion --body-file req.json\n * cat req.json | deepspace invoke openai/chat-completion --body-file -\n * deepspace invoke openai/chat-completion --info\n * deepspace invoke --list\n */\n\nimport { defineCommand } from 'citty'\nimport { runInvoke, runInfo, runList } from './_invoke-impl'\n\nexport default defineCommand({\n meta: {\n name: 'invoke',\n description: 'Invoke a platform integration as the logged-in user',\n },\n args: {\n target: {\n type: 'positional',\n description: \"<integration>/<endpoint> (e.g. 'openai/chat-completion')\",\n required: false,\n },\n body: {\n type: 'string',\n alias: 'd',\n description: 'Inline JSON body',\n required: false,\n },\n 'body-file': {\n type: 'string',\n alias: 'f',\n description: 'Read JSON body from file (use - for stdin)',\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the response JSON (machine-readable)',\n default: false,\n },\n info: {\n type: 'boolean',\n description: 'Print schema + example body for the endpoint, then exit',\n default: false,\n },\n list: {\n type: 'boolean',\n description: 'Print all available integrations, then exit',\n default: false,\n },\n timeout: {\n type: 'string',\n description: 'Request timeout in milliseconds (default: 120000)',\n required: false,\n },\n },\n async run({ args }) {\n try {\n if (args.list) {\n await runList({ json: args.json })\n return\n }\n if (args.info) {\n await runInfo({ target: args.target as string, json: args.json })\n return\n }\n const timeout = args.timeout != null ? Number(args.timeout) : undefined\n if (timeout != null && (!Number.isFinite(timeout) || timeout <= 0)) {\n throw new Error(`Invalid --timeout '${args.timeout}'. Must be a positive number of milliseconds.`)\n }\n await runInvoke({\n target: args.target as string,\n body: args.body,\n bodyFile: args['body-file'],\n json: args.json,\n timeout,\n })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n","/**\n * deepspace managed-repos\n *\n * Manage DeepSpace-owned GitHub repos. These are private repositories in the\n * DeepSpace-managed GitHub org, intended for users who do not have or do not\n * want to connect their own GitHub account.\n */\n\nimport { defineCommand } from 'citty'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\nconst SIMPLE_APP_ID = /^[a-z0-9][a-z0-9_.:-]{0,119}$/i\nconst SIMPLE_APP_NAME = /^[a-z0-9][a-z0-9_-]{0,119}$/i\n\ntype ManagedRepo = {\n id: string\n appId: string\n appName: string\n fullName: string\n owner: string\n name: string\n htmlUrl: string\n cloneUrl: string\n}\n\ntype RepoQuota = {\n limit: number\n activeCount: number\n remaining: number\n}\n\ntype RepoToken = {\n token: string\n expiresAt: string\n permissions?: Record<string, string>\n repositorySelection?: string\n}\n\ntype DeletionQuota = {\n limit: number\n deletedCount: number\n remaining: number\n}\n\nasync function api<T>(token: string, path: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${API_URL}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n })\n const text = await res.text()\n if (!res.ok) {\n let msg = text\n try {\n msg = (JSON.parse(text) as { error?: string }).error ?? text\n } catch {\n // not JSON\n }\n throw new Error(`API ${path} (${res.status}): ${msg}`)\n }\n return JSON.parse(text) as T\n}\n\nfunction defaultAppId(appName: string): string {\n return `cli-${slugId(appName)}`\n}\n\nfunction slugId(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'app'\n}\n\nfunction assertSimple(value: string, pattern: RegExp, label: string): void {\n if (!pattern.test(value)) {\n throw new Error(`${label} must start with a letter or number and contain only simple identifier characters.`)\n }\n}\n\nfunction printQuota(quota: RepoQuota): void {\n console.log(`Repo quota: ${quota.activeCount} / ${quota.limit} active (${quota.remaining} remaining)`)\n}\n\nfunction printRepo(repo: ManagedRepo): void {\n console.log(`${repo.fullName}`)\n console.log(` ID: ${repo.id}`)\n console.log(` App: ${repo.appName}`)\n console.log(` App ID: ${repo.appId}`)\n console.log(` URL: ${repo.htmlUrl}`)\n console.log(` Clone: ${repo.cloneUrl}`)\n}\n\nasync function confirm(message: string): Promise<boolean> {\n if (!process.stdin.isTTY) {\n throw new Error(`${message} — pass --yes to confirm non-interactively`)\n }\n process.stdout.write(`${message} [y/N] `)\n return new Promise((resolve) => {\n process.stdin.setEncoding('utf-8')\n process.stdin.once('data', (data) => {\n const answer = data.toString().trim().toLowerCase()\n resolve(answer === 'y' || answer === 'yes')\n })\n })\n}\n\nconst list = defineCommand({\n meta: {\n name: 'list',\n description: 'List your DeepSpace-managed repos and quota',\n },\n args: {\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const token = await ensureToken()\n const result = await api<{ repos: ManagedRepo[]; quota: RepoQuota }>(token, '/api/github/repos')\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n printQuota(result.quota)\n if (result.repos.length === 0) {\n console.log('No DeepSpace-managed repos. Create one with `deepspace managed-repos create <app-name>`.')\n return\n }\n\n console.log('')\n for (const repo of result.repos) {\n printRepo(repo)\n }\n },\n})\n\nconst create = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a private DeepSpace-managed GitHub repo',\n },\n args: {\n appName: {\n type: 'positional',\n description: 'Working app name for this repo',\n required: true,\n },\n appId: {\n type: 'string',\n description: 'Stable DeepSpace repo app id (defaults to cli-<app-name>)',\n required: false,\n },\n nameHint: {\n type: 'string',\n description: 'Repo-name hint (defaults to app name)',\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const appName = String(args.appName)\n const appId = args.appId ? String(args.appId) : defaultAppId(appName)\n const nameHint = args.nameHint ? String(args.nameHint) : undefined\n\n try {\n assertSimple(appName, SIMPLE_APP_NAME, 'appName')\n assertSimple(appId, SIMPLE_APP_ID, 'appId')\n if (nameHint) assertSimple(nameHint, SIMPLE_APP_NAME, 'nameHint')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n\n const token = await ensureToken()\n const result = await api<{ repo: ManagedRepo; alreadyExists: boolean }>(token, '/api/github/repos', {\n method: 'POST',\n body: JSON.stringify({ appName, appId, ...(nameHint ? { nameHint } : {}) }),\n })\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n console.log(result.alreadyExists ? 'Existing DeepSpace-managed repo:' : 'Created DeepSpace-managed repo:')\n printRepo(result.repo)\n },\n})\n\nconst token = defineCommand({\n meta: {\n name: 'token',\n description: 'Mint a short-lived GitHub token for a DeepSpace-managed repo',\n },\n args: {\n repoId: {\n type: 'positional',\n description: 'Repo id from `deepspace managed-repos list`',\n required: true,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const jwt = await ensureToken()\n const result = await api<{ repo: ManagedRepo; token: RepoToken }>(\n jwt,\n `/api/github/repos/${encodeURIComponent(String(args.repoId))}/agent-token`,\n { method: 'POST' },\n )\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n console.log(`Repo: ${result.repo.fullName}`)\n console.log(`Expires: ${result.token.expiresAt}`)\n console.log(`Token: ${result.token.token}`)\n console.log('')\n console.log(`Clone: git clone https://x-access-token:${encodeURIComponent(result.token.token)}@github.com/${result.repo.fullName}.git`)\n },\n})\n\nconst remove = defineCommand({\n meta: {\n name: 'delete',\n description: 'Delete a DeepSpace-managed GitHub repo',\n },\n args: {\n repoId: {\n type: 'positional',\n description: 'Repo id from `deepspace managed-repos list`',\n required: true,\n },\n yes: {\n type: 'boolean',\n description: 'Skip the confirmation prompt',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n if (!args.yes) {\n try {\n const ok = await confirm(\n 'Delete this DeepSpace-managed GitHub repo? This removes the GitHub repository and counts against your daily delete quota.',\n )\n if (!ok) {\n console.log('Cancelled.')\n return\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n\n const jwt = await ensureToken()\n const result = await api<{ repo: ManagedRepo; deletionQuota: DeletionQuota }>(\n jwt,\n `/api/github/repos/${encodeURIComponent(String(args.repoId))}`,\n { method: 'DELETE' },\n )\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n console.log(`Deleted ${result.repo.fullName}`)\n console.log(\n `Delete quota: ${result.deletionQuota.deletedCount} / ${result.deletionQuota.limit} used today (${result.deletionQuota.remaining} remaining)`,\n )\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'managed-repos',\n description: 'Create and manage DeepSpace-owned GitHub repos',\n },\n subCommands: {\n list,\n create,\n token,\n delete: remove,\n },\n})\n","/**\n * deepspace library [publish|unpublish] [options]\n *\n * Manage entries in the DeepSpace community library (lives at\n * deepdotspace-site.app.space by default; override with --library-app\n * or DEEPSPACE_LIBRARY_HOST). Subcommands POST to that app's\n * `library.publish` / `library.unpublish` actions as the currently\n * logged-in user.\n *\n * The publish action verifies the caller owns the deployed app (by\n * checking the deploy worker's `/api/apps` registry) before writing\n * the row, so publishing another user's app is rejected server-side.\n *\n * Usage:\n * deepspace library publish (uses wrangler.toml)\n * deepspace library publish --app my-cool-app --name \"My Cool App\"\n * deepspace library publish --description \"...\" --category Productivity\n * deepspace library publish --tags utility,ai --visibility unlisted\n * deepspace library unpublish <handle>\n */\n\nimport { defineCommand } from 'citty'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { parse as parseToml } from 'smol-toml'\nimport * as p from '@clack/prompts'\n\nimport { ensureToken } from '../auth'\nimport { resolveAppName } from '../../server/rooms/app-name'\n\nconst DEFAULT_LIBRARY_APP = 'deepdotspace-site'\n\nconst publish = defineCommand({\n meta: {\n name: 'publish',\n description: 'Publish the current app to the DeepSpace library',\n },\n args: {\n dir: {\n type: 'string',\n description: 'App directory (default: current directory)',\n required: false,\n },\n app: {\n type: 'string',\n description: 'App name (default: read from wrangler.toml)',\n required: false,\n },\n name: {\n type: 'string',\n description: 'Display name (default: app name)',\n required: false,\n },\n description: {\n type: 'string',\n description: 'Short description',\n required: false,\n },\n category: {\n type: 'string',\n description: 'Category (e.g. Productivity, Finance, AI). Default: General',\n required: false,\n },\n tags: {\n type: 'string',\n description: 'Comma-separated tags',\n required: false,\n },\n visibility: {\n type: 'string',\n description: \"'public' (default), 'unlisted', or 'private'\",\n required: false,\n },\n screenshot: {\n type: 'string',\n description: 'Override the auto-captured preview with a public PNG URL',\n required: false,\n },\n 'library-app': {\n type: 'string',\n description: `Target library app subdomain (default: ${DEFAULT_LIBRARY_APP})`,\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the JSON response (machine-readable)',\n default: false,\n },\n },\n async run({ args }) {\n const json = !!args.json\n const intro = (s: string) => { if (!json) p.intro(s) }\n const info = (s: string) => { if (!json) p.log.info(s) }\n const die = (msg: string) => {\n if (json) console.error(JSON.stringify({ ok: false, error: msg }))\n else p.cancel(msg)\n process.exit(1)\n }\n\n intro('Publishing to the DeepSpace library')\n\n let appName = typeof args.app === 'string' && args.app.trim() ? args.app.trim() : undefined\n if (!appName) {\n const appDir = resolve(typeof args.dir === 'string' && args.dir ? args.dir : '.')\n const wranglerPath = join(appDir, 'wrangler.toml')\n if (!existsSync(wranglerPath)) {\n return die(\"No --app provided and no wrangler.toml found. Either pass --app <name> or run from your app's directory.\")\n }\n const cfg = parseToml(readFileSync(wranglerPath, 'utf-8')) as { name?: string }\n const nameRes = resolveAppName(cfg.name)\n if (!nameRes.ok) return die(`wrangler.toml: ${nameRes.reason}`)\n appName = nameRes.name\n }\n info(`App: ${appName}`)\n\n const visibility = (args.visibility ?? 'public') as string\n if (!['public', 'private', 'unlisted'].includes(visibility)) {\n return die(\"--visibility must be 'public', 'unlisted', or 'private'.\")\n }\n\n const tags = typeof args.tags === 'string' && args.tags\n ? args.tags.split(',').map((t) => t.trim()).filter(Boolean)\n : undefined\n\n const libraryApp = typeof args['library-app'] === 'string' && args['library-app']\n ? args['library-app']\n : DEFAULT_LIBRARY_APP\n const libraryHost = process.env.DEEPSPACE_LIBRARY_HOST ?? `https://${libraryApp}.app.space`\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err) {\n return die(err instanceof Error ? err.message : String(err))\n }\n\n const payload: Record<string, unknown> = {\n appName,\n ...(args.name ? { name: args.name } : {}),\n ...(args.description ? { description: args.description } : {}),\n ...(args.category ? { category: args.category } : {}),\n ...(tags ? { tags } : {}),\n visibility,\n ...(args.screenshot ? { screenshotUrl: args.screenshot } : {}),\n }\n\n const url = `${libraryHost}/api/actions/library.publish`\n let res: Response\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(payload),\n })\n } catch (err) {\n return die(`Network error reaching ${url}: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n const body = await res.text()\n let parsed: { success?: boolean; data?: { templateHandle?: string; url?: string; version?: number }; error?: string }\n try {\n parsed = JSON.parse(body)\n } catch {\n return die(`Server returned non-JSON (${res.status}): ${body.slice(0, 400)}`)\n }\n\n if (json) {\n console.log(JSON.stringify(parsed))\n process.exit(parsed.success ? 0 : 1)\n }\n\n if (!parsed.success) {\n return die(parsed.error ?? `Publish failed (HTTP ${res.status}).`)\n }\n\n p.log.success(`Published ${appName} as ${parsed.data?.templateHandle} (v${parsed.data?.version})`)\n if (parsed.data?.url) p.log.message(parsed.data.url)\n p.outro('Done')\n },\n})\n\nconst unpublish = defineCommand({\n meta: {\n name: 'unpublish',\n description: 'Remove a library entry (owner or admin only)',\n },\n args: {\n handle: {\n type: 'positional',\n description: 'templateHandle to remove (usually your app name)',\n required: true,\n },\n 'library-app': {\n type: 'string',\n description: `Target library app subdomain (default: ${DEFAULT_LIBRARY_APP})`,\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the JSON response',\n default: false,\n },\n },\n async run({ args }) {\n const json = !!args.json\n const die = (msg: string) => {\n if (json) console.error(JSON.stringify({ ok: false, error: msg }))\n else p.cancel(msg)\n process.exit(1)\n }\n if (!json) p.intro('Unpublishing library entry')\n\n let token: string\n try { token = await ensureToken() } catch (err) {\n return die(err instanceof Error ? err.message : String(err))\n }\n\n const libraryApp = typeof args['library-app'] === 'string' && args['library-app']\n ? args['library-app']\n : DEFAULT_LIBRARY_APP\n const libraryHost = process.env.DEEPSPACE_LIBRARY_HOST ?? `https://${libraryApp}.app.space`\n\n const res = await fetch(`${libraryHost}/api/actions/library.unpublish`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },\n body: JSON.stringify({ templateHandle: String(args.handle) }),\n })\n const body = await res.text()\n let parsed: { success?: boolean; error?: string; data?: { templateHandle?: string } }\n try { parsed = JSON.parse(body) } catch {\n return die(`Server returned non-JSON (${res.status}): ${body.slice(0, 400)}`)\n }\n if (json) { console.log(JSON.stringify(parsed)); process.exit(parsed.success ? 0 : 1) }\n if (!parsed.success) return die(parsed.error ?? `HTTP ${res.status}`)\n p.log.success(`Unpublished ${parsed.data?.templateHandle}`)\n p.outro('Done')\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'library',\n description: 'Manage your DeepSpace library entries',\n },\n subCommands: {\n publish,\n unpublish,\n },\n})\n","/**\n * deepspace admin\n *\n * Maintainer-only operations gated by DEEPSPACE_ADMIN_SECRET.\n */\n\nimport { defineCommand } from 'citty'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { ENVS } from '../env'\nimport { TOKEN_PATH } from '../auth'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nconst impersonate = defineCommand({\n meta: {\n name: 'impersonate',\n description: 'Store a short-lived CLI token for another user',\n },\n args: {\n email: {\n type: 'string',\n description: 'Target user email',\n required: false,\n },\n userId: {\n type: 'string',\n description: 'Target user id',\n required: false,\n },\n secret: {\n type: 'string',\n description: 'Admin secret; defaults to DEEPSPACE_ADMIN_SECRET',\n required: false,\n },\n },\n async run({ args }) {\n const secret = args.secret ?? process.env.DEEPSPACE_ADMIN_SECRET\n if (!secret) {\n console.error('Missing admin secret. Set DEEPSPACE_ADMIN_SECRET or pass --secret.')\n process.exit(1)\n }\n if (!args.email && !args.userId) {\n console.error('Pass --email or --userId.')\n process.exit(1)\n }\n\n const res = await fetch(`${AUTH_URL}/api/auth/admin/impersonate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${secret}`,\n },\n body: JSON.stringify({\n email: args.email,\n userId: args.userId,\n }),\n })\n\n const data = (await res.json().catch(() => ({}))) as {\n token?: string\n user?: { id: string; name?: string | null; email?: string | null }\n error?: string\n }\n\n if (!res.ok || !data.token || !data.user) {\n console.error(`Failed: ${data.error ?? `HTTP ${res.status}`}`)\n process.exit(1)\n }\n\n const dir = join(homedir(), '.deepspace')\n mkdirSync(dir, { recursive: true })\n writeFileSync(TOKEN_PATH, data.token, { mode: 0o600 })\n\n console.log(`Impersonating ${data.user.name ?? data.user.email ?? data.user.id}`)\n console.log(`Email: ${data.user.email ?? '(none)'}`)\n console.log(`UserID: ${data.user.id}`)\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'admin',\n description: 'Maintainer-only admin commands',\n },\n subCommands: {\n impersonate,\n },\n})\n"],"mappings":"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","names":["defineCommand","execSync","readFileSync","existsSync","dirname","join","writeFileSync","join","p","existsSync","readFileSync","join","join","existsSync","readFileSync","join","writeFileSync","resolve","defineCommand","existsSync","readFileSync","join","homedir","AUTH_URL","join","homedir","defineCommand","existsSync","readFileSync","defineCommand","resolve","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","token","AUTH_URL","DIR","join","homedir","SESSION_PATH","TOKEN_PATH","existsSync","readFileSync","token","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseToml","existsSync","readFileSync","join","existsSync","resolve","status","defineCommand","resolve","token","defineCommand","DEFAULT_PORT","resolvePort","defineCommand","resolve","spawnSync","spawnSync","DEFAULT_PORT","defineCommand","resolvePort","resolve","token","spawnSync","defineCommand","spawnSync","resolve","defineCommand","resolve","spawnSync","defineCommand","p","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","SESSION_COOKIE","AUTH_URL","DIR","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","token","SESSION_PATH","defineCommand","defineCommand","execSync","readFileSync","readdirSync","existsSync","join","resolve","dirname","p","status","token","defineCommand","resolve","execSync","join","existsSync","readFileSync","dirname","wait","readdirSync","defineCommand","p","DEPLOY_URL","defineCommand","token","defineCommand","defineCommand","defineCommand","existsSync","resolve","join","execSync","join","existsSync","defineCommand","resolve","execSync","defineCommand","spawn","mkdirSync","join","homedir","resolve","spawn","mkdirSync","join","defineCommand","homedir","defineCommand","execSync","API_URL","token","confirm","resolve","defineCommand","openBrowser","list","execSync","defineCommand","list","defineCommand","readFileSync","API_URL","readFileSync","info","list","defineCommand","defineCommand","defineCommand","defineCommand","API_URL","api","token","confirm","resolve","list","defineCommand","create","defineCommand","existsSync","readFileSync","join","resolve","parseToml","p","defineCommand","intro","info","resolve","join","existsSync","parseToml","readFileSync","token","defineCommand","mkdirSync","writeFileSync","homedir","join","AUTH_URL","defineCommand","join","homedir","mkdirSync","writeFileSync","TOKEN_PATH","dirname","readFileSync","join","existsSync","create","defineCommand","execSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/cli.ts","../src/cli/commands/login.ts","../src/cli/lib/spinner.ts","../src/cli/env.ts","../src/cli/lib/wrangler-env.ts","../src/server/rooms/app-name.ts","../src/cli/session.ts","../src/cli/commands/logout.ts","../src/cli/commands/dev.ts","../src/cli/auth.ts","../src/cli/jwt.ts","../src/cli/lib/app-context.ts","../src/cli/lib/install-status.ts","../src/cli/lib/preflight.ts","../src/cli/commands/secrets.ts","../src/cli/commands/kill.ts","../src/cli/commands/test.ts","../src/cli/lib/playwright.ts","../src/cli/commands/screenshot.ts","../src/cli/commands/test-accounts.ts","../src/cli/commands/deploy.ts","../src/server/rooms/binding-manifest.ts","../src/cli/commands/undeploy.ts","../src/cli/commands/whoami.ts","../src/cli/commands/add.ts","../src/cli/commands/skills.ts","../src/cli/commands/domain.ts","../src/cli/commands/integrations.ts","../src/cli/commands/_invoke-impl.ts","../src/cli/commands/invoke.ts","../src/cli/commands/managed-repos.ts","../src/cli/commands/library.ts","../src/cli/commands/admin.ts","../src/cli/commands/feedback.ts"],"sourcesContent":["/**\n * DeepSpace CLI\n *\n * Commands:\n * login — authenticate with your DeepSpace account\n * deploy — build and deploy your app to *.app.space\n * undeploy — remove a deployed app\n * managed-repos — manage DeepSpace-owned GitHub repos\n * create — redirects to `npm create deepspace`\n */\n\nimport { defineCommand, runMain } from 'citty'\nimport { execSync } from 'node:child_process'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport login from './commands/login'\nimport logout from './commands/logout'\nimport dev from './commands/dev'\nimport kill from './commands/kill'\nimport test from './commands/test'\nimport screenshot from './commands/screenshot'\nimport testAccounts from './commands/test-accounts'\nimport deploy from './commands/deploy'\nimport undeploy from './commands/undeploy'\nimport whoami from './commands/whoami'\nimport add from './commands/add'\nimport skills from './commands/skills'\nimport domain from './commands/domain'\nimport integrations from './commands/integrations'\nimport invoke from './commands/invoke'\nimport managedRepos from './commands/managed-repos'\nimport library from './commands/library'\nimport admin from './commands/admin'\nimport feedback from './commands/feedback'\nimport secrets from './commands/secrets'\n\n// Read own version from package.json so the CLI banner stays in sync with publishes.\n// __dirname of the bundled output is <pkg>/dist; package.json sits one level up.\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'))\n\n// workerd doesn't auto-discover system CAs in containers — outbound HTTPS to the\n// auth/api workers fails with \"TLS peer's certificate is not trusted\" until we\n// point it at the standard Debian/Ubuntu cert bundle. Harmless on macOS (path\n// doesn't exist, env var not set).\nif (\n process.platform === 'linux' &&\n !process.env.SSL_CERT_FILE &&\n existsSync('/etc/ssl/certs/ca-certificates.crt')\n) {\n process.env.SSL_CERT_FILE = '/etc/ssl/certs/ca-certificates.crt'\n}\n\nconst create = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a new DeepSpace app',\n },\n args: {\n name: {\n type: 'positional',\n description: 'App name',\n required: false,\n },\n },\n run({ args }) {\n const name = args.name ? ` ${args.name}` : ''\n console.log(`Running: npm create deepspace${name}\\n`)\n execSync(`npm create deepspace@latest${name}`, { stdio: 'inherit' })\n },\n})\n\nconst main = defineCommand({\n meta: {\n name: 'deepspace',\n version: pkg.version,\n description: 'DeepSpace SDK CLI',\n },\n subCommands: {\n create,\n login,\n logout,\n whoami,\n dev,\n kill,\n test,\n screenshot,\n 'test-accounts': testAccounts,\n add,\n skills,\n integrations,\n 'managed-repos': managedRepos,\n invoke,\n deploy,\n undeploy,\n domain,\n library,\n admin,\n feedback,\n secrets,\n },\n // No `run()` here — citty cascades parent run() AFTER subcommand finishes,\n // which corrupts agent-friendly output (`--json`) and prints noise on every\n // command. Citty's default behavior when no subcommand matches is to print\n // help, which is what we want for `deepspace` with no args.\n})\n\nrunMain(main)\n","/**\n * deepspace login\n *\n * Opens the browser to sign in with GitHub or Google.\n * CLI polls the auth worker until login is complete.\n *\n * deepspace login # browser-based OAuth\n * deepspace login --email x --password y # non-interactive (CI/agents)\n */\n\nimport { defineCommand } from 'citty'\nimport { writeFileSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { exec } from 'node:child_process'\nimport { platform } from 'node:os'\nimport { randomBytes, createHash } from 'node:crypto'\nimport * as p from '@clack/prompts'\n\nimport { createSpinner } from '../lib/spinner'\nimport { DASHBOARD_URL, ENVS } from '../env'\nimport { exchangeSession, SESSION_COOKIE } from '../session'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nexport default defineCommand({\n meta: {\n name: 'login',\n description: 'Log in to your DeepSpace account',\n },\n args: {\n email: {\n type: 'string',\n description: 'Email address (non-interactive mode)',\n required: false,\n },\n password: {\n type: 'string',\n description: 'Password (non-interactive mode)',\n required: false,\n },\n },\n async run({ args }) {\n // Non-interactive mode for CI/agents with email+password\n if (args.email && args.password) {\n console.log(`Signing in as ${args.email}...`)\n await doEmailLogin(args.email, args.password)\n console.log('Logged in')\n return\n }\n\n // Browser-based OAuth flow\n p.intro('DeepSpace Login')\n\n const s = createSpinner()\n s.start('Creating login session...')\n\n // PKCE: generate a random verifier and send only its SHA-256 hash to the\n // server. The verifier never leaves this process, so the loginUrl alone\n // can't be used to drain credentials at /status — only this CLI can.\n const codeVerifier = base64url(randomBytes(32))\n const codeChallenge = base64url(createHash('sha256').update(codeVerifier).digest())\n\n // 1. Create a CLI session\n const sessionRes = await fetch(`${AUTH_URL}/api/auth/cli/session`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code_challenge: codeChallenge }),\n })\n if (!sessionRes.ok) {\n s.stop('Failed')\n p.cancel('Could not create login session')\n process.exit(1)\n }\n const sessionData = (await sessionRes.json()) as {\n sessionId?: string\n loginUrl?: string\n }\n if (!sessionData.sessionId || !sessionData.loginUrl) {\n s.stop('Failed')\n p.cancel('Could not create login session')\n process.exit(1)\n }\n\n const { sessionId, loginUrl } = sessionData as {\n sessionId: string\n loginUrl: string\n }\n\n s.stop('Opening browser...')\n p.log.info(`If the browser doesn't open, visit:\\n ${loginUrl}`)\n\n // 2. Open browser\n openBrowser(loginUrl)\n\n // 3. Poll for completion\n s.start('Waiting for authentication...')\n const result = await pollForCompletion(sessionId, codeVerifier)\n\n if (!result) {\n s.stop('Timed out')\n p.cancel('Login timed out. Run `deepspace login` to try again.')\n process.exit(1)\n }\n\n // 4. Store credentials\n storeCredentials(result.sessionToken, result.jwt)\n\n s.stop('Authenticated')\n p.log.success(`Logged in as ${result.name ?? result.email}`)\n p.note(\n `Manage your account, deployed apps, billing, and subscription\\nplans on the web dashboard:\\n\\n ${DASHBOARD_URL}`,\n 'Dashboard',\n )\n p.outro('Done')\n },\n})\n\ninterface LoginResult {\n sessionToken: string\n jwt: string\n email: string\n name: string | null\n}\n\nasync function pollForCompletion(\n sessionId: string,\n codeVerifier: string,\n): Promise<LoginResult | null> {\n const maxAttempts = 120 // 10 minutes at 5s intervals\n const interval = 5000\n\n for (let i = 0; i < maxAttempts; i++) {\n await sleep(interval)\n\n try {\n const res = await fetch(`${AUTH_URL}/api/auth/cli/status/${sessionId}`, {\n headers: { 'x-code-verifier': codeVerifier },\n })\n\n if (res.status === 410 || res.status === 404) return null // expired / not found\n if (!res.ok) continue\n\n const data = (await res.json()) as {\n state?: string\n sessionToken?: string\n jwt?: string\n email?: string\n name?: string\n }\n\n if (data.state === 'complete' && data.sessionToken && data.jwt) {\n return {\n sessionToken: data.sessionToken,\n jwt: data.jwt,\n email: data.email ?? '',\n name: data.name ?? null,\n }\n }\n } catch {\n // Network error, keep polling\n }\n }\n\n return null\n}\n\nfunction storeCredentials(sessionToken: string, jwt: string) {\n const dir = join(homedir(), '.deepspace')\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n writeFileSync(join(dir, 'session'), sessionToken, { mode: 0o600 })\n writeFileSync(join(dir, 'token'), jwt, { mode: 0o600 })\n}\n\nfunction openBrowser(url: string) {\n const cmd =\n platform() === 'darwin'\n ? `open \"${url}\"`\n : platform() === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`\n\n exec(cmd, () => {\n // Ignore errors — we already showed the URL\n })\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction base64url(bytes: Buffer): string {\n return bytes.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n// ── Email/password login (for test accounts and CI) ────────────────\n\nasync function doEmailLogin(email: string, password: string): Promise<void> {\n const res = await fetch(`${AUTH_URL}/api/auth/sign-in/email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Origin: AUTH_URL },\n body: JSON.stringify({ email, password }),\n redirect: 'manual',\n })\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { message?: string }\n throw new Error(body.message ?? `Authentication failed (${res.status})`)\n }\n\n const setCookie = res.headers.get('set-cookie') ?? ''\n const cookieMatch = setCookie.match(new RegExp(`${SESSION_COOKIE}=([^;]+)`))\n if (!cookieMatch) {\n throw new Error('No session cookie returned')\n }\n const sessionToken = decodeURIComponent(cookieMatch[1])\n\n const jwt = await exchangeSession(AUTH_URL, sessionToken)\n if (!jwt) {\n throw new Error('JWT issuance failed')\n }\n\n storeCredentials(sessionToken, jwt)\n}\n","import * as p from '@clack/prompts'\n\n// In a real terminal, @clack/prompts repaints the spinner by writing `\\r`\n// to overwrite the previous frame. In non-TTY contexts (agents, CI logs,\n// pipes, `tee`-ed output) `\\r` does nothing and every frame becomes a new\n// line — a single long phase floods the log with thousands of repeats.\n// When stdout is not a TTY we fall back to one static line per phase.\nexport function createSpinner(): {\n start: (msg?: string) => void\n stop: (msg?: string) => void\n message: (msg?: string) => void\n} {\n if (process.stdout.isTTY) return p.spinner()\n return {\n start: (msg?: string) => { if (msg) console.log(msg) },\n stop: (msg?: string) => { if (msg) console.log(msg) },\n message: (msg?: string) => { if (msg) console.log(msg) },\n }\n}\n","/**\n * DeepSpace environment configuration.\n *\n * Shared between `dev`, `test`, and `deploy` commands.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport {\n resolveAppNameForEnv,\n readWranglerConfig,\n hasWranglerConfig,\n} from './lib/wrangler-env'\n\nconst ENV_URLS = {\n auth: 'https://auth.deep.space',\n api: 'https://api-worker.deep.space',\n platform: 'https://platform-worker.deep.space',\n deploy: 'https://deploy-worker.deep.space',\n} as const\n\nexport const ENVS = {\n dev: ENV_URLS,\n prod: ENV_URLS,\n} as const\n\nexport type EnvName = keyof typeof ENVS\n\n/**\n * Web dashboard for managing deployed apps, billing, subscription plans,\n * earnings, etc. Linked from `login` and `whoami` so developers\n * discover it (the CLI alone gives no hint that it exists).\n */\nexport const DASHBOARD_URL = 'https://dashboard.deep.space'\n\n/**\n * Fetch the JWT public key from an auth worker's /api/auth/jwks endpoint.\n */\nexport async function fetchPublicKey(authUrl: string): Promise<string> {\n const res = await fetch(`${authUrl}/api/auth/jwks`)\n if (!res.ok) {\n throw new Error(`Failed to fetch JWT public key (${res.status})`)\n }\n const data = (await res.json()) as { publicKey?: string }\n if (!data.publicKey) {\n throw new Error('JWKS response missing publicKey')\n }\n return data.publicKey\n}\n\n/**\n * Read the app name from the app's wrangler.toml. A non-canonical `name`\n * (e.g. `My_App` vs. `my-app`) is rejected with a clear error so wrangler.toml\n * stays the single source of truth — otherwise the canonical form would land\n * on deployed bindings and the registry while the raw form persisted in\n * `[vars].APP_NAME` and the client `SCOPE_ID`, splitting identity across\n * surfaces.\n *\n * `deepspace dev` runs in an app directory; the name is required.\n */\nfunction readAppName(appDir: string, wranglerEnv?: string): string {\n if (!hasWranglerConfig(appDir)) {\n throw new Error('No wrangler.toml found. Are you in a DeepSpace app directory?')\n }\n const config = readWranglerConfig(appDir)\n // Single source of truth — every command (deploy, dev, undeploy)\n // resolves through `resolveAppNameForEnv` so the validation rules\n // (missing block, empty name, collision with the top-level name,\n // canonical form) can never drift between them.\n const resolved = resolveAppNameForEnv(config, wranglerEnv)\n if (!resolved.ok) throw new Error(resolved.reason)\n\n // Refuse to proceed when the declared name doesn't already match the\n // canonical form. Otherwise the canonical name lands on deployed bindings\n // and the registry, while the raw name persists in `[vars].APP_NAME` and\n // client-side `SCOPE_ID = app:${APP_NAME}` — splitting the identity across\n // surfaces. Failing here forces the dev to fix wrangler.toml once, after\n // which every surface reads from the same source of truth.\n const rawName = wranglerEnv ? config.env?.[wranglerEnv]?.name : config.name\n if (rawName !== resolved.name) {\n const where = wranglerEnv ? `[env.${wranglerEnv}].name` : '`name`'\n throw new Error(\n `wrangler.toml: ${where} \"${rawName}\" is not in canonical form. ` +\n `Update it to \"${resolved.name}\" and re-run.`,\n )\n }\n return resolved.name\n}\n\n/**\n * Mint a long-lived app-owner JWT from the auth worker.\n *\n * The caller passes their own short-lived user JWT (obtained via\n * `ensureToken()` from auth.ts) and the target env's auth URL. The auth\n * worker verifies the caller, signs a 10-year owner-scoped token bound to\n * `appName`, and returns it. This same token is used in dev (written into\n * `.dev.vars`) and in production (injected as a secret at deploy time).\n */\nexport async function mintAppOwnerJwt(\n authUrl: string,\n callerJwt: string,\n appName: string,\n): Promise<string> {\n const res = await fetch(`${authUrl}/api/auth/mint-app-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${callerJwt}`,\n },\n body: JSON.stringify({ appName }),\n })\n if (!res.ok) {\n const err = await res.text().catch(() => '')\n throw new Error(`Failed to mint APP_OWNER_JWT (${res.status}): ${err}`)\n }\n const body = (await res.json()) as { token?: string; error?: string }\n if (!body.token) {\n throw new Error(`Auth worker returned no token: ${body.error ?? 'unknown error'}`)\n }\n return body.token\n}\n\n/**\n * Fetch the per-app HMAC identity token from the deploy worker. The starter's\n * /_deepspace/* proxy attaches this token on every call to the API worker so\n * the platform can verify the request originated from a known app. In\n * production this is minted at deploy time and injected as a Worker binding;\n * in local dev we fetch it via this endpoint, which is gated by app ownership.\n */\nexport async function fetchAppIdentityToken(\n deployUrl: string,\n callerJwt: string,\n appName: string,\n): Promise<string | null> {\n const res = await fetch(\n `${deployUrl}/api/apps/${encodeURIComponent(appName)}/identity-token`,\n {\n method: 'POST',\n headers: { Authorization: `Bearer ${callerJwt}` },\n },\n )\n if (res.status === 404) {\n // App hasn't been deployed yet — pre-deploy dev workflow. The proxy will\n // 401 calls under /_deepspace/* until first deploy registers the app.\n return null\n }\n if (!res.ok) {\n const err = await res.text().catch(() => '')\n throw new Error(`Failed to fetch APP_IDENTITY_TOKEN (${res.status}): ${err}`)\n }\n const body = (await res.json()) as { token?: string; error?: string }\n if (!body.token) {\n throw new Error(`Deploy worker returned no token: ${body.error ?? 'unknown error'}`)\n }\n return body.token\n}\n\n/**\n * Keys the SDK manages in local env files. For fresh apps these live in\n * managed `.env`; legacy apps with an existing `.dev.vars` keep using the\n * top section of `.dev.vars`. They're rewritten on every `deepspace dev` /\n * `test` / `deploy` run from the platform's truth\n * (auth URL, owner JWT, identity token, etc.). Keys that match this set\n * are stripped from the top section on read so they don't double-write.\n *\n * Critically: this set is only consulted ABOVE the user-managed divider.\n * Once we cross the divider into the \"user owns it\" section, EVERYTHING\n * is preserved. App-owned secrets are managed by `deepspace secrets` and\n * are no longer deployed from `.dev.vars`.\n */\nexport const SDK_MANAGED_KEYS = new Set([\n 'AUTH_JWT_PUBLIC_KEY',\n 'AUTH_JWT_ISSUER',\n 'AUTH_WORKER_URL',\n 'API_WORKER_URL',\n 'PLATFORM_WORKER_URL',\n 'OWNER_USER_ID',\n 'APP_OWNER_JWT',\n 'APP_IDENTITY_TOKEN',\n 'APP_SECRETS_KEY',\n 'APP_SECRETS_LOCAL_FALLBACK',\n 'ALLOW_DEBUG_ROUTES',\n])\n\nexport const MANAGED_ENV_HEADER =\n '# Managed by `deepspace secrets` and regenerated by `deepspace dev`/`deepspace test`.'\nexport const MANAGED_ENV_SYNCED_HEADER =\n '# DeepSpace synced secrets - mirrored with the deployed app secrets store.'\nexport const MANAGED_ENV_DEV_ONLY_HEADER =\n '# DeepSpace dev-only secrets - used by `deepspace dev`; never synced unless pushed.'\n\nexport function localEnvPath(appDir: string): string {\n return join(appDir, '.env')\n}\n\nexport function legacyDevVarsPath(appDir: string, wranglerEnv?: string): string {\n return join(appDir, wranglerEnv ? `.dev.vars.${wranglerEnv}` : '.dev.vars')\n}\n\nexport function hasLegacyDevVars(appDir: string, wranglerEnv?: string): boolean {\n return existsSync(legacyDevVarsPath(appDir, wranglerEnv))\n}\n\n// Marker the SDK writes between its own keys and user-managed content. We\n// recognize and strip this line on read so it doesn't accumulate across runs.\nexport const DEV_VARS_DIVIDER =\n '# --- not managed by the SDK; preserved across dev/test runs ---'\n\n/**\n * Strip SDK-managed lines from an existing legacy .dev.vars file, preserving all\n * other content (comments, blank lines, custom KEY=value pairs, multi-line\n * quoted values). Also strips the SDK divider marker so it doesn't double\n * up across runs.\n *\n * Exported for testing.\n */\nexport function extractCustomDevVars(content: string): string {\n const lines = content.split('\\n')\n const out: string[] = []\n // SDK-managed keys are only stripped ABOVE the divider. Once we cross\n // into the user-owned section, every line is preserved verbatim — so\n // an app can opt into shipping a key the SDK happens to also write\n // (today: `ALLOW_DEBUG_ROUTES=true`) by setting it in that section.\n let belowDivider = false\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n if (line.trim() === DEV_VARS_DIVIDER.trim()) {\n // Drop our own divider — writeDevVars will re-add a single one.\n belowDivider = true\n i++\n continue\n }\n const eq = line.indexOf('=')\n const keyMatch = eq >= 0 ? line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/) : null\n if (!keyMatch) {\n // Comment, blank, or non-key line — preserve verbatim.\n out.push(line)\n i++\n continue\n }\n const key = keyMatch[1]\n const valStart = line.slice(eq + 1)\n const block: string[] = [line]\n // Multi-line quoted value: opens with `\"` and the rest of the line has no\n // closing quote. Keep accumulating until a closing `\"` lands.\n if (valStart.startsWith('\"') && !hasUnescapedQuote(valStart.slice(1))) {\n i++\n while (i < lines.length) {\n block.push(lines[i])\n const closed = hasUnescapedQuote(lines[i])\n i++\n if (closed) break\n }\n } else {\n i++\n }\n if (belowDivider || !SDK_MANAGED_KEYS.has(key)) {\n out.push(...block)\n }\n }\n // Trim trailing blanks so we don't accumulate them across runs.\n while (out.length && out[out.length - 1].trim() === '') out.pop()\n return out.join('\\n')\n}\n\nfunction hasUnescapedQuote(s: string): boolean {\n let escaped = false\n for (const ch of s) {\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') return true\n }\n return false\n}\n\n/**\n * Parse a dotenv-style env string into a key→value map.\n *\n * Handles:\n * - bare KEY=value\n * - KEY=\"quoted value\"\n * - multi-line KEY=\"-----BEGIN ...\\n-----END ...\"\n * - escaped quotes inside (`KEY=\"he said \\\"hi\\\"\"`)\n * - comments and blank lines (skipped)\n *\n * Used by local tooling to read dotenv-style files such as managed `.env`\n * and legacy `.dev.vars`.\n *\n * Exported.\n */\nexport function parseDevVars(content: string): Record<string, string> {\n const result: Record<string, string> = {}\n const lines = content.split('\\n')\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) {\n i++\n continue\n }\n const eq = line.indexOf('=')\n if (eq < 0) {\n i++\n continue\n }\n const keyMatch = line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/)\n if (!keyMatch) {\n i++\n continue\n }\n const key = keyMatch[1]\n let value = line.slice(eq + 1)\n\n // Multi-line quoted value: opens with `\"` and the rest of the line has\n // no closing quote. Keep accumulating until a closing `\"` lands.\n let closed = !value.startsWith('\"') || hasUnescapedQuote(value.slice(1))\n if (!closed) {\n i++\n while (i < lines.length) {\n value += '\\n' + lines[i]\n if (hasUnescapedQuote(lines[i])) {\n closed = true\n i++\n break\n }\n i++\n }\n } else {\n i++\n }\n\n // Reject unterminated quoted values rather than silently corrupting the\n // secret. Without this guard, a `KEY=\"value with no closing quote` line\n // would round-trip through deploy as a literal leading `\"` in the value\n // — a near-impossible bug to debug in production.\n if (value.startsWith('\"') && !closed) {\n throw new Error(\n `parseDevVars: unterminated quoted value for key \"${key}\" — check your .dev.vars file for a missing closing quote.`,\n )\n }\n\n // Strip surrounding quotes (and unescape \\\" within) for quoted values.\n if (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) {\n value = value.slice(1, -1).replace(/\\\\\"/g, '\"')\n }\n\n result[key] = value\n }\n return result\n}\n\nexport function parseDevVarsStrict(content: string, file = '.env'): Record<string, string> {\n const result: Record<string, string> = {}\n const lines = content.split('\\n')\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) {\n i++\n continue\n }\n const eq = line.indexOf('=')\n if (eq < 0) {\n throw new Error(`${file}: invalid dotenv syntax on line ${i + 1}. Expected KEY=value.`)\n }\n const keyMatch = line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/)\n if (!keyMatch) {\n throw new Error(`${file}: invalid variable name on line ${i + 1}.`)\n }\n const key = keyMatch[1]\n let value = line.slice(eq + 1)\n let closed = !value.startsWith('\"') || hasUnescapedQuote(value.slice(1))\n if (!closed) {\n i++\n while (i < lines.length) {\n value += '\\n' + lines[i]\n if (hasUnescapedQuote(lines[i])) {\n closed = true\n i++\n break\n }\n i++\n }\n } else {\n i++\n }\n if (value.startsWith('\"') && !closed) {\n throw new Error(`${file}: unterminated quoted value for key \"${key}\".`)\n }\n if (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) {\n value = value.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\')\n }\n result[key] = value\n }\n return result\n}\n\nexport function quoteEnvValue(value: string): string {\n return /^[A-Za-z0-9_./:@-]*$/.test(value) && !value.includes('\\n')\n ? value\n : `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`\n}\n\nexport function stripSdkManaged(vars: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [name, value] of Object.entries(vars)) {\n if (!SDK_MANAGED_KEYS.has(name)) out[name] = value\n }\n return out\n}\n\nfunction sortRecord(input: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of Object.keys(input).sort()) out[key] = input[key]\n return out\n}\n\nexport interface ManagedEnvSections {\n sdk: Record<string, string>\n synced: Record<string, string>\n devOnly: Record<string, string>\n}\n\nexport function readManagedEnv(appDir: string): Record<string, string> {\n const path = localEnvPath(appDir)\n if (!existsSync(path)) return {}\n return parseDevVarsStrict(readFileSync(path, 'utf-8'), '.env')\n}\n\nexport function readManagedEnvSections(appDir: string): ManagedEnvSections {\n const path = localEnvPath(appDir)\n if (!existsSync(path)) return { sdk: {}, synced: {}, devOnly: {} }\n return parseManagedEnvSections(readFileSync(path, 'utf-8'))\n}\n\nfunction parseManagedEnvSections(content: string): ManagedEnvSections {\n const sections: ManagedEnvSections = { sdk: {}, synced: {}, devOnly: {} }\n const legacyAppLines: string[] = []\n let target: keyof ManagedEnvSections = 'sdk'\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (line.trim() === MANAGED_ENV_SYNCED_HEADER.trim()) {\n target = 'synced'\n continue\n }\n if (line.trim() === MANAGED_ENV_DEV_ONLY_HEADER.trim()) {\n target = 'devOnly'\n continue\n }\n if (line.trim().startsWith('#')) continue\n const name = assignmentName(line)\n if (!name) {\n if (line.trim()) legacyAppLines.push(line)\n continue\n }\n const block = [line]\n const eq = line.indexOf('=')\n const valStart = eq >= 0 ? line.slice(eq + 1) : ''\n if (valStart.startsWith('\"') && !hasUnescapedQuote(valStart.slice(1))) {\n i++\n while (i < lines.length) {\n block.push(lines[i])\n const closed = hasUnescapedQuote(lines[i])\n if (closed) break\n i++\n }\n }\n if (target === 'sdk' && !SDK_MANAGED_KEYS.has(name)) {\n legacyAppLines.push(...block)\n continue\n }\n const parsed = parseDevVarsStrict(block.join('\\n'), '.env')\n Object.assign(sections[target], parsed)\n }\n // Older managed .env files had one app-defined bucket. Treat those values as\n // synced so a first run after upgrade preserves the previous remote-mirror\n // behavior; explicit --dev writes will create the dev-only section.\n if (legacyAppLines.length) {\n Object.assign(sections.synced, stripSdkManaged(parseDevVarsStrict(legacyAppLines.join('\\n'), '.env')))\n }\n return sections\n}\n\nfunction assignmentName(line: string): string | null {\n const eq = line.indexOf('=')\n if (eq < 0) return null\n const match = line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/)\n return match?.[1] ?? null\n}\n\nexport function readManagedAppEnv(appDir: string): Record<string, string> {\n const sections = readManagedEnvSections(appDir)\n return { ...sections.synced, ...sections.devOnly }\n}\n\nexport function readManagedSyncedEnv(appDir: string): Record<string, string> {\n return { ...readManagedEnvSections(appDir).synced }\n}\n\nexport function readManagedDevOnlyEnv(appDir: string): Record<string, string> {\n return { ...readManagedEnvSections(appDir).devOnly }\n}\n\nexport function writeManagedEnv(appDir: string, vars: Record<string, string>): void {\n writeManagedEnvSections(appDir, {\n sdk: filterSdkManaged(vars),\n synced: stripSdkManaged(vars),\n devOnly: {},\n })\n}\n\nexport function writeManagedEnvSections(appDir: string, sections: ManagedEnvSections): void {\n ensureLocalEnvIgnored(appDir)\n const lines = [\n MANAGED_ENV_HEADER,\n '# Do not commit this file. Edit secrets with `deepspace secrets`, not by hand.',\n ]\n for (const [name, value] of Object.entries(sortRecord(sections.sdk))) {\n lines.push(`${name}=${quoteEnvValue(value)}`)\n }\n lines.push('', MANAGED_ENV_SYNCED_HEADER)\n for (const [name, value] of Object.entries(sortRecord(sections.synced))) {\n lines.push(`${name}=${quoteEnvValue(value)}`)\n }\n lines.push('', MANAGED_ENV_DEV_ONLY_HEADER)\n for (const [name, value] of Object.entries(sortRecord(sections.devOnly))) {\n lines.push(`${name}=${quoteEnvValue(value)}`)\n }\n writeFileSync(localEnvPath(appDir), lines.join('\\n') + '\\n', { mode: 0o600 })\n}\n\nfunction ensureLocalEnvIgnored(appDir: string): void {\n const path = join(appDir, '.gitignore')\n const existing = existsSync(path) ? readFileSync(path, 'utf-8') : ''\n const lines = new Set(existing.split('\\n').map((line) => line.trim()))\n const additions = ['.env', '.dev.vars'].filter((entry) => !lines.has(entry))\n if (!additions.length) return\n const prefix = existing && !existing.endsWith('\\n') ? existing + '\\n' : existing\n writeFileSync(path, `${prefix}${additions.join('\\n')}\\n`)\n}\n\nexport function patchManagedEnv(\n appDir: string,\n set: Record<string, string> = {},\n removeNames: string[] = [],\n): void {\n patchManagedSyncedEnv(appDir, set, removeNames)\n}\n\nexport function patchManagedSyncedEnv(\n appDir: string,\n set: Record<string, string> = {},\n removeNames: string[] = [],\n): void {\n const sections = readManagedEnvSections(appDir)\n for (const [name, value] of Object.entries(set)) sections.synced[name] = value\n for (const name of removeNames) delete sections.synced[name]\n writeManagedEnvSections(appDir, sections)\n}\n\nexport function patchManagedDevOnlyEnv(\n appDir: string,\n set: Record<string, string> = {},\n removeNames: string[] = [],\n): void {\n const sections = readManagedEnvSections(appDir)\n for (const [name, value] of Object.entries(set)) sections.devOnly[name] = value\n for (const name of removeNames) delete sections.devOnly[name]\n writeManagedEnvSections(appDir, sections)\n}\n\nexport function replaceManagedAppEnv(\n appDir: string,\n appVars: Record<string, string>,\n): void {\n replaceManagedSyncedEnv(appDir, appVars)\n}\n\nexport function replaceManagedSyncedEnv(\n appDir: string,\n syncedVars: Record<string, string>,\n): void {\n const sections = readManagedEnvSections(appDir)\n sections.synced = stripSdkManaged(syncedVars)\n writeManagedEnvSections(appDir, sections)\n}\n\nexport function moveManagedDevOnlyToSynced(appDir: string, names: string[]): void {\n const sections = readManagedEnvSections(appDir)\n for (const name of names) {\n if (name in sections.devOnly) {\n sections.synced[name] = sections.devOnly[name]\n delete sections.devOnly[name]\n }\n }\n writeManagedEnvSections(appDir, sections)\n}\n\nfunction filterSdkManaged(vars: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [name, value] of Object.entries(vars)) {\n if (SDK_MANAGED_KEYS.has(name)) out[name] = value\n }\n return out\n}\n\n/**\n * Write local dev env for an app, pointing to the specified environment's workers.\n *\n * With legacy `.dev.vars` present, only the SDK-managed keys (see\n * `SDK_MANAGED_KEYS`) are rewritten on each call and custom content is\n * preserved. Fresh apps use managed `.env`; SDK-managed keys are regenerated\n * while app-defined keys are preserved for `deepspace secrets`.\n *\n * Fresh apps should not create or edit `.dev.vars`; it is only a compatibility\n * path for existing apps that already have that file. Do not edit managed\n * `.env` secret sections manually; use `deepspace secrets`.\n *\n * Includes a freshly-minted `APP_OWNER_JWT` so server-side code in the app\n * (DO alarms, cron handlers, autonomous agents) can call the API worker\n * proxy without any further auth plumbing. Uses the same flow as production:\n * the auth-worker mints the token, we store it as an env var.\n */\nexport async function writeDevVars(\n appDir: string,\n env: EnvName,\n ownerId: string,\n callerJwt: string,\n /** Wrangler [env.<name>] block to target. When set, mints\n * APP_OWNER_JWT for the env's app name and writes to\n * legacy `.dev.vars.<wranglerEnv>` instead of `.dev.vars`. */\n wranglerEnv?: string,\n): Promise<void> {\n const urls = ENVS[env]\n const publicKey = await fetchPublicKey(urls.auth)\n const appName = readAppName(appDir, wranglerEnv)\n const appOwnerJwt = await mintAppOwnerJwt(urls.auth, callerJwt, appName)\n // Pre-first-deploy this returns null (the app isn't in the registry yet)\n // — that's expected. The /_deepspace/* proxy will start working after the\n // first `deepspace deploy` registers the app and a follow-up\n // `deepspace dev` re-runs this writer.\n const appIdentityToken = await fetchAppIdentityToken(urls.deploy, callerJwt, appName)\n\n // Wrangler's .dev.vars parser is dotenv-style: bare multi-line values are\n // truncated to the first line. The PEM public key spans multiple lines, so\n // it MUST be wrapped in double quotes (dotenv multi-line value syntax).\n // Without this, AUTH_JWT_PUBLIC_KEY ends up as just \"-----BEGIN PUBLIC KEY-----\"\n // and `importSPKI` throws `DataError: Invalid SPKI input`, which silently\n // breaks JWT verification on every WS connection (anonymous fallback).\n const sdkVars = [\n `AUTH_JWT_PUBLIC_KEY=\"${publicKey}\"`,\n `AUTH_JWT_ISSUER=${urls.auth}/api/auth`,\n `AUTH_WORKER_URL=${urls.auth}`,\n `API_WORKER_URL=${urls.api}`,\n `PLATFORM_WORKER_URL=${urls.platform}`,\n `OWNER_USER_ID=${ownerId}`,\n `APP_OWNER_JWT=${appOwnerJwt}`,\n ...(appIdentityToken ? [`APP_IDENTITY_TOKEN=${appIdentityToken}`] : []),\n `APP_SECRETS_LOCAL_FALLBACK=true`,\n // Open /api/debug/* (proxied to RecordRoom) for dev + tests only.\n // Production secrets never set this, so deployed apps 404 the route.\n `ALLOW_DEBUG_ROUTES=true`,\n ].join('\\n')\n\n const sdkEnv = parseDevVarsStrict(sdkVars, 'SDK env')\n if (!hasLegacyDevVars(appDir, wranglerEnv)) {\n const sections = readManagedEnvSections(appDir)\n writeManagedEnvSections(appDir, { ...sections, sdk: sdkEnv })\n return\n }\n\n // Per-env legacy dev config file. Matches the Cloudflare Vite plugin's own\n // naming convention (`.dev.vars.<env>` when `CLOUDFLARE_ENV` is set).\n const devVarsPath = legacyDevVarsPath(appDir, wranglerEnv)\n const existing = existsSync(devVarsPath) ? readFileSync(devVarsPath, 'utf-8') : ''\n const custom = extractCustomDevVars(existing)\n const body = custom\n ? `${sdkVars}\\n\\n${DEV_VARS_DIVIDER}\\n${custom}\\n`\n : `${sdkVars}\\n`\n\n writeFileSync(devVarsPath, body)\n}\n","/**\n * Wrangler env resolution for DeepSpace's multi-environment deploys.\n *\n * Lets a single repo deploy to `<app>.app.space` and `<app>-staging.app.space`\n * (or any other named environment) from one `wrangler.toml`:\n *\n * name = \"hopkins\"\n * [vars]\n * APP_NAME = \"hopkins\"\n *\n * [env.staging]\n * name = \"hopkins-staging\"\n * [env.staging.vars]\n * APP_NAME = \"hopkins-staging\"\n *\n * Then `npx deepspace deploy --env staging` reads the override and ships to\n * `hopkins-staging.app.space`. The platform treats it as a fully separate\n * app — its own DO state, OAuth tokens, Stripe products, cron schedule.\n * No platform-side change needed beyond letting the CLI register a second\n * app under the same owner.\n *\n * `CLOUDFLARE_ENV` is the wire format. The Cloudflare Vite plugin honors\n * it natively when it builds the worker bundle + emits `dist/wrangler.json`,\n * so the same env var the SDK CLI passes around is also the one Vite reads.\n * `.dev.vars.<env>` is read by the same plugin during preview/build, so we\n * use the matching naming convention for the user-managed secrets file too.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { parse as parseToml } from 'smol-toml'\nimport { resolveAppName } from '../../server/rooms/app-name'\n\n/** Shape of the bits of wrangler.toml that DeepSpace CLI commands read.\n * Add an optional field here whenever a new command starts consulting\n * the config — avoids one-off `WranglerConfig & { … }` casts at\n * call sites and keeps the canonical type in one place. */\nexport interface WranglerConfig {\n name?: string\n env?: Record<string, { name?: string } | undefined>\n /** `[assets]` block (`directory`, `binding`, `not_found_handling`,\n * `run_worker_first`). Consumed by deploy.ts to merge extra\n * worker-first routes into the deployed metadata. */\n assets?: {\n directory?: string\n binding?: string\n not_found_handling?: string\n run_worker_first?: unknown\n }\n /** `[vars]` block — string-valued environment variables baked into\n * the worker at deploy time. */\n vars?: Record<string, unknown>\n}\n\n/**\n * Resolve the appName that this CLI invocation should target.\n *\n * Without `envName`: returns the top-level `name`.\n * With `envName`: returns `[env.<envName>].name` and requires that the\n * env block exists and declares a name. We refuse to\n * fall back to the top-level name because that would\n * silently deploy staging code to production.\n *\n * Returns a discriminated union so callers can surface a precise error\n * (matches the existing `resolveAppName` contract).\n */\nexport function resolveAppNameForEnv(\n config: WranglerConfig,\n envName: string | undefined,\n): { ok: true; name: string; warning?: string } | { ok: false; reason: string } {\n if (!envName) {\n return resolveAppName(config.name)\n }\n const envBlock = config.env?.[envName]\n if (!envBlock) {\n return {\n ok: false,\n reason: `wrangler.toml: no [env.${envName}] block found. ` +\n `Add one with a distinct \\`name\\` to deploy this environment.`,\n }\n }\n if (typeof envBlock.name !== 'string' || envBlock.name.trim() === '') {\n return {\n ok: false,\n reason: `wrangler.toml: [env.${envName}].name is missing. ` +\n `Set a distinct app name (e.g. \"${typeof config.name === 'string' ? config.name : 'myapp'}-${envName}\") so this environment doesn't overwrite the default.`,\n }\n }\n if (envBlock.name === config.name) {\n return {\n ok: false,\n reason: `wrangler.toml: [env.${envName}].name \"${envBlock.name}\" is the same as the top-level name. ` +\n `Pick a distinct name (e.g. \"${config.name}-${envName}\") so deploys don't collide.`,\n }\n }\n return resolveAppName(envBlock.name)\n}\n\n/**\n * The .dev.vars filename for an environment. Matches the convention the\n * Cloudflare Vite plugin already uses when `CLOUDFLARE_ENV` is set, so the\n * SDK CLI and the plugin agree on which file holds the per-env secrets.\n */\nexport function devVarsPathFor(appDir: string, envName: string | undefined): string {\n return envName ? join(appDir, `.dev.vars.${envName}`) : join(appDir, '.dev.vars')\n}\n\n/**\n * Read + parse wrangler.toml. Caller checks existence first via\n * `hasWranglerConfig`. Throws a `WranglerConfigError` with the absolute\n * path embedded on a malformed file — saves the user from staring at\n * a raw smol-toml parser stack trace when they have one stray\n * unquoted character in their config.\n */\nexport class WranglerConfigError extends Error {\n constructor(public readonly path: string, public readonly cause: unknown) {\n const detail = cause instanceof Error ? cause.message : String(cause)\n super(`wrangler.toml: malformed TOML at ${path}: ${detail}`)\n this.name = 'WranglerConfigError'\n }\n}\n\nexport function readWranglerConfig(appDir: string): WranglerConfig {\n const path = join(appDir, 'wrangler.toml')\n const raw = readFileSync(path, 'utf-8')\n try {\n return parseToml(raw) as WranglerConfig\n } catch (err) {\n throw new WranglerConfigError(path, err)\n }\n}\n\n/** Convenience: true when wrangler.toml exists at the standard path. */\nexport function hasWranglerConfig(appDir: string): boolean {\n return existsSync(join(appDir, 'wrangler.toml'))\n}\n","/**\n * App-name validation + sanitization helpers.\n *\n * Strategy: validate strictly so we have a precise definition of \"valid\",\n * but DON'T reject non-conforming names — sanitize them, warn the user, and\n * proceed. Hard rejection would break apps whose `wrangler.toml name` was\n * something like `My_App` (previously deployed as `my-app` via silent\n * server-side sanitization). The new behavior preserves \"still deploys,\"\n * but the CLI now surfaces a warning so the user can fix the name when\n * convenient instead of being silently surprised by their hostname.\n *\n * Rules track Cloudflare's WfP script-name constraints (RFC 1035 host label,\n * no consecutive dashes) plus our 2-char minimum so subdomains read sensibly.\n */\n\nexport const APP_NAME_RULES = {\n /** ^[a-z0-9](-?[a-z0-9])+$ — RFC 1035 host label, no consecutive dashes. */\n pattern: /^[a-z0-9](?:-?[a-z0-9])+$/,\n minLength: 2,\n maxLength: 63,\n} as const\n\nexport type AppNameValidation =\n | { valid: true; name: string }\n | { valid: false; reason: string }\n\n/**\n * Strict validation: returns valid only if the name already conforms.\n * Useful as a precondition test or for CI lints.\n */\nexport function validateAppName(raw: unknown): AppNameValidation {\n if (typeof raw !== 'string') {\n return { valid: false, reason: 'App name must be a string' }\n }\n const name = raw.trim()\n if (!name) {\n return { valid: false, reason: 'App name is required' }\n }\n if (name.length < APP_NAME_RULES.minLength) {\n return { valid: false, reason: `App name \"${name}\" is too short (min ${APP_NAME_RULES.minLength} chars)` }\n }\n if (name.length > APP_NAME_RULES.maxLength) {\n return { valid: false, reason: `App name \"${name}\" is too long (max ${APP_NAME_RULES.maxLength} chars)` }\n }\n if (!APP_NAME_RULES.pattern.test(name)) {\n return {\n valid: false,\n reason:\n `App name \"${name}\" is invalid. Use lowercase letters, digits, and single hyphens only ` +\n `(must start + end with alphanumeric). Examples: my-app, search-v2, unison-search.`,\n }\n }\n return { valid: true, name }\n}\n\nexport type AppNameResolution =\n | { ok: true; name: string; warning?: string }\n | { ok: false; reason: string }\n\n/**\n * Resolve an app name for deploy: prefer the input as-is if valid, otherwise\n * sanitize and warn. Hard-fail only if even sanitization can't produce a\n * valid name (empty, all-non-alphanumeric, too short, too long).\n *\n * The intent is \"what previously worked still works, with a friendly warning\n * about non-conforming names.\"\n */\nexport function resolveAppName(raw: unknown): AppNameResolution {\n const strict = validateAppName(raw)\n if (strict.valid) return { ok: true, name: strict.name }\n\n if (typeof raw !== 'string') return { ok: false, reason: strict.reason }\n const trimmed = raw.trim()\n if (!trimmed) return { ok: false, reason: 'App name is required' }\n\n const sanitized = sanitizeAppName(trimmed)\n const sanitizedStrict = validateAppName(sanitized)\n if (!sanitizedStrict.valid) {\n return {\n ok: false,\n reason: `App name \"${trimmed}\" can't be sanitized into a valid name (${sanitizedStrict.reason}). Pick something matching: lowercase letters, digits, single hyphens, ${APP_NAME_RULES.minLength}-${APP_NAME_RULES.maxLength} chars.`,\n }\n }\n return {\n ok: true,\n name: sanitized,\n warning:\n `App name \"${trimmed}\" doesn't conform to deploy rules — using \"${sanitized}\" instead. ` +\n `Update wrangler.toml's \\`name\\` to silence this warning.`,\n }\n}\n\n/**\n * Lossy normalization that mirrors what the deploy-worker historically did\n * server-side. Keep only [a-z0-9-], collapse consecutive dashes, trim leading\n * and trailing dashes.\n */\nfunction sanitizeAppName(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-{2,}/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","/**\n * CLI session helpers — exchange a Better Auth session cookie for a short-lived\n * JWT against the auth worker. Shared by `auth.ts` (token refresh for all\n * authenticated commands) and `login.ts` (email/password flow).\n */\n\nexport const SESSION_COOKIE = '__Secure-better-auth.session_token'\n\n/**\n * Exchange a Better Auth session token for a fresh JWT.\n * Returns null if the session is invalid or expired.\n */\nexport async function exchangeSession(\n authUrl: string,\n sessionToken: string,\n): Promise<string | null> {\n const res = await fetch(`${authUrl}/api/auth/token`, {\n method: 'POST',\n headers: {\n Cookie: `${SESSION_COOKIE}=${encodeURIComponent(sessionToken)}`,\n Origin: authUrl,\n },\n })\n if (!res.ok) return null\n const data = (await res.json()) as { token?: string | null }\n return data.token ?? null\n}\n","/**\n * deepspace logout\n *\n * Revokes the session on the auth worker, then removes the cached session\n * token and JWT from ~/.deepspace/. Test accounts (managed by `deepspace\n * test-accounts`) are not touched.\n */\n\nimport { defineCommand } from 'citty'\nimport { existsSync, readFileSync, rmSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nimport { ENVS } from '../env'\nimport { SESSION_COOKIE } from '../session'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nconst DIR = join(homedir(), '.deepspace')\nconst SESSION_PATH = join(DIR, 'session')\nconst TOKEN_PATH = join(DIR, 'token')\n\nexport default defineCommand({\n meta: {\n name: 'logout',\n description: 'Sign out and remove cached credentials',\n },\n async run() {\n // Read the session token before deleting it so we can revoke server-side.\n const sessionToken = existsSync(SESSION_PATH)\n ? readFileSync(SESSION_PATH, 'utf-8').trim()\n : null\n\n if (sessionToken) {\n try {\n await fetch(`${AUTH_URL}/api/auth/sign-out`, {\n method: 'POST',\n headers: {\n Cookie: `${SESSION_COOKIE}=${encodeURIComponent(sessionToken)}`,\n Origin: AUTH_URL,\n },\n })\n } catch {\n // Network failure — still wipe local credentials so the user can\n // re-authenticate. Server-side session will expire on its own.\n }\n }\n\n let removed = 0\n for (const path of [SESSION_PATH, TOKEN_PATH]) {\n if (existsSync(path)) {\n rmSync(path)\n removed++\n }\n }\n\n if (removed === 0) {\n console.log('Already logged out.')\n return\n }\n console.log('Logged out.')\n },\n})\n","/**\n * deepspace dev [--prod] [--port N]\n *\n * Starts local development:\n * 1. Ensures you're logged in\n * 2. Writes managed .env, or legacy .dev.vars if that file already exists\n * 3. Starts vite dev (Cloudflare Vite plugin runs the worker in-process)\n *\n * deepspace dev # uses dev workers, port 5173 (strict)\n * deepspace dev --prod # uses production workers\n * deepspace dev --port 5180 # bind to a different port (multi-app dev)\n *\n * Port is `--port` > $DEEPSPACE_PORT > 5173. We always pass --strictPort to\n * vite so a busy port fails loudly instead of silently jumping to 5174 (which\n * would diverge from anything Playwright/test config is expecting).\n */\n\nimport { defineCommand } from 'citty'\nimport { resolve, basename } from 'node:path'\nimport spawn from 'cross-spawn'\nimport { ensureToken } from '../auth'\nimport { detectAppName, findAppDir, findChildApps, writeLaunchConfigIfMissing } from '../lib/app-context'\nimport { hasLegacyDevVars, replaceManagedSyncedEnv, writeDevVars } from '../env'\nimport { decodeJwtPayload } from '../jwt'\nimport { ensureInstallReady } from '../lib/install-status'\nimport { preflightWindowsWorkerd } from '../lib/preflight'\nimport { readWranglerConfig, resolveAppNameForEnv } from '../lib/wrangler-env'\nimport { remoteAvailable, remoteFetch } from './secrets'\n\nconst DEFAULT_PORT = 5173\n\nexport default defineCommand({\n meta: {\n name: 'dev',\n description: 'Start local development server',\n },\n args: {\n dir: {\n type: 'positional',\n description: 'App directory (default: current directory)',\n required: false,\n },\n prod: {\n type: 'boolean',\n description: 'Use production workers (real auth, real API calls)',\n default: false,\n },\n env: {\n type: 'string',\n description:\n 'wrangler.toml [env.<name>] block to run (e.g. --env staging). ' +\n 'Legacy apps read .dev.vars.<name>; new apps use managed .env.',\n required: false,\n },\n port: {\n type: 'string',\n description: `Port to bind (default ${DEFAULT_PORT}, or $DEEPSPACE_PORT)`,\n required: false,\n },\n 'no-pull-env': {\n type: 'boolean',\n description: 'Skip pulling remote app secrets into the synced .env section on startup',\n default: false,\n },\n },\n async run({ args }) {\n const env = args.prod ? 'prod' : 'dev'\n const wranglerEnv = typeof args.env === 'string' && args.env.trim() ? args.env.trim() : undefined\n const port = resolvePort(args.port)\n\n // Resolve the app root by walking up from the requested dir (default cwd),\n // so running from a subdirectory still works instead of hard-failing.\n const start = resolve(args.dir ?? '.')\n const appDir = findAppDir(start)\n if (!appDir) {\n console.error(`No wrangler.toml found at or above ${start}.`)\n const children = findChildApps(start)\n if (children.length > 0) {\n console.error('Did you mean to run inside one of these app directories?')\n for (const c of children) console.error(` cd ${c}`)\n } else {\n console.error('Run from a DeepSpace app directory (one containing wrangler.toml).')\n }\n process.exit(1)\n }\n\n // Seed an app-local .claude/launch.json (only if absent) so the Claude Code\n // preview tool launches this app on the resolved port, instead of walking\n // up and latching onto an ancestor repo's config.\n writeLaunchConfigIfMissing(appDir, detectAppName(appDir) ?? basename(appDir), port)\n\n ensureInstallReady(appDir)\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err: any) {\n console.error(err.message)\n process.exit(1)\n }\n\n let payload: { sub: string; name?: string; email?: string }\n try {\n payload = decodeJwtPayload<{ sub: string; name?: string; email?: string }>(token)\n } catch {\n console.error('Malformed session token. Run `npx deepspace login`.')\n process.exit(1)\n }\n // Two distinct concepts both colloquially called \"environment\":\n // - Platform : which DeepSpace stack we point at (dev vs prod\n // auth-worker / api-worker / platform-worker URLs)\n // - Wrangler env : which `[env.<name>]` block of wrangler.toml\n // we apply (renames the app, swaps vars, etc.)\n // Labeling them differently in the startup log makes the override\n // surface obvious when debugging which app slot a session is\n // hitting.\n console.log(`Logged in as ${payload.name ?? payload.email}`)\n console.log(`Platform: ${env}`)\n if (wranglerEnv) console.log(`Wrangler env: ${wranglerEnv}`)\n console.log(`Port: ${port}`)\n\n await writeDevVars(appDir, env, payload.sub, token, wranglerEnv)\n if (env === 'dev' && !args['no-pull-env'] && !hasLegacyDevVars(appDir, wranglerEnv)) {\n const appName = resolveCurrentAppName(appDir, wranglerEnv)\n if (appName) {\n try {\n if (await remoteAvailable(appName, token)) {\n const body = await remoteFetch<{ secrets?: Record<string, string> }>(appName, token, '/pull')\n replaceManagedSyncedEnv(appDir, body.secrets ?? {})\n console.log('Secrets: pulled remote app secrets into synced .env section.')\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n console.warn(`Secrets: remote app secrets pull skipped (${message}).`)\n }\n }\n }\n preflightWindowsWorkerd(appDir)\n console.log('Starting dev server...\\n')\n\n const vite = spawn(\n 'npx',\n ['vite', '--port', String(port), '--strictPort', '--host'],\n {\n cwd: appDir,\n stdio: 'inherit',\n // CLOUDFLARE_ENV is what the Cloudflare Vite plugin keys off — it\n // applies `[env.<name>]` overrides. Legacy .dev.vars apps use\n // `.dev.vars.<name>` instead of `.dev.vars`; new apps use managed .env.\n // Set only when --env was passed so the default invocation behaves\n // exactly as before.\n env: {\n ...process.env,\n DEEPSPACE_PORT: String(port),\n ...(wranglerEnv ? { CLOUDFLARE_ENV: wranglerEnv } : {}),\n },\n },\n )\n process.on('SIGINT', () => vite.kill())\n process.on('SIGTERM', () => vite.kill())\n vite.on('close', (code) => process.exit(code ?? 0))\n },\n})\n\nfunction resolvePort(arg?: string): number {\n const raw = arg ?? process.env.DEEPSPACE_PORT\n if (!raw) return DEFAULT_PORT\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n console.error(`Invalid port: ${raw}. Must be an integer between 1 and 65535.`)\n process.exit(1)\n }\n return n\n}\n\nfunction resolveCurrentAppName(appDir: string, wranglerEnv?: string): string | null {\n try {\n const resolved = resolveAppNameForEnv(readWranglerConfig(appDir), wranglerEnv)\n return resolved.ok ? resolved.name : null\n } catch {\n return null\n }\n}\n","/**\n * CLI auth utilities — shared across all commands.\n *\n * Reads the session token from ~/.deepspace/session and ensures\n * a fresh JWT is available at ~/.deepspace/token.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nimport { ENVS } from './env'\nimport { decodeJwtPayload } from './jwt'\nimport { exchangeSession } from './session'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nconst DIR = join(homedir(), '.deepspace')\nexport const SESSION_PATH = join(DIR, 'session')\nexport const TOKEN_PATH = join(DIR, 'token')\n\n/**\n * Ensure a valid JWT exists. Refreshes from the session token if expired.\n * Returns the JWT string or throws if not logged in / session expired.\n */\nexport async function ensureToken(): Promise<string> {\n // Try existing token first — if it's still valid, skip the refresh\n if (existsSync(TOKEN_PATH)) {\n const existing = readFileSync(TOKEN_PATH, 'utf-8').trim()\n if (isTokenValid(existing)) {\n return existing\n }\n }\n\n if (!existsSync(SESSION_PATH)) {\n throw new Error('Not logged in. Run `deepspace login` first.')\n }\n\n const sessionToken = readFileSync(SESSION_PATH, 'utf-8').trim()\n\n // Refresh from session\n const token = await exchangeSession(AUTH_URL, sessionToken)\n if (!token) {\n throw new Error('Session expired. Run `deepspace login` to re-authenticate.')\n }\n\n mkdirSync(DIR, { recursive: true, mode: 0o700 })\n writeFileSync(TOKEN_PATH, token, { mode: 0o600 })\n\n return token\n}\n\n/** Check if a JWT has at least 30 seconds of validity remaining. */\nfunction isTokenValid(jwt: string): boolean {\n try {\n const payload = decodeJwtPayload<{ exp?: number }>(jwt)\n return typeof payload.exp === 'number' && payload.exp * 1000 > Date.now() + 30_000\n } catch {\n return false\n }\n}\n","export function decodeJwtPayload<T = Record<string, unknown>>(token: string): T {\n const payloadSegment = token.split('.')[1]\n if (!payloadSegment) {\n throw new Error('JWT payload is missing')\n }\n return JSON.parse(Buffer.from(payloadSegment, 'base64url').toString('utf8')) as T\n}\n","/**\n * Shared helper: read the current project's app name from `./wrangler.toml`.\n *\n * Used by commands that operate on \"the current app\" — `deploy`, `domain buy`,\n * `domain attach`, etc. Lets agents and scripts run from inside a project\n * directory without redundantly passing `--app <name>`.\n */\n\nimport { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { join, resolve, dirname } from 'node:path'\nimport { parse as parseToml } from 'smol-toml'\n\n/**\n * Read the app name from `wrangler.toml` in the given directory (default cwd).\n * Returns null if no wrangler.toml exists or the file lacks a `name` field.\n */\nexport function detectAppName(cwd: string = process.cwd()): string | null {\n const wranglerPath = join(resolve(cwd), 'wrangler.toml')\n if (!existsSync(wranglerPath)) return null\n try {\n const cfg = parseToml(readFileSync(wranglerPath, 'utf-8')) as { name?: string }\n return typeof cfg.name === 'string' && cfg.name.length > 0 ? cfg.name : null\n } catch {\n return null\n }\n}\n\n/**\n * Resolve the app name from explicit arg or wrangler.toml.\n * Throws with a clear message if neither is available.\n */\nexport function requireAppName(explicit: string | undefined, cwd?: string): string {\n if (explicit) return explicit\n const detected = detectAppName(cwd)\n if (detected) return detected\n throw new Error(\n 'No app specified. Pass --app <name>, or run from an app directory with a wrangler.toml.',\n )\n}\n\n/**\n * Walk upward from `start` (default cwd) to the nearest directory containing a\n * `wrangler.toml`, returning that directory — or null if none is found before\n * the filesystem root.\n *\n * This makes the dev-loop commands robust to being run from a *subdirectory*\n * of an app instead of hard-failing the moment cwd isn't exactly the app root.\n * (It does NOT recover the inverse case — cwd sitting at the app's *parent*;\n * for that, `findChildApps` powers a \"did you mean cd <app>\" hint.)\n */\nexport function findAppDir(start: string = process.cwd()): string | null {\n let dir = resolve(start)\n for (;;) {\n if (existsSync(join(dir, 'wrangler.toml'))) return dir\n const parent = dirname(dir)\n if (parent === dir) return null // reached filesystem root\n dir = parent\n }\n}\n\n/**\n * Immediate subdirectories of `dir` that look like an app (contain a\n * `wrangler.toml`). Used to turn a bare \"no wrangler.toml here\" failure into an\n * actionable hint when the caller is sitting one level above the app — the\n * exact situation a harness creates when it resets cwd to the parent.\n */\nexport function findChildApps(dir: string): string[] {\n try {\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && existsSync(join(dir, e.name, 'wrangler.toml')))\n .map((e) => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * Seed `<appDir>/.claude/launch.json` so the Claude Code preview tool launches\n * THIS app. Without an app-local launch.json the tool walks up the directory\n * tree and can latch onto an ancestor repo's config — pointing at a different\n * app and port — which is a real failure when a DeepSpace app lives inside\n * another repo.\n *\n * Writes only when the file is absent, so a user- or tool-customized config\n * (different name, port, or runner) is never clobbered. Best-effort: a write\n * failure must never block `dev` from starting.\n */\nexport function writeLaunchConfigIfMissing(appDir: string, appName: string, port: number): void {\n const launchPath = join(appDir, '.claude', 'launch.json')\n if (existsSync(launchPath)) return\n const config = {\n version: '0.0.1',\n configurations: [\n {\n name: appName,\n runtimeExecutable: 'npx',\n runtimeArgs: ['deepspace', 'dev', '--port', String(port)],\n port,\n },\n ],\n }\n try {\n mkdirSync(join(appDir, '.claude'), { recursive: true })\n writeFileSync(launchPath, JSON.stringify(config, null, 2) + '\\n')\n } catch {\n // best-effort only\n }\n}\n","/**\n * Verifies the app's dependencies are installed before running a command that\n * needs them (dev, test, deploy, add).\n *\n * `create-deepspace` runs `npm install` (and `deepspace skills add`) in a\n * detached background process so the user gets their prompt back immediately.\n * The background worker writes three sentinels under `<appDir>/.deepspace/`:\n *\n * install.started — created before the worker is spawned\n * install.done — written on successful completion\n * install.err — written on failure (contains the error message)\n * install.log — combined stdout/stderr of the install\n *\n * The presence of `node_modules/deepspace/package.json` is the ground truth\n * for \"ready\"; the sentinels only shape the error message.\n */\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport function ensureInstallReady(appDir: string): void {\n if (existsSync(join(appDir, 'node_modules', 'deepspace', 'package.json'))) return\n\n const sentinelDir = join(appDir, '.deepspace')\n const errPath = join(sentinelDir, 'install.err')\n const startedPath = join(sentinelDir, 'install.started')\n const donePath = join(sentinelDir, 'install.done')\n const logPath = join(sentinelDir, 'install.log')\n\n if (existsSync(errPath)) {\n console.error('Background install failed:')\n console.error(readFileSync(errPath, 'utf-8').trimEnd())\n if (existsSync(logPath)) console.error(`\\nFull log: ${logPath}`)\n console.error('\\nRun `npm install` (or `bun install`) manually, then retry.')\n process.exit(1)\n }\n\n if (existsSync(startedPath) && !existsSync(donePath)) {\n console.error('Dependencies are still installing in the background.')\n if (existsSync(logPath)) console.error(`Tail progress: tail -f ${logPath}`)\n console.error('Retry once it finishes.')\n process.exit(1)\n }\n\n console.error('Dependencies not installed. Run `npm install` (or `bun install`) first.')\n process.exit(1)\n}\n","import { execFileSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n// 0xC0000135 = STATUS_DLL_NOT_FOUND on Windows. Node reports it as a signed int.\nconst DLL_NOT_FOUND = -1073741515\n\n/**\n * On Windows, the Cloudflare Workers runtime (`workerd.exe`) is built with\n * MSVC and links against `vcruntime140.dll`. A bare Windows install (Server\n * 2022, Server Core, minimal Windows 11) does not ship those DLLs, so workerd\n * exits immediately with STATUS_DLL_NOT_FOUND. Miniflare then surfaces this as\n * \"Error: write EOF\" because workerd closed the stdin pipe before reading its\n * config — an error with no JS stack trace and no hint at the cause.\n *\n * This preflight catches the case and prints the actual fix (install VC++\n * Redistributable). Skip silently if workerd isn't installed yet or runs fine.\n */\nexport function preflightWindowsWorkerd(appDir: string): void {\n if (process.platform !== 'win32') return\n\n const workerdExe = resolve(\n appDir,\n 'node_modules',\n '@cloudflare',\n 'workerd-windows-64',\n 'bin',\n 'workerd.exe',\n )\n if (!existsSync(workerdExe)) return\n\n try {\n execFileSync(workerdExe, ['--help'], { stdio: 'pipe', timeout: 10_000 })\n return\n } catch (err: unknown) {\n const status = (err as { status?: number }).status\n if (status !== DLL_NOT_FOUND) return\n\n console.error('')\n console.error(' workerd (Cloudflare Workers runtime) cannot start on this system.')\n console.error(' It needs the Microsoft Visual C++ Redistributable, which is not installed.')\n console.error('')\n console.error(' Install it with any of:')\n console.error(' winget install Microsoft.VCRedist.2015+.x64')\n console.error(' choco install -y vcredist140')\n console.error(' https://aka.ms/vs/17/release/vc_redist.x64.exe')\n console.error('')\n console.error(' Then restart this terminal and re-run the command.')\n console.error('')\n process.exit(1)\n }\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { ensureToken } from '../auth'\nimport {\n DEV_VARS_DIVIDER,\n hasLegacyDevVars,\n moveManagedDevOnlyToSynced,\n parseDevVars,\n patchManagedDevOnlyEnv,\n patchManagedSyncedEnv,\n quoteEnvValue,\n readManagedAppEnv,\n readManagedDevOnlyEnv,\n readManagedSyncedEnv,\n replaceManagedSyncedEnv,\n SDK_MANAGED_KEYS,\n stripSdkManaged,\n writeManagedEnv,\n ENVS,\n} from '../env'\nimport { requireAppName } from '../lib/app-context'\n\nexport type RemoteDeployState = 'deployed' | 'not-deployed'\n\ninterface RemoteList {\n version?: number\n secrets?: { name: string; version: number; updatedAt: string }[]\n error?: string\n}\n\ninterface RemotePull {\n version?: number\n secrets?: Record<string, string>\n error?: string\n}\n\ninterface ScopedSecretsToken {\n token?: string\n expiresAt?: string\n error?: string\n}\n\nconst SECRET_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/\nconst ERROR_SNIPPET_CHARS = 500\nconst COLLABORATOR_ROUTES_404 =\n 'Platform API does not expose app-collaborator routes; deploy/update api-worker before using collaborator commands.'\nconst COLLABORATOR_SCHEMA_NOT_MIGRATED =\n 'Platform API is missing app-collaborator database tables. Run api-worker /_migrate with x-migration-secret, then retry collaborator commands.'\n\ninterface SecretCollaborator {\n appName: string\n userId: string\n emailNormalized: string\n emailDisplay: string\n createdAt: string | Date\n}\n\ninterface SecretInvite {\n id: string\n emailDisplay: string\n emailNormalized: string\n expiresAt: string | Date\n acceptedAt?: string | Date | null\n revokedAt?: string | Date | null\n createdAt: string | Date\n}\n\nfunction parseAssignment(value: string): [string, string] {\n const eq = value.indexOf('=')\n if (eq <= 0) throw new Error('Use KEY=value.')\n const name = value.slice(0, eq)\n if (!SECRET_NAME_RE.test(name)) throw new Error(`Invalid secret name \"${name}\".`)\n if (SDK_MANAGED_KEYS.has(name)) throw new Error(`${name} is managed by DeepSpace and cannot be set as an app secret.`)\n return [name, value.slice(eq + 1)]\n}\n\nfunction devTargetPath(): string {\n return join(process.cwd(), '.dev.vars')\n}\n\nfunction readDevTarget(): Record<string, string> {\n if (!hasLegacyDevVars(process.cwd())) {\n return readManagedAppEnv(process.cwd())\n }\n const path = devTargetPath()\n if (!existsSync(path)) return {}\n return stripSdkManaged(parseDevVars(splitDevTarget(readFileSync(path, 'utf-8')).custom))\n}\n\nfunction readSyncedTarget(): Record<string, string> {\n if (hasLegacyDevVars(process.cwd())) return readDevTarget()\n return readManagedSyncedEnv(process.cwd())\n}\n\nfunction readDevOnlyTarget(): Record<string, string> {\n if (hasLegacyDevVars(process.cwd())) return readDevTarget()\n return readManagedDevOnlyEnv(process.cwd())\n}\n\nfunction writeLocalPatch(\n set: Record<string, string> = {},\n removeNames: string[] = [],\n): void {\n for (const name of [...Object.keys(set), ...removeNames]) {\n if (SDK_MANAGED_KEYS.has(name)) {\n throw new Error(`${name} is managed by DeepSpace and cannot be set as an app secret.`)\n }\n }\n if (hasLegacyDevVars(process.cwd())) writeDevTargetPatch(set, removeNames)\n else {\n patchManagedDevOnlyEnv(process.cwd(), set, removeNames)\n }\n}\n\nfunction quote(value: string): string {\n return quoteEnvValue(value)\n}\n\nfunction splitLocal(raw: string): { top: string; custom: string } {\n const idx = raw.indexOf(DEV_VARS_DIVIDER)\n if (idx < 0) return { top: '', custom: raw }\n const after = raw.slice(idx + DEV_VARS_DIVIDER.length)\n return {\n top: raw.slice(0, idx).trimEnd(),\n custom: after.startsWith('\\n') ? after.slice(1) : after,\n }\n}\n\nfunction splitDevTarget(raw: string): { top: string; custom: string } {\n const idx = raw.indexOf(DEV_VARS_DIVIDER)\n if (idx >= 0) return splitLocal(raw)\n\n const lines = raw.split('\\n')\n const top: string[] = []\n const custom: string[] = []\n let target = top\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const name = assignmentName(line)\n const eq = line.indexOf('=')\n const valStart = eq >= 0 ? line.slice(eq + 1) : ''\n const block = [line]\n i++\n if (name && valStart.startsWith('\"') && !hasUnescapedQuote(valStart.slice(1))) {\n while (i < lines.length) {\n block.push(lines[i])\n const closed = hasUnescapedQuote(lines[i])\n i++\n if (closed) break\n }\n }\n if (name && !SDK_MANAGED_KEYS.has(name)) target = custom\n target.push(...block)\n }\n while (top.length && top[top.length - 1] === '') top.pop()\n while (custom.length && custom[custom.length - 1] === '') custom.pop()\n return { top: top.join('\\n'), custom: custom.join('\\n') }\n}\n\nfunction assignmentName(line: string): string | null {\n const eq = line.indexOf('=')\n if (eq < 0) return null\n const match = line.slice(0, eq).match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/)\n return match?.[1] ?? null\n}\n\nfunction hasUnescapedQuote(s: string): boolean {\n let escaped = false\n for (const ch of s) {\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') return true\n }\n return false\n}\n\nfunction rewriteCustomSection(\n custom: string,\n set: Record<string, string>,\n remove: Set<string>,\n): string {\n const lines = custom.split('\\n')\n const out: string[] = []\n const pending = new Set(Object.keys(set))\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const name = assignmentName(line)\n const eq = line.indexOf('=')\n const valStart = eq >= 0 ? line.slice(eq + 1) : ''\n const block = [line]\n i++\n if (name && valStart.startsWith('\"') && !hasUnescapedQuote(valStart.slice(1))) {\n while (i < lines.length) {\n block.push(lines[i])\n const closed = hasUnescapedQuote(lines[i])\n i++\n if (closed) break\n }\n }\n if (name && (remove.has(name) || pending.has(name))) {\n if (pending.has(name)) {\n out.push(`${name}=${quote(set[name])}`)\n pending.delete(name)\n }\n continue\n }\n out.push(...block)\n }\n while (out.length && out[out.length - 1] === '') out.pop()\n for (const name of Array.from(pending).sort()) {\n out.push(`${name}=${quote(set[name])}`)\n }\n return out.join('\\n')\n}\n\nfunction writeDevTargetPatch(\n set: Record<string, string> = {},\n removeNames: string[] = [],\n): void {\n const path = devTargetPath()\n const existing = existsSync(path) ? readFileSync(path, 'utf-8') : ''\n const { top, custom: existingCustom } = splitDevTarget(existing)\n const custom = rewriteCustomSection(existingCustom, set, new Set(removeNames))\n const body = top\n ? `${top}\\n\\n${DEV_VARS_DIVIDER}\\n${custom}${custom ? '\\n' : ''}`\n : `${DEV_VARS_DIVIDER}\\n${custom}${custom ? '\\n' : ''}`\n writeFileSync(path, body)\n}\n\nexport async function remoteDeployState(appName: string, token: string): Promise<RemoteDeployState> {\n const res = await fetch(`${process.env.DEEPSPACE_DEPLOY_URL ?? 'https://deploy-worker.deep.space'}/api/deploy/${encodeURIComponent(appName)}`, {\n headers: { Authorization: `Bearer ${token}` },\n })\n const text = await res.text().catch(() => '')\n let body: { deployed?: unknown; error?: string } = {}\n if (text) {\n try {\n body = JSON.parse(text) as { deployed?: unknown; error?: string }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new Error(`Could not determine deploy status for ${appName}: invalid JSON response (${message}).`)\n }\n }\n if (!res.ok) {\n const detail = body.error ?? (text || 'unknown error')\n throw new Error(`Could not determine deploy status for ${appName} (${res.status}): ${detail}`)\n }\n if (body.deployed === true) return 'deployed'\n if (body.deployed === false) return 'not-deployed'\n throw new Error(`Could not determine deploy status for ${appName}: response missing \"deployed\".`)\n}\n\nexport async function remoteAvailable(appName: string, token: string): Promise<boolean> {\n return (await remoteDeployState(appName, token)) === 'deployed'\n}\n\nasync function mintScopedSecretsToken(appName: string, token: string): Promise<string> {\n const body = await collaboratorFetch<ScopedSecretsToken>(appName, token, '/secrets-token', { method: 'POST' })\n if (!body.token) throw new Error('Platform API did not return an app-secret access token.')\n return body.token\n}\n\nexport async function remoteFetch<T>(appName: string, token: string, path = '', init: RequestInit = {}): Promise<T> {\n const scopedToken = await mintScopedSecretsToken(appName, token)\n const res = await fetch(`https://${appName}.app.space/_deepspace/secrets${path}`, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${scopedToken}`,\n ...(init.headers ?? {}),\n },\n })\n const contentType = res.headers.get('content-type') ?? 'unknown'\n const text = await res.text().catch(() => '')\n let body: (T & { error?: string }) | null = null\n let parseError: string | null = null\n if (text && contentType.toLowerCase().includes('json')) {\n try {\n body = JSON.parse(text) as T & { error?: string }\n } catch (err) {\n parseError = err instanceof Error ? err.message : String(err)\n }\n }\n if (!res.ok) {\n if (body?.error) throw new Error(body.error)\n const snippet = text ? ` Body: ${text.slice(0, ERROR_SNIPPET_CHARS)}` : ' Body: <empty>'\n const parseDetail = parseError ? ` JSON parse failed: ${parseError}.` : ''\n throw new Error(`Remote secrets request failed (${res.status}; content-type: ${contentType}).${parseDetail}${snippet}`)\n }\n if (body) return body\n if (!text) return {} as T\n const parseDetail = parseError ? ` JSON parse failed: ${parseError}.` : ''\n throw new Error(`Remote secrets response was not JSON (${res.status}; content-type: ${contentType}).${parseDetail} Body: ${text.slice(0, ERROR_SNIPPET_CHARS)}`)\n}\n\nfunction apiUrl(): string {\n return process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\n}\n\nexport async function collaboratorFetch<T>(appName: string, token: string, path: string, init: RequestInit = {}): Promise<T> {\n const url = `${apiUrl()}/api/app-collaborators/${encodeURIComponent(appName)}${path}`\n const res = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...(init.headers ?? {}),\n },\n })\n const text = await res.text().catch(() => '')\n let body = {} as T & { error?: string }\n if (text) {\n try {\n body = JSON.parse(text) as T & { error?: string }\n } catch {\n if (res.status === 404) throw new Error(COLLABORATOR_ROUTES_404)\n if (!res.ok) throw new Error(`Collaborator request failed (${res.status}): ${text.slice(0, ERROR_SNIPPET_CHARS)}`)\n throw new Error(`Collaborator response was not JSON (${res.status}): ${text.slice(0, ERROR_SNIPPET_CHARS)}`)\n }\n }\n if (!res.ok) {\n if (res.status === 404 && (!body.error || body.error === 'Not found' || body.error === 'not_found')) {\n throw new Error(COLLABORATOR_ROUTES_404)\n }\n if (body.error === 'platform_schema_not_migrated') {\n const diagnostic = body as { action?: unknown }\n const action = typeof diagnostic.action === 'string'\n ? ` ${diagnostic.action}`\n : ''\n throw new Error(`${COLLABORATOR_SCHEMA_NOT_MIGRATED}${action}`)\n }\n throw new Error(body.error ?? `Collaborator request failed (${res.status})`)\n }\n return body as T\n}\n\nasync function requireRemoteSecretsAvailable(appName: string, token: string): Promise<void> {\n const state = await remoteDeployState(appName, token)\n if (state === 'deployed') return\n throw new Error(\n 'Remote secrets are available after the first deploy. Deploy this app first, then run `deepspace secrets push`; ' +\n '`deepspace secrets set --dev` writes dev-only secrets for `deepspace dev` without touching remote.',\n )\n}\n\nfunction diffMaps(local: Record<string, string>, remote: Record<string, string>): {\n localOnly: string[]\n remoteOnly: string[]\n changed: string[]\n matching: string[]\n} {\n const localOnly: string[] = []\n const remoteOnly: string[] = []\n const changed: string[] = []\n const matching: string[] = []\n for (const [name, value] of Object.entries(local)) {\n if (!(name in remote)) localOnly.push(name)\n else if (remote[name] !== value) changed.push(name)\n else matching.push(name)\n }\n for (const name of Object.keys(remote)) {\n if (!(name in local)) remoteOnly.push(name)\n }\n return { localOnly, remoteOnly, changed, matching }\n}\n\nfunction diffNames(local: string[], remote: string[]): {\n localOnly: string[]\n remoteOnly: string[]\n} {\n const localSet = new Set(local)\n const remoteSet = new Set(remote)\n return {\n localOnly: local.filter((name) => !remoteSet.has(name)).sort(),\n remoteOnly: remote.filter((name) => !localSet.has(name)).sort(),\n }\n}\n\nfunction statusLine(d: ReturnType<typeof diffMaps> | null, remote: boolean): string {\n if (!remote) return 'Secrets: remote unavailable until first deploy; dev-only .env section updated.'\n if (!d || (!d.localOnly.length && !d.remoteOnly.length && !d.changed.length)) {\n return 'Secrets: synced .env section matches remote.'\n }\n return `Secrets: ${d.localOnly.length} local-only, ${d.remoteOnly.length} remote-only, ${d.changed.length} changed. Run \\`deepspace secrets diff\\`.`\n}\n\nfunction nameStatusLine(d: ReturnType<typeof diffNames>): string {\n if (!d.localOnly.length && !d.remoteOnly.length) {\n return 'Secrets: synced .env section has the same names as remote.'\n }\n return `Secrets: ${d.localOnly.length} local-only, ${d.remoteOnly.length} remote-only. Run \\`deepspace secrets diff\\` to compare values.`\n}\n\nasync function compare(appName: string, token: string): Promise<ReturnType<typeof diffMaps> | null> {\n if (!(await remoteAvailable(appName, token))) return null\n const local = readSyncedTarget()\n const remote = await remoteFetch<RemotePull>(appName, token, '/pull')\n return diffMaps(local, remote.secrets ?? {})\n}\n\nconst set = defineCommand({\n meta: { name: 'set', description: 'Set an app secret' },\n args: {\n assignment: { type: 'positional', required: true, description: 'KEY=value' },\n dev: {\n type: 'boolean',\n default: false,\n description: 'Write only to the dev-only .env section used by `deepspace dev`; never sync to the deployed app',\n },\n },\n async run({ args }) {\n const [name, value] = parseAssignment(String(args.assignment))\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n if (args.dev) {\n writeLocalPatch({ [name]: value })\n console.log('Secrets: updated dev-only .env section for `deepspace dev`; remote was not changed.')\n return\n }\n const state = await remoteDeployState(appName, token)\n if (state === 'not-deployed') {\n writeLocalPatch({ [name]: value })\n console.log('Secrets: app is not deployed; wrote to dev-only .env section. Run `deepspace secrets push` after deploy.')\n return\n }\n await remoteFetch(appName, token, '', { method: 'PATCH', body: JSON.stringify({ set: { [name]: value } }) })\n if (hasLegacyDevVars(process.cwd())) writeDevTargetPatch({ [name]: value })\n else patchManagedSyncedEnv(process.cwd(), { [name]: value })\n console.log('Secrets: updated remote and synced .env section.')\n },\n})\n\nconst unset = defineCommand({\n meta: { name: 'unset', description: 'Remove an app secret' },\n args: {\n name: { type: 'positional', required: true, description: 'Secret name' },\n dev: {\n type: 'boolean',\n default: false,\n description: 'Remove only from the dev-only .env section used by `deepspace dev`; never sync to the deployed app',\n },\n },\n async run({ args }) {\n const name = String(args.name)\n if (!SECRET_NAME_RE.test(name)) throw new Error(`Invalid secret name \"${name}\".`)\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n if (args.dev) {\n writeLocalPatch({}, [name])\n console.log('Secrets: removed from dev-only .env section; remote was not changed.')\n return\n }\n const state = await remoteDeployState(appName, token)\n if (state === 'not-deployed') {\n writeLocalPatch({}, [name])\n console.log('Secrets: app is not deployed; removed from dev-only .env section if present.')\n return\n }\n await remoteFetch(appName, token, '', { method: 'PATCH', body: JSON.stringify({ delete: [name] }) })\n if (hasLegacyDevVars(process.cwd())) writeDevTargetPatch({}, [name])\n else patchManagedSyncedEnv(process.cwd(), {}, [name])\n console.log('Secrets: removed from remote and synced .env section.')\n },\n})\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List app secret names and metadata' },\n async run() {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n await requireRemoteSecretsAvailable(appName, token)\n const body = await remoteFetch<RemoteList>(appName, token)\n for (const item of body.secrets ?? []) console.log(`${item.name}\\tversion=${item.version}\\tupdated=${item.updatedAt}`)\n const d = diffNames(Object.keys(readSyncedTarget()), (body.secrets ?? []).map((item) => item.name))\n console.log(nameStatusLine(d))\n },\n})\n\nconst pull = defineCommand({\n meta: { name: 'pull', description: 'Pull remote app secrets into the synced .env section' },\n async run() {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n await requireRemoteSecretsAvailable(appName, token)\n const body = await remoteFetch<RemotePull>(appName, token, '/pull')\n const remoteSecrets = body.secrets ?? {}\n if (hasLegacyDevVars(process.cwd())) {\n writeDevTargetPatch(remoteSecrets)\n } else {\n replaceManagedSyncedEnv(process.cwd(), remoteSecrets)\n }\n const count = Object.keys(remoteSecrets).length\n console.log(`Secrets: pulled ${count} remote secret${count === 1 ? '' : 's'} into synced .env section.`)\n },\n})\n\nconst push = defineCommand({\n meta: { name: 'push', description: 'Push dev-only .env secrets to remote and move them to synced' },\n async run() {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n const local = readDevOnlyTarget()\n await requireRemoteSecretsAvailable(appName, token)\n const names = Object.keys(local)\n if (!names.length) {\n console.log('Secrets: no dev-only .env secrets to push.')\n return\n }\n await remoteFetch(appName, token, '', { method: 'PATCH', body: JSON.stringify({ set: local }) })\n if (hasLegacyDevVars(process.cwd())) {\n // Legacy .dev.vars has no separate synced/dev-only partitions.\n console.log(`Secrets: pushed ${names.length} dev-only secret${names.length === 1 ? '' : 's'} to remote.`)\n } else {\n moveManagedDevOnlyToSynced(process.cwd(), names)\n console.log(`Secrets: pushed ${names.length} dev-only secret${names.length === 1 ? '' : 's'} to remote and moved ${names.length === 1 ? 'it' : 'them'} to synced .env section.`)\n }\n },\n})\n\nconst diff = defineCommand({\n meta: { name: 'diff', description: 'Compare synced .env section with remote app secrets' },\n async run() {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n await requireRemoteSecretsAvailable(appName, token)\n const d = await compare(appName, token)\n for (const name of d?.localOnly ?? []) console.log(`local-only\\t${name}`)\n for (const name of d?.remoteOnly ?? []) console.log(`remote-only\\t${name}`)\n for (const name of d?.changed ?? []) console.log(`changed\\t${name}`)\n console.log(statusLine(d, true))\n },\n})\n\nconst collaboratorsList = defineCommand({\n meta: { name: 'list', description: 'List app secret collaborators' },\n async run() {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n const body = await collaboratorFetch<{ collaborators: SecretCollaborator[] }>(appName, token, '/collaborators')\n for (const item of body.collaborators ?? []) {\n console.log(`${item.emailDisplay}\\t${item.userId}\\tcreated=${new Date(item.createdAt).toISOString()}`)\n }\n if (!body.collaborators?.length) console.log('No secrets collaborators.')\n },\n})\n\nconst collaboratorsAdd = defineCommand({\n meta: { name: 'add', description: 'Add an existing DeepSpace user as a secrets collaborator' },\n args: {\n email: { type: 'positional', required: true, description: 'Collaborator email' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n const body = await collaboratorFetch<{ collaborator: SecretCollaborator }>(appName, token, '/collaborators', {\n method: 'POST',\n body: JSON.stringify({ email: String(args.email) }),\n })\n console.log(`Added ${body.collaborator.emailDisplay} (${body.collaborator.userId}) as a secrets collaborator.`)\n },\n})\n\nconst collaboratorsRemove = defineCommand({\n meta: { name: 'remove', description: 'Remove a secrets collaborator' },\n args: {\n target: { type: 'positional', required: true, description: 'Collaborator email or user id' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n const target = String(args.target)\n let userId = target\n if (target.includes('@')) {\n const body = await collaboratorFetch<{ collaborators: SecretCollaborator[] }>(appName, token, '/collaborators')\n const normalized = target.trim().toLowerCase()\n const match = body.collaborators.find((item) => item.emailNormalized === normalized)\n if (!match) throw new Error(`No collaborator found for ${target}.`)\n userId = match.userId\n }\n await collaboratorFetch(appName, token, `/collaborators/${encodeURIComponent(userId)}`, { method: 'DELETE' })\n console.log(`Removed secrets collaborator ${target}.`)\n },\n})\n\nconst invitesList = defineCommand({\n meta: { name: 'list', description: 'List app secret collaborator invites' },\n async run() {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n const body = await collaboratorFetch<{ invites: SecretInvite[] }>(appName, token, '/invites')\n for (const invite of body.invites ?? []) {\n const status = invite.revokedAt\n ? 'revoked'\n : invite.acceptedAt\n ? 'accepted'\n : new Date(invite.expiresAt).getTime() <= Date.now()\n ? 'expired'\n : 'pending'\n console.log(`${invite.id}\\t${invite.emailDisplay}\\tstatus=${status}\\texpires=${new Date(invite.expiresAt).toISOString()}`)\n }\n if (!body.invites?.length) console.log('No secrets collaborator invites.')\n },\n})\n\nconst invitesRevoke = defineCommand({\n meta: { name: 'revoke', description: 'Revoke a pending app secret collaborator invite' },\n args: {\n inviteId: { type: 'positional', required: true, description: 'Invite id' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const appName = requireAppName(undefined)\n await collaboratorFetch(appName, token, `/invites/${encodeURIComponent(String(args.inviteId))}`, { method: 'DELETE' })\n console.log(`Revoked secrets collaborator invite ${String(args.inviteId)}.`)\n },\n})\n\nconst invites = defineCommand({\n meta: { name: 'invites', description: 'Manage app secret collaborator invites' },\n subCommands: { list: invitesList, revoke: invitesRevoke },\n})\n\nconst collaborators = defineCommand({\n meta: { name: 'collaborators', description: 'Manage app secret collaborators' },\n subCommands: { list: collaboratorsList, add: collaboratorsAdd, remove: collaboratorsRemove, invites },\n})\n\nexport default defineCommand({\n meta: { name: 'secrets', description: 'Manage app-owned DeepSpace secrets' },\n subCommands: { set, unset, list, pull, push, diff, collaborators },\n})\n","/**\n * deepspace kill [--port N] [--all]\n *\n * Stops a local dev server bound to the given port, plus the workerd\n * child processes that wrangler/Vite would normally clean up but\n * sometimes leak when the parent dies ungracefully (Ctrl-C in a\n * detached terminal, IDE close, sandbox deny on signal, etc).\n *\n * deepspace kill # kill listener on 5173 + its workerd children\n * deepspace kill --port 5180 # kill listener on a different port\n * deepspace kill --all # also sweep ALL stray workerd/wrangler procs on the machine\n *\n * Cross-platform: uses lsof/pgrep on macOS and Linux, and PowerShell\n * (Get-NetTCPConnection / Get-CimInstance) on Windows. PowerShell ships\n * with every supported Windows version since 7; no extra install required.\n *\n * Always sends SIGTERM first, waits briefly, then SIGKILL anything\n * still alive — same shape as `vite`'s own shutdown handler so we\n * don't trample DO state mid-write. (On Windows, SIGTERM is best-effort:\n * Win32 has no real signals, so node maps both to TerminateProcess. We\n * still issue them in the same order for consistent log output.)\n */\n\nimport { defineCommand } from 'citty'\nimport { spawnSync } from 'node:child_process'\nimport { setTimeout as wait } from 'node:timers/promises'\n\nconst DEFAULT_PORT = 5173\nconst SIGTERM_GRACE_MS = 1500\nconst IS_WIN = process.platform === 'win32'\n\nexport default defineCommand({\n meta: {\n name: 'kill',\n description: 'Kill the local dev server and any orphaned workerd processes',\n },\n args: {\n port: {\n type: 'string',\n description: `Port the dev server is bound to (default ${DEFAULT_PORT}, or $DEEPSPACE_PORT)`,\n required: false,\n },\n all: {\n type: 'boolean',\n description: 'Also kill stray workerd/wrangler processes across all ports',\n default: false,\n },\n },\n async run({ args }) {\n const port = resolvePort(args.port)\n const targets = new Set<number>()\n\n // 1. Anything LISTENing on the dev port (vite + the workerd child it\n // publishes through, occasionally a stray inspector).\n for (const pid of listenerPids(port)) targets.add(pid)\n\n // 2. Children of those listeners — wrangler/vite tend to spawn workerd\n // as a sibling, but in some shells it ends up as a child instead.\n for (const pid of [...targets]) {\n for (const child of childPids(pid)) targets.add(child)\n }\n\n // 3. With --all, sweep workerd / wrangler / vite anywhere on the box.\n // Useful when port 5173 is \"free\" but a leftover workerd from a\n // previous run is still holding D1 / DO state in .wrangler/.\n if (args.all) {\n for (const pid of processPidsByName(['workerd', 'wrangler', 'vite'])) {\n targets.add(pid)\n }\n }\n\n if (targets.size === 0) {\n console.log(\n args.all\n ? `Nothing listening on :${port} and no stray workerd/wrangler/vite processes found.`\n : `Nothing listening on :${port}. (Pass --all to sweep stray workerd/wrangler.)`,\n )\n return\n }\n\n // SIGTERM pass.\n for (const pid of targets) {\n if (sendSignal(pid, 'SIGTERM')) {\n console.log(`SIGTERM → pid ${pid}`)\n }\n }\n await wait(SIGTERM_GRACE_MS)\n\n const stillAlive: number[] = []\n for (const pid of targets) {\n if (isAlive(pid)) stillAlive.push(pid)\n }\n\n // SIGKILL holdouts.\n for (const pid of stillAlive) {\n if (sendSignal(pid, 'SIGKILL')) {\n console.log(`SIGKILL → pid ${pid} (did not exit on SIGTERM)`)\n }\n }\n\n // Re-verify the port is free.\n await wait(200)\n const remaining = listenerPids(port)\n if (remaining.length > 0) {\n console.error(\n `Port ${port} is still held by pid(s) ${remaining.join(', ')} — try \\`deepspace kill --port ${port}\\` again, or kill manually.`,\n )\n process.exit(1)\n }\n\n console.log(`Port ${port} is free.`)\n },\n})\n\nfunction resolvePort(arg?: string): number {\n const raw = arg ?? process.env.DEEPSPACE_PORT\n if (!raw) return DEFAULT_PORT\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n console.error(`Invalid port: ${raw}. Must be an integer between 1 and 65535.`)\n process.exit(1)\n }\n return n\n}\n\n// ── Platform-specific helpers ─────────────────────────────────────────────\n\nfunction listenerPids(port: number): number[] {\n if (IS_WIN) {\n // Get-NetTCPConnection is the modern replacement for netstat -ano.\n // -ErrorAction SilentlyContinue swallows \"No matching connection\" so\n // the command exits 0 with empty stdout instead of a noisy red error.\n return runPowershell(\n `Get-NetTCPConnection -LocalPort ${port} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess`,\n )\n }\n // -t prints PIDs only, one per line; -nP avoids DNS / service lookups.\n return run(['lsof', '-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-t'])\n}\n\nfunction childPids(parentPid: number): number[] {\n if (IS_WIN) {\n return runPowershell(\n `Get-CimInstance Win32_Process -Filter \"ParentProcessId=${parentPid}\" | Select-Object -ExpandProperty ProcessId`,\n )\n }\n return run(['pgrep', '-P', String(parentPid)])\n}\n\nfunction processPidsByName(names: string[]): number[] {\n const all = new Set<number>()\n if (IS_WIN) {\n // Match against process Name (e.g. \"workerd\") AND CommandLine (catches\n // npx-launched scripts like \"vite\" that show up as node.exe with vite\n // in the args).\n const orClauses = names\n .map((n) => `($_.Name -like '*${n}*') -or ($_.CommandLine -like '*${n}*')`)\n .join(' -or ')\n const script = `Get-CimInstance Win32_Process | Where-Object { ${orClauses} } | Select-Object -ExpandProperty ProcessId`\n for (const pid of runPowershell(script)) {\n if (pid !== process.pid) all.add(pid)\n }\n return [...all]\n }\n for (const name of names) {\n for (const pid of run(['pgrep', '-f', name])) {\n if (pid !== process.pid) all.add(pid)\n }\n }\n return [...all]\n}\n\n// ── Process primitives ────────────────────────────────────────────────────\n\n/** Run a command and return whitespace-separated PIDs (empty array on failure). */\nfunction run(cmd: string[]): number[] {\n try {\n const r = spawnSync(cmd[0], cmd.slice(1), { encoding: 'utf-8' })\n if (r.status !== 0) return []\n return parsePidLines(r.stdout)\n } catch {\n return []\n }\n}\n\n/**\n * Run a PowerShell snippet. Prefers `pwsh` (PowerShell 7+) when available\n * and falls back to `powershell.exe` (Windows PowerShell 5.1, ships with\n * every Windows version we care about).\n */\nfunction runPowershell(script: string): number[] {\n const exe = pwshOrPowershell()\n try {\n const r = spawnSync(\n exe,\n ['-NoProfile', '-NonInteractive', '-Command', script],\n { encoding: 'utf-8' },\n )\n if (r.status !== 0) return []\n return parsePidLines(r.stdout)\n } catch {\n return []\n }\n}\n\nfunction pwshOrPowershell(): string {\n // `pwsh` is the modern cross-platform binary; `powershell.exe` is the\n // legacy Windows-only one. Try modern first, fall back if missing.\n const probe = spawnSync('pwsh', ['-NoProfile', '-Command', '$PSVersionTable.PSVersion.Major'], {\n encoding: 'utf-8',\n })\n if (probe.status === 0) return 'pwsh'\n return 'powershell.exe'\n}\n\nfunction parsePidLines(stdout: string): number[] {\n return stdout\n .split(/\\s+/)\n .map((s) => Number.parseInt(s, 10))\n .filter((n) => Number.isFinite(n) && n > 0)\n}\n\nfunction sendSignal(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(pid, signal)\n return true\n } catch {\n return false\n }\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n // signal 0 = \"do nothing, just check\"\n process.kill(pid, 0)\n return true\n } catch {\n return false\n }\n}\n","/**\n * deepspace test [suite] [--port N]\n *\n * Runs tests for a DeepSpace app. Always uses dev workers.\n *\n * deepspace test # smoke + api (quick check)\n * deepspace test smoke # smoke tests only\n * deepspace test api # API tests only\n * deepspace test e2e # all Playwright tests\n * deepspace test unit # vitest unit tests\n * deepspace test all # everything\n * deepspace test <file> # run specific test file\n *\n * Port is `--port` > $DEEPSPACE_PORT > 5173. The chosen port is exported as\n * DEEPSPACE_PORT to the Playwright child so the config + webServer both bind\n * to the same address. Pass a different port per app to run multiple apps\n * (and test suites) in parallel.\n */\n\nimport { defineCommand } from 'citty'\nimport { resolve } from 'node:path'\nimport { sync as spawnSync } from 'cross-spawn'\nimport { ensureToken } from '../auth'\nimport { findAppDir, findChildApps } from '../lib/app-context'\nimport { writeDevVars } from '../env'\nimport { decodeJwtPayload } from '../jwt'\nimport { ensureInstallReady } from '../lib/install-status'\nimport { ensurePlaywright } from '../lib/playwright'\nimport { preflightWindowsWorkerd } from '../lib/preflight'\n\nconst DEFAULT_PORT = 5173\n\nexport default defineCommand({\n meta: {\n name: 'test',\n description: 'Run tests for your DeepSpace app',\n },\n args: {\n suite: {\n type: 'positional',\n description: 'Test suite: smoke, api, e2e, unit, all (default: smoke+api)',\n required: false,\n },\n port: {\n type: 'string',\n description: `Port for vite/webServer (default ${DEFAULT_PORT}, or $DEEPSPACE_PORT)`,\n required: false,\n },\n },\n async run({ args }) {\n const suite = args.suite ?? 'default'\n const port = resolvePort(args.port)\n\n // Resolve the app root by walking up from cwd, matching `deepspace dev`.\n const start = resolve('.')\n const appDir = findAppDir(start)\n if (!appDir) {\n console.error(`No wrangler.toml found at or above ${start}.`)\n const children = findChildApps(start)\n if (children.length > 0) {\n console.error('Did you mean to run inside one of these app directories?')\n for (const c of children) console.error(` cd ${c}`)\n } else {\n console.error('Run from a DeepSpace app directory (one containing wrangler.toml).')\n }\n process.exit(1)\n }\n\n ensureInstallReady(appDir)\n\n // Always write .dev.vars pointing to dev workers. A logged-in user is\n // required so writeDevVars can mint APP_OWNER_JWT via the auth-worker.\n let token: string\n let ownerId: string\n try {\n token = await ensureToken()\n const payload = decodeJwtPayload<{ sub: string }>(token)\n ownerId = payload.sub\n } catch (err) {\n console.error('`deepspace test` requires you to be logged in. Run `deepspace login` first.')\n process.exit(1)\n }\n\n await writeDevVars(appDir, 'dev', ownerId, token)\n\n if (suite !== 'unit') {\n preflightWindowsWorkerd(appDir)\n ensurePlaywright(appDir)\n }\n\n let exitCode = 0\n\n switch (suite) {\n case 'smoke':\n exitCode = runPlaywright(appDir, ['tests/smoke.spec.ts'], port)\n break\n case 'api':\n exitCode = runPlaywright(appDir, ['tests/api.spec.ts'], port)\n break\n case 'e2e':\n exitCode = runPlaywright(appDir, [], port)\n break\n case 'unit':\n exitCode = runVitest(appDir)\n break\n case 'all':\n exitCode = runVitest(appDir)\n if (exitCode === 0) exitCode = runPlaywright(appDir, [], port)\n break\n case 'default':\n exitCode = runPlaywright(appDir, ['tests/smoke.spec.ts', 'tests/api.spec.ts'], port)\n break\n default:\n if (suite.endsWith('.spec.ts')) {\n exitCode = runPlaywright(appDir, [suite], port)\n } else {\n console.error(`Unknown test suite: ${suite}`)\n console.error('Available: smoke, api, e2e, unit, all')\n process.exit(1)\n }\n }\n\n process.exit(exitCode)\n },\n})\n\nfunction runPlaywright(appDir: string, testFiles: string[], port: number): number {\n const result = spawnSync('npx', [\n 'playwright', 'test',\n '--config', 'tests/playwright.config.ts',\n ...testFiles,\n ], {\n cwd: appDir,\n stdio: 'inherit',\n env: { ...process.env, DEEPSPACE_PORT: String(port) },\n })\n return result.status ?? 1\n}\n\nfunction runVitest(appDir: string): number {\n const result = spawnSync('npx', ['vitest', 'run', '--passWithNoTests'], {\n cwd: appDir, stdio: 'inherit',\n })\n return result.status ?? 1\n}\n\nfunction resolvePort(arg?: string): number {\n const raw = arg ?? process.env.DEEPSPACE_PORT\n if (!raw) return DEFAULT_PORT\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n console.error(`Invalid port: ${raw}. Must be an integer between 1 and 65535.`)\n process.exit(1)\n }\n return n\n}\n","import { execSync } from 'node:child_process'\nimport { sync as spawnSync } from 'cross-spawn'\n\nexport function ensurePlaywright(appDir: string) {\n try {\n // execSync interprets the command via shell, so it handles npx/npx.cmd\n // resolution on its own. Only spawn()/spawnSync() need cross-spawn.\n execSync('npx playwright --version', { cwd: appDir, stdio: 'pipe' })\n } catch {\n console.log('Installing Playwright...')\n execSync('npm install -D @playwright/test', { cwd: appDir, stdio: 'pipe' })\n }\n\n // `playwright install` is idempotent: a fast no-op when Chromium already\n // exists, and the first real browser download only when a browser command\n // actually needs it.\n const isLinux = process.platform === 'linux'\n const isRoot = isLinux && typeof process.getuid === 'function' && process.getuid() === 0\n const args = isRoot ? ['install', '--with-deps', 'chromium'] : ['install', 'chromium']\n const result = spawnSync('npx', ['playwright', ...args], {\n cwd: appDir,\n stdio: 'inherit',\n })\n\n if (result.status !== 0) {\n console.error('\\nPlaywright install failed. On Linux, system libs may be missing. Try:')\n console.error(' sudo npx playwright install --with-deps chromium')\n process.exit(1)\n }\n}\n","/**\n * deepspace screenshot <url> <output> [--full-page] [--wait-for-timeout ms]\n *\n * Takes a Playwright Chromium screenshot, installing the browser on demand.\n */\n\nimport { defineCommand } from 'citty'\nimport { sync as spawnSync } from 'cross-spawn'\nimport { resolve } from 'node:path'\nimport { ensurePlaywright } from '../lib/playwright'\n\nexport default defineCommand({\n meta: {\n name: 'screenshot',\n description: 'Take a Playwright screenshot, installing Chromium on demand',\n },\n args: {\n url: {\n type: 'positional',\n description: 'URL to capture, for example http://localhost:5173/',\n required: true,\n },\n output: {\n type: 'positional',\n description: 'Output image path, for example screenshot.png',\n required: true,\n },\n 'full-page': {\n type: 'boolean',\n description: 'Capture the full scrollable page',\n required: false,\n },\n 'wait-for-timeout': {\n type: 'string',\n description: 'Milliseconds to wait before capture',\n required: false,\n },\n },\n run({ args }) {\n const appDir = resolve('.')\n ensurePlaywright(appDir)\n\n const playwrightArgs = ['playwright', 'screenshot', args.url, args.output]\n if (args['full-page']) playwrightArgs.push('--full-page')\n if (args['wait-for-timeout']) {\n playwrightArgs.push('--wait-for-timeout', String(args['wait-for-timeout']))\n }\n\n const result = spawnSync('npx', playwrightArgs, {\n cwd: appDir,\n stdio: 'inherit',\n })\n\n process.exit(result.status ?? 1)\n },\n})\n","/**\n * deepspace test-accounts\n *\n * Manage test accounts for local development and CI.\n * Test accounts use @deepspace.test emails and are clearly\n * demarcated in the database. Max 10 per developer.\n *\n * Credentials are saved to ~/.deepspace/test-accounts.json (0600)\n * so they persist across projects and sessions.\n *\n * deepspace test-accounts create --email bot@deepspace.test --password Pass123!\n * deepspace test-accounts list\n * deepspace test-accounts delete --email bot@deepspace.test\n * deepspace test-accounts delete --id <id>\n * deepspace test-accounts clear # delete all (with confirm)\n * deepspace test-accounts clear --label e2e # delete only label=e2e\n * deepspace test-accounts clear --yes # skip confirm (CI)\n */\n\nimport { defineCommand } from 'citty'\nimport * as p from '@clack/prompts'\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { ensureToken, SESSION_PATH } from '../auth'\nimport { ENVS } from '../env'\n\nconst SESSION_COOKIE = '__Secure-better-auth.session_token'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\nconst DIR = join(homedir(), '.deepspace')\nconst ACCOUNTS_PATH = join(DIR, 'test-accounts.json')\n\n// ── Local credential store ─────────────────────────────────────────\n\ninterface StoredAccount {\n id: string\n email: string\n password: string\n userId: string\n name?: string\n label?: string | null\n createdAt: number\n}\n\nfunction loadAccounts(): StoredAccount[] {\n if (!existsSync(ACCOUNTS_PATH)) return []\n try {\n return JSON.parse(readFileSync(ACCOUNTS_PATH, 'utf-8'))\n } catch {\n return []\n }\n}\n\nfunction saveAccounts(accounts: StoredAccount[]) {\n mkdirSync(DIR, { recursive: true })\n writeFileSync(ACCOUNTS_PATH, JSON.stringify(accounts, null, 2), { mode: 0o600 })\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction sessionCookie(): string {\n const token = readFileSync(SESSION_PATH, 'utf-8').trim()\n return `${SESSION_COOKIE}=${encodeURIComponent(token)}`\n}\n\ninterface RemoteAccount {\n id: string\n email: string\n userId: string\n label: string | null\n createdAt: number\n}\n\nasync function fetchRemoteAccounts(): Promise<RemoteAccount[]> {\n const res = await fetch(`${AUTH_URL}/api/auth/test-accounts`, {\n headers: { Cookie: sessionCookie(), Origin: AUTH_URL },\n })\n const data = (await res.json().catch(() => ({}))) as {\n accounts?: RemoteAccount[]\n error?: string\n }\n if (!res.ok || !data.accounts) {\n throw new Error(data.error ?? 'Failed to list test accounts')\n }\n return data.accounts\n}\n\nasync function deleteRemote(id: string): Promise<void> {\n const res = await fetch(`${AUTH_URL}/api/auth/test-accounts/${id}`, {\n method: 'DELETE',\n headers: { Cookie: sessionCookie(), Origin: AUTH_URL },\n })\n if (!res.ok) {\n const data = (await res.json().catch(() => ({}))) as { error?: string }\n throw new Error(data.error ?? `DELETE returned ${res.status}`)\n }\n}\n\n// ── Subcommands ────────────────────────────────────────────────────\n\nconst create = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a test account',\n },\n args: {\n email: {\n type: 'string',\n description: 'Email (must end with @deepspace.test)',\n required: true,\n },\n password: {\n type: 'string',\n description: 'Password (min 8 characters)',\n required: true,\n },\n name: {\n type: 'string',\n description: 'Display name',\n required: false,\n },\n label: {\n type: 'string',\n description: 'Label for this test account',\n required: false,\n },\n },\n async run({ args }) {\n await ensureToken()\n\n const res = await fetch(`${AUTH_URL}/api/auth/test-accounts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Cookie: sessionCookie(),\n Origin: AUTH_URL,\n },\n body: JSON.stringify({\n email: args.email,\n password: args.password,\n name: args.name,\n label: args.label,\n }),\n })\n\n const data = (await res.json().catch(() => ({}))) as {\n id?: string\n email?: string\n userId?: string\n label?: string | null\n createdAt?: number\n error?: string\n }\n\n if (!res.ok || !data.id) {\n console.error(`Failed: ${data.error ?? 'Unknown error'}`)\n process.exit(1)\n }\n\n const account = data as { id: string; email: string; userId: string; label: string | null; createdAt: number }\n\n // Save credentials locally\n const accounts = loadAccounts()\n accounts.push({\n id: account.id,\n email: args.email,\n password: args.password,\n userId: account.userId,\n name: args.name,\n label: account.label,\n createdAt: account.createdAt,\n })\n saveAccounts(accounts)\n\n console.log(`Created test account:`)\n console.log(` ID: ${account.id}`)\n console.log(` Email: ${account.email}`)\n console.log(` Password: ${args.password}`)\n console.log(` UserID: ${account.userId}`)\n if (account.label) console.log(` Label: ${account.label}`)\n console.log(`\\nSaved to ${ACCOUNTS_PATH}`)\n },\n})\n\nconst list = defineCommand({\n meta: {\n name: 'list',\n description: 'List your test accounts',\n },\n async run() {\n await ensureToken()\n\n let remote: RemoteAccount[]\n try {\n remote = await fetchRemoteAccounts()\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n\n if (remote.length === 0) {\n console.log('No test accounts. Create one with: deepspace test-accounts create --email <email> --password <password>')\n return\n }\n\n // Merge with local credentials (passwords are only stored locally)\n const local = loadAccounts()\n const localByEmail = new Map(local.map((a) => [a.email, a]))\n\n console.log(`Test accounts (${remote.length}/10):\\n`)\n for (const a of remote) {\n const stored = localByEmail.get(a.email)\n const date = new Date(a.createdAt).toLocaleDateString()\n console.log(` ${a.email}${a.label ? ` (${a.label})` : ''}`)\n console.log(` ID: ${a.id} UserID: ${a.userId} Created: ${date}`)\n if (stored?.password) {\n console.log(` Password: ${stored.password}`)\n } else {\n console.log(` Password: (not saved locally)`)\n }\n }\n },\n})\n\nconst del = defineCommand({\n meta: {\n name: 'delete',\n description: 'Delete a test account by --email or --id',\n },\n args: {\n email: {\n type: 'string',\n description: 'Email of the test account to delete',\n required: false,\n },\n id: {\n type: 'string',\n description: 'ID of the test account to delete',\n required: false,\n },\n },\n async run({ args }) {\n if (!args.email && !args.id) {\n console.error('Provide --email <email> or --id <id>.')\n process.exit(1)\n }\n if (args.email && args.id) {\n console.error('Provide either --email or --id, not both.')\n process.exit(1)\n }\n\n await ensureToken()\n\n let targetId = args.id as string | undefined\n let targetEmail = args.email as string | undefined\n\n if (targetEmail && !targetId) {\n let remote: RemoteAccount[]\n try {\n remote = await fetchRemoteAccounts()\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n const match = remote.find((a) => a.email === targetEmail)\n if (!match) {\n console.error(`No test account with email ${targetEmail}.`)\n process.exit(1)\n }\n targetId = match.id\n }\n\n try {\n await deleteRemote(targetId!)\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n\n // Remove from local store\n const accounts = loadAccounts().filter(\n (a) => a.id !== targetId && (!targetEmail || a.email !== targetEmail),\n )\n saveAccounts(accounts)\n\n console.log(`Test account deleted${targetEmail ? `: ${targetEmail}` : `: ${targetId}`}`)\n },\n})\n\nconst clear = defineCommand({\n meta: {\n name: 'clear',\n description: 'Delete all your test accounts (or those matching --label)',\n },\n args: {\n label: {\n type: 'string',\n description: 'Only delete accounts with this label (e.g. e2e, slack-clone)',\n required: false,\n },\n yes: {\n type: 'boolean',\n description: 'Skip confirmation prompt (for CI scripts)',\n default: false,\n },\n },\n async run({ args }) {\n await ensureToken()\n\n let remote: RemoteAccount[]\n try {\n remote = await fetchRemoteAccounts()\n } catch (err) {\n console.error(`Failed: ${(err as Error).message}`)\n process.exit(1)\n }\n\n const targets = args.label\n ? remote.filter((a) => a.label === args.label)\n : remote\n\n if (targets.length === 0) {\n const suffix = args.label ? ` with label '${args.label}'` : ''\n console.log(`No test accounts${suffix} to delete.`)\n return\n }\n\n if (!args.yes) {\n const subject = args.label\n ? `${targets.length} test account(s) labeled '${args.label}'`\n : `all ${targets.length} test account(s)`\n const confirmed = await p.confirm({\n message: `Delete ${subject}? This is not reversible.`,\n initialValue: false,\n })\n if (p.isCancel(confirmed) || !confirmed) {\n console.log('Cancelled.')\n return\n }\n }\n\n let ok = 0\n const failures: Array<{ email: string; error: string }> = []\n for (const a of targets) {\n try {\n await deleteRemote(a.id)\n ok++\n } catch (err) {\n failures.push({ email: a.email, error: (err as Error).message })\n }\n }\n\n // Sync local store with what's actually deleted.\n const deletedIds = new Set(\n targets.filter((t) => !failures.find((f) => f.email === t.email)).map((t) => t.id),\n )\n saveAccounts(loadAccounts().filter((a) => !deletedIds.has(a.id)))\n\n console.log(`Deleted ${ok}/${targets.length} test account(s).`)\n if (failures.length > 0) {\n console.error(`\\nFailed:`)\n for (const f of failures) console.error(` ${f.email}: ${f.error}`)\n process.exit(1)\n }\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'test-accounts',\n description: 'Manage test accounts for development',\n },\n subCommands: {\n create,\n list,\n delete: del,\n clear,\n },\n})\n","/**\n * deepspace deploy\n *\n * Builds the app with Vite (Cloudflare plugin bundles both client + worker),\n * then uploads to the deploy worker which handles Cloudflare WfP deployment.\n *\n * Uses the same build pipeline as dev for full fidelity. Reads the output\n * wrangler.json (via .wrangler/deploy/config.json) to find the built assets\n * and worker bundle — the same contract that `wrangler deploy` uses.\n */\n\nimport { defineCommand } from 'citty'\nimport { execSync } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join, resolve, dirname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport * as p from '@clack/prompts'\nimport { createSpinner } from '../lib/spinner'\nimport { ensureInstallReady } from '../lib/install-status'\nimport { ensureToken } from '../auth'\nimport {\n ENVS,\n extractCustomDevVars,\n hasLegacyDevVars,\n parseDevVars,\n SDK_MANAGED_KEYS,\n} from '../env'\nimport {\n bindingManifestFromOutputConfig,\n validateBindingManifest,\n} from '../../server/rooms/binding-manifest'\nimport { resolveAppName } from '../../server/rooms/app-name'\nimport {\n resolveAppNameForEnv, readWranglerConfig, hasWranglerConfig,\n type WranglerConfig,\n} from '../lib/wrangler-env'\n\nconst DEPLOY_URL = process.env.DEEPSPACE_DEPLOY_URL ?? ENVS.prod.deploy\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\nconst SECRET_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/\n\nconst CLOUDFLARE_DEPLOY_ERROR_HINT =\n 'Deployment reached the DeepSpace deploy worker, but Cloudflare\\'s deployment ' +\n 'control-plane API failed. This is often caused by a Cloudflare Dashboard/API ' +\n 'incident or Workers for Platforms entitlement outage. Already deployed apps ' +\n 'should keep serving; wait for Cloudflare to recover and retry.'\n\n/**\n * SDK-reserved `run_worker_first` prefixes. Apps can't override or\n * shadow these; only declare additional patterns. The CLI strips the\n * reserved ones before forwarding so the platform never sees them\n * twice — keeps the deploy-side merge a clean set-union.\n */\nconst RESERVED_RUN_WORKER_FIRST = new Set([\n '/api/*',\n '/ws/*',\n '/internal/*',\n '/v1/*',\n '/_deepspace/*',\n])\n\nfunction extractRunWorkerFirst(cfg: { assets?: { run_worker_first?: unknown } }): string[] {\n const raw = cfg.assets?.run_worker_first\n if (!Array.isArray(raw)) return []\n const out: string[] = []\n const seen = new Set<string>()\n for (const entry of raw) {\n if (typeof entry !== 'string') continue\n const trimmed = entry.trim()\n if (!trimmed.startsWith('/')) continue\n if (RESERVED_RUN_WORKER_FIRST.has(trimmed)) continue\n if (seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction isLikelyCloudflareDeployFailure(status: number, error: string | undefined): boolean {\n if (status >= 500) return true\n if (!error) return false\n return [\n 'Upload session failed',\n 'Asset upload failed',\n 'Worker deploy failed',\n 'entitlements.not_available',\n 'Internal Server Error',\n ].some((needle) => error.includes(needle))\n}\n\nexport function formatDeployWorkerError(status: number, error: string | undefined): string {\n const detail = error ?? `Deployment error (${status})`\n if (!isLikelyCloudflareDeployFailure(status, error)) return detail\n return `${CLOUDFLARE_DEPLOY_ERROR_HINT}\\n\\nUnderlying error: ${detail}`\n}\n\nexport function legacyDevVarsAppSecretsRoomWarning(\n userSecrets: Record<string, string>,\n doManifest: Array<{ binding: string; className: string; sqlite: boolean }> | undefined,\n): string | null {\n if (!Object.keys(userSecrets).length) return null\n const hasAppSecretsRoom = (doManifest ?? []).some(\n (binding) => binding.binding === 'SECRETS_ROOMS' || binding.className === 'AppSecretsRoom',\n )\n if (!hasAppSecretsRoom) return null\n return 'Legacy .dev.vars secrets are still being deployed as direct Worker bindings even though AppSecretsRoom is configured. Move these values with `deepspace secrets set` to manage them through the app secrets store.'\n}\n\n/**\n * Must stay <= the deploy worker's MAX_UPLOAD_GROUP_BYTES, otherwise the worker\n * rejects a group with a 413 that postWithRetry won't retry (it's a 4xx),\n * dead-ending the deploy. The DEEPSPACE_DEPLOY_GROUP_BYTES override is clamped\n * to this.\n */\nconst MAX_GROUP_BYTES = 40 * 1024 * 1024\n\n/**\n * Soft cap on the serialized size of one asset *group*. We pack whole asset\n * entries into groups under this size and POST each group on its own, so no\n * single request carries the entire payload (a ~40MB+ body stalls and gets\n * reset mid-upload on a marginal uplink: `write EPIPE`). A single asset larger\n * than this is sent alone in its own group — we never split an individual\n * asset. Overridable via DEEPSPACE_DEPLOY_GROUP_BYTES, clamped to MAX_GROUP_BYTES.\n */\nconst GROUP_BYTES = (() => {\n const raw = Number(process.env.DEEPSPACE_DEPLOY_GROUP_BYTES)\n const v = Number.isInteger(raw) && raw > 0 ? raw : 3 * 1024 * 1024\n return Math.min(v, MAX_GROUP_BYTES)\n})()\n\n/**\n * Pack whole asset entries into groups whose serialized JSON stays under\n * `maxBytes`. We never split an individual asset across groups, so a single\n * asset larger than `maxBytes` becomes its own (oversized) group.\n */\nexport function packAssetGroups<T>(assets: T[], maxBytes: number): T[][] {\n const groups: T[][] = []\n let current: T[] = []\n let currentBytes = 2 // \"[]\"\n for (const a of assets) {\n const entryBytes = Buffer.byteLength(JSON.stringify(a), 'utf-8') + 1 // +1 ≈ comma\n if (current.length > 0 && currentBytes + entryBytes > maxBytes) {\n groups.push(current)\n current = []\n currentBytes = 2\n }\n current.push(a)\n currentBytes += entryBytes\n }\n if (current.length > 0) groups.push(current)\n return groups\n}\n\n/**\n * POST with retry + backoff. Chunked upload exists to survive a flaky uplink,\n * so we always retry on network errors (fetch throws — e.g. `write EPIPE` when\n * the edge resets a stalled upload). Transient server statuses (408/429/5xx)\n * are only retried when `retryServerErrors` is set; client 4xx are always\n * returned as-is (caller surfaces the message). `makeInit` is called per\n * attempt so the request body is rebuilt fresh each time.\n *\n * The group-staging endpoint is an idempotent PUT, so retrying its 5xx is safe.\n * The commit endpoint runs a real (non-idempotent) deploy, so it passes\n * `retryServerErrors: false` — a 5xx means the server already received and\n * possibly acted on the request, and re-sending could double-deploy. Only a\n * thrown fetch (connection reset before/without a response) is retried there.\n */\nexport async function postWithRetry(\n url: string,\n makeInit: () => RequestInit,\n { attempts = 4, retryServerErrors = true }: { attempts?: number; retryServerErrors?: boolean } = {},\n): Promise<Response> {\n let lastRes: Response | undefined\n let lastErr: unknown\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n const res = await fetch(url, makeInit())\n const isTransient =\n retryServerErrors && (res.status >= 500 || res.status === 408 || res.status === 429)\n if (!isTransient) {\n return res\n }\n lastRes = res\n } catch (err) {\n lastErr = err\n }\n if (attempt < attempts) {\n await new Promise((r) => setTimeout(r, Math.min(8_000, 500 * 2 ** (attempt - 1))))\n }\n }\n if (lastRes) return lastRes\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr))\n}\n\n/**\n * Best-effort cleanup of an upload's staged groups after a deploy gives up.\n * Fire-and-forget: a failed deploy must surface its real error, not a cleanup\n * error, so this never throws. It's not the only safety net either — the\n * deploy worker's R2 staging prefix carries a lifecycle rule that reaps\n * anything this misses (e.g. the CLI process is killed before it can abort).\n */\nasync function abortStagedUpload(\n appName: string,\n uploadId: string,\n totalGroups: number,\n token: string,\n): Promise<void> {\n try {\n await fetch(\n `${DEPLOY_URL}/api/deploy/${appName}/assets` +\n `?uploadId=${uploadId}&totalGroups=${totalGroups}`,\n { method: 'DELETE', headers: { Authorization: `Bearer ${token}` } },\n )\n } catch {\n // best-effort — orphaned groups are reaped by the staging lifecycle rule\n }\n}\n\nexport default defineCommand({\n meta: {\n name: 'deploy',\n description: 'Build and deploy your DeepSpace app',\n },\n args: {\n dir: {\n type: 'positional',\n description: 'App directory (default: current directory)',\n required: false,\n },\n env: {\n type: 'string',\n description:\n 'wrangler.toml [env.<name>] block to deploy (e.g. --env staging). ' +\n 'Omit to deploy the top-level config.',\n required: false,\n },\n },\n async run({ args }) {\n const appDir = resolve(args.dir ?? '.')\n const envName = typeof args.env === 'string' && args.env.trim() ? args.env.trim() : undefined\n\n // ── Read app name from wrangler.toml ──────────────────────\n if (!hasWranglerConfig(appDir)) {\n console.error('No wrangler.toml found. Are you in a DeepSpace app directory?')\n process.exit(1)\n }\n\n ensureInstallReady(appDir)\n\n p.intro('Deploying DeepSpace app')\n\n const wranglerConfig: WranglerConfig = readWranglerConfig(appDir)\n const nameRes = resolveAppNameForEnv(wranglerConfig, envName)\n if (!nameRes.ok) {\n p.cancel(nameRes.reason)\n process.exit(1)\n }\n // Refuse noncanonical names the same way `deepspace dev` does. Without\n // this, deploy would canonicalize server bindings while client constants\n // (`SCOPE_ID = app:${APP_NAME}`) and `[vars].APP_NAME` continued to use\n // the raw name — splitting identity across surfaces. Fail-fast so the\n // dev fixes wrangler.toml once and every surface reads from the same\n // source of truth.\n const declaredName = envName\n ? wranglerConfig.env?.[envName]?.name\n : wranglerConfig.name\n if (declaredName !== nameRes.name) {\n const where = envName ? `[env.${envName}].name` : '`name`'\n p.cancel(\n `wrangler.toml: ${where} \"${declaredName}\" is not in canonical form. ` +\n `Update it to \"${nameRes.name}\" and re-run.`,\n )\n process.exit(1)\n }\n const appName = nameRes.name\n p.log.info(envName ? `App: ${appName} (env: ${envName})` : `App: ${appName}`)\n\n // ── Ensure valid JWT ───────────────────────────────────────\n let token: string\n try {\n token = await ensureToken()\n } catch (err: any) {\n p.cancel(err.message)\n process.exit(1)\n }\n // ── Build with Vite (Cloudflare plugin bundles client + worker) ──\n // The Cloudflare Vite plugin reads `CLOUDFLARE_ENV` and applies the\n // matching `[env.<name>]` overrides from wrangler.toml when emitting\n // the built `dist/<app>/wrangler.json` and worker bundle. Set the env\n // var on the child process only — we don't want it leaking into other\n // shells the user might fan out from this one.\n const s = createSpinner()\n s.start('Building...')\n try {\n execSync('npx vite build', {\n cwd: appDir,\n stdio: 'pipe',\n env: envName\n ? { ...process.env, CLOUDFLARE_ENV: envName }\n : process.env,\n })\n } catch (err: any) {\n s.stop('Build failed')\n // Show both streams. Vite writes build errors to stderr, but the Rules of\n // Hooks checker (vite-plugin-checker) prints its diagnostics to stdout —\n // showing only stderr would collapse a hooks violation into a bare\n // \"Command failed\" and hide the exact fix the developer needs.\n const detail = [err.stdout?.toString(), err.stderr?.toString()]\n .filter(Boolean)\n .join('\\n')\n .trim()\n console.error(detail || err.message)\n process.exit(1)\n }\n s.stop('Built')\n\n // ── Locate build output via .wrangler/deploy/config.json ──\n // This is the same contract that `wrangler deploy` uses after `vite build`.\n const deployConfigPath = join(appDir, '.wrangler', 'deploy', 'config.json')\n if (!existsSync(deployConfigPath)) {\n p.cancel('Build output config not found at .wrangler/deploy/config.json')\n process.exit(1)\n }\n\n const deployConfig = JSON.parse(readFileSync(deployConfigPath, 'utf-8')) as { configPath: string }\n const outputWranglerPath = resolve(dirname(deployConfigPath), deployConfig.configPath)\n\n if (!existsSync(outputWranglerPath)) {\n p.cancel(`Output wrangler.json not found at ${outputWranglerPath}`)\n process.exit(1)\n }\n\n const outputConfig = JSON.parse(readFileSync(outputWranglerPath, 'utf-8')) as {\n name?: string\n main: string\n assets?: { directory: string }\n durable_objects?: { bindings: Array<{ name: string; class_name: string }> }\n migrations?: Array<{ new_sqlite_classes?: string[] }>\n }\n\n // Defense in depth: the deploy CLI sends `appName` as the registry\n // slot and Cloudflare Vite plugin bakes a `name` field into the\n // built wrangler.json. They MUST agree — if the plugin ever regresses\n // on `CLOUDFLARE_ENV` application, we'd otherwise ship one\n // configuration's worker bundle under another configuration's name.\n // Fail loudly before the upload starts.\n if (outputConfig.name && outputConfig.name !== appName) {\n const envHint = envName ? ` (--env ${envName})` : ''\n p.cancel(\n `Build output mismatch: expected name \"${appName}\"${envHint}, ` +\n `but the built wrangler.json declares \"${outputConfig.name}\". ` +\n `This usually means the Cloudflare Vite plugin didn't apply ` +\n `the requested env block. Check the plugin version and re-run.`,\n )\n process.exit(1)\n }\n\n const workerDir = dirname(outputWranglerPath)\n const workerBundlePath = join(workerDir, outputConfig.main)\n const clientDir = outputConfig.assets?.directory\n ? resolve(workerDir, outputConfig.assets.directory)\n : null\n\n if (!existsSync(workerBundlePath)) {\n p.cancel(`Worker bundle not found at ${workerBundlePath}`)\n process.exit(1)\n }\n if (!clientDir || !existsSync(clientDir)) {\n p.cancel(`Client assets not found at ${clientDir}`)\n process.exit(1)\n }\n\n // ── Collect assets ────────────────────────────────────────\n s.start('Collecting assets...')\n const assets = collectAssets(clientDir)\n s.stop(`Collected ${assets.length} assets`)\n\n const workerJs = readFileSync(workerBundlePath, 'utf-8')\n\n // ── Extract DO manifest from build output config ───────────\n const doBindings = outputConfig.durable_objects?.bindings as Array<{ name: string; class_name: string }> | undefined\n const sqliteClasses = new Set(\n (outputConfig.migrations as Array<{ new_sqlite_classes?: string[] }> | undefined)\n ?.flatMap(m => m.new_sqlite_classes ?? []) ?? []\n )\n const doManifest = doBindings?.map(b => ({\n binding: b.name,\n className: b.class_name,\n sqlite: sqliteClasses.has(b.class_name),\n }))\n if (doManifest?.length) {\n p.log.info(`DO manifest: ${doManifest.length} binding(s)`)\n }\n\n // ── Extract custom (non-DO) bindings: Vectorize, AI, R2, KV, D1, etc.\n const customBindings = bindingManifestFromOutputConfig(outputConfig)\n const validation = validateBindingManifest(customBindings)\n if (!validation.valid) {\n p.cancel(\n `Invalid binding(s) in wrangler.toml:\\n` +\n validation.errors.map((e) => ` • ${e.reason}`).join('\\n'),\n )\n process.exit(1)\n }\n if (customBindings.length) {\n p.log.info(\n `Custom bindings: ${customBindings.map((b) => `${b.name} (${b.type})`).join(', ')}`,\n )\n }\n\n // Legacy compatibility: if .dev.vars exists, custom entries are deployed\n // as direct Cloudflare secret_text bindings, matching the pre-secrets flow.\n let userSecrets: Record<string, string> = {}\n if (hasLegacyDevVars(appDir, envName)) {\n try {\n userSecrets = readLegacyUserSecrets(appDir, envName, customBindings, doManifest)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n p.cancel(message)\n process.exit(1)\n }\n }\n if (Object.keys(userSecrets).length) {\n p.log.info(`Legacy .dev.vars secrets: ${Object.keys(userSecrets).sort().join(', ')}`)\n const warning = legacyDevVarsAppSecretsRoomWarning(userSecrets, doManifest)\n if (warning) p.log.warn(warning)\n }\n\n // ── Upload to deploy worker ───────────────────────────────\n s.start(`Deploying to ${appName}.app.space...`)\n\n // ── Forward custom worker-first asset routes ───────────────\n // CF Workers `[assets]` config supports a `run_worker_first` array\n // that wins over the SPA 404 fallback for matching paths. We always\n // reserve the SDK baseline (/api/*, /ws/*, /internal/*, /v1/*,\n // /_deepspace/*) on the platform side, but apps can declare extra\n // dynamic routes (e.g. /preview/*, /oauth/*, /.well-known/*) in\n // their wrangler.toml under `[assets] run_worker_first`. Pass those\n // through so the platform merges them into the deployed metadata.\n const extraRoutes = extractRunWorkerFirst(wranglerConfig)\n if (extraRoutes.length) {\n p.log.info(`Custom worker-first routes: ${extraRoutes.join(', ')}`)\n }\n\n // ── Choose transport: inline vs grouped ────────────────────\n // The assets array (base64-inlined file bytes) is the bulk of the upload.\n // Sending it all in one request stalls and gets reset mid-body on a\n // marginal uplink (`write EPIPE`). When it doesn't fit in a single group we\n // pack whole asset entries into groups under GROUP_BYTES, POST each group\n // on its own (retry-able) into the deploy worker's R2 staging, and\n // reference them by `uploadId` in the small commit request below. Small\n // deploys keep the original single-request inline transport.\n const assetGroups = packAssetGroups(assets, GROUP_BYTES)\n let inlineAssets: string | null = null\n let uploadId: string | null = null\n let totalGroups = 0\n if (assetGroups.length <= 1) {\n inlineAssets = JSON.stringify(assets)\n } else {\n uploadId = randomUUID()\n totalGroups = assetGroups.length\n try {\n for (let i = 0; i < totalGroups; i++) {\n const groupJson = JSON.stringify(assetGroups[i])\n s.message(`Uploading assets — group ${i + 1}/${totalGroups}...`)\n const groupRes = await postWithRetry(\n `${DEPLOY_URL}/api/deploy/${appName}/assets` +\n `?uploadId=${uploadId}&groupIndex=${i}&totalGroups=${totalGroups}`,\n () => ({\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: groupJson,\n }),\n )\n if (!groupRes.ok) {\n const errBody = (await groupRes.json().catch(() => ({}))) as { error?: string }\n // Reap the groups already staged for this upload before bailing —\n // a fresh deploy mints a new uploadId, so these would otherwise\n // never be reused.\n await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(\n `Asset upload failed on group ${i + 1}/${totalGroups}: ` +\n `${errBody.error ?? `HTTP ${groupRes.status}`}`,\n )\n process.exit(1)\n }\n }\n } catch (err: any) {\n // postWithRetry exhausted its network-error retries and threw.\n await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(`Asset upload failed (network): ${err?.message ?? err}`)\n process.exit(1)\n }\n s.message(`Deploying to ${appName}.app.space...`)\n }\n\n // Rebuilt per attempt so retried requests get a fresh body.\n const makeForm = (): FormData => {\n const form = new FormData()\n form.append('worker', new Blob([workerJs], { type: 'application/javascript' }), 'worker.js')\n if (inlineAssets !== null) {\n form.append('assets', inlineAssets)\n } else {\n form.append('uploadId', uploadId as string)\n form.append('totalGroups', String(totalGroups))\n }\n if (doManifest) {\n form.append('doManifest', JSON.stringify(doManifest))\n }\n if (customBindings.length) {\n form.append('bindingManifest', JSON.stringify(customBindings))\n }\n if (extraRoutes.length) {\n form.append('extraRunWorkerFirst', JSON.stringify(extraRoutes))\n }\n if (Object.keys(userSecrets).length) {\n form.append('userSecrets', JSON.stringify(userSecrets))\n }\n return form\n }\n\n let res: Response\n try {\n res = await postWithRetry(\n `${DEPLOY_URL}/api/deploy/${appName}`,\n () => ({\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n body: makeForm(),\n }),\n // Commit runs a real deploy — don't retry its 5xx (could double-deploy);\n // only a thrown fetch (dropped connection) is retried, and the staged\n // groups survive on the worker until this request succeeds.\n { retryServerErrors: false },\n )\n } catch (err: any) {\n // The commit never got a response after its retries (dropped connection).\n // Reap the staged groups — a fresh deploy mints a new uploadId.\n if (uploadId) await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(`Deploy request failed: ${err?.message ?? err}`)\n process.exit(1)\n }\n\n const body = (await res.json().catch(() => ({}))) as {\n success?: boolean\n url?: string\n error?: string\n }\n\n if (!res.ok || !body.success) {\n // Definitive failure — the worker won't reuse these groups (a re-run mints\n // a new uploadId), so reap them now rather than leaving them for the\n // lifecycle rule.\n if (uploadId) await abortStagedUpload(appName, uploadId, totalGroups, token)\n s.stop('Deploy failed')\n p.cancel(formatDeployWorkerError(res.status, body.error))\n process.exit(1)\n }\n\n // ── Wait for assets propagation ───────────────────────────\n // Cloudflare's deploy API returns \"success\" once the script + bindings are\n // accepted, but the assets binding can still be indexing for ~10–60s.\n // During that window any request hits CF's transitional \"Assets have not\n // yet deployed\" page (HTML), even on `/api/*` routes that should run the\n // worker first. Block here until we see the worker actually serving so\n // CI / smoke checks that fire immediately don't hit the flake.\n if (body.url) {\n s.message('Waiting for edge propagation...')\n const ok = await waitForAssetsReady(body.url, 90_000)\n if (!ok) {\n s.stop('Deployed (edge propagation still in progress after 90s)')\n p.log.warn('First requests may briefly hit the assets transitional page; retry in a minute.')\n p.log.success(`Live at: ${body.url}`)\n p.log.info('Secrets: local dev-only values are not pushed automatically. Run `deepspace secrets push` when you want to sync them.')\n await syncSubscriptionPlans(appDir, appName, token)\n await syncOneTimeProducts(appDir, appName, token)\n p.outro('Done')\n return\n }\n }\n\n s.stop('Deployed!')\n p.log.success(`Live at: ${body.url}`)\n p.log.info('Secrets: local dev-only values are not pushed automatically. Run `deepspace secrets push` when you want to sync them.')\n\n // ── Reconcile subscription plans + one-time products (optional files) ──\n // Each surfaces its own result inline but never fails the deploy — a\n // developer who hasn't finished Stripe Connect onboarding still gets a\n // working deploy; they just see a warning telling them to connect first.\n await syncSubscriptionPlans(appDir, appName, token)\n await syncOneTimeProducts(appDir, appName, token)\n\n p.outro('Done')\n },\n})\n\nfunction readLegacyUserSecrets(\n appDir: string,\n wranglerEnv: string | undefined,\n customBindings: Array<{ name: string }>,\n doManifest: Array<{ binding: string; className: string; sqlite: boolean }> | undefined,\n): Record<string, string> {\n const path = join(appDir, wranglerEnv ? `.dev.vars.${wranglerEnv}` : '.dev.vars')\n if (!existsSync(path)) return {}\n const vars = parseDevVars(extractCustomDevVars(readFileSync(path, 'utf-8')))\n const reserved = new Set<string>([\n ...SDK_MANAGED_KEYS,\n ...customBindings.map((b) => b.name),\n ...(doManifest ?? []).flatMap((b) => [b.binding, b.className]),\n ])\n const out: Record<string, string> = {}\n for (const [name, value] of Object.entries(vars)) {\n if (!SECRET_NAME_RE.test(name)) {\n throw new Error(`.dev.vars: invalid secret name \"${name}\".`)\n }\n if (reserved.has(name)) {\n throw new Error(`.dev.vars: \"${name}\" is reserved and cannot be deployed as a user secret.`)\n }\n out[name] = value\n }\n return out\n}\n\n\n/**\n * Bundle the app's `src/subscriptions.ts` with esbuild, dynamic-import the\n * resulting ESM, and POST the declarations to /api/subscriptions/sync.\n * No-op when the file is absent.\n */\nasync function syncSubscriptionPlans(appDir: string, appName: string, token: string): Promise<void> {\n const subsPath = join(appDir, 'src', 'subscriptions.ts')\n if (!existsSync(subsPath)) return\n\n const s = createSpinner()\n s.start('Syncing subscription plans...')\n\n let plans: unknown\n try {\n const esbuild = await import('esbuild')\n const outDir = join(appDir, '.wrangler', 'deploy')\n const outFile = join(outDir, 'subscriptions.bundle.mjs')\n await esbuild.build({\n entryPoints: [subsPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'node18',\n outfile: outFile,\n logLevel: 'silent',\n write: true,\n })\n // Cache-bust the import — repeat deploys in the same Node process would\n // otherwise reuse a stale module from the loader cache.\n const mod = (await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`)) as {\n subscriptionPlans?: unknown\n }\n plans = mod.subscriptionPlans\n } catch (err: any) {\n s.stop('Plan sync skipped')\n p.log.warn(`Could not load src/subscriptions.ts: ${err.message}`)\n return\n }\n\n if (!Array.isArray(plans)) {\n s.stop('Plan sync skipped')\n p.log.warn(\n 'src/subscriptions.ts must `export const subscriptionPlans = [...] as const`',\n )\n return\n }\n\n // The deploy has already succeeded by the time we get here — a network blip\n // or malformed response on /sync must NOT throw, or the user sees a stack\n // trace after their app is live. Anything unexpected becomes a warning.\n let res: Response\n try {\n res = await fetch(`${API_URL}/api/subscriptions/sync`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ appName, plans }),\n })\n } catch (err: any) {\n s.stop('Plan sync skipped')\n p.log.warn(`Plan sync request failed (network): ${err.message ?? err}`)\n return\n }\n const body = (await res.json().catch(() => ({}))) as {\n ok?: boolean\n error?: string\n hint?: string\n onboardingUrl?: string\n planChanges?: PlanChange[]\n connectMissing?: boolean\n }\n\n if (res.ok && body.ok) {\n s.stop(`Synced ${plans.length} plan${plans.length === 1 ? '' : 's'} to Stripe`)\n // Connect-not-yet-set-up is no longer a sync-blocking error. Plans land\n // in Stripe normally; the warning tells the developer their earnings\n // will queue in the platform balance until they finish Stripe Connect\n // onboarding. Once they connect, the first payout sweeps everything.\n if (body.connectMissing) {\n p.log.warn(\n 'Stripe Connect not yet set up. Customers can subscribe and earnings ' +\n 'will queue in your platform balance until you finish onboarding at ' +\n '/earnings on the dashboard. The first payout after you connect ' +\n 'will sweep everything that accumulated in the meantime.',\n )\n }\n // Any plan change that stranded existing subscribers — whether the plan\n // was removed entirely or just had its price swapped — flows through one\n // prompt. The platform has no way to know whether the developer wants\n // those subscribers cancelled or grandfathered; this is the moment they\n // get to decide. Skipping is fine (silent grandfathering is the safe\n // default); they can always cancel later via the SDK helper.\n const changes = (body.planChanges ?? []).filter((c) => c.affectedSubscribers > 0)\n if (changes.length > 0) {\n await promptAndCancelChangedPlans(appName, token, changes)\n }\n return\n }\n\n s.stop('Plan sync skipped')\n p.log.warn(\n `Plan sync failed: ${body.error ?? `HTTP ${res.status}`}${\n body.hint ? ` — ${body.hint}` : ''\n }`,\n )\n}\n\n// Plan-change events the deploy CLI surfaces to the developer. Mirrors the\n// /sync response shape on the platform side; kept inline here so the helper\n// is self-contained.\ninterface PlanChange {\n slug: string\n reason: 'removed' | 'repriced'\n affectedSubscribers: number\n intervals?: Array<{ interval: 'month' | 'year'; oldCents: number; newCents: number }>\n}\n\nfunction formatCents(c: number): string {\n return c === 0 ? 'free' : `$${(c / 100).toFixed(2)}`\n}\n\nfunction summaryLine(c: PlanChange): string {\n const n = c.affectedSubscribers\n const suffix = `${n} subscriber${n === 1 ? '' : 's'}`\n if (c.reason === 'removed') {\n return ` • ${c.slug} — removed (${suffix} still on it)`\n }\n // repriced: include the interval diffs for context.\n const diffs = (c.intervals ?? [])\n .map((i) => `${i.interval}: ${formatCents(i.oldCents)} → ${formatCents(i.newCents)}`)\n .join('; ')\n return ` • ${c.slug} — repriced (${diffs}; ${suffix} grandfathered on old price)`\n}\n\n/**\n * After /sync reports plans that stranded existing subscribers (removed\n * outright OR repriced with grandfathered customers), ask the developer\n * whether to cancel those subscriptions at the end of their current billing\n * period. Skipping is fine — they can run their own cleanup later via the\n * SDK's `cancelSubscription` helper.\n *\n * One yes/no prompt covers every affected plan. Granular per-plan control\n * is intentionally not surfaced; if a developer wants to cancel for plan A\n * but keep plan B, they can re-declare A in their next deploy.\n *\n * Errors here are warnings, never deploy failures: the deploy itself\n * succeeded; cleanup is the polite-but-optional tail.\n */\nasync function promptAndCancelChangedPlans(\n appName: string,\n token: string,\n changes: PlanChange[],\n): Promise<void> {\n const summary = changes.map(summaryLine).join('\\n')\n p.log.warn(\n `Plan change${changes.length === 1 ? '' : 's'} from this deploy left subscribers stranded:\\n${summary}\\n\\n` +\n 'Stripe will keep charging them until you cancel. Cancel at the end of their\\n' +\n 'current billing period? (Skip to leave them grandfathered.)',\n )\n const choice = await p.confirm({\n message: `Cancel ${changes.length === 1 ? 'these subscribers' : 'all of them'} at period end?`,\n initialValue: false,\n })\n if (p.isCancel(choice) || !choice) {\n p.log.info('Skipped — existing subscribers stay on their current plan/price.')\n return\n }\n\n // The admin-cancel endpoint batches at 50 and returns `hasMore` when there\n // are more rows to process. Loop until done so a plan with hundreds of\n // stranded subscribers gets fully cleaned up — without this, the deploy\n // prompt's confirmation (\"cancel these subscribers\") would silently leave\n // the tail being charged. The cap on iterations is a safety net for the\n // unlikely \"nothing makes progress\" path; a fresh deploy can resume.\n const MAX_ITERATIONS = 100 // 50/batch × 100 = 5000 subs/plan max per deploy\n for (const c of changes) {\n const s = createSpinner()\n s.start(`Canceling ${c.affectedSubscribers} subscriber${c.affectedSubscribers === 1 ? '' : 's'} on ${c.slug}...`)\n let totalCanceled = 0\n let totalFailed = 0\n let iteration = 0\n let lastError: string | null = null\n let stopped = false\n try {\n while (iteration < MAX_ITERATIONS) {\n const res = await fetch(`${API_URL}/api/subscriptions/admin-cancel`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n appName,\n planSlug: c.slug,\n atPeriodEnd: true,\n reason: `plan ${c.reason} via deploy`,\n }),\n })\n const body = (await res.json().catch(() => ({}))) as {\n success?: boolean\n canceled?: number\n failures?: Array<{ stripeSubscriptionId: string; error: string }>\n hasMore?: boolean\n error?: string\n }\n if (!res.ok || !body.success) {\n // Genuine failure (auth, 5xx, etc.) — surface and stop. The empty-\n // match case returns 200 with hasMore=false, not an error, so this\n // branch only fires for real problems.\n lastError = body.error ?? `HTTP ${res.status}`\n s.stop(`Cancel failed for ${c.slug}: ${lastError}`)\n stopped = true\n break\n }\n const batchCanceled = body.canceled ?? 0\n totalCanceled += batchCanceled\n totalFailed += body.failures?.length ?? 0\n if (!body.hasMore) break\n // Progress guard: if a batch returned hasMore=true but canceled=0\n // (every row failed), we'd loop forever. Stop and report.\n if (batchCanceled === 0) {\n lastError = 'no progress (all rows failed this batch)'\n break\n }\n iteration++\n }\n if (!stopped) {\n const tail =\n totalFailed > 0\n ? `; ${totalFailed} failed (see Stripe)`\n : ''\n const cap =\n iteration >= MAX_ITERATIONS\n ? ` (batch cap reached — re-run deploy to finish remaining)`\n : ''\n const errSuffix = lastError ? ` — ${lastError}` : ''\n s.stop(`Canceled ${totalCanceled} on ${c.slug}${tail}${cap}${errSuffix}`)\n }\n } catch (err: any) {\n s.stop(`Cancel failed for ${c.slug}: ${err.message}`)\n }\n }\n}\n\n/**\n * Bundle the app's `src/products.ts` with esbuild, dynamic-import the\n * resulting ESM, and POST the declarations to /api/charges/products/sync.\n * No-op when the file is absent. Mirrors syncSubscriptionPlans — products are\n * the one-time-charge equivalent of subscription plans, and the platform\n * resolves amount/name from this catalog at checkout time so the browser\n * can't pick (productId, amount) together.\n */\nasync function syncOneTimeProducts(appDir: string, appName: string, token: string): Promise<void> {\n const productsPath = join(appDir, 'src', 'products.ts')\n if (!existsSync(productsPath)) return\n\n const s = createSpinner()\n s.start('Syncing one-time products...')\n\n let products: unknown\n try {\n const esbuild = await import('esbuild')\n const outDir = join(appDir, '.wrangler', 'deploy')\n const outFile = join(outDir, 'products.bundle.mjs')\n await esbuild.build({\n entryPoints: [productsPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'node18',\n outfile: outFile,\n logLevel: 'silent',\n write: true,\n })\n const mod = (await import(`${pathToFileURL(outFile).href}?t=${Date.now()}`)) as {\n oneTimeProducts?: unknown\n }\n products = mod.oneTimeProducts\n } catch (err: any) {\n s.stop('Product sync skipped')\n p.log.warn(`Could not load src/products.ts: ${err.message}`)\n return\n }\n\n if (!Array.isArray(products)) {\n s.stop('Product sync skipped')\n p.log.warn(\n 'src/products.ts must `export const oneTimeProducts = [...] as const`',\n )\n return\n }\n\n // See syncSubscriptionPlans for rationale — the deploy is already live by\n // the time we get here, so network/parse failures degrade to warnings.\n let res: Response\n try {\n res = await fetch(`${API_URL}/api/charges/products/sync`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ appName, products }),\n })\n } catch (err: any) {\n s.stop('Product sync skipped')\n p.log.warn(`Product sync request failed (network): ${err.message ?? err}`)\n return\n }\n const body = (await res.json().catch(() => ({}))) as {\n ok?: boolean\n count?: number\n error?: string\n details?: unknown\n }\n\n if (res.ok && body.ok) {\n const n = body.count ?? products.length\n s.stop(`Synced ${n} one-time product${n === 1 ? '' : 's'}`)\n return\n }\n\n s.stop('Product sync skipped')\n p.log.warn(\n `Product sync failed: ${body.error ?? `HTTP ${res.status}`}${\n body.details ? ` — ${JSON.stringify(body.details)}` : ''\n }`,\n )\n}\n\n/**\n * Poll the deployed URL until it stops returning Cloudflare's\n * \"Assets have not yet deployed\" transitional page. Returns true when the\n * worker is actually serving, false on timeout.\n */\nasync function waitForAssetsReady(url: string, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n let attempt = 0\n while (Date.now() < deadline) {\n attempt++\n try {\n const res = await fetch(url, { redirect: 'manual' })\n const body = await res.text()\n // The transitional page is HTML with the literal phrase below. Any\n // other body — worker JSON, the app's index.html, even a 404 from the\n // worker's catch-all — means the deploy is live.\n if (!body.includes('Assets have not yet deployed')) {\n return true\n }\n } catch {\n // network blip — try again\n }\n // Exponential backoff capped at 8s: 1s → 2s → 4s → 8s → 8s …\n const wait = Math.min(8_000, 1_000 * 2 ** (attempt - 1))\n await new Promise((r) => setTimeout(r, wait))\n }\n return false\n}\n\nfunction collectAssets(dir: string): Array<{ path: string; contentBase64: string }> {\n const assets: Array<{ path: string; contentBase64: string }> = []\n function walk(d: string, prefix: string) {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === '.assetsignore') continue\n const full = join(d, entry.name)\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isDirectory()) {\n walk(full, rel)\n } else {\n assets.push({\n path: '/' + rel,\n contentBase64: readFileSync(full).toString('base64'),\n })\n }\n }\n }\n walk(dir, '')\n return assets\n}\n","/**\n * Binding Manifest — non-DO bindings declared by an app's wrangler.toml that\n * the deploy-worker should pass through to Cloudflare's WfP upload API.\n *\n * Apps don't export a `__BINDING_MANIFEST__`; the CLI extracts these from the\n * normalized vite/wrangler output config at deploy time. This file just owns\n * the types + validation so both sides (CLI client and deploy-worker server)\n * agree on the shape.\n */\n/// <reference types=\"@cloudflare/workers-types\" />\n\n/**\n * A single non-DO binding the app declares. Mirrors CF's WfP binding API.\n *\n * Provisionable resources (d1, kv_namespace, vectorize, r2_bucket, queue) accept\n * the literal string `\"auto\"` in their ID field to request platform-side\n * provisioning at deploy time. When `\"auto\"` is used, the deploy-worker creates\n * the resource on the platform CF account, persists the resulting CF ID in the\n * app registry, and substitutes the real ID before forwarding to WfP. The\n * sentinel sticks around in this type because:\n * 1. `wrangler` parsing requires a non-empty string in the id field\n * 2. The CLI passes the unresolved manifest through to the deploy-worker\n * 3. The deploy-worker is the only side with CF API credentials\n *\n * Companion fields (`database_name`, `title`, `dimensions`, `metric`) are only\n * used when `\"auto\"` is set — they tell the provisioner how to create the\n * resource. After provisioning these fields are still present on the wire but\n * ignored by WfP.\n */\nexport type CustomBinding =\n | {\n type: 'vectorize'\n name: string\n /** Either a pre-existing index name or the literal `\"auto\"`. */\n index_name: string\n /** Required when `index_name === \"auto\"`. */\n dimensions?: number\n /** Required when `index_name === \"auto\"`. */\n metric?: 'cosine' | 'euclidean' | 'dot-product'\n }\n | { type: 'ai'; name: string }\n | {\n type: 'r2_bucket'\n name: string\n /** Either a pre-existing bucket name or the literal `\"auto\"`. */\n bucket_name: string\n }\n | {\n type: 'kv_namespace'\n name: string\n /** Either a pre-existing KV namespace ID or the literal `\"auto\"`. */\n namespace_id: string\n /** Required when `namespace_id === \"auto\"`. Human-readable namespace title. */\n title?: string\n }\n | {\n type: 'd1'\n name: string\n /** Either a pre-existing D1 database UUID or the literal `\"auto\"`. */\n id: string\n /** Required when `id === \"auto\"`. Human-readable database name. */\n database_name?: string\n }\n | {\n type: 'queue'\n name: string\n /** Either a pre-existing queue name or the literal `\"auto\"`. */\n queue_name: string\n }\n | { type: 'browser_rendering'; name: string }\n | { type: 'analytics_engine'; name: string; dataset?: string }\n | { type: 'hyperdrive'; name: string; id: string }\n\nexport type CustomBindingManifest = CustomBinding[]\n\n/** Sentinel string in an ID field that requests platform-side provisioning. */\nexport const AUTO_PROVISION_SENTINEL = 'auto'\n\n/** Binding types whose ID field accepts the `\"auto\"` sentinel for provisioning. */\nexport const AUTO_PROVISIONABLE_TYPES = new Set([\n 'd1',\n 'kv_namespace',\n 'vectorize',\n 'r2_bucket',\n 'queue',\n])\n\n/** Vectorize metric values accepted by CF when creating an index. */\nconst VECTORIZE_METRICS = new Set(['cosine', 'euclidean', 'dot-product'])\n\n/**\n * True if a binding has the `\"auto\"` sentinel in its primary ID field. Used by\n * the deploy-worker to decide which entries need provisioning and by the\n * validator to enforce companion-field requirements.\n */\nexport function isAutoProvision(b: CustomBinding): boolean {\n switch (b.type) {\n case 'd1':\n return b.id === AUTO_PROVISION_SENTINEL\n case 'kv_namespace':\n return b.namespace_id === AUTO_PROVISION_SENTINEL\n case 'vectorize':\n return b.index_name === AUTO_PROVISION_SENTINEL\n case 'r2_bucket':\n return b.bucket_name === AUTO_PROVISION_SENTINEL\n case 'queue':\n return b.queue_name === AUTO_PROVISION_SENTINEL\n default:\n return false\n }\n}\n\n/** Binding `type` values an app is allowed to declare. */\nexport const ALLOWED_BINDING_TYPES = new Set([\n 'vectorize',\n 'ai',\n 'r2_bucket',\n 'kv_namespace',\n 'd1',\n 'queue',\n 'browser_rendering',\n 'analytics_engine',\n 'hyperdrive',\n])\n\n/**\n * Binding NAMES the SDK reserves on every app — apps may not redeclare them.\n *\n * Includes:\n * - Static-asset + service bindings the platform sets up automatically.\n * - SDK-managed env (auth, identity, owner JWT, app-secret encryption root).\n * - The auto-attached cost-tracking AE dataset (`USAGE_EVENTS`).\n *\n * DO binding names (RECORD_ROOMS, YJS_ROOMS, etc.) are NOT in this set\n * because they live in a separate manifest (`__DO_MANIFEST__`).\n */\nexport const RESERVED_BINDING_NAMES = new Set([\n 'ASSETS',\n 'PLATFORM_WORKER',\n 'API_WORKER',\n 'APP_NAME',\n 'OWNER_USER_ID',\n 'AUTH_JWT_PUBLIC_KEY',\n 'AUTH_JWT_ISSUER',\n 'AUTH_WORKER_URL',\n 'APP_IDENTITY_TOKEN',\n 'APP_OWNER_JWT',\n 'APP_SECRETS_KEY',\n 'USAGE_EVENTS',\n])\n\n/**\n * Per-binding validation error. `binding` is undefined for top-level\n * shape failures (e.g. manifest is not an array).\n */\nexport interface ValidationError {\n binding?: CustomBinding\n reason: string\n}\n\n/**\n * Validate a binding manifest. Returns errors; an empty array means valid.\n *\n * Used both client-side (CLI) for friendly fail-fast and server-side\n * (deploy-worker) as a security boundary — apps can't sneak in reserved\n * binding names by editing the wire format.\n */\nexport function validateBindingManifest(\n manifest: unknown,\n): { valid: true; bindings: CustomBindingManifest } | { valid: false; errors: ValidationError[] } {\n if (!Array.isArray(manifest)) {\n return { valid: false, errors: [{ reason: 'Manifest must be an array' }] }\n }\n const errors: ValidationError[] = []\n const seenNames = new Set<string>()\n for (const entry of manifest) {\n if (!entry || typeof entry !== 'object') {\n errors.push({ reason: `Entry must be an object (got ${entry === null ? 'null' : typeof entry})` })\n continue\n }\n const e = entry as Record<string, unknown>\n const type = e.type\n const name = e.name\n if (typeof type !== 'string' || !ALLOWED_BINDING_TYPES.has(type)) {\n errors.push({\n reason: `Disallowed binding type: ${typeof type === 'string' ? type : `(${typeof type})`}. Allowed: ${[...ALLOWED_BINDING_TYPES].sort().join(', ')}`,\n })\n continue\n }\n if (typeof name !== 'string' || !name) {\n errors.push({ reason: `Binding of type \"${type}\" missing 'name' (string)` })\n continue\n }\n if (RESERVED_BINDING_NAMES.has(name)) {\n errors.push({ reason: `Binding name \"${name}\" is reserved by the SDK` })\n continue\n }\n if (seenNames.has(name)) {\n errors.push({ reason: `Duplicate binding name \"${name}\"` })\n continue\n }\n seenNames.add(name)\n // Now safely typed: type is in ALLOWED_BINDING_TYPES + name is a string.\n const binding = entry as CustomBinding\n const fieldErr = requiredFieldError(binding)\n if (fieldErr) errors.push({ binding, reason: fieldErr })\n }\n if (errors.length) return { valid: false, errors }\n return { valid: true, bindings: manifest as CustomBindingManifest }\n}\n\nfunction requiredFieldError(b: CustomBinding): string | null {\n switch (b.type) {\n case 'vectorize': {\n if (!b.index_name) return `vectorize binding \"${b.name}\" missing index_name (or \"auto\")`\n if (b.index_name === AUTO_PROVISION_SENTINEL) {\n // Auto-provisioning needs the index shape upfront — CF requires both\n // dimensions and metric at index-create time.\n if (typeof b.dimensions !== 'number' || b.dimensions <= 0) {\n return `vectorize binding \"${b.name}\" with index_name=\"auto\" requires \"dimensions\" (positive number)`\n }\n if (!b.metric || !VECTORIZE_METRICS.has(b.metric)) {\n return `vectorize binding \"${b.name}\" with index_name=\"auto\" requires \"metric\" (one of: ${[...VECTORIZE_METRICS].join(', ')})`\n }\n }\n return null\n }\n case 'r2_bucket':\n return b.bucket_name ? null : `r2_bucket binding \"${b.name}\" missing bucket_name (or \"auto\")`\n case 'kv_namespace': {\n if (!b.namespace_id) return `kv_namespace binding \"${b.name}\" missing namespace_id (or \"auto\")`\n if (b.namespace_id === AUTO_PROVISION_SENTINEL && !b.title) {\n return `kv_namespace binding \"${b.name}\" with namespace_id=\"auto\" requires \"title\"`\n }\n return null\n }\n case 'd1': {\n if (!b.id) return `d1 binding \"${b.name}\" missing id (or \"auto\")`\n if (b.id === AUTO_PROVISION_SENTINEL && !b.database_name) {\n return `d1 binding \"${b.name}\" with id=\"auto\" requires \"database_name\"`\n }\n return null\n }\n case 'queue':\n return b.queue_name ? null : `queue binding \"${b.name}\" missing queue_name (or \"auto\")`\n case 'hyperdrive':\n // Hyperdrive auto-provisioning is out of scope for v1 (needs upstream\n // connection-string management). Only pre-existing IDs accepted.\n if (!b.id) return `hyperdrive binding \"${b.name}\" missing id`\n if (b.id === AUTO_PROVISION_SENTINEL) {\n return `hyperdrive binding \"${b.name}\": auto-provisioning not yet supported (provide a real id)`\n }\n return null\n case 'ai':\n case 'browser_rendering':\n case 'analytics_engine':\n return null // no required fields beyond `name`\n default: {\n // Exhaustiveness guard — adding a new variant without a case fails here.\n const _exhaustive: never = b\n void _exhaustive\n return null\n }\n }\n}\n\n/**\n * Convert vite/wrangler's normalized config (from `.wrangler/deploy/config.json`)\n * into a CustomBindingManifest.\n *\n * Vite normalizes wrangler.toml into object/array structures with shapes like\n * `{ ai: { binding: 'AI' } }`, `{ vectorize: [{ binding, index_name }] }`,\n * etc. We extract each known shape with explicit field plucks (no broad\n * `as` casts) and return a flat array.\n */\nexport function bindingManifestFromOutputConfig(\n outputConfig: Record<string, unknown>,\n): CustomBindingManifest {\n const out: CustomBindingManifest = []\n\n // ai: single object\n const aiBinding = pluckString(outputConfig.ai, 'binding')\n if (aiBinding) out.push({ type: 'ai', name: aiBinding })\n\n // vectorize: array of { binding, index_name, dimensions?, metric? }\n // `dimensions` and `metric` are only required when index_name === \"auto\"\n // (auto-provisioning); the validator enforces that, so we just pluck both\n // here and let it decide.\n for (const v of asObjectArray(outputConfig.vectorize)) {\n const name = pluckString(v, 'binding')\n const index_name = pluckString(v, 'index_name')\n if (!name || !index_name) continue\n const dimensions = pluckNumber(v, 'dimensions')\n const metric = pluckString(v, 'metric')\n out.push({\n type: 'vectorize',\n name,\n index_name,\n ...(dimensions != null && { dimensions }),\n ...(metric && (metric === 'cosine' || metric === 'euclidean' || metric === 'dot-product') && { metric }),\n })\n }\n\n // r2_buckets: array of { binding, bucket_name }\n for (const r of asObjectArray(outputConfig.r2_buckets)) {\n const name = pluckString(r, 'binding')\n const bucket_name = pluckString(r, 'bucket_name')\n if (name && bucket_name) out.push({ type: 'r2_bucket', name, bucket_name })\n }\n\n // kv_namespaces: array of { binding, id, title? }\n // `title` is only required when id === \"auto\"; pluck both here and let\n // the validator enforce the dependency.\n for (const k of asObjectArray(outputConfig.kv_namespaces)) {\n const name = pluckString(k, 'binding')\n const namespace_id = pluckString(k, 'id')\n if (!name || !namespace_id) continue\n const title = pluckString(k, 'title')\n out.push({\n type: 'kv_namespace',\n name,\n namespace_id,\n ...(title && { title }),\n })\n }\n\n // d1_databases: array of { binding, database_id, database_name? }\n // `database_name` is only required when database_id === \"auto\"; pluck both\n // and let the validator enforce.\n for (const d of asObjectArray(outputConfig.d1_databases)) {\n const name = pluckString(d, 'binding')\n const id = pluckString(d, 'database_id')\n if (!name || !id) continue\n const database_name = pluckString(d, 'database_name')\n out.push({\n type: 'd1',\n name,\n id,\n ...(database_name && { database_name }),\n })\n }\n\n // queues.producers: array of { binding, queue }\n const queues = isObject(outputConfig.queues) ? outputConfig.queues : null\n for (const q of asObjectArray(queues?.producers)) {\n const name = pluckString(q, 'binding')\n const queue_name = pluckString(q, 'queue')\n if (name && queue_name) out.push({ type: 'queue', name, queue_name })\n }\n\n // browser: { binding } (Cloudflare names this `browser` not `browser_rendering`)\n const browserBinding = pluckString(outputConfig.browser, 'binding')\n if (browserBinding) out.push({ type: 'browser_rendering', name: browserBinding })\n\n // analytics_engine_datasets: array of { binding, dataset? }\n for (const a of asObjectArray(outputConfig.analytics_engine_datasets)) {\n const name = pluckString(a, 'binding')\n const dataset = pluckString(a, 'dataset')\n if (name) out.push({ type: 'analytics_engine', name, dataset: dataset ?? undefined })\n }\n\n // hyperdrive: array of { binding, id }\n for (const h of asObjectArray(outputConfig.hyperdrive)) {\n const name = pluckString(h, 'binding')\n const id = pluckString(h, 'id')\n if (name && id) out.push({ type: 'hyperdrive', name, id })\n }\n\n return out\n}\n\n// ---- internal helpers (no broad `as` casts) ----\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v)\n}\n\nfunction pluckString(v: unknown, key: string): string | null {\n if (!isObject(v)) return null\n const val = v[key]\n return typeof val === 'string' && val.length > 0 ? val : null\n}\n\nfunction pluckNumber(v: unknown, key: string): number | null {\n if (!isObject(v)) return null\n const val = v[key]\n return typeof val === 'number' && Number.isFinite(val) ? val : null\n}\n\nfunction asObjectArray(v: unknown): Record<string, unknown>[] {\n if (!Array.isArray(v)) return []\n return v.filter(isObject)\n}\n","/**\n * deepspace undeploy\n *\n * Removes a deployed app from *.app.space via the deploy worker.\n */\n\nimport { defineCommand } from 'citty'\nimport * as p from '@clack/prompts'\nimport { createSpinner } from '../lib/spinner'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\nimport {\n resolveAppNameForEnv, readWranglerConfig, hasWranglerConfig,\n} from '../lib/wrangler-env'\n\nconst DEPLOY_URL = process.env.DEEPSPACE_DEPLOY_URL ?? ENVS.prod.deploy\n\nexport default defineCommand({\n meta: {\n name: 'undeploy',\n description: 'Remove a deployed DeepSpace app',\n },\n args: {\n name: {\n type: 'positional',\n description: 'App name to undeploy (reads from wrangler.toml if omitted)',\n required: false,\n },\n env: {\n type: 'string',\n description:\n 'wrangler.toml [env.<name>] block whose deployed app to remove ' +\n '(e.g. --env staging). Ignored if a positional name is given.',\n required: false,\n },\n },\n async run({ args }) {\n let appName = args.name as string | undefined\n const envName = typeof args.env === 'string' && args.env.trim() ? args.env.trim() : undefined\n\n // If no name given, try to read from wrangler.toml in cwd. With --env\n // we look up `[env.<name>].name`; without it, the top-level `name`.\n if (!appName) {\n if (hasWranglerConfig(process.cwd())) {\n const config = readWranglerConfig(process.cwd())\n const nameRes = resolveAppNameForEnv(config, envName)\n if (!nameRes.ok) {\n p.cancel(nameRes.reason)\n process.exit(1)\n }\n appName = nameRes.name\n }\n }\n\n if (!appName) {\n p.cancel('Provide an app name or run from a DeepSpace app directory.')\n process.exit(1)\n }\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err: any) {\n p.cancel(err.message)\n process.exit(1)\n }\n\n p.intro(`Undeploying ${appName}`)\n const s = createSpinner()\n s.start('Removing...')\n\n const res = await fetch(`${DEPLOY_URL}/api/deploy/${appName}`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${token}` },\n })\n\n const body = (await res.json().catch(() => ({}))) as { success?: boolean; error?: string }\n\n if (!res.ok || !body.success) {\n s.stop('Failed')\n p.cancel(body.error ?? `Undeploy error (${res.status})`)\n process.exit(1)\n }\n\n s.stop('Removed')\n p.outro(`${appName}.app.space has been taken down`)\n },\n})\n","/**\n * deepspace whoami\n *\n * Shows the currently logged-in user. Auto-refreshes the JWT if expired.\n *\n * Prints all the identity fields a developer cares about (email, name,\n * userId, issuer) so you don't have to peek into ~/.deepspace/token.\n * Also flags whether the session is for a test account (`@deepspace.test`\n * email), since that's a meaningful distinction for who can do what — see\n * docs/auth/dev-vs-test-accounts.md.\n *\n * `--json` emits a parseable single-line JSON object for scripts.\n */\n\nimport { defineCommand } from 'citty'\nimport { ensureToken } from '../auth'\nimport { DASHBOARD_URL } from '../env'\nimport { decodeJwtPayload } from '../jwt'\n\ninterface JwtPayload {\n sub?: string\n name?: string\n email?: string\n image?: string | null\n iss?: string\n iat?: number\n exp?: number\n}\n\nexport default defineCommand({\n meta: {\n name: 'whoami',\n description: 'Show the currently logged-in user',\n },\n args: {\n json: {\n type: 'boolean',\n description: 'Emit a single-line JSON object instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n let jwt: string\n try {\n jwt = await ensureToken()\n } catch (err: any) {\n console.error(err.message ?? 'Not signed in. Run `deepspace login`.')\n process.exit(1)\n }\n\n let payload: JwtPayload\n try {\n payload = decodeJwtPayload<JwtPayload>(jwt)\n } catch {\n console.error('Malformed session token. Run `deepspace login` again.')\n process.exit(1)\n }\n\n const isTestAccount = !!payload.email?.endsWith('@deepspace.test')\n const accountType: 'developer' | 'test-account' | 'unknown' = isTestAccount\n ? 'test-account'\n : payload.email\n ? 'developer'\n : 'unknown'\n\n if (args.json) {\n console.log(JSON.stringify({\n name: payload.name ?? null,\n email: payload.email ?? null,\n userId: payload.sub ?? null,\n accountType,\n issuer: payload.iss ?? null,\n expiresAt: payload.exp ? new Date(payload.exp * 1000).toISOString() : null,\n }))\n return\n }\n\n console.log(`Name: ${payload.name ?? '(none)'}`)\n console.log(`Email: ${payload.email ?? '(none)'}`)\n console.log(`UserID: ${payload.sub ?? '(none)'}`)\n console.log(`Type: ${accountType}`)\n if (payload.iss) console.log(`Issuer: ${payload.iss}`)\n console.log(`Dashboard: ${DASHBOARD_URL}`)\n if (isTestAccount) {\n console.log('')\n console.log('Note: this is a test account, not a real OAuth developer.')\n console.log('See docs/auth/dev-vs-test-accounts.md.')\n }\n },\n})\n","/**\n * deepspace add <feature> [dir]\n *\n * Installs a DeepSpace feature into the current app.\n *\n * deepspace add --list # list available features\n * deepspace add messaging # install into current dir\n * deepspace add messaging ./my-app # install into specific dir\n * deepspace add --info messaging # show feature details\n */\n\nimport { defineCommand } from 'citty'\nimport { existsSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport { ensureInstallReady } from '../lib/install-status'\n\nfunction findScript(from: string): string | null {\n // Preferred: ships inside the deepspace npm package at\n // node_modules/deepspace/scripts/add-feature.cjs, so the script and its\n // sibling features/ dir are delivered by `npm install`.\n const inNodeModules = join(from, 'node_modules', 'deepspace', 'scripts', 'add-feature.cjs')\n if (existsSync(inNodeModules)) return inNodeModules\n // Fallback for apps scaffolded before features moved into the SDK; their\n // .deepspace/ folder still works with newer deepspace versions.\n const inDotDeepspace = join(from, '.deepspace', 'scripts', 'add-feature.cjs')\n if (existsSync(inDotDeepspace)) return inDotDeepspace\n return null\n}\n\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add a feature to your DeepSpace app',\n },\n args: {\n list: {\n type: 'boolean',\n alias: 'l',\n description: 'List available features',\n required: false,\n },\n info: {\n type: 'string',\n description: 'Show details about a feature',\n required: false,\n },\n feature: {\n type: 'positional',\n description: 'Feature to install',\n required: false,\n },\n dir: {\n type: 'positional',\n description: 'App directory (default: current directory)',\n required: false,\n },\n },\n run({ args }) {\n const appDir = resolve(args.dir ?? '.')\n ensureInstallReady(appDir)\n const script = findScript(appDir)\n\n if (!script) {\n console.error('Could not find the deepspace feature installer.')\n console.error('Looked in:')\n console.error(` ${join(appDir, 'node_modules', 'deepspace', 'scripts', 'add-feature.cjs')}`)\n console.error(` ${join(appDir, '.deepspace', 'scripts', 'add-feature.cjs')}`)\n console.error('Are you in a DeepSpace app directory? Try `npm install` first.')\n process.exit(1)\n }\n\n const passArgs: string[] = []\n\n if (args.list) {\n passArgs.push('--list')\n } else if (args.info) {\n passArgs.push('--info', args.info)\n } else if (args.feature) {\n passArgs.push(args.feature, appDir)\n } else {\n passArgs.push('--help')\n }\n\n execSync(`node ${JSON.stringify(script)} ${passArgs.map(a => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n cwd: appDir,\n })\n },\n})\n","/**\n * deepspace skills <subcommand>\n *\n * Wraps `npx skills@latest add deepdotspace/deepspace-skill` so installation\n * lives under our verb (mirrors `npx remotion skills add`). The upstream\n * `skills` CLI owns repo fetch, idempotency, and agent layouts.\n *\n * deepspace skills add # multi-agent install\n * deepspace skills add -g # install globally\n * deepspace skills add --agent codex # single agent\n * deepspace skills add -y # non-interactive\n *\n * Pre-install fixup for vercel-labs/skills#1138: upstream's project-local\n * install silently skips the Claude Code symlink when `.claude/` doesn't\n * already exist. Pre-creating `.claude/` lets the upstream CLI do the right\n * thing itself, so we don't have to know its layout.\n */\n\nimport { defineCommand } from 'citty'\nimport spawn from 'cross-spawn'\nimport { mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nconst SKILL_REPO = 'deepdotspace/deepspace-skill'\nconst SKILL_NAME = 'deepspace'\n\n/**\n * Run `npx -y skills@latest add <repo> [extraArgs]`. Inherits stdio so the\n * `skills` CLI's own prompts / progress bars show through.\n */\nfunction runSkillsAdd(extraArgs: string[]): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(\n 'npx',\n ['-y', 'skills@latest', 'add', SKILL_REPO, ...extraArgs],\n { stdio: 'inherit' },\n )\n child.on('close', (code) => resolve(code ?? 1))\n child.on('error', (err) => {\n console.error(`Failed to invoke npx: ${err.message}`)\n console.error('Is Node.js installed and on PATH?')\n resolve(1)\n })\n })\n}\n\n/**\n * Workaround for https://github.com/vercel-labs/skills/issues/1138 — the\n * upstream installer's project-local branch silently returns success without\n * creating the Claude Code symlink when `<baseDir>/.claude/` doesn't exist.\n * Pre-creating an empty `.claude/` flips that check and lets the upstream CLI\n * create the symlink itself. Idempotent.\n *\n * @param baseDir cwd for project-local install, $HOME for `-g` global.\n */\nfunction precreateClaudeDir(baseDir: string): void {\n mkdirSync(join(baseDir, '.claude'), { recursive: true })\n}\n\nconst add = defineCommand({\n meta: {\n name: 'add',\n description: 'Install the DeepSpace skill for your coding agent',\n },\n args: {\n global: {\n type: 'boolean',\n alias: 'g',\n description: 'Install globally (~/.agents/skills/) instead of into the current directory',\n default: false,\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts (assume yes for any confirmation)',\n default: false,\n },\n agent: {\n type: 'string',\n description: 'Target a single agent (e.g. claude-code, codex, opencode). Default: install for all detected agents.',\n required: false,\n },\n },\n async run({ args }) {\n const extra: string[] = []\n if (args.global) extra.push('-g')\n if (args.yes) extra.push('-y')\n if (args.agent) extra.push('--agent', args.agent)\n\n // Pre-create .claude/ so upstream's install picks up Claude Code.\n // Skip when --agent targets a non-claude agent — no point creating\n // an empty .claude/ the user doesn't want.\n if (!args.agent || args.agent === 'claude-code') {\n const baseDir = args.global ? homedir() : process.cwd()\n try {\n precreateClaudeDir(baseDir)\n } catch (err: any) {\n // Non-fatal: upstream will still install for other agents.\n console.warn(`\\n Note: could not pre-create .claude/ for Claude Code: ${err?.message ?? err}`)\n }\n }\n\n const code = await runSkillsAdd(extra)\n if (code !== 0) process.exit(code)\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'skills',\n description: 'Manage the DeepSpace agent skill (Claude Code, Codex, OpenCode, Cursor, ...)',\n },\n subCommands: {\n add,\n },\n})\n","/**\n * deepspace domain — purchase and manage custom domains for your apps.\n *\n * Designed to be both human-friendly and agent/script-friendly:\n * - All destructive commands accept `--yes` to skip prompts.\n * - All read commands accept `--json` for structured stdout.\n * - `--app` defaults to the cwd's wrangler.toml name (matches `deepspace deploy`).\n * - `domain buy` opens Stripe Checkout in a browser and polls until live;\n * pass `--no-open` to print the URL only, `--no-wait` to skip polling.\n *\n * Subcommands:\n * search <query> — find available domains and prices\n * buy <domain> — buy a domain via Stripe Checkout (browser)\n * list — list domains you own\n * status <domain> — detail view for one domain\n * attach <domain> — re-point a domain at a different app\n * detach <domain> — stop routing the domain (keeps registration)\n * renew <domain> --auto X — toggle auto-renew on/off at the registrar\n */\n\nimport { defineCommand } from 'citty'\nimport { execSync } from 'node:child_process'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\nimport { requireAppName, detectAppName } from '../lib/app-context'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\n\ninterface SearchResult {\n name: string\n registrable: boolean\n registrar?: 'cloudflare' | 'namesilo'\n pricing?: { currency: string; registrationCost: string; renewalCost: string }\n registrationCost?: number\n renewalCost?: number\n chargedCents?: number | null\n costCents?: number | null\n reason?: string\n premium?: boolean\n}\n\ninterface DomainPurchase {\n id: string\n domain: string\n appName: string\n status: string\n statusError?: string | null\n registeredAt?: string | null\n expiresAt?: string | null\n chargedCents: number\n autoRenew: boolean\n registrar: string\n}\n\nasync function api<T>(token: string, path: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${API_URL}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n })\n const text = await res.text()\n if (!res.ok) {\n let msg = text\n try {\n msg = (JSON.parse(text) as { error?: string }).error ?? text\n } catch {\n // not JSON\n }\n throw new Error(`API ${path} (${res.status}): ${msg}`)\n }\n return JSON.parse(text) as T\n}\n\n/**\n * Strip internal-only pricing fields from any value before emitting it to\n * stdout. The api-worker exposes both the user-facing `chargedCents` and the\n * platform's at-cost `costCents`; only the former should reach the CLI user.\n */\nfunction scrubInternal<T>(value: T): T {\n if (Array.isArray(value)) return value.map(scrubInternal) as unknown as T\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (k === 'costCents') continue\n out[k] = scrubInternal(v)\n }\n return out as T\n }\n return value\n}\n\nfunction fmtCents(cents: number | null | undefined): string {\n if (cents === null || cents === undefined) return '—'\n return `$${(cents / 100).toFixed(2)}`\n}\n\nfunction fmtDate(iso: string | null | undefined): string {\n if (!iso) return '—'\n return iso.slice(0, 10)\n}\n\n/**\n * Plain stdin Y/N prompt — no clack, agent can pipe `yes` or pass --yes.\n */\nasync function confirm(message: string): Promise<boolean> {\n if (!process.stdin.isTTY) {\n // Non-interactive (piped, agent) — refuse rather than hang\n throw new Error(`${message} — pass --yes to confirm non-interactively`)\n }\n process.stdout.write(`${message} [y/N] `)\n return new Promise((resolve) => {\n process.stdin.setEncoding('utf-8')\n process.stdin.once('data', (data) => {\n const answer = data.toString().trim().toLowerCase()\n resolve(answer === 'y' || answer === 'yes')\n })\n })\n}\n\n// ============================================================================\n// search\n// ============================================================================\n\nconst search = defineCommand({\n meta: { name: 'search', description: 'Search for available domains' },\n args: {\n query: { type: 'positional', description: 'Domain or keyword', required: true },\n limit: { type: 'string', description: 'Max results (default 10)', default: '10' },\n json: { type: 'boolean', description: 'Emit JSON instead of a table' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const limit = parseInt(args.limit ?? '10', 10) || 10\n const result = await api<{ domains: SearchResult[] }>(\n token,\n `/api/domains/search?q=${encodeURIComponent(args.query)}&limit=${limit}`,\n )\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal(result), null, 2) + '\\n')\n return\n }\n if (result.domains.length === 0) {\n console.log('No matches.')\n return\n }\n for (const d of result.domains) {\n const tag = d.registrable ? '✓' : '✗'\n const price = d.registrable ? `${fmtCents(d.chargedCents)}/yr` : d.reason ?? '—'\n // Annotate slow-path TLDs so users have realistic expectations.\n const slowFlag = d.registrar && d.registrar !== 'cloudflare' ? ' (15-60 min provisioning)' : ''\n console.log(`${tag} ${d.name.padEnd(40)} ${price}${slowFlag}`)\n }\n },\n})\n\n// ============================================================================\n// buy\n// ============================================================================\n\nconst buy = defineCommand({\n meta: { name: 'buy', description: 'Buy a domain and attach it to an app' },\n args: {\n domain: { type: 'positional', description: 'Domain to buy', required: true },\n app: { type: 'string', description: 'App to attach (defaults to ./wrangler.toml)' },\n yes: { type: 'boolean', description: 'Skip the confirmation prompt', default: false },\n open: { type: 'boolean', description: 'Open browser at Stripe URL (use --no-open to print URL only)', default: true },\n wait: { type: 'boolean', description: 'Poll until provisioning completes (use --no-wait to exit after session creation)', default: true },\n json: { type: 'boolean', description: 'Emit JSON to stdout', default: false },\n },\n async run({ args }) {\n const token = await ensureToken()\n const appName = requireAppName(args.app)\n\n // Re-check pricing\n const priceCheck = await api<{ domains: SearchResult[] }>(token, '/api/domains/check', {\n method: 'POST',\n body: JSON.stringify({ domains: [args.domain] }),\n })\n const result = priceCheck.domains[0]\n if (!result || !result.registrable) {\n console.error(`Not available: ${result?.reason ?? 'unknown'}`)\n process.exit(1)\n }\n\n const price = fmtCents(result.chargedCents)\n // Provisioning time depends on registrar:\n // CF Registrar (.com/.dev/.app/.xyz/etc): ~60-90s — registry publishes\n // CF nameservers atomically with registration.\n // Porkbun fallback (.ai/.io/.me/.co/etc + ccTLDs): 15-60 min — depends\n // on the destination registry (Verisign/.me, NIC.AI, etc) batch-\n // publishing our NS records to public DNS. The platform side is\n // done in <30s; the wait is registry-side.\n const expectedTime =\n result.registrar === 'cloudflare'\n ? '~60-90 seconds'\n : '15-60 minutes (registry NS propagation)'\n\n if (!args.yes) {\n const ok = await confirm(\n `Buy ${args.domain} for ${price}/yr (auto-renews; non-refundable), attach to ${appName}? Provisioning takes ${expectedTime}.`,\n )\n if (!ok) {\n console.log('Cancelled.')\n return\n }\n }\n\n const checkout = await api<{ purchaseId: string; sessionId: string; url: string; chargedCents: number }>(\n token,\n '/api/domains/checkout',\n {\n method: 'POST',\n body: JSON.stringify({ domain: args.domain, appName }),\n },\n )\n\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal({ ...checkout, expectedTime, registrar: result.registrar }), null, 2) + '\\n')\n } else {\n console.log(`Stripe Checkout: ${checkout.url}`)\n }\n\n if (args.open && process.stdin.isTTY) {\n openBrowser(checkout.url)\n }\n\n if (!args.wait) return\n\n // Poll until active or failed.\n // Timeout depends on registrar — CF can take 5 min worst case, Porkbun\n // up to 60 min for slow registries. User can Ctrl-C and resume polling\n // later via `deepspace domain status <domain>` — provisioning runs\n // server-side regardless.\n const timeoutMs = result.registrar === 'cloudflare' ? 5 * 60 * 1000 : 60 * 60 * 1000\n if (!args.json) {\n console.log(`Waiting for payment & provisioning (up to ${expectedTime}). Press Ctrl-C anytime —`)\n console.log(`provisioning continues server-side; check later with \\`deepspace domain status ${args.domain}\\`.`)\n }\n const deadline = Date.now() + timeoutMs\n let lastStatus = ''\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 5000))\n try {\n const detail = await api<{ domain: DomainPurchase }>(\n token,\n `/api/domains/${checkout.purchaseId}`,\n )\n if (detail.domain.status !== lastStatus) {\n lastStatus = detail.domain.status\n if (!args.json) console.log(` → ${lastStatus}`)\n }\n if (detail.domain.status === 'active') {\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal({ ...checkout, status: 'active', domain: args.domain }), null, 2) + '\\n')\n } else {\n console.log(`✓ ${args.domain} is live and pointing at ${appName}`)\n }\n return\n }\n if (detail.domain.status.startsWith('failed:')) {\n console.error(`Provisioning failed: ${detail.domain.statusError ?? detail.domain.status}`)\n process.exit(1)\n }\n } catch (err) {\n // Transient — keep polling\n if (!args.json) console.error(`(poll error: ${err instanceof Error ? err.message : String(err)})`)\n }\n }\n console.error(`Polling timed out. Provisioning may still be in progress; check with:`)\n console.error(` deepspace domain status ${args.domain}`)\n process.exit(1)\n },\n})\n\n// ============================================================================\n// list\n// ============================================================================\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List your domains' },\n args: {\n json: { type: 'boolean', description: 'Emit JSON' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const result = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal(result), null, 2) + '\\n')\n return\n }\n if (result.domains.length === 0) {\n console.log('No domains. Try `deepspace domain search <name>`.')\n return\n }\n console.log(`DOMAIN APP STATUS EXPIRES AUTO-RENEW`)\n for (const d of result.domains) {\n console.log(\n `${d.domain.padEnd(35)} ${d.appName.padEnd(20)} ${d.status.padEnd(20)} ${fmtDate(d.expiresAt).padEnd(12)} ${d.autoRenew ? 'on' : 'off'}`,\n )\n }\n },\n})\n\n// ============================================================================\n// status\n// ============================================================================\n\nconst status = defineCommand({\n meta: { name: 'status', description: 'Show details for one domain' },\n args: {\n domain: { type: 'positional', description: 'Domain', required: true },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n if (args.json) {\n process.stdout.write(JSON.stringify(scrubInternal(found), null, 2) + '\\n')\n return\n }\n console.log(`Domain: ${found.domain}`)\n console.log(`Status: ${found.status}${found.statusError ? ` (${found.statusError})` : ''}`)\n console.log(`Attached app: ${found.appName}`)\n console.log(`Registrar: ${found.registrar}`)\n console.log(`Registered: ${fmtDate(found.registeredAt)}`)\n console.log(`Expires: ${fmtDate(found.expiresAt)}`)\n console.log(`Auto-renew: ${found.autoRenew ? 'on' : 'off'}`)\n console.log(`Charged: ${fmtCents(found.chargedCents)}/yr`)\n },\n})\n\n// ============================================================================\n// attach\n// ============================================================================\n\nconst attach = defineCommand({\n meta: { name: 'attach', description: 'Re-point a domain at a different app' },\n args: {\n domain: { type: 'positional', description: 'Domain to re-point', required: true },\n app: { type: 'string', description: 'Target app (defaults to ./wrangler.toml)' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const targetApp = requireAppName(args.app)\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n const result = await api<{ success: boolean; appName: string }>(\n token,\n `/api/domains/${found.id}/reattach`,\n {\n method: 'POST',\n body: JSON.stringify({ appName: targetApp }),\n },\n )\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n console.log(`✓ ${args.domain} now points at ${targetApp}`)\n },\n})\n\n// ============================================================================\n// detach\n// ============================================================================\n\nconst detach = defineCommand({\n meta: {\n name: 'detach',\n description: 'Stop routing the domain (keeps the registration; auto-renew unchanged)',\n },\n args: {\n domain: { type: 'positional', description: 'Domain to detach', required: true },\n yes: { type: 'boolean', description: 'Skip the confirmation prompt' },\n },\n async run({ args }) {\n const token = await ensureToken()\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n if (!args.yes) {\n const ok = await confirm(\n `Detach ${args.domain}? Routing will stop; the domain stays registered (auto-renew is unchanged).`,\n )\n if (!ok) {\n console.log('Cancelled.')\n return\n }\n }\n await api(token, `/api/domains/${found.id}`, { method: 'DELETE' })\n console.log(`✓ ${args.domain} detached. Use \\`deepspace domain attach\\` to re-route, or \\`renew --auto off\\` to stop auto-renewal.`)\n },\n})\n\n// ============================================================================\n// renew\n// ============================================================================\n\nconst renew = defineCommand({\n meta: { name: 'renew', description: 'Toggle auto-renewal at the registrar' },\n args: {\n domain: { type: 'positional', description: 'Domain', required: true },\n auto: { type: 'string', description: '\"on\" or \"off\"', required: true },\n },\n async run({ args }) {\n if (args.auto !== 'on' && args.auto !== 'off') {\n console.error('--auto must be \"on\" or \"off\"')\n process.exit(1)\n }\n const token = await ensureToken()\n const all = await api<{ domains: DomainPurchase[] }>(token, '/api/domains')\n const found = all.domains.find((d) => d.domain === args.domain)\n if (!found) {\n console.error(`No domain ${args.domain} in your account`)\n process.exit(1)\n }\n const enabled = args.auto === 'on'\n await api(token, `/api/domains/${found.id}/auto-renew`, {\n method: 'POST',\n body: JSON.stringify({ autoRenew: enabled }),\n })\n console.log(`✓ ${args.domain} auto-renew ${enabled ? 'enabled' : 'disabled'}`)\n },\n})\n\n// ============================================================================\n// open in browser — best-effort\n// ============================================================================\n\nfunction openBrowser(url: string): void {\n try {\n if (process.platform === 'darwin') execSync(`open ${JSON.stringify(url)}`)\n else if (process.platform === 'win32') execSync(`start \"\" ${JSON.stringify(url)}`)\n else execSync(`xdg-open ${JSON.stringify(url)} 2>/dev/null || true`)\n } catch {\n // Best-effort — user can open the URL manually\n }\n}\n\n// ============================================================================\n// Top-level\n// ============================================================================\n\n// Note: no `run()` on the parent — citty otherwise calls it after every\n// subcommand finishes, which prints spurious help text.\n//\n// `detectAppName` is imported for type-checking the `--app` defaulting in\n// each subcommand; not used here directly.\nvoid detectAppName\n\nexport default defineCommand({\n meta: { name: 'domain', description: 'Buy and manage custom domains' },\n subCommands: { search, buy, list, status, attach, detach, renew },\n})\n","/**\n * deepspace integrations <subcommand>\n *\n * Namespace for working with platform integrations from the command line.\n *\n * deepspace integrations # prints help\n * deepspace integrations list # list all\n * deepspace integrations info openai/chat-completion # schema + example\n * deepspace integrations invoke openai/chat-completion --body '{...}'\n *\n * `deepspace invoke ...` is a top-level alias for `integrations invoke ...`.\n * `deepspace invoke --list` is a shortcut for `integrations list`.\n *\n * All calls are made as the currently logged-in user (`deepspace whoami`).\n * That user is billed.\n *\n * No `run()` is defined on the parent — that matches the convention used\n * by `test-accounts` and prevents citty from firing both the parent and\n * a matched subcommand. Bare `deepspace integrations` (no subcommand)\n * prints citty's auto-generated help.\n */\n\nimport { defineCommand } from 'citty'\nimport { runInvoke, runInfo, runList } from './_invoke-impl'\n\nconst list = defineCommand({\n meta: {\n name: 'list',\n description: 'List all available integrations',\n },\n args: {\n json: {\n type: 'boolean',\n description: 'Print raw JSON (machine-readable)',\n default: false,\n },\n },\n async run({ args }) {\n try {\n await runList({ json: args.json })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n\nconst info = defineCommand({\n meta: {\n name: 'info',\n description: 'Print schema + example body for an integration endpoint',\n },\n args: {\n target: {\n type: 'positional',\n description: \"<integration>/<endpoint> (e.g. 'openai/chat-completion')\",\n required: true,\n },\n json: {\n type: 'boolean',\n description: 'Print raw JSON (machine-readable)',\n default: false,\n },\n },\n async run({ args }) {\n try {\n await runInfo({ target: args.target as string, json: args.json })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n\nconst invoke = defineCommand({\n meta: {\n name: 'invoke',\n description: 'Invoke a platform integration as the logged-in user',\n },\n args: {\n target: {\n type: 'positional',\n description: \"<integration>/<endpoint> (e.g. 'openai/chat-completion')\",\n required: true,\n },\n body: {\n type: 'string',\n alias: 'd',\n description: 'Inline JSON body',\n required: false,\n },\n 'body-file': {\n type: 'string',\n alias: 'f',\n description: 'Read JSON body from file (use - for stdin)',\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the response JSON (machine-readable)',\n default: false,\n },\n timeout: {\n type: 'string',\n description: 'Request timeout in milliseconds (default: 120000)',\n required: false,\n },\n },\n async run({ args }) {\n try {\n const timeout = args.timeout != null ? Number(args.timeout) : undefined\n if (timeout != null && (!Number.isFinite(timeout) || timeout <= 0)) {\n throw new Error(`Invalid --timeout '${args.timeout}'. Must be a positive number of milliseconds.`)\n }\n await runInvoke({\n target: args.target as string,\n body: args.body,\n bodyFile: args['body-file'],\n json: args.json,\n timeout,\n })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'integrations',\n description: 'List, inspect, and invoke platform integrations',\n },\n subCommands: {\n list,\n info,\n invoke,\n },\n})\n","/**\n * Shared implementation for `deepspace invoke` and `deepspace integrations *`.\n *\n * The CLI invokes platform integrations as the currently logged-in user\n * (the same identity shown by `deepspace whoami`). That user is billed.\n *\n * This module is the single source of truth for:\n * - listing the integration catalog\n * - showing per-endpoint info (schema + example body)\n * - making the actual POST call\n *\n * Both `commands/invoke.ts` (top-level alias) and `commands/integrations.ts`\n * (namespaced subcommands) delegate here so the behavior never drifts.\n *\n * Why `flushAndExit` is used (only on the --json paths):\n * After every subcommand runs, citty resumes the root command's run(),\n * which prints \"deepspace CLI — run `npx deepspace --help` for usage\" to\n * stdout. That trailing line corrupts --json output for any downstream\n * consumer that JSON.parses stdout (jq, file redirects, agent scripts,\n * the e2e tests). We can't suppress the root run() without modifying\n * cli.ts (out of scope), so on the --json paths we exit the process\n * before citty resumes — but we must wait for stdout to drain first,\n * because piped writes are async via libuv and large JSON outputs (the\n * full catalog is ~78KB) exceed the pipe buffer. See flushAndExit().\n *\n * Human-mode paths don't need this: the trailing line is just one more\n * line of prose, harmless. Those paths return / process.exit() normally.\n */\n\nimport { readFileSync } from 'node:fs'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\nconst DEFAULT_TIMEOUT_MS = 120_000\n\ninterface EndpointInfo {\n endpoint: string\n billing: { model: string; baseCost: number; currency: string }\n inputSchema: Record<string, unknown> | null\n example: Record<string, unknown> | null\n}\n\ninterface Catalog {\n integrations: Record<string, EndpointInfo[]>\n}\n\nexport interface InvokeArgs {\n target: string\n body?: string\n bodyFile?: string\n json?: boolean\n timeout?: number\n}\n\nexport interface InfoArgs {\n target: string\n json?: boolean\n}\n\nexport interface ListArgs {\n json?: boolean\n}\n\n/**\n * Parse \"<integration>/<endpoint>\" into its two segments.\n * Throws on malformed input.\n */\nfunction parseTarget(target: string): { integration: string; endpoint: string } {\n if (!target || typeof target !== 'string') {\n throw new Error(\"Missing target. Expected '<integration>/<endpoint>' (e.g. 'openai/chat-completion').\")\n }\n const parts = target.split('/')\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new Error(`Bad target '${target}'. Expected '<integration>/<endpoint>' (e.g. 'openai/chat-completion').`)\n }\n return { integration: parts[0], endpoint: parts[1] }\n}\n\n/**\n * Resolve the request body from --body, --body-file, or default to '{}'.\n * Errors if both --body and --body-file are provided, or the body isn't\n * valid JSON.\n */\nfunction resolveBody(opts: { body?: string; bodyFile?: string }): string {\n if (opts.body != null && opts.bodyFile != null) {\n throw new Error('Pass either --body or --body-file, not both.')\n }\n\n let raw: string\n if (opts.body != null) {\n raw = opts.body\n } else if (opts.bodyFile != null) {\n raw = opts.bodyFile === '-' ? readFileSync(0, 'utf-8') : readFileSync(opts.bodyFile, 'utf-8')\n } else {\n return '{}'\n }\n\n // Validate it parses as JSON so we fail fast with a clear message.\n try {\n JSON.parse(raw)\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'invalid JSON'\n throw new Error(`Body is not valid JSON: ${msg}`)\n }\n return raw\n}\n\n/**\n * Exit the process after stdout has drained.\n *\n * Used only on --json paths. Two problems it solves:\n * 1. Plain `process.exit()` truncates piped stdout for outputs larger\n * than the pipe buffer (~64KB on macOS) — `integrations --json | jq`\n * would lose data because libuv flushes asynchronously.\n * 2. Plain `return` lets citty fire the root command's run(), which\n * appends a trailing prose line that breaks JSON.parse on stdout.\n *\n * The pattern: schedule a zero-byte write so its callback fires only\n * after all prior writes have been flushed, then exit from the callback.\n * Returns a Promise that never resolves so the caller can `await` it\n * with no chance of citty continuing past us.\n */\nfunction flushAndExit(code: number): Promise<never> {\n return new Promise<never>(() => {\n process.stdout.write('', () => process.exit(code))\n })\n}\n\nasync function fetchCatalog(opts: { summary?: boolean } = {}): Promise<Catalog> {\n // `list` uses the summary view (names + billing); the full catalog with every\n // endpoint's schema is large enough to be truncated in an agent's terminal.\n // `info` omits the flag so it still gets the schema + example.\n const url = opts.summary ? `${API_URL}/api/integrations?summary=1` : `${API_URL}/api/integrations`\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`Failed to fetch integration catalog (${res.status})`)\n }\n return (await res.json()) as Catalog\n}\n\nfunction findEndpoint(catalog: Catalog, integration: string, endpoint: string): EndpointInfo | null {\n const endpoints = catalog.integrations[integration]\n if (!endpoints) return null\n return endpoints.find((e) => e.endpoint === endpoint) ?? null\n}\n\nfunction formatCurrency(value: number, currency: string): string {\n if (currency === 'USD') return `$${value}`\n return `${value} ${currency}`\n}\n\n/**\n * `deepspace integrations` (default action) / `--list`\n * Prints the catalog grouped by integration.\n */\nexport async function runList(args: ListArgs): Promise<void> {\n const catalog = await fetchCatalog({ summary: true })\n\n if (args.json) {\n process.stdout.write(JSON.stringify(catalog) + '\\n')\n await flushAndExit(0)\n }\n\n const names = Object.keys(catalog.integrations).sort()\n if (names.length === 0) {\n console.log('No integrations available.')\n return\n }\n\n for (const name of names) {\n console.log(name)\n const endpoints = [...catalog.integrations[name]].sort((a, b) => a.endpoint.localeCompare(b.endpoint))\n const widest = Math.max(...endpoints.map((e) => e.endpoint.length))\n for (const ep of endpoints) {\n const pad = ep.endpoint.padEnd(widest)\n const cost = formatCurrency(ep.billing.baseCost, ep.billing.currency)\n console.log(` ${pad} ${ep.billing.model.padEnd(12)} ${cost}`)\n }\n console.log()\n }\n\n console.log(\"Run 'deepspace integrations info <integration>/<endpoint>' for the request schema.\")\n}\n\n/**\n * `deepspace integrations info <target>` / `--info`\n * Prints the schema + example body for a single endpoint.\n */\nexport async function runInfo(args: InfoArgs): Promise<void> {\n const { integration, endpoint } = parseTarget(args.target)\n const catalog = await fetchCatalog()\n const info = findEndpoint(catalog, integration, endpoint)\n\n if (!info) {\n const available = catalog.integrations[integration]\n if (!available) {\n const names = Object.keys(catalog.integrations).sort().join(', ')\n throw new Error(`Unknown integration '${integration}'. Available: ${names}`)\n }\n const endpoints = available.map((e) => e.endpoint).join(', ')\n throw new Error(`Unknown endpoint '${endpoint}' for '${integration}'. Available: ${endpoints}`)\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify(info) + '\\n')\n await flushAndExit(0)\n }\n\n console.log(`${integration}/${endpoint}`)\n console.log(` billing: ${info.billing.model}, ${formatCurrency(info.billing.baseCost, info.billing.currency)} per call`)\n console.log()\n console.log('Input schema:')\n console.log(info.inputSchema ? JSON.stringify(info.inputSchema, null, 2) : ' (no schema registered)')\n console.log()\n console.log('Example body:')\n console.log(info.example ? JSON.stringify(info.example, null, 2) : ' (no example available)')\n}\n\n/**\n * `deepspace invoke <target>` / `deepspace integrations invoke <target>`\n * Performs the actual integration call.\n */\nexport async function runInvoke(args: InvokeArgs): Promise<void> {\n const { integration, endpoint } = parseTarget(args.target)\n const body = resolveBody({ body: args.body, bodyFile: args.bodyFile })\n const timeoutMs = args.timeout ?? DEFAULT_TIMEOUT_MS\n\n let jwt: string\n try {\n jwt = await ensureToken()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(msg)\n }\n\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n const startedAt = Date.now()\n\n let res: Response\n try {\n res = await fetch(`${API_URL}/api/integrations/${integration}/${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${jwt}`,\n },\n body,\n signal: controller.signal,\n })\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(`Request timed out after ${timeoutMs}ms`)\n }\n throw new Error(err instanceof Error ? err.message : 'Request failed')\n } finally {\n clearTimeout(timer)\n }\n\n const elapsed = Date.now() - startedAt\n let payload: Record<string, unknown>\n try {\n payload = (await res.json()) as Record<string, unknown>\n } catch {\n throw new Error(`Request failed (${res.status}) with non-JSON response`)\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify(payload) + '\\n')\n await flushAndExit(payload?.success === false || !res.ok ? 1 : 0)\n }\n\n const ok = payload?.success !== false && res.ok\n if (ok) {\n const data = 'data' in payload ? payload.data : payload\n console.log(JSON.stringify(data, null, 2))\n console.error(`\\n✓ ${integration}/${endpoint} (${elapsed}ms)`)\n return\n }\n\n // Error path\n const errMsg = (payload.error as string) ?? `Request failed (${res.status})`\n console.error(`✗ ${integration}/${endpoint} (${res.status}, ${elapsed}ms): ${errMsg}`)\n if (Array.isArray(payload.issues)) {\n for (const issue of payload.issues as Array<{ path?: string[]; message: string }>) {\n const path = issue.path?.length ? issue.path.join('.') : '(root)'\n console.error(` - ${path}: ${issue.message}`)\n }\n }\n if (res.status === 401) {\n console.error(\"\\nHint: run 'deepspace login' to authenticate.\")\n }\n process.exit(1)\n}\n","/**\n * deepspace invoke <integration>/<endpoint> [options]\n *\n * Top-level alias for `deepspace integrations invoke ...`. Calls a platform\n * integration as the currently logged-in user — the same identity shown by\n * `deepspace whoami`. That user is billed.\n *\n * deepspace invoke openai/chat-completion --body '{\"messages\":[...]}'\n * deepspace invoke openai/chat-completion --body-file req.json\n * cat req.json | deepspace invoke openai/chat-completion --body-file -\n * deepspace invoke openai/chat-completion --info\n * deepspace invoke --list\n */\n\nimport { defineCommand } from 'citty'\nimport { runInvoke, runInfo, runList } from './_invoke-impl'\n\nexport default defineCommand({\n meta: {\n name: 'invoke',\n description: 'Invoke a platform integration as the logged-in user',\n },\n args: {\n target: {\n type: 'positional',\n description: \"<integration>/<endpoint> (e.g. 'openai/chat-completion')\",\n required: false,\n },\n body: {\n type: 'string',\n alias: 'd',\n description: 'Inline JSON body',\n required: false,\n },\n 'body-file': {\n type: 'string',\n alias: 'f',\n description: 'Read JSON body from file (use - for stdin)',\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the response JSON (machine-readable)',\n default: false,\n },\n info: {\n type: 'boolean',\n description: 'Print schema + example body for the endpoint, then exit',\n default: false,\n },\n list: {\n type: 'boolean',\n description: 'Print all available integrations, then exit',\n default: false,\n },\n timeout: {\n type: 'string',\n description: 'Request timeout in milliseconds (default: 120000)',\n required: false,\n },\n },\n async run({ args }) {\n try {\n if (args.list) {\n await runList({ json: args.json })\n return\n }\n if (args.info) {\n await runInfo({ target: args.target as string, json: args.json })\n return\n }\n const timeout = args.timeout != null ? Number(args.timeout) : undefined\n if (timeout != null && (!Number.isFinite(timeout) || timeout <= 0)) {\n throw new Error(`Invalid --timeout '${args.timeout}'. Must be a positive number of milliseconds.`)\n }\n await runInvoke({\n target: args.target as string,\n body: args.body,\n bodyFile: args['body-file'],\n json: args.json,\n timeout,\n })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n },\n})\n","/**\n * deepspace managed-repos\n *\n * Manage DeepSpace-owned GitHub repos. These are private repositories in the\n * DeepSpace-managed GitHub org, intended for users who do not have or do not\n * want to connect their own GitHub account.\n */\n\nimport { defineCommand } from 'citty'\nimport { ensureToken } from '../auth'\nimport { ENVS } from '../env'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\nconst SIMPLE_APP_ID = /^[a-z0-9][a-z0-9_.:-]{0,119}$/i\nconst SIMPLE_APP_NAME = /^[a-z0-9][a-z0-9_-]{0,119}$/i\n\ntype ManagedRepo = {\n id: string\n appId: string\n appName: string\n fullName: string\n owner: string\n name: string\n htmlUrl: string\n cloneUrl: string\n}\n\ntype RepoQuota = {\n limit: number\n activeCount: number\n remaining: number\n}\n\ntype RepoToken = {\n token: string\n expiresAt: string\n permissions?: Record<string, string>\n repositorySelection?: string\n}\n\ntype DeletionQuota = {\n limit: number\n deletedCount: number\n remaining: number\n}\n\nasync function api<T>(token: string, path: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${API_URL}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n })\n const text = await res.text()\n if (!res.ok) {\n let msg = text\n try {\n msg = (JSON.parse(text) as { error?: string }).error ?? text\n } catch {\n // not JSON\n }\n throw new Error(`API ${path} (${res.status}): ${msg}`)\n }\n return JSON.parse(text) as T\n}\n\nfunction defaultAppId(appName: string): string {\n return `cli-${slugId(appName)}`\n}\n\nfunction slugId(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'app'\n}\n\nfunction assertSimple(value: string, pattern: RegExp, label: string): void {\n if (!pattern.test(value)) {\n throw new Error(`${label} must start with a letter or number and contain only simple identifier characters.`)\n }\n}\n\nfunction printQuota(quota: RepoQuota): void {\n console.log(`Repo quota: ${quota.activeCount} / ${quota.limit} active (${quota.remaining} remaining)`)\n}\n\nfunction printRepo(repo: ManagedRepo): void {\n console.log(`${repo.fullName}`)\n console.log(` ID: ${repo.id}`)\n console.log(` App: ${repo.appName}`)\n console.log(` App ID: ${repo.appId}`)\n console.log(` URL: ${repo.htmlUrl}`)\n console.log(` Clone: ${repo.cloneUrl}`)\n}\n\nasync function confirm(message: string): Promise<boolean> {\n if (!process.stdin.isTTY) {\n throw new Error(`${message} — pass --yes to confirm non-interactively`)\n }\n process.stdout.write(`${message} [y/N] `)\n return new Promise((resolve) => {\n process.stdin.setEncoding('utf-8')\n process.stdin.once('data', (data) => {\n const answer = data.toString().trim().toLowerCase()\n resolve(answer === 'y' || answer === 'yes')\n })\n })\n}\n\nconst list = defineCommand({\n meta: {\n name: 'list',\n description: 'List your DeepSpace-managed repos and quota',\n },\n args: {\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const token = await ensureToken()\n const result = await api<{ repos: ManagedRepo[]; quota: RepoQuota }>(token, '/api/github/repos')\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n printQuota(result.quota)\n if (result.repos.length === 0) {\n console.log('No DeepSpace-managed repos. Create one with `deepspace managed-repos create <app-name>`.')\n return\n }\n\n console.log('')\n for (const repo of result.repos) {\n printRepo(repo)\n }\n },\n})\n\nconst create = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a private DeepSpace-managed GitHub repo',\n },\n args: {\n appName: {\n type: 'positional',\n description: 'Working app name for this repo',\n required: true,\n },\n appId: {\n type: 'string',\n description: 'Stable DeepSpace repo app id (defaults to cli-<app-name>)',\n required: false,\n },\n nameHint: {\n type: 'string',\n description: 'Repo-name hint (defaults to app name)',\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const appName = String(args.appName)\n const appId = args.appId ? String(args.appId) : defaultAppId(appName)\n const nameHint = args.nameHint ? String(args.nameHint) : undefined\n\n try {\n assertSimple(appName, SIMPLE_APP_NAME, 'appName')\n assertSimple(appId, SIMPLE_APP_ID, 'appId')\n if (nameHint) assertSimple(nameHint, SIMPLE_APP_NAME, 'nameHint')\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n\n const token = await ensureToken()\n const result = await api<{ repo: ManagedRepo; alreadyExists: boolean }>(token, '/api/github/repos', {\n method: 'POST',\n body: JSON.stringify({ appName, appId, ...(nameHint ? { nameHint } : {}) }),\n })\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n console.log(result.alreadyExists ? 'Existing DeepSpace-managed repo:' : 'Created DeepSpace-managed repo:')\n printRepo(result.repo)\n },\n})\n\nconst token = defineCommand({\n meta: {\n name: 'token',\n description: 'Mint a short-lived GitHub token for a DeepSpace-managed repo',\n },\n args: {\n repoId: {\n type: 'positional',\n description: 'Repo id from `deepspace managed-repos list`',\n required: true,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const jwt = await ensureToken()\n const result = await api<{ repo: ManagedRepo; token: RepoToken }>(\n jwt,\n `/api/github/repos/${encodeURIComponent(String(args.repoId))}/agent-token`,\n { method: 'POST' },\n )\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n console.log(`Repo: ${result.repo.fullName}`)\n console.log(`Expires: ${result.token.expiresAt}`)\n console.log(`Token: ${result.token.token}`)\n console.log('')\n console.log(`Clone: git clone https://x-access-token:${encodeURIComponent(result.token.token)}@github.com/${result.repo.fullName}.git`)\n },\n})\n\nconst remove = defineCommand({\n meta: {\n name: 'delete',\n description: 'Delete a DeepSpace-managed GitHub repo',\n },\n args: {\n repoId: {\n type: 'positional',\n description: 'Repo id from `deepspace managed-repos list`',\n required: true,\n },\n yes: {\n type: 'boolean',\n description: 'Skip the confirmation prompt',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n if (!args.yes) {\n try {\n const ok = await confirm(\n 'Delete this DeepSpace-managed GitHub repo? This removes the GitHub repository and counts against your daily delete quota.',\n )\n if (!ok) {\n console.log('Cancelled.')\n return\n }\n } catch (err) {\n console.error((err as Error).message)\n process.exit(1)\n }\n }\n\n const jwt = await ensureToken()\n const result = await api<{ repo: ManagedRepo; deletionQuota: DeletionQuota }>(\n jwt,\n `/api/github/repos/${encodeURIComponent(String(args.repoId))}`,\n { method: 'DELETE' },\n )\n\n if (args.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n')\n return\n }\n\n console.log(`Deleted ${result.repo.fullName}`)\n console.log(\n `Delete quota: ${result.deletionQuota.deletedCount} / ${result.deletionQuota.limit} used today (${result.deletionQuota.remaining} remaining)`,\n )\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'managed-repos',\n description: 'Create and manage DeepSpace-owned GitHub repos',\n },\n subCommands: {\n list,\n create,\n token,\n delete: remove,\n },\n})\n","/**\n * deepspace library [publish|unpublish] [options]\n *\n * Manage entries in the DeepSpace community library (lives at\n * deepdotspace-site.app.space by default; override with --library-app\n * or DEEPSPACE_LIBRARY_HOST). Subcommands POST to that app's\n * `library.publish` / `library.unpublish` actions as the currently\n * logged-in user.\n *\n * The publish action verifies the caller owns the deployed app (by\n * checking the deploy worker's `/api/apps` registry) before writing\n * the row, so publishing another user's app is rejected server-side.\n *\n * Usage:\n * deepspace library publish (uses wrangler.toml)\n * deepspace library publish --app my-cool-app --name \"My Cool App\"\n * deepspace library publish --description \"...\" --category Productivity\n * deepspace library publish --tags utility,ai --visibility unlisted\n * deepspace library unpublish <handle>\n */\n\nimport { defineCommand } from 'citty'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { parse as parseToml } from 'smol-toml'\nimport * as p from '@clack/prompts'\n\nimport { ensureToken } from '../auth'\nimport { resolveAppName } from '../../server/rooms/app-name'\n\nconst DEFAULT_LIBRARY_APP = 'deepdotspace-site'\n\nconst publish = defineCommand({\n meta: {\n name: 'publish',\n description: 'Publish the current app to the DeepSpace library',\n },\n args: {\n dir: {\n type: 'string',\n description: 'App directory (default: current directory)',\n required: false,\n },\n app: {\n type: 'string',\n description: 'App name (default: read from wrangler.toml)',\n required: false,\n },\n name: {\n type: 'string',\n description: 'Display name (default: app name)',\n required: false,\n },\n description: {\n type: 'string',\n description: 'Short description',\n required: false,\n },\n category: {\n type: 'string',\n description: 'Category (e.g. Productivity, Finance, AI). Default: General',\n required: false,\n },\n tags: {\n type: 'string',\n description: 'Comma-separated tags',\n required: false,\n },\n visibility: {\n type: 'string',\n description: \"'public' (default), 'unlisted', or 'private'\",\n required: false,\n },\n screenshot: {\n type: 'string',\n description: 'Override the auto-captured preview with a public PNG URL',\n required: false,\n },\n 'library-app': {\n type: 'string',\n description: `Target library app subdomain (default: ${DEFAULT_LIBRARY_APP})`,\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the JSON response (machine-readable)',\n default: false,\n },\n },\n async run({ args }) {\n const json = !!args.json\n const intro = (s: string) => { if (!json) p.intro(s) }\n const info = (s: string) => { if (!json) p.log.info(s) }\n const die = (msg: string) => {\n if (json) console.error(JSON.stringify({ ok: false, error: msg }))\n else p.cancel(msg)\n process.exit(1)\n }\n\n intro('Publishing to the DeepSpace library')\n\n let appName = typeof args.app === 'string' && args.app.trim() ? args.app.trim() : undefined\n if (!appName) {\n const appDir = resolve(typeof args.dir === 'string' && args.dir ? args.dir : '.')\n const wranglerPath = join(appDir, 'wrangler.toml')\n if (!existsSync(wranglerPath)) {\n return die(\"No --app provided and no wrangler.toml found. Either pass --app <name> or run from your app's directory.\")\n }\n const cfg = parseToml(readFileSync(wranglerPath, 'utf-8')) as { name?: string }\n const nameRes = resolveAppName(cfg.name)\n if (!nameRes.ok) return die(`wrangler.toml: ${nameRes.reason}`)\n appName = nameRes.name\n }\n info(`App: ${appName}`)\n\n const visibility = (args.visibility ?? 'public') as string\n if (!['public', 'private', 'unlisted'].includes(visibility)) {\n return die(\"--visibility must be 'public', 'unlisted', or 'private'.\")\n }\n\n const tags = typeof args.tags === 'string' && args.tags\n ? args.tags.split(',').map((t) => t.trim()).filter(Boolean)\n : undefined\n\n const libraryApp = typeof args['library-app'] === 'string' && args['library-app']\n ? args['library-app']\n : DEFAULT_LIBRARY_APP\n const libraryHost = process.env.DEEPSPACE_LIBRARY_HOST ?? `https://${libraryApp}.app.space`\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err) {\n return die(err instanceof Error ? err.message : String(err))\n }\n\n const payload: Record<string, unknown> = {\n appName,\n ...(args.name ? { name: args.name } : {}),\n ...(args.description ? { description: args.description } : {}),\n ...(args.category ? { category: args.category } : {}),\n ...(tags ? { tags } : {}),\n visibility,\n ...(args.screenshot ? { screenshotUrl: args.screenshot } : {}),\n }\n\n const url = `${libraryHost}/api/actions/library.publish`\n let res: Response\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(payload),\n })\n } catch (err) {\n return die(`Network error reaching ${url}: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n const body = await res.text()\n let parsed: { success?: boolean; data?: { templateHandle?: string; url?: string; version?: number }; error?: string }\n try {\n parsed = JSON.parse(body)\n } catch {\n return die(`Server returned non-JSON (${res.status}): ${body.slice(0, 400)}`)\n }\n\n if (json) {\n console.log(JSON.stringify(parsed))\n process.exit(parsed.success ? 0 : 1)\n }\n\n if (!parsed.success) {\n return die(parsed.error ?? `Publish failed (HTTP ${res.status}).`)\n }\n\n p.log.success(`Published ${appName} as ${parsed.data?.templateHandle} (v${parsed.data?.version})`)\n if (parsed.data?.url) p.log.message(parsed.data.url)\n p.outro('Done')\n },\n})\n\nconst unpublish = defineCommand({\n meta: {\n name: 'unpublish',\n description: 'Remove a library entry (owner or admin only)',\n },\n args: {\n handle: {\n type: 'positional',\n description: 'templateHandle to remove (usually your app name)',\n required: true,\n },\n 'library-app': {\n type: 'string',\n description: `Target library app subdomain (default: ${DEFAULT_LIBRARY_APP})`,\n required: false,\n },\n json: {\n type: 'boolean',\n description: 'Print only the JSON response',\n default: false,\n },\n },\n async run({ args }) {\n const json = !!args.json\n const die = (msg: string) => {\n if (json) console.error(JSON.stringify({ ok: false, error: msg }))\n else p.cancel(msg)\n process.exit(1)\n }\n if (!json) p.intro('Unpublishing library entry')\n\n let token: string\n try { token = await ensureToken() } catch (err) {\n return die(err instanceof Error ? err.message : String(err))\n }\n\n const libraryApp = typeof args['library-app'] === 'string' && args['library-app']\n ? args['library-app']\n : DEFAULT_LIBRARY_APP\n const libraryHost = process.env.DEEPSPACE_LIBRARY_HOST ?? `https://${libraryApp}.app.space`\n\n const res = await fetch(`${libraryHost}/api/actions/library.unpublish`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },\n body: JSON.stringify({ templateHandle: String(args.handle) }),\n })\n const body = await res.text()\n let parsed: { success?: boolean; error?: string; data?: { templateHandle?: string } }\n try { parsed = JSON.parse(body) } catch {\n return die(`Server returned non-JSON (${res.status}): ${body.slice(0, 400)}`)\n }\n if (json) { console.log(JSON.stringify(parsed)); process.exit(parsed.success ? 0 : 1) }\n if (!parsed.success) return die(parsed.error ?? `HTTP ${res.status}`)\n p.log.success(`Unpublished ${parsed.data?.templateHandle}`)\n p.outro('Done')\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'library',\n description: 'Manage your DeepSpace library entries',\n },\n subCommands: {\n publish,\n unpublish,\n },\n})\n","/**\n * deepspace admin\n *\n * Maintainer-only operations gated by DEEPSPACE_ADMIN_SECRET.\n */\n\nimport { defineCommand } from 'citty'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { ENVS } from '../env'\nimport { TOKEN_PATH } from '../auth'\n\nconst AUTH_URL = process.env.DEEPSPACE_AUTH_URL ?? ENVS.prod.auth\n\nconst impersonate = defineCommand({\n meta: {\n name: 'impersonate',\n description: 'Store a short-lived CLI token for another user',\n },\n args: {\n email: {\n type: 'string',\n description: 'Target user email',\n required: false,\n },\n userId: {\n type: 'string',\n description: 'Target user id',\n required: false,\n },\n secret: {\n type: 'string',\n description: 'Admin secret; defaults to DEEPSPACE_ADMIN_SECRET',\n required: false,\n },\n },\n async run({ args }) {\n const secret = args.secret ?? process.env.DEEPSPACE_ADMIN_SECRET\n if (!secret) {\n console.error('Missing admin secret. Set DEEPSPACE_ADMIN_SECRET or pass --secret.')\n process.exit(1)\n }\n if (!args.email && !args.userId) {\n console.error('Pass --email or --userId.')\n process.exit(1)\n }\n\n const res = await fetch(`${AUTH_URL}/api/auth/admin/impersonate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${secret}`,\n },\n body: JSON.stringify({\n email: args.email,\n userId: args.userId,\n }),\n })\n\n const data = (await res.json().catch(() => ({}))) as {\n token?: string\n user?: { id: string; name?: string | null; email?: string | null }\n error?: string\n }\n\n if (!res.ok || !data.token || !data.user) {\n console.error(`Failed: ${data.error ?? `HTTP ${res.status}`}`)\n process.exit(1)\n }\n\n const dir = join(homedir(), '.deepspace')\n mkdirSync(dir, { recursive: true })\n writeFileSync(TOKEN_PATH, data.token, { mode: 0o600 })\n\n console.log(`Impersonating ${data.user.name ?? data.user.email ?? data.user.id}`)\n console.log(`Email: ${data.user.email ?? '(none)'}`)\n console.log(`UserID: ${data.user.id}`)\n },\n})\n\nexport default defineCommand({\n meta: {\n name: 'admin',\n description: 'Maintainer-only admin commands',\n },\n subCommands: {\n impersonate,\n },\n})\n","/**\n * deepspace feedback\n *\n * Submit a bug report, feature request, or general feedback to the DeepSpace\n * team. The report is authenticated as the logged-in user and POSTed to the\n * api-worker, where it lands in the admin triage queue (dashboard ·\n * Admin · Feedback).\n *\n * Interactive when run in a TTY (prompts for type/title/details); flag-driven\n * for agents and CI. The title is a positional argument; the details go in\n * --message (-m). Both are required for non-interactive use.\n *\n * deepspace feedback # full interactive prompt\n * deepspace feedback \"Crash on deploy\" -m \"It explodes when…\" # quick, non-interactive\n * deepspace feedback -t feature \"Add dark mode\" -m \"…\" --yes --json\n *\n * Best-effort environment context (CLI version, Node version, OS, and the\n * current app name if run inside a scaffolded app) is attached automatically\n * so the team can reproduce issues without a round-trip.\n */\n\nimport { defineCommand } from 'citty'\nimport * as p from '@clack/prompts'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { release } from 'node:os'\nimport { ensureToken } from '../auth'\nimport { ENVS, DASHBOARD_URL } from '../env'\nimport { hasWranglerConfig, readWranglerConfig } from '../lib/wrangler-env'\n\nconst API_URL = process.env.DEEPSPACE_API_URL ?? ENVS.prod.api\n\nconst TYPES = ['bug', 'feature', 'other'] as const\ntype FeedbackType = (typeof TYPES)[number]\n\nconst TYPE_LABELS: Record<FeedbackType, string> = {\n bug: 'Bug report',\n feature: 'Feature request',\n other: 'Other feedback',\n}\n\n// Mirror the api-worker's limits so over-length input fails fast with a clear\n// field-specific message instead of a generic 400 after the round-trip.\nconst MAX_TITLE_LEN = 200\nconst MAX_BODY_LEN = 10_000\nconst MAX_CONTEXT_LEN = 200\n\ninterface FeedbackContext {\n cliVersion: string\n nodeVersion: string\n platform: string\n appName?: string\n}\n\ninterface FeedbackPayload extends FeedbackContext {\n type: FeedbackType\n title: string\n body: string\n}\n\ninterface FeedbackReport {\n id: string\n type: FeedbackType\n title: string\n status: string\n createdAt: string\n}\n\nasync function api<T>(token: string, path: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${API_URL}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n })\n const text = await res.text()\n if (!res.ok) {\n let msg = text\n try {\n msg = (JSON.parse(text) as { error?: string }).error ?? text\n } catch {\n // not JSON\n }\n throw new Error(`API ${path} (${res.status}): ${msg}`)\n }\n return JSON.parse(text) as T\n}\n\n/** Normalize/validate a `--type` value. Throws on an unknown type. */\nexport function normalizeType(raw: string | undefined): FeedbackType {\n const value = (raw ?? 'bug').toLowerCase()\n if ((TYPES as readonly string[]).includes(value)) return value as FeedbackType\n throw new Error(`Invalid --type \"${raw}\". Use one of: ${TYPES.join(', ')}.`)\n}\n\n/** Read the deepspace CLI version from its own package.json. */\nfunction readCliVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url))\n // Bundled output lives in <pkg>/dist (package.json one level up); the\n // source tree has it three levels up from src/cli/commands.\n const candidates = [\n join(here, '..', 'package.json'),\n join(here, '..', '..', '..', 'package.json'),\n ]\n for (const path of candidates) {\n if (!existsSync(path)) continue\n const pkg = JSON.parse(readFileSync(path, 'utf-8')) as {\n name?: string\n version?: string\n }\n if (pkg.name === 'deepspace' && pkg.version) return pkg.version\n }\n } catch {\n // fall through\n }\n return 'unknown'\n}\n\n/** Best-effort app name from the current dir's wrangler.toml, if any. */\nfunction detectAppName(): string | undefined {\n try {\n const cwd = process.cwd()\n if (!hasWranglerConfig(cwd)) return undefined\n const config = readWranglerConfig(cwd)\n return typeof config.name === 'string' ? config.name : undefined\n } catch {\n return undefined\n }\n}\n\n/** Clamp a best-effort context value so it can never block submission. */\nfunction clampContext(value: string): string {\n return value.length > MAX_CONTEXT_LEN ? value.slice(0, MAX_CONTEXT_LEN) : value\n}\n\n/** Collect the environment context attached to every report. */\nexport function collectContext(): FeedbackContext {\n const appName = detectAppName()\n return {\n cliVersion: clampContext(readCliVersion()),\n nodeVersion: clampContext(process.version),\n platform: clampContext(`${process.platform} ${release()}`),\n ...(appName ? { appName: clampContext(appName) } : {}),\n }\n}\n\n/** Assemble the request body. Trims and validates title/body are non-empty. */\nexport function buildFeedbackPayload(input: {\n type: string | undefined\n title: string\n body: string\n context: FeedbackContext\n}): FeedbackPayload {\n const title = input.title.trim()\n const body = input.body.trim()\n if (!title) throw new Error('A title is required.')\n if (!body) throw new Error('A message/description is required.')\n if (title.length > MAX_TITLE_LEN) {\n throw new Error(\n `Title must be ${MAX_TITLE_LEN} characters or fewer (got ${title.length}).`,\n )\n }\n if (body.length > MAX_BODY_LEN) {\n throw new Error(\n `Description must be ${MAX_BODY_LEN} characters or fewer (got ${body.length}).`,\n )\n }\n return {\n type: normalizeType(input.type),\n title,\n body,\n ...input.context,\n }\n}\n\nexport default defineCommand({\n meta: {\n name: 'feedback',\n description: 'Submit a bug report, feature request, or feedback to DeepSpace',\n },\n args: {\n title: {\n type: 'positional',\n description: 'Short summary (prompted if omitted in a terminal)',\n required: false,\n },\n type: {\n type: 'string',\n alias: 't',\n description: `Report type: ${TYPES.join(' | ')} (default: bug)`,\n required: false,\n },\n message: {\n type: 'string',\n alias: 'm',\n description: 'Details / description (prompted if omitted in a terminal)',\n required: false,\n },\n yes: {\n type: 'boolean',\n description: 'Skip the confirmation prompt',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of human output',\n default: false,\n },\n },\n async run({ args }) {\n const interactive = process.stdin.isTTY && !args.json\n\n // Fail consistently: under --json, emit the same { ok, error } shape on\n // stdout that the success/network paths use, so an agent can always parse\n // the outcome. Otherwise print to stderr. Either way exit non-zero.\n const fail = (message: string): never => {\n if (args.json) {\n process.stdout.write(JSON.stringify({ ok: false, error: message }) + '\\n')\n } else {\n console.error(message)\n }\n process.exit(1)\n }\n\n let type: FeedbackType\n try {\n type = normalizeType(args.type ? String(args.type) : undefined)\n } catch (err) {\n return fail((err as Error).message)\n }\n\n let title = args.title ? String(args.title) : ''\n let body = args.message ? String(args.message) : ''\n\n // Non-interactive callers (agents/CI) must supply both fields up front.\n if ((!title || !body) && !interactive) {\n return fail(\n 'Provide a title and --message to submit non-interactively, ' +\n 'e.g. `deepspace feedback \"Title\" --message \"Details\"`.',\n )\n }\n\n // Prompt for whatever is still missing — including the type, so an\n // interactive user who passed --title/--message but no --type is still\n // asked rather than having it silently default to \"bug\".\n if (interactive && (!args.type || !title || !body)) {\n p.intro('DeepSpace Feedback')\n\n if (!args.type) {\n const picked = await p.select({\n message: 'What kind of feedback is this?',\n options: TYPES.map((t) => ({ value: t, label: TYPE_LABELS[t] })),\n initialValue: type,\n })\n if (p.isCancel(picked)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n type = picked as FeedbackType\n }\n\n if (!title) {\n const t = await p.text({\n message: 'Title',\n placeholder: 'Short summary of the issue',\n validate: (v) => {\n if (!v?.trim()) return 'Title is required'\n if (v.length > MAX_TITLE_LEN)\n return `Title must be ${MAX_TITLE_LEN} characters or fewer`\n return undefined\n },\n })\n if (p.isCancel(t)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n title = String(t)\n }\n\n if (!body) {\n const m = await p.text({\n message: 'Details',\n placeholder: 'What happened? Steps to reproduce, what you expected…',\n validate: (v) => {\n if (!v?.trim()) return 'A description is required'\n if (v.length > MAX_BODY_LEN)\n return `Description must be ${MAX_BODY_LEN} characters or fewer`\n return undefined\n },\n })\n if (p.isCancel(m)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n body = String(m)\n }\n }\n\n let payload: FeedbackPayload\n try {\n payload = buildFeedbackPayload({\n type,\n title,\n body,\n context: collectContext(),\n })\n } catch (err) {\n return fail((err as Error).message)\n }\n\n // Confirmation — only when interactive and not explicitly skipped.\n if (interactive && !args.yes) {\n p.note(\n `${TYPE_LABELS[payload.type]}\\n${payload.title}\\n\\n${payload.body}` +\n `\\n\\nContext: deepspace ${payload.cliVersion} · ${payload.nodeVersion} · ${payload.platform}` +\n (payload.appName ? ` · app ${payload.appName}` : ''),\n 'Review',\n )\n const ok = await p.confirm({ message: 'Send this to the DeepSpace team?' })\n if (p.isCancel(ok) || !ok) {\n p.cancel('Not sent.')\n process.exit(0)\n }\n }\n\n let token: string\n try {\n token = await ensureToken()\n } catch (err) {\n return fail((err as Error).message ?? 'Not signed in. Run `deepspace login`.')\n }\n\n let result: { report: FeedbackReport }\n try {\n result = await api<{ report: FeedbackReport }>(token, '/api/feedback', {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n } catch (err) {\n return fail((err as Error).message)\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify({ ok: true, report: result.report }) + '\\n')\n return\n }\n\n if (interactive) {\n p.outro(`Thanks! Submitted as ${result.report.id}.`)\n } else {\n console.log(`Submitted feedback ${result.report.id} (${result.report.type}).`)\n }\n console.log(`Track triage status at ${DASHBOARD_URL}.`)\n },\n})\n"],"mappings":"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","names":["defineCommand","execSync","readFileSync","existsSync","dirname","join","fileURLToPath","writeFileSync","join","p","existsSync","readFileSync","join","join","existsSync","existsSync","readFileSync","join","existsSync","readFileSync","set","existsSync","readFileSync","join","writeFileSync","resolve","defineCommand","existsSync","readFileSync","join","homedir","AUTH_URL","join","homedir","defineCommand","existsSync","readFileSync","defineCommand","resolve","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","token","AUTH_URL","DIR","join","homedir","SESSION_PATH","TOKEN_PATH","existsSync","readFileSync","token","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseToml","existsSync","readFileSync","join","existsSync","resolve","status","existsSync","readFileSync","writeFileSync","join","defineCommand","join","existsSync","readFileSync","set","assignmentName","hasUnescapedQuote","remove","writeFileSync","token","text","parseDetail","defineCommand","status","defineCommand","resolve","token","defineCommand","DEFAULT_PORT","resolvePort","defineCommand","resolve","spawnSync","spawnSync","DEFAULT_PORT","defineCommand","resolvePort","resolve","token","spawnSync","defineCommand","spawnSync","resolve","defineCommand","resolve","spawnSync","defineCommand","p","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","SESSION_COOKIE","AUTH_URL","DIR","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","token","SESSION_PATH","defineCommand","list","defineCommand","execSync","readFileSync","readdirSync","existsSync","join","resolve","dirname","p","SECRET_NAME_RE","status","token","defineCommand","resolve","execSync","join","existsSync","readFileSync","dirname","wait","readdirSync","defineCommand","p","DEPLOY_URL","defineCommand","token","defineCommand","defineCommand","defineCommand","existsSync","resolve","join","execSync","join","existsSync","defineCommand","resolve","execSync","defineCommand","spawn","mkdirSync","join","homedir","resolve","spawn","mkdirSync","join","defineCommand","homedir","defineCommand","execSync","API_URL","token","text","confirm","resolve","defineCommand","openBrowser","list","execSync","defineCommand","list","defineCommand","readFileSync","API_URL","readFileSync","info","list","defineCommand","defineCommand","defineCommand","defineCommand","API_URL","api","token","text","confirm","resolve","list","defineCommand","create","defineCommand","existsSync","readFileSync","join","resolve","parseToml","p","defineCommand","intro","info","resolve","join","existsSync","parseToml","readFileSync","token","defineCommand","mkdirSync","writeFileSync","homedir","join","AUTH_URL","defineCommand","join","homedir","mkdirSync","writeFileSync","TOKEN_PATH","defineCommand","p","existsSync","readFileSync","dirname","join","API_URL","api","token","text","dirname","join","existsSync","pkg","readFileSync","detectAppName","defineCommand","dirname","fileURLToPath","readFileSync","join","existsSync","create","defineCommand","execSync"]}
|