@insforge/cli 0.1.60 → 0.1.62
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/README.md +87 -1
- package/dist/index.js +938 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/prompts.ts","../src/lib/config.ts","../src/commands/login.ts","../src/lib/errors.ts","../src/lib/auth.ts","../src/lib/credentials.ts","../src/lib/api/platform.ts","../src/lib/output.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/orgs/list.ts","../src/commands/projects/list.ts","../src/commands/projects/link.ts","../src/lib/skills.ts","../src/lib/analytics.ts","../src/commands/create.ts","../src/lib/api/oss.ts","../src/lib/env.ts","../src/commands/deployments/deploy.ts","../src/commands/db/query.ts","../src/commands/db/tables.ts","../src/commands/db/functions.ts","../src/commands/db/indexes.ts","../src/commands/db/policies.ts","../src/commands/db/triggers.ts","../src/commands/db/rpc.ts","../src/commands/db/export.ts","../src/commands/db/import.ts","../src/commands/db/migrations.ts","../src/lib/migrations.ts","../src/commands/records/list.ts","../src/commands/records/create.ts","../src/commands/records/update.ts","../src/commands/records/delete.ts","../src/commands/functions/list.ts","../src/commands/functions/deploy.ts","../src/commands/functions/invoke.ts","../src/commands/functions/code.ts","../src/commands/functions/delete.ts","../src/commands/storage/buckets.ts","../src/commands/storage/upload.ts","../src/commands/storage/download.ts","../src/commands/storage/create-bucket.ts","../src/commands/storage/delete-bucket.ts","../src/commands/storage/list-objects.ts","../src/commands/info.ts","../src/commands/list.ts","../src/commands/deployments/list.ts","../src/commands/deployments/status.ts","../src/commands/deployments/cancel.ts","../src/commands/deployments/env-vars.ts","../src/commands/docs.ts","../src/commands/secrets/list.ts","../src/commands/secrets/get.ts","../src/commands/secrets/add.ts","../src/commands/secrets/update.ts","../src/commands/secrets/delete.ts","../src/commands/schedules/list.ts","../src/commands/schedules/get.ts","../src/commands/schedules/create.ts","../src/commands/schedules/update.ts","../src/commands/schedules/delete.ts","../src/commands/schedules/logs.ts","../src/commands/compute/list.ts","../src/commands/compute/get.ts","../src/commands/compute/update.ts","../src/commands/compute/delete.ts","../src/commands/compute/start.ts","../src/commands/compute/stop.ts","../src/commands/compute/logs.ts","../src/commands/compute/deploy.ts","../src/lib/flyctl.ts","../src/commands/logs.ts","../src/commands/metadata.ts","../src/commands/diagnose/index.ts","../src/commands/diagnose/metrics.ts","../src/commands/diagnose/advisor.ts","../src/commands/diagnose/db.ts","../src/commands/diagnose/logs.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './lib/prompts.js';\nimport { getCredentials, getProjectConfig } from './lib/config.js';\nimport { registerLoginCommand } from './commands/login.js';\nimport { registerLogoutCommand } from './commands/logout.js';\nimport { registerWhoamiCommand } from './commands/whoami.js';\nimport { registerOrgsCommands } from './commands/orgs/list.js';\nimport { registerProjectsCommands } from './commands/projects/list.js';\nimport { registerProjectLinkCommand } from './commands/projects/link.js';\nimport { registerDbCommands } from './commands/db/query.js';\nimport { registerDbTablesCommand } from './commands/db/tables.js';\nimport { registerDbFunctionsCommand } from './commands/db/functions.js';\nimport { registerDbIndexesCommand } from './commands/db/indexes.js';\nimport { registerDbPoliciesCommand } from './commands/db/policies.js';\nimport { registerDbTriggersCommand } from './commands/db/triggers.js';\nimport { registerDbRpcCommand } from './commands/db/rpc.js';\nimport { registerDbExportCommand } from './commands/db/export.js';\nimport { registerDbImportCommand } from './commands/db/import.js';\nimport { registerDbMigrationsCommand } from './commands/db/migrations.js';\nimport { registerRecordsCommands } from './commands/records/list.js';\nimport { registerRecordsCreateCommand } from './commands/records/create.js';\nimport { registerRecordsUpdateCommand } from './commands/records/update.js';\nimport { registerRecordsDeleteCommand } from './commands/records/delete.js';\nimport { registerFunctionsCommands } from './commands/functions/list.js';\nimport { registerFunctionsDeployCommand } from './commands/functions/deploy.js';\nimport { registerFunctionsInvokeCommand } from './commands/functions/invoke.js';\nimport { registerFunctionsCodeCommand } from './commands/functions/code.js';\nimport { registerFunctionsDeleteCommand } from './commands/functions/delete.js';\nimport { registerStorageBucketsCommand } from './commands/storage/buckets.js';\nimport { registerStorageUploadCommand } from './commands/storage/upload.js';\nimport { registerStorageDownloadCommand } from './commands/storage/download.js';\nimport { registerStorageCreateBucketCommand } from './commands/storage/create-bucket.js';\nimport { registerStorageDeleteBucketCommand } from './commands/storage/delete-bucket.js';\nimport { registerStorageListObjectsCommand } from './commands/storage/list-objects.js';\nimport { registerCreateCommand } from './commands/create.js';\nimport { registerContextCommand } from './commands/info.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerDeploymentsDeployCommand } from './commands/deployments/deploy.js';\nimport { registerDeploymentsListCommand } from './commands/deployments/list.js';\nimport { registerDeploymentsStatusCommand } from './commands/deployments/status.js';\nimport { registerDeploymentsCancelCommand } from './commands/deployments/cancel.js';\nimport { registerDeploymentsEnvVarsCommand } from './commands/deployments/env-vars.js';\n\nimport { registerDocsCommand } from './commands/docs.js';\nimport { registerSecretsListCommand } from './commands/secrets/list.js';\nimport { registerSecretsGetCommand } from './commands/secrets/get.js';\nimport { registerSecretsAddCommand } from './commands/secrets/add.js';\nimport { registerSecretsUpdateCommand } from './commands/secrets/update.js';\nimport { registerSecretsDeleteCommand } from './commands/secrets/delete.js';\n\nimport { registerSchedulesListCommand } from './commands/schedules/list.js';\nimport { registerSchedulesGetCommand } from './commands/schedules/get.js';\nimport { registerSchedulesCreateCommand } from './commands/schedules/create.js';\nimport { registerSchedulesUpdateCommand } from './commands/schedules/update.js';\nimport { registerSchedulesDeleteCommand } from './commands/schedules/delete.js';\nimport { registerSchedulesLogsCommand } from './commands/schedules/logs.js';\n\nimport { registerComputeListCommand } from './commands/compute/list.js';\nimport { registerComputeGetCommand } from './commands/compute/get.js';\nimport { registerComputeUpdateCommand } from './commands/compute/update.js';\nimport { registerComputeDeleteCommand } from './commands/compute/delete.js';\nimport { registerComputeStartCommand } from './commands/compute/start.js';\nimport { registerComputeStopCommand } from './commands/compute/stop.js';\nimport { registerComputeLogsCommand } from './commands/compute/logs.js';\nimport { registerComputeDeployCommand } from './commands/compute/deploy.js';\n\nimport { registerLogsCommand } from './commands/logs.js';\nimport { registerMetadataCommand } from './commands/metadata.js';\nimport { registerDiagnoseCommands } from './commands/diagnose/index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')) as { version: string };\n\nconst INSFORGE_LOGO = `\n██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗\n██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝\n██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗\n██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝\n██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗\n╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝\n`;\n\nconst program = new Command();\n\nprogram\n .name('insforge')\n .description('InsForge CLI - Command line tool for InsForge platform')\n .version(pkg.version);\n\n// Global options\nprogram\n .option('--json', 'Output in JSON format')\n .option('--api-url <url>', 'Override Platform API URL')\n .option('-y, --yes', 'Skip confirmation prompts');\n\n// Top-level commands\nregisterLoginCommand(program);\nregisterLogoutCommand(program);\nregisterWhoamiCommand(program);\nregisterCreateCommand(program);\nregisterContextCommand(program);\nregisterListCommand(program);\nregisterDocsCommand(program);\nregisterProjectLinkCommand(program);\n\n// Orgs commands (hidden — use `insforge list` instead)\nconst orgsCmd = program.command('orgs', { hidden: true }).description('Manage organizations');\nregisterOrgsCommands(orgsCmd);\n\n// Projects commands (hidden — use `insforge list` instead)\nconst projectsCmd = program.command('projects', { hidden: true }).description('Manage projects');\nregisterProjectsCommands(projectsCmd);\n\n// Database commands\nconst dbCmd = program.command('db').description('Database operations');\nregisterDbCommands(dbCmd);\nregisterDbTablesCommand(dbCmd);\nregisterDbFunctionsCommand(dbCmd);\nregisterDbIndexesCommand(dbCmd);\nregisterDbPoliciesCommand(dbCmd);\nregisterDbTriggersCommand(dbCmd);\nregisterDbRpcCommand(dbCmd);\nregisterDbExportCommand(dbCmd);\nregisterDbImportCommand(dbCmd);\nregisterDbMigrationsCommand(dbCmd);\n\n// Records commands (hidden — do not use for now)\nconst recordsCmd = program.command('records', { hidden: true }).description('CRUD operations on table records');\nregisterRecordsCommands(recordsCmd);\nregisterRecordsCreateCommand(recordsCmd);\nregisterRecordsUpdateCommand(recordsCmd);\nregisterRecordsDeleteCommand(recordsCmd);\n\n// Functions commands\nconst functionsCmd = program.command('functions').description('Manage edge functions');\nregisterFunctionsCommands(functionsCmd);\nregisterFunctionsCodeCommand(functionsCmd);\nregisterFunctionsDeployCommand(functionsCmd);\nregisterFunctionsInvokeCommand(functionsCmd);\nregisterFunctionsDeleteCommand(functionsCmd);\n\n// Storage commands\nconst storageCmd = program.command('storage').description('Manage storage');\nregisterStorageBucketsCommand(storageCmd);\nregisterStorageCreateBucketCommand(storageCmd);\nregisterStorageDeleteBucketCommand(storageCmd);\nregisterStorageListObjectsCommand(storageCmd);\nregisterStorageUploadCommand(storageCmd);\nregisterStorageDownloadCommand(storageCmd);\n\n// Deployments commands\nconst deploymentsCmd = program.command('deployments').description('Deploy and manage frontend sites');\nregisterDeploymentsDeployCommand(deploymentsCmd);\nregisterDeploymentsListCommand(deploymentsCmd);\nregisterDeploymentsStatusCommand(deploymentsCmd);\nregisterDeploymentsCancelCommand(deploymentsCmd);\nregisterDeploymentsEnvVarsCommand(deploymentsCmd);\n// registerDeploymentsMetadataCommand(deploymentsCmd);\n// slug command doesn't work yet.\n// registerDeploymentsSlugCommand(deploymentsCmd);\n\n// Secrets commands\nconst secretsCmd = program.command('secrets').description('Manage secrets');\nregisterSecretsListCommand(secretsCmd);\nregisterSecretsGetCommand(secretsCmd);\nregisterSecretsAddCommand(secretsCmd);\nregisterSecretsUpdateCommand(secretsCmd);\nregisterSecretsDeleteCommand(secretsCmd);\n\n// Logs command\nregisterLogsCommand(program);\n\n// Metadata command\nregisterMetadataCommand(program);\n\n// Diagnose commands\nconst diagnoseCmd = program.command('diagnose');\nregisterDiagnoseCommands(diagnoseCmd);\n\n// Compute commands\nconst computeCmd = program.command('compute').description('Manage compute services (Docker containers on Fly.io)');\nregisterComputeListCommand(computeCmd);\nregisterComputeGetCommand(computeCmd);\nregisterComputeDeployCommand(computeCmd);\nregisterComputeUpdateCommand(computeCmd);\nregisterComputeDeleteCommand(computeCmd);\nregisterComputeStartCommand(computeCmd);\nregisterComputeStopCommand(computeCmd);\nregisterComputeLogsCommand(computeCmd);\n\n// Schedules commands\nconst schedulesCmd = program.command('schedules').description('Manage scheduled tasks (cron jobs)');\nregisterSchedulesListCommand(schedulesCmd);\nregisterSchedulesGetCommand(schedulesCmd);\nregisterSchedulesCreateCommand(schedulesCmd);\nregisterSchedulesUpdateCommand(schedulesCmd);\nregisterSchedulesDeleteCommand(schedulesCmd);\nregisterSchedulesLogsCommand(schedulesCmd);\n\nif (process.argv.length <= 2 && process.stdout.isTTY) {\n await showInteractiveMenu();\n} else {\n program.parse();\n}\n\nasync function showInteractiveMenu(): Promise<void> {\n let isLoggedIn = false;\n let isLinked = false;\n\n try {\n isLoggedIn = !!getCredentials()?.access_token;\n } catch { /* corrupted credentials file */ }\n\n try {\n isLinked = !!getProjectConfig()?.project_id;\n } catch { /* no project config */ }\n\n console.log(INSFORGE_LOGO);\n clack.intro(`InsForge CLI v${pkg.version}`);\n\n type Action = 'login' | 'create' | 'link' | 'deploy' | 'docs' | 'help';\n const options: { value: Action; label: string; hint?: string }[] = [];\n\n if (!isLoggedIn) {\n options.push({ value: 'login', label: 'Log in to InsForge' });\n }\n\n options.push(\n { value: 'create', label: 'Create a new project', hint: isLoggedIn ? undefined : 'requires login' },\n { value: 'link', label: 'Link an existing project', hint: isLoggedIn ? undefined : 'requires login' },\n );\n\n if (isLinked) {\n options.push({ value: 'deploy', label: 'Deploy your project' });\n }\n\n options.push(\n { value: 'docs', label: 'View documentation' },\n { value: 'help', label: 'Show all commands' },\n );\n\n const action = await prompts.select<string>({\n message: 'What would you like to do?',\n options,\n });\n\n if (prompts.isCancel(action)) {\n clack.cancel('Bye!');\n process.exit(0);\n }\n\n switch (action) {\n case 'login':\n await program.parseAsync(['node', 'insforge', 'login']);\n break;\n case 'create':\n await program.parseAsync(['node', 'insforge', 'create']);\n break;\n case 'link':\n await program.parseAsync(['node', 'insforge', 'link']);\n break;\n case 'deploy':\n await program.parseAsync(['node', 'insforge', 'deployments', 'deploy']);\n break;\n case 'docs':\n await program.parseAsync(['node', 'insforge', 'docs']);\n break;\n case 'help':\n program.help();\n break;\n }\n}\n","import * as readline from 'node:readline';\nimport * as clack from '@clack/prompts';\n\nexport const isInteractive = !!(process.stdin.isTTY && process.stdout.isTTY);\n\n/**\n * A line reader that buffers parsed lines and exposes a pull-based readLine API.\n *\n * readline.promises.question() loses 'line' events that fire between question() calls,\n * and does not reject cleanly on stream close. A buffered queue handles both.\n */\nexport class LineReader {\n private queue: string[] = [];\n private waiter: ((line: string | null) => void) | null = null;\n private closed = false;\n private rl: readline.Interface;\n\n constructor(\n input: NodeJS.ReadableStream,\n private output: NodeJS.WritableStream,\n ) {\n this.rl = readline.createInterface({ input });\n this.rl.on('line', (line) => {\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(line);\n } else {\n this.queue.push(line);\n }\n });\n this.rl.on('close', () => {\n this.closed = true;\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(null);\n }\n });\n }\n\n async readLine(prompt: string): Promise<string | null> {\n this.output.write(prompt);\n if (this.queue.length > 0) return this.queue.shift()!;\n if (this.closed) return null;\n return new Promise((resolve) => {\n this.waiter = resolve;\n });\n }\n\n close(): void {\n this.rl.close();\n }\n}\n\nlet sharedReader: LineReader | null = null;\nfunction getReader(): LineReader {\n if (!sharedReader) {\n sharedReader = new LineReader(process.stdin, process.stdout);\n }\n return sharedReader;\n}\n\nexport const CANCEL: unique symbol = Symbol('prompt.cancel');\nexport type CancelSymbol = typeof CANCEL;\n\nexport function isCancel<T>(v: T | CancelSymbol): v is CancelSymbol {\n return v === CANCEL || clack.isCancel(v);\n}\n\nexport interface TextOptions {\n message: string;\n initialValue?: string;\n placeholder?: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport interface SelectOption<T> {\n value: T;\n label: string;\n hint?: string;\n}\n\nexport interface SelectOptions<T> {\n message: string;\n options: SelectOption<T>[];\n initialValue?: T;\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function text(opts: TextOptions): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.text({\n message: opts.message,\n initialValue: opts.initialValue,\n placeholder: opts.placeholder,\n validate: opts.validate,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyText(opts);\n}\n\nexport async function select<T>(opts: SelectOptions<T>): Promise<T | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.select({\n message: opts.message,\n options: opts.options as { value: T; label: string; hint?: string }[],\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result as T;\n }\n return nonTtySelect(opts);\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.confirm({\n message: opts.message,\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyConfirm(opts);\n}\n\nexport async function password(opts: { message: string }): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.password({ message: opts.message });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n // Non-TTY: can't mask input over a pipe, just read the line. Preserve whitespace\n // since it can be valid in passwords.\n return nonTtyText({ message: opts.message, trim: false });\n}\n\nexport async function nonTtyText(\n opts: TextOptions & { trim?: boolean },\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<string | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const shouldTrim = opts.trim ?? true;\n const defaultHint = opts.initialValue ? ` [${opts.initialValue}]` : '';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const normalized = shouldTrim ? raw.trim() : raw;\n const value = normalized === '' ? (opts.initialValue ?? '') : normalized;\n if (opts.validate) {\n const err = opts.validate(value);\n if (err) {\n stderr.write(` ${err}\\n`);\n continue;\n }\n }\n return value;\n }\n}\n\nexport async function nonTtySelect<T>(\n opts: SelectOptions<T>,\n io: { reader?: LineReader; stdout?: NodeJS.WritableStream; stderr?: NodeJS.WritableStream } = {},\n): Promise<T | CancelSymbol> {\n if (opts.options.length === 0) {\n throw new Error(`No options available for prompt \"${opts.message}\".`);\n }\n const reader = io.reader ?? getReader();\n const stdout = io.stdout ?? process.stdout;\n const stderr = io.stderr ?? process.stderr;\n stdout.write(`? ${opts.message}\\n`);\n opts.options.forEach((o, i) => {\n const hint = o.hint ? ` — ${o.hint}` : '';\n stdout.write(` ${i + 1}) ${o.label}${hint}\\n`);\n });\n for (;;) {\n const raw = await reader.readLine(`Enter number [1-${opts.options.length}]: `);\n if (raw === null) return CANCEL;\n const n = Number.parseInt(raw.trim(), 10);\n if (Number.isInteger(n) && n >= 1 && n <= opts.options.length) {\n return opts.options[n - 1].value;\n }\n stderr.write(` Please enter a number between 1 and ${opts.options.length}.\\n`);\n }\n}\n\nexport async function nonTtyConfirm(\n opts: ConfirmOptions,\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<boolean | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const defaultHint = opts.initialValue === true ? ' [Y/n]' : opts.initialValue === false ? ' [y/N]' : ' [y/n]';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const answer = raw.trim().toLowerCase();\n if (answer === '' && opts.initialValue !== undefined) return opts.initialValue;\n if (answer === 'y' || answer === 'yes') return true;\n if (answer === 'n' || answer === 'no') return false;\n stderr.write(` Please answer y or n.\\n`);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { GlobalConfig, ProjectConfig, StoredCredentials } from '../types.js';\n\nconst GLOBAL_DIR = join(homedir(), '.insforge');\nconst CREDENTIALS_FILE = join(GLOBAL_DIR, 'credentials.json');\nconst CONFIG_FILE = join(GLOBAL_DIR, 'config.json');\n\nconst DEFAULT_PLATFORM_URL = 'https://api.insforge.dev';\nconst DEFAULT_FRONTEND_URL = 'https://insforge.dev';\n\n/** Sentinel project ID for OSS/self-hosted linking (valid UUID, never matches a real project). */\nexport const FAKE_PROJECT_ID = 'fa4e0000-1234-5678-90ab-cd1234567890';\nexport const FAKE_ORG_ID = 'fa4e0001-1234-5678-90ab-cd1234567890';\n\nfunction ensureGlobalDir(): void {\n if (!existsSync(GLOBAL_DIR)) {\n mkdirSync(GLOBAL_DIR, { recursive: true });\n }\n}\n\n// --- Global Config ---\n\nexport function getGlobalConfig(): GlobalConfig {\n if (!existsSync(CONFIG_FILE)) {\n return { platform_api_url: DEFAULT_PLATFORM_URL };\n }\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureGlobalDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\n// --- Credentials ---\n\nexport function getCredentials(): StoredCredentials | null {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n const raw = readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n ensureGlobalDir();\n writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n}\n\nexport function clearCredentials(): void {\n if (existsSync(CREDENTIALS_FILE)) {\n unlinkSync(CREDENTIALS_FILE);\n }\n // Clear session-related config (default_org_id) but keep platform_api_url etc.\n const config = getGlobalConfig();\n if (config.default_org_id) {\n delete config.default_org_id;\n saveGlobalConfig(config);\n }\n}\n\n// --- Project Config (local) ---\n\nfunction getLocalConfigDir(): string {\n return join(process.cwd(), '.insforge');\n}\n\nfunction getLocalConfigFile(): string {\n return join(getLocalConfigDir(), 'project.json');\n}\n\nexport function getProjectConfig(): ProjectConfig | null {\n const file = getLocalConfigFile();\n if (!existsSync(file)) {\n return null;\n }\n const raw = readFileSync(file, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveProjectConfig(config: ProjectConfig): void {\n const dir = getLocalConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(getLocalConfigFile(), JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\n// --- Resolved values (env vars > flags > config) ---\n\nexport function getPlatformApiUrl(override?: string): string {\n return process.env.INSFORGE_API_URL ?? override ?? getGlobalConfig().platform_api_url ?? DEFAULT_PLATFORM_URL;\n}\n\nexport function getFrontendUrl(): string {\n return process.env.INSFORGE_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n}\n\nexport function getAccessToken(): string | null {\n return process.env.INSFORGE_ACCESS_TOKEN ?? getCredentials()?.access_token ?? null;\n}\n\nexport function getProjectId(override?: string): string | null {\n return process.env.INSFORGE_PROJECT_ID ?? override ?? getProjectConfig()?.project_id ?? null;\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport { saveCredentials, getPlatformApiUrl } from '../lib/config.js';\nimport { login as platformLogin } from '../lib/api/platform.js';\nimport { performOAuthLogin } from '../lib/auth.js';\nimport { handleError, getRootOpts, CLIError, formatFetchError } from '../lib/errors.js';\nimport type { StoredCredentials, User } from '../types.js';\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Authenticate with InsForge platform')\n .option('--email', 'Login with email and password instead of browser')\n .option('--client-id <id>', 'OAuth client ID (defaults to insforge-cli)')\n .option('--user-api-key <key>', 'Authenticate with a uak_ personal access token')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n try {\n if (opts.userApiKey) {\n await loginWithUserApiKey(opts.userApiKey, json, apiUrl);\n } else if (opts.email) {\n await loginWithEmail(json, apiUrl);\n } else {\n await loginWithOAuth(json, apiUrl);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('cancelled')) {\n process.exit(0);\n }\n handleError(err, json);\n }\n });\n}\n\nasync function loginWithEmail(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const email = json\n ? process.env.INSFORGE_EMAIL\n : await prompts.text({\n message: 'Email:',\n validate: (v) => (v.includes('@') ? undefined : 'Please enter a valid email'),\n });\n\n if (prompts.isCancel(email)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n const password = json\n ? process.env.INSFORGE_PASSWORD\n : await prompts.password({\n message: 'Password:',\n });\n\n if (prompts.isCancel(password)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n if (!email || !password) {\n throw new Error('Email and password are required. Set INSFORGE_EMAIL and INSFORGE_PASSWORD environment variables for non-interactive mode.');\n }\n\n if (!json) {\n const s = clack.spinner();\n s.start('Authenticating...');\n\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n\n s.stop(`Authenticated as ${result.user.email}`);\n clack.outro('Done');\n } else {\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n console.log(JSON.stringify({ success: true, user: result.user }));\n }\n}\n\nasync function loginWithOAuth(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const creds = await performOAuthLogin(apiUrl);\n\n if (!json) {\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user: creds.user }));\n }\n}\n\nasync function loginWithUserApiKey(\n key: string,\n json: boolean,\n apiUrl?: string,\n): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n if (!key.startsWith('uak_')) {\n throw new CLIError('Invalid API key — must start with \"uak_\".');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Verifying API key...');\n\n let jwt: string;\n let user: User;\n try {\n const exchanged = await exchangePatForJwt(key, apiUrl);\n jwt = exchanged.token;\n user = exchanged.user;\n } catch (err) {\n s?.stop('API key verification failed');\n throw err instanceof CLIError\n ? err\n : new CLIError(err instanceof Error ? err.message : String(err));\n }\n\n // Storage: access_token holds the JWT, refresh_token holds the PAT.\n // Detect PAT login later by checking refresh_token.startsWith('uak_').\n saveCredentials({\n access_token: jwt,\n refresh_token: key,\n user,\n });\n\n if (!json) {\n s?.stop(`Authenticated as ${user.email}`);\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user }));\n }\n}\n\n/**\n * Exchange a uak_ PAT for a short-lived JWT via the backend exchange endpoint.\n * The PAT itself is never stored as an access token — we store the JWT and\n * keep the PAT only for silent re-exchange when the JWT expires.\n */\nasync function exchangePatForJwt(\n apiKey: string,\n apiUrl?: string,\n): Promise<{ token: string; user: User }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const fullUrl = `${baseUrl}/auth/v1/exchange-api-key`;\n\n let res: Response;\n try {\n res = await fetch(fullUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey }),\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n const msg = body.message ?? body.error ?? `HTTP ${res.status}`;\n throw new CLIError(`API key is invalid or revoked: ${msg}`);\n }\n\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new CLIError('Exchange endpoint returned an invalid response (missing token).');\n }\n const jwt = data.token;\n\n // The exchange endpoint returns only the JWT. Fetch the user via /auth/v1/profile\n // using the fresh JWT so we can persist identity in credentials.json.\n let profileRes: Response;\n try {\n profileRes = await fetch(`${baseUrl}/auth/v1/profile`, {\n headers: { Authorization: `Bearer ${jwt}` },\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, `${baseUrl}/auth/v1/profile`));\n }\n if (!profileRes.ok) {\n throw new CLIError(`Exchange succeeded but could not fetch profile: HTTP ${profileRes.status}`);\n }\n const profile = (await profileRes.json().catch(() => null)) as\n | { user?: User }\n | User\n | null;\n const user =\n profile && typeof profile === 'object' && 'user' in profile\n ? (profile as { user?: User }).user\n : ((profile as User | null) ?? undefined);\n if (!user) {\n throw new CLIError('Exchange succeeded but profile response was empty');\n }\n\n return { token: jwt, user };\n}\n","import type { Command } from 'commander';\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1,\n public code?: string,\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport class AuthError extends CLIError {\n constructor(message: string = 'Not authenticated. Run `npx @insforge/cli login` first.') {\n super(message, 2, 'AUTH_ERROR');\n }\n}\n\nexport class ProjectNotLinkedError extends CLIError {\n constructor() {\n super('No project linked. Run `npx @insforge/cli link` first.', 3, 'PROJECT_NOT_LINKED');\n }\n}\n\nexport class NotFoundError extends CLIError {\n constructor(resource: string) {\n super(`${resource} not found.`, 4, 'NOT_FOUND');\n }\n}\n\nexport class PermissionError extends CLIError {\n constructor(message: string = 'Permission denied.') {\n super(message, 5, 'PERMISSION_DENIED');\n }\n}\n\n/**\n * Format a Node fetch error with actionable context.\n *\n * Node's undici-based fetch throws a generic Error with `message: 'fetch failed'`\n * for any network-layer failure (DNS, connect, TLS, reset, timeout). The real\n * reason sits on `err.cause` with a `code` like ENOTFOUND / ECONNREFUSED /\n * ETIMEDOUT / UND_ERR_CONNECT_TIMEOUT / CERT_HAS_EXPIRED, etc. Unpack it so\n * users see something actionable instead of \"fetch failed\".\n */\nexport function formatFetchError(err: unknown, url: string): string {\n if (!(err instanceof Error)) return `Network request to ${url} failed: ${String(err)}`;\n if (err.message !== 'fetch failed') return err.message;\n\n const cause = (err as { cause?: unknown }).cause;\n const code =\n (cause as { code?: string } | undefined)?.code ??\n (cause as { errno?: string } | undefined)?.errno;\n const causeMsg =\n cause instanceof Error ? cause.message : typeof cause === 'string' ? cause : undefined;\n\n let host = url;\n try { host = new URL(url).host; } catch { /* url may already be a host */ }\n\n switch (code) {\n case 'ENOTFOUND':\n case 'EAI_AGAIN':\n return `Cannot resolve ${host} (DNS lookup failed: ${code}). Check your internet connection or DNS settings.`;\n case 'ECONNREFUSED':\n return `Connection to ${host} refused. The server may be down or blocked by a firewall.`;\n case 'ETIMEDOUT':\n case 'UND_ERR_CONNECT_TIMEOUT':\n return `Connection to ${host} timed out. Check your network, VPN, or proxy settings.`;\n case 'ECONNRESET':\n case 'UND_ERR_SOCKET':\n return `Connection to ${host} was reset. A proxy, VPN, or firewall may be interfering.`;\n case 'CERT_HAS_EXPIRED':\n case 'UNABLE_TO_VERIFY_LEAF_SIGNATURE':\n case 'SELF_SIGNED_CERT_IN_CHAIN':\n case 'DEPTH_ZERO_SELF_SIGNED_CERT':\n return `TLS certificate error contacting ${host} (${code}). Your network may be intercepting HTTPS (corporate proxy / VPN).`;\n }\n\n if (code) return `Network error contacting ${host}: ${code}${causeMsg ? ` — ${causeMsg}` : ''}`;\n if (causeMsg) return `Network error contacting ${host}: ${causeMsg}`;\n return `Network error contacting ${host}.`;\n}\n\n/**\n * Extract error message from a deployment's metadata field.\n * DeploymentSchema stores errors in metadata.error.errorMessage rather than a top-level field.\n */\nexport function getDeploymentError(metadata: Record<string, unknown> | null): string | null {\n if (!metadata || typeof metadata.error !== 'object' || !metadata.error) return null;\n return (metadata.error as { errorMessage?: string }).errorMessage ?? null;\n}\n\nexport function handleError(err: unknown, json: boolean): never {\n if (err instanceof CLIError) {\n if (json) {\n console.error(JSON.stringify({ error: err.message, code: err.code }));\n } else {\n console.error(`Error: ${err.message}`);\n }\n process.exit(err.exitCode);\n }\n\n const message = err instanceof Error ? err.message : String(err);\n if (json) {\n console.error(JSON.stringify({ error: message, code: 'UNKNOWN_ERROR' }));\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n}\n\nexport function getJsonFlag(cmd: Command): boolean {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().json ?? false;\n}\n\nexport function getRootOpts(cmd: Command): { json: boolean; apiUrl?: string; yes: boolean } {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n const opts = root.opts();\n return {\n json: opts.json ?? false,\n apiUrl: opts.apiUrl,\n yes: opts.yes ?? false,\n };\n}\n","import { createServer } from 'node:http';\nimport { randomBytes, createHash } from 'node:crypto';\nimport { URL } from 'node:url';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport { isInteractive } from './prompts.js';\nimport { getGlobalConfig, getPlatformApiUrl, saveCredentials } from './config.js';\nimport { getProfile } from './api/platform.js';\nimport { formatFetchError } from './errors.js';\nimport type { StoredCredentials } from '../types.js';\n\n// Default OAuth client for InsForge CLI (pre-registered on the platform)\nexport const DEFAULT_CLIENT_ID = 'clf_NK8cMUs41gm8ZcfdtSguVw';\nexport const OAUTH_SCOPES = 'user:read organizations:read projects:read projects:write';\n\nexport interface PKCEChallenge {\n code_verifier: string;\n code_challenge: string;\n}\n\nexport interface OAuthCallbackResult {\n code: string;\n state: string;\n}\n\n/**\n * Generate PKCE code_verifier and code_challenge (S256).\n */\nexport function generatePKCE(): PKCEChallenge {\n const code_verifier = randomBytes(32).toString('base64url');\n const code_challenge = createHash('sha256').update(code_verifier).digest('base64url');\n return { code_verifier, code_challenge };\n}\n\n/**\n * Generate a random state parameter for CSRF protection.\n */\nexport function generateState(): string {\n return randomBytes(16).toString('base64url');\n}\n\n/**\n * Build the OAuth authorization URL.\n */\nexport function buildAuthorizeUrl(params: {\n platformUrl: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n state: string;\n scopes: string;\n}): string {\n const url = new URL(`${params.platformUrl}/api/oauth/v1/authorize`);\n url.searchParams.set('client_id', params.clientId);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('scope', params.scopes);\n url.searchParams.set('code_challenge', params.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('state', params.state);\n return url.toString();\n}\n\n/**\n * Exchange authorization code for tokens via the token endpoint.\n */\nexport async function exchangeCodeForTokens(params: {\n platformUrl: string;\n code: string;\n redirectUri: string;\n clientId: string;\n codeVerifier: string;\n}): Promise<{ access_token: string; refresh_token: string; expires_in: number; scope: string }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code: params.code,\n redirect_uri: params.redirectUri,\n client_id: params.clientId,\n code_verifier: params.codeVerifier,\n }),\n });\n } catch (err) {\n throw new Error(`Token exchange failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token exchange failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token: string; expires_in: number; scope: string };\n}\n\n/**\n * Refresh an OAuth access token using a refresh token.\n */\nexport async function refreshOAuthToken(params: {\n platformUrl: string;\n refreshToken: string;\n clientId: string;\n}): Promise<{ access_token: string; refresh_token?: string; expires_in: number }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n client_id: params.clientId,\n }),\n });\n } catch (err) {\n throw new Error(`Token refresh failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token refresh failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token?: string; expires_in: number };\n}\n\n/**\n * Start a local HTTP server to receive the OAuth authorization code callback.\n */\nexport function startCallbackServer(): Promise<{\n port: number;\n result: Promise<OAuthCallbackResult>;\n close: () => void;\n}> {\n return new Promise((resolveServer) => {\n let resolveResult: (value: OAuthCallbackResult) => void;\n let rejectResult: (reason: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const desc = url.searchParams.get('error_description') ?? error;\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body><h2>Authentication failed</h2><p>${desc}</p><p>You can close this window.</p></body></html>`);\n rejectResult!(new Error(desc));\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2><p>Missing authorization code.</p></body></html>');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication successful!</h2><p>You can close this window and return to the terminal.</p></body></html>');\n resolveResult!({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n const port = typeof addr === 'object' ? addr!.port : 0;\n resolveServer({\n port,\n result: resultPromise,\n close: () => { server.close(); server.closeAllConnections(); },\n });\n });\n\n // Timeout after 5 minutes (unref so it doesn't keep the process alive)\n setTimeout(() => {\n rejectResult!(new Error('Authentication timed out. Please try again.'));\n server.close();\n }, 5 * 60 * 1000).unref();\n });\n}\n\n/**\n * Perform the full OAuth PKCE login flow:\n * generate PKCE + state, start callback server, open browser, exchange code, save credentials.\n * Returns the stored credentials on success.\n */\nexport async function performOAuthLogin(apiUrl?: string): Promise<StoredCredentials> {\n const platformUrl = getPlatformApiUrl(apiUrl);\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n // 1. Generate PKCE and state\n const pkce = generatePKCE();\n const state = generateState();\n\n // 2. Start local callback server\n const { port, result, close } = await startCallbackServer();\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n // 3. Build authorization URL\n const authUrl = buildAuthorizeUrl({\n platformUrl,\n clientId,\n redirectUri,\n codeChallenge: pkce.code_challenge,\n state,\n scopes: OAUTH_SCOPES,\n });\n\n if (isInteractive) {\n clack.log.info('Opening browser for authentication...');\n clack.log.info(`If browser doesn't open, visit:\\n${authUrl}`);\n } else {\n // Non-TTY (agent shell): surface the URL prominently via stderr so it stays out of\n // any JSON stdout stream but is still visible to agents and humans.\n process.stderr.write(`\\nTo sign in, open this URL in your browser:\\n\\n ${pc.cyan(pc.underline(authUrl))}\\n\\n`);\n }\n\n // 4. Open browser (best effort — often works even from agent shells since we're on the same machine)\n try {\n const open = (await import('open')).default;\n await open(authUrl);\n } catch {\n if (isInteractive) clack.log.warn('Could not open browser. Please visit the URL above.');\n }\n\n // 5. Wait for callback — use clack spinner only in TTY (non-TTY spinner renders garbage)\n const s = isInteractive ? clack.spinner() : null;\n s?.start('Waiting for authentication...');\n if (!isInteractive) process.stderr.write('Waiting for authentication...\\n');\n\n try {\n const callbackResult = await result;\n close();\n\n // Verify state\n if (callbackResult.state !== state) {\n s?.stop('Authentication failed');\n throw new Error('State mismatch. Possible CSRF attack.');\n }\n\n // 6. Exchange code for tokens\n s?.message('Exchanging authorization code...');\n const tokens = await exchangeCodeForTokens({\n platformUrl,\n code: callbackResult.code,\n redirectUri,\n clientId,\n codeVerifier: pkce.code_verifier,\n });\n\n // 7. Save credentials and fetch profile\n const creds: StoredCredentials = {\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n user: { id: '', name: '', email: '', avatar_url: null, email_verified: true },\n };\n saveCredentials(creds);\n\n try {\n const profile = await getProfile(apiUrl);\n creds.user = profile;\n saveCredentials(creds);\n s?.stop(`Authenticated as ${profile.email}`);\n if (!isInteractive) process.stderr.write(`Authenticated as ${profile.email}\\n`);\n } catch {\n s?.stop('Authenticated successfully');\n if (!isInteractive) process.stderr.write('Authenticated successfully\\n');\n }\n\n return creds;\n } catch (err) {\n close();\n s?.stop('Authentication failed');\n if (!isInteractive) process.stderr.write('Authentication failed\\n');\n throw err;\n }\n}\n","import { getCredentials, getGlobalConfig, getPlatformApiUrl, saveCredentials, getProjectConfig, FAKE_PROJECT_ID } from './config.js';\nimport { AuthError } from './errors.js';\nimport { refreshOAuthToken, DEFAULT_CLIENT_ID, performOAuthLogin } from './auth.js';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './prompts.js';\nimport type { StoredCredentials } from '../types.js';\n\n/** True if stored credentials represent a PAT-based login (refresh_token is a uak_ token). */\nexport function isPatLogin(creds: StoredCredentials | null | undefined): boolean {\n return creds?.refresh_token?.startsWith('uak_') ?? false;\n}\n\nexport async function requireAuth(apiUrl?: string, allowOssBypass = true): Promise<StoredCredentials> {\n const projConfig = getProjectConfig();\n if (allowOssBypass && projConfig?.project_id === FAKE_PROJECT_ID) {\n return {\n access_token: 'oss-token',\n refresh_token: 'oss-refresh',\n user: {\n id: 'oss-user',\n name: 'OSS User',\n email: 'oss@insforge.local',\n avatar_url: null,\n email_verified: true,\n },\n };\n }\n\n const creds = getCredentials();\n if (creds && creds.access_token) return creds;\n\n // PAT session with an expired/empty access_token: silently re-exchange\n // instead of prompting for browser OAuth.\n if (isPatLogin(creds)) {\n await refreshAccessToken(apiUrl);\n return getCredentials()!;\n }\n\n clack.log.info('You need to log in to continue.');\n\n for (;;) {\n try {\n return await performOAuthLogin(apiUrl);\n } catch (err) {\n if (!process.stdout.isTTY) throw err;\n\n const msg = err instanceof Error ? err.message : 'Unknown error';\n clack.log.error(`Login failed: ${msg}`);\n\n const retry = await prompts.confirm({ message: 'Would you like to try again?' });\n if (prompts.isCancel(retry) || !retry) {\n throw new AuthError('Authentication required. Run `npx @insforge/cli login` to authenticate.');\n }\n }\n }\n}\n\nexport async function refreshAccessToken(apiUrl?: string): Promise<string> {\n const creds = getCredentials();\n if (!creds) {\n throw new AuthError('Not logged in. Run `npx @insforge/cli login` first.');\n }\n\n const platformUrl = getPlatformApiUrl(apiUrl);\n\n // PAT branch: re-exchange the stored uak_ for a fresh JWT.\n if (isPatLogin(creds)) {\n let res: Response;\n try {\n res = await fetch(`${platformUrl}/auth/v1/exchange-api-key`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey: creds.refresh_token }),\n });\n } catch {\n // Background refresh path — surface a network error clearly.\n throw new AuthError(\n `Unable to reach auth server at ${platformUrl}. Check your network connection.`\n );\n }\n if (!res.ok) {\n // Auth failures (401/403/404) mean the PAT is actually bad — ask the user\n // to rotate. Everything else (5xx, 429, gateway errors) is transient and\n // shouldn't instruct the user to rotate a healthy key.\n if (res.status === 401 || res.status === 403 || res.status === 404) {\n throw new AuthError(\n 'API key is invalid or revoked. Run `npx @insforge/cli login --user-api-key <new-key>` again.'\n );\n }\n throw new AuthError(\n `Auth server returned HTTP ${res.status} while refreshing session. Please retry shortly.`\n );\n }\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new AuthError('Exchange endpoint returned an invalid response (missing token).');\n }\n saveCredentials({ ...creds, access_token: data.token });\n return data.token;\n }\n\n if (!creds.refresh_token) {\n throw new AuthError('Refresh token not found. Run `npx @insforge/cli login` again.');\n }\n\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n try {\n const data = await refreshOAuthToken({\n platformUrl,\n refreshToken: creds.refresh_token,\n clientId,\n });\n\n const updated: StoredCredentials = {\n ...creds,\n access_token: data.access_token,\n // Update refresh token if rotated\n refresh_token: data.refresh_token ?? creds.refresh_token,\n };\n saveCredentials(updated);\n return data.access_token;\n } catch {\n // Token refresh failed — try re-authenticating interactively\n if (process.stdout.isTTY) {\n clack.log.warn('Session expired. Please log in again.');\n const newCreds = await performOAuthLogin(apiUrl);\n return newCreds.access_token;\n }\n throw new AuthError('Failed to refresh token. Run `npx @insforge/cli login` again.');\n }\n}\n","import { getAccessToken, getPlatformApiUrl } from '../config.js';\nimport { AuthError, CLIError, formatFetchError } from '../errors.js';\nimport { refreshAccessToken } from '../credentials.js';\nimport type {\n ApiKeyResponse,\n LoginResponse,\n Organization,\n Project,\n User,\n} from '../../types.js';\n\nexport async function platformFetch(\n path: string,\n options: RequestInit = {},\n apiUrl?: string,\n): Promise<Response> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const token = getAccessToken();\n if (!token) {\n throw new AuthError();\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...(options.headers as Record<string, string> ?? {}),\n };\n\n const fullUrl = `${baseUrl}${path}`;\n if (process.env.INSFORGE_DEBUG) {\n console.error(`[DEBUG] ${options.method ?? 'GET'} ${fullUrl}`);\n console.error(`[DEBUG] Headers: ${JSON.stringify(headers, null, 2)}`);\n if (options.body) {\n console.error(`[DEBUG] Body: ${typeof options.body === 'string' ? options.body : JSON.stringify(options.body)}`);\n }\n }\n\n let res: Response;\n try {\n res = await fetch(fullUrl, { ...options, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n // Auto-refresh on 401\n if (res.status === 401) {\n const newToken = await refreshAccessToken(apiUrl);\n headers.Authorization = `Bearer ${newToken}`;\n let retryRes: Response;\n try {\n retryRes = await fetch(fullUrl, { ...options, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n if (!retryRes.ok) {\n const err = await retryRes.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Request failed: ${retryRes.status}`, retryRes.status === 403 ? 5 : 1);\n }\n return retryRes;\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string; message?: string };\n const msg = err.message ? `${err.error ?? res.status}: ${err.message}` : (err.error ?? `Request failed: ${res.status}`);\n throw new CLIError(msg, res.status === 403 ? 5 : 1);\n }\n\n return res;\n}\n\n// --- Auth ---\n\nexport async function login(email: string, password: string, apiUrl?: string): Promise<LoginResponse & { _refreshToken?: string }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const res = await fetch(`${baseUrl}/auth/v1/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new AuthError(err.error ?? 'Login failed. Check your email and password.');\n }\n\n // Extract refresh token from Set-Cookie header\n const setCookie = res.headers.get('set-cookie') ?? '';\n const refreshTokenMatch = setCookie.match(/refreshToken=([^;]+)/);\n const data = (await res.json()) as LoginResponse;\n\n return {\n ...data,\n // Attach refresh token to the response for storage\n _refreshToken: refreshTokenMatch?.[1],\n } as LoginResponse & { _refreshToken?: string };\n}\n\nexport async function getProfile(apiUrl?: string): Promise<User> {\n const res = await platformFetch('/auth/v1/profile', {}, apiUrl);\n const data = await res.json() as { user?: User };\n return data.user ?? (data as unknown as User);\n}\n\n// --- Organizations ---\n\nexport async function listOrganizations(apiUrl?: string): Promise<Organization[]> {\n const res = await platformFetch('/organizations/v1', {}, apiUrl);\n const data = await res.json() as { organizations?: Organization[] };\n return data.organizations ?? (data as unknown as Organization[]);\n}\n\n// --- Projects ---\n\nexport async function listProjects(orgId: string, apiUrl?: string): Promise<Project[]> {\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {}, apiUrl);\n const data = await res.json() as { projects?: Project[] };\n return data.projects ?? (data as unknown as Project[]);\n}\n\nexport async function getProject(projectId: string, apiUrl?: string): Promise<Project> {\n const res = await platformFetch(`/projects/v1/${projectId}`, {}, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\nexport async function getProjectApiKey(projectId: string, apiUrl?: string): Promise<string> {\n const res = await platformFetch(`/projects/v1/${projectId}/access-api-key`, {}, apiUrl);\n const data = (await res.json()) as ApiKeyResponse;\n return data.access_api_key;\n}\n\nexport async function reportAgentConnected(\n payload: { project_id?: string; app_key?: string },\n apiUrl?: string,\n): Promise<void> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n const token = getAccessToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n await fetch(`${baseUrl}/tracking/v1/agent-connected`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...payload, client: 'cli' }),\n });\n}\n\nexport interface DiagnosticRequest {\n project_id: string;\n question: string;\n context: {\n context_version: string;\n metrics?: unknown;\n advisor?: unknown;\n db?: unknown;\n logs?: unknown;\n client_info?: {\n cli_version?: string;\n node_version?: string;\n os?: string;\n };\n };\n}\n\nexport interface DiagnosticSSEEvent {\n type: 'delta' | 'tool_call' | 'tool_result' | 'done' | 'error';\n data: Record<string, unknown>;\n}\n\nexport type DiagnosticEventHandler = (event: DiagnosticSSEEvent) => void;\n\n/**\n * Stream diagnostic analysis via SSE. Calls `onEvent` for each SSE event.\n * Returns the raw Response so the caller can handle errors before streaming.\n */\nexport async function streamDiagnosticAnalysis(\n payload: DiagnosticRequest,\n onEvent: DiagnosticEventHandler,\n apiUrl?: string,\n): Promise<void> {\n const res = await platformFetch('/diagnostic/v1/analyze', {\n method: 'POST',\n body: JSON.stringify(payload),\n }, apiUrl);\n\n const body = res.body;\n if (!body) throw new CLIError('No response body from diagnostic API.');\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent: DiagnosticSSEEvent['type'] | null = 'delta';\n\n const VALID_EVENTS = new Set<string>(['delta', 'tool_call', 'tool_result', 'done', 'error']);\n\n const processLine = (line: string): void => {\n if (line.startsWith('event:')) {\n const evt = line.slice(6).trim();\n currentEvent = VALID_EVENTS.has(evt) ? evt as DiagnosticSSEEvent['type'] : null;\n } else if (line.startsWith('data:')) {\n if (!currentEvent) return;\n const raw = line.slice(5).trim();\n if (!raw) return;\n try {\n const data = JSON.parse(raw) as Record<string, unknown>;\n onEvent({ type: currentEvent, data });\n } catch {\n // skip malformed JSON\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n processLine(line);\n }\n }\n\n // Flush remaining bytes from multi-byte sequences\n buffer += decoder.decode();\n if (buffer.trim()) {\n processLine(buffer);\n }\n}\n\nexport async function rateDiagnosticSession(\n sessionId: string,\n rating: 'helpful' | 'not_helpful' | 'incorrect',\n comment?: string,\n apiUrl?: string,\n): Promise<void> {\n const body: Record<string, string> = { rating };\n if (comment) body.comment = comment;\n await platformFetch(`/diagnostic/v1/sessions/${sessionId}/rating`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n}\n\nexport async function createProject(\n orgId: string,\n name: string,\n region?: string,\n apiUrl?: string,\n): Promise<Project> {\n const body: Record<string, string> = { name };\n if (region) body.region = region;\n\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\n","import Table from 'cli-table3';\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function outputTable(headers: string[], rows: string[][]): void {\n const table = new Table({\n head: headers,\n style: { head: ['cyan'] },\n });\n for (const row of rows) {\n table.push(row);\n }\n console.log(table.toString());\n}\n\nexport function outputSuccess(message: string): void {\n console.log(`✓ ${message}`);\n}\n\nexport function outputInfo(message: string): void {\n console.log(message);\n}\n","import type { Command } from 'commander';\nimport { clearCredentials } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputSuccess, outputJson } from '../lib/output.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out from InsForge platform')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n clearCredentials();\n if (json) {\n outputJson({ success: true, message: 'Logged out successfully' });\n } else {\n outputSuccess('Logged out successfully.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProfile } from '../lib/api/platform.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputInfo } from '../lib/output.js';\nimport { requireAuth } from '../lib/credentials.js';\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current authenticated user')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const profile = await getProfile(apiUrl);\n\n if (json) {\n outputJson(profile);\n } else {\n outputInfo(`Logged in as: ${profile.email ?? profile.name}`);\n if (profile.name) outputInfo(`Name: ${profile.name}`);\n if (profile.id) outputInfo(`ID: ${profile.id}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerOrgsCommands(orgsCmd: Command): void {\n orgsCmd\n .command('list')\n .description('List all organizations')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (json) {\n outputJson(orgs);\n } else {\n if (!orgs.length) {\n console.log('No organizations found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Type'],\n orgs.map((o) => [\n o.id,\n o.name,\n o.type ?? '-',\n ]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { listOrganizations, listProjects } from '../../lib/api/platform.js';\nimport { getGlobalConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerProjectsCommands(projectsCmd: Command): void {\n projectsCmd\n .command('list')\n .description('List all projects in an organization')\n .option('--org-id <id>', 'Organization ID (uses default if not specified)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n\n let orgId = opts.orgId ?? getGlobalConfig().default_org_id;\n\n if (!orgId) {\n // Try to auto-select if user has only one org\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found. Create one on the InsForge dashboard.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n } else if (!json) {\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) {\n process.exit(0);\n }\n orgId = selected;\n } else {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n }\n\n const projects = await listProjects(orgId, apiUrl);\n\n if (json) {\n outputJson(projects);\n } else {\n if (!projects.length) {\n console.log('No projects found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Region', 'Status', 'AppKey'],\n projects.map((p) => [p.id, p.name, p.region, p.status, p.appkey]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n listOrganizations,\n listProjects,\n getProject,\n getProjectApiKey,\n reportAgentConnected,\n} from '../../lib/api/platform.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl, FAKE_PROJECT_ID, FAKE_ORG_ID } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { installSkills, reportCliUsage } from '../../lib/skills.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../../lib/analytics.js';\nimport { downloadGitHubTemplate } from '../create.js';\nimport type { ProjectConfig } from '../../types.js';\n\nconst execAsync = promisify(exec);\n\nfunction buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\nexport function registerProjectLinkCommand(program: Command): void {\n program\n .command('link')\n .description('Link current directory to an InsForge project')\n .option('--project-id <id>', 'Project ID to link')\n .option('--org-id <id>', 'Organization ID')\n .option('--template <template>', 'Download a template after linking: react, nextjs, chatbot, crm, e-commerce, todo')\n .option('--api-base-url <url>', 'API Base URL for direct linking (OSS/Self-hosted)')\n .option('--api-key <key>', 'API Key for direct linking (OSS/Self-hosted)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n // Every template value accepted here is a directory in the InsForge\n // templates repo, so validation and the download call reference the\n // same single list.\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo'];\n\n try {\n if (opts.template && !validTemplates.includes(opts.template)) {\n throw new CLIError(`Invalid template \"${opts.template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n\n if (opts.apiBaseUrl || opts.apiKey) {\n try {\n if (!opts.apiBaseUrl || !opts.apiKey) {\n throw new CLIError('Both --api-base-url and --api-key must be provided together for direct linking.');\n }\n\n try {\n new URL(opts.apiBaseUrl);\n } catch {\n throw new CLIError('Invalid --api-base-url. Please provide a valid URL.');\n }\n\n // Direct OSS/Self-hosted linking bypasses OAuth\n const projectConfig: ProjectConfig = {\n project_id: FAKE_PROJECT_ID,\n project_name: 'oss-project',\n org_id: FAKE_ORG_ID,\n appkey: 'ossfkey',\n region: 'us-test',\n api_key: opts.apiKey,\n oss_host: opts.apiBaseUrl.replace(/\\/$/, ''), // remove trailing slash if any\n };\n\n const template = opts.template as string | undefined;\n\n // Template path: create a subdirectory, link inside it, download template,\n // install deps. Mirrors the OAuth template flow below.\n if (template) {\n const defaultDir = `insforge-${template}`;\n let dirName = defaultDir;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: defaultDir,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({\n success: true,\n project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region },\n directory: dirName,\n template,\n });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n captureEvent(FAKE_ORG_ID, 'template_selected', { template, source: 'link_direct' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n if (templateDownloaded && !json) {\n const installSpinner = clack.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner.stop('Dependencies installed');\n } catch (err) {\n installSpinner.stop('Failed to install dependencies');\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n\n await installSkills(json);\n trackCommand('link', 'oss-org', { direct: true, template });\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n\n if (!json) {\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n return;\n }\n\n // Non-template direct-link: save config in cwd and return.\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({ success: true, project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region } });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n trackCommand('link', 'oss-org', { direct: true });\n\n // Install agent skills\n await installSkills(json);\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n return;\n } catch (err) {\n await reportCliUsage('cli.link_direct', false);\n await shutdownAnalytics();\n handleError(err, json);\n }\n }\n\n const creds = await requireAuth(apiUrl, false);\n\n let orgId = opts.orgId;\n let projectId = opts.projectId;\n\n // Show organization selection (auto-select if only one)\n if (!orgId && !projectId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const config = getGlobalConfig();\n config.default_org_id = orgId;\n saveGlobalConfig(config);\n\n // Select project if not specified\n if (!projectId) {\n const projects = await listProjects(orgId, apiUrl);\n if (projects.length === 0) {\n throw new CLIError('No projects found in this organization.');\n }\n if (json) {\n throw new CLIError('Specify --project-id in JSON mode.');\n }\n const selected = await prompts.select<string>({\n message: 'Select a project to link:',\n options: projects.map((p) => ({\n value: p.id,\n label: `${p.name} (${p.region}, ${p.status})`,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n projectId = selected;\n }\n\n // Fetch project details and API key\n let project;\n let apiKey;\n try {\n [project, apiKey] = await Promise.all([\n getProject(projectId, apiUrl),\n getProjectApiKey(projectId, apiUrl),\n ]);\n } catch (err) {\n if (err instanceof CLIError && (err.exitCode === 5 || err.exitCode === 4 || err.message.includes('not found'))) {\n const identity = creds.user?.email ?? creds.user?.name ?? 'unknown user';\n throw new CLIError(\n `No access to project ${projectId} as ${identity}. Double-check the project ID, or run \\`npx @insforge/cli logout\\` to switch accounts.`,\n 5,\n 'PERMISSION_DENIED',\n );\n }\n throw err;\n }\n\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n\n // Save config in cwd only if not using --template (template flow saves in subdirectory)\n if (!opts.template) {\n saveProjectConfig(projectConfig);\n }\n\n trackCommand('link', project.organization_id);\n\n if (json) {\n outputJson({ success: true, project: { id: project.id, name: project.name, region: project.region } });\n } else {\n outputSuccess(`Linked to project \"${project.name}\" (${project.appkey}.${project.region})`);\n }\n\n // Report agent-connected event (best-effort)\n try {\n await reportAgentConnected({ project_id: project.id }, apiUrl);\n } catch { /* ignore */ }\n\n // Template download (only when --template flag is passed).\n // Validation already ran at the top of the action.\n const template = opts.template as string | undefined;\n if (template) {\n // Ask for directory name\n let dirName = project.name;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: project.name,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n // Save project config in the new directory\n saveProjectConfig(projectConfig);\n\n captureEvent(orgId ?? project.organization_id, 'template_selected', { template, source: 'link' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n // Only proceed with install/next steps if template actually downloaded\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n if (templateDownloaded && !json) {\n const installSpinner = clack.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner.stop('Dependencies installed');\n } catch (err) {\n installSpinner.stop('Failed to install dependencies');\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n\n // Install agent skills inside the project directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${pc.underline(dashboardUrl)}`);\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n } else {\n // No template — install agent skills in the current directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history and deploy it to a live URL',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n }\n } catch (err) {\n await reportCliUsage('cli.link', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\n\n","import { exec } from 'node:child_process';\nimport { existsSync, readFileSync, appendFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { promisify } from 'node:util';\nimport * as clack from '@clack/prompts';\nimport { getProjectConfig } from './config.js';\n\nconst execAsync = promisify(exec);\n\nconst SKILL_INSTALL_TIMEOUT_MS = 60_000;\n\nexport function describeExecError(err: unknown): string {\n const e = err as {\n killed?: boolean;\n signal?: string;\n code?: number | string;\n stderr?: string | Buffer;\n message?: string;\n };\n\n if (e.killed && (e.signal === 'SIGTERM' || e.signal === 'SIGKILL')) {\n return `timed out after ${SKILL_INSTALL_TIMEOUT_MS / 1000}s — the npm registry may be slow or blocked by your network`;\n }\n if (e.code === 'ENOENT') {\n return '`npx` is not on your PATH — install Node.js 18+ and reopen your shell';\n }\n\n const stderr = (typeof e.stderr === 'string' ? e.stderr : e.stderr?.toString()) ?? '';\n if (/ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(stderr)) return 'cannot reach the npm registry (DNS lookup failed) — check your internet connection';\n if (/ECONNREFUSED/i.test(stderr)) return 'connection to the npm registry was refused — a proxy or firewall is likely blocking it';\n if (/ETIMEDOUT|ESOCKETTIMEDOUT|network timeout/i.test(stderr)) return 'the npm registry timed out — check your VPN, proxy, or corporate network';\n if (/CERT_HAS_EXPIRED|UNABLE_TO_VERIFY_LEAF_SIGNATURE|SELF_SIGNED_CERT/i.test(stderr)) return 'TLS error reaching the npm registry — a corporate proxy may be intercepting HTTPS';\n if (/\\bE404\\b|404 Not Found/i.test(stderr)) return 'npm returned 404 — the `skills` package or a dependency could not be found (check your npm registry config)';\n if (/EACCES|permission denied/i.test(stderr)) return 'permission denied writing files — run from a directory you own, without sudo';\n if (/ENOSPC|no space left/i.test(stderr)) return 'no disk space left to install the package';\n if (/\\b401\\b|EAUTH|authentication/i.test(stderr)) return 'npm authentication failed — check ~/.npmrc';\n\n if (typeof e.code === 'number') return `npx exited with code ${e.code}`;\n if (typeof e.code === 'string') return e.code;\n return e.message ?? 'unknown error';\n}\n\nconst GITIGNORE_ENTRIES = [\n '.insforge',\n '.agent',\n '.agents',\n '.augment',\n '.claude',\n '.cline',\n '.github/copilot*',\n '.kilocode',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n];\n\nfunction updateGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore');\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';\n const lines = new Set(existing.split('\\n').map((l) => l.trim()));\n\n const missing = GITIGNORE_ENTRIES.filter((entry) => !lines.has(entry));\n if (!missing.length) return;\n\n const block = `\\n# InsForge & AI agent skills\\n${missing.join('\\n')}\\n`;\n appendFileSync(gitignorePath, block);\n}\n\nexport async function installSkills(json: boolean): Promise<void> {\n try {\n if (!json) clack.log.info('Installing InsForge agent skills (global)...');\n await execAsync('npx skills add insforge/agent-skills -g -y -a antigravity -a augment -a claude-code -a cline -a codex -a cursor -a gemini-cli -a github-copilot -a kilo -a qoder -a qwen-code -a roo -a trae -a windsurf', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('InsForge agent skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install agent skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add insforge/agent-skills` once resolved to see the full output.');\n }\n }\n\n // Install find-skills from vercel-labs for skill discovery\n try {\n if (!json) clack.log.info('Installing find-skills (global)...');\n await execAsync('npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -y', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('find-skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install find-skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add https://github.com/vercel-labs/skills --skill find-skills` once resolved.');\n }\n }\n\n try {\n updateGitignore();\n } catch {\n // non-critical, silently ignore\n }\n}\n\nexport async function reportCliUsage(\n toolName: string,\n success: boolean,\n maxRetries = 1,\n explicitConfig?: { oss_host: string; api_key: string },\n): Promise<void> {\n let config: { oss_host: string; api_key: string } | null | undefined = explicitConfig;\n if (!config) {\n try {\n config = getProjectConfig();\n } catch {\n return;\n }\n }\n if (!config) return;\n\n const payload = JSON.stringify({\n tool_name: toolName,\n success,\n timestamp: new Date().toISOString(),\n });\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3_000);\n try {\n const res = await fetch(`${config.oss_host}/api/usage/mcp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.api_key,\n },\n body: payload,\n signal: controller.signal,\n });\n\n if (res.status < 500) return;\n // 5xx — server may not be ready yet, retry\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // network/abort error — server may not be ready yet, retry\n }\n\n if (attempt < maxRetries - 1) {\n await new Promise((r) => setTimeout(r, 5_000));\n }\n }\n}\n","import { PostHog } from 'posthog-node';\nimport type { ProjectConfig } from '../types.js';\nimport { FAKE_PROJECT_ID } from './config.js';\n\nconst POSTHOG_API_KEY = process.env.POSTHOG_API_KEY;\nconst POSTHOG_HOST = process.env.POSTHOG_HOST || 'https://us.i.posthog.com';\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog | null {\n if (!POSTHOG_API_KEY) return null;\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { host: POSTHOG_HOST });\n }\n return client;\n}\n\nexport function captureEvent(\n distinctId: string,\n event: string,\n properties?: Record<string, unknown>,\n): void {\n try {\n getClient()?.capture({ distinctId, event, properties });\n } catch {\n // analytics should never break the CLI\n }\n}\n\nexport function trackCommand(command: string, distinctId: string, properties?: Record<string, unknown>): void {\n captureEvent(distinctId, 'cli_command_invoked', {\n command,\n ...properties,\n });\n}\n\nexport function trackDiagnose(subcommand: string, config: ProjectConfig): void {\n captureEvent(config.project_id, 'cli_diagnose_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n try {\n if (client) await client.shutdown();\n } catch {\n // ignore\n }\n}\n","import type { Command } from 'commander';\nimport { exec } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport {\n listOrganizations,\n createProject,\n getProject,\n getProjectApiKey,\n} from '../lib/api/platform.js';\nimport { getAnonKey, runRawSql } from '../lib/api/oss.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl } from '../lib/config.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\nimport { readEnvFile } from '../lib/env.js';\nimport { installSkills, reportCliUsage } from '../lib/skills.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../lib/analytics.js';\nimport { deployProject } from './deployments/deploy.js';\nimport type { ProjectConfig } from '../types.js';\n\nconst execAsync = promisify(exec);\n\nexport type Framework = 'react' | 'nextjs';\n\nfunction buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\nasync function waitForProjectActive(projectId: string, apiUrl?: string, timeoutMs = 120_000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n const project = await getProject(projectId, apiUrl);\n if (project.status === 'active') return;\n await new Promise((r) => setTimeout(r, 3000));\n }\n throw new CLIError('Project creation timed out. Check the dashboard for status.');\n}\n\nconst INSFORGE_BANNER = [\n '██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗',\n '██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝',\n '██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ',\n '██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ',\n '██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗',\n '╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝',\n];\n\nasync function animateBanner(): Promise<void> {\n const isTTY = process.stderr.isTTY;\n if (!isTTY || process.env.CI) {\n // Non-interactive: just print static banner\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`${line}\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n const totalLines = INSFORGE_BANNER.length;\n const maxLen = Math.max(...INSFORGE_BANNER.map((l) => l.length));\n const cols = process.stderr.columns ?? 0;\n\n // Narrow terminal: skip animation to avoid garbled output from line wrapping\n if (cols > 0 && cols < maxLen) {\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n // Phase 1: Line-by-line reveal with cursor sweep\n const REVEAL_STEPS = 10;\n const REVEAL_DELAY = 30;\n for (let lineIdx = 0; lineIdx < totalLines; lineIdx++) {\n const line = INSFORGE_BANNER[lineIdx];\n for (let step = 0; step <= REVEAL_STEPS; step++) {\n const pos = Math.floor((step / REVEAL_STEPS) * line.length);\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n if (i < pos) {\n rendered += `\\x1b[97m${line[i]}\\x1b[0m`; // bright white (revealed)\n } else if (i === pos) {\n rendered += `\\x1b[1;37m${line[i]}\\x1b[0m`; // bold white (cursor)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim gray (hidden)\n }\n }\n process.stderr.write(`\\r${rendered}`);\n await new Promise((r) => setTimeout(r, REVEAL_DELAY));\n }\n process.stderr.write('\\n');\n }\n\n // Phase 2: Shimmer pass across the full banner\n const SHIMMER_STEPS = 16;\n const SHIMMER_DELAY = 40;\n const SHIMMER_WIDTH = 4;\n for (let step = 0; step < SHIMMER_STEPS; step++) {\n const shimmerPos = Math.floor((step / SHIMMER_STEPS) * (maxLen + SHIMMER_WIDTH));\n // Move cursor up to start of banner\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n const dist = Math.abs(i - shimmerPos);\n if (dist === 0) {\n rendered += `\\x1b[1;97m${line[i]}\\x1b[0m`; // bold bright white (shimmer peak)\n } else if (dist <= SHIMMER_WIDTH) {\n rendered += `\\x1b[37m${line[i]}\\x1b[0m`; // white (shimmer edge)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim (base)\n }\n }\n process.stderr.write(`${rendered}\\n`);\n }\n await new Promise((r) => setTimeout(r, SHIMMER_DELAY));\n }\n\n // Final: show banner in steady bright white\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n}\n\nfunction getDefaultProjectName(): string {\n const dirName = path.basename(process.cwd());\n const sanitized = dirName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n return sanitized.length >= 2 ? sanitized : '';\n}\n\nexport async function copyDir(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Create a new InsForge project')\n .option('--name <name>', 'Project name')\n .option('--org-id <id>', 'Organization ID')\n .option('--region <region>', 'Deployment region (us-east, us-west, eu-central, ap-southeast)')\n .option('--template <template>', 'Template to use: react, nextjs, chatbot, crm, e-commerce, todo, or empty')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl, false);\n\n if (!json) {\n await animateBanner();\n clack.intro(\"Let's build something great\");\n }\n\n // 1. Select organization (auto-select if only one)\n let orgId = opts.orgId;\n if (!orgId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const globalConfig = getGlobalConfig();\n globalConfig.default_org_id = orgId;\n saveGlobalConfig(globalConfig);\n\n // 2. Project name (pre-filled from directory name)\n let projectName = opts.name;\n if (!projectName) {\n if (json) throw new CLIError('--name is required in JSON mode.');\n const defaultName = getDefaultProjectName();\n const name = await prompts.text({\n message: 'Project name:',\n ...(defaultName ? { initialValue: defaultName } : {}),\n validate: (v) => (v.length >= 2 ? undefined : 'Name must be at least 2 characters'),\n });\n if (prompts.isCancel(name)) process.exit(0);\n projectName = name;\n }\n\n // Sanitize project name to prevent path traversal\n projectName = path.basename(projectName).replace(/[^a-zA-Z0-9._-]/g, '-').replace(/\\.+/g, '.');\n if (projectName.length < 2 || projectName === '.' || projectName === '..') {\n throw new CLIError('Project name must be at least 2 safe characters (letters, numbers, hyphens).');\n }\n\n // 3. Select template (two-step: blank vs template, then pick template)\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo', 'empty'];\n let template = opts.template as string | undefined;\n if (template && !validTemplates.includes(template)) {\n throw new CLIError(`Invalid template \"${template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n if (!template) {\n if (json) {\n template = 'empty';\n } else {\n const approach = await prompts.select<string>({\n message: 'How would you like to start?',\n options: [\n { value: 'blank', label: 'Blank project', hint: 'Start from scratch with .env.local ready' },\n { value: 'template', label: 'Start from a template', hint: 'Pre-built starter apps' },\n ],\n });\n if (prompts.isCancel(approach)) process.exit(0);\n\n captureEvent(orgId, 'create_approach_selected', {\n approach,\n });\n\n if (approach === 'blank') {\n template = 'empty';\n } else {\n const selected = await prompts.select<string>({\n message: 'Choose a starter template:',\n options: [\n { value: 'react', label: 'Web app template with React' },\n { value: 'nextjs', label: 'Web app template with Next.js' },\n { value: 'chatbot', label: 'AI Chatbot with Next.js' },\n { value: 'crm', label: 'CRM with Next.js' },\n { value: 'e-commerce', label: 'E-Commerce store with Next.js' },\n { value: 'todo', label: 'Todo app with Next.js' },\n ],\n });\n if (prompts.isCancel(selected)) process.exit(0);\n template = selected;\n }\n }\n }\n\n captureEvent(orgId, 'template_selected', {\n template,\n approach: template === 'empty' ? 'blank' : 'template',\n });\n\n // 4. Choose directory (templates need a subdirectory, blank uses cwd)\n const hasTemplate = template !== 'empty';\n let dirName: string | null = null;\n const originalCwd = process.cwd();\n let projectDir = originalCwd;\n\n if (hasTemplate) {\n dirName = projectName;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: projectName,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n // Validate normalized dirName\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n // Create the project directory and switch into it\n projectDir = path.resolve(originalCwd, dirName);\n const dirExists = await fs.stat(projectDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(projectDir);\n process.chdir(projectDir);\n }\n\n // 5. Create project via Platform API\n let projectLinked = false;\n const s = !json ? clack.spinner() : null;\n try {\n s?.start('Creating project...');\n\n const project = await createProject(orgId, projectName, opts.region, apiUrl);\n\n s?.message('Waiting for project to become active...');\n await waitForProjectActive(project.id, apiUrl);\n\n // 6. Fetch API key and link project\n const apiKey = await getProjectApiKey(project.id, apiUrl);\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n saveProjectConfig(projectConfig);\n projectLinked = true;\n\n s?.stop(`Project \"${project.name}\" created and linked`);\n\n // 7. Download template or seed env for blank projects\n const githubTemplates = ['chatbot', 'crm', 'e-commerce', 'nextjs', 'react', 'todo'];\n if (githubTemplates.includes(template!)) {\n await downloadGitHubTemplate(template!, projectConfig, json);\n } else if (hasTemplate) {\n await downloadTemplate(template as Framework, projectConfig, projectName, json, apiUrl);\n } else {\n // Blank project: seed .env.local with InsForge credentials (non-fatal)\n try {\n const anonKey = await getAnonKey();\n if (!anonKey) {\n if (!json) clack.log.warn('Could not retrieve anon key. You can add it to .env.local manually.');\n } else {\n const envPath = path.join(process.cwd(), '.env.local');\n const envContent = [\n '# InsForge',\n `NEXT_PUBLIC_INSFORGE_URL=${projectConfig.oss_host}`,\n `NEXT_PUBLIC_INSFORGE_ANON_KEY=${anonKey}`,\n '',\n ].join('\\n');\n await fs.writeFile(envPath, envContent, { flag: 'wx' });\n if (!json) {\n clack.log.success('Created .env.local with your InsForge credentials');\n }\n }\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (!json) {\n if (error.code === 'EEXIST') {\n clack.log.warn('.env.local already exists; skipping InsForge key seeding.');\n } else {\n clack.log.warn(`Failed to create .env.local: ${error.message}`);\n }\n }\n }\n }\n\n // Install agent skills\n await installSkills(json);\n trackCommand('create', orgId);\n await reportCliUsage('cli.create', true, 6);\n\n // 8. Install npm dependencies (template projects only, if download succeeded)\n const templateDownloaded = hasTemplate\n ? await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null)\n : null;\n\n if (templateDownloaded) {\n const installSpinner = !json ? clack.spinner() : null;\n installSpinner?.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner?.stop('Dependencies installed');\n } catch (err) {\n installSpinner?.stop('Failed to install dependencies');\n if (!json) {\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n }\n\n // 9. Offer to deploy (template projects, interactive mode only)\n let liveUrl: string | null = null;\n if (templateDownloaded && !json) {\n const shouldDeploy = await prompts.confirm({\n message: 'Would you like to deploy now?',\n });\n\n if (!prompts.isCancel(shouldDeploy) && shouldDeploy) {\n try {\n // Read env vars from .env.local or .env to pass to deployment\n const envVars = await readEnvFile(process.cwd());\n const startBody: { envVars?: Array<{ key: string; value: string }> } = {};\n if (envVars.length > 0) {\n startBody.envVars = envVars;\n }\n\n const deploySpinner = clack.spinner();\n const result = await deployProject({\n sourceDir: process.cwd(),\n startBody,\n spinner: deploySpinner,\n });\n\n if (result.isReady) {\n deploySpinner.stop('Deployment complete');\n liveUrl = result.liveUrl;\n } else {\n deploySpinner.stop('Deployment is still building');\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 2 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n } catch (err) {\n clack.log.warn(`Deploy failed: ${(err as Error).message}`);\n }\n }\n }\n\n // 10. Show links and next steps\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n\n if (json) {\n outputJson({\n success: true,\n project: { id: project.id, name: project.name, appkey: project.appkey, region: project.region },\n template,\n ...(dirName ? { directory: dirName } : {}),\n urls: {\n dashboard: dashboardUrl,\n ...(liveUrl ? { liveSite: liveUrl } : {}),\n },\n });\n } else {\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n if (liveUrl) {\n clack.log.success(`Live site: ${liveUrl}`);\n }\n\n // Next steps\n if (templateDownloaded) {\n const steps = [\n `cd ${dirName}`,\n 'npm run dev',\n ];\n clack.note(steps.join('\\n'), 'Next steps');\n clack.note('Open your coding agent (Claude Code, Codex, Cursor, etc.) to add new features.', 'Keep building');\n } else if (hasTemplate && !templateDownloaded) {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n } else {\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n clack.outro('Done!');\n }\n } catch (err) {\n // Clean up the project directory if it was created but linking failed\n if (!projectLinked && hasTemplate && projectDir !== originalCwd) {\n process.chdir(originalCwd);\n await fs.rm(projectDir, { recursive: true, force: true }).catch(() => {});\n }\n throw err;\n }\n } catch (err) {\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nexport async function downloadTemplate(\n framework: Framework,\n projectConfig: ProjectConfig,\n projectName: string,\n json: boolean,\n _apiUrl?: string,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start('Downloading template...');\n\n try {\n // Get the anon key from the OSS backend\n const anonKey = await getAnonKey();\n if (!anonKey) {\n throw new Error('Failed to retrieve anon key from backend');\n }\n\n // Create temp directory for download\n const tempDir = tmpdir();\n const targetDir = projectName;\n const templatePath = path.join(tempDir, targetDir);\n\n // Remove existing temp directory if it exists\n try {\n await fs.rm(templatePath, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, which is fine\n }\n\n const frame = framework === 'nextjs' ? 'nextjs' : 'react';\n const esc = (s: string) => process.platform === 'win32' ? `\"${s.replace(/\"/g, '\\\\\"')}\"` : `'${s.replace(/'/g, \"'\\\\''\")}'`;\n const command = `npx --yes create-insforge-app@latest ${esc(targetDir)} --frame ${frame} --base-url ${esc(projectConfig.oss_host)} --anon-key ${esc(anonKey)} --skip-install`;\n\n s?.message(`Running create-insforge-app (${frame})...`);\n\n await execAsync(command, {\n maxBuffer: 10 * 1024 * 1024,\n cwd: tempDir,\n });\n\n // Copy template files to current directory\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templatePath, cwd);\n\n // Cleanup temp directory\n await fs.rm(templatePath, { recursive: true, force: true }).catch(() => {});\n\n s?.stop('Template files downloaded');\n } catch (err) {\n s?.stop('Template download failed');\n if (!json) {\n clack.log.warn(`Failed to download template: ${(err as Error).message}`);\n clack.log.info('You can manually set up the template later.');\n }\n }\n}\n\nexport async function downloadGitHubTemplate(\n templateName: string,\n projectConfig: ProjectConfig,\n json: boolean,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start(`Downloading ${templateName} template...`);\n\n const tempDir = path.join(tmpdir(), `insforge-template-${Date.now()}`);\n\n try {\n await fs.mkdir(tempDir, { recursive: true });\n\n // Shallow clone the templates repo\n await execAsync(\n 'git clone --depth 1 https://github.com/InsForge/insforge-templates.git .',\n { cwd: tempDir, maxBuffer: 10 * 1024 * 1024, timeout: 60_000 },\n );\n\n const templateDir = path.join(tempDir, templateName);\n const stat = await fs.stat(templateDir).catch(() => null);\n if (!stat?.isDirectory()) {\n throw new Error(`Template \"${templateName}\" not found in repository`);\n }\n\n // Copy template files to cwd\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templateDir, cwd);\n\n // Write .env.local from .env.example with InsForge credentials filled in\n const envExamplePath = path.join(cwd, '.env.example');\n const envExampleExists = await fs.stat(envExamplePath).catch(() => null);\n if (envExampleExists) {\n const anonKey = await getAnonKey();\n const envExample = await fs.readFile(envExamplePath, 'utf-8');\n const envContent = envExample.replace(\n /^([A-Z][A-Z0-9_]*=)(.*)$/gm,\n (_, prefix: string, _value: string) => {\n const key = prefix.slice(0, -1); // remove trailing '='\n if (/INSFORGE.*(URL|BASE_URL)$/.test(key)) return `${prefix}${projectConfig.oss_host}`;\n if (/INSFORGE.*ANON_KEY$/.test(key)) return `${prefix}${anonKey}`;\n if (key === 'NEXT_PUBLIC_APP_URL') return `${prefix}https://${projectConfig.appkey}.insforge.site`;\n return `${prefix}${_value}`;\n },\n );\n const envLocalPath = path.join(cwd, '.env.local');\n try {\n await fs.writeFile(envLocalPath, envContent, { flag: 'wx' });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'EEXIST') {\n if (!json) clack.log.warn('.env.local already exists; skipping env seeding.');\n } else {\n throw e;\n }\n }\n }\n\n s?.stop(`${templateName} template downloaded`);\n\n // Auto-run database migrations if db_init.sql exists\n const migrationPath = path.join(cwd, 'migrations', 'db_init.sql');\n const migrationExists = await fs.stat(migrationPath).catch(() => null);\n if (migrationExists) {\n const dbSpinner = !json ? clack.spinner() : null;\n dbSpinner?.start('Running database migrations...');\n try {\n const sql = await fs.readFile(migrationPath, 'utf-8');\n await runRawSql(sql, true);\n dbSpinner?.stop('Database migrations applied');\n } catch (err) {\n dbSpinner?.stop('Database migration failed');\n if (!json) {\n clack.log.warn(`Migration failed: ${(err as Error).message}`);\n clack.log.info('You can run the migration manually: npx @insforge/cli db query --unrestricted \"$(cat migrations/db_init.sql)\"');\n } else {\n throw err;\n }\n }\n }\n } catch (err) {\n s?.stop(`${templateName} template download failed`);\n if (!json) {\n clack.log.warn(`Failed to download ${templateName} template: ${(err as Error).message}`);\n clack.log.info('You can manually clone from: https://github.com/InsForge/insforge-templates');\n }\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\n","import { getProjectConfig } from '../config.js';\nimport { CLIError, ProjectNotLinkedError } from '../errors.js';\nimport type { ProjectConfig } from '../../types.js';\n\nfunction requireProjectConfig(): ProjectConfig {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n return config;\n}\n\n/**\n * Unified OSS API fetch. Uses API key as Bearer token for all requests,\n * which grants superadmin access (SQL execution, bucket management, etc.).\n */\nexport interface RawSqlResult {\n rows: Record<string, unknown>[];\n raw: Record<string, unknown>;\n}\n\nexport async function runRawSql(sql: string, unrestricted = false): Promise<RawSqlResult> {\n const endpoint = unrestricted\n ? '/api/database/advance/rawsql/unrestricted'\n : '/api/database/advance/rawsql';\n const res = await ossFetch(endpoint, {\n method: 'POST',\n body: JSON.stringify({ query: sql }),\n });\n const raw = await res.json() as Record<string, unknown>;\n const rows = (raw.rows ?? raw.data ?? []) as Record<string, unknown>[];\n return { rows, raw };\n}\n\nexport async function getAnonKey(): Promise<string> {\n const res = await ossFetch('/api/auth/tokens/anon', { method: 'POST' });\n const data = await res.json() as { accessToken: string };\n return data.accessToken;\n}\n\nexport async function ossFetch(\n path: string,\n options: RequestInit = {},\n): Promise<Response> {\n const config = requireProjectConfig();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n ...(options.headers as Record<string, string> ?? {}),\n };\n\n const res = await fetch(`${config.oss_host}${path}`, { ...options, headers });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as {\n error?: string;\n message?: string;\n nextActions?: string;\n statusCode?: number;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${res.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n // Feature not available on this backend version — ONLY when the 404 is a\n // route-level miss (no structured error code), not a resource-level miss\n // like COMPUTE_SERVICE_NOT_FOUND. Otherwise we'd hide real \"service doesn't\n // exist\" errors behind a misleading \"feature not enabled\" message.\n const isRouteLevel404 = !err.error || err.error === 'NOT_FOUND';\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/compute')) {\n message = 'Compute services are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin to enable compute.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path === '/api/database/migrations') {\n message = 'Database migrations are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin about database migration support.';\n }\n\n throw new CLIError(message);\n }\n\n return res;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * Read environment variables from the first env file found in the directory.\n * Priority: .env.local > .env.production > .env\n */\nexport async function readEnvFile(cwd: string): Promise<Array<{ key: string; value: string }>> {\n const candidates = ['.env.local', '.env.production', '.env'];\n for (const name of candidates) {\n const filePath = path.join(cwd, name);\n const exists = await fs.stat(filePath).catch(() => null);\n if (!exists) continue;\n\n const content = await fs.readFile(filePath, 'utf-8');\n const vars: Array<{ key: string; value: string }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) vars.push({ key, value });\n }\n return vars;\n }\n return [];\n}\n","import type { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport * as clack from '@clack/prompts';\nimport archiver from 'archiver';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError, getDeploymentError, formatFetchError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type {\n CreateDeploymentResponse,\n CreateDirectDeploymentRequest,\n CreateDirectDeploymentResponse,\n DeploymentManifestFile,\n DeploymentManifestFileEntry,\n DeploymentSchema,\n ProjectConfig,\n StartDeploymentRequest,\n} from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_TIMEOUT_MS = 300_000;\nconst DIRECT_UPLOAD_CONCURRENCY = 8;\n\nconst EXCLUDE_PATTERNS = [\n 'node_modules',\n '.git',\n '.next',\n '.env',\n '.env.local',\n 'dist',\n 'build',\n '.DS_Store',\n '.insforge',\n // IDE and AI agent configs\n '.claude',\n '.agents',\n '.augment',\n '.kilocode',\n '.kiro',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n '.vercel',\n '.turbo',\n '.cache',\n 'skills',\n 'coverage',\n];\n\ntype LocalDeploymentFile = DeploymentManifestFileEntry & {\n absolutePath: string;\n};\n\nclass DirectDeploymentUnsupportedError extends Error {\n constructor() {\n super('Direct deployment endpoints are not available on this backend');\n this.name = 'DirectDeploymentUnsupportedError';\n }\n}\n\nfunction shouldExclude(name: string): boolean {\n const normalized = name.replace(/\\\\/g, '/');\n for (const pattern of EXCLUDE_PATTERNS) {\n if (\n normalized === pattern ||\n normalized.startsWith(pattern + '/') ||\n normalized.endsWith('/' + pattern) ||\n normalized.includes('/' + pattern + '/')\n ) {\n return true;\n }\n }\n if (normalized.endsWith('.log')) return true;\n return false;\n}\n\nfunction isInsforgeCloudOssHost(ossHost: string): boolean {\n try {\n return new URL(ossHost).hostname.endsWith('.insforge.app');\n } catch {\n return false;\n }\n}\n\nfunction normalizeRelativePath(sourceDir: string, absolutePath: string): string {\n return path.relative(sourceDir, absolutePath).split(path.sep).join('/').replace(/\\\\/g, '/');\n}\n\nasync function hashFile(filePath: string): Promise<{ sha: string; size: number }> {\n const hash = createHash('sha1');\n let size = 0;\n\n for await (const chunk of createReadStream(filePath)) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n hash.update(buffer);\n }\n\n return { sha: hash.digest('hex'), size };\n}\n\nasync function collectDeploymentFiles(sourceDir: string): Promise<LocalDeploymentFile[]> {\n const files: LocalDeploymentFile[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n entries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(currentDir, entry.name);\n const normalizedPath = normalizeRelativePath(sourceDir, absolutePath);\n\n if (!normalizedPath || shouldExclude(normalizedPath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await walk(absolutePath);\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n const { sha, size } = await hashFile(absolutePath);\n files.push({\n absolutePath,\n path: normalizedPath,\n sha,\n size,\n });\n }\n }\n\n await walk(sourceDir);\n return files;\n}\n\nasync function createZipBuffer(sourceDir: string): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n const archive = archiver('zip', { zlib: { level: 9 } });\n const chunks: Buffer[] = [];\n\n archive.on('data', (chunk: Buffer) => chunks.push(chunk));\n archive.on('end', () => resolve(Buffer.concat(chunks)));\n archive.on('error', (err: Error) => reject(err));\n\n archive.directory(sourceDir, false, (entry) => {\n if (shouldExclude(entry.name)) return false;\n return entry;\n });\n\n void archive.finalize();\n });\n}\n\nasync function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex;\n nextIndex += 1;\n await worker(items[index], index);\n }\n }\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n}\n\nasync function createDirectDeploymentSession(\n config: ProjectConfig,\n files: CreateDirectDeploymentRequest['files'],\n): Promise<CreateDirectDeploymentResponse> {\n const url = `${config.oss_host}/api/deployments/direct`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({ files }),\n });\n } catch (error) {\n throw new CLIError(formatFetchError(error, url));\n }\n\n if (response.status === 404) {\n throw new DirectDeploymentUnsupportedError();\n }\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n nextActions?: string;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${response.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n throw new CLIError(message);\n }\n\n const payload = (await response.json()) as Partial<CreateDirectDeploymentResponse>;\n if (!payload.id || !Array.isArray(payload.files)) {\n throw new CLIError('Unexpected response from direct deployment create endpoint.');\n }\n\n return payload as CreateDirectDeploymentResponse;\n}\n\nasync function uploadDirectDeploymentFile(\n deploymentId: string,\n manifestFile: DeploymentManifestFile,\n localFile: LocalDeploymentFile,\n): Promise<void> {\n const requestInit = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': String(localFile.size),\n },\n body: createReadStream(localFile.absolutePath),\n duplex: 'half',\n } as RequestInit & { duplex: 'half' };\n\n await ossFetch(\n `/api/deployments/${encodeURIComponent(deploymentId)}/files/${encodeURIComponent(manifestFile.fileId)}/content`,\n requestInit,\n );\n}\n\nasync function startDirectDeployment(\n deploymentId: string,\n startBody: StartDeploymentRequest,\n): Promise<void> {\n const response = await ossFetch(`/api/deployments/${encodeURIComponent(deploymentId)}/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(startBody),\n });\n\n await response.json();\n}\n\nasync function pollDeployment(\n deploymentId: string,\n spinner: ReturnType<typeof clack.spinner> | null | undefined,\n syncBeforeRead: boolean,\n): Promise<DeployProjectResult> {\n spinner?.message('Building and deploying...');\n const startTime = Date.now();\n let deployment: DeploymentSchema | null = null;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n try {\n if (syncBeforeRead) {\n await ossFetch(`/api/deployments/${deploymentId}/sync`, { method: 'POST' });\n }\n\n const statusRes = await ossFetch(`/api/deployments/${deploymentId}`);\n deployment = (await statusRes.json()) as DeploymentSchema;\n const status = deployment.status.toUpperCase();\n\n if (status === 'READY') {\n break;\n }\n if (status === 'ERROR' || status === 'CANCELED') {\n spinner?.stop('Deployment failed');\n throw new CLIError(\n getDeploymentError(deployment.metadata) ?? `Deployment failed with status: ${deployment.status}`,\n );\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n spinner?.message(`Building and deploying... (${elapsed}s, status: ${deployment.status})`);\n } catch (err) {\n if (err instanceof CLIError) throw err;\n // Ignore transient fetch errors during polling\n }\n }\n\n const isReady = deployment?.status.toUpperCase() === 'READY';\n const liveUrl = isReady ? (deployment?.url ?? null) : null;\n\n return { deploymentId, deployment, isReady, liveUrl };\n}\n\nasync function deployProjectDirect(\n opts: DeployProjectOptions,\n config: ProjectConfig,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.start('Scanning source files...');\n const localFiles = await collectDeploymentFiles(sourceDir);\n if (localFiles.length === 0) {\n throw new CLIError('No deployable files found in the source directory.');\n }\n\n spinner?.message('Creating deployment...');\n const createResult = await createDirectDeploymentSession(\n config,\n localFiles.map(({ path: relativePath, sha, size }) => ({ path: relativePath, sha, size })),\n );\n\n const localFileByPath = new Map(localFiles.map((file) => [file.path, file]));\n\n const pendingFiles = createResult.files.filter((file) => !file.uploadedAt);\n\n spinner?.message(`Uploading ${pendingFiles.length} file${pendingFiles.length === 1 ? '' : 's'}...`);\n await runWithConcurrency(pendingFiles, DIRECT_UPLOAD_CONCURRENCY, async (manifestFile) => {\n const localFile = localFileByPath.get(manifestFile.path);\n if (!localFile) {\n throw new CLIError(`Backend returned an unknown file path: ${manifestFile.path}`);\n }\n if (localFile.sha !== manifestFile.sha || localFile.size !== manifestFile.size) {\n throw new CLIError(`Backend file metadata mismatch for: ${manifestFile.path}`);\n }\n\n await uploadDirectDeploymentFile(createResult.id, manifestFile, localFile);\n });\n\n spinner?.message('Starting deployment...');\n await startDirectDeployment(createResult.id, startBody);\n\n return await pollDeployment(createResult.id, spinner, !isInsforgeCloudOssHost(config.oss_host));\n}\n\nasync function deployProjectLegacy(\n opts: DeployProjectOptions,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.message('Creating deployment...');\n const createRes = await ossFetch('/api/deployments', { method: 'POST' });\n const { id: deploymentId, uploadUrl, uploadFields } =\n (await createRes.json()) as CreateDeploymentResponse;\n\n spinner?.message('Compressing source files...');\n const zipBuffer = await createZipBuffer(sourceDir);\n\n spinner?.message('Uploading...');\n const formData = new FormData();\n for (const [key, value] of Object.entries(uploadFields)) {\n formData.append(key, value);\n }\n formData.append('file', new Blob([zipBuffer], { type: 'application/zip' }), 'deployment.zip');\n\n const uploadRes = await fetch(uploadUrl, { method: 'POST', body: formData });\n if (!uploadRes.ok) {\n const uploadErr = await uploadRes.text();\n throw new CLIError(`Failed to upload: ${uploadErr}`);\n }\n\n spinner?.message('Starting deployment...');\n const startRes = await ossFetch(`/api/deployments/${deploymentId}/start`, {\n method: 'POST',\n body: JSON.stringify(startBody),\n });\n await startRes.json();\n\n return await pollDeployment(deploymentId, spinner, false);\n}\n\nexport interface DeployProjectOptions {\n sourceDir: string;\n startBody?: StartDeploymentRequest;\n spinner?: ReturnType<typeof clack.spinner> | null;\n}\n\nexport interface DeployProjectResult {\n deploymentId: string;\n deployment: DeploymentSchema | null;\n isReady: boolean;\n liveUrl: string | null;\n}\n\n/**\n * Core deploy logic: direct upload -> start -> poll.\n * Falls back to the legacy zip upload flow when the backend does not expose\n * the direct deployment endpoints yet.\n */\nexport async function deployProject(opts: DeployProjectOptions): Promise<DeployProjectResult> {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n\n try {\n return await deployProjectDirect(opts, config);\n } catch (error) {\n if (!(error instanceof DirectDeploymentUnsupportedError)) {\n throw error;\n }\n\n opts.spinner?.message('Direct deployment is not available on this backend. Falling back to the legacy zip upload flow...');\n return await deployProjectLegacy(opts);\n }\n}\n\nexport function registerDeploymentsDeployCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('deploy [directory]')\n .description('Deploy a frontend project to Vercel')\n .option('--env <vars>', 'Environment variables as JSON (e.g. {\"KEY\":\"value\"})')\n .option('--meta <meta>', 'Deployment metadata as JSON')\n .action(async (directory: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n // Resolve source directory\n const sourceDir = path.resolve(directory ?? '.');\n const stats = await fs.stat(sourceDir).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new CLIError(`\"${sourceDir}\" is not a valid directory.`);\n }\n\n // Reject excluded directories as deploy source\n const dirName = path.basename(sourceDir);\n if (EXCLUDE_PATTERNS.includes(dirName)) {\n throw new CLIError(\n `\"${dirName}\" is an excluded directory and cannot be used as a deploy source. Please specify your project root or output directory instead.`,\n );\n }\n\n const spinner = !json ? clack.spinner() : null;\n\n // Parse env/meta from CLI flags\n const startBody: StartDeploymentRequest = {};\n if (opts.env) {\n try {\n const parsed = JSON.parse(opts.env) as unknown;\n if (Array.isArray(parsed)) {\n startBody.envVars = parsed as Array<{ key: string; value: string }>;\n } else if (parsed && typeof parsed === 'object') {\n startBody.envVars = Object.entries(parsed as Record<string, unknown>).map(([key, value]) => ({\n key,\n value: String(value),\n }));\n } else {\n throw new CLIError('Invalid --env JSON. Expected an object or array.');\n }\n } catch {\n throw new CLIError('Invalid --env JSON.');\n }\n }\n if (opts.meta) {\n try {\n startBody.meta = JSON.parse(opts.meta);\n } catch {\n throw new CLIError('Invalid --meta JSON.');\n }\n }\n\n const result = await deployProject({ sourceDir, startBody, spinner });\n\n if (result.isReady) {\n spinner?.stop('Deployment complete');\n if (json) {\n outputJson(result.deployment);\n } else {\n if (result.liveUrl) {\n clack.log.success(`Live at: ${result.liveUrl}`);\n }\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n }\n } else {\n spinner?.stop('Deployment is still building');\n if (json) {\n outputJson({\n id: result.deploymentId,\n status: result.deployment?.status ?? 'building',\n timedOut: true,\n });\n } else {\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 5 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n }\n await reportCliUsage('cli.deployments.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbCommands(dbCmd: Command): void {\n dbCmd\n .command('query <sql>')\n .description('Execute a SQL query against the database')\n .option('--unrestricted', 'Use unrestricted mode (allows system table access)')\n .action(async (sql: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const { rows, raw } = await runRawSql(sql, !!opts.unrestricted);\n\n if (json) {\n outputJson(raw);\n } else {\n if (rows.length > 0) {\n const headers = Object.keys(rows[0]);\n outputTable(\n headers,\n rows.map((row) => headers.map((h) => String(row[h] ?? ''))),\n );\n console.log(`${rows.length} row(s) returned.`);\n } else {\n console.log('Query executed successfully.');\n if (rows.length === 0) {\n console.log('No rows returned.');\n }\n }\n }\n await reportCliUsage('cli.db.query', true);\n } catch (err) {\n await reportCliUsage('cli.db.query', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTablesCommand(dbCmd: Command): void {\n dbCmd\n .command('tables')\n .description('List all database tables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/tables');\n const tables = await res.json() as string[];\n\n if (json) {\n outputJson(tables);\n } else {\n if (tables.length === 0) {\n console.log('No tables found.');\n return;\n }\n outputTable(\n ['Table Name'],\n tables.map((t) => [t]),\n );\n }\n await reportCliUsage('cli.db.tables', true);\n } catch (err) {\n await reportCliUsage('cli.db.tables', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbFunctionsCommand(dbCmd: Command): void {\n dbCmd\n .command('functions')\n .description('List all database functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/functions');\n const raw = await res.json();\n const functions: DatabaseFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseFunctionsResponse).functions ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No database functions found.');\n return;\n }\n outputTable(\n ['Name', 'Definition', 'Kind'],\n functions.map((f) => [f.functionName, f.functionDef, f.kind]),\n );\n }\n await reportCliUsage('cli.db.functions', true);\n } catch (err) {\n await reportCliUsage('cli.db.functions', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseIndexesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbIndexesCommand(dbCmd: Command): void {\n dbCmd\n .command('indexes')\n .description('List all database indexes')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/indexes');\n const raw = await res.json();\n const indexes: DatabaseIndexesResponse['indexes'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseIndexesResponse).indexes ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (indexes.length === 0) {\n console.log('No database indexes found.');\n return;\n }\n outputTable(\n ['Table', 'Index Name', 'Definition', 'Unique', 'Primary'],\n indexes.map((i) => [\n i.tableName,\n i.indexName,\n i.indexDef,\n i.isUnique ? 'Yes' : 'No',\n i.isPrimary ? 'Yes' : 'No',\n ]),\n );\n }\n await reportCliUsage('cli.db.indexes', true);\n } catch (err) {\n await reportCliUsage('cli.db.indexes', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabasePoliciesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbPoliciesCommand(dbCmd: Command): void {\n dbCmd\n .command('policies')\n .description('List all RLS policies')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/policies');\n const raw = await res.json();\n const policies: DatabasePoliciesResponse['policies'] = Array.isArray(raw)\n ? raw\n : (raw as DatabasePoliciesResponse).policies ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (policies.length === 0) {\n console.log('No RLS policies found.');\n return;\n }\n outputTable(\n ['Table', 'Policy Name', 'Command', 'Roles', 'Qual', 'With Check'],\n policies.map((p) => [\n String(p.tableName ?? '-'),\n String(p.policyName ?? '-'),\n String(p.cmd ?? '-'),\n Array.isArray(p.roles) ? p.roles.join(', ') : String(p.roles ?? '-'),\n String(p.qual ?? '-'),\n String(p.withCheck ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.db.policies', true);\n } catch (err) {\n await reportCliUsage('cli.db.policies', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseTriggersResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTriggersCommand(dbCmd: Command): void {\n dbCmd\n .command('triggers')\n .description('List all database triggers')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/triggers');\n const raw = await res.json();\n const triggers: DatabaseTriggersResponse['triggers'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseTriggersResponse).triggers ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (triggers.length === 0) {\n console.log('No database triggers found.');\n return;\n }\n outputTable(\n ['Name', 'Table', 'Timing', 'Events', 'ActionOrientation', 'ActionCondition', 'ActionStatement'],\n triggers.map((t) => [\n t.triggerName,\n t.tableName,\n t.actionTiming,\n t.eventManipulation,\n t.actionOrientation,\n t.actionCondition ?? '-',\n t.actionStatement,\n ]),\n );\n }\n await reportCliUsage('cli.db.triggers', true);\n } catch (err) {\n await reportCliUsage('cli.db.triggers', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbRpcCommand(dbCmd: Command): void {\n dbCmd\n .command('rpc <functionName>')\n .description('Call a database function via RPC')\n .option('--data <json>', 'JSON body to pass as function parameters')\n .action(async (functionName: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body = opts.data ? JSON.stringify(JSON.parse(opts.data) as unknown) : undefined;\n\n const res = await ossFetch(`/api/database/rpc/${encodeURIComponent(functionName)}`, {\n method: body ? 'POST' : 'GET',\n ...(body ? { body } : {}),\n });\n\n const result = await res.json() as unknown;\n\n if (json) {\n outputJson(result);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n await reportCliUsage('cli.db.rpc', true);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbExportCommand(dbCmd: Command): void {\n dbCmd\n .command('export')\n .description('Export database schema and/or data')\n .option('--format <format>', 'Export format: sql or json', 'sql')\n .option('--tables <tables>', 'Comma-separated list of tables to export (default: all)')\n .option('--no-data', 'Exclude table data (schema only)')\n .option('--include-functions', 'Include database functions')\n .option('--include-sequences', 'Include sequences')\n .option('--include-views', 'Include views')\n .option('--row-limit <n>', 'Maximum rows per table')\n .option('-o, --output <file>', 'Output file path (default: stdout)')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n format: opts.format,\n includeData: opts.data !== false,\n };\n\n if (opts.tables) {\n body.tables = (opts.tables as string).split(',').map((t: string) => t.trim());\n }\n if (opts.includeFunctions) body.includeFunctions = true;\n if (opts.includeSequences) body.includeSequences = true;\n if (opts.includeViews) body.includeViews = true;\n if (opts.rowLimit) body.rowLimit = parseInt(opts.rowLimit as string, 10);\n\n const res = await ossFetch('/api/database/advance/export', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const raw = await res.text();\n\n // API may return JSON wrapper { format, content, tables } or raw SQL/JSON text\n let content: string;\n let meta: { format?: string; tables?: string[] } | null = null;\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.content === 'string') {\n content = parsed.content;\n meta = { format: parsed.format as string, tables: parsed.tables as string[] };\n } else {\n content = raw;\n }\n } catch {\n content = raw;\n }\n\n if (json) {\n outputJson(meta ?? { content });\n return;\n }\n\n if (opts.output) {\n writeFileSync(opts.output as string, content);\n const tableCount = meta?.tables?.length;\n const suffix = tableCount ? ` (${tableCount} tables, format: ${meta?.format ?? opts.format})` : '';\n outputSuccess(`Exported to ${opts.output}${suffix}`);\n } else {\n console.log(content);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbImportCommand(dbCmd: Command): void {\n dbCmd\n .command('import <file>')\n .description('Import database from a local SQL file')\n .option('--truncate', 'Truncate existing tables before import')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const fileContent = readFileSync(file);\n const fileName = basename(file);\n\n const formData = new FormData();\n formData.append('file', new Blob([fileContent]), fileName);\n if (opts.truncate) {\n formData.append('truncate', 'true');\n }\n\n const res = await fetch(`${config.oss_host}/api/database/advance/import`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Import failed: ${res.status}`);\n }\n\n const data = await res.json() as { filename: string; fileSize: number; tables: string[]; rowsImported: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Imported ${data.filename} (${data.tables.length} tables, ${data.rowsImported} rows)`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport {\n canonicalMigrationVersion,\n compareMigrationVersions,\n ensureMigrationsDir,\n findOlderThanHeadLocalMigrations,\n formatMigrationSql,\n getMigrationsDir,\n getNextLocalMigrationVersion,\n getRemoteMigrationVersionStatus,\n listLocalMigrationFilenames,\n parseMigrationFilename,\n parseStrictLocalMigrations,\n resolveMigrationTarget,\n} from '../../lib/migrations.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type {\n CreateMigrationRequest,\n CreateMigrationResponse,\n DatabaseMigrationsResponse,\n Migration,\n} from '../../types.js';\n\nfunction getLatestRemoteVersion(migrations: Migration[]): string | null {\n return migrations.reduce(\n (latestVersion, migration) =>\n !latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0\n ? migration.version\n : latestVersion,\n null as string | null,\n );\n}\n\nfunction buildMigrationFilename(version: string, name: string): string {\n return `${version}_${name}.sql`;\n}\n\nfunction buildOlderThanHeadError(\n migrationLabel: string,\n latestRemoteVersion: string,\n): CLIError {\n return new CLIError(\n `Migration ${migrationLabel} is older than the current remote head (${latestRemoteVersion}) and is not applied remotely. Rename it with a newer timestamp, or delete it locally if it is stale.`,\n );\n}\n\nfunction formatCreatedAt(createdAt: string): string {\n const date = new Date(createdAt);\n return Number.isNaN(date.getTime()) ? createdAt : date.toLocaleString();\n}\n\nasync function fetchRemoteMigrations(): Promise<Migration[]> {\n const res = await ossFetch('/api/database/migrations');\n const raw = (await res.json()) as DatabaseMigrationsResponse;\n const migrations = Array.isArray(raw.migrations) ? raw.migrations : [];\n\n for (const migration of migrations) {\n migration.version = canonicalMigrationVersion(migration.version);\n }\n\n return migrations;\n}\n\nfunction assertValidMigrationName(name: string): void {\n if (!/^[a-z0-9-]+$/u.test(name)) {\n throw new CLIError('Migration name must use lowercase letters, numbers, and hyphens only.');\n }\n}\n\nasync function applyMigration(\n targetMigration: Pick<Migration, 'version' | 'name'>,\n sql: string,\n): Promise<CreateMigrationResponse> {\n const body: CreateMigrationRequest = {\n version: targetMigration.version,\n name: targetMigration.name,\n sql,\n };\n\n const res = await ossFetch('/api/database/migrations', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const createdMigration = (await res.json()) as CreateMigrationResponse;\n\n if (createdMigration.version !== targetMigration.version) {\n throw new CLIError(\n `Applied migration version mismatch. Expected ${targetMigration.version}, received ${createdMigration.version}.`,\n );\n }\n\n return createdMigration;\n}\n\nexport function registerDbMigrationsCommand(dbCmd: Command): void {\n const migrationsCmd = dbCmd.command('migrations').description('Manage database migration files');\n\n migrationsCmd\n .command('list')\n .description('List applied remote database migrations')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n\n if (json) {\n outputJson({ migrations });\n } else if (migrations.length === 0) {\n console.log('No database migrations found.');\n } else {\n outputTable(\n ['Version', 'Name', 'Created At'],\n migrations.map((migration) => [\n migration.version,\n migration.name,\n formatCreatedAt(migration.createdAt),\n ]),\n );\n }\n\n await reportCliUsage('cli.db.migrations.list', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.list', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('fetch')\n .description('Fetch applied remote migrations into migrations/')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const migrationsDir = ensureMigrationsDir();\n // Skip by canonical version, not just filepath: a local `0001_foo.sql`\n // and a remote `1_foo.sql` refer to the same migration, and writing\n // both would fail parseStrictLocalMigrations' duplicate-version check.\n const existingLocalVersions = new Set(\n listLocalMigrationFilenames()\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .map((migration) => migration.version),\n );\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const migration of [...migrations].sort(\n (left, right) => compareMigrationVersions(left.version, right.version),\n )) {\n assertValidMigrationName(migration.name);\n\n const filename = buildMigrationFilename(\n migration.version,\n migration.name,\n );\n const filePath = join(migrationsDir, filename);\n\n if (existingLocalVersions.has(migration.version) || existsSync(filePath)) {\n skippedFiles.push(filename);\n continue;\n }\n\n writeFileSync(filePath, formatMigrationSql(migration.statements));\n createdFiles.push(filename);\n existingLocalVersions.add(migration.version);\n }\n\n if (json) {\n outputJson({\n directory: migrationsDir,\n totalRemoteMigrations: migrations.length,\n createdFiles,\n skippedFiles,\n });\n } else {\n outputSuccess(\n `Fetched ${migrations.length} remote migration(s) into ${migrationsDir}.`,\n );\n console.log(`Created: ${createdFiles.length}`);\n console.log(`Skipped: ${skippedFiles.length}`);\n }\n\n await reportCliUsage('cli.db.migrations.fetch', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.fetch', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('new <migration-name>')\n .description('Create a new local migration file')\n .action(async (migrationName: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n assertValidMigrationName(migrationName);\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const localMigrations = parseStrictLocalMigrations(listLocalMigrationFilenames());\n const nextVersion = getNextLocalMigrationVersion(\n localMigrations,\n latestRemoteVersion,\n );\n\n const filename = buildMigrationFilename(nextVersion, migrationName);\n const migrationsDir = ensureMigrationsDir();\n const filePath = join(migrationsDir, filename);\n\n try {\n writeFileSync(filePath, '', { flag: 'wx' });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new CLIError(`Migration file already exists: ${filename}`);\n }\n throw error;\n }\n\n if (json) {\n outputJson({ filename, path: filePath, version: nextVersion });\n } else {\n outputSuccess(`Created migration file ${filename}`);\n }\n\n await reportCliUsage('cli.db.migrations.new', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.new', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('up [target]')\n .description('Apply one or more local migration files')\n .option('--all', 'Apply all pending local migration files')\n .option('--to <version-or-filename>', 'Apply pending local migrations up to a version or file')\n .action(async (target: string | undefined, options, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const appliedRemoteVersions = new Set(\n migrations.map((migration) => migration.version),\n );\n const filenames = listLocalMigrationFilenames();\n\n const requestedModes = [Boolean(target), Boolean(options.all), Boolean(options.to)].filter(Boolean);\n if (requestedModes.length !== 1) {\n throw new CLIError(\n 'Use exactly one apply mode: `up <target>`, `up --to <version-or-filename>`, or `up --all`.',\n );\n }\n\n const applySingleTarget = async (targetMigrationFilenameOrVersion: string) => {\n const targetMigration = resolveMigrationTarget(targetMigrationFilenameOrVersion, filenames);\n const validLocalMigrations = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .sort((left, right) => compareMigrationVersions(left.version, right.version));\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetMigration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${targetMigration.filename} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(targetMigration.filename, latestRemoteVersion);\n }\n\n const earlierPendingMigration = validLocalMigrations.find(\n (migration) =>\n migration.version !== targetMigration.version &&\n (!latestRemoteVersion ||\n compareMigrationVersions(migration.version, latestRemoteVersion) > 0) &&\n compareMigrationVersions(migration.version, targetMigration.version) < 0,\n );\n\n if (earlierPendingMigration) {\n throw new CLIError(\n `Migration ${targetMigration.filename} is not the next pending local migration. Apply ${earlierPendingMigration.filename} first, or fix/delete it locally if it is invalid or no longer needed.`,\n );\n }\n\n const filePath = join(getMigrationsDir(), targetMigration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${targetMigration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${targetMigration.filename}`);\n }\n\n return applyMigration(targetMigration, sql);\n };\n\n let appliedMigrations: CreateMigrationResponse[] = [];\n\n if (target) {\n appliedMigrations = [await applySingleTarget(target)];\n } else {\n const localMigrations = parseStrictLocalMigrations(filenames);\n const olderThanHeadMigrations = findOlderThanHeadLocalMigrations(\n localMigrations,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n const pendingMigrations = localMigrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n ) === 'pending',\n );\n\n if (olderThanHeadMigrations.length > 0 && latestRemoteVersion) {\n throw buildOlderThanHeadError(\n olderThanHeadMigrations[0].filename,\n latestRemoteVersion,\n );\n }\n\n if (pendingMigrations.length === 0) {\n if (json) {\n outputJson({ appliedMigrations: [] });\n } else {\n outputSuccess('No pending local migrations to apply.');\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n return;\n }\n\n let migrationsToApply = pendingMigrations;\n\n if (options.to) {\n const targetVersion = /^\\d{14}$/u.test(options.to)\n ? options.to\n : resolveMigrationTarget(options.to, filenames).version;\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetVersion,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${options.to} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(options.to, latestRemoteVersion);\n }\n\n migrationsToApply = pendingMigrations.filter(\n (migration) => compareMigrationVersions(migration.version, targetVersion) <= 0,\n );\n\n if (\n migrationsToApply.length === 0 ||\n migrationsToApply[migrationsToApply.length - 1]?.version !== targetVersion\n ) {\n throw new CLIError(\n `Pending local migration not found for target ${options.to}.`,\n );\n }\n }\n\n for (const migration of migrationsToApply) {\n const filePath = join(getMigrationsDir(), migration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${migration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${migration.filename}`);\n }\n\n appliedMigrations.push(await applyMigration(migration, sql));\n }\n }\n\n if (json) {\n outputJson({ appliedMigrations });\n } else {\n outputSuccess(`Applied ${appliedMigrations.length} migration file(s).`);\n for (const migration of appliedMigrations) {\n console.log(`- ${buildMigrationFilename(migration.version, migration.name)}`);\n }\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.up', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport interface ParsedMigrationFile {\n filename: string;\n version: string;\n name: string;\n}\n\nexport type RemoteMigrationVersionStatus = 'already-applied' | 'older-than-head' | 'pending';\n\n// Cap at 64 digits so unbounded input can't DoS BigInt conversions or\n// the backend's `version::numeric` casts. 64 comfortably fits 4-digit\n// Drizzle sequences, 14-digit YYYYMMDDHHmmss timestamps, and anything\n// realistic in between.\nconst MIGRATION_VERSION_REGEX = /^\\d{1,64}$/u;\nconst MIGRATION_FILENAME_REGEX = /^(\\d{1,64})_([a-z0-9-]+)\\.sql$/u;\n\nexport function assertValidMigrationVersion(version: string): void {\n if (!MIGRATION_VERSION_REGEX.test(version)) {\n throw new CLIError(`Invalid migration version: ${version}. Expected a numeric string of at most 64 digits (e.g. 0001 or 20260418091500).`);\n }\n}\n\n// Numeric prefixes like \"0001\" and \"1\" refer to the same migration. Strip\n// leading zeros so Set lookups, equality checks, and duplicate detection all\n// agree with the numeric ordering in compareMigrationVersions.\nexport function canonicalMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n return BigInt(version).toString();\n}\n\nexport function parseMigrationFilename(filename: string): ParsedMigrationFile | null {\n const match = MIGRATION_FILENAME_REGEX.exec(filename);\n if (!match) {\n return null;\n }\n\n return {\n filename,\n version: canonicalMigrationVersion(match[1]),\n name: match[2],\n };\n}\n\nexport function compareMigrationVersions(left: string, right: string): number {\n if (MIGRATION_VERSION_REGEX.test(left) && MIGRATION_VERSION_REGEX.test(right)) {\n const a = BigInt(left);\n const b = BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n }\n return left.localeCompare(right);\n}\n\nexport function getRemoteMigrationVersionStatus(\n version: string,\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): RemoteMigrationVersionStatus {\n if (appliedVersions.has(version)) {\n return 'already-applied';\n }\n\n if (\n latestRemoteVersion &&\n compareMigrationVersions(version, latestRemoteVersion) < 0\n ) {\n return 'older-than-head';\n }\n\n return 'pending';\n}\n\nfunction formatMigrationVersion(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n const hour = String(date.getUTCHours()).padStart(2, '0');\n const minute = String(date.getUTCMinutes()).padStart(2, '0');\n const second = String(date.getUTCSeconds()).padStart(2, '0');\n\n return `${year}${month}${day}${hour}${minute}${second}`;\n}\n\nexport function incrementMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n if (!/^\\d{14}$/u.test(version)) {\n return String(BigInt(version) + 1n);\n }\n const year = Number(version.slice(0, 4));\n const month = Number(version.slice(4, 6)) - 1;\n const day = Number(version.slice(6, 8));\n const hour = Number(version.slice(8, 10));\n const minute = Number(version.slice(10, 12));\n const second = Number(version.slice(12, 14));\n const nextTimestamp = Date.UTC(year, month, day, hour, minute, second + 1);\n\n return formatMigrationVersion(new Date(nextTimestamp));\n}\n\nexport function getMigrationsDir(cwd: string = process.cwd()): string {\n return join(cwd, 'migrations');\n}\n\nexport function ensureMigrationsDir(cwd: string = process.cwd()): string {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n }\n return migrationsDir;\n}\n\nexport function listLocalMigrationFilenames(cwd: string = process.cwd()): string[] {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n return [];\n }\n\n return readdirSync(migrationsDir).sort((left, right) => left.localeCompare(right));\n}\n\nexport function parseStrictLocalMigrations(filenames: string[]): ParsedMigrationFile[] {\n const migrations = filenames.map((filename) => {\n const parsedMigration = parseMigrationFilename(filename);\n if (!parsedMigration) {\n throw new CLIError(\n `Invalid migration filename: ${filename}. Expected <migration_version>_<migration-name>.sql.`,\n );\n }\n return parsedMigration;\n });\n\n assertNoDuplicateMigrationVersions(migrations);\n return migrations.sort((left, right) => compareMigrationVersions(left.version, right.version));\n}\n\nexport function assertNoDuplicateMigrationVersions(migrations: ParsedMigrationFile[]): void {\n const seen = new Set<string>();\n\n for (const migration of migrations) {\n if (seen.has(migration.version)) {\n throw new CLIError(`Duplicate local migration version found: ${migration.version}`);\n }\n seen.add(migration.version);\n }\n}\n\nexport function getNextLocalMigrationVersion(\n migrations: ParsedMigrationFile[],\n latestRemoteVersion: string | null,\n now: Date = new Date(),\n): string {\n const orderedMigrations = [...migrations].sort((left, right) =>\n compareMigrationVersions(left.version, right.version),\n );\n assertNoDuplicateMigrationVersions(orderedMigrations);\n\n const latestKnownVersion = orderedMigrations.reduce<string | null>(\n (latestVersion, migration) => {\n if (!latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0) {\n return migration.version;\n }\n return latestVersion;\n },\n latestRemoteVersion,\n );\n\n const currentVersion = formatMigrationVersion(now);\n if (!latestKnownVersion || compareMigrationVersions(currentVersion, latestKnownVersion) > 0) {\n return currentVersion;\n }\n\n return incrementMigrationVersion(latestKnownVersion);\n}\n\nexport function formatMigrationSql(statements: string[]): string {\n const normalizedStatements = statements\n .map((statement) => statement.trim().replace(/;\\s*$/u, ''))\n .filter(Boolean);\n\n return normalizedStatements\n .join(';\\n\\n')\n .concat(normalizedStatements.length > 0 ? ';\\n' : '');\n}\n\nexport function findOlderThanHeadLocalMigrations(\n migrations: ParsedMigrationFile[],\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): ParsedMigrationFile[] {\n return migrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedVersions,\n latestRemoteVersion,\n ) === 'older-than-head',\n );\n}\n\nexport function findLocalMigrationByVersion(\n version: string,\n filenames: string[],\n): ParsedMigrationFile {\n const canonicalVersion = canonicalMigrationVersion(version);\n const matches = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter(\n (migration): migration is ParsedMigrationFile =>\n migration !== null && migration.version === canonicalVersion,\n );\n\n if (matches.length === 0) {\n throw new CLIError(`Local migration for version ${version} not found.`);\n }\n\n if (matches.length > 1) {\n throw new CLIError(\n `Multiple local migration files found for version ${version}.`,\n );\n }\n\n return matches[0];\n}\n\nexport function resolveMigrationTarget(\n target: string,\n filenames: string[],\n): ParsedMigrationFile {\n if (/^\\d{1,64}$/u.test(target)) {\n return findLocalMigrationByVersion(target, filenames);\n }\n\n const parsedTarget = parseMigrationFilename(target);\n if (!parsedTarget) {\n throw new CLIError(\n 'Migration file names must match <migration_version>_<migration-name>.sql.',\n );\n }\n\n if (!filenames.includes(target)) {\n throw new CLIError(`Local migration file not found: ${target}`);\n }\n\n return parsedTarget;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerRecordsCommands(recordsCmd: Command): void {\n recordsCmd\n .command('list <table>')\n .description('List records from a table')\n .option('--select <columns>', 'Columns to select (comma-separated)')\n .option('--filter <filter>', 'Filter expression (e.g. \"name=eq.John\")')\n .option('--order <order>', 'Order by (e.g. \"created_at.desc\")')\n .option('--limit <n>', 'Limit number of records', parseInt)\n .option('--offset <n>', 'Offset for pagination', parseInt)\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n if (opts.select) params.set('select', opts.select);\n if (opts.filter) params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n if (opts.order) params.set('order', opts.order);\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.offset) params.set('offset', String(opts.offset));\n\n const query = params.toString();\n const path = `/api/database/records/${encodeURIComponent(table)}${query ? `?${query}` : ''}`;\n const res = await ossFetch(path);\n const data = await res.json() as { data?: Record<string, unknown>[] };\n const records = data.data ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (records.length === 0) {\n console.log('No records found.');\n return;\n }\n const headers = Object.keys(records[0]);\n outputTable(\n headers,\n records.map((r) => headers.map((h) => {\n const val = r[h];\n if (val === null || val === undefined) return '';\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val);\n })),\n );\n console.log(`${records.length} record(s).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsCreateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('create <table>')\n .description('Create record(s) in a table')\n .option('--data <json>', 'JSON data to insert (object or array of objects)')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"John\"}\\'');\n }\n\n let records: unknown[];\n try {\n const parsed = JSON.parse(opts.data) as unknown;\n records = Array.isArray(parsed) ? parsed : [parsed];\n } catch {\n throw new CLIError('Invalid JSON in --data. Provide a JSON object or array.');\n }\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?return=representation`,\n {\n method: 'POST',\n body: JSON.stringify(records),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const created = data.data ?? [];\n outputSuccess(`Created ${created.length || records.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsUpdateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('update <table>')\n .description('Update records in a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .option('--data <json>', 'JSON data to update')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental updates to all rows.');\n }\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"Jane\"}\\'');\n }\n\n let body: unknown;\n try {\n body = JSON.parse(opts.data) as unknown;\n } catch {\n throw new CLIError('Invalid JSON in --data.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const updated = data.data ?? [];\n outputSuccess(`Updated ${updated.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsDeleteCommand(recordsCmd: Command): void {\n recordsCmd\n .command('delete <table>')\n .description('Delete records from a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental deletion of all rows.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n { method: 'DELETE' },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const deleted = data.data ?? [];\n outputSuccess(`Deleted ${deleted.length} record(s) from \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerFunctionsCommands(functionsCmd: Command): void {\n functionsCmd\n .command('list')\n .description('List all edge functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/functions');\n const raw = await res.json();\n // API may return array directly or { functions: [...] }\n const functions: ListFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'functions' in raw\n ? (raw as ListFunctionsResponse).functions ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No functions found.');\n return;\n }\n outputTable(\n ['Slug', 'Name', 'Status', 'Created At'],\n functions.map((f) => [\n f.slug,\n f.name ?? '-',\n f.status ?? '-',\n f.createdAt ? new Date(f.createdAt).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.functions.list', true);\n } catch (err) {\n await reportCliUsage('cli.functions.list', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeployCommand(functionsCmd: Command): void {\n functionsCmd\n .command('deploy <slug>')\n .description('Deploy an edge function (create or update)')\n .option('--file <path>', 'Path to the function source file')\n .option('--name <name>', 'Function display name')\n .option('--description <desc>', 'Function description')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n // Resolve source file\n const filePath = opts.file ?? join(process.cwd(), 'insforge', 'functions', slug, 'index.ts');\n if (!existsSync(filePath)) {\n throw new CLIError(\n `Source file not found: ${filePath}\\n` +\n `Specify --file <path> or create ${join('insforge', 'functions', slug, 'index.ts')}`,\n );\n }\n\n const code = readFileSync(filePath, 'utf-8');\n const name = opts.name ?? slug;\n const description = opts.description ?? '';\n\n // Check if function exists\n let exists = false;\n try {\n await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n exists = true;\n } catch {\n exists = false;\n }\n\n let res: Response;\n if (exists) {\n res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'PUT',\n body: JSON.stringify({ name, description, code }),\n });\n } else {\n res = await ossFetch('/api/functions', {\n method: 'POST',\n body: JSON.stringify({ slug, name, description, code }),\n });\n }\n\n const result = await res.json() as FunctionResponse;\n\n const deployFailed = result.deployment?.status === 'failed';\n\n if (json) {\n outputJson(result);\n } else {\n const action = exists ? 'updation' : 'creation';\n const resultStatus = result.success ? 'success' : 'failed';\n outputSuccess(`Function \"${result.function.slug}\" ${action} ${resultStatus}.`);\n if (result.deployment) {\n if (result.deployment.status === 'success') {\n console.log(` Deployment: ${result.deployment.status}${result.deployment.url ? ` → ${result.deployment.url}` : ''}`);\n } else {\n console.log(` Deployment: ${result.deployment.status}`);\n if (result.deployment.buildLogs?.length) {\n console.log(' Build logs:');\n for (const line of result.deployment.buildLogs) {\n console.log(` ${line}`);\n }\n }\n }\n }\n }\n if (deployFailed) throw new CLIError('Function deployment failed');\n await reportCliUsage('cli.functions.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.functions.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, CLIError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\nexport function registerFunctionsInvokeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('invoke <slug>')\n .description('Invoke an edge function')\n .option('--data <json>', 'JSON body to send to the function')\n .option('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)', 'POST')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const method = opts.method.toUpperCase();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n };\n\n const fetchOpts: RequestInit = { method, headers };\n\n if (opts.data && ['POST', 'PUT', 'PATCH'].includes(method)) {\n fetchOpts.body = opts.data;\n }\n\n // Functions client endpoint is at /functions/{slug} (not /api/functions/{slug})\n // Use direct fetch so we always show the function's full response,\n // even on non-200 status codes (function errors are part of the output).\n const res = await fetch(\n `${config.oss_host}/functions/${encodeURIComponent(slug)}`,\n fetchOpts,\n );\n\n const contentType = res.headers.get('content-type') ?? '';\n const status = res.status;\n\n if (contentType.includes('application/json')) {\n const data = await res.json();\n if (json) {\n outputJson({ status, body: data });\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n } else {\n const text = await res.text();\n console.log(text);\n }\n\n // Exit with non-zero code on function errors\n if (status >= 400) {\n throw new CLIError(`HTTP ${status}`, 1, 'HTTP_ERROR');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\ninterface FunctionDetails {\n id: string;\n slug: string;\n name: string;\n description: string | null;\n code: string;\n status: string;\n created_at: string;\n updated_at: string;\n deployed_at: string | null;\n}\n\nexport function registerFunctionsCodeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('code <slug>')\n .description('Fetch and display the source code of an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n const fn = await res.json() as FunctionDetails;\n\n if (json) {\n outputJson(fn);\n } else {\n console.log(`Function: ${fn.name} (${fn.slug})`);\n console.log(`Status: ${fn.status}`);\n if (fn.description) console.log(`Desc: ${fn.description}`);\n if (fn.deployed_at) console.log(`Deployed: ${fn.deployed_at}`);\n console.log('---');\n console.log(fn.code);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeleteCommand(functionsCmd: Command): void {\n functionsCmd\n .command('delete <slug>')\n .description('Delete an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Delete function \"${slug}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n clack.log.info('Cancelled.');\n return;\n }\n }\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'DELETE',\n });\n const result = await res.json() as FunctionResponse;\n\n if (json) {\n outputJson(result);\n } else {\n if (result.success) {\n outputSuccess(`Function \"${slug}\" deleted successfully.`);\n } else {\n outputSuccess(`Failed to delete function \"${slug}\".`);\n }\n }\n await reportCliUsage('cli.functions.delete', true);\n } catch (err) {\n await reportCliUsage('cli.functions.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { StorageBucketSchema } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageBucketsCommand(storageCmd: Command): void {\n storageCmd\n .command('buckets')\n .description('List all storage buckets')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/storage/buckets');\n const raw = await res.json();\n // API may return array directly or { buckets: [...] }\n const buckets: StorageBucketSchema[] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'buckets' in raw\n ? (raw as { buckets?: StorageBucketSchema[] }).buckets ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (buckets.length === 0) {\n console.log('No buckets found.');\n return;\n }\n outputTable(\n ['Bucket Name', 'Public'],\n buckets.map((b) => [b.name, b.public ? 'Yes' : 'No']),\n );\n }\n await reportCliUsage('cli.storage.buckets', true);\n } catch (err) {\n await reportCliUsage('cli.storage.buckets', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageUploadCommand(storageCmd: Command): void {\n storageCmd\n .command('upload <file>')\n .description('Upload a file to a storage bucket')\n .requiredOption('--bucket <name>', 'Target bucket name')\n .option('--key <objectKey>', 'Object key (defaults to filename)')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n if (!existsSync(file)) {\n throw new CLIError(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file);\n const objectKey = opts.key ?? basename(file);\n const bucketName = opts.bucket;\n\n // Build multipart form data\n const formData = new FormData();\n const blob = new Blob([fileContent]);\n formData.append('file', blob, objectKey);\n\n // PUT /api/storage/buckets/{bucket}/objects/{key} for named upload\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Upload failed: ${res.status}`);\n }\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Uploaded \"${basename(file)}\" to bucket \"${bucketName}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDownloadCommand(storageCmd: Command): void {\n storageCmd\n .command('download <objectKey>')\n .description('Download a file from a storage bucket')\n .requiredOption('--bucket <name>', 'Source bucket name')\n .option('--output <path>', 'Output file path (defaults to current directory)')\n .action(async (objectKey: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const bucketName = opts.bucket;\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Download failed: ${res.status}`);\n }\n\n const buffer = Buffer.from(await res.arrayBuffer());\n const outputPath = opts.output ?? join(process.cwd(), basename(objectKey));\n writeFileSync(outputPath, buffer);\n\n if (json) {\n outputJson({ success: true, path: outputPath, size: buffer.length });\n } else {\n outputSuccess(`Downloaded \"${objectKey}\" to ${outputPath} (${buffer.length} bytes).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageCreateBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('create-bucket <name>')\n .description('Create a new storage bucket')\n .option('--public', 'Make the bucket publicly accessible (default)')\n .option('--private', 'Make the bucket private')\n .action(async (name: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const isPublic = !opts.private;\n\n const res = await ossFetch('/api/storage/buckets', {\n method: 'POST',\n body: JSON.stringify({ bucketName: name, isPublic }),\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" created (${isPublic ? 'public' : 'private'}).`);\n }\n await reportCliUsage('cli.storage.create-bucket', true);\n } catch (err) {\n await reportCliUsage('cli.storage.create-bucket', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDeleteBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('delete-bucket <name>')\n .description('Delete a storage bucket and all its objects')\n .action(async (name: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete bucket \"${name}\" and all its objects? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/storage/buckets/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface StoredFile {\n key: string;\n size: number;\n mimeType?: string;\n uploadedAt: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function registerStorageListObjectsCommand(storageCmd: Command): void {\n storageCmd\n .command('list-objects <bucket>')\n .description('List objects in a storage bucket')\n .option('--limit <n>', 'Maximum number of objects to return', '100')\n .option('--offset <n>', 'Number of objects to skip', '0')\n .option('--prefix <prefix>', 'Filter objects by key prefix')\n .option('--search <term>', 'Search objects by key (partial match)')\n .option('--sort <field>', 'Sort by field: key, size, uploadedAt (default: key)')\n .action(async (bucket: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n params.set('limit', opts.limit);\n params.set('offset', opts.offset);\n if (opts.prefix) params.set('prefix', opts.prefix);\n if (opts.search) params.set('search', opts.search);\n\n const res = await ossFetch(\n `/api/storage/buckets/${encodeURIComponent(bucket)}/objects?${params.toString()}`,\n );\n const raw = await res.json() as { data?: StoredFile[]; pagination?: { total?: number } };\n\n const objects: StoredFile[] = Array.isArray(raw)\n ? raw as StoredFile[]\n : (raw.data ?? []);\n\n // Client-side sort\n const sortField = opts.sort ?? 'key';\n objects.sort((a, b) => {\n if (sortField === 'size') return a.size - b.size;\n if (sortField === 'uploadedAt') return a.uploadedAt.localeCompare(b.uploadedAt);\n return a.key.localeCompare(b.key);\n });\n\n if (json) {\n outputJson(raw);\n } else {\n if (objects.length === 0) {\n console.log(`No objects found in bucket \"${bucket}\".`);\n return;\n }\n const total = raw.pagination?.total;\n if (total !== undefined) {\n console.log(`Showing ${objects.length} of ${total} objects:\\n`);\n }\n outputTable(\n ['Key', 'Size', 'Type', 'Uploaded At'],\n objects.map((o) => [\n o.key,\n formatSize(o.size),\n o.mimeType ?? '-',\n o.uploadedAt,\n ]),\n );\n }\n await reportCliUsage('cli.storage.list-objects', true);\n } catch (err) {\n await reportCliUsage('cli.storage.list-objects', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getCredentials, getGlobalConfig, getProjectConfig } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nexport function registerContextCommand(program: Command): void {\n program\n .command('current')\n .description('Show current CLI context (user, org, project)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const creds = getCredentials();\n const globalConfig = getGlobalConfig();\n const projectConfig = getProjectConfig();\n\n if (json) {\n outputJson({\n authenticated: !!creds,\n user: creds?.user ?? null,\n default_org_id: globalConfig.default_org_id ?? null,\n project: projectConfig,\n });\n return;\n }\n\n console.log('\\n InsForge CLI Context\\n');\n\n // Auth status\n if (creds) {\n console.log(` User: ${creds.user.name} <${creds.user.email}>`);\n } else {\n console.log(' User: (not logged in)');\n }\n\n // Org (only relevant when logged in)\n if (creds && globalConfig.default_org_id) {\n console.log(` Default Org: ${globalConfig.default_org_id}`);\n } else if (creds) {\n console.log(' Default Org: (none)');\n }\n\n // Project\n if (projectConfig) {\n console.log('');\n console.log(` Project: ${projectConfig.project_name} (${projectConfig.project_id})`);\n console.log(` App Key: ${projectConfig.appkey}`);\n console.log(` Region: ${projectConfig.region}`);\n console.log(` OSS Host: ${projectConfig.oss_host}`);\n } else {\n console.log('\\n Project: (not linked — run `npx @insforge/cli link`)');\n }\n\n console.log('');\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations, listProjects } from '../lib/api/platform.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all organizations and their projects')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (orgs.length === 0) {\n if (json) {\n outputJson([]);\n } else {\n console.log('No organizations found.');\n }\n return;\n }\n\n // Fetch projects for all orgs in parallel\n const orgProjects = await Promise.all(\n orgs.map(async (org) => ({\n org,\n projects: await listProjects(org.id, apiUrl),\n })),\n );\n\n if (json) {\n outputJson(\n orgProjects.map(({ org, projects }) => ({\n id: org.id,\n name: org.name,\n type: org.type ?? null,\n projects: projects.map((p) => ({\n id: p.id,\n name: p.name,\n region: p.region,\n status: p.status,\n appkey: p.appkey,\n })),\n })),\n );\n return;\n }\n\n // Human-readable: grouped table\n const rows: string[][] = [];\n for (const { org, projects } of orgProjects) {\n if (projects.length === 0) {\n rows.push([org.name, '-', '-', '-', '-']);\n } else {\n for (let i = 0; i < projects.length; i++) {\n const p = projects[i];\n rows.push([\n i === 0 ? org.name : '',\n p.name,\n p.region,\n p.status,\n p.appkey,\n ]);\n }\n }\n }\n\n outputTable(['Organization', 'Project', 'Region', 'Status', 'AppKey'], rows);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListDeploymentsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDeploymentsListCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('list')\n .description('List all deployments')\n .option('--limit <n>', 'Limit number of results', '20')\n .option('--offset <n>', 'Offset for pagination', '0')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments?limit=${opts.limit}&offset=${opts.offset}`);\n const raw = await res.json();\n // API may return array directly or { data: [...] }\n const deployments: ListDeploymentsResponse['data'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'data' in raw\n ? (raw as ListDeploymentsResponse).data ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (!deployments.length) {\n console.log('No deployments found.');\n return;\n }\n outputTable(\n ['ID', 'Status', 'Provider', 'URL', 'Created'],\n deployments.map((d) => [\n d.id,\n d.status,\n d.provider,\n d.url ?? '-',\n new Date(d.createdAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, getDeploymentError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DeploymentSchema } from '../../types.js';\n\nexport function registerDeploymentsStatusCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('status <id>')\n .description('Get deployment details and sync status from Vercel')\n .option('--sync', 'Sync status from Vercel before showing')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n // Optionally sync status from Vercel first\n if (opts.sync) {\n await ossFetch(`/api/deployments/${id}/sync`, { method: 'POST' });\n }\n\n const res = await ossFetch(`/api/deployments/${id}`);\n const d = (await res.json()) as DeploymentSchema;\n\n if (json) {\n outputJson(d);\n } else {\n const errorMessage = getDeploymentError(d.metadata);\n outputTable(\n ['Field', 'Value'],\n [\n ['ID', d.id],\n ['Status', d.status],\n ['Provider', d.provider ?? '-'],\n ['Provider ID', d.providerDeploymentId ?? '-'],\n ['URL', d.url ?? '-'],\n ['Created', new Date(d.createdAt).toLocaleString()],\n ['Updated', new Date(d.updatedAt).toLocaleString()],\n ...(errorMessage ? [['Error', errorMessage]] : []),\n ],\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDeploymentsCancelCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('cancel <id>')\n .description('Cancel a deployment')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Cancel deployment ${id}?`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) process.exit(0);\n }\n\n const res = await ossFetch(`/api/deployments/${id}/cancel`, { method: 'POST' });\n const result = await res.json();\n\n if (json) {\n outputJson(result);\n } else {\n outputSuccess(`Deployment ${id} cancelled.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface EnvVar {\n id: string;\n key: string;\n type: string;\n updatedAt: number;\n}\n\nexport function registerDeploymentsEnvVarsCommand(deploymentsCmd: Command): void {\n const envCmd = deploymentsCmd.command('env').description('Manage deployment environment variables');\n\n // list\n envCmd\n .command('list')\n .description('List all deployment environment variables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars');\n const data = (await res.json()) as { envVars: EnvVar[] };\n const envVars = data.envVars ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!envVars.length) {\n console.log('No environment variables found.');\n return;\n }\n outputTable(\n ['ID', 'Key', 'Type', 'Updated At'],\n envVars.map((v) => [\n v.id,\n v.key,\n v.type,\n new Date(v.updatedAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.env.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.list', false);\n handleError(err, json);\n }\n });\n\n // create / update\n envCmd\n .command('set <key> <value>')\n .description('Create or update a deployment environment variable')\n .action(async (key: string, value: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars', {\n method: 'POST',\n body: JSON.stringify({ envVars: [{ key, value }] }),\n });\n const data = (await res.json()) as { success: boolean; message: string; count: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.set', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.set', false);\n handleError(err, json);\n }\n });\n\n // delete\n envCmd\n .command('delete <id>')\n .description('Delete a deployment environment variable by ID')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments/env-vars/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = (await res.json()) as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.delete', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nconst FEATURES = ['db', 'storage', 'functions', 'auth', 'ai', 'realtime'] as const;\nconst LANGUAGES = ['typescript', 'swift', 'kotlin', 'rest-api'] as const;\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command('docs [feature] [language]')\n .description('Browse InsForge SDK documentation')\n .addHelpText('after', `\nFeatures: ${FEATURES.join(', ')}\nLanguages: ${LANGUAGES.join(', ')}\n\nExamples:\n npx @insforge/cli docs List all available docs\n npx @insforge/cli docs instructions Show setup instructions\n npx @insforge/cli docs db typescript Show TypeScript database SDK docs\n npx @insforge/cli docs auth swift Show Swift auth SDK docs\n npx @insforge/cli docs storage rest-api Show REST API storage docs`)\n .action(async (feature: string | undefined, language: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n await reportCliUsage('cli.docs', true);\n // No args → list all docs\n if (!feature) {\n await listDocs(json);\n return;\n }\n\n // Single arg → legacy doc type (e.g. \"instructions\")\n if (!language) {\n await fetchDoc(`/api/docs/${encodeURIComponent(feature)}`, feature, json);\n return;\n }\n\n // Two args → feature + language\n await fetchDoc(\n `/api/docs/${encodeURIComponent(feature)}/${encodeURIComponent(language)}`,\n `${feature}/${language}`,\n json,\n );\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n\nasync function listDocs(json: boolean): Promise<void> {\n const res = await ossFetch('/api/docs');\n const data = await res.json() as { data?: DocEntry[] } | DocEntry[];\n const docs = Array.isArray(data) ? data : (data.data ?? []);\n\n if (json) {\n outputJson(docs);\n } else {\n if (!docs.length) {\n console.log('No documentation available.');\n return;\n }\n outputTable(\n ['Type', 'Endpoint'],\n docs.map((d) => [String(d.type ?? '-'), String(d.endpoint ?? '-')]),\n );\n }\n}\n\nasync function fetchDoc(path: string, label: string, json: boolean): Promise<void> {\n const res = await ossFetch(path);\n const data = await res.json() as { data?: { type?: string; content?: string }; type?: string; content?: string };\n const doc = data.data ?? data;\n\n if (json) {\n outputJson(doc);\n } else {\n if (doc.content) {\n console.log(doc.content);\n } else {\n console.log(`No content returned for \"${label}\".`);\n }\n }\n}\n\ninterface DocEntry {\n type?: string;\n filename?: string;\n endpoint?: string;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSecretsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsListCommand(secretsCmd: Command): void {\n secretsCmd\n .command('list')\n .description('List secrets (metadata only, values are hidden)')\n .option('--all', 'Include inactive (deleted) secrets')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/secrets');\n const data = await res.json() as ListSecretsResponse;\n let secrets = data.secrets ?? [];\n\n if (!opts.all) {\n secrets = secrets.filter((s) => s.isActive !== false);\n }\n\n if (json) {\n outputJson(opts.all ? data : { secrets });\n } else {\n if (!secrets.length) {\n console.log('No secrets found.');\n return;\n }\n const headers = opts.all\n ? ['Key', 'Active', 'Reserved', 'Expires', 'Updated']\n : ['Key', 'Reserved', 'Expires', 'Updated'];\n outputTable(\n headers,\n secrets.map((s) => {\n const row = [\n String(s.key ?? '-'),\n ...(opts.all ? [s.isActive ? 'Yes' : 'No'] : []),\n s.isReserved ? 'Yes' : 'No',\n s.expiresAt ? new Date(String(s.expiresAt)).toLocaleString() : '-',\n s.updatedAt ? new Date(String(s.updatedAt)).toLocaleString() : '-',\n ];\n return row;\n }),\n );\n }\n await reportCliUsage('cli.secrets.list', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetSecretValueResponse } from '../../types.js';\n\nexport function registerSecretsGetCommand(secretsCmd: Command): void {\n secretsCmd\n .command('get <key>')\n .description('Get the decrypted value of a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`);\n const data = await res.json();\n const secret = data as GetSecretValueResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`${secret.key} = ${secret.value}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateSecretResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsAddCommand(secretsCmd: Command): void {\n secretsCmd\n .command('add <key> <value>')\n .description('Create a new secret')\n .option('--reserved', 'Mark secret as protected from deletion')\n .option('--expires <date>', 'Expiration date (ISO 8601 format)')\n .action(async (key: string, value: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = { key, value };\n if (opts.reserved) body.isReserved = true;\n if (opts.expires) body.expiresAt = opts.expires;\n\n const res = await ossFetch('/api/secrets', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} created.`);\n }\n await reportCliUsage('cli.secrets.add', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.add', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { UpdateSecretResponse } from '../../types.js';\n\nexport function registerSecretsUpdateCommand(secretsCmd: Command): void {\n secretsCmd\n .command('update <key>')\n .description('Update an existing secret')\n .option('--value <value>', 'New secret value')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--reserved <bool>', 'Set reserved status (true/false)')\n .option('--expires <date>', 'Expiration date (ISO 8601, or \"null\" to remove)')\n .action(async (key: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.value !== undefined) body.value = opts.value;\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n if (opts.reserved !== undefined) body.isReserved = opts.reserved === 'true';\n if (opts.expires !== undefined) body.expiresAt = opts.expires === 'null' ? null : opts.expires;\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--value, --active, --reserved, --expires).');\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n const data = await res.json() as UpdateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} updated.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { DeleteSecretResponse } from '../../types.js';\n\nexport function registerSecretsDeleteCommand(secretsCmd: Command): void {\n secretsCmd\n .command('delete <key>')\n .description('Delete a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete secret \"${key}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as DeleteSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSchedulesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesListCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('list')\n .description('List all schedules')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/schedules');\n const data = await res.json();\n const schedules: ListSchedulesResponse = data as ListSchedulesResponse;\n\n if (json) {\n outputJson(schedules);\n } else {\n if (!schedules.length) {\n console.log('No schedules found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Cron', 'URL', 'Method', 'Active', 'Next Run'],\n schedules.map((s) => [\n String(s.id ?? '-'),\n String(s.name ?? '-'),\n String(s.cronSchedule ?? '-'),\n String(s.functionUrl ?? '-'),\n String(s.httpMethod ?? '-'),\n s.isActive === false ? 'No' : 'Yes',\n s.nextRun ? new Date(String(s.nextRun)).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.schedules.list', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetScheduleResponse } from '../../types.js';\n\nexport function registerSchedulesGetCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('get <id>')\n .description('Get schedule details')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`);\n const data = await res.json() as GetScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`\\n Name: ${data.name ?? '-'}`);\n console.log(` ID: ${data.id ?? '-'}`);\n console.log(` Cron: ${data.cronSchedule ?? '-'}`);\n console.log(` URL: ${data.functionUrl ?? '-'}`);\n console.log(` Method: ${data.httpMethod ?? '-'}`);\n console.log(` Active: ${data.isActive === false ? 'No' : 'Yes'}`);\n if (data.headers) console.log(` Headers: ${JSON.stringify(data.headers)}`);\n if (data.body) console.log(` Body: ${JSON.stringify(data.body)}`);\n console.log(` Next Run: ${data.nextRun ? new Date(String(data.nextRun)).toLocaleString() : '-'}`);\n console.log(` Created: ${data.createdAt ? new Date(String(data.createdAt)).toLocaleString() : '-'}`);\n console.log('');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateScheduleResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesCreateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('create')\n .description('Create a new schedule')\n .requiredOption('--name <name>', 'Schedule name')\n .requiredOption(\n '--cron <expression>',\n 'Cron expression. 5-field cron (e.g. \"*/5 * * * *\", \"0 9 * * 1-5\") or pg_cron interval syntax for sub-minute cadence (e.g. \"30 seconds\", \"5 minutes\").'\n )\n .requiredOption('--url <url>', 'URL to invoke')\n .requiredOption('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)')\n .option('--headers <json>', 'HTTP headers as JSON')\n .option('--body <json>', 'Request body as JSON')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n name: opts.name,\n cronSchedule: opts.cron,\n functionUrl: opts.url,\n httpMethod: opts.method.toUpperCase(),\n };\n\n if (opts.headers) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n const res = await ossFetch('/api/schedules', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Schedule \"${opts.name}\" created (ID: ${data.id ?? 'unknown'}).`);\n }\n await reportCliUsage('cli.schedules.create', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.create', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesUpdateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('update <id>')\n .description('Update a schedule')\n .option('--name <name>', 'New schedule name')\n .option(\n '--cron <expression>',\n 'New cron expression. 5-field cron or pg_cron interval syntax (e.g. \"30 seconds\").'\n )\n .option('--url <url>', 'New URL to invoke')\n .option('--method <method>', 'New HTTP method')\n .option('--headers <json>', 'New HTTP headers as JSON')\n .option('--body <json>', 'New request body as JSON')\n .option('--active <bool>', 'Enable/disable schedule (true/false)')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body.name = opts.name;\n if (opts.cron !== undefined) body.cronSchedule = opts.cron;\n if (opts.url !== undefined) body.functionUrl = opts.url;\n if (opts.method !== undefined) body.httpMethod = opts.method.toUpperCase();\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n\n if (opts.headers !== undefined) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body !== undefined) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--name, --cron, --url, --method, --headers, --body, --active).');\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule updated.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesDeleteCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('delete <id>')\n .description('Delete a schedule')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete schedule \"${id}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule deleted.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListExecutionLogsResponse } from '../../types.js';\n\nexport function registerSchedulesLogsCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('logs <id>')\n .description('Get execution logs for a schedule')\n .option('--limit <n>', 'Max logs to return (default: 50, max: 100)', '50')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = parseInt(opts.limit, 10) || 50;\n const offset = parseInt(opts.offset, 10) || 0;\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}/logs?limit=${limit}&offset=${offset}`);\n const data = await res.json() as ListExecutionLogsResponse;\n const logs = data.logs ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!logs.length) {\n console.log('No execution logs found.');\n return;\n }\n outputTable(\n ['Executed At', 'Status', 'Success', 'Duration (ms)'],\n logs.map((l) => [\n l.executedAt ? new Date(String(l.executedAt)).toLocaleString() : '-',\n String(l.statusCode ?? '-'),\n l.success ? 'Yes' : 'No',\n String(l.durationMs ?? '-'),\n ]),\n );\n if (data.totalCount > offset + logs.length) {\n console.log(`\\n Showing ${offset + 1}-${offset + logs.length} of ${data.totalCount}. Use --offset to paginate.`);\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeListCommand(computeCmd: Command): void {\n computeCmd\n .command('list')\n .description('List all compute services')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/compute/services');\n const raw = await res.json();\n const services: Record<string, unknown>[] = Array.isArray(raw) ? raw : [];\n\n if (json) {\n outputJson(services);\n } else {\n if (services.length === 0) {\n console.log('No compute services found.');\n await reportCliUsage('cli.compute.list', true);\n return;\n }\n outputTable(\n ['Name', 'Status', 'Image', 'CPU', 'Memory', 'Endpoint'],\n services.map((s) => [\n String(s.name ?? '-'),\n String(s.status ?? '-'),\n String(s.imageUrl ?? '-'),\n String(s.cpu ?? '-'),\n s.memory ? `${s.memory}MB` : '-',\n String(s.endpointUrl ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.compute.list', true);\n } catch (err) {\n await reportCliUsage('cli.compute.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeGetCommand(computeCmd: Command): void {\n computeCmd\n .command('get <id>')\n .description('Get details of a compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`);\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputInfo(`Name: ${service.name}`);\n outputInfo(`ID: ${service.id}`);\n outputInfo(`Status: ${service.status}`);\n outputInfo(`Image: ${service.imageUrl}`);\n outputInfo(`CPU: ${service.cpu}`);\n outputInfo(`Memory: ${service.memory}MB`);\n outputInfo(`Region: ${service.region}`);\n outputInfo(`Endpoint: ${service.endpointUrl ?? 'n/a'}`);\n outputInfo(`Created: ${service.createdAt}`);\n }\n await reportCliUsage('cli.compute.get', true);\n } catch (err) {\n await reportCliUsage('cli.compute.get', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeUpdateCommand(computeCmd: Command): void {\n computeCmd\n .command('update <id>')\n .description('Update a compute service')\n .option('--image <image>', 'Docker image URL')\n .option('--port <port>', 'Container port')\n .option('--cpu <tier>', 'CPU tier')\n .option('--memory <mb>', 'Memory in MB')\n .option('--region <region>', 'Fly.io region')\n .option('--env <json>', 'Environment variables as JSON object')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.image) body.imageUrl = opts.image;\n if (opts.port) {\n if (!Number.isFinite(Number(opts.port))) {\n throw new CLIError('Invalid value for --port: must be a number');\n }\n body.port = Number(opts.port);\n }\n if (opts.cpu) body.cpu = opts.cpu;\n if (opts.memory) {\n if (!Number.isFinite(Number(opts.memory))) {\n throw new CLIError('Invalid value for --memory: must be a number');\n }\n body.memory = Number(opts.memory);\n }\n if (opts.region) body.region = opts.region;\n\n if (opts.env) {\n try {\n body.envVars = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('No update fields provided. Use --image, --port, --cpu, --memory, --region, or --env.');\n }\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" updated [${service.status}]`);\n }\n await reportCliUsage('cli.compute.update', true);\n } catch (err) {\n await reportCliUsage('cli.compute.update', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeDeleteCommand(computeCmd: Command): void {\n computeCmd\n .command('delete <id>')\n .description('Delete a compute service and its Fly.io resources')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess('Service deleted.');\n }\n await reportCliUsage('cli.compute.delete', true);\n } catch (err) {\n await reportCliUsage('cli.compute.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStartCommand(computeCmd: Command): void {\n computeCmd\n .command('start <id>')\n .description('Start a stopped compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/start`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" started [${service.status}]`);\n if (service.endpointUrl) {\n console.log(` Endpoint: ${service.endpointUrl}`);\n }\n }\n await reportCliUsage('cli.compute.start', true);\n } catch (err) {\n await reportCliUsage('cli.compute.start', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStopCommand(computeCmd: Command): void {\n computeCmd\n .command('stop <id>')\n .description('Stop a running compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" stopped.`);\n }\n await reportCliUsage('cli.compute.stop', true);\n } catch (err) {\n await reportCliUsage('cli.compute.stop', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeLogsCommand(computeCmd: Command): void {\n computeCmd\n .command('logs <id>')\n .description('Get compute service logs (machine events)')\n .option('--limit <n>', 'Max number of log entries', '50')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = Math.max(1, Math.min(Number(opts.limit) || 50, 1000));\n const res = await ossFetch(\n `/api/compute/services/${encodeURIComponent(id)}/logs?limit=${limit}`,\n );\n const logs = await res.json() as { timestamp: number; message: string }[];\n\n if (json) {\n outputJson(logs);\n } else {\n if (!Array.isArray(logs) || logs.length === 0) {\n console.log('No logs found.');\n await reportCliUsage('cli.compute.logs', true);\n return;\n }\n for (const entry of logs) {\n const ts = new Date(entry.timestamp).toISOString();\n console.log(`${ts} ${entry.message}`);\n }\n }\n await reportCliUsage('cli.compute.logs', true);\n } catch (err) {\n await reportCliUsage('cli.compute.logs', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport {\n ensureFlyctlAvailable,\n flyctlBuildAndPush,\n} from '../../lib/flyctl.js';\n\n// `compute deploy` has two modes:\n//\n// 1. Image mode (--image <url>):\n// Deploy a pre-built image from any registry. No flyctl/Docker needed.\n//\n// 2. Source mode ([dir]) — Path A (compute v3.2):\n// CLI runs `flyctl deploy --remote-only --build-only` against the user's\n// source directory using a per-app, attenuated deploy token minted by\n// the cloud. The remote builder runs on Fly's infrastructure and pushes\n// the image straight to registry.fly.io/<app>:<tag>. The cloud then\n// launches the machine pointing at the freshly-pushed image.\n// Requires `flyctl` on PATH (no Docker daemon needed).\n// The deploy token is scoped to one app + builder/wg, with `else: deny`\n// — it cannot deploy or read anything else in the InsForge Fly org.\nexport function registerComputeDeployCommand(computeCmd: Command): void {\n computeCmd\n .command('deploy [dir]')\n .description(\n 'Deploy a compute service. Two modes:\\n' +\n ' compute deploy <dir> --name <name> (source mode — flyctl remote build + push, requires flyctl on PATH; no Docker needed)\\n' +\n ' compute deploy --image <url> --name <name> (image mode — deploys pre-built image, no flyctl/Docker required)'\n )\n .requiredOption('--name <name>', 'Service name (DNS-safe, e.g. my-api)')\n .option('--image <url>', 'Pre-built image URL (image mode)')\n .option('--port <port>', 'Container port', '8080')\n .option(\n '--cpu <tier>',\n 'CPU tier in <kind>-<N>x format (e.g. shared-1x, performance-2x)',\n 'shared-1x'\n )\n .option('--memory <mb>', 'Memory in MB', '512')\n .option('--region <region>', 'Fly.io region', 'iad')\n .option('--env <json>', 'Env vars as JSON object')\n .action(async (dir: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (dir && opts.image) {\n throw new CLIError('Cannot use both [dir] and --image — pick one mode.');\n }\n if (!dir && !opts.image) {\n throw new CLIError(\n 'Must provide either [dir] (source mode) or --image <url> (image mode).'\n );\n }\n\n // Shared validation\n const port = Number(opts.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new CLIError(`Invalid --port: ${opts.port}`);\n }\n const memory = Number(opts.memory);\n if (!Number.isInteger(memory) || memory <= 0) {\n throw new CLIError(`Invalid --memory: ${opts.memory}`);\n }\n let envVars: Record<string, string> | undefined;\n if (opts.env) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new CLIError('--env must be a JSON object like {\"KEY\":\"value\"}');\n }\n for (const [k, v] of Object.entries(parsed)) {\n if (typeof v !== 'string') {\n throw new CLIError(\n `--env values must be strings — got ${typeof v} for key \"${k}\"`\n );\n }\n }\n envVars = parsed as Record<string, string>;\n }\n\n const baseBody: Record<string, unknown> = {\n name: opts.name,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) baseBody.envVars = envVars;\n\n // ─── Image mode ─────────────────────────────────────────────────\n if (!dir) {\n const body: Record<string, unknown> = { ...baseBody, imageUrl: opts.image };\n\n // List → find by name → POST or PATCH\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{ id: string; name: string }>).find(\n (s) => s.name === opts.name\n );\n\n let res;\n if (existing) {\n if (!json) outputInfo(`Found existing service \"${opts.name}\", updating...`);\n const updateBody: Record<string, unknown> = { ...body };\n delete updateBody.name;\n res = await ossFetch(`/api/compute/services/${encodeURIComponent(existing.id)}`, {\n method: 'PATCH',\n body: JSON.stringify(updateBody),\n });\n } else {\n res = await ossFetch('/api/compute/services', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n const service = (await res.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n }\n await reportCliUsage('cli.compute.deploy', true);\n return;\n }\n\n // ─── Source mode (Path A) ───────────────────────────────────────\n const absDir = resolve(dir);\n const dockerfilePath = join(absDir, 'Dockerfile');\n if (!existsSync(dockerfilePath)) {\n throw new CLIError(\n `No Dockerfile at ${dockerfilePath}.\\n` +\n ` Either:\\n` +\n ` • Create one (ask your AI agent — see the insforge-cli skill)\\n` +\n ` • Use --image <url> to deploy a pre-built image instead`\n );\n }\n ensureFlyctlAvailable();\n\n if (!json) outputInfo(`Detected Dockerfile at ${dockerfilePath}`);\n\n // 1. Resolve service: list → find by name → /deploy if missing\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{\n id: string;\n name: string;\n flyAppId?: string | null;\n }>).find((s) => s.name === opts.name);\n\n let serviceId: string;\n let flyAppId: string;\n if (existing) {\n if (!existing.flyAppId) {\n throw new CLIError(\n `Service \"${opts.name}\" exists but has no Fly app yet. Delete it and redeploy.`\n );\n }\n serviceId = existing.id;\n flyAppId = existing.flyAppId;\n if (!json) outputInfo(`Found existing service \"${opts.name}\" (${flyAppId}), updating...`);\n } else {\n if (!json) outputInfo(`Creating service \"${opts.name}\"...`);\n const prepareRes = await ossFetch('/api/compute/services/deploy', {\n method: 'POST',\n body: JSON.stringify(baseBody),\n });\n const prepared = (await prepareRes.json()) as {\n id: string;\n flyAppId: string;\n };\n serviceId = prepared.id;\n flyAppId = prepared.flyAppId;\n if (!json) outputInfo(`Created Fly app ${flyAppId}`);\n }\n\n // 2. Mint per-app deploy token (20-min TTL, scoped to this app only)\n if (!json) outputInfo('Requesting deploy token...');\n const tokenRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}/deploy-token`,\n { method: 'POST' }\n );\n const tokenJson = (await tokenRes.json()) as { token: string; expirySeconds: number };\n\n // 3. Remote build + push (no local Docker daemon needed).\n // flyctl ships the build context to Fly's remote builder, builds\n // there, and pushes to registry.fly.io/<app>:<tag> using the\n // attenuated FLY_API_TOKEN we just received.\n const imageLabel = `cli-${Date.now()}`;\n if (!json) outputInfo(`Building & pushing on Fly remote builder...`);\n const { imageRef } = await flyctlBuildAndPush({\n dir: absDir,\n appId: flyAppId,\n imageLabel,\n token: tokenJson.token,\n });\n\n // 4. Tell cloud the image is ready — launches new machine or\n // updates existing one. PATCH includes any deploy-affecting\n // field changes (port/cpu/memory/envVars/region) too.\n if (!json) outputInfo('Launching machine...');\n const updateBody: Record<string, unknown> = {\n imageUrl: imageRef,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) updateBody.envVars = envVars;\n\n const finalRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}`,\n { method: 'PATCH', body: JSON.stringify(updateBody) }\n );\n const service = (await finalRes.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n console.log(` Image: ${imageRef} (built remotely; no local image to clean up)`);\n }\n\n await reportCliUsage('cli.compute.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.compute.deploy', false);\n handleError(err, json);\n }\n });\n}\n","// flyctl helpers for compute v3.2 source-deploy. Path A — refined:\n// the CLI shells out to `flyctl deploy --remote-only --build-only --push`\n// using a per-app deploy token minted by the cloud. Build runs on Fly's\n// remote builder; the resulting image is pushed straight to registry.fly.io.\n// No local Docker daemon required — the user only needs the single flyctl\n// binary on their PATH.\n//\n// Token shape: short-lived (~20 min) macaroon attenuated to one app +\n// builder/wg features, with `else: deny`. It can deploy to that one app and\n// nothing else, even within the InsForge Fly org.\n\nimport { spawn, spawnSync } from 'node:child_process';\nimport { CLIError } from './errors.js';\n\nexport function ensureFlyctlAvailable(): void {\n const r = spawnSync('flyctl', ['version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n if (r.error || r.status !== 0) {\n throw new CLIError(\n 'flyctl is required for source-mode deploy.\\n' +\n ' • Install: curl -L https://fly.io/install.sh | sh\\n' +\n ' • Or use --image <pre-built-image> instead.\\n' +\n (r.stderr ? ` Detail: ${r.stderr.trim().slice(0, 200)}` : '')\n );\n }\n}\n\nexport interface FlyctlBuildPushOptions {\n dir: string;\n appId: string; // Fly app name, e.g. \"my-svc-<projectId>\"\n imageLabel: string; // tag suffix; only used as buildkit's --image-label.\n token: string; // attenuated FlyV1 deploy token from cloud /deploy-token\n}\n\n/**\n * Run `flyctl deploy --remote-only --build-only --push` against the user's\n * source directory. Builds on Fly's remote builder, pushes to registry.fly.io,\n * and returns the resulting image ref. Does NOT launch a machine — the cloud\n * backend handles that step (it owns DB state and quota enforcement).\n *\n * IMPORTANT: returns the **digest-pinned** ref `<app>@sha256:<digest>`, not\n * the tag-based `<app>:<label>` ref. buildkit's `--build-only --push` lands\n * the manifest in the remote builder's namespace, and Fly's registry then\n * aliases the user-app namespace to it by content digest. The bare tag does\n * not always resolve (and racily fails on Fly's side as MANIFEST_UNKNOWN),\n * but the digest always does. The cloud's launchMachine accepts either form.\n *\n * The user's directory only needs a Dockerfile. flyctl will invent a fly.toml\n * if none exists.\n */\nexport function flyctlBuildAndPush(\n opts: FlyctlBuildPushOptions\n): Promise<{ imageRef: string }> {\n return new Promise<{ imageRef: string }>((resolve, reject) => {\n const child = spawn(\n 'flyctl',\n [\n 'deploy',\n '--remote-only',\n '--build-only',\n '--push',\n '--app',\n opts.appId,\n '--image-label',\n opts.imageLabel,\n '--no-cache',\n ],\n {\n cwd: opts.dir,\n env: { ...process.env, FLY_API_TOKEN: opts.token },\n stdio: ['inherit', 'pipe', 'pipe'],\n }\n );\n\n // Tee child's stdout+stderr to our own (so the user sees buildkit\n // progress in real time) AND capture them so we can parse the digest.\n let captured = '';\n child.stdout?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stdout.write(s);\n });\n child.stderr?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stderr.write(s);\n });\n child.on('error', (err) => {\n reject(new CLIError(`flyctl deploy could not start: ${err.message}`));\n });\n child.on('exit', (code) => {\n if (code !== 0) {\n return reject(\n new CLIError(`flyctl deploy --build-only failed (exit ${code}). See output above.`)\n );\n }\n // buildkit emits \"pushing manifest for registry.fly.io/<app>:<label>@sha256:<digest>\"\n // when the upload lands. Pin to that digest so the cloud's machine API\n // can resolve unambiguously regardless of registry tag-aliasing races.\n const m = captured.match(/pushing manifest for registry\\.fly\\.io\\/[^\\s]+@(sha256:[0-9a-f]+)/);\n if (!m) {\n return reject(\n new CLIError(\n 'flyctl deploy succeeded but the buildkit \"pushing manifest\" line was not found. ' +\n 'Cannot determine image digest — please re-run with FLY_LOG_LEVEL=debug and report.'\n )\n );\n }\n resolve({ imageRef: `registry.fly.io/${opts.appId}@${m[1]}` });\n });\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nconst VALID_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\nconst SOURCE_LOOKUP = new Map(VALID_SOURCES.map((s) => [s.toLowerCase(), s]));\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nexport function registerLogsCommand(program: Command): void {\n program\n .command('logs <source>')\n .description('Fetch backend container logs (insforge.logs | postgREST.logs | postgres.logs | function.logs | function-deploy.logs)')\n .option('--limit <n>', 'Number of log entries to return', '20')\n .action(async (source: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const resolved = SOURCE_LOOKUP.get(source.toLowerCase());\n if (!resolved) {\n throw new CLIError(`Invalid log source \"${source}\". Valid sources: ${VALID_SOURCES.join(', ')}`);\n }\n\n const limit = parseInt(opts.limit, 10) || 20;\n const res = await ossFetch(getLogPath(resolved, limit));\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n const logs = Array.isArray(data) ? data : (data as Record<string, unknown>).logs;\n if (!Array.isArray(logs) || !logs.length) {\n console.log('No logs found.');\n return;\n }\n for (const entry of logs) {\n if (typeof entry === 'string') {\n console.log(entry);\n } else {\n const e = entry as Record<string, unknown>;\n const ts = e.timestamp ?? e.time ?? '';\n const msg = e.message ?? e.msg ?? e.log ?? JSON.stringify(e);\n console.log(`${ts} ${msg}`);\n }\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { AppMetadataSchema } from '@insforge/shared-schemas';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nexport function registerMetadataCommand(program: Command): void {\n program\n .command('metadata')\n .description('Show backend metadata (auth, database, buckets, edge functions, realtime, AI models)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/metadata');\n const data = await res.json() as AppMetadataSchema;\n\n if (json) {\n outputJson(data);\n return;\n }\n\n // Auth\n console.log('\\n Auth');\n console.log(` OAuth Providers: ${data.auth.oAuthProviders.length ? data.auth.oAuthProviders.join(', ') : '(none)'}`);\n console.log(` Email Verification: ${data.auth.requireEmailVerification ? 'Yes' : 'No'}`);\n console.log(` Password Policy:`);\n console.log(` Min Length: ${data.auth.passwordMinLength}, requireLowercase: ${data.auth.requireLowercase}, requireNumber: ${data.auth.requireNumber}, requireSpecialChar: ${data.auth.requireSpecialChar}, requireUppercase: ${data.auth.requireUppercase}`);\n console.log(` Verify Email Method: ${data.auth.verifyEmailMethod}`);\n console.log(` Reset Password Method: ${data.auth.resetPasswordMethod}`);\n\n // Database\n console.log('\\n Database');\n console.log(` Size: ${formatSize(data.database.totalSizeInGB)}`);\n if (data.database.tables.length) {\n outputTable(\n ['Table', 'Records'],\n data.database.tables.map((t) => [t.tableName, String(t.recordCount)]),\n );\n } else {\n console.log(' No tables.');\n }\n\n // Storage\n console.log('\\n Storage');\n console.log(` Size: ${formatSize(data.storage.totalSizeInGB)}`);\n if (data.storage.buckets.length) {\n outputTable(\n ['Bucket', 'Public', 'Objects'],\n data.storage.buckets.map((b) => [b.name, b.public ? 'Yes' : 'No', String(b.objectCount ?? '-')]),\n );\n } else {\n console.log(' No buckets.');\n }\n\n // Functions\n console.log('\\n Functions');\n if (data.functions.length) {\n outputTable(\n ['Slug', 'Name', 'Status', 'Description'],\n data.functions.map((f) => [f.slug, f.name, f.status, f.description || '-']),\n );\n } else {\n console.log(' No functions deployed.');\n }\n\n // AI\n if (data.aiIntegration?.models?.length) {\n console.log('\\n AI Models');\n outputTable(\n ['Model', 'Input', 'Output'],\n data.aiIntegration.models.map((m) => [\n m.modelId,\n m.inputModality.join(', '),\n m.outputModality.join(', '),\n ]),\n );\n }\n\n // Realtime\n if (data.realtime?.channels && Array.isArray(data.realtime.channels) && data.realtime.channels.length) {\n console.log(`\\n Realtime: ${data.realtime.channels.length} channel(s)`);\n outputTable(\n ['Id', 'Pattern', 'Webhook URLs', 'Enabled', 'Description'],\n data.realtime.channels.map((c) => [c.id, c.pattern, c.webhookUrls?.join(', ') || '-', c.enabled ? 'Yes' : 'No', c.description || '-']),\n );\n }\n\n // Version\n if (data.version) {\n console.log(`\\n Version: ${data.version}`);\n }\n\n console.log('');\n await reportCliUsage('cli.metadata', true);\n } catch (err) {\n await reportCliUsage('cli.metadata', false);\n handleError(err, json);\n }\n });\n}\n\nfunction formatSize(gb: number): string {\n if (gb < 0.001) return `${(gb * 1024 * 1024).toFixed(1)} KB`;\n if (gb < 1) return `${(gb * 1024).toFixed(2)} MB`;\n return `${gb.toFixed(2)} GB`;\n}\n","import type { Command } from 'commander';\nimport * as os from 'node:os';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\nimport { streamDiagnosticAnalysis, rateDiagnosticSession } from '../../lib/api/platform.js';\n\nimport { fetchMetricsSummary, registerDiagnoseMetricsCommand } from './metrics.js';\nimport { fetchAdvisorSummary, registerDiagnoseAdvisorCommand } from './advisor.js';\nimport { runDbChecks, registerDiagnoseDbCommand } from './db.js';\nimport { fetchLogsSummary, registerDiagnoseLogsCommand } from './logs.js';\n\nfunction sectionHeader(title: string): string {\n return `── ${title} ${'─'.repeat(Math.max(0, 44 - title.length))}`;\n}\n\ninterface DiagnosticContext {\n metrics: unknown | null;\n advisor: unknown | null;\n db: unknown | null;\n logs: unknown | null;\n errors: string[];\n}\n\nasync function collectDiagnosticData(\n projectId: string,\n ossMode: boolean,\n apiUrl?: string,\n): Promise<DiagnosticContext> {\n const metricsPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchMetricsSummary(projectId, apiUrl);\n const advisorPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchAdvisorSummary(projectId, apiUrl);\n\n const [metricsResult, advisorResult, dbResult, logsResult] = await Promise.allSettled([\n metricsPromise,\n advisorPromise,\n runDbChecks(),\n fetchLogsSummary(100),\n ]);\n\n const errors: string[] = [];\n let metrics: unknown | null = null;\n let advisor: unknown | null = null;\n let db: unknown | null = null;\n let logs: unknown | null = null;\n\n if (metricsResult.status === 'fulfilled') {\n const data = metricsResult.value;\n metrics = data.metrics\n .filter((m) => m.data.length > 0)\n .map((m) => {\n let sum = 0;\n let max = -Infinity;\n for (const d of m.data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return {\n metric: m.metric,\n latest: m.data[m.data.length - 1].value,\n avg: sum / m.data.length,\n max,\n };\n });\n } else {\n errors.push(metricsResult.reason?.message ?? 'Metrics unavailable');\n }\n\n if (advisorResult.status === 'fulfilled') {\n advisor = advisorResult.value;\n } else {\n errors.push(advisorResult.reason?.message ?? 'Advisor unavailable');\n }\n\n if (dbResult.status === 'fulfilled') {\n db = dbResult.value;\n } else {\n errors.push(dbResult.reason?.message ?? 'DB checks unavailable');\n }\n\n if (logsResult.status === 'fulfilled') {\n logs = logsResult.value;\n } else {\n errors.push(logsResult.reason?.message ?? 'Logs unavailable');\n }\n\n return { metrics, advisor, db, logs, errors };\n}\n\nexport function registerDiagnoseCommands(diagnoseCmd: Command): void {\n // Comprehensive report (no subcommand)\n diagnoseCmd\n .description('Backend diagnostics — run with no subcommand for a full health report')\n .option('--ai <question>', 'Ask AI to analyze your diagnostic data (1-2000 chars)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n const usageEvent = opts.ai ? 'cli.diagnose.ai' : 'cli.diagnose';\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const projectId = config.project_id;\n const projectName = config.project_name;\n const ossMode = config.project_id === FAKE_PROJECT_ID;\n trackDiagnose(opts.ai ? 'ai' : 'report', config);\n\n // AI analysis mode\n if (opts.ai) {\n const question = String(opts.ai).trim();\n if (question.length === 0 || question.length > 2000) {\n throw new CLIError('Question must be between 1 and 2000 characters.');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Collecting diagnostic data...');\n\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n const cliVersion = process.env.CLI_VERSION || 'unknown';\n\n s?.stop('Data collected');\n\n if (!json) {\n console.log(`\\n AI Diagnosis — ${projectName}\\n`);\n console.log(sectionHeader('Question'));\n console.log(` ${question}\\n`);\n console.log(sectionHeader('Analysis'));\n }\n\n let sessionId: string | undefined;\n let fullText = '';\n const jsonEvents: Record<string, unknown>[] = [];\n let streamError: CLIError | undefined;\n\n // Build context — transform collected data to match backend schema exactly\n const context: Record<string, unknown> = {\n context_version: 'diagnostic-v1',\n client_info: {\n cli_version: cliVersion,\n node_version: process.version,\n os: `${os.platform()} ${os.release()}`,\n },\n };\n if (Array.isArray(data.metrics) && data.metrics.length > 0) {\n context.metrics = data.metrics;\n }\n if (data.advisor) {\n // Spec only accepts: { summary, collectorErrors: string[] }\n const adv = data.advisor as Record<string, unknown>;\n const summary = adv.summary as Record<string, number> | undefined;\n const rawErrors = adv.collectorErrors as unknown[] | undefined;\n if (summary) {\n context.advisor = {\n summary: {\n total: summary.total ?? 0,\n critical: summary.critical ?? 0,\n warning: summary.warning ?? 0,\n info: summary.info ?? 0,\n },\n collectorErrors: rawErrors?.map((e) =>\n typeof e === 'string' ? e : JSON.stringify(e),\n ) ?? [],\n };\n }\n }\n if (data.db) {\n // Stringify all values to match spec (active: string, dead_tuples: string, etc.)\n const rawDb = data.db as Record<string, Record<string, unknown>[]>;\n const safeDb: Record<string, Record<string, unknown>[]> = {};\n for (const [key, rows] of Object.entries(rawDb)) {\n safeDb[key] = rows.map((row) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = (v === null || v === undefined) ? '' : String(v);\n }\n return out;\n });\n }\n if (Object.keys(safeDb).length > 0) {\n context.db = safeDb;\n }\n }\n if (Array.isArray(data.logs) && data.logs.length > 0) {\n // Spec: { source: string, total: integer, errors: [{timestamp, message, source}] }\n context.logs = (data.logs as { source: string; total: number; errors: { timestamp: string; message: string; source: string }[] }[])\n .map((s) => ({\n source: s.source,\n total: s.total,\n errors: s.errors.map((e) => ({\n timestamp: e.timestamp ?? '',\n message: e.message ?? '',\n source: e.source ?? '',\n })),\n }));\n }\n\n await streamDiagnosticAnalysis({\n project_id: projectId,\n question,\n context,\n } as Parameters<typeof streamDiagnosticAnalysis>[0], (event) => {\n // Capture sessionId and errors before any early return\n if (event.type === 'done') {\n sessionId = event.data.session_id as string | undefined;\n }\n if (event.type === 'error') {\n streamError = new CLIError(String(event.data.message ?? 'Unknown diagnostic error'));\n }\n\n if (json) {\n jsonEvents.push({ type: event.type, ...event.data });\n return;\n }\n\n switch (event.type) {\n case 'delta':\n process.stdout.write(String(event.data.text ?? ''));\n fullText += String(event.data.text ?? '');\n break;\n case 'tool_call':\n console.log(`\\n [calling ${event.data.tool_name}...]`);\n break;\n case 'tool_result':\n // silently consume tool results\n break;\n case 'done':\n break;\n case 'error':\n console.error(`\\n Error: ${streamError?.message ?? 'Unknown error'}`);\n break;\n }\n }, apiUrl);\n\n if (streamError) {\n throw streamError;\n }\n\n if (!json) {\n // Ensure newline after streamed text\n if (fullText && !fullText.endsWith('\\n')) console.log('');\n console.log('');\n }\n\n if (json) {\n outputJson({ sessionId, events: jsonEvents });\n }\n\n // Optional rating prompt (interactive only)\n if (!json && sessionId) {\n const ratingChoice = await prompts.select<string>({\n message: 'Was this analysis helpful?',\n options: [\n { value: 'skip', label: 'Skip', hint: 'no rating' },\n { value: 'helpful', label: 'Helpful', hint: 'solved or pointed in right direction' },\n { value: 'not_helpful', label: 'Not helpful', hint: 'didn\\'t apply to the problem' },\n { value: 'incorrect', label: 'Incorrect', hint: 'diagnosis was wrong or misleading' },\n ],\n });\n\n if (!prompts.isCancel(ratingChoice) && ratingChoice !== 'skip') {\n try {\n await rateDiagnosticSession(\n sessionId,\n ratingChoice as 'helpful' | 'not_helpful' | 'incorrect',\n undefined,\n apiUrl,\n );\n clack.log.success('Thanks for your feedback!');\n } catch {\n clack.log.warn('Failed to submit rating.');\n }\n }\n }\n\n await reportCliUsage(usageEvent, true);\n return;\n }\n\n // Standard report mode\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n if (json) {\n outputJson({ project: projectName, ...data });\n } else {\n console.log(`\\n InsForge Health Report — ${projectName}\\n`);\n\n // Metrics section\n console.log(sectionHeader('System Metrics (last 1h)'));\n if (data.metrics) {\n const metricsArr = data.metrics as { metric: string; latest: number }[];\n if (metricsArr.length === 0) {\n console.log(' No metrics data available.');\n } else {\n const vals: Record<string, number> = {};\n for (const m of metricsArr) {\n vals[m.metric] = m.latest;\n }\n const cpu = vals.cpu_usage !== undefined ? `${vals.cpu_usage.toFixed(1)}%` : 'N/A';\n const mem = vals.memory_usage !== undefined ? `${vals.memory_usage.toFixed(1)}%` : 'N/A';\n const disk = vals.disk_usage !== undefined ? `${vals.disk_usage.toFixed(1)}%` : 'N/A';\n const netIn = vals.network_in !== undefined ? formatBytesCompact(vals.network_in) + '/s' : 'N/A';\n const netOut = vals.network_out !== undefined ? formatBytesCompact(vals.network_out) + '/s' : 'N/A';\n console.log(` CPU: ${cpu} Memory: ${mem}`);\n console.log(` Disk: ${disk} Network: ↓${netIn} ↑${netOut}`);\n }\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Metrics') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // Advisor section\n console.log('\\n' + sectionHeader('Advisor Scan'));\n if (data.advisor) {\n const scan = data.advisor as { scannedAt: string; status: string; summary: { critical: number; warning: number; info: number } };\n const date = new Date(scan.scannedAt).toLocaleDateString();\n console.log(` ${date} (${scan.status}) — ${scan.summary.critical} critical · ${scan.summary.warning} warning · ${scan.summary.info} info`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Advisor') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // DB section\n console.log('\\n' + sectionHeader('Database'));\n if (data.db) {\n const db = data.db as Record<string, Record<string, unknown>[]>;\n const conn = db.connections?.[0];\n const cache = db['cache-hit']?.[0];\n const deadTuples = (db.bloat ?? []).reduce(\n (sum: number, r: Record<string, unknown>) => sum + (Number(r.dead_tuples) || 0),\n 0,\n );\n const lockCount = (db.locks ?? []).length;\n\n console.log(\n ` Connections: ${conn?.active ?? '?'}/${conn?.max ?? '?'} Cache Hit: ${cache?.ratio ?? '?'}%`,\n );\n console.log(\n ` Dead tuples: ${deadTuples.toLocaleString()} Locks waiting: ${lockCount}`,\n );\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('DB')) ?? 'unavailable'}`);\n }\n\n // Logs section\n console.log('\\n' + sectionHeader('Recent Errors (last 100 logs/source)'));\n if (data.logs) {\n const summaries = data.logs as { source: string; errors: unknown[] }[];\n const parts = summaries.map((s) => `${s.source}: ${s.errors.length}`);\n console.log(` ${parts.join(' ')}`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Logs')) ?? 'unavailable'}`);\n }\n\n console.log('');\n }\n await reportCliUsage(usageEvent, true);\n } catch (err) {\n await reportCliUsage(usageEvent, false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n\n // Register subcommands\n registerDiagnoseMetricsCommand(diagnoseCmd);\n registerDiagnoseAdvisorCommand(diagnoseCmd);\n registerDiagnoseDbCommand(diagnoseCmd);\n registerDiagnoseLogsCommand(diagnoseCmd);\n}\n\nfunction formatBytesCompact(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(0)}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface MetricDataPoint {\n timestamp: number;\n value: number;\n}\n\ninterface MetricSeries {\n metric: string;\n instance_id: string;\n data: MetricDataPoint[];\n}\n\ninterface MetricsResponse {\n project_id: string;\n range: string;\n metrics: MetricSeries[];\n _meta?: { requested_at: string; query_time_ms: number; cached: boolean };\n}\n\nconst METRIC_LABELS: Record<string, string> = {\n cpu_usage: 'CPU Usage',\n memory_usage: 'Memory Usage',\n disk_usage: 'Disk Usage',\n network_in: 'Network In',\n network_out: 'Network Out',\n};\n\nconst NETWORK_METRICS = new Set(['network_in', 'network_out']);\n\nfunction formatValue(metric: string, value: number): string {\n if (NETWORK_METRICS.has(metric)) {\n return formatBytes(value) + '/s';\n }\n return `${value.toFixed(1)}%`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(1)} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction computeStats(data: MetricDataPoint[]): { latest: number; avg: number; max: number } {\n if (data.length === 0) return { latest: 0, avg: 0, max: 0 };\n const latest = data[data.length - 1].value;\n let sum = 0;\n let max = -Infinity;\n for (const d of data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return { latest, avg: sum / data.length, max };\n}\n\n/**\n * Aggregate multiple series of the same metric (e.g. multiple network interfaces)\n * into a single series per metric name. Network metrics are summed; others take the first series.\n */\nfunction aggregateByMetric(series: MetricSeries[]): MetricSeries[] {\n const grouped = new Map<string, MetricSeries[]>();\n for (const s of series) {\n const existing = grouped.get(s.metric);\n if (existing) existing.push(s);\n else grouped.set(s.metric, [s]);\n }\n\n const result: MetricSeries[] = [];\n for (const [metric, group] of grouped) {\n if (group.length === 1 || !NETWORK_METRICS.has(metric)) {\n result.push(group[0]);\n continue;\n }\n // Sum network metrics across interfaces by matching timestamps\n const tsMap = new Map<number, number>();\n for (const s of group) {\n for (const d of s.data) {\n tsMap.set(d.timestamp, (tsMap.get(d.timestamp) ?? 0) + d.value);\n }\n }\n const merged: MetricDataPoint[] = [...tsMap.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([timestamp, value]) => ({ timestamp, value }));\n result.push({ metric, instance_id: 'aggregate', data: merged });\n }\n return result;\n}\n\nexport async function fetchMetricsSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<MetricsResponse> {\n const res = await platformFetch(`/projects/v1/${projectId}/metrics?range=1h`, {}, apiUrl);\n return (await res.json()) as MetricsResponse;\n}\n\nexport function registerDiagnoseMetricsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('metrics')\n .description('Display EC2 instance metrics (CPU, memory, disk, network)')\n .option('--range <range>', 'Time range: 1h, 6h, 24h, 7d', '1h')\n .option('--metrics <list>', 'Comma-separated metrics to query')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Metrics requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('metrics', config);\n\n const params = new URLSearchParams({ range: opts.range });\n if (opts.metrics) params.set('metrics', opts.metrics);\n\n const res = await platformFetch(\n `/projects/v1/${config.project_id}/metrics?${params.toString()}`,\n {},\n apiUrl,\n );\n const data = (await res.json()) as MetricsResponse;\n\n const aggregated = aggregateByMetric(data.metrics);\n\n if (json) {\n const enriched = {\n ...data,\n metrics: aggregated.map((m) => {\n const stats = computeStats(m.data);\n return { ...m, latest: stats.latest, avg: stats.avg, max: stats.max };\n }),\n };\n outputJson(enriched);\n } else {\n if (!aggregated.length) {\n console.log('No metrics data available.');\n return;\n }\n const headers = ['Metric', 'Latest', 'Avg', 'Max', 'Range'];\n const rows = aggregated.map((m) => {\n const stats = computeStats(m.data);\n return [\n METRIC_LABELS[m.metric] ?? m.metric,\n formatValue(m.metric, stats.latest),\n formatValue(m.metric, stats.avg),\n formatValue(m.metric, stats.max),\n data.range,\n ];\n });\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.metrics', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.metrics', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\n\ninterface AdvisorScanSummary {\n scanId: string;\n status: string;\n scanType: string;\n scannedAt: string;\n summary: { total: number; critical: number; warning: number; info: number };\n collectorErrors: { collector: string; error: string; timestamp: string }[];\n}\n\ninterface AdvisorIssue {\n id: string;\n ruleId: string;\n severity: string;\n category: string;\n title: string;\n description: string;\n affectedObject: string;\n recommendation: string;\n isResolved: boolean;\n}\n\ninterface AdvisorIssuesResponse {\n issues: AdvisorIssue[];\n total: number;\n}\n\nexport async function fetchAdvisorSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<AdvisorScanSummary> {\n const res = await platformFetch(`/projects/v1/${projectId}/advisor/latest`, {}, apiUrl);\n return (await res.json()) as AdvisorScanSummary;\n}\n\nexport function registerDiagnoseAdvisorCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('advisor')\n .description('Display latest advisor scan results and issues')\n .option('--severity <level>', 'Filter by severity: critical, warning, info')\n .option('--category <cat>', 'Filter by category: security, performance, health')\n .option('--limit <n>', 'Maximum number of issues to return', '50')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Advisor requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('advisor', config);\n\n const projectId = config.project_id;\n\n // Fetch scan summary\n const scanRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest`,\n {},\n apiUrl,\n );\n const scan = (await scanRes.json()) as AdvisorScanSummary;\n\n // Fetch issues\n const issueParams = new URLSearchParams();\n if (opts.severity) issueParams.set('severity', opts.severity);\n if (opts.category) issueParams.set('category', opts.category);\n issueParams.set('limit', opts.limit);\n\n const issuesRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest/issues?${issueParams.toString()}`,\n {},\n apiUrl,\n );\n const issuesData = (await issuesRes.json()) as AdvisorIssuesResponse;\n\n if (json) {\n outputJson({ scan, issues: issuesData.issues });\n } else {\n // Scan summary line\n const date = new Date(scan.scannedAt).toLocaleDateString();\n const s = scan.summary;\n console.log(\n `Scan: ${date} (${scan.status}) — ${s.critical} critical, ${s.warning} warning, ${s.info} info\\n`,\n );\n\n if (!issuesData.issues || issuesData.issues.length === 0) {\n console.log('No issues found.');\n return;\n }\n\n const headers = ['Severity', 'Category', 'Affected Object', 'Title'];\n const rows = issuesData.issues.map((issue) => [\n issue.severity,\n issue.category,\n issue.affectedObject,\n issue.title,\n ]);\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.advisor', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.advisor', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface DbCheck {\n label: string;\n sql: string;\n format: (rows: Record<string, unknown>[]) => void;\n}\n\nconst DB_CHECKS: Record<string, DbCheck> = {\n connections: {\n label: 'Connections',\n sql: `SELECT\n (SELECT count(*) FROM pg_stat_activity WHERE state IS NOT NULL) AS active,\n (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max`,\n format(rows) {\n const r = rows[0] ?? {};\n console.log(` Active: ${r.active} / ${r.max}`);\n },\n },\n 'slow-queries': {\n label: 'Slow Queries (>5s)',\n sql: `SELECT pid, now() - query_start AS duration, substring(query for 80) AS query\n FROM pg_stat_activity\n WHERE state = 'active' AND now() - query_start > interval '5 seconds'\n ORDER BY query_start ASC`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Duration', 'Query'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.duration ?? ''),\n String(r.query ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n bloat: {\n label: 'Table Bloat (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table, n_dead_tup AS dead_tuples\n FROM pg_stat_user_tables\n ORDER BY n_dead_tup DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Dead Tuples'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.dead_tuples ?? 0),\n ]);\n outputTable(headers, tableRows);\n },\n },\n size: {\n label: 'Table Sizes (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table,\n pg_size_pretty(pg_total_relation_size(relid)) AS size\n FROM pg_stat_user_tables\n ORDER BY pg_total_relation_size(relid) DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Size'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.size ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'index-usage': {\n label: 'Index Usage (worst 10)',\n sql: `SELECT schemaname || '.' || relname AS table, idx_scan, seq_scan,\n CASE WHEN (idx_scan + seq_scan) > 0\n THEN round(100.0 * idx_scan / (idx_scan + seq_scan), 1)\n ELSE 0 END AS idx_ratio\n FROM pg_stat_user_tables\n WHERE (idx_scan + seq_scan) > 0\n ORDER BY idx_ratio ASC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No scan data available.');\n return;\n }\n const headers = ['Table', 'Index Scans', 'Seq Scans', 'Index Ratio'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.idx_scan ?? 0),\n String(r.seq_scan ?? 0),\n `${r.idx_ratio ?? 0}%`,\n ]);\n outputTable(headers, tableRows);\n },\n },\n locks: {\n label: 'Waiting Locks',\n sql: `SELECT pid, mode, relation::regclass AS relation, granted\n FROM pg_locks\n WHERE NOT granted`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Mode', 'Relation', 'Granted'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.mode ?? ''),\n String(r.relation ?? ''),\n String(r.granted ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'cache-hit': {\n label: 'Cache Hit Ratio',\n sql: `SELECT CASE WHEN sum(heap_blks_hit + heap_blks_read) > 0\n THEN round(100.0 * sum(heap_blks_hit) / sum(heap_blks_hit + heap_blks_read), 1)\n ELSE 0 END AS ratio\n FROM pg_statio_user_tables`,\n format(rows) {\n const ratio = rows[0]?.ratio ?? 0;\n console.log(` ${ratio}%`);\n },\n },\n};\n\nconst ALL_CHECKS = Object.keys(DB_CHECKS);\n\nexport async function runDbChecks(): Promise<Record<string, Record<string, unknown>[]>> {\n const results: Record<string, Record<string, unknown>[]> = {};\n for (const key of ALL_CHECKS) {\n try {\n const { rows } = await runRawSql(DB_CHECKS[key].sql, true);\n results[key] = rows;\n } catch {\n results[key] = [];\n }\n }\n return results;\n}\n\nexport function registerDiagnoseDbCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('db')\n .description('Run database health checks (connections, bloat, index usage, etc.)')\n .option('--check <checks>', 'Comma-separated checks: ' + ALL_CHECKS.join(', '), 'all')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('db', config);\n\n const checkNames =\n opts.check === 'all'\n ? ALL_CHECKS\n : (opts.check as string).split(',').map((s: string) => s.trim());\n\n const results: Record<string, Record<string, unknown>[]> = {};\n\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) {\n console.error(`Unknown check: ${name}. Available: ${ALL_CHECKS.join(', ')}`);\n continue;\n }\n try {\n const { rows } = await runRawSql(check.sql, true);\n results[name] = rows;\n } catch (err) {\n results[name] = [];\n if (!json) {\n console.error(` Failed to run ${name}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n if (json) {\n outputJson(results);\n } else {\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) continue;\n console.log(`\\n── ${check.label} ${'─'.repeat(Math.max(0, 40 - check.label.length))}`);\n check.format(results[name] ?? []);\n }\n console.log('');\n }\n await reportCliUsage('cli.diagnose.db', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.db', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\nconst LOG_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\n\nconst ERROR_PATTERN = /\\b(error|fatal|panic)\\b/i;\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\ninterface LogEntry {\n timestamp: string;\n message: string;\n source: string;\n}\n\ninterface SourceSummary {\n source: string;\n total: number;\n errors: LogEntry[];\n}\n\nfunction parseLogEntry(entry: unknown): { ts: string; msg: string } {\n if (typeof entry === 'string') {\n return { ts: '', msg: entry };\n }\n const e = entry as Record<string, unknown>;\n const ts = String(e.timestamp ?? e.time ?? '');\n const msg = String(e.message ?? e.msg ?? e.log ?? JSON.stringify(e));\n return { ts, msg };\n}\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nasync function fetchSourceLogs(source: string, limit: number): Promise<SourceSummary> {\n const res = await ossFetch(getLogPath(source, limit));\n const data = await res.json();\n const logs = Array.isArray(data) ? data : ((data as Record<string, unknown>).logs as unknown[]) ?? [];\n\n const errors: LogEntry[] = [];\n for (const entry of logs) {\n const { ts, msg } = parseLogEntry(entry);\n if (ERROR_PATTERN.test(msg)) {\n errors.push({ timestamp: ts, message: msg, source });\n }\n }\n\n return { source, total: logs.length, errors };\n}\n\nexport async function fetchLogsSummary(limit = 100): Promise<SourceSummary[]> {\n const results: SourceSummary[] = [];\n for (const source of LOG_SOURCES) {\n try {\n results.push(await fetchSourceLogs(source, limit));\n } catch {\n results.push({ source, total: 0, errors: [] });\n }\n }\n return results;\n}\n\nexport function registerDiagnoseLogsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('logs')\n .description('Aggregate error-level logs from all backend sources')\n .option('--source <name>', 'Specific log source to check')\n .option('--limit <n>', 'Number of log entries per source', '100')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('logs', config);\n\n const limit = parseInt(opts.limit, 10) || 100;\n const sources = opts.source ? [opts.source as string] : [...LOG_SOURCES];\n\n const summaries: SourceSummary[] = [];\n for (const source of sources) {\n try {\n summaries.push(await fetchSourceLogs(source, limit));\n } catch {\n summaries.push({ source, total: 0, errors: [] });\n }\n }\n\n if (json) {\n outputJson({ sources: summaries });\n } else {\n // Summary table\n const headers = ['Source', 'Total', 'Errors'];\n const rows = summaries.map((s) => [s.source, String(s.total), String(s.errors.length)]);\n outputTable(headers, rows);\n\n // Error details\n const allErrors = summaries.flatMap((s) => s.errors);\n if (allErrors.length > 0) {\n console.log('\\n── Error Details ' + '─'.repeat(30));\n for (const err of allErrors) {\n const prefix = err.timestamp ? `[${err.source}] ${err.timestamp}` : `[${err.source}]`;\n console.log(`\\n ${prefix}`);\n console.log(` ${err.message}`);\n }\n console.log('');\n }\n }\n await reportCliUsage('cli.diagnose.logs', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.logs', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n"],"mappings":"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","names":["readFileSync","join","clack","resolve","isCancel","text","select","confirm","password","clack","URL","clack","URL","resolve","clack","confirm","isCancel","path","password","program","text","isCancel","password","program","program","orgsCmd","projectsCmd","select","isCancel","exec","promisify","fs","path","clack","pc","existsSync","readFileSync","join","clack","join","existsSync","readFileSync","exec","promisify","fs","path","clack","path","path","fs","createHash","clack","createHash","resolve","spinner","deploymentsCmd","execAsync","promisify","exec","program","select","isCancel","text","confirm","s","stat","execAsync","promisify","exec","buildOssHost","program","projectConfig","template","text","isCancel","pc","select","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","writeFileSync","dbCmd","writeFileSync","readFileSync","basename","dbCmd","readFileSync","basename","existsSync","readFileSync","writeFileSync","join","existsSync","mkdirSync","join","join","existsSync","mkdirSync","dbCmd","join","existsSync","writeFileSync","readFileSync","recordsCmd","path","recordsCmd","recordsCmd","recordsCmd","functionsCmd","readFileSync","existsSync","join","functionsCmd","join","existsSync","readFileSync","functionsCmd","text","functionsCmd","clack","functionsCmd","confirm","isCancel","storageCmd","readFileSync","existsSync","basename","storageCmd","existsSync","readFileSync","basename","writeFileSync","join","basename","storageCmd","join","basename","writeFileSync","storageCmd","storageCmd","confirm","isCancel","storageCmd","program","program","deploymentsCmd","deploymentsCmd","deploymentsCmd","confirm","isCancel","deploymentsCmd","program","path","secretsCmd","secretsCmd","secretsCmd","secretsCmd","secretsCmd","confirm","isCancel","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","confirm","isCancel","schedulesCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","existsSync","join","resolve","resolve","computeCmd","listRes","existing","updateBody","service","resolve","join","existsSync","program","program","formatSize","clack","diagnoseCmd","diagnoseCmd","diagnoseCmd","SOURCE_PATH","getLogPath","diagnoseCmd","diagnoseCmd","data","s","select","isCancel","readFileSync","join","select","isCancel"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/prompts.ts","../src/lib/config.ts","../src/commands/login.ts","../src/lib/errors.ts","../src/lib/auth.ts","../src/lib/credentials.ts","../src/lib/api/platform.ts","../src/lib/output.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/orgs/list.ts","../src/commands/projects/list.ts","../src/commands/projects/link.ts","../src/lib/skills.ts","../src/lib/analytics.ts","../src/commands/create.ts","../src/lib/api/oss.ts","../src/lib/env.ts","../src/commands/deployments/deploy.ts","../src/commands/db/query.ts","../src/commands/db/tables.ts","../src/commands/db/functions.ts","../src/commands/db/indexes.ts","../src/commands/db/policies.ts","../src/commands/db/triggers.ts","../src/commands/db/rpc.ts","../src/commands/db/export.ts","../src/commands/db/import.ts","../src/commands/db/migrations.ts","../src/lib/migrations.ts","../src/commands/records/list.ts","../src/commands/records/create.ts","../src/commands/records/update.ts","../src/commands/records/delete.ts","../src/commands/functions/list.ts","../src/commands/functions/deploy.ts","../src/commands/functions/invoke.ts","../src/commands/functions/code.ts","../src/commands/functions/delete.ts","../src/commands/storage/buckets.ts","../src/commands/storage/upload.ts","../src/commands/storage/download.ts","../src/commands/storage/create-bucket.ts","../src/commands/storage/delete-bucket.ts","../src/commands/storage/list-objects.ts","../src/commands/info.ts","../src/commands/list.ts","../src/commands/deployments/list.ts","../src/commands/deployments/status.ts","../src/commands/deployments/cancel.ts","../src/commands/deployments/env-vars.ts","../src/commands/docs.ts","../src/commands/secrets/list.ts","../src/commands/secrets/get.ts","../src/commands/secrets/add.ts","../src/commands/secrets/update.ts","../src/commands/secrets/delete.ts","../src/commands/schedules/list.ts","../src/commands/schedules/get.ts","../src/commands/schedules/create.ts","../src/commands/schedules/update.ts","../src/commands/schedules/delete.ts","../src/commands/schedules/logs.ts","../src/commands/compute/list.ts","../src/commands/compute/get.ts","../src/commands/compute/update.ts","../src/commands/compute/delete.ts","../src/commands/compute/start.ts","../src/commands/compute/stop.ts","../src/commands/compute/logs.ts","../src/commands/compute/deploy.ts","../src/lib/flyctl.ts","../src/commands/logs.ts","../src/commands/metadata.ts","../src/commands/diagnose/index.ts","../src/commands/diagnose/metrics.ts","../src/commands/diagnose/advisor.ts","../src/commands/diagnose/db.ts","../src/commands/diagnose/logs.ts","../src/lib/api/payments.ts","../src/commands/payments/utils.ts","../src/commands/payments/catalog.ts","../src/commands/payments/config.ts","../src/commands/payments/history.ts","../src/commands/payments/prices.ts","../src/commands/payments/products.ts","../src/commands/payments/status.ts","../src/commands/payments/subscriptions.ts","../src/commands/payments/sync.ts","../src/commands/payments/webhooks.ts","../src/commands/payments/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './lib/prompts.js';\nimport { getCredentials, getProjectConfig } from './lib/config.js';\nimport { registerLoginCommand } from './commands/login.js';\nimport { registerLogoutCommand } from './commands/logout.js';\nimport { registerWhoamiCommand } from './commands/whoami.js';\nimport { registerOrgsCommands } from './commands/orgs/list.js';\nimport { registerProjectsCommands } from './commands/projects/list.js';\nimport { registerProjectLinkCommand } from './commands/projects/link.js';\nimport { registerDbCommands } from './commands/db/query.js';\nimport { registerDbTablesCommand } from './commands/db/tables.js';\nimport { registerDbFunctionsCommand } from './commands/db/functions.js';\nimport { registerDbIndexesCommand } from './commands/db/indexes.js';\nimport { registerDbPoliciesCommand } from './commands/db/policies.js';\nimport { registerDbTriggersCommand } from './commands/db/triggers.js';\nimport { registerDbRpcCommand } from './commands/db/rpc.js';\nimport { registerDbExportCommand } from './commands/db/export.js';\nimport { registerDbImportCommand } from './commands/db/import.js';\nimport { registerDbMigrationsCommand } from './commands/db/migrations.js';\nimport { registerRecordsCommands } from './commands/records/list.js';\nimport { registerRecordsCreateCommand } from './commands/records/create.js';\nimport { registerRecordsUpdateCommand } from './commands/records/update.js';\nimport { registerRecordsDeleteCommand } from './commands/records/delete.js';\nimport { registerFunctionsCommands } from './commands/functions/list.js';\nimport { registerFunctionsDeployCommand } from './commands/functions/deploy.js';\nimport { registerFunctionsInvokeCommand } from './commands/functions/invoke.js';\nimport { registerFunctionsCodeCommand } from './commands/functions/code.js';\nimport { registerFunctionsDeleteCommand } from './commands/functions/delete.js';\nimport { registerStorageBucketsCommand } from './commands/storage/buckets.js';\nimport { registerStorageUploadCommand } from './commands/storage/upload.js';\nimport { registerStorageDownloadCommand } from './commands/storage/download.js';\nimport { registerStorageCreateBucketCommand } from './commands/storage/create-bucket.js';\nimport { registerStorageDeleteBucketCommand } from './commands/storage/delete-bucket.js';\nimport { registerStorageListObjectsCommand } from './commands/storage/list-objects.js';\nimport { registerCreateCommand } from './commands/create.js';\nimport { registerContextCommand } from './commands/info.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerDeploymentsDeployCommand } from './commands/deployments/deploy.js';\nimport { registerDeploymentsListCommand } from './commands/deployments/list.js';\nimport { registerDeploymentsStatusCommand } from './commands/deployments/status.js';\nimport { registerDeploymentsCancelCommand } from './commands/deployments/cancel.js';\nimport { registerDeploymentsEnvVarsCommand } from './commands/deployments/env-vars.js';\n\nimport { registerDocsCommand } from './commands/docs.js';\nimport { registerSecretsListCommand } from './commands/secrets/list.js';\nimport { registerSecretsGetCommand } from './commands/secrets/get.js';\nimport { registerSecretsAddCommand } from './commands/secrets/add.js';\nimport { registerSecretsUpdateCommand } from './commands/secrets/update.js';\nimport { registerSecretsDeleteCommand } from './commands/secrets/delete.js';\n\nimport { registerSchedulesListCommand } from './commands/schedules/list.js';\nimport { registerSchedulesGetCommand } from './commands/schedules/get.js';\nimport { registerSchedulesCreateCommand } from './commands/schedules/create.js';\nimport { registerSchedulesUpdateCommand } from './commands/schedules/update.js';\nimport { registerSchedulesDeleteCommand } from './commands/schedules/delete.js';\nimport { registerSchedulesLogsCommand } from './commands/schedules/logs.js';\n\nimport { registerComputeListCommand } from './commands/compute/list.js';\nimport { registerComputeGetCommand } from './commands/compute/get.js';\nimport { registerComputeUpdateCommand } from './commands/compute/update.js';\nimport { registerComputeDeleteCommand } from './commands/compute/delete.js';\nimport { registerComputeStartCommand } from './commands/compute/start.js';\nimport { registerComputeStopCommand } from './commands/compute/stop.js';\nimport { registerComputeLogsCommand } from './commands/compute/logs.js';\nimport { registerComputeDeployCommand } from './commands/compute/deploy.js';\n\nimport { registerLogsCommand } from './commands/logs.js';\nimport { registerMetadataCommand } from './commands/metadata.js';\nimport { registerDiagnoseCommands } from './commands/diagnose/index.js';\nimport { registerPaymentsCommands } from './commands/payments/index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')) as { version: string };\n\nconst INSFORGE_LOGO = `\n██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗\n██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝\n██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗\n██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝\n██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗\n╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝\n`;\n\nconst program = new Command();\n\nprogram\n .name('insforge')\n .description('InsForge CLI - Command line tool for InsForge platform')\n .version(pkg.version);\n\n// Global options\nprogram\n .option('--json', 'Output in JSON format')\n .option('--api-url <url>', 'Override Platform API URL')\n .option('-y, --yes', 'Skip confirmation prompts');\n\n// Top-level commands\nregisterLoginCommand(program);\nregisterLogoutCommand(program);\nregisterWhoamiCommand(program);\nregisterCreateCommand(program);\nregisterContextCommand(program);\nregisterListCommand(program);\nregisterDocsCommand(program);\nregisterProjectLinkCommand(program);\n\n// Orgs commands (hidden — use `insforge list` instead)\nconst orgsCmd = program.command('orgs', { hidden: true }).description('Manage organizations');\nregisterOrgsCommands(orgsCmd);\n\n// Projects commands (hidden — use `insforge list` instead)\nconst projectsCmd = program.command('projects', { hidden: true }).description('Manage projects');\nregisterProjectsCommands(projectsCmd);\n\n// Database commands\nconst dbCmd = program.command('db').description('Database operations');\nregisterDbCommands(dbCmd);\nregisterDbTablesCommand(dbCmd);\nregisterDbFunctionsCommand(dbCmd);\nregisterDbIndexesCommand(dbCmd);\nregisterDbPoliciesCommand(dbCmd);\nregisterDbTriggersCommand(dbCmd);\nregisterDbRpcCommand(dbCmd);\nregisterDbExportCommand(dbCmd);\nregisterDbImportCommand(dbCmd);\nregisterDbMigrationsCommand(dbCmd);\n\n// Records commands (hidden — do not use for now)\nconst recordsCmd = program.command('records', { hidden: true }).description('CRUD operations on table records');\nregisterRecordsCommands(recordsCmd);\nregisterRecordsCreateCommand(recordsCmd);\nregisterRecordsUpdateCommand(recordsCmd);\nregisterRecordsDeleteCommand(recordsCmd);\n\n// Functions commands\nconst functionsCmd = program.command('functions').description('Manage edge functions');\nregisterFunctionsCommands(functionsCmd);\nregisterFunctionsCodeCommand(functionsCmd);\nregisterFunctionsDeployCommand(functionsCmd);\nregisterFunctionsInvokeCommand(functionsCmd);\nregisterFunctionsDeleteCommand(functionsCmd);\n\n// Storage commands\nconst storageCmd = program.command('storage').description('Manage storage');\nregisterStorageBucketsCommand(storageCmd);\nregisterStorageCreateBucketCommand(storageCmd);\nregisterStorageDeleteBucketCommand(storageCmd);\nregisterStorageListObjectsCommand(storageCmd);\nregisterStorageUploadCommand(storageCmd);\nregisterStorageDownloadCommand(storageCmd);\n\n// Deployments commands\nconst deploymentsCmd = program.command('deployments').description('Deploy and manage frontend sites');\nregisterDeploymentsDeployCommand(deploymentsCmd);\nregisterDeploymentsListCommand(deploymentsCmd);\nregisterDeploymentsStatusCommand(deploymentsCmd);\nregisterDeploymentsCancelCommand(deploymentsCmd);\nregisterDeploymentsEnvVarsCommand(deploymentsCmd);\n// registerDeploymentsMetadataCommand(deploymentsCmd);\n// slug command doesn't work yet.\n// registerDeploymentsSlugCommand(deploymentsCmd);\n\n// Secrets commands\nconst secretsCmd = program.command('secrets').description('Manage secrets');\nregisterSecretsListCommand(secretsCmd);\nregisterSecretsGetCommand(secretsCmd);\nregisterSecretsAddCommand(secretsCmd);\nregisterSecretsUpdateCommand(secretsCmd);\nregisterSecretsDeleteCommand(secretsCmd);\n\n// Logs command\nregisterLogsCommand(program);\n\n// Metadata command\nregisterMetadataCommand(program);\n\n// Diagnose commands\nconst diagnoseCmd = program.command('diagnose');\nregisterDiagnoseCommands(diagnoseCmd);\n\n// Payments commands\nconst paymentsCmd = program.command('payments').description('Manage Stripe payments');\nregisterPaymentsCommands(paymentsCmd);\n\n// Compute commands\nconst computeCmd = program.command('compute').description('Manage compute services (Docker containers on Fly.io)');\nregisterComputeListCommand(computeCmd);\nregisterComputeGetCommand(computeCmd);\nregisterComputeDeployCommand(computeCmd);\nregisterComputeUpdateCommand(computeCmd);\nregisterComputeDeleteCommand(computeCmd);\nregisterComputeStartCommand(computeCmd);\nregisterComputeStopCommand(computeCmd);\nregisterComputeLogsCommand(computeCmd);\n\n// Schedules commands\nconst schedulesCmd = program.command('schedules').description('Manage scheduled tasks (cron jobs)');\nregisterSchedulesListCommand(schedulesCmd);\nregisterSchedulesGetCommand(schedulesCmd);\nregisterSchedulesCreateCommand(schedulesCmd);\nregisterSchedulesUpdateCommand(schedulesCmd);\nregisterSchedulesDeleteCommand(schedulesCmd);\nregisterSchedulesLogsCommand(schedulesCmd);\n\nif (process.argv.length <= 2 && process.stdout.isTTY) {\n await showInteractiveMenu();\n} else {\n program.parse();\n}\n\nasync function showInteractiveMenu(): Promise<void> {\n let isLoggedIn = false;\n let isLinked = false;\n\n try {\n isLoggedIn = !!getCredentials()?.access_token;\n } catch { /* corrupted credentials file */ }\n\n try {\n isLinked = !!getProjectConfig()?.project_id;\n } catch { /* no project config */ }\n\n console.log(INSFORGE_LOGO);\n clack.intro(`InsForge CLI v${pkg.version}`);\n\n type Action = 'login' | 'create' | 'link' | 'deploy' | 'docs' | 'help';\n const options: { value: Action; label: string; hint?: string }[] = [];\n\n if (!isLoggedIn) {\n options.push({ value: 'login', label: 'Log in to InsForge' });\n }\n\n options.push(\n { value: 'create', label: 'Create a new project', hint: isLoggedIn ? undefined : 'requires login' },\n { value: 'link', label: 'Link an existing project', hint: isLoggedIn ? undefined : 'requires login' },\n );\n\n if (isLinked) {\n options.push({ value: 'deploy', label: 'Deploy your project' });\n }\n\n options.push(\n { value: 'docs', label: 'View documentation' },\n { value: 'help', label: 'Show all commands' },\n );\n\n const action = await prompts.select<string>({\n message: 'What would you like to do?',\n options,\n });\n\n if (prompts.isCancel(action)) {\n clack.cancel('Bye!');\n process.exit(0);\n }\n\n switch (action) {\n case 'login':\n await program.parseAsync(['node', 'insforge', 'login']);\n break;\n case 'create':\n await program.parseAsync(['node', 'insforge', 'create']);\n break;\n case 'link':\n await program.parseAsync(['node', 'insforge', 'link']);\n break;\n case 'deploy':\n await program.parseAsync(['node', 'insforge', 'deployments', 'deploy']);\n break;\n case 'docs':\n await program.parseAsync(['node', 'insforge', 'docs']);\n break;\n case 'help':\n program.help();\n break;\n }\n}\n","import * as readline from 'node:readline';\nimport * as clack from '@clack/prompts';\n\nexport const isInteractive = !!(process.stdin.isTTY && process.stdout.isTTY);\n\n/**\n * A line reader that buffers parsed lines and exposes a pull-based readLine API.\n *\n * readline.promises.question() loses 'line' events that fire between question() calls,\n * and does not reject cleanly on stream close. A buffered queue handles both.\n */\nexport class LineReader {\n private queue: string[] = [];\n private waiter: ((line: string | null) => void) | null = null;\n private closed = false;\n private rl: readline.Interface;\n\n constructor(\n input: NodeJS.ReadableStream,\n private output: NodeJS.WritableStream,\n ) {\n this.rl = readline.createInterface({ input });\n this.rl.on('line', (line) => {\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(line);\n } else {\n this.queue.push(line);\n }\n });\n this.rl.on('close', () => {\n this.closed = true;\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(null);\n }\n });\n }\n\n async readLine(prompt: string): Promise<string | null> {\n this.output.write(prompt);\n if (this.queue.length > 0) return this.queue.shift()!;\n if (this.closed) return null;\n return new Promise((resolve) => {\n this.waiter = resolve;\n });\n }\n\n close(): void {\n this.rl.close();\n }\n}\n\nlet sharedReader: LineReader | null = null;\nfunction getReader(): LineReader {\n if (!sharedReader) {\n sharedReader = new LineReader(process.stdin, process.stdout);\n }\n return sharedReader;\n}\n\nexport const CANCEL: unique symbol = Symbol('prompt.cancel');\nexport type CancelSymbol = typeof CANCEL;\n\nexport function isCancel<T>(v: T | CancelSymbol): v is CancelSymbol {\n return v === CANCEL || clack.isCancel(v);\n}\n\nexport interface TextOptions {\n message: string;\n initialValue?: string;\n placeholder?: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport interface SelectOption<T> {\n value: T;\n label: string;\n hint?: string;\n}\n\nexport interface SelectOptions<T> {\n message: string;\n options: SelectOption<T>[];\n initialValue?: T;\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function text(opts: TextOptions): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.text({\n message: opts.message,\n initialValue: opts.initialValue,\n placeholder: opts.placeholder,\n validate: opts.validate,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyText(opts);\n}\n\nexport async function select<T>(opts: SelectOptions<T>): Promise<T | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.select({\n message: opts.message,\n options: opts.options as { value: T; label: string; hint?: string }[],\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result as T;\n }\n return nonTtySelect(opts);\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.confirm({\n message: opts.message,\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyConfirm(opts);\n}\n\nexport async function password(opts: { message: string }): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.password({ message: opts.message });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n // Non-TTY: can't mask input over a pipe, just read the line. Preserve whitespace\n // since it can be valid in passwords.\n return nonTtyText({ message: opts.message, trim: false });\n}\n\nexport async function nonTtyText(\n opts: TextOptions & { trim?: boolean },\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<string | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const shouldTrim = opts.trim ?? true;\n const defaultHint = opts.initialValue ? ` [${opts.initialValue}]` : '';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const normalized = shouldTrim ? raw.trim() : raw;\n const value = normalized === '' ? (opts.initialValue ?? '') : normalized;\n if (opts.validate) {\n const err = opts.validate(value);\n if (err) {\n stderr.write(` ${err}\\n`);\n continue;\n }\n }\n return value;\n }\n}\n\nexport async function nonTtySelect<T>(\n opts: SelectOptions<T>,\n io: { reader?: LineReader; stdout?: NodeJS.WritableStream; stderr?: NodeJS.WritableStream } = {},\n): Promise<T | CancelSymbol> {\n if (opts.options.length === 0) {\n throw new Error(`No options available for prompt \"${opts.message}\".`);\n }\n const reader = io.reader ?? getReader();\n const stdout = io.stdout ?? process.stdout;\n const stderr = io.stderr ?? process.stderr;\n stdout.write(`? ${opts.message}\\n`);\n opts.options.forEach((o, i) => {\n const hint = o.hint ? ` — ${o.hint}` : '';\n stdout.write(` ${i + 1}) ${o.label}${hint}\\n`);\n });\n for (;;) {\n const raw = await reader.readLine(`Enter number [1-${opts.options.length}]: `);\n if (raw === null) return CANCEL;\n const n = Number.parseInt(raw.trim(), 10);\n if (Number.isInteger(n) && n >= 1 && n <= opts.options.length) {\n return opts.options[n - 1].value;\n }\n stderr.write(` Please enter a number between 1 and ${opts.options.length}.\\n`);\n }\n}\n\nexport async function nonTtyConfirm(\n opts: ConfirmOptions,\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<boolean | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const defaultHint = opts.initialValue === true ? ' [Y/n]' : opts.initialValue === false ? ' [y/N]' : ' [y/n]';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const answer = raw.trim().toLowerCase();\n if (answer === '' && opts.initialValue !== undefined) return opts.initialValue;\n if (answer === 'y' || answer === 'yes') return true;\n if (answer === 'n' || answer === 'no') return false;\n stderr.write(` Please answer y or n.\\n`);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { GlobalConfig, ProjectConfig, StoredCredentials } from '../types.js';\n\nconst GLOBAL_DIR = join(homedir(), '.insforge');\nconst CREDENTIALS_FILE = join(GLOBAL_DIR, 'credentials.json');\nconst CONFIG_FILE = join(GLOBAL_DIR, 'config.json');\n\nconst DEFAULT_PLATFORM_URL = 'https://api.insforge.dev';\nconst DEFAULT_FRONTEND_URL = 'https://insforge.dev';\n\n/** Sentinel project ID for OSS/self-hosted linking (valid UUID, never matches a real project). */\nexport const FAKE_PROJECT_ID = 'fa4e0000-1234-5678-90ab-cd1234567890';\nexport const FAKE_ORG_ID = 'fa4e0001-1234-5678-90ab-cd1234567890';\n\nfunction ensureGlobalDir(): void {\n if (!existsSync(GLOBAL_DIR)) {\n mkdirSync(GLOBAL_DIR, { recursive: true });\n }\n}\n\n// --- Global Config ---\n\nexport function getGlobalConfig(): GlobalConfig {\n if (!existsSync(CONFIG_FILE)) {\n return { platform_api_url: DEFAULT_PLATFORM_URL };\n }\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureGlobalDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\n// --- Credentials ---\n\nexport function getCredentials(): StoredCredentials | null {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n const raw = readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n ensureGlobalDir();\n writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n}\n\nexport function clearCredentials(): void {\n if (existsSync(CREDENTIALS_FILE)) {\n unlinkSync(CREDENTIALS_FILE);\n }\n // Clear session-related config (default_org_id) but keep platform_api_url etc.\n const config = getGlobalConfig();\n if (config.default_org_id) {\n delete config.default_org_id;\n saveGlobalConfig(config);\n }\n}\n\n// --- Project Config (local) ---\n\nfunction getLocalConfigDir(): string {\n return join(process.cwd(), '.insforge');\n}\n\nfunction getLocalConfigFile(): string {\n return join(getLocalConfigDir(), 'project.json');\n}\n\nexport function getProjectConfig(): ProjectConfig | null {\n const file = getLocalConfigFile();\n if (!existsSync(file)) {\n return null;\n }\n const raw = readFileSync(file, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveProjectConfig(config: ProjectConfig): void {\n const dir = getLocalConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(getLocalConfigFile(), JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\n// --- Resolved values (env vars > flags > config) ---\n\nexport function getPlatformApiUrl(override?: string): string {\n return process.env.INSFORGE_API_URL ?? override ?? getGlobalConfig().platform_api_url ?? DEFAULT_PLATFORM_URL;\n}\n\nexport function getFrontendUrl(): string {\n return process.env.INSFORGE_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n}\n\nexport function getAccessToken(): string | null {\n return process.env.INSFORGE_ACCESS_TOKEN ?? getCredentials()?.access_token ?? null;\n}\n\nexport function getProjectId(override?: string): string | null {\n return process.env.INSFORGE_PROJECT_ID ?? override ?? getProjectConfig()?.project_id ?? null;\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport { saveCredentials, getPlatformApiUrl } from '../lib/config.js';\nimport { login as platformLogin } from '../lib/api/platform.js';\nimport { performOAuthLogin } from '../lib/auth.js';\nimport { handleError, getRootOpts, CLIError, formatFetchError } from '../lib/errors.js';\nimport type { StoredCredentials, User } from '../types.js';\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Authenticate with InsForge platform')\n .option('--email', 'Login with email and password instead of browser')\n .option('--client-id <id>', 'OAuth client ID (defaults to insforge-cli)')\n .option('--user-api-key <key>', 'Authenticate with a uak_ personal access token')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n try {\n if (opts.userApiKey) {\n await loginWithUserApiKey(opts.userApiKey, json, apiUrl);\n } else if (opts.email) {\n await loginWithEmail(json, apiUrl);\n } else {\n await loginWithOAuth(json, apiUrl);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('cancelled')) {\n process.exit(0);\n }\n handleError(err, json);\n }\n });\n}\n\nasync function loginWithEmail(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const email = json\n ? process.env.INSFORGE_EMAIL\n : await prompts.text({\n message: 'Email:',\n validate: (v) => (v.includes('@') ? undefined : 'Please enter a valid email'),\n });\n\n if (prompts.isCancel(email)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n const password = json\n ? process.env.INSFORGE_PASSWORD\n : await prompts.password({\n message: 'Password:',\n });\n\n if (prompts.isCancel(password)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n if (!email || !password) {\n throw new Error('Email and password are required. Set INSFORGE_EMAIL and INSFORGE_PASSWORD environment variables for non-interactive mode.');\n }\n\n if (!json) {\n const s = clack.spinner();\n s.start('Authenticating...');\n\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n\n s.stop(`Authenticated as ${result.user.email}`);\n clack.outro('Done');\n } else {\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n console.log(JSON.stringify({ success: true, user: result.user }));\n }\n}\n\nasync function loginWithOAuth(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const creds = await performOAuthLogin(apiUrl);\n\n if (!json) {\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user: creds.user }));\n }\n}\n\nasync function loginWithUserApiKey(\n key: string,\n json: boolean,\n apiUrl?: string,\n): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n if (!key.startsWith('uak_')) {\n throw new CLIError('Invalid API key — must start with \"uak_\".');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Verifying API key...');\n\n let jwt: string;\n let user: User;\n try {\n const exchanged = await exchangePatForJwt(key, apiUrl);\n jwt = exchanged.token;\n user = exchanged.user;\n } catch (err) {\n s?.stop('API key verification failed');\n throw err instanceof CLIError\n ? err\n : new CLIError(err instanceof Error ? err.message : String(err));\n }\n\n // Storage: access_token holds the JWT, refresh_token holds the PAT.\n // Detect PAT login later by checking refresh_token.startsWith('uak_').\n saveCredentials({\n access_token: jwt,\n refresh_token: key,\n user,\n });\n\n if (!json) {\n s?.stop(`Authenticated as ${user.email}`);\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user }));\n }\n}\n\n/**\n * Exchange a uak_ PAT for a short-lived JWT via the backend exchange endpoint.\n * The PAT itself is never stored as an access token — we store the JWT and\n * keep the PAT only for silent re-exchange when the JWT expires.\n */\nasync function exchangePatForJwt(\n apiKey: string,\n apiUrl?: string,\n): Promise<{ token: string; user: User }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const fullUrl = `${baseUrl}/auth/v1/exchange-api-key`;\n\n let res: Response;\n try {\n res = await fetch(fullUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey }),\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n const msg = body.message ?? body.error ?? `HTTP ${res.status}`;\n throw new CLIError(`API key is invalid or revoked: ${msg}`);\n }\n\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new CLIError('Exchange endpoint returned an invalid response (missing token).');\n }\n const jwt = data.token;\n\n // The exchange endpoint returns only the JWT. Fetch the user via /auth/v1/profile\n // using the fresh JWT so we can persist identity in credentials.json.\n let profileRes: Response;\n try {\n profileRes = await fetch(`${baseUrl}/auth/v1/profile`, {\n headers: { Authorization: `Bearer ${jwt}` },\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, `${baseUrl}/auth/v1/profile`));\n }\n if (!profileRes.ok) {\n throw new CLIError(`Exchange succeeded but could not fetch profile: HTTP ${profileRes.status}`);\n }\n const profile = (await profileRes.json().catch(() => null)) as\n | { user?: User }\n | User\n | null;\n const user =\n profile && typeof profile === 'object' && 'user' in profile\n ? (profile as { user?: User }).user\n : ((profile as User | null) ?? undefined);\n if (!user) {\n throw new CLIError('Exchange succeeded but profile response was empty');\n }\n\n return { token: jwt, user };\n}\n","import type { Command } from 'commander';\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1,\n public code?: string,\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport class AuthError extends CLIError {\n constructor(message: string = 'Not authenticated. Run `npx @insforge/cli login` first.') {\n super(message, 2, 'AUTH_ERROR');\n }\n}\n\nexport class ProjectNotLinkedError extends CLIError {\n constructor() {\n super('No project linked. Run `npx @insforge/cli link` first.', 3, 'PROJECT_NOT_LINKED');\n }\n}\n\nexport class NotFoundError extends CLIError {\n constructor(resource: string) {\n super(`${resource} not found.`, 4, 'NOT_FOUND');\n }\n}\n\nexport class PermissionError extends CLIError {\n constructor(message: string = 'Permission denied.') {\n super(message, 5, 'PERMISSION_DENIED');\n }\n}\n\n/**\n * Format a Node fetch error with actionable context.\n *\n * Node's undici-based fetch throws a generic Error with `message: 'fetch failed'`\n * for any network-layer failure (DNS, connect, TLS, reset, timeout). The real\n * reason sits on `err.cause` with a `code` like ENOTFOUND / ECONNREFUSED /\n * ETIMEDOUT / UND_ERR_CONNECT_TIMEOUT / CERT_HAS_EXPIRED, etc. Unpack it so\n * users see something actionable instead of \"fetch failed\".\n */\nexport function formatFetchError(err: unknown, url: string): string {\n if (!(err instanceof Error)) return `Network request to ${url} failed: ${String(err)}`;\n if (err.message !== 'fetch failed') return err.message;\n\n const cause = (err as { cause?: unknown }).cause;\n const code =\n (cause as { code?: string } | undefined)?.code ??\n (cause as { errno?: string } | undefined)?.errno;\n const causeMsg =\n cause instanceof Error ? cause.message : typeof cause === 'string' ? cause : undefined;\n\n let host = url;\n try { host = new URL(url).host; } catch { /* url may already be a host */ }\n\n switch (code) {\n case 'ENOTFOUND':\n case 'EAI_AGAIN':\n return `Cannot resolve ${host} (DNS lookup failed: ${code}). Check your internet connection or DNS settings.`;\n case 'ECONNREFUSED':\n return `Connection to ${host} refused. The server may be down or blocked by a firewall.`;\n case 'ETIMEDOUT':\n case 'UND_ERR_CONNECT_TIMEOUT':\n return `Connection to ${host} timed out. Check your network, VPN, or proxy settings.`;\n case 'ECONNRESET':\n case 'UND_ERR_SOCKET':\n return `Connection to ${host} was reset. A proxy, VPN, or firewall may be interfering.`;\n case 'CERT_HAS_EXPIRED':\n case 'UNABLE_TO_VERIFY_LEAF_SIGNATURE':\n case 'SELF_SIGNED_CERT_IN_CHAIN':\n case 'DEPTH_ZERO_SELF_SIGNED_CERT':\n return `TLS certificate error contacting ${host} (${code}). Your network may be intercepting HTTPS (corporate proxy / VPN).`;\n }\n\n if (code) return `Network error contacting ${host}: ${code}${causeMsg ? ` — ${causeMsg}` : ''}`;\n if (causeMsg) return `Network error contacting ${host}: ${causeMsg}`;\n return `Network error contacting ${host}.`;\n}\n\n/**\n * Extract error message from a deployment's metadata field.\n * DeploymentSchema stores errors in metadata.error.errorMessage rather than a top-level field.\n */\nexport function getDeploymentError(metadata: Record<string, unknown> | null): string | null {\n if (!metadata || typeof metadata.error !== 'object' || !metadata.error) return null;\n return (metadata.error as { errorMessage?: string }).errorMessage ?? null;\n}\n\nexport function handleError(err: unknown, json: boolean): never {\n if (err instanceof CLIError) {\n if (json) {\n console.error(JSON.stringify({ error: err.message, code: err.code }));\n } else {\n console.error(`Error: ${err.message}`);\n }\n process.exit(err.exitCode);\n }\n\n const message = err instanceof Error ? err.message : String(err);\n if (json) {\n console.error(JSON.stringify({ error: message, code: 'UNKNOWN_ERROR' }));\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n}\n\nexport function getJsonFlag(cmd: Command): boolean {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().json ?? false;\n}\n\nexport function getRootOpts(cmd: Command): { json: boolean; apiUrl?: string; yes: boolean } {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n const opts = root.opts();\n return {\n json: opts.json ?? false,\n apiUrl: opts.apiUrl,\n yes: opts.yes ?? false,\n };\n}\n","import { createServer } from 'node:http';\nimport { randomBytes, createHash } from 'node:crypto';\nimport { URL } from 'node:url';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport { isInteractive } from './prompts.js';\nimport { getGlobalConfig, getPlatformApiUrl, saveCredentials } from './config.js';\nimport { getProfile } from './api/platform.js';\nimport { formatFetchError } from './errors.js';\nimport type { StoredCredentials } from '../types.js';\n\n// Default OAuth client for InsForge CLI (pre-registered on the platform)\nexport const DEFAULT_CLIENT_ID = 'clf_NK8cMUs41gm8ZcfdtSguVw';\nexport const OAUTH_SCOPES = 'user:read organizations:read projects:read projects:write';\n\nexport interface PKCEChallenge {\n code_verifier: string;\n code_challenge: string;\n}\n\nexport interface OAuthCallbackResult {\n code: string;\n state: string;\n}\n\n/**\n * Generate PKCE code_verifier and code_challenge (S256).\n */\nexport function generatePKCE(): PKCEChallenge {\n const code_verifier = randomBytes(32).toString('base64url');\n const code_challenge = createHash('sha256').update(code_verifier).digest('base64url');\n return { code_verifier, code_challenge };\n}\n\n/**\n * Generate a random state parameter for CSRF protection.\n */\nexport function generateState(): string {\n return randomBytes(16).toString('base64url');\n}\n\n/**\n * Build the OAuth authorization URL.\n */\nexport function buildAuthorizeUrl(params: {\n platformUrl: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n state: string;\n scopes: string;\n}): string {\n const url = new URL(`${params.platformUrl}/api/oauth/v1/authorize`);\n url.searchParams.set('client_id', params.clientId);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('scope', params.scopes);\n url.searchParams.set('code_challenge', params.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('state', params.state);\n return url.toString();\n}\n\n/**\n * Exchange authorization code for tokens via the token endpoint.\n */\nexport async function exchangeCodeForTokens(params: {\n platformUrl: string;\n code: string;\n redirectUri: string;\n clientId: string;\n codeVerifier: string;\n}): Promise<{ access_token: string; refresh_token: string; expires_in: number; scope: string }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code: params.code,\n redirect_uri: params.redirectUri,\n client_id: params.clientId,\n code_verifier: params.codeVerifier,\n }),\n });\n } catch (err) {\n throw new Error(`Token exchange failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token exchange failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token: string; expires_in: number; scope: string };\n}\n\n/**\n * Refresh an OAuth access token using a refresh token.\n */\nexport async function refreshOAuthToken(params: {\n platformUrl: string;\n refreshToken: string;\n clientId: string;\n}): Promise<{ access_token: string; refresh_token?: string; expires_in: number }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n client_id: params.clientId,\n }),\n });\n } catch (err) {\n throw new Error(`Token refresh failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token refresh failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token?: string; expires_in: number };\n}\n\n/**\n * Start a local HTTP server to receive the OAuth authorization code callback.\n */\nexport function startCallbackServer(): Promise<{\n port: number;\n result: Promise<OAuthCallbackResult>;\n close: () => void;\n}> {\n return new Promise((resolveServer) => {\n let resolveResult: (value: OAuthCallbackResult) => void;\n let rejectResult: (reason: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const desc = url.searchParams.get('error_description') ?? error;\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body><h2>Authentication failed</h2><p>${desc}</p><p>You can close this window.</p></body></html>`);\n rejectResult!(new Error(desc));\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2><p>Missing authorization code.</p></body></html>');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication successful!</h2><p>You can close this window and return to the terminal.</p></body></html>');\n resolveResult!({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n const port = typeof addr === 'object' ? addr!.port : 0;\n resolveServer({\n port,\n result: resultPromise,\n close: () => { server.close(); server.closeAllConnections(); },\n });\n });\n\n // Timeout after 5 minutes (unref so it doesn't keep the process alive)\n setTimeout(() => {\n rejectResult!(new Error('Authentication timed out. Please try again.'));\n server.close();\n }, 5 * 60 * 1000).unref();\n });\n}\n\n/**\n * Perform the full OAuth PKCE login flow:\n * generate PKCE + state, start callback server, open browser, exchange code, save credentials.\n * Returns the stored credentials on success.\n */\nexport async function performOAuthLogin(apiUrl?: string): Promise<StoredCredentials> {\n const platformUrl = getPlatformApiUrl(apiUrl);\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n // 1. Generate PKCE and state\n const pkce = generatePKCE();\n const state = generateState();\n\n // 2. Start local callback server\n const { port, result, close } = await startCallbackServer();\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n // 3. Build authorization URL\n const authUrl = buildAuthorizeUrl({\n platformUrl,\n clientId,\n redirectUri,\n codeChallenge: pkce.code_challenge,\n state,\n scopes: OAUTH_SCOPES,\n });\n\n if (isInteractive) {\n clack.log.info('Opening browser for authentication...');\n clack.log.info(`If browser doesn't open, visit:\\n${authUrl}`);\n } else {\n // Non-TTY (agent shell): surface the URL prominently via stderr so it stays out of\n // any JSON stdout stream but is still visible to agents and humans.\n process.stderr.write(`\\nTo sign in, open this URL in your browser:\\n\\n ${pc.cyan(pc.underline(authUrl))}\\n\\n`);\n }\n\n // 4. Open browser (best effort — often works even from agent shells since we're on the same machine)\n try {\n const open = (await import('open')).default;\n await open(authUrl);\n } catch {\n if (isInteractive) clack.log.warn('Could not open browser. Please visit the URL above.');\n }\n\n // 5. Wait for callback — use clack spinner only in TTY (non-TTY spinner renders garbage)\n const s = isInteractive ? clack.spinner() : null;\n s?.start('Waiting for authentication...');\n if (!isInteractive) process.stderr.write('Waiting for authentication...\\n');\n\n try {\n const callbackResult = await result;\n close();\n\n // Verify state\n if (callbackResult.state !== state) {\n s?.stop('Authentication failed');\n throw new Error('State mismatch. Possible CSRF attack.');\n }\n\n // 6. Exchange code for tokens\n s?.message('Exchanging authorization code...');\n const tokens = await exchangeCodeForTokens({\n platformUrl,\n code: callbackResult.code,\n redirectUri,\n clientId,\n codeVerifier: pkce.code_verifier,\n });\n\n // 7. Save credentials and fetch profile\n const creds: StoredCredentials = {\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n user: { id: '', name: '', email: '', avatar_url: null, email_verified: true },\n };\n saveCredentials(creds);\n\n try {\n const profile = await getProfile(apiUrl);\n creds.user = profile;\n saveCredentials(creds);\n s?.stop(`Authenticated as ${profile.email}`);\n if (!isInteractive) process.stderr.write(`Authenticated as ${profile.email}\\n`);\n } catch {\n s?.stop('Authenticated successfully');\n if (!isInteractive) process.stderr.write('Authenticated successfully\\n');\n }\n\n return creds;\n } catch (err) {\n close();\n s?.stop('Authentication failed');\n if (!isInteractive) process.stderr.write('Authentication failed\\n');\n throw err;\n }\n}\n","import { getCredentials, getGlobalConfig, getPlatformApiUrl, saveCredentials, getProjectConfig, FAKE_PROJECT_ID } from './config.js';\nimport { AuthError } from './errors.js';\nimport { refreshOAuthToken, DEFAULT_CLIENT_ID, performOAuthLogin } from './auth.js';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './prompts.js';\nimport type { StoredCredentials } from '../types.js';\n\n/** True if stored credentials represent a PAT-based login (refresh_token is a uak_ token). */\nexport function isPatLogin(creds: StoredCredentials | null | undefined): boolean {\n return creds?.refresh_token?.startsWith('uak_') ?? false;\n}\n\nexport async function requireAuth(apiUrl?: string, allowOssBypass = true): Promise<StoredCredentials> {\n const projConfig = getProjectConfig();\n if (allowOssBypass && projConfig?.project_id === FAKE_PROJECT_ID) {\n return {\n access_token: 'oss-token',\n refresh_token: 'oss-refresh',\n user: {\n id: 'oss-user',\n name: 'OSS User',\n email: 'oss@insforge.local',\n avatar_url: null,\n email_verified: true,\n },\n };\n }\n\n const creds = getCredentials();\n if (creds && creds.access_token) return creds;\n\n // PAT session with an expired/empty access_token: silently re-exchange\n // instead of prompting for browser OAuth.\n if (isPatLogin(creds)) {\n await refreshAccessToken(apiUrl);\n return getCredentials()!;\n }\n\n clack.log.info('You need to log in to continue.');\n\n for (;;) {\n try {\n return await performOAuthLogin(apiUrl);\n } catch (err) {\n if (!process.stdout.isTTY) throw err;\n\n const msg = err instanceof Error ? err.message : 'Unknown error';\n clack.log.error(`Login failed: ${msg}`);\n\n const retry = await prompts.confirm({ message: 'Would you like to try again?' });\n if (prompts.isCancel(retry) || !retry) {\n throw new AuthError('Authentication required. Run `npx @insforge/cli login` to authenticate.');\n }\n }\n }\n}\n\nexport async function refreshAccessToken(apiUrl?: string): Promise<string> {\n const creds = getCredentials();\n if (!creds) {\n throw new AuthError('Not logged in. Run `npx @insforge/cli login` first.');\n }\n\n const platformUrl = getPlatformApiUrl(apiUrl);\n\n // PAT branch: re-exchange the stored uak_ for a fresh JWT.\n if (isPatLogin(creds)) {\n let res: Response;\n try {\n res = await fetch(`${platformUrl}/auth/v1/exchange-api-key`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey: creds.refresh_token }),\n });\n } catch {\n // Background refresh path — surface a network error clearly.\n throw new AuthError(\n `Unable to reach auth server at ${platformUrl}. Check your network connection.`\n );\n }\n if (!res.ok) {\n // Auth failures (401/403/404) mean the PAT is actually bad — ask the user\n // to rotate. Everything else (5xx, 429, gateway errors) is transient and\n // shouldn't instruct the user to rotate a healthy key.\n if (res.status === 401 || res.status === 403 || res.status === 404) {\n throw new AuthError(\n 'API key is invalid or revoked. Run `npx @insforge/cli login --user-api-key <new-key>` again.'\n );\n }\n throw new AuthError(\n `Auth server returned HTTP ${res.status} while refreshing session. Please retry shortly.`\n );\n }\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new AuthError('Exchange endpoint returned an invalid response (missing token).');\n }\n saveCredentials({ ...creds, access_token: data.token });\n return data.token;\n }\n\n if (!creds.refresh_token) {\n throw new AuthError('Refresh token not found. Run `npx @insforge/cli login` again.');\n }\n\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n try {\n const data = await refreshOAuthToken({\n platformUrl,\n refreshToken: creds.refresh_token,\n clientId,\n });\n\n const updated: StoredCredentials = {\n ...creds,\n access_token: data.access_token,\n // Update refresh token if rotated\n refresh_token: data.refresh_token ?? creds.refresh_token,\n };\n saveCredentials(updated);\n return data.access_token;\n } catch {\n // Token refresh failed — try re-authenticating interactively\n if (process.stdout.isTTY) {\n clack.log.warn('Session expired. Please log in again.');\n const newCreds = await performOAuthLogin(apiUrl);\n return newCreds.access_token;\n }\n throw new AuthError('Failed to refresh token. Run `npx @insforge/cli login` again.');\n }\n}\n","import { getAccessToken, getPlatformApiUrl } from '../config.js';\nimport { AuthError, CLIError, formatFetchError } from '../errors.js';\nimport { refreshAccessToken } from '../credentials.js';\nimport type {\n ApiKeyResponse,\n LoginResponse,\n Organization,\n Project,\n User,\n} from '../../types.js';\n\nexport async function platformFetch(\n path: string,\n options: RequestInit = {},\n apiUrl?: string,\n): Promise<Response> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const token = getAccessToken();\n if (!token) {\n throw new AuthError();\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...(options.headers as Record<string, string> ?? {}),\n };\n\n const fullUrl = `${baseUrl}${path}`;\n if (process.env.INSFORGE_DEBUG) {\n console.error(`[DEBUG] ${options.method ?? 'GET'} ${fullUrl}`);\n console.error(`[DEBUG] Headers: ${JSON.stringify(headers, null, 2)}`);\n if (options.body) {\n console.error(`[DEBUG] Body: ${typeof options.body === 'string' ? options.body : JSON.stringify(options.body)}`);\n }\n }\n\n let res: Response;\n try {\n res = await fetch(fullUrl, { ...options, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n // Auto-refresh on 401\n if (res.status === 401) {\n const newToken = await refreshAccessToken(apiUrl);\n headers.Authorization = `Bearer ${newToken}`;\n let retryRes: Response;\n try {\n retryRes = await fetch(fullUrl, { ...options, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n if (!retryRes.ok) {\n const err = await retryRes.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Request failed: ${retryRes.status}`, retryRes.status === 403 ? 5 : 1);\n }\n return retryRes;\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string; message?: string };\n const msg = err.message ? `${err.error ?? res.status}: ${err.message}` : (err.error ?? `Request failed: ${res.status}`);\n throw new CLIError(msg, res.status === 403 ? 5 : 1);\n }\n\n return res;\n}\n\n// --- Auth ---\n\nexport async function login(email: string, password: string, apiUrl?: string): Promise<LoginResponse & { _refreshToken?: string }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const res = await fetch(`${baseUrl}/auth/v1/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new AuthError(err.error ?? 'Login failed. Check your email and password.');\n }\n\n // Extract refresh token from Set-Cookie header\n const setCookie = res.headers.get('set-cookie') ?? '';\n const refreshTokenMatch = setCookie.match(/refreshToken=([^;]+)/);\n const data = (await res.json()) as LoginResponse;\n\n return {\n ...data,\n // Attach refresh token to the response for storage\n _refreshToken: refreshTokenMatch?.[1],\n } as LoginResponse & { _refreshToken?: string };\n}\n\nexport async function getProfile(apiUrl?: string): Promise<User> {\n const res = await platformFetch('/auth/v1/profile', {}, apiUrl);\n const data = await res.json() as { user?: User };\n return data.user ?? (data as unknown as User);\n}\n\n// --- Organizations ---\n\nexport async function listOrganizations(apiUrl?: string): Promise<Organization[]> {\n const res = await platformFetch('/organizations/v1', {}, apiUrl);\n const data = await res.json() as { organizations?: Organization[] };\n return data.organizations ?? (data as unknown as Organization[]);\n}\n\n// --- Projects ---\n\nexport async function listProjects(orgId: string, apiUrl?: string): Promise<Project[]> {\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {}, apiUrl);\n const data = await res.json() as { projects?: Project[] };\n return data.projects ?? (data as unknown as Project[]);\n}\n\nexport async function getProject(projectId: string, apiUrl?: string): Promise<Project> {\n const res = await platformFetch(`/projects/v1/${projectId}`, {}, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\nexport async function getProjectApiKey(projectId: string, apiUrl?: string): Promise<string> {\n const res = await platformFetch(`/projects/v1/${projectId}/access-api-key`, {}, apiUrl);\n const data = (await res.json()) as ApiKeyResponse;\n return data.access_api_key;\n}\n\nexport async function reportAgentConnected(\n payload: { project_id?: string; app_key?: string },\n apiUrl?: string,\n): Promise<void> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n const token = getAccessToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n await fetch(`${baseUrl}/tracking/v1/agent-connected`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...payload, client: 'cli' }),\n });\n}\n\nexport interface DiagnosticRequest {\n project_id: string;\n question: string;\n context: {\n context_version: string;\n metrics?: unknown;\n advisor?: unknown;\n db?: unknown;\n logs?: unknown;\n client_info?: {\n cli_version?: string;\n node_version?: string;\n os?: string;\n };\n };\n}\n\nexport interface DiagnosticSSEEvent {\n type: 'delta' | 'tool_call' | 'tool_result' | 'done' | 'error';\n data: Record<string, unknown>;\n}\n\nexport type DiagnosticEventHandler = (event: DiagnosticSSEEvent) => void;\n\n/**\n * Stream diagnostic analysis via SSE. Calls `onEvent` for each SSE event.\n * Returns the raw Response so the caller can handle errors before streaming.\n */\nexport async function streamDiagnosticAnalysis(\n payload: DiagnosticRequest,\n onEvent: DiagnosticEventHandler,\n apiUrl?: string,\n): Promise<void> {\n const res = await platformFetch('/diagnostic/v1/analyze', {\n method: 'POST',\n body: JSON.stringify(payload),\n }, apiUrl);\n\n const body = res.body;\n if (!body) throw new CLIError('No response body from diagnostic API.');\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent: DiagnosticSSEEvent['type'] | null = 'delta';\n\n const VALID_EVENTS = new Set<string>(['delta', 'tool_call', 'tool_result', 'done', 'error']);\n\n const processLine = (line: string): void => {\n if (line.startsWith('event:')) {\n const evt = line.slice(6).trim();\n currentEvent = VALID_EVENTS.has(evt) ? evt as DiagnosticSSEEvent['type'] : null;\n } else if (line.startsWith('data:')) {\n if (!currentEvent) return;\n const raw = line.slice(5).trim();\n if (!raw) return;\n try {\n const data = JSON.parse(raw) as Record<string, unknown>;\n onEvent({ type: currentEvent, data });\n } catch {\n // skip malformed JSON\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n processLine(line);\n }\n }\n\n // Flush remaining bytes from multi-byte sequences\n buffer += decoder.decode();\n if (buffer.trim()) {\n processLine(buffer);\n }\n}\n\nexport async function rateDiagnosticSession(\n sessionId: string,\n rating: 'helpful' | 'not_helpful' | 'incorrect',\n comment?: string,\n apiUrl?: string,\n): Promise<void> {\n const body: Record<string, string> = { rating };\n if (comment) body.comment = comment;\n await platformFetch(`/diagnostic/v1/sessions/${sessionId}/rating`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n}\n\nexport async function createProject(\n orgId: string,\n name: string,\n region?: string,\n apiUrl?: string,\n): Promise<Project> {\n const body: Record<string, string> = { name };\n if (region) body.region = region;\n\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\n","import Table from 'cli-table3';\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function outputTable(headers: string[], rows: string[][]): void {\n const table = new Table({\n head: headers,\n style: { head: ['cyan'] },\n });\n for (const row of rows) {\n table.push(row);\n }\n console.log(table.toString());\n}\n\nexport function outputSuccess(message: string): void {\n console.log(`✓ ${message}`);\n}\n\nexport function outputInfo(message: string): void {\n console.log(message);\n}\n","import type { Command } from 'commander';\nimport { clearCredentials } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputSuccess, outputJson } from '../lib/output.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out from InsForge platform')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n clearCredentials();\n if (json) {\n outputJson({ success: true, message: 'Logged out successfully' });\n } else {\n outputSuccess('Logged out successfully.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProfile } from '../lib/api/platform.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputInfo } from '../lib/output.js';\nimport { requireAuth } from '../lib/credentials.js';\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current authenticated user')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const profile = await getProfile(apiUrl);\n\n if (json) {\n outputJson(profile);\n } else {\n outputInfo(`Logged in as: ${profile.email ?? profile.name}`);\n if (profile.name) outputInfo(`Name: ${profile.name}`);\n if (profile.id) outputInfo(`ID: ${profile.id}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerOrgsCommands(orgsCmd: Command): void {\n orgsCmd\n .command('list')\n .description('List all organizations')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (json) {\n outputJson(orgs);\n } else {\n if (!orgs.length) {\n console.log('No organizations found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Type'],\n orgs.map((o) => [\n o.id,\n o.name,\n o.type ?? '-',\n ]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { listOrganizations, listProjects } from '../../lib/api/platform.js';\nimport { getGlobalConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerProjectsCommands(projectsCmd: Command): void {\n projectsCmd\n .command('list')\n .description('List all projects in an organization')\n .option('--org-id <id>', 'Organization ID (uses default if not specified)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n\n let orgId = opts.orgId ?? getGlobalConfig().default_org_id;\n\n if (!orgId) {\n // Try to auto-select if user has only one org\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found. Create one on the InsForge dashboard.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n } else if (!json) {\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) {\n process.exit(0);\n }\n orgId = selected;\n } else {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n }\n\n const projects = await listProjects(orgId, apiUrl);\n\n if (json) {\n outputJson(projects);\n } else {\n if (!projects.length) {\n console.log('No projects found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Region', 'Status', 'AppKey'],\n projects.map((p) => [p.id, p.name, p.region, p.status, p.appkey]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n listOrganizations,\n listProjects,\n getProject,\n getProjectApiKey,\n reportAgentConnected,\n} from '../../lib/api/platform.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl, FAKE_PROJECT_ID, FAKE_ORG_ID } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { installSkills, reportCliUsage } from '../../lib/skills.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../../lib/analytics.js';\nimport { downloadGitHubTemplate } from '../create.js';\nimport type { ProjectConfig } from '../../types.js';\n\nconst execAsync = promisify(exec);\n\nfunction buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\nexport function registerProjectLinkCommand(program: Command): void {\n program\n .command('link')\n .description('Link current directory to an InsForge project')\n .option('--project-id <id>', 'Project ID to link')\n .option('--org-id <id>', 'Organization ID')\n .option('--template <template>', 'Download a template after linking: react, nextjs, chatbot, crm, e-commerce, todo')\n .option('--api-base-url <url>', 'API Base URL for direct linking (OSS/Self-hosted)')\n .option('--api-key <key>', 'API Key for direct linking (OSS/Self-hosted)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n // Every template value accepted here is a directory in the InsForge\n // templates repo, so validation and the download call reference the\n // same single list.\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo'];\n\n try {\n if (opts.template && !validTemplates.includes(opts.template)) {\n throw new CLIError(`Invalid template \"${opts.template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n\n if (opts.apiBaseUrl || opts.apiKey) {\n try {\n if (!opts.apiBaseUrl || !opts.apiKey) {\n throw new CLIError('Both --api-base-url and --api-key must be provided together for direct linking.');\n }\n\n try {\n new URL(opts.apiBaseUrl);\n } catch {\n throw new CLIError('Invalid --api-base-url. Please provide a valid URL.');\n }\n\n // Direct OSS/Self-hosted linking bypasses OAuth\n const projectConfig: ProjectConfig = {\n project_id: FAKE_PROJECT_ID,\n project_name: 'oss-project',\n org_id: FAKE_ORG_ID,\n appkey: 'ossfkey',\n region: 'us-test',\n api_key: opts.apiKey,\n oss_host: opts.apiBaseUrl.replace(/\\/$/, ''), // remove trailing slash if any\n };\n\n const template = opts.template as string | undefined;\n\n // Template path: create a subdirectory, link inside it, download template,\n // install deps. Mirrors the OAuth template flow below.\n if (template) {\n const defaultDir = `insforge-${template}`;\n let dirName = defaultDir;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: defaultDir,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({\n success: true,\n project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region },\n directory: dirName,\n template,\n });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n captureEvent(FAKE_ORG_ID, 'template_selected', { template, source: 'link_direct' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n if (templateDownloaded && !json) {\n const installSpinner = clack.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner.stop('Dependencies installed');\n } catch (err) {\n installSpinner.stop('Failed to install dependencies');\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n\n await installSkills(json);\n trackCommand('link', 'oss-org', { direct: true, template });\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n\n if (!json) {\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n return;\n }\n\n // Non-template direct-link: save config in cwd and return.\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({ success: true, project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region } });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n trackCommand('link', 'oss-org', { direct: true });\n\n // Install agent skills\n await installSkills(json);\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n return;\n } catch (err) {\n await reportCliUsage('cli.link_direct', false);\n await shutdownAnalytics();\n handleError(err, json);\n }\n }\n\n const creds = await requireAuth(apiUrl, false);\n\n let orgId = opts.orgId;\n let projectId = opts.projectId;\n\n // Show organization selection (auto-select if only one)\n if (!orgId && !projectId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const config = getGlobalConfig();\n config.default_org_id = orgId;\n saveGlobalConfig(config);\n\n // Select project if not specified\n if (!projectId) {\n const projects = await listProjects(orgId, apiUrl);\n if (projects.length === 0) {\n throw new CLIError('No projects found in this organization.');\n }\n if (json) {\n throw new CLIError('Specify --project-id in JSON mode.');\n }\n const selected = await prompts.select<string>({\n message: 'Select a project to link:',\n options: projects.map((p) => ({\n value: p.id,\n label: `${p.name} (${p.region}, ${p.status})`,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n projectId = selected;\n }\n\n // Fetch project details and API key\n let project;\n let apiKey;\n try {\n [project, apiKey] = await Promise.all([\n getProject(projectId, apiUrl),\n getProjectApiKey(projectId, apiUrl),\n ]);\n } catch (err) {\n if (err instanceof CLIError && (err.exitCode === 5 || err.exitCode === 4 || err.message.includes('not found'))) {\n const identity = creds.user?.email ?? creds.user?.name ?? 'unknown user';\n throw new CLIError(\n `No access to project ${projectId} as ${identity}. Double-check the project ID, or run \\`npx @insforge/cli logout\\` to switch accounts.`,\n 5,\n 'PERMISSION_DENIED',\n );\n }\n throw err;\n }\n\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n\n // Save config in cwd only if not using --template (template flow saves in subdirectory)\n if (!opts.template) {\n saveProjectConfig(projectConfig);\n }\n\n trackCommand('link', project.organization_id);\n\n if (json) {\n outputJson({ success: true, project: { id: project.id, name: project.name, region: project.region } });\n } else {\n outputSuccess(`Linked to project \"${project.name}\" (${project.appkey}.${project.region})`);\n }\n\n // Report agent-connected event (best-effort)\n try {\n await reportAgentConnected({ project_id: project.id }, apiUrl);\n } catch { /* ignore */ }\n\n // Template download (only when --template flag is passed).\n // Validation already ran at the top of the action.\n const template = opts.template as string | undefined;\n if (template) {\n // Ask for directory name\n let dirName = project.name;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: project.name,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n // Save project config in the new directory\n saveProjectConfig(projectConfig);\n\n captureEvent(orgId ?? project.organization_id, 'template_selected', { template, source: 'link' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n // Only proceed with install/next steps if template actually downloaded\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n if (templateDownloaded && !json) {\n const installSpinner = clack.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner.stop('Dependencies installed');\n } catch (err) {\n installSpinner.stop('Failed to install dependencies');\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n\n // Install agent skills inside the project directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${pc.underline(dashboardUrl)}`);\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n } else {\n // No template — install agent skills in the current directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history and deploy it to a live URL',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n }\n } catch (err) {\n await reportCliUsage('cli.link', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\n\n","import { exec } from 'node:child_process';\nimport { existsSync, readFileSync, appendFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { promisify } from 'node:util';\nimport * as clack from '@clack/prompts';\nimport { getProjectConfig } from './config.js';\n\nconst execAsync = promisify(exec);\n\nconst SKILL_INSTALL_TIMEOUT_MS = 60_000;\n\nexport function describeExecError(err: unknown): string {\n const e = err as {\n killed?: boolean;\n signal?: string;\n code?: number | string;\n stderr?: string | Buffer;\n message?: string;\n };\n\n if (e.killed && (e.signal === 'SIGTERM' || e.signal === 'SIGKILL')) {\n return `timed out after ${SKILL_INSTALL_TIMEOUT_MS / 1000}s — the npm registry may be slow or blocked by your network`;\n }\n if (e.code === 'ENOENT') {\n return '`npx` is not on your PATH — install Node.js 18+ and reopen your shell';\n }\n\n const stderr = (typeof e.stderr === 'string' ? e.stderr : e.stderr?.toString()) ?? '';\n if (/ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(stderr)) return 'cannot reach the npm registry (DNS lookup failed) — check your internet connection';\n if (/ECONNREFUSED/i.test(stderr)) return 'connection to the npm registry was refused — a proxy or firewall is likely blocking it';\n if (/ETIMEDOUT|ESOCKETTIMEDOUT|network timeout/i.test(stderr)) return 'the npm registry timed out — check your VPN, proxy, or corporate network';\n if (/CERT_HAS_EXPIRED|UNABLE_TO_VERIFY_LEAF_SIGNATURE|SELF_SIGNED_CERT/i.test(stderr)) return 'TLS error reaching the npm registry — a corporate proxy may be intercepting HTTPS';\n if (/\\bE404\\b|404 Not Found/i.test(stderr)) return 'npm returned 404 — the `skills` package or a dependency could not be found (check your npm registry config)';\n if (/EACCES|permission denied/i.test(stderr)) return 'permission denied writing files — run from a directory you own, without sudo';\n if (/ENOSPC|no space left/i.test(stderr)) return 'no disk space left to install the package';\n if (/\\b401\\b|EAUTH|authentication/i.test(stderr)) return 'npm authentication failed — check ~/.npmrc';\n\n if (typeof e.code === 'number') return `npx exited with code ${e.code}`;\n if (typeof e.code === 'string') return e.code;\n return e.message ?? 'unknown error';\n}\n\nconst GITIGNORE_ENTRIES = [\n '.insforge',\n '.agent',\n '.agents',\n '.augment',\n '.claude',\n '.cline',\n '.github/copilot*',\n '.kilocode',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n];\n\nfunction updateGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore');\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';\n const lines = new Set(existing.split('\\n').map((l) => l.trim()));\n\n const missing = GITIGNORE_ENTRIES.filter((entry) => !lines.has(entry));\n if (!missing.length) return;\n\n const block = `\\n# InsForge & AI agent skills\\n${missing.join('\\n')}\\n`;\n appendFileSync(gitignorePath, block);\n}\n\nexport async function installSkills(json: boolean): Promise<void> {\n try {\n if (!json) clack.log.info('Installing InsForge agent skills (global)...');\n await execAsync('npx skills add insforge/agent-skills -g -y -a antigravity -a augment -a claude-code -a cline -a codex -a cursor -a gemini-cli -a github-copilot -a kilo -a qoder -a qwen-code -a roo -a trae -a windsurf', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('InsForge agent skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install agent skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add insforge/agent-skills` once resolved to see the full output.');\n }\n }\n\n // Install find-skills from vercel-labs for skill discovery\n try {\n if (!json) clack.log.info('Installing find-skills (global)...');\n await execAsync('npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -y', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('find-skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install find-skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add https://github.com/vercel-labs/skills --skill find-skills` once resolved.');\n }\n }\n\n try {\n updateGitignore();\n } catch {\n // non-critical, silently ignore\n }\n}\n\nexport async function reportCliUsage(\n toolName: string,\n success: boolean,\n maxRetries = 1,\n explicitConfig?: { oss_host: string; api_key: string },\n): Promise<void> {\n let config: { oss_host: string; api_key: string } | null | undefined = explicitConfig;\n if (!config) {\n try {\n config = getProjectConfig();\n } catch {\n return;\n }\n }\n if (!config) return;\n\n const payload = JSON.stringify({\n tool_name: toolName,\n success,\n timestamp: new Date().toISOString(),\n });\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3_000);\n try {\n const res = await fetch(`${config.oss_host}/api/usage/mcp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.api_key,\n },\n body: payload,\n signal: controller.signal,\n });\n\n if (res.status < 500) return;\n // 5xx — server may not be ready yet, retry\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // network/abort error — server may not be ready yet, retry\n }\n\n if (attempt < maxRetries - 1) {\n await new Promise((r) => setTimeout(r, 5_000));\n }\n }\n}\n","import { PostHog } from 'posthog-node';\nimport type { ProjectConfig } from '../types.js';\nimport { FAKE_PROJECT_ID } from './config.js';\n\nconst POSTHOG_API_KEY = process.env.POSTHOG_API_KEY;\nconst POSTHOG_HOST = process.env.POSTHOG_HOST || 'https://us.i.posthog.com';\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog | null {\n if (!POSTHOG_API_KEY) return null;\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { host: POSTHOG_HOST });\n }\n return client;\n}\n\nexport function captureEvent(\n distinctId: string,\n event: string,\n properties?: Record<string, unknown>,\n): void {\n try {\n getClient()?.capture({ distinctId, event, properties });\n } catch {\n // analytics should never break the CLI\n }\n}\n\nexport function trackCommand(command: string, distinctId: string, properties?: Record<string, unknown>): void {\n captureEvent(distinctId, 'cli_command_invoked', {\n command,\n ...properties,\n });\n}\n\nexport function trackDiagnose(subcommand: string, config: ProjectConfig): void {\n captureEvent(config.project_id, 'cli_diagnose_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n });\n}\n\nexport function trackPayments(\n subcommand: string,\n config: ProjectConfig,\n properties?: Record<string, unknown>,\n): void {\n captureEvent(config.project_id, 'cli_payments_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n ...properties,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n try {\n if (client) await client.shutdown();\n } catch {\n // ignore\n }\n}\n","import type { Command } from 'commander';\nimport { exec } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport {\n listOrganizations,\n createProject,\n getProject,\n getProjectApiKey,\n} from '../lib/api/platform.js';\nimport { getAnonKey, runRawSql } from '../lib/api/oss.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl } from '../lib/config.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\nimport { readEnvFile } from '../lib/env.js';\nimport { installSkills, reportCliUsage } from '../lib/skills.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../lib/analytics.js';\nimport { deployProject } from './deployments/deploy.js';\nimport type { ProjectConfig } from '../types.js';\n\nconst execAsync = promisify(exec);\n\nexport type Framework = 'react' | 'nextjs';\n\nfunction buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\nasync function waitForProjectActive(projectId: string, apiUrl?: string, timeoutMs = 120_000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n const project = await getProject(projectId, apiUrl);\n if (project.status === 'active') return;\n await new Promise((r) => setTimeout(r, 3000));\n }\n throw new CLIError('Project creation timed out. Check the dashboard for status.');\n}\n\nconst INSFORGE_BANNER = [\n '██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗',\n '██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝',\n '██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ',\n '██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ',\n '██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗',\n '╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝',\n];\n\nasync function animateBanner(): Promise<void> {\n const isTTY = process.stderr.isTTY;\n if (!isTTY || process.env.CI) {\n // Non-interactive: just print static banner\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`${line}\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n const totalLines = INSFORGE_BANNER.length;\n const maxLen = Math.max(...INSFORGE_BANNER.map((l) => l.length));\n const cols = process.stderr.columns ?? 0;\n\n // Narrow terminal: skip animation to avoid garbled output from line wrapping\n if (cols > 0 && cols < maxLen) {\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n // Phase 1: Line-by-line reveal with cursor sweep\n const REVEAL_STEPS = 10;\n const REVEAL_DELAY = 30;\n for (let lineIdx = 0; lineIdx < totalLines; lineIdx++) {\n const line = INSFORGE_BANNER[lineIdx];\n for (let step = 0; step <= REVEAL_STEPS; step++) {\n const pos = Math.floor((step / REVEAL_STEPS) * line.length);\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n if (i < pos) {\n rendered += `\\x1b[97m${line[i]}\\x1b[0m`; // bright white (revealed)\n } else if (i === pos) {\n rendered += `\\x1b[1;37m${line[i]}\\x1b[0m`; // bold white (cursor)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim gray (hidden)\n }\n }\n process.stderr.write(`\\r${rendered}`);\n await new Promise((r) => setTimeout(r, REVEAL_DELAY));\n }\n process.stderr.write('\\n');\n }\n\n // Phase 2: Shimmer pass across the full banner\n const SHIMMER_STEPS = 16;\n const SHIMMER_DELAY = 40;\n const SHIMMER_WIDTH = 4;\n for (let step = 0; step < SHIMMER_STEPS; step++) {\n const shimmerPos = Math.floor((step / SHIMMER_STEPS) * (maxLen + SHIMMER_WIDTH));\n // Move cursor up to start of banner\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n const dist = Math.abs(i - shimmerPos);\n if (dist === 0) {\n rendered += `\\x1b[1;97m${line[i]}\\x1b[0m`; // bold bright white (shimmer peak)\n } else if (dist <= SHIMMER_WIDTH) {\n rendered += `\\x1b[37m${line[i]}\\x1b[0m`; // white (shimmer edge)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim (base)\n }\n }\n process.stderr.write(`${rendered}\\n`);\n }\n await new Promise((r) => setTimeout(r, SHIMMER_DELAY));\n }\n\n // Final: show banner in steady bright white\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n}\n\nfunction getDefaultProjectName(): string {\n const dirName = path.basename(process.cwd());\n const sanitized = dirName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n return sanitized.length >= 2 ? sanitized : '';\n}\n\nexport async function copyDir(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Create a new InsForge project')\n .option('--name <name>', 'Project name')\n .option('--org-id <id>', 'Organization ID')\n .option('--region <region>', 'Deployment region (us-east, us-west, eu-central, ap-southeast)')\n .option('--template <template>', 'Template to use: react, nextjs, chatbot, crm, e-commerce, todo, or empty')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl, false);\n\n if (!json) {\n await animateBanner();\n clack.intro(\"Let's build something great\");\n }\n\n // 1. Select organization (auto-select if only one)\n let orgId = opts.orgId;\n if (!orgId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const globalConfig = getGlobalConfig();\n globalConfig.default_org_id = orgId;\n saveGlobalConfig(globalConfig);\n\n // 2. Project name (pre-filled from directory name)\n let projectName = opts.name;\n if (!projectName) {\n if (json) throw new CLIError('--name is required in JSON mode.');\n const defaultName = getDefaultProjectName();\n const name = await prompts.text({\n message: 'Project name:',\n ...(defaultName ? { initialValue: defaultName } : {}),\n validate: (v) => (v.length >= 2 ? undefined : 'Name must be at least 2 characters'),\n });\n if (prompts.isCancel(name)) process.exit(0);\n projectName = name;\n }\n\n // Sanitize project name to prevent path traversal\n projectName = path.basename(projectName).replace(/[^a-zA-Z0-9._-]/g, '-').replace(/\\.+/g, '.');\n if (projectName.length < 2 || projectName === '.' || projectName === '..') {\n throw new CLIError('Project name must be at least 2 safe characters (letters, numbers, hyphens).');\n }\n\n // 3. Select template (two-step: blank vs template, then pick template)\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo', 'empty'];\n let template = opts.template as string | undefined;\n if (template && !validTemplates.includes(template)) {\n throw new CLIError(`Invalid template \"${template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n if (!template) {\n if (json) {\n template = 'empty';\n } else {\n const approach = await prompts.select<string>({\n message: 'How would you like to start?',\n options: [\n { value: 'blank', label: 'Blank project', hint: 'Start from scratch with .env.local ready' },\n { value: 'template', label: 'Start from a template', hint: 'Pre-built starter apps' },\n ],\n });\n if (prompts.isCancel(approach)) process.exit(0);\n\n captureEvent(orgId, 'create_approach_selected', {\n approach,\n });\n\n if (approach === 'blank') {\n template = 'empty';\n } else {\n const selected = await prompts.select<string>({\n message: 'Choose a starter template:',\n options: [\n { value: 'react', label: 'Web app template with React' },\n { value: 'nextjs', label: 'Web app template with Next.js' },\n { value: 'chatbot', label: 'AI Chatbot with Next.js' },\n { value: 'crm', label: 'CRM with Next.js' },\n { value: 'e-commerce', label: 'E-Commerce store with Next.js' },\n { value: 'todo', label: 'Todo app with Next.js' },\n ],\n });\n if (prompts.isCancel(selected)) process.exit(0);\n template = selected;\n }\n }\n }\n\n captureEvent(orgId, 'template_selected', {\n template,\n approach: template === 'empty' ? 'blank' : 'template',\n });\n\n // 4. Choose directory (templates need a subdirectory, blank uses cwd)\n const hasTemplate = template !== 'empty';\n let dirName: string | null = null;\n const originalCwd = process.cwd();\n let projectDir = originalCwd;\n\n if (hasTemplate) {\n dirName = projectName;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: projectName,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n // Validate normalized dirName\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n // Create the project directory and switch into it\n projectDir = path.resolve(originalCwd, dirName);\n const dirExists = await fs.stat(projectDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(projectDir);\n process.chdir(projectDir);\n }\n\n // 5. Create project via Platform API\n let projectLinked = false;\n const s = !json ? clack.spinner() : null;\n try {\n s?.start('Creating project...');\n\n const project = await createProject(orgId, projectName, opts.region, apiUrl);\n\n s?.message('Waiting for project to become active...');\n await waitForProjectActive(project.id, apiUrl);\n\n // 6. Fetch API key and link project\n const apiKey = await getProjectApiKey(project.id, apiUrl);\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n saveProjectConfig(projectConfig);\n projectLinked = true;\n\n s?.stop(`Project \"${project.name}\" created and linked`);\n\n // 7. Download template or seed env for blank projects\n const githubTemplates = ['chatbot', 'crm', 'e-commerce', 'nextjs', 'react', 'todo'];\n if (githubTemplates.includes(template!)) {\n await downloadGitHubTemplate(template!, projectConfig, json);\n } else if (hasTemplate) {\n await downloadTemplate(template as Framework, projectConfig, projectName, json, apiUrl);\n } else {\n // Blank project: seed .env.local with InsForge credentials (non-fatal)\n try {\n const anonKey = await getAnonKey();\n if (!anonKey) {\n if (!json) clack.log.warn('Could not retrieve anon key. You can add it to .env.local manually.');\n } else {\n const envPath = path.join(process.cwd(), '.env.local');\n const envContent = [\n '# InsForge',\n `NEXT_PUBLIC_INSFORGE_URL=${projectConfig.oss_host}`,\n `NEXT_PUBLIC_INSFORGE_ANON_KEY=${anonKey}`,\n '',\n ].join('\\n');\n await fs.writeFile(envPath, envContent, { flag: 'wx' });\n if (!json) {\n clack.log.success('Created .env.local with your InsForge credentials');\n }\n }\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (!json) {\n if (error.code === 'EEXIST') {\n clack.log.warn('.env.local already exists; skipping InsForge key seeding.');\n } else {\n clack.log.warn(`Failed to create .env.local: ${error.message}`);\n }\n }\n }\n }\n\n // Install agent skills\n await installSkills(json);\n trackCommand('create', orgId);\n await reportCliUsage('cli.create', true, 6);\n\n // 8. Install npm dependencies (template projects only, if download succeeded)\n const templateDownloaded = hasTemplate\n ? await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null)\n : null;\n\n if (templateDownloaded) {\n const installSpinner = !json ? clack.spinner() : null;\n installSpinner?.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner?.stop('Dependencies installed');\n } catch (err) {\n installSpinner?.stop('Failed to install dependencies');\n if (!json) {\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n }\n\n // 9. Offer to deploy (template projects, interactive mode only)\n let liveUrl: string | null = null;\n if (templateDownloaded && !json) {\n const shouldDeploy = await prompts.confirm({\n message: 'Would you like to deploy now?',\n });\n\n if (!prompts.isCancel(shouldDeploy) && shouldDeploy) {\n try {\n // Read env vars from .env.local or .env to pass to deployment\n const envVars = await readEnvFile(process.cwd());\n const startBody: { envVars?: Array<{ key: string; value: string }> } = {};\n if (envVars.length > 0) {\n startBody.envVars = envVars;\n }\n\n const deploySpinner = clack.spinner();\n const result = await deployProject({\n sourceDir: process.cwd(),\n startBody,\n spinner: deploySpinner,\n });\n\n if (result.isReady) {\n deploySpinner.stop('Deployment complete');\n liveUrl = result.liveUrl;\n } else {\n deploySpinner.stop('Deployment is still building');\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 2 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n } catch (err) {\n clack.log.warn(`Deploy failed: ${(err as Error).message}`);\n }\n }\n }\n\n // 10. Show links and next steps\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n\n if (json) {\n outputJson({\n success: true,\n project: { id: project.id, name: project.name, appkey: project.appkey, region: project.region },\n template,\n ...(dirName ? { directory: dirName } : {}),\n urls: {\n dashboard: dashboardUrl,\n ...(liveUrl ? { liveSite: liveUrl } : {}),\n },\n });\n } else {\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n if (liveUrl) {\n clack.log.success(`Live site: ${liveUrl}`);\n }\n\n // Next steps\n if (templateDownloaded) {\n const steps = [\n `cd ${dirName}`,\n 'npm run dev',\n ];\n clack.note(steps.join('\\n'), 'Next steps');\n clack.note('Open your coding agent (Claude Code, Codex, Cursor, etc.) to add new features.', 'Keep building');\n } else if (hasTemplate && !templateDownloaded) {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n } else {\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n clack.outro('Done!');\n }\n } catch (err) {\n // Clean up the project directory if it was created but linking failed\n if (!projectLinked && hasTemplate && projectDir !== originalCwd) {\n process.chdir(originalCwd);\n await fs.rm(projectDir, { recursive: true, force: true }).catch(() => {});\n }\n throw err;\n }\n } catch (err) {\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nexport async function downloadTemplate(\n framework: Framework,\n projectConfig: ProjectConfig,\n projectName: string,\n json: boolean,\n _apiUrl?: string,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start('Downloading template...');\n\n try {\n // Get the anon key from the OSS backend\n const anonKey = await getAnonKey();\n if (!anonKey) {\n throw new Error('Failed to retrieve anon key from backend');\n }\n\n // Create temp directory for download\n const tempDir = tmpdir();\n const targetDir = projectName;\n const templatePath = path.join(tempDir, targetDir);\n\n // Remove existing temp directory if it exists\n try {\n await fs.rm(templatePath, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, which is fine\n }\n\n const frame = framework === 'nextjs' ? 'nextjs' : 'react';\n const esc = (s: string) => process.platform === 'win32' ? `\"${s.replace(/\"/g, '\\\\\"')}\"` : `'${s.replace(/'/g, \"'\\\\''\")}'`;\n const command = `npx --yes create-insforge-app@latest ${esc(targetDir)} --frame ${frame} --base-url ${esc(projectConfig.oss_host)} --anon-key ${esc(anonKey)} --skip-install`;\n\n s?.message(`Running create-insforge-app (${frame})...`);\n\n await execAsync(command, {\n maxBuffer: 10 * 1024 * 1024,\n cwd: tempDir,\n });\n\n // Copy template files to current directory\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templatePath, cwd);\n\n // Cleanup temp directory\n await fs.rm(templatePath, { recursive: true, force: true }).catch(() => {});\n\n s?.stop('Template files downloaded');\n } catch (err) {\n s?.stop('Template download failed');\n if (!json) {\n clack.log.warn(`Failed to download template: ${(err as Error).message}`);\n clack.log.info('You can manually set up the template later.');\n }\n }\n}\n\nexport async function downloadGitHubTemplate(\n templateName: string,\n projectConfig: ProjectConfig,\n json: boolean,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start(`Downloading ${templateName} template...`);\n\n const tempDir = path.join(tmpdir(), `insforge-template-${Date.now()}`);\n\n try {\n await fs.mkdir(tempDir, { recursive: true });\n\n // Shallow clone the templates repo\n await execAsync(\n 'git clone --depth 1 https://github.com/InsForge/insforge-templates.git .',\n { cwd: tempDir, maxBuffer: 10 * 1024 * 1024, timeout: 60_000 },\n );\n\n const templateDir = path.join(tempDir, templateName);\n const stat = await fs.stat(templateDir).catch(() => null);\n if (!stat?.isDirectory()) {\n throw new Error(`Template \"${templateName}\" not found in repository`);\n }\n\n // Copy template files to cwd\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templateDir, cwd);\n\n // Write .env.local from .env.example with InsForge credentials filled in\n const envExamplePath = path.join(cwd, '.env.example');\n const envExampleExists = await fs.stat(envExamplePath).catch(() => null);\n if (envExampleExists) {\n const anonKey = await getAnonKey();\n const envExample = await fs.readFile(envExamplePath, 'utf-8');\n const envContent = envExample.replace(\n /^([A-Z][A-Z0-9_]*=)(.*)$/gm,\n (_, prefix: string, _value: string) => {\n const key = prefix.slice(0, -1); // remove trailing '='\n if (/INSFORGE.*(URL|BASE_URL)$/.test(key)) return `${prefix}${projectConfig.oss_host}`;\n if (/INSFORGE.*ANON_KEY$/.test(key)) return `${prefix}${anonKey}`;\n if (key === 'NEXT_PUBLIC_APP_URL') return `${prefix}https://${projectConfig.appkey}.insforge.site`;\n return `${prefix}${_value}`;\n },\n );\n const envLocalPath = path.join(cwd, '.env.local');\n try {\n await fs.writeFile(envLocalPath, envContent, { flag: 'wx' });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'EEXIST') {\n if (!json) clack.log.warn('.env.local already exists; skipping env seeding.');\n } else {\n throw e;\n }\n }\n }\n\n s?.stop(`${templateName} template downloaded`);\n\n // Auto-run database migrations if db_init.sql exists\n const migrationPath = path.join(cwd, 'migrations', 'db_init.sql');\n const migrationExists = await fs.stat(migrationPath).catch(() => null);\n if (migrationExists) {\n const dbSpinner = !json ? clack.spinner() : null;\n dbSpinner?.start('Running database migrations...');\n try {\n const sql = await fs.readFile(migrationPath, 'utf-8');\n await runRawSql(sql, true);\n dbSpinner?.stop('Database migrations applied');\n } catch (err) {\n dbSpinner?.stop('Database migration failed');\n if (!json) {\n clack.log.warn(`Migration failed: ${(err as Error).message}`);\n clack.log.info('You can run the migration manually: npx @insforge/cli db query --unrestricted \"$(cat migrations/db_init.sql)\"');\n } else {\n throw err;\n }\n }\n }\n } catch (err) {\n s?.stop(`${templateName} template download failed`);\n if (!json) {\n clack.log.warn(`Failed to download ${templateName} template: ${(err as Error).message}`);\n clack.log.info('You can manually clone from: https://github.com/InsForge/insforge-templates');\n }\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\n","import { getProjectConfig } from '../config.js';\nimport { CLIError, ProjectNotLinkedError } from '../errors.js';\nimport type { ProjectConfig } from '../../types.js';\n\nfunction requireProjectConfig(): ProjectConfig {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n return config;\n}\n\n/**\n * Unified OSS API fetch. Uses API key as Bearer token for all requests,\n * which grants superadmin access (SQL execution, bucket management, etc.).\n */\nexport interface RawSqlResult {\n rows: Record<string, unknown>[];\n raw: Record<string, unknown>;\n}\n\nexport async function runRawSql(sql: string, unrestricted = false): Promise<RawSqlResult> {\n const endpoint = unrestricted\n ? '/api/database/advance/rawsql/unrestricted'\n : '/api/database/advance/rawsql';\n const res = await ossFetch(endpoint, {\n method: 'POST',\n body: JSON.stringify({ query: sql }),\n });\n const raw = await res.json() as Record<string, unknown>;\n const rows = (raw.rows ?? raw.data ?? []) as Record<string, unknown>[];\n return { rows, raw };\n}\n\nexport async function getAnonKey(): Promise<string> {\n const res = await ossFetch('/api/auth/tokens/anon', { method: 'POST' });\n const data = await res.json() as { accessToken: string };\n return data.accessToken;\n}\n\nexport async function ossFetch(\n path: string,\n options: RequestInit = {},\n): Promise<Response> {\n const config = requireProjectConfig();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n ...(options.headers as Record<string, string> ?? {}),\n };\n\n const res = await fetch(`${config.oss_host}${path}`, { ...options, headers });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as {\n error?: string;\n message?: string;\n nextActions?: string;\n statusCode?: number;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${res.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n // Feature not available on this backend version — ONLY when the 404 is a\n // route-level miss (no structured error code), not a resource-level miss\n // like COMPUTE_SERVICE_NOT_FOUND. Otherwise we'd hide real \"service doesn't\n // exist\" errors behind a misleading \"feature not enabled\" message.\n const isRouteLevel404 = !err.error || err.error === 'NOT_FOUND';\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/compute')) {\n message = 'Compute services are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin to enable compute.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/payments')) {\n message = 'Payments are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud/private preview: contact your InsForge admin to enable payments.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path === '/api/database/migrations') {\n message = 'Database migrations are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin about database migration support.';\n }\n\n throw new CLIError(message);\n }\n\n return res;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * Read environment variables from the first env file found in the directory.\n * Priority: .env.local > .env.production > .env\n */\nexport async function readEnvFile(cwd: string): Promise<Array<{ key: string; value: string }>> {\n const candidates = ['.env.local', '.env.production', '.env'];\n for (const name of candidates) {\n const filePath = path.join(cwd, name);\n const exists = await fs.stat(filePath).catch(() => null);\n if (!exists) continue;\n\n const content = await fs.readFile(filePath, 'utf-8');\n const vars: Array<{ key: string; value: string }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) vars.push({ key, value });\n }\n return vars;\n }\n return [];\n}\n","import type { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport * as clack from '@clack/prompts';\nimport archiver from 'archiver';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError, getDeploymentError, formatFetchError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type {\n CreateDeploymentResponse,\n CreateDirectDeploymentRequest,\n CreateDirectDeploymentResponse,\n DeploymentManifestFile,\n DeploymentManifestFileEntry,\n DeploymentSchema,\n ProjectConfig,\n StartDeploymentRequest,\n} from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_TIMEOUT_MS = 300_000;\nconst DIRECT_UPLOAD_CONCURRENCY = 8;\n\nconst EXCLUDE_PATTERNS = [\n 'node_modules',\n '.git',\n '.next',\n '.env',\n '.env.local',\n 'dist',\n 'build',\n '.DS_Store',\n '.insforge',\n // IDE and AI agent configs\n '.claude',\n '.agents',\n '.augment',\n '.kilocode',\n '.kiro',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n '.vercel',\n '.turbo',\n '.cache',\n 'skills',\n 'coverage',\n];\n\ntype LocalDeploymentFile = DeploymentManifestFileEntry & {\n absolutePath: string;\n};\n\nclass DirectDeploymentUnsupportedError extends Error {\n constructor() {\n super('Direct deployment endpoints are not available on this backend');\n this.name = 'DirectDeploymentUnsupportedError';\n }\n}\n\nfunction shouldExclude(name: string): boolean {\n const normalized = name.replace(/\\\\/g, '/');\n for (const pattern of EXCLUDE_PATTERNS) {\n if (\n normalized === pattern ||\n normalized.startsWith(pattern + '/') ||\n normalized.endsWith('/' + pattern) ||\n normalized.includes('/' + pattern + '/')\n ) {\n return true;\n }\n }\n if (normalized.endsWith('.log')) return true;\n return false;\n}\n\nfunction isInsforgeCloudOssHost(ossHost: string): boolean {\n try {\n return new URL(ossHost).hostname.endsWith('.insforge.app');\n } catch {\n return false;\n }\n}\n\nfunction normalizeRelativePath(sourceDir: string, absolutePath: string): string {\n return path.relative(sourceDir, absolutePath).split(path.sep).join('/').replace(/\\\\/g, '/');\n}\n\nasync function hashFile(filePath: string): Promise<{ sha: string; size: number }> {\n const hash = createHash('sha1');\n let size = 0;\n\n for await (const chunk of createReadStream(filePath)) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n hash.update(buffer);\n }\n\n return { sha: hash.digest('hex'), size };\n}\n\nasync function collectDeploymentFiles(sourceDir: string): Promise<LocalDeploymentFile[]> {\n const files: LocalDeploymentFile[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n entries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(currentDir, entry.name);\n const normalizedPath = normalizeRelativePath(sourceDir, absolutePath);\n\n if (!normalizedPath || shouldExclude(normalizedPath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await walk(absolutePath);\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n const { sha, size } = await hashFile(absolutePath);\n files.push({\n absolutePath,\n path: normalizedPath,\n sha,\n size,\n });\n }\n }\n\n await walk(sourceDir);\n return files;\n}\n\nasync function createZipBuffer(sourceDir: string): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n const archive = archiver('zip', { zlib: { level: 9 } });\n const chunks: Buffer[] = [];\n\n archive.on('data', (chunk: Buffer) => chunks.push(chunk));\n archive.on('end', () => resolve(Buffer.concat(chunks)));\n archive.on('error', (err: Error) => reject(err));\n\n archive.directory(sourceDir, false, (entry) => {\n if (shouldExclude(entry.name)) return false;\n return entry;\n });\n\n void archive.finalize();\n });\n}\n\nasync function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex;\n nextIndex += 1;\n await worker(items[index], index);\n }\n }\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n}\n\nasync function createDirectDeploymentSession(\n config: ProjectConfig,\n files: CreateDirectDeploymentRequest['files'],\n): Promise<CreateDirectDeploymentResponse> {\n const url = `${config.oss_host}/api/deployments/direct`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({ files }),\n });\n } catch (error) {\n throw new CLIError(formatFetchError(error, url));\n }\n\n if (response.status === 404) {\n throw new DirectDeploymentUnsupportedError();\n }\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n nextActions?: string;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${response.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n throw new CLIError(message);\n }\n\n const payload = (await response.json()) as Partial<CreateDirectDeploymentResponse>;\n if (!payload.id || !Array.isArray(payload.files)) {\n throw new CLIError('Unexpected response from direct deployment create endpoint.');\n }\n\n return payload as CreateDirectDeploymentResponse;\n}\n\nasync function uploadDirectDeploymentFile(\n deploymentId: string,\n manifestFile: DeploymentManifestFile,\n localFile: LocalDeploymentFile,\n): Promise<void> {\n const requestInit = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': String(localFile.size),\n },\n body: createReadStream(localFile.absolutePath),\n duplex: 'half',\n } as RequestInit & { duplex: 'half' };\n\n await ossFetch(\n `/api/deployments/${encodeURIComponent(deploymentId)}/files/${encodeURIComponent(manifestFile.fileId)}/content`,\n requestInit,\n );\n}\n\nasync function startDirectDeployment(\n deploymentId: string,\n startBody: StartDeploymentRequest,\n): Promise<void> {\n const response = await ossFetch(`/api/deployments/${encodeURIComponent(deploymentId)}/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(startBody),\n });\n\n await response.json();\n}\n\nasync function pollDeployment(\n deploymentId: string,\n spinner: ReturnType<typeof clack.spinner> | null | undefined,\n syncBeforeRead: boolean,\n): Promise<DeployProjectResult> {\n spinner?.message('Building and deploying...');\n const startTime = Date.now();\n let deployment: DeploymentSchema | null = null;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n try {\n if (syncBeforeRead) {\n await ossFetch(`/api/deployments/${deploymentId}/sync`, { method: 'POST' });\n }\n\n const statusRes = await ossFetch(`/api/deployments/${deploymentId}`);\n deployment = (await statusRes.json()) as DeploymentSchema;\n const status = deployment.status.toUpperCase();\n\n if (status === 'READY') {\n break;\n }\n if (status === 'ERROR' || status === 'CANCELED') {\n spinner?.stop('Deployment failed');\n throw new CLIError(\n getDeploymentError(deployment.metadata) ?? `Deployment failed with status: ${deployment.status}`,\n );\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n spinner?.message(`Building and deploying... (${elapsed}s, status: ${deployment.status})`);\n } catch (err) {\n if (err instanceof CLIError) throw err;\n // Ignore transient fetch errors during polling\n }\n }\n\n const isReady = deployment?.status.toUpperCase() === 'READY';\n const liveUrl = isReady ? (deployment?.url ?? null) : null;\n\n return { deploymentId, deployment, isReady, liveUrl };\n}\n\nasync function deployProjectDirect(\n opts: DeployProjectOptions,\n config: ProjectConfig,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.start('Scanning source files...');\n const localFiles = await collectDeploymentFiles(sourceDir);\n if (localFiles.length === 0) {\n throw new CLIError('No deployable files found in the source directory.');\n }\n\n spinner?.message('Creating deployment...');\n const createResult = await createDirectDeploymentSession(\n config,\n localFiles.map(({ path: relativePath, sha, size }) => ({ path: relativePath, sha, size })),\n );\n\n const localFileByPath = new Map(localFiles.map((file) => [file.path, file]));\n\n const pendingFiles = createResult.files.filter((file) => !file.uploadedAt);\n\n spinner?.message(`Uploading ${pendingFiles.length} file${pendingFiles.length === 1 ? '' : 's'}...`);\n await runWithConcurrency(pendingFiles, DIRECT_UPLOAD_CONCURRENCY, async (manifestFile) => {\n const localFile = localFileByPath.get(manifestFile.path);\n if (!localFile) {\n throw new CLIError(`Backend returned an unknown file path: ${manifestFile.path}`);\n }\n if (localFile.sha !== manifestFile.sha || localFile.size !== manifestFile.size) {\n throw new CLIError(`Backend file metadata mismatch for: ${manifestFile.path}`);\n }\n\n await uploadDirectDeploymentFile(createResult.id, manifestFile, localFile);\n });\n\n spinner?.message('Starting deployment...');\n await startDirectDeployment(createResult.id, startBody);\n\n return await pollDeployment(createResult.id, spinner, !isInsforgeCloudOssHost(config.oss_host));\n}\n\nasync function deployProjectLegacy(\n opts: DeployProjectOptions,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.message('Creating deployment...');\n const createRes = await ossFetch('/api/deployments', { method: 'POST' });\n const { id: deploymentId, uploadUrl, uploadFields } =\n (await createRes.json()) as CreateDeploymentResponse;\n\n spinner?.message('Compressing source files...');\n const zipBuffer = await createZipBuffer(sourceDir);\n\n spinner?.message('Uploading...');\n const formData = new FormData();\n for (const [key, value] of Object.entries(uploadFields)) {\n formData.append(key, value);\n }\n formData.append('file', new Blob([zipBuffer], { type: 'application/zip' }), 'deployment.zip');\n\n const uploadRes = await fetch(uploadUrl, { method: 'POST', body: formData });\n if (!uploadRes.ok) {\n const uploadErr = await uploadRes.text();\n throw new CLIError(`Failed to upload: ${uploadErr}`);\n }\n\n spinner?.message('Starting deployment...');\n const startRes = await ossFetch(`/api/deployments/${deploymentId}/start`, {\n method: 'POST',\n body: JSON.stringify(startBody),\n });\n await startRes.json();\n\n return await pollDeployment(deploymentId, spinner, false);\n}\n\nexport interface DeployProjectOptions {\n sourceDir: string;\n startBody?: StartDeploymentRequest;\n spinner?: ReturnType<typeof clack.spinner> | null;\n}\n\nexport interface DeployProjectResult {\n deploymentId: string;\n deployment: DeploymentSchema | null;\n isReady: boolean;\n liveUrl: string | null;\n}\n\n/**\n * Core deploy logic: direct upload -> start -> poll.\n * Falls back to the legacy zip upload flow when the backend does not expose\n * the direct deployment endpoints yet.\n */\nexport async function deployProject(opts: DeployProjectOptions): Promise<DeployProjectResult> {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n\n try {\n return await deployProjectDirect(opts, config);\n } catch (error) {\n if (!(error instanceof DirectDeploymentUnsupportedError)) {\n throw error;\n }\n\n opts.spinner?.message('Direct deployment is not available on this backend. Falling back to the legacy zip upload flow...');\n return await deployProjectLegacy(opts);\n }\n}\n\nexport function registerDeploymentsDeployCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('deploy [directory]')\n .description('Deploy a frontend project to Vercel')\n .option('--env <vars>', 'Environment variables as JSON (e.g. {\"KEY\":\"value\"})')\n .option('--meta <meta>', 'Deployment metadata as JSON')\n .action(async (directory: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n // Resolve source directory\n const sourceDir = path.resolve(directory ?? '.');\n const stats = await fs.stat(sourceDir).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new CLIError(`\"${sourceDir}\" is not a valid directory.`);\n }\n\n // Reject excluded directories as deploy source\n const dirName = path.basename(sourceDir);\n if (EXCLUDE_PATTERNS.includes(dirName)) {\n throw new CLIError(\n `\"${dirName}\" is an excluded directory and cannot be used as a deploy source. Please specify your project root or output directory instead.`,\n );\n }\n\n const spinner = !json ? clack.spinner() : null;\n\n // Parse env/meta from CLI flags\n const startBody: StartDeploymentRequest = {};\n if (opts.env) {\n try {\n const parsed = JSON.parse(opts.env) as unknown;\n if (Array.isArray(parsed)) {\n startBody.envVars = parsed as Array<{ key: string; value: string }>;\n } else if (parsed && typeof parsed === 'object') {\n startBody.envVars = Object.entries(parsed as Record<string, unknown>).map(([key, value]) => ({\n key,\n value: String(value),\n }));\n } else {\n throw new CLIError('Invalid --env JSON. Expected an object or array.');\n }\n } catch {\n throw new CLIError('Invalid --env JSON.');\n }\n }\n if (opts.meta) {\n try {\n startBody.meta = JSON.parse(opts.meta);\n } catch {\n throw new CLIError('Invalid --meta JSON.');\n }\n }\n\n const result = await deployProject({ sourceDir, startBody, spinner });\n\n if (result.isReady) {\n spinner?.stop('Deployment complete');\n if (json) {\n outputJson(result.deployment);\n } else {\n if (result.liveUrl) {\n clack.log.success(`Live at: ${result.liveUrl}`);\n }\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n }\n } else {\n spinner?.stop('Deployment is still building');\n if (json) {\n outputJson({\n id: result.deploymentId,\n status: result.deployment?.status ?? 'building',\n timedOut: true,\n });\n } else {\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 5 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n }\n await reportCliUsage('cli.deployments.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbCommands(dbCmd: Command): void {\n dbCmd\n .command('query <sql>')\n .description('Execute a SQL query against the database')\n .option('--unrestricted', 'Use unrestricted mode (allows system table access)')\n .action(async (sql: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const { rows, raw } = await runRawSql(sql, !!opts.unrestricted);\n\n if (json) {\n outputJson(raw);\n } else {\n if (rows.length > 0) {\n const headers = Object.keys(rows[0]);\n outputTable(\n headers,\n rows.map((row) => headers.map((h) => String(row[h] ?? ''))),\n );\n console.log(`${rows.length} row(s) returned.`);\n } else {\n console.log('Query executed successfully.');\n if (rows.length === 0) {\n console.log('No rows returned.');\n }\n }\n }\n await reportCliUsage('cli.db.query', true);\n } catch (err) {\n await reportCliUsage('cli.db.query', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTablesCommand(dbCmd: Command): void {\n dbCmd\n .command('tables')\n .description('List all database tables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/tables');\n const tables = await res.json() as string[];\n\n if (json) {\n outputJson(tables);\n } else {\n if (tables.length === 0) {\n console.log('No tables found.');\n return;\n }\n outputTable(\n ['Table Name'],\n tables.map((t) => [t]),\n );\n }\n await reportCliUsage('cli.db.tables', true);\n } catch (err) {\n await reportCliUsage('cli.db.tables', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbFunctionsCommand(dbCmd: Command): void {\n dbCmd\n .command('functions')\n .description('List all database functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/functions');\n const raw = await res.json();\n const functions: DatabaseFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseFunctionsResponse).functions ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No database functions found.');\n return;\n }\n outputTable(\n ['Name', 'Definition', 'Kind'],\n functions.map((f) => [f.functionName, f.functionDef, f.kind]),\n );\n }\n await reportCliUsage('cli.db.functions', true);\n } catch (err) {\n await reportCliUsage('cli.db.functions', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseIndexesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbIndexesCommand(dbCmd: Command): void {\n dbCmd\n .command('indexes')\n .description('List all database indexes')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/indexes');\n const raw = await res.json();\n const indexes: DatabaseIndexesResponse['indexes'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseIndexesResponse).indexes ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (indexes.length === 0) {\n console.log('No database indexes found.');\n return;\n }\n outputTable(\n ['Table', 'Index Name', 'Definition', 'Unique', 'Primary'],\n indexes.map((i) => [\n i.tableName,\n i.indexName,\n i.indexDef,\n i.isUnique ? 'Yes' : 'No',\n i.isPrimary ? 'Yes' : 'No',\n ]),\n );\n }\n await reportCliUsage('cli.db.indexes', true);\n } catch (err) {\n await reportCliUsage('cli.db.indexes', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabasePoliciesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbPoliciesCommand(dbCmd: Command): void {\n dbCmd\n .command('policies')\n .description('List all RLS policies')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/policies');\n const raw = await res.json();\n const policies: DatabasePoliciesResponse['policies'] = Array.isArray(raw)\n ? raw\n : (raw as DatabasePoliciesResponse).policies ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (policies.length === 0) {\n console.log('No RLS policies found.');\n return;\n }\n outputTable(\n ['Table', 'Policy Name', 'Command', 'Roles', 'Qual', 'With Check'],\n policies.map((p) => [\n String(p.tableName ?? '-'),\n String(p.policyName ?? '-'),\n String(p.cmd ?? '-'),\n Array.isArray(p.roles) ? p.roles.join(', ') : String(p.roles ?? '-'),\n String(p.qual ?? '-'),\n String(p.withCheck ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.db.policies', true);\n } catch (err) {\n await reportCliUsage('cli.db.policies', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseTriggersResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTriggersCommand(dbCmd: Command): void {\n dbCmd\n .command('triggers')\n .description('List all database triggers')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/triggers');\n const raw = await res.json();\n const triggers: DatabaseTriggersResponse['triggers'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseTriggersResponse).triggers ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (triggers.length === 0) {\n console.log('No database triggers found.');\n return;\n }\n outputTable(\n ['Name', 'Table', 'Timing', 'Events', 'ActionOrientation', 'ActionCondition', 'ActionStatement'],\n triggers.map((t) => [\n t.triggerName,\n t.tableName,\n t.actionTiming,\n t.eventManipulation,\n t.actionOrientation,\n t.actionCondition ?? '-',\n t.actionStatement,\n ]),\n );\n }\n await reportCliUsage('cli.db.triggers', true);\n } catch (err) {\n await reportCliUsage('cli.db.triggers', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbRpcCommand(dbCmd: Command): void {\n dbCmd\n .command('rpc <functionName>')\n .description('Call a database function via RPC')\n .option('--data <json>', 'JSON body to pass as function parameters')\n .action(async (functionName: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body = opts.data ? JSON.stringify(JSON.parse(opts.data) as unknown) : undefined;\n\n const res = await ossFetch(`/api/database/rpc/${encodeURIComponent(functionName)}`, {\n method: body ? 'POST' : 'GET',\n ...(body ? { body } : {}),\n });\n\n const result = await res.json() as unknown;\n\n if (json) {\n outputJson(result);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n await reportCliUsage('cli.db.rpc', true);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbExportCommand(dbCmd: Command): void {\n dbCmd\n .command('export')\n .description('Export database schema and/or data')\n .option('--format <format>', 'Export format: sql or json', 'sql')\n .option('--tables <tables>', 'Comma-separated list of tables to export (default: all)')\n .option('--no-data', 'Exclude table data (schema only)')\n .option('--include-functions', 'Include database functions')\n .option('--include-sequences', 'Include sequences')\n .option('--include-views', 'Include views')\n .option('--row-limit <n>', 'Maximum rows per table')\n .option('-o, --output <file>', 'Output file path (default: stdout)')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n format: opts.format,\n includeData: opts.data !== false,\n };\n\n if (opts.tables) {\n body.tables = (opts.tables as string).split(',').map((t: string) => t.trim());\n }\n if (opts.includeFunctions) body.includeFunctions = true;\n if (opts.includeSequences) body.includeSequences = true;\n if (opts.includeViews) body.includeViews = true;\n if (opts.rowLimit) body.rowLimit = parseInt(opts.rowLimit as string, 10);\n\n const res = await ossFetch('/api/database/advance/export', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const raw = await res.text();\n\n // API may return JSON wrapper { format, content, tables } or raw SQL/JSON text\n let content: string;\n let meta: { format?: string; tables?: string[] } | null = null;\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.content === 'string') {\n content = parsed.content;\n meta = { format: parsed.format as string, tables: parsed.tables as string[] };\n } else {\n content = raw;\n }\n } catch {\n content = raw;\n }\n\n if (json) {\n outputJson(meta ?? { content });\n return;\n }\n\n if (opts.output) {\n writeFileSync(opts.output as string, content);\n const tableCount = meta?.tables?.length;\n const suffix = tableCount ? ` (${tableCount} tables, format: ${meta?.format ?? opts.format})` : '';\n outputSuccess(`Exported to ${opts.output}${suffix}`);\n } else {\n console.log(content);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbImportCommand(dbCmd: Command): void {\n dbCmd\n .command('import <file>')\n .description('Import database from a local SQL file')\n .option('--truncate', 'Truncate existing tables before import')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const fileContent = readFileSync(file);\n const fileName = basename(file);\n\n const formData = new FormData();\n formData.append('file', new Blob([fileContent]), fileName);\n if (opts.truncate) {\n formData.append('truncate', 'true');\n }\n\n const res = await fetch(`${config.oss_host}/api/database/advance/import`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Import failed: ${res.status}`);\n }\n\n const data = await res.json() as { filename: string; fileSize: number; tables: string[]; rowsImported: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Imported ${data.filename} (${data.tables.length} tables, ${data.rowsImported} rows)`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport {\n canonicalMigrationVersion,\n compareMigrationVersions,\n ensureMigrationsDir,\n findOlderThanHeadLocalMigrations,\n formatMigrationSql,\n getMigrationsDir,\n getNextLocalMigrationVersion,\n getRemoteMigrationVersionStatus,\n listLocalMigrationFilenames,\n parseMigrationFilename,\n parseStrictLocalMigrations,\n resolveMigrationTarget,\n} from '../../lib/migrations.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type {\n CreateMigrationRequest,\n CreateMigrationResponse,\n DatabaseMigrationsResponse,\n Migration,\n} from '../../types.js';\n\nfunction getLatestRemoteVersion(migrations: Migration[]): string | null {\n return migrations.reduce(\n (latestVersion, migration) =>\n !latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0\n ? migration.version\n : latestVersion,\n null as string | null,\n );\n}\n\nfunction buildMigrationFilename(version: string, name: string): string {\n return `${version}_${name}.sql`;\n}\n\nfunction buildOlderThanHeadError(\n migrationLabel: string,\n latestRemoteVersion: string,\n): CLIError {\n return new CLIError(\n `Migration ${migrationLabel} is older than the current remote head (${latestRemoteVersion}) and is not applied remotely. Rename it with a newer timestamp, or delete it locally if it is stale.`,\n );\n}\n\nfunction formatCreatedAt(createdAt: string): string {\n const date = new Date(createdAt);\n return Number.isNaN(date.getTime()) ? createdAt : date.toLocaleString();\n}\n\nasync function fetchRemoteMigrations(): Promise<Migration[]> {\n const res = await ossFetch('/api/database/migrations');\n const raw = (await res.json()) as DatabaseMigrationsResponse;\n const migrations = Array.isArray(raw.migrations) ? raw.migrations : [];\n\n for (const migration of migrations) {\n migration.version = canonicalMigrationVersion(migration.version);\n }\n\n return migrations;\n}\n\nfunction assertValidMigrationName(name: string): void {\n if (!/^[a-z0-9-]+$/u.test(name)) {\n throw new CLIError('Migration name must use lowercase letters, numbers, and hyphens only.');\n }\n}\n\nasync function applyMigration(\n targetMigration: Pick<Migration, 'version' | 'name'>,\n sql: string,\n): Promise<CreateMigrationResponse> {\n const body: CreateMigrationRequest = {\n version: targetMigration.version,\n name: targetMigration.name,\n sql,\n };\n\n const res = await ossFetch('/api/database/migrations', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const createdMigration = (await res.json()) as CreateMigrationResponse;\n\n if (createdMigration.version !== targetMigration.version) {\n throw new CLIError(\n `Applied migration version mismatch. Expected ${targetMigration.version}, received ${createdMigration.version}.`,\n );\n }\n\n return createdMigration;\n}\n\nexport function registerDbMigrationsCommand(dbCmd: Command): void {\n const migrationsCmd = dbCmd.command('migrations').description('Manage database migration files');\n\n migrationsCmd\n .command('list')\n .description('List applied remote database migrations')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n\n if (json) {\n outputJson({ migrations });\n } else if (migrations.length === 0) {\n console.log('No database migrations found.');\n } else {\n outputTable(\n ['Version', 'Name', 'Created At'],\n migrations.map((migration) => [\n migration.version,\n migration.name,\n formatCreatedAt(migration.createdAt),\n ]),\n );\n }\n\n await reportCliUsage('cli.db.migrations.list', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.list', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('fetch')\n .description('Fetch applied remote migrations into migrations/')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const migrationsDir = ensureMigrationsDir();\n // Skip by canonical version, not just filepath: a local `0001_foo.sql`\n // and a remote `1_foo.sql` refer to the same migration, and writing\n // both would fail parseStrictLocalMigrations' duplicate-version check.\n const existingLocalVersions = new Set(\n listLocalMigrationFilenames()\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .map((migration) => migration.version),\n );\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const migration of [...migrations].sort(\n (left, right) => compareMigrationVersions(left.version, right.version),\n )) {\n assertValidMigrationName(migration.name);\n\n const filename = buildMigrationFilename(\n migration.version,\n migration.name,\n );\n const filePath = join(migrationsDir, filename);\n\n if (existingLocalVersions.has(migration.version) || existsSync(filePath)) {\n skippedFiles.push(filename);\n continue;\n }\n\n writeFileSync(filePath, formatMigrationSql(migration.statements));\n createdFiles.push(filename);\n existingLocalVersions.add(migration.version);\n }\n\n if (json) {\n outputJson({\n directory: migrationsDir,\n totalRemoteMigrations: migrations.length,\n createdFiles,\n skippedFiles,\n });\n } else {\n outputSuccess(\n `Fetched ${migrations.length} remote migration(s) into ${migrationsDir}.`,\n );\n console.log(`Created: ${createdFiles.length}`);\n console.log(`Skipped: ${skippedFiles.length}`);\n }\n\n await reportCliUsage('cli.db.migrations.fetch', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.fetch', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('new <migration-name>')\n .description('Create a new local migration file')\n .action(async (migrationName: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n assertValidMigrationName(migrationName);\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const localMigrations = parseStrictLocalMigrations(listLocalMigrationFilenames());\n const nextVersion = getNextLocalMigrationVersion(\n localMigrations,\n latestRemoteVersion,\n );\n\n const filename = buildMigrationFilename(nextVersion, migrationName);\n const migrationsDir = ensureMigrationsDir();\n const filePath = join(migrationsDir, filename);\n\n try {\n writeFileSync(filePath, '', { flag: 'wx' });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new CLIError(`Migration file already exists: ${filename}`);\n }\n throw error;\n }\n\n if (json) {\n outputJson({ filename, path: filePath, version: nextVersion });\n } else {\n outputSuccess(`Created migration file ${filename}`);\n }\n\n await reportCliUsage('cli.db.migrations.new', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.new', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('up [target]')\n .description('Apply one or more local migration files')\n .option('--all', 'Apply all pending local migration files')\n .option('--to <version-or-filename>', 'Apply pending local migrations up to a version or file')\n .action(async (target: string | undefined, options, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const appliedRemoteVersions = new Set(\n migrations.map((migration) => migration.version),\n );\n const filenames = listLocalMigrationFilenames();\n\n const requestedModes = [Boolean(target), Boolean(options.all), Boolean(options.to)].filter(Boolean);\n if (requestedModes.length !== 1) {\n throw new CLIError(\n 'Use exactly one apply mode: `up <target>`, `up --to <version-or-filename>`, or `up --all`.',\n );\n }\n\n const applySingleTarget = async (targetMigrationFilenameOrVersion: string) => {\n const targetMigration = resolveMigrationTarget(targetMigrationFilenameOrVersion, filenames);\n const validLocalMigrations = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .sort((left, right) => compareMigrationVersions(left.version, right.version));\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetMigration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${targetMigration.filename} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(targetMigration.filename, latestRemoteVersion);\n }\n\n const earlierPendingMigration = validLocalMigrations.find(\n (migration) =>\n migration.version !== targetMigration.version &&\n (!latestRemoteVersion ||\n compareMigrationVersions(migration.version, latestRemoteVersion) > 0) &&\n compareMigrationVersions(migration.version, targetMigration.version) < 0,\n );\n\n if (earlierPendingMigration) {\n throw new CLIError(\n `Migration ${targetMigration.filename} is not the next pending local migration. Apply ${earlierPendingMigration.filename} first, or fix/delete it locally if it is invalid or no longer needed.`,\n );\n }\n\n const filePath = join(getMigrationsDir(), targetMigration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${targetMigration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${targetMigration.filename}`);\n }\n\n return applyMigration(targetMigration, sql);\n };\n\n let appliedMigrations: CreateMigrationResponse[] = [];\n\n if (target) {\n appliedMigrations = [await applySingleTarget(target)];\n } else {\n const localMigrations = parseStrictLocalMigrations(filenames);\n const olderThanHeadMigrations = findOlderThanHeadLocalMigrations(\n localMigrations,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n const pendingMigrations = localMigrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n ) === 'pending',\n );\n\n if (olderThanHeadMigrations.length > 0 && latestRemoteVersion) {\n throw buildOlderThanHeadError(\n olderThanHeadMigrations[0].filename,\n latestRemoteVersion,\n );\n }\n\n if (pendingMigrations.length === 0) {\n if (json) {\n outputJson({ appliedMigrations: [] });\n } else {\n outputSuccess('No pending local migrations to apply.');\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n return;\n }\n\n let migrationsToApply = pendingMigrations;\n\n if (options.to) {\n const targetVersion = /^\\d{14}$/u.test(options.to)\n ? options.to\n : resolveMigrationTarget(options.to, filenames).version;\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetVersion,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${options.to} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(options.to, latestRemoteVersion);\n }\n\n migrationsToApply = pendingMigrations.filter(\n (migration) => compareMigrationVersions(migration.version, targetVersion) <= 0,\n );\n\n if (\n migrationsToApply.length === 0 ||\n migrationsToApply[migrationsToApply.length - 1]?.version !== targetVersion\n ) {\n throw new CLIError(\n `Pending local migration not found for target ${options.to}.`,\n );\n }\n }\n\n for (const migration of migrationsToApply) {\n const filePath = join(getMigrationsDir(), migration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${migration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${migration.filename}`);\n }\n\n appliedMigrations.push(await applyMigration(migration, sql));\n }\n }\n\n if (json) {\n outputJson({ appliedMigrations });\n } else {\n outputSuccess(`Applied ${appliedMigrations.length} migration file(s).`);\n for (const migration of appliedMigrations) {\n console.log(`- ${buildMigrationFilename(migration.version, migration.name)}`);\n }\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.up', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport interface ParsedMigrationFile {\n filename: string;\n version: string;\n name: string;\n}\n\nexport type RemoteMigrationVersionStatus = 'already-applied' | 'older-than-head' | 'pending';\n\n// Cap at 64 digits so unbounded input can't DoS BigInt conversions or\n// the backend's `version::numeric` casts. 64 comfortably fits 4-digit\n// Drizzle sequences, 14-digit YYYYMMDDHHmmss timestamps, and anything\n// realistic in between.\nconst MIGRATION_VERSION_REGEX = /^\\d{1,64}$/u;\nconst MIGRATION_FILENAME_REGEX = /^(\\d{1,64})_([a-z0-9-]+)\\.sql$/u;\n\nexport function assertValidMigrationVersion(version: string): void {\n if (!MIGRATION_VERSION_REGEX.test(version)) {\n throw new CLIError(`Invalid migration version: ${version}. Expected a numeric string of at most 64 digits (e.g. 0001 or 20260418091500).`);\n }\n}\n\n// Numeric prefixes like \"0001\" and \"1\" refer to the same migration. Strip\n// leading zeros so Set lookups, equality checks, and duplicate detection all\n// agree with the numeric ordering in compareMigrationVersions.\nexport function canonicalMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n return BigInt(version).toString();\n}\n\nexport function parseMigrationFilename(filename: string): ParsedMigrationFile | null {\n const match = MIGRATION_FILENAME_REGEX.exec(filename);\n if (!match) {\n return null;\n }\n\n return {\n filename,\n version: canonicalMigrationVersion(match[1]),\n name: match[2],\n };\n}\n\nexport function compareMigrationVersions(left: string, right: string): number {\n if (MIGRATION_VERSION_REGEX.test(left) && MIGRATION_VERSION_REGEX.test(right)) {\n const a = BigInt(left);\n const b = BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n }\n return left.localeCompare(right);\n}\n\nexport function getRemoteMigrationVersionStatus(\n version: string,\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): RemoteMigrationVersionStatus {\n if (appliedVersions.has(version)) {\n return 'already-applied';\n }\n\n if (\n latestRemoteVersion &&\n compareMigrationVersions(version, latestRemoteVersion) < 0\n ) {\n return 'older-than-head';\n }\n\n return 'pending';\n}\n\nfunction formatMigrationVersion(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n const hour = String(date.getUTCHours()).padStart(2, '0');\n const minute = String(date.getUTCMinutes()).padStart(2, '0');\n const second = String(date.getUTCSeconds()).padStart(2, '0');\n\n return `${year}${month}${day}${hour}${minute}${second}`;\n}\n\nexport function incrementMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n if (!/^\\d{14}$/u.test(version)) {\n return String(BigInt(version) + 1n);\n }\n const year = Number(version.slice(0, 4));\n const month = Number(version.slice(4, 6)) - 1;\n const day = Number(version.slice(6, 8));\n const hour = Number(version.slice(8, 10));\n const minute = Number(version.slice(10, 12));\n const second = Number(version.slice(12, 14));\n const nextTimestamp = Date.UTC(year, month, day, hour, minute, second + 1);\n\n return formatMigrationVersion(new Date(nextTimestamp));\n}\n\nexport function getMigrationsDir(cwd: string = process.cwd()): string {\n return join(cwd, 'migrations');\n}\n\nexport function ensureMigrationsDir(cwd: string = process.cwd()): string {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n }\n return migrationsDir;\n}\n\nexport function listLocalMigrationFilenames(cwd: string = process.cwd()): string[] {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n return [];\n }\n\n return readdirSync(migrationsDir).sort((left, right) => left.localeCompare(right));\n}\n\nexport function parseStrictLocalMigrations(filenames: string[]): ParsedMigrationFile[] {\n const migrations = filenames.map((filename) => {\n const parsedMigration = parseMigrationFilename(filename);\n if (!parsedMigration) {\n throw new CLIError(\n `Invalid migration filename: ${filename}. Expected <migration_version>_<migration-name>.sql.`,\n );\n }\n return parsedMigration;\n });\n\n assertNoDuplicateMigrationVersions(migrations);\n return migrations.sort((left, right) => compareMigrationVersions(left.version, right.version));\n}\n\nexport function assertNoDuplicateMigrationVersions(migrations: ParsedMigrationFile[]): void {\n const seen = new Set<string>();\n\n for (const migration of migrations) {\n if (seen.has(migration.version)) {\n throw new CLIError(`Duplicate local migration version found: ${migration.version}`);\n }\n seen.add(migration.version);\n }\n}\n\nexport function getNextLocalMigrationVersion(\n migrations: ParsedMigrationFile[],\n latestRemoteVersion: string | null,\n now: Date = new Date(),\n): string {\n const orderedMigrations = [...migrations].sort((left, right) =>\n compareMigrationVersions(left.version, right.version),\n );\n assertNoDuplicateMigrationVersions(orderedMigrations);\n\n const latestKnownVersion = orderedMigrations.reduce<string | null>(\n (latestVersion, migration) => {\n if (!latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0) {\n return migration.version;\n }\n return latestVersion;\n },\n latestRemoteVersion,\n );\n\n const currentVersion = formatMigrationVersion(now);\n if (!latestKnownVersion || compareMigrationVersions(currentVersion, latestKnownVersion) > 0) {\n return currentVersion;\n }\n\n return incrementMigrationVersion(latestKnownVersion);\n}\n\nexport function formatMigrationSql(statements: string[]): string {\n const normalizedStatements = statements\n .map((statement) => statement.trim().replace(/;\\s*$/u, ''))\n .filter(Boolean);\n\n return normalizedStatements\n .join(';\\n\\n')\n .concat(normalizedStatements.length > 0 ? ';\\n' : '');\n}\n\nexport function findOlderThanHeadLocalMigrations(\n migrations: ParsedMigrationFile[],\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): ParsedMigrationFile[] {\n return migrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedVersions,\n latestRemoteVersion,\n ) === 'older-than-head',\n );\n}\n\nexport function findLocalMigrationByVersion(\n version: string,\n filenames: string[],\n): ParsedMigrationFile {\n const canonicalVersion = canonicalMigrationVersion(version);\n const matches = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter(\n (migration): migration is ParsedMigrationFile =>\n migration !== null && migration.version === canonicalVersion,\n );\n\n if (matches.length === 0) {\n throw new CLIError(`Local migration for version ${version} not found.`);\n }\n\n if (matches.length > 1) {\n throw new CLIError(\n `Multiple local migration files found for version ${version}.`,\n );\n }\n\n return matches[0];\n}\n\nexport function resolveMigrationTarget(\n target: string,\n filenames: string[],\n): ParsedMigrationFile {\n if (/^\\d{1,64}$/u.test(target)) {\n return findLocalMigrationByVersion(target, filenames);\n }\n\n const parsedTarget = parseMigrationFilename(target);\n if (!parsedTarget) {\n throw new CLIError(\n 'Migration file names must match <migration_version>_<migration-name>.sql.',\n );\n }\n\n if (!filenames.includes(target)) {\n throw new CLIError(`Local migration file not found: ${target}`);\n }\n\n return parsedTarget;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerRecordsCommands(recordsCmd: Command): void {\n recordsCmd\n .command('list <table>')\n .description('List records from a table')\n .option('--select <columns>', 'Columns to select (comma-separated)')\n .option('--filter <filter>', 'Filter expression (e.g. \"name=eq.John\")')\n .option('--order <order>', 'Order by (e.g. \"created_at.desc\")')\n .option('--limit <n>', 'Limit number of records', parseInt)\n .option('--offset <n>', 'Offset for pagination', parseInt)\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n if (opts.select) params.set('select', opts.select);\n if (opts.filter) params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n if (opts.order) params.set('order', opts.order);\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.offset) params.set('offset', String(opts.offset));\n\n const query = params.toString();\n const path = `/api/database/records/${encodeURIComponent(table)}${query ? `?${query}` : ''}`;\n const res = await ossFetch(path);\n const data = await res.json() as { data?: Record<string, unknown>[] };\n const records = data.data ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (records.length === 0) {\n console.log('No records found.');\n return;\n }\n const headers = Object.keys(records[0]);\n outputTable(\n headers,\n records.map((r) => headers.map((h) => {\n const val = r[h];\n if (val === null || val === undefined) return '';\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val);\n })),\n );\n console.log(`${records.length} record(s).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsCreateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('create <table>')\n .description('Create record(s) in a table')\n .option('--data <json>', 'JSON data to insert (object or array of objects)')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"John\"}\\'');\n }\n\n let records: unknown[];\n try {\n const parsed = JSON.parse(opts.data) as unknown;\n records = Array.isArray(parsed) ? parsed : [parsed];\n } catch {\n throw new CLIError('Invalid JSON in --data. Provide a JSON object or array.');\n }\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?return=representation`,\n {\n method: 'POST',\n body: JSON.stringify(records),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const created = data.data ?? [];\n outputSuccess(`Created ${created.length || records.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsUpdateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('update <table>')\n .description('Update records in a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .option('--data <json>', 'JSON data to update')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental updates to all rows.');\n }\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"Jane\"}\\'');\n }\n\n let body: unknown;\n try {\n body = JSON.parse(opts.data) as unknown;\n } catch {\n throw new CLIError('Invalid JSON in --data.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const updated = data.data ?? [];\n outputSuccess(`Updated ${updated.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsDeleteCommand(recordsCmd: Command): void {\n recordsCmd\n .command('delete <table>')\n .description('Delete records from a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental deletion of all rows.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n { method: 'DELETE' },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const deleted = data.data ?? [];\n outputSuccess(`Deleted ${deleted.length} record(s) from \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerFunctionsCommands(functionsCmd: Command): void {\n functionsCmd\n .command('list')\n .description('List all edge functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/functions');\n const raw = await res.json();\n // API may return array directly or { functions: [...] }\n const functions: ListFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'functions' in raw\n ? (raw as ListFunctionsResponse).functions ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No functions found.');\n return;\n }\n outputTable(\n ['Slug', 'Name', 'Status', 'Created At'],\n functions.map((f) => [\n f.slug,\n f.name ?? '-',\n f.status ?? '-',\n f.createdAt ? new Date(f.createdAt).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.functions.list', true);\n } catch (err) {\n await reportCliUsage('cli.functions.list', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeployCommand(functionsCmd: Command): void {\n functionsCmd\n .command('deploy <slug>')\n .description('Deploy an edge function (create or update)')\n .option('--file <path>', 'Path to the function source file')\n .option('--name <name>', 'Function display name')\n .option('--description <desc>', 'Function description')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n // Resolve source file\n const filePath = opts.file ?? join(process.cwd(), 'insforge', 'functions', slug, 'index.ts');\n if (!existsSync(filePath)) {\n throw new CLIError(\n `Source file not found: ${filePath}\\n` +\n `Specify --file <path> or create ${join('insforge', 'functions', slug, 'index.ts')}`,\n );\n }\n\n const code = readFileSync(filePath, 'utf-8');\n const name = opts.name ?? slug;\n const description = opts.description ?? '';\n\n // Check if function exists\n let exists = false;\n try {\n await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n exists = true;\n } catch {\n exists = false;\n }\n\n let res: Response;\n if (exists) {\n res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'PUT',\n body: JSON.stringify({ name, description, code }),\n });\n } else {\n res = await ossFetch('/api/functions', {\n method: 'POST',\n body: JSON.stringify({ slug, name, description, code }),\n });\n }\n\n const result = await res.json() as FunctionResponse;\n\n const deployFailed = result.deployment?.status === 'failed';\n\n if (json) {\n outputJson(result);\n } else {\n const action = exists ? 'updation' : 'creation';\n const resultStatus = result.success ? 'success' : 'failed';\n outputSuccess(`Function \"${result.function.slug}\" ${action} ${resultStatus}.`);\n if (result.deployment) {\n if (result.deployment.status === 'success') {\n console.log(` Deployment: ${result.deployment.status}${result.deployment.url ? ` → ${result.deployment.url}` : ''}`);\n } else {\n console.log(` Deployment: ${result.deployment.status}`);\n if (result.deployment.buildLogs?.length) {\n console.log(' Build logs:');\n for (const line of result.deployment.buildLogs) {\n console.log(` ${line}`);\n }\n }\n }\n }\n }\n if (deployFailed) throw new CLIError('Function deployment failed');\n await reportCliUsage('cli.functions.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.functions.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, CLIError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\nexport function registerFunctionsInvokeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('invoke <slug>')\n .description('Invoke an edge function')\n .option('--data <json>', 'JSON body to send to the function')\n .option('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)', 'POST')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const method = opts.method.toUpperCase();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n };\n\n const fetchOpts: RequestInit = { method, headers };\n\n if (opts.data && ['POST', 'PUT', 'PATCH'].includes(method)) {\n fetchOpts.body = opts.data;\n }\n\n // Functions client endpoint is at /functions/{slug} (not /api/functions/{slug})\n // Use direct fetch so we always show the function's full response,\n // even on non-200 status codes (function errors are part of the output).\n const res = await fetch(\n `${config.oss_host}/functions/${encodeURIComponent(slug)}`,\n fetchOpts,\n );\n\n const contentType = res.headers.get('content-type') ?? '';\n const status = res.status;\n\n if (contentType.includes('application/json')) {\n const data = await res.json();\n if (json) {\n outputJson({ status, body: data });\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n } else {\n const text = await res.text();\n console.log(text);\n }\n\n // Exit with non-zero code on function errors\n if (status >= 400) {\n throw new CLIError(`HTTP ${status}`, 1, 'HTTP_ERROR');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\ninterface FunctionDetails {\n id: string;\n slug: string;\n name: string;\n description: string | null;\n code: string;\n status: string;\n created_at: string;\n updated_at: string;\n deployed_at: string | null;\n}\n\nexport function registerFunctionsCodeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('code <slug>')\n .description('Fetch and display the source code of an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n const fn = await res.json() as FunctionDetails;\n\n if (json) {\n outputJson(fn);\n } else {\n console.log(`Function: ${fn.name} (${fn.slug})`);\n console.log(`Status: ${fn.status}`);\n if (fn.description) console.log(`Desc: ${fn.description}`);\n if (fn.deployed_at) console.log(`Deployed: ${fn.deployed_at}`);\n console.log('---');\n console.log(fn.code);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeleteCommand(functionsCmd: Command): void {\n functionsCmd\n .command('delete <slug>')\n .description('Delete an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Delete function \"${slug}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n clack.log.info('Cancelled.');\n return;\n }\n }\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'DELETE',\n });\n const result = await res.json() as FunctionResponse;\n\n if (json) {\n outputJson(result);\n } else {\n if (result.success) {\n outputSuccess(`Function \"${slug}\" deleted successfully.`);\n } else {\n outputSuccess(`Failed to delete function \"${slug}\".`);\n }\n }\n await reportCliUsage('cli.functions.delete', true);\n } catch (err) {\n await reportCliUsage('cli.functions.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { StorageBucketSchema } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageBucketsCommand(storageCmd: Command): void {\n storageCmd\n .command('buckets')\n .description('List all storage buckets')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/storage/buckets');\n const raw = await res.json();\n // API may return array directly or { buckets: [...] }\n const buckets: StorageBucketSchema[] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'buckets' in raw\n ? (raw as { buckets?: StorageBucketSchema[] }).buckets ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (buckets.length === 0) {\n console.log('No buckets found.');\n return;\n }\n outputTable(\n ['Bucket Name', 'Public'],\n buckets.map((b) => [b.name, b.public ? 'Yes' : 'No']),\n );\n }\n await reportCliUsage('cli.storage.buckets', true);\n } catch (err) {\n await reportCliUsage('cli.storage.buckets', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageUploadCommand(storageCmd: Command): void {\n storageCmd\n .command('upload <file>')\n .description('Upload a file to a storage bucket')\n .requiredOption('--bucket <name>', 'Target bucket name')\n .option('--key <objectKey>', 'Object key (defaults to filename)')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n if (!existsSync(file)) {\n throw new CLIError(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file);\n const objectKey = opts.key ?? basename(file);\n const bucketName = opts.bucket;\n\n // Build multipart form data\n const formData = new FormData();\n const blob = new Blob([fileContent]);\n formData.append('file', blob, objectKey);\n\n // PUT /api/storage/buckets/{bucket}/objects/{key} for named upload\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Upload failed: ${res.status}`);\n }\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Uploaded \"${basename(file)}\" to bucket \"${bucketName}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDownloadCommand(storageCmd: Command): void {\n storageCmd\n .command('download <objectKey>')\n .description('Download a file from a storage bucket')\n .requiredOption('--bucket <name>', 'Source bucket name')\n .option('--output <path>', 'Output file path (defaults to current directory)')\n .action(async (objectKey: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const bucketName = opts.bucket;\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Download failed: ${res.status}`);\n }\n\n const buffer = Buffer.from(await res.arrayBuffer());\n const outputPath = opts.output ?? join(process.cwd(), basename(objectKey));\n writeFileSync(outputPath, buffer);\n\n if (json) {\n outputJson({ success: true, path: outputPath, size: buffer.length });\n } else {\n outputSuccess(`Downloaded \"${objectKey}\" to ${outputPath} (${buffer.length} bytes).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageCreateBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('create-bucket <name>')\n .description('Create a new storage bucket')\n .option('--public', 'Make the bucket publicly accessible (default)')\n .option('--private', 'Make the bucket private')\n .action(async (name: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const isPublic = !opts.private;\n\n const res = await ossFetch('/api/storage/buckets', {\n method: 'POST',\n body: JSON.stringify({ bucketName: name, isPublic }),\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" created (${isPublic ? 'public' : 'private'}).`);\n }\n await reportCliUsage('cli.storage.create-bucket', true);\n } catch (err) {\n await reportCliUsage('cli.storage.create-bucket', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDeleteBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('delete-bucket <name>')\n .description('Delete a storage bucket and all its objects')\n .action(async (name: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete bucket \"${name}\" and all its objects? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/storage/buckets/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface StoredFile {\n key: string;\n size: number;\n mimeType?: string;\n uploadedAt: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function registerStorageListObjectsCommand(storageCmd: Command): void {\n storageCmd\n .command('list-objects <bucket>')\n .description('List objects in a storage bucket')\n .option('--limit <n>', 'Maximum number of objects to return', '100')\n .option('--offset <n>', 'Number of objects to skip', '0')\n .option('--prefix <prefix>', 'Filter objects by key prefix')\n .option('--search <term>', 'Search objects by key (partial match)')\n .option('--sort <field>', 'Sort by field: key, size, uploadedAt (default: key)')\n .action(async (bucket: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n params.set('limit', opts.limit);\n params.set('offset', opts.offset);\n if (opts.prefix) params.set('prefix', opts.prefix);\n if (opts.search) params.set('search', opts.search);\n\n const res = await ossFetch(\n `/api/storage/buckets/${encodeURIComponent(bucket)}/objects?${params.toString()}`,\n );\n const raw = await res.json() as { data?: StoredFile[]; pagination?: { total?: number } };\n\n const objects: StoredFile[] = Array.isArray(raw)\n ? raw as StoredFile[]\n : (raw.data ?? []);\n\n // Client-side sort\n const sortField = opts.sort ?? 'key';\n objects.sort((a, b) => {\n if (sortField === 'size') return a.size - b.size;\n if (sortField === 'uploadedAt') return a.uploadedAt.localeCompare(b.uploadedAt);\n return a.key.localeCompare(b.key);\n });\n\n if (json) {\n outputJson(raw);\n } else {\n if (objects.length === 0) {\n console.log(`No objects found in bucket \"${bucket}\".`);\n return;\n }\n const total = raw.pagination?.total;\n if (total !== undefined) {\n console.log(`Showing ${objects.length} of ${total} objects:\\n`);\n }\n outputTable(\n ['Key', 'Size', 'Type', 'Uploaded At'],\n objects.map((o) => [\n o.key,\n formatSize(o.size),\n o.mimeType ?? '-',\n o.uploadedAt,\n ]),\n );\n }\n await reportCliUsage('cli.storage.list-objects', true);\n } catch (err) {\n await reportCliUsage('cli.storage.list-objects', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getCredentials, getGlobalConfig, getProjectConfig } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nexport function registerContextCommand(program: Command): void {\n program\n .command('current')\n .description('Show current CLI context (user, org, project)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const creds = getCredentials();\n const globalConfig = getGlobalConfig();\n const projectConfig = getProjectConfig();\n\n if (json) {\n outputJson({\n authenticated: !!creds,\n user: creds?.user ?? null,\n default_org_id: globalConfig.default_org_id ?? null,\n project: projectConfig,\n });\n return;\n }\n\n console.log('\\n InsForge CLI Context\\n');\n\n // Auth status\n if (creds) {\n console.log(` User: ${creds.user.name} <${creds.user.email}>`);\n } else {\n console.log(' User: (not logged in)');\n }\n\n // Org (only relevant when logged in)\n if (creds && globalConfig.default_org_id) {\n console.log(` Default Org: ${globalConfig.default_org_id}`);\n } else if (creds) {\n console.log(' Default Org: (none)');\n }\n\n // Project\n if (projectConfig) {\n console.log('');\n console.log(` Project: ${projectConfig.project_name} (${projectConfig.project_id})`);\n console.log(` App Key: ${projectConfig.appkey}`);\n console.log(` Region: ${projectConfig.region}`);\n console.log(` OSS Host: ${projectConfig.oss_host}`);\n } else {\n console.log('\\n Project: (not linked — run `npx @insforge/cli link`)');\n }\n\n console.log('');\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations, listProjects } from '../lib/api/platform.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all organizations and their projects')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (orgs.length === 0) {\n if (json) {\n outputJson([]);\n } else {\n console.log('No organizations found.');\n }\n return;\n }\n\n // Fetch projects for all orgs in parallel\n const orgProjects = await Promise.all(\n orgs.map(async (org) => ({\n org,\n projects: await listProjects(org.id, apiUrl),\n })),\n );\n\n if (json) {\n outputJson(\n orgProjects.map(({ org, projects }) => ({\n id: org.id,\n name: org.name,\n type: org.type ?? null,\n projects: projects.map((p) => ({\n id: p.id,\n name: p.name,\n region: p.region,\n status: p.status,\n appkey: p.appkey,\n })),\n })),\n );\n return;\n }\n\n // Human-readable: grouped table\n const rows: string[][] = [];\n for (const { org, projects } of orgProjects) {\n if (projects.length === 0) {\n rows.push([org.name, '-', '-', '-', '-']);\n } else {\n for (let i = 0; i < projects.length; i++) {\n const p = projects[i];\n rows.push([\n i === 0 ? org.name : '',\n p.name,\n p.region,\n p.status,\n p.appkey,\n ]);\n }\n }\n }\n\n outputTable(['Organization', 'Project', 'Region', 'Status', 'AppKey'], rows);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListDeploymentsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDeploymentsListCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('list')\n .description('List all deployments')\n .option('--limit <n>', 'Limit number of results', '20')\n .option('--offset <n>', 'Offset for pagination', '0')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments?limit=${opts.limit}&offset=${opts.offset}`);\n const raw = await res.json();\n // API may return array directly or { data: [...] }\n const deployments: ListDeploymentsResponse['data'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'data' in raw\n ? (raw as ListDeploymentsResponse).data ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (!deployments.length) {\n console.log('No deployments found.');\n return;\n }\n outputTable(\n ['ID', 'Status', 'Provider', 'URL', 'Created'],\n deployments.map((d) => [\n d.id,\n d.status,\n d.provider,\n d.url ?? '-',\n new Date(d.createdAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, getDeploymentError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DeploymentSchema } from '../../types.js';\n\nexport function registerDeploymentsStatusCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('status <id>')\n .description('Get deployment details and sync status from Vercel')\n .option('--sync', 'Sync status from Vercel before showing')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n // Optionally sync status from Vercel first\n if (opts.sync) {\n await ossFetch(`/api/deployments/${id}/sync`, { method: 'POST' });\n }\n\n const res = await ossFetch(`/api/deployments/${id}`);\n const d = (await res.json()) as DeploymentSchema;\n\n if (json) {\n outputJson(d);\n } else {\n const errorMessage = getDeploymentError(d.metadata);\n outputTable(\n ['Field', 'Value'],\n [\n ['ID', d.id],\n ['Status', d.status],\n ['Provider', d.provider ?? '-'],\n ['Provider ID', d.providerDeploymentId ?? '-'],\n ['URL', d.url ?? '-'],\n ['Created', new Date(d.createdAt).toLocaleString()],\n ['Updated', new Date(d.updatedAt).toLocaleString()],\n ...(errorMessage ? [['Error', errorMessage]] : []),\n ],\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDeploymentsCancelCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('cancel <id>')\n .description('Cancel a deployment')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Cancel deployment ${id}?`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) process.exit(0);\n }\n\n const res = await ossFetch(`/api/deployments/${id}/cancel`, { method: 'POST' });\n const result = await res.json();\n\n if (json) {\n outputJson(result);\n } else {\n outputSuccess(`Deployment ${id} cancelled.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface EnvVar {\n id: string;\n key: string;\n type: string;\n updatedAt: number;\n}\n\nexport function registerDeploymentsEnvVarsCommand(deploymentsCmd: Command): void {\n const envCmd = deploymentsCmd.command('env').description('Manage deployment environment variables');\n\n // list\n envCmd\n .command('list')\n .description('List all deployment environment variables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars');\n const data = (await res.json()) as { envVars: EnvVar[] };\n const envVars = data.envVars ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!envVars.length) {\n console.log('No environment variables found.');\n return;\n }\n outputTable(\n ['ID', 'Key', 'Type', 'Updated At'],\n envVars.map((v) => [\n v.id,\n v.key,\n v.type,\n new Date(v.updatedAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.env.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.list', false);\n handleError(err, json);\n }\n });\n\n // create / update\n envCmd\n .command('set <key> <value>')\n .description('Create or update a deployment environment variable')\n .action(async (key: string, value: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars', {\n method: 'POST',\n body: JSON.stringify({ envVars: [{ key, value }] }),\n });\n const data = (await res.json()) as { success: boolean; message: string; count: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.set', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.set', false);\n handleError(err, json);\n }\n });\n\n // delete\n envCmd\n .command('delete <id>')\n .description('Delete a deployment environment variable by ID')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments/env-vars/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = (await res.json()) as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.delete', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nconst FEATURES = ['db', 'storage', 'functions', 'auth', 'ai', 'realtime'] as const;\nconst LANGUAGES = ['typescript', 'swift', 'kotlin', 'rest-api'] as const;\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command('docs [feature] [language]')\n .description('Browse InsForge SDK documentation')\n .addHelpText('after', `\nFeatures: ${FEATURES.join(', ')}\nLanguages: ${LANGUAGES.join(', ')}\n\nExamples:\n npx @insforge/cli docs List all available docs\n npx @insforge/cli docs instructions Show setup instructions\n npx @insforge/cli docs db typescript Show TypeScript database SDK docs\n npx @insforge/cli docs auth swift Show Swift auth SDK docs\n npx @insforge/cli docs storage rest-api Show REST API storage docs`)\n .action(async (feature: string | undefined, language: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n await reportCliUsage('cli.docs', true);\n // No args → list all docs\n if (!feature) {\n await listDocs(json);\n return;\n }\n\n // Single arg → legacy doc type (e.g. \"instructions\")\n if (!language) {\n await fetchDoc(`/api/docs/${encodeURIComponent(feature)}`, feature, json);\n return;\n }\n\n // Two args → feature + language\n await fetchDoc(\n `/api/docs/${encodeURIComponent(feature)}/${encodeURIComponent(language)}`,\n `${feature}/${language}`,\n json,\n );\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n\nasync function listDocs(json: boolean): Promise<void> {\n const res = await ossFetch('/api/docs');\n const data = await res.json() as { data?: DocEntry[] } | DocEntry[];\n const docs = Array.isArray(data) ? data : (data.data ?? []);\n\n if (json) {\n outputJson(docs);\n } else {\n if (!docs.length) {\n console.log('No documentation available.');\n return;\n }\n outputTable(\n ['Type', 'Endpoint'],\n docs.map((d) => [String(d.type ?? '-'), String(d.endpoint ?? '-')]),\n );\n }\n}\n\nasync function fetchDoc(path: string, label: string, json: boolean): Promise<void> {\n const res = await ossFetch(path);\n const data = await res.json() as { data?: { type?: string; content?: string }; type?: string; content?: string };\n const doc = data.data ?? data;\n\n if (json) {\n outputJson(doc);\n } else {\n if (doc.content) {\n console.log(doc.content);\n } else {\n console.log(`No content returned for \"${label}\".`);\n }\n }\n}\n\ninterface DocEntry {\n type?: string;\n filename?: string;\n endpoint?: string;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSecretsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsListCommand(secretsCmd: Command): void {\n secretsCmd\n .command('list')\n .description('List secrets (metadata only, values are hidden)')\n .option('--all', 'Include inactive (deleted) secrets')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/secrets');\n const data = await res.json() as ListSecretsResponse;\n let secrets = data.secrets ?? [];\n\n if (!opts.all) {\n secrets = secrets.filter((s) => s.isActive !== false);\n }\n\n if (json) {\n outputJson(opts.all ? data : { secrets });\n } else {\n if (!secrets.length) {\n console.log('No secrets found.');\n return;\n }\n const headers = opts.all\n ? ['Key', 'Active', 'Reserved', 'Expires', 'Updated']\n : ['Key', 'Reserved', 'Expires', 'Updated'];\n outputTable(\n headers,\n secrets.map((s) => {\n const row = [\n String(s.key ?? '-'),\n ...(opts.all ? [s.isActive ? 'Yes' : 'No'] : []),\n s.isReserved ? 'Yes' : 'No',\n s.expiresAt ? new Date(String(s.expiresAt)).toLocaleString() : '-',\n s.updatedAt ? new Date(String(s.updatedAt)).toLocaleString() : '-',\n ];\n return row;\n }),\n );\n }\n await reportCliUsage('cli.secrets.list', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetSecretValueResponse } from '../../types.js';\n\nexport function registerSecretsGetCommand(secretsCmd: Command): void {\n secretsCmd\n .command('get <key>')\n .description('Get the decrypted value of a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`);\n const data = await res.json();\n const secret = data as GetSecretValueResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`${secret.key} = ${secret.value}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateSecretResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsAddCommand(secretsCmd: Command): void {\n secretsCmd\n .command('add <key> <value>')\n .description('Create a new secret')\n .option('--reserved', 'Mark secret as protected from deletion')\n .option('--expires <date>', 'Expiration date (ISO 8601 format)')\n .action(async (key: string, value: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = { key, value };\n if (opts.reserved) body.isReserved = true;\n if (opts.expires) body.expiresAt = opts.expires;\n\n const res = await ossFetch('/api/secrets', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} created.`);\n }\n await reportCliUsage('cli.secrets.add', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.add', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { UpdateSecretResponse } from '../../types.js';\n\nexport function registerSecretsUpdateCommand(secretsCmd: Command): void {\n secretsCmd\n .command('update <key>')\n .description('Update an existing secret')\n .option('--value <value>', 'New secret value')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--reserved <bool>', 'Set reserved status (true/false)')\n .option('--expires <date>', 'Expiration date (ISO 8601, or \"null\" to remove)')\n .action(async (key: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.value !== undefined) body.value = opts.value;\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n if (opts.reserved !== undefined) body.isReserved = opts.reserved === 'true';\n if (opts.expires !== undefined) body.expiresAt = opts.expires === 'null' ? null : opts.expires;\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--value, --active, --reserved, --expires).');\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n const data = await res.json() as UpdateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} updated.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { DeleteSecretResponse } from '../../types.js';\n\nexport function registerSecretsDeleteCommand(secretsCmd: Command): void {\n secretsCmd\n .command('delete <key>')\n .description('Delete a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete secret \"${key}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as DeleteSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSchedulesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesListCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('list')\n .description('List all schedules')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/schedules');\n const data = await res.json();\n const schedules: ListSchedulesResponse = data as ListSchedulesResponse;\n\n if (json) {\n outputJson(schedules);\n } else {\n if (!schedules.length) {\n console.log('No schedules found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Cron', 'URL', 'Method', 'Active', 'Next Run'],\n schedules.map((s) => [\n String(s.id ?? '-'),\n String(s.name ?? '-'),\n String(s.cronSchedule ?? '-'),\n String(s.functionUrl ?? '-'),\n String(s.httpMethod ?? '-'),\n s.isActive === false ? 'No' : 'Yes',\n s.nextRun ? new Date(String(s.nextRun)).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.schedules.list', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetScheduleResponse } from '../../types.js';\n\nexport function registerSchedulesGetCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('get <id>')\n .description('Get schedule details')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`);\n const data = await res.json() as GetScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`\\n Name: ${data.name ?? '-'}`);\n console.log(` ID: ${data.id ?? '-'}`);\n console.log(` Cron: ${data.cronSchedule ?? '-'}`);\n console.log(` URL: ${data.functionUrl ?? '-'}`);\n console.log(` Method: ${data.httpMethod ?? '-'}`);\n console.log(` Active: ${data.isActive === false ? 'No' : 'Yes'}`);\n if (data.headers) console.log(` Headers: ${JSON.stringify(data.headers)}`);\n if (data.body) console.log(` Body: ${JSON.stringify(data.body)}`);\n console.log(` Next Run: ${data.nextRun ? new Date(String(data.nextRun)).toLocaleString() : '-'}`);\n console.log(` Created: ${data.createdAt ? new Date(String(data.createdAt)).toLocaleString() : '-'}`);\n console.log('');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateScheduleResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesCreateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('create')\n .description('Create a new schedule')\n .requiredOption('--name <name>', 'Schedule name')\n .requiredOption(\n '--cron <expression>',\n 'Cron expression. 5-field cron (e.g. \"*/5 * * * *\", \"0 9 * * 1-5\") or pg_cron interval syntax for sub-minute cadence (e.g. \"30 seconds\", \"5 minutes\").'\n )\n .requiredOption('--url <url>', 'URL to invoke')\n .requiredOption('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)')\n .option('--headers <json>', 'HTTP headers as JSON')\n .option('--body <json>', 'Request body as JSON')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n name: opts.name,\n cronSchedule: opts.cron,\n functionUrl: opts.url,\n httpMethod: opts.method.toUpperCase(),\n };\n\n if (opts.headers) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n const res = await ossFetch('/api/schedules', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Schedule \"${opts.name}\" created (ID: ${data.id ?? 'unknown'}).`);\n }\n await reportCliUsage('cli.schedules.create', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.create', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesUpdateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('update <id>')\n .description('Update a schedule')\n .option('--name <name>', 'New schedule name')\n .option(\n '--cron <expression>',\n 'New cron expression. 5-field cron or pg_cron interval syntax (e.g. \"30 seconds\").'\n )\n .option('--url <url>', 'New URL to invoke')\n .option('--method <method>', 'New HTTP method')\n .option('--headers <json>', 'New HTTP headers as JSON')\n .option('--body <json>', 'New request body as JSON')\n .option('--active <bool>', 'Enable/disable schedule (true/false)')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body.name = opts.name;\n if (opts.cron !== undefined) body.cronSchedule = opts.cron;\n if (opts.url !== undefined) body.functionUrl = opts.url;\n if (opts.method !== undefined) body.httpMethod = opts.method.toUpperCase();\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n\n if (opts.headers !== undefined) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body !== undefined) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--name, --cron, --url, --method, --headers, --body, --active).');\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule updated.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesDeleteCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('delete <id>')\n .description('Delete a schedule')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete schedule \"${id}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule deleted.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListExecutionLogsResponse } from '../../types.js';\n\nexport function registerSchedulesLogsCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('logs <id>')\n .description('Get execution logs for a schedule')\n .option('--limit <n>', 'Max logs to return (default: 50, max: 100)', '50')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = parseInt(opts.limit, 10) || 50;\n const offset = parseInt(opts.offset, 10) || 0;\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}/logs?limit=${limit}&offset=${offset}`);\n const data = await res.json() as ListExecutionLogsResponse;\n const logs = data.logs ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!logs.length) {\n console.log('No execution logs found.');\n return;\n }\n outputTable(\n ['Executed At', 'Status', 'Success', 'Duration (ms)'],\n logs.map((l) => [\n l.executedAt ? new Date(String(l.executedAt)).toLocaleString() : '-',\n String(l.statusCode ?? '-'),\n l.success ? 'Yes' : 'No',\n String(l.durationMs ?? '-'),\n ]),\n );\n if (data.totalCount > offset + logs.length) {\n console.log(`\\n Showing ${offset + 1}-${offset + logs.length} of ${data.totalCount}. Use --offset to paginate.`);\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeListCommand(computeCmd: Command): void {\n computeCmd\n .command('list')\n .description('List all compute services')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/compute/services');\n const raw = await res.json();\n const services: Record<string, unknown>[] = Array.isArray(raw) ? raw : [];\n\n if (json) {\n outputJson(services);\n } else {\n if (services.length === 0) {\n console.log('No compute services found.');\n await reportCliUsage('cli.compute.list', true);\n return;\n }\n outputTable(\n ['Name', 'Status', 'Image', 'CPU', 'Memory', 'Endpoint'],\n services.map((s) => [\n String(s.name ?? '-'),\n String(s.status ?? '-'),\n String(s.imageUrl ?? '-'),\n String(s.cpu ?? '-'),\n s.memory ? `${s.memory}MB` : '-',\n String(s.endpointUrl ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.compute.list', true);\n } catch (err) {\n await reportCliUsage('cli.compute.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeGetCommand(computeCmd: Command): void {\n computeCmd\n .command('get <id>')\n .description('Get details of a compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`);\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputInfo(`Name: ${service.name}`);\n outputInfo(`ID: ${service.id}`);\n outputInfo(`Status: ${service.status}`);\n outputInfo(`Image: ${service.imageUrl}`);\n outputInfo(`CPU: ${service.cpu}`);\n outputInfo(`Memory: ${service.memory}MB`);\n outputInfo(`Region: ${service.region}`);\n outputInfo(`Endpoint: ${service.endpointUrl ?? 'n/a'}`);\n outputInfo(`Created: ${service.createdAt}`);\n }\n await reportCliUsage('cli.compute.get', true);\n } catch (err) {\n await reportCliUsage('cli.compute.get', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeUpdateCommand(computeCmd: Command): void {\n computeCmd\n .command('update <id>')\n .description('Update a compute service')\n .option('--image <image>', 'Docker image URL')\n .option('--port <port>', 'Container port')\n .option('--cpu <tier>', 'CPU tier')\n .option('--memory <mb>', 'Memory in MB')\n .option('--region <region>', 'Fly.io region')\n .option('--env <json>', 'Environment variables as JSON object')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.image) body.imageUrl = opts.image;\n if (opts.port) {\n if (!Number.isFinite(Number(opts.port))) {\n throw new CLIError('Invalid value for --port: must be a number');\n }\n body.port = Number(opts.port);\n }\n if (opts.cpu) body.cpu = opts.cpu;\n if (opts.memory) {\n if (!Number.isFinite(Number(opts.memory))) {\n throw new CLIError('Invalid value for --memory: must be a number');\n }\n body.memory = Number(opts.memory);\n }\n if (opts.region) body.region = opts.region;\n\n if (opts.env) {\n try {\n body.envVars = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('No update fields provided. Use --image, --port, --cpu, --memory, --region, or --env.');\n }\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" updated [${service.status}]`);\n }\n await reportCliUsage('cli.compute.update', true);\n } catch (err) {\n await reportCliUsage('cli.compute.update', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeDeleteCommand(computeCmd: Command): void {\n computeCmd\n .command('delete <id>')\n .description('Delete a compute service and its Fly.io resources')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess('Service deleted.');\n }\n await reportCliUsage('cli.compute.delete', true);\n } catch (err) {\n await reportCliUsage('cli.compute.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStartCommand(computeCmd: Command): void {\n computeCmd\n .command('start <id>')\n .description('Start a stopped compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/start`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" started [${service.status}]`);\n if (service.endpointUrl) {\n console.log(` Endpoint: ${service.endpointUrl}`);\n }\n }\n await reportCliUsage('cli.compute.start', true);\n } catch (err) {\n await reportCliUsage('cli.compute.start', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStopCommand(computeCmd: Command): void {\n computeCmd\n .command('stop <id>')\n .description('Stop a running compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" stopped.`);\n }\n await reportCliUsage('cli.compute.stop', true);\n } catch (err) {\n await reportCliUsage('cli.compute.stop', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeLogsCommand(computeCmd: Command): void {\n computeCmd\n .command('logs <id>')\n .description('Get compute service logs (machine events)')\n .option('--limit <n>', 'Max number of log entries', '50')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = Math.max(1, Math.min(Number(opts.limit) || 50, 1000));\n const res = await ossFetch(\n `/api/compute/services/${encodeURIComponent(id)}/logs?limit=${limit}`,\n );\n const logs = await res.json() as { timestamp: number; message: string }[];\n\n if (json) {\n outputJson(logs);\n } else {\n if (!Array.isArray(logs) || logs.length === 0) {\n console.log('No logs found.');\n await reportCliUsage('cli.compute.logs', true);\n return;\n }\n for (const entry of logs) {\n const ts = new Date(entry.timestamp).toISOString();\n console.log(`${ts} ${entry.message}`);\n }\n }\n await reportCliUsage('cli.compute.logs', true);\n } catch (err) {\n await reportCliUsage('cli.compute.logs', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport {\n ensureFlyctlAvailable,\n flyctlBuildAndPush,\n} from '../../lib/flyctl.js';\n\n// `compute deploy` has two modes:\n//\n// 1. Image mode (--image <url>):\n// Deploy a pre-built image from any registry. No flyctl/Docker needed.\n//\n// 2. Source mode ([dir]) — Path A (compute v3.2):\n// CLI runs `flyctl deploy --remote-only --build-only` against the user's\n// source directory using a per-app, attenuated deploy token minted by\n// the cloud. The remote builder runs on Fly's infrastructure and pushes\n// the image straight to registry.fly.io/<app>:<tag>. The cloud then\n// launches the machine pointing at the freshly-pushed image.\n// Requires `flyctl` on PATH (no Docker daemon needed).\n// The deploy token is scoped to one app + builder/wg, with `else: deny`\n// — it cannot deploy or read anything else in the InsForge Fly org.\nexport function registerComputeDeployCommand(computeCmd: Command): void {\n computeCmd\n .command('deploy [dir]')\n .description(\n 'Deploy a compute service. Two modes:\\n' +\n ' compute deploy <dir> --name <name> (source mode — flyctl remote build + push, requires flyctl on PATH; no Docker needed)\\n' +\n ' compute deploy --image <url> --name <name> (image mode — deploys pre-built image, no flyctl/Docker required)'\n )\n .requiredOption('--name <name>', 'Service name (DNS-safe, e.g. my-api)')\n .option('--image <url>', 'Pre-built image URL (image mode)')\n .option('--port <port>', 'Container port', '8080')\n .option(\n '--cpu <tier>',\n 'CPU tier in <kind>-<N>x format (e.g. shared-1x, performance-2x)',\n 'shared-1x'\n )\n .option('--memory <mb>', 'Memory in MB', '512')\n .option('--region <region>', 'Fly.io region', 'iad')\n .option('--env <json>', 'Env vars as JSON object')\n .action(async (dir: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (dir && opts.image) {\n throw new CLIError('Cannot use both [dir] and --image — pick one mode.');\n }\n if (!dir && !opts.image) {\n throw new CLIError(\n 'Must provide either [dir] (source mode) or --image <url> (image mode).'\n );\n }\n\n // Shared validation\n const port = Number(opts.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new CLIError(`Invalid --port: ${opts.port}`);\n }\n const memory = Number(opts.memory);\n if (!Number.isInteger(memory) || memory <= 0) {\n throw new CLIError(`Invalid --memory: ${opts.memory}`);\n }\n let envVars: Record<string, string> | undefined;\n if (opts.env) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new CLIError('--env must be a JSON object like {\"KEY\":\"value\"}');\n }\n for (const [k, v] of Object.entries(parsed)) {\n if (typeof v !== 'string') {\n throw new CLIError(\n `--env values must be strings — got ${typeof v} for key \"${k}\"`\n );\n }\n }\n envVars = parsed as Record<string, string>;\n }\n\n const baseBody: Record<string, unknown> = {\n name: opts.name,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) baseBody.envVars = envVars;\n\n // ─── Image mode ─────────────────────────────────────────────────\n if (!dir) {\n const body: Record<string, unknown> = { ...baseBody, imageUrl: opts.image };\n\n // List → find by name → POST or PATCH\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{ id: string; name: string }>).find(\n (s) => s.name === opts.name\n );\n\n let res;\n if (existing) {\n if (!json) outputInfo(`Found existing service \"${opts.name}\", updating...`);\n const updateBody: Record<string, unknown> = { ...body };\n delete updateBody.name;\n res = await ossFetch(`/api/compute/services/${encodeURIComponent(existing.id)}`, {\n method: 'PATCH',\n body: JSON.stringify(updateBody),\n });\n } else {\n res = await ossFetch('/api/compute/services', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n const service = (await res.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n }\n await reportCliUsage('cli.compute.deploy', true);\n return;\n }\n\n // ─── Source mode (Path A) ───────────────────────────────────────\n const absDir = resolve(dir);\n const dockerfilePath = join(absDir, 'Dockerfile');\n if (!existsSync(dockerfilePath)) {\n throw new CLIError(\n `No Dockerfile at ${dockerfilePath}.\\n` +\n ` Either:\\n` +\n ` • Create one (ask your AI agent — see the insforge-cli skill)\\n` +\n ` • Use --image <url> to deploy a pre-built image instead`\n );\n }\n ensureFlyctlAvailable();\n\n if (!json) outputInfo(`Detected Dockerfile at ${dockerfilePath}`);\n\n // 1. Resolve service: list → find by name → /deploy if missing\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{\n id: string;\n name: string;\n flyAppId?: string | null;\n }>).find((s) => s.name === opts.name);\n\n let serviceId: string;\n let flyAppId: string;\n if (existing) {\n if (!existing.flyAppId) {\n throw new CLIError(\n `Service \"${opts.name}\" exists but has no Fly app yet. Delete it and redeploy.`\n );\n }\n serviceId = existing.id;\n flyAppId = existing.flyAppId;\n if (!json) outputInfo(`Found existing service \"${opts.name}\" (${flyAppId}), updating...`);\n } else {\n if (!json) outputInfo(`Creating service \"${opts.name}\"...`);\n const prepareRes = await ossFetch('/api/compute/services/deploy', {\n method: 'POST',\n body: JSON.stringify(baseBody),\n });\n const prepared = (await prepareRes.json()) as {\n id: string;\n flyAppId: string;\n };\n serviceId = prepared.id;\n flyAppId = prepared.flyAppId;\n if (!json) outputInfo(`Created Fly app ${flyAppId}`);\n }\n\n // 2. Mint per-app deploy token (20-min TTL, scoped to this app only)\n if (!json) outputInfo('Requesting deploy token...');\n const tokenRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}/deploy-token`,\n { method: 'POST' }\n );\n const tokenJson = (await tokenRes.json()) as { token: string; expirySeconds: number };\n\n // 3. Remote build + push (no local Docker daemon needed).\n // flyctl ships the build context to Fly's remote builder, builds\n // there, and pushes to registry.fly.io/<app>:<tag> using the\n // attenuated FLY_API_TOKEN we just received.\n // If the build fails on a freshly-created service, roll back the\n // cloud row + Fly app so the user can retry without a manual\n // `compute delete`. Don't roll back on update of an existing\n // service — the running machine should survive transient build\n // errors.\n const imageLabel = `cli-${Date.now()}`;\n if (!json) outputInfo(`Building & pushing on Fly remote builder...`);\n let imageRef: string;\n try {\n ({ imageRef } = await flyctlBuildAndPush({\n dir: absDir,\n appId: flyAppId,\n imageLabel,\n token: tokenJson.token,\n region: opts.region,\n port,\n }));\n } catch (buildErr) {\n if (!existing) {\n try {\n await ossFetch(`/api/compute/services/${encodeURIComponent(serviceId)}`, {\n method: 'DELETE',\n });\n if (!json) outputInfo(`Rolled back service \"${opts.name}\" after build failure.`);\n } catch {\n if (!json) {\n outputInfo(\n `Build failed and rollback also failed. ` +\n `Run: npx @insforge/cli compute delete ${serviceId}`\n );\n }\n }\n }\n throw buildErr;\n }\n\n // 4. Tell cloud the image is ready — launches new machine or\n // updates existing one. PATCH includes any deploy-affecting\n // field changes (port/cpu/memory/envVars/region) too.\n if (!json) outputInfo('Launching machine...');\n const updateBody: Record<string, unknown> = {\n imageUrl: imageRef,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) updateBody.envVars = envVars;\n\n const finalRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}`,\n { method: 'PATCH', body: JSON.stringify(updateBody) }\n );\n const service = (await finalRes.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n console.log(` Image: ${imageRef} (built remotely; no local image to clean up)`);\n }\n\n await reportCliUsage('cli.compute.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.compute.deploy', false);\n handleError(err, json);\n }\n });\n}\n","// flyctl helpers for compute v3.2 source-deploy. Path A — refined:\n// the CLI shells out to `flyctl deploy --remote-only --build-only --push`\n// using a per-app deploy token minted by the cloud. Build runs on Fly's\n// remote builder; the resulting image is pushed straight to registry.fly.io.\n// No local Docker daemon required — the user only needs the single flyctl\n// binary on their PATH.\n//\n// Token shape: short-lived (~20 min) macaroon attenuated to one app +\n// builder/wg features, with `else: deny`. It can deploy to that one app and\n// nothing else, even within the InsForge Fly org.\n\nimport { spawn, spawnSync } from 'node:child_process';\nimport { existsSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport function ensureFlyctlAvailable(): void {\n const r = spawnSync('flyctl', ['version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n if (r.error || r.status !== 0) {\n throw new CLIError(\n 'flyctl is required for source-mode deploy.\\n' +\n ' • Install: curl -L https://fly.io/install.sh | sh\\n' +\n ' • Or use --image <pre-built-image> instead.\\n' +\n (r.stderr ? ` Detail: ${r.stderr.trim().slice(0, 200)}` : '')\n );\n }\n}\n\nexport interface FlyctlBuildPushOptions {\n dir: string;\n appId: string; // Fly app name, e.g. \"my-svc-<projectId>\"\n imageLabel: string; // tag suffix; only used as buildkit's --image-label.\n token: string; // attenuated FlyV1 deploy token from cloud /deploy-token\n region: string; // Fly region — written into the stub fly.toml\n port: number; // container internal port — written into the stub fly.toml\n}\n\n/**\n * Write a minimal stub fly.toml in the user's directory so `flyctl deploy\n * --remote-only` has app config. On a freshly-created Fly app with zero\n * machines, flyctl errors with \"could not create a fly.toml from any\n * machines\" — it tries to derive config from existing machines and there\n * are none yet. The comment claiming \"flyctl will invent a fly.toml\" was\n * wrong: it does so only if the app already has machines to introspect.\n *\n * If the user already has a fly.toml, leave it alone — they're either\n * customising or driving a non-trivial setup (multi-process, volumes, etc.).\n *\n * Returns a cleanup callback the caller MUST run in a finally block to\n * delete the stub if (and only if) we created it.\n */\nfunction ensureFlyTomlStub(opts: { dir: string; appId: string; region: string; port: number }): () => void {\n const path = join(opts.dir, 'fly.toml');\n if (existsSync(path)) {\n return () => {\n /* user owns the file — leave as-is */\n };\n }\n const stub =\n `# Auto-generated by @insforge/cli for compute deploy. Safe to delete.\\n` +\n `app = \"${opts.appId}\"\\n` +\n `primary_region = \"${opts.region}\"\\n` +\n `\\n` +\n `[build]\\n` +\n `\\n` +\n `[http_service]\\n` +\n ` internal_port = ${opts.port}\\n` +\n ` force_https = true\\n` +\n ` auto_stop_machines = false\\n` +\n ` auto_start_machines = true\\n` +\n ` min_machines_running = 0\\n`;\n writeFileSync(path, stub, 'utf8');\n return () => {\n try {\n unlinkSync(path);\n } catch {\n /* best-effort */\n }\n };\n}\n\n/**\n * Run `flyctl deploy --remote-only --build-only --push` against the user's\n * source directory. Builds on Fly's remote builder, pushes to registry.fly.io,\n * and returns the resulting image ref. Does NOT launch a machine — the cloud\n * backend handles that step (it owns DB state and quota enforcement).\n *\n * IMPORTANT: returns the **digest-pinned** ref `<app>@sha256:<digest>`, not\n * the tag-based `<app>:<label>` ref. buildkit's `--build-only --push` lands\n * the manifest in the remote builder's namespace, and Fly's registry then\n * aliases the user-app namespace to it by content digest. The bare tag does\n * not always resolve (and racily fails on Fly's side as MANIFEST_UNKNOWN),\n * but the digest always does. The cloud's launchMachine accepts either form.\n *\n * If the user's directory has no fly.toml, we write a stub before invoking\n * flyctl and remove it after. flyctl needs the stub on a fresh app with no\n * machines — the comment claiming otherwise was wrong.\n */\nexport function flyctlBuildAndPush(\n opts: FlyctlBuildPushOptions\n): Promise<{ imageRef: string }> {\n return new Promise<{ imageRef: string }>((resolve, reject) => {\n const cleanupStub = ensureFlyTomlStub({\n dir: opts.dir,\n appId: opts.appId,\n region: opts.region,\n port: opts.port,\n });\n const child = spawn(\n 'flyctl',\n [\n 'deploy',\n '--remote-only',\n '--build-only',\n '--push',\n '--app',\n opts.appId,\n '--image-label',\n opts.imageLabel,\n '--no-cache',\n ],\n {\n cwd: opts.dir,\n env: { ...process.env, FLY_API_TOKEN: opts.token },\n stdio: ['inherit', 'pipe', 'pipe'],\n }\n );\n\n // Tee child's stdout+stderr to our own (so the user sees buildkit\n // progress in real time) AND capture them so we can parse the digest.\n let captured = '';\n child.stdout?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stdout.write(s);\n });\n child.stderr?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stderr.write(s);\n });\n child.on('error', (err) => {\n cleanupStub();\n reject(new CLIError(`flyctl deploy could not start: ${err.message}`));\n });\n child.on('exit', (code) => {\n cleanupStub();\n if (code !== 0) {\n return reject(\n new CLIError(`flyctl deploy --build-only failed (exit ${code}). See output above.`)\n );\n }\n // buildkit emits \"pushing manifest for registry.fly.io/<app>:<label>@sha256:<digest>\"\n // when the upload lands. Pin to that digest so the cloud's machine API\n // can resolve unambiguously regardless of registry tag-aliasing races.\n const m = captured.match(/pushing manifest for registry\\.fly\\.io\\/[^\\s]+@(sha256:[0-9a-f]+)/);\n if (!m) {\n return reject(\n new CLIError(\n 'flyctl deploy succeeded but the buildkit \"pushing manifest\" line was not found. ' +\n 'Cannot determine image digest — please re-run with FLY_LOG_LEVEL=debug and report.'\n )\n );\n }\n resolve({ imageRef: `registry.fly.io/${opts.appId}@${m[1]}` });\n });\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nconst VALID_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\nconst SOURCE_LOOKUP = new Map(VALID_SOURCES.map((s) => [s.toLowerCase(), s]));\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nexport function registerLogsCommand(program: Command): void {\n program\n .command('logs <source>')\n .description('Fetch backend container logs (insforge.logs | postgREST.logs | postgres.logs | function.logs | function-deploy.logs)')\n .option('--limit <n>', 'Number of log entries to return', '20')\n .action(async (source: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const resolved = SOURCE_LOOKUP.get(source.toLowerCase());\n if (!resolved) {\n throw new CLIError(`Invalid log source \"${source}\". Valid sources: ${VALID_SOURCES.join(', ')}`);\n }\n\n const limit = parseInt(opts.limit, 10) || 20;\n const res = await ossFetch(getLogPath(resolved, limit));\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n const logs = Array.isArray(data) ? data : (data as Record<string, unknown>).logs;\n if (!Array.isArray(logs) || !logs.length) {\n console.log('No logs found.');\n return;\n }\n for (const entry of logs) {\n if (typeof entry === 'string') {\n console.log(entry);\n } else {\n const e = entry as Record<string, unknown>;\n const ts = e.timestamp ?? e.time ?? '';\n const msg = e.message ?? e.msg ?? e.log ?? JSON.stringify(e);\n console.log(`${ts} ${msg}`);\n }\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { AppMetadataSchema } from '@insforge/shared-schemas';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nexport function registerMetadataCommand(program: Command): void {\n program\n .command('metadata')\n .description('Show backend metadata (auth, database, buckets, edge functions, realtime, AI models)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/metadata');\n const data = await res.json() as AppMetadataSchema;\n\n if (json) {\n outputJson(data);\n return;\n }\n\n // Auth\n console.log('\\n Auth');\n console.log(` OAuth Providers: ${data.auth.oAuthProviders.length ? data.auth.oAuthProviders.join(', ') : '(none)'}`);\n console.log(` Email Verification: ${data.auth.requireEmailVerification ? 'Yes' : 'No'}`);\n console.log(` Password Policy:`);\n console.log(` Min Length: ${data.auth.passwordMinLength}, requireLowercase: ${data.auth.requireLowercase}, requireNumber: ${data.auth.requireNumber}, requireSpecialChar: ${data.auth.requireSpecialChar}, requireUppercase: ${data.auth.requireUppercase}`);\n console.log(` Verify Email Method: ${data.auth.verifyEmailMethod}`);\n console.log(` Reset Password Method: ${data.auth.resetPasswordMethod}`);\n\n // Database\n console.log('\\n Database');\n console.log(` Size: ${formatSize(data.database.totalSizeInGB)}`);\n if (data.database.tables.length) {\n outputTable(\n ['Table', 'Records'],\n data.database.tables.map((t) => [t.tableName, String(t.recordCount)]),\n );\n } else {\n console.log(' No tables.');\n }\n\n // Storage\n console.log('\\n Storage');\n console.log(` Size: ${formatSize(data.storage.totalSizeInGB)}`);\n if (data.storage.buckets.length) {\n outputTable(\n ['Bucket', 'Public', 'Objects'],\n data.storage.buckets.map((b) => [b.name, b.public ? 'Yes' : 'No', String(b.objectCount ?? '-')]),\n );\n } else {\n console.log(' No buckets.');\n }\n\n // Functions\n console.log('\\n Functions');\n if (data.functions.length) {\n outputTable(\n ['Slug', 'Name', 'Status', 'Description'],\n data.functions.map((f) => [f.slug, f.name, f.status, f.description || '-']),\n );\n } else {\n console.log(' No functions deployed.');\n }\n\n // AI\n if (data.aiIntegration?.models?.length) {\n console.log('\\n AI Models');\n outputTable(\n ['Model', 'Input', 'Output'],\n data.aiIntegration.models.map((m) => [\n m.modelId,\n m.inputModality.join(', '),\n m.outputModality.join(', '),\n ]),\n );\n }\n\n // Realtime\n if (data.realtime?.channels && Array.isArray(data.realtime.channels) && data.realtime.channels.length) {\n console.log(`\\n Realtime: ${data.realtime.channels.length} channel(s)`);\n outputTable(\n ['Id', 'Pattern', 'Webhook URLs', 'Enabled', 'Description'],\n data.realtime.channels.map((c) => [c.id, c.pattern, c.webhookUrls?.join(', ') || '-', c.enabled ? 'Yes' : 'No', c.description || '-']),\n );\n }\n\n // Version\n if (data.version) {\n console.log(`\\n Version: ${data.version}`);\n }\n\n console.log('');\n await reportCliUsage('cli.metadata', true);\n } catch (err) {\n await reportCliUsage('cli.metadata', false);\n handleError(err, json);\n }\n });\n}\n\nfunction formatSize(gb: number): string {\n if (gb < 0.001) return `${(gb * 1024 * 1024).toFixed(1)} KB`;\n if (gb < 1) return `${(gb * 1024).toFixed(2)} MB`;\n return `${gb.toFixed(2)} GB`;\n}\n","import type { Command } from 'commander';\nimport * as os from 'node:os';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\nimport { streamDiagnosticAnalysis, rateDiagnosticSession } from '../../lib/api/platform.js';\n\nimport { fetchMetricsSummary, registerDiagnoseMetricsCommand } from './metrics.js';\nimport { fetchAdvisorSummary, registerDiagnoseAdvisorCommand } from './advisor.js';\nimport { runDbChecks, registerDiagnoseDbCommand } from './db.js';\nimport { fetchLogsSummary, registerDiagnoseLogsCommand } from './logs.js';\n\nfunction sectionHeader(title: string): string {\n return `── ${title} ${'─'.repeat(Math.max(0, 44 - title.length))}`;\n}\n\ninterface DiagnosticContext {\n metrics: unknown | null;\n advisor: unknown | null;\n db: unknown | null;\n logs: unknown | null;\n errors: string[];\n}\n\nasync function collectDiagnosticData(\n projectId: string,\n ossMode: boolean,\n apiUrl?: string,\n): Promise<DiagnosticContext> {\n const metricsPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchMetricsSummary(projectId, apiUrl);\n const advisorPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchAdvisorSummary(projectId, apiUrl);\n\n const [metricsResult, advisorResult, dbResult, logsResult] = await Promise.allSettled([\n metricsPromise,\n advisorPromise,\n runDbChecks(),\n fetchLogsSummary(100),\n ]);\n\n const errors: string[] = [];\n let metrics: unknown | null = null;\n let advisor: unknown | null = null;\n let db: unknown | null = null;\n let logs: unknown | null = null;\n\n if (metricsResult.status === 'fulfilled') {\n const data = metricsResult.value;\n metrics = data.metrics\n .filter((m) => m.data.length > 0)\n .map((m) => {\n let sum = 0;\n let max = -Infinity;\n for (const d of m.data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return {\n metric: m.metric,\n latest: m.data[m.data.length - 1].value,\n avg: sum / m.data.length,\n max,\n };\n });\n } else {\n errors.push(metricsResult.reason?.message ?? 'Metrics unavailable');\n }\n\n if (advisorResult.status === 'fulfilled') {\n advisor = advisorResult.value;\n } else {\n errors.push(advisorResult.reason?.message ?? 'Advisor unavailable');\n }\n\n if (dbResult.status === 'fulfilled') {\n db = dbResult.value;\n } else {\n errors.push(dbResult.reason?.message ?? 'DB checks unavailable');\n }\n\n if (logsResult.status === 'fulfilled') {\n logs = logsResult.value;\n } else {\n errors.push(logsResult.reason?.message ?? 'Logs unavailable');\n }\n\n return { metrics, advisor, db, logs, errors };\n}\n\nexport function registerDiagnoseCommands(diagnoseCmd: Command): void {\n // Comprehensive report (no subcommand)\n diagnoseCmd\n .description('Backend diagnostics — run with no subcommand for a full health report')\n .option('--ai <question>', 'Ask AI to analyze your diagnostic data (1-2000 chars)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n const usageEvent = opts.ai ? 'cli.diagnose.ai' : 'cli.diagnose';\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const projectId = config.project_id;\n const projectName = config.project_name;\n const ossMode = config.project_id === FAKE_PROJECT_ID;\n trackDiagnose(opts.ai ? 'ai' : 'report', config);\n\n // AI analysis mode\n if (opts.ai) {\n const question = String(opts.ai).trim();\n if (question.length === 0 || question.length > 2000) {\n throw new CLIError('Question must be between 1 and 2000 characters.');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Collecting diagnostic data...');\n\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n const cliVersion = process.env.CLI_VERSION || 'unknown';\n\n s?.stop('Data collected');\n\n if (!json) {\n console.log(`\\n AI Diagnosis — ${projectName}\\n`);\n console.log(sectionHeader('Question'));\n console.log(` ${question}\\n`);\n console.log(sectionHeader('Analysis'));\n }\n\n let sessionId: string | undefined;\n let fullText = '';\n const jsonEvents: Record<string, unknown>[] = [];\n let streamError: CLIError | undefined;\n\n // Build context — transform collected data to match backend schema exactly\n const context: Record<string, unknown> = {\n context_version: 'diagnostic-v1',\n client_info: {\n cli_version: cliVersion,\n node_version: process.version,\n os: `${os.platform()} ${os.release()}`,\n },\n };\n if (Array.isArray(data.metrics) && data.metrics.length > 0) {\n context.metrics = data.metrics;\n }\n if (data.advisor) {\n // Spec only accepts: { summary, collectorErrors: string[] }\n const adv = data.advisor as Record<string, unknown>;\n const summary = adv.summary as Record<string, number> | undefined;\n const rawErrors = adv.collectorErrors as unknown[] | undefined;\n if (summary) {\n context.advisor = {\n summary: {\n total: summary.total ?? 0,\n critical: summary.critical ?? 0,\n warning: summary.warning ?? 0,\n info: summary.info ?? 0,\n },\n collectorErrors: rawErrors?.map((e) =>\n typeof e === 'string' ? e : JSON.stringify(e),\n ) ?? [],\n };\n }\n }\n if (data.db) {\n // Stringify all values to match spec (active: string, dead_tuples: string, etc.)\n const rawDb = data.db as Record<string, Record<string, unknown>[]>;\n const safeDb: Record<string, Record<string, unknown>[]> = {};\n for (const [key, rows] of Object.entries(rawDb)) {\n safeDb[key] = rows.map((row) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = (v === null || v === undefined) ? '' : String(v);\n }\n return out;\n });\n }\n if (Object.keys(safeDb).length > 0) {\n context.db = safeDb;\n }\n }\n if (Array.isArray(data.logs) && data.logs.length > 0) {\n // Spec: { source: string, total: integer, errors: [{timestamp, message, source}] }\n context.logs = (data.logs as { source: string; total: number; errors: { timestamp: string; message: string; source: string }[] }[])\n .map((s) => ({\n source: s.source,\n total: s.total,\n errors: s.errors.map((e) => ({\n timestamp: e.timestamp ?? '',\n message: e.message ?? '',\n source: e.source ?? '',\n })),\n }));\n }\n\n await streamDiagnosticAnalysis({\n project_id: projectId,\n question,\n context,\n } as Parameters<typeof streamDiagnosticAnalysis>[0], (event) => {\n // Capture sessionId and errors before any early return\n if (event.type === 'done') {\n sessionId = event.data.session_id as string | undefined;\n }\n if (event.type === 'error') {\n streamError = new CLIError(String(event.data.message ?? 'Unknown diagnostic error'));\n }\n\n if (json) {\n jsonEvents.push({ type: event.type, ...event.data });\n return;\n }\n\n switch (event.type) {\n case 'delta':\n process.stdout.write(String(event.data.text ?? ''));\n fullText += String(event.data.text ?? '');\n break;\n case 'tool_call':\n console.log(`\\n [calling ${event.data.tool_name}...]`);\n break;\n case 'tool_result':\n // silently consume tool results\n break;\n case 'done':\n break;\n case 'error':\n console.error(`\\n Error: ${streamError?.message ?? 'Unknown error'}`);\n break;\n }\n }, apiUrl);\n\n if (streamError) {\n throw streamError;\n }\n\n if (!json) {\n // Ensure newline after streamed text\n if (fullText && !fullText.endsWith('\\n')) console.log('');\n console.log('');\n }\n\n if (json) {\n outputJson({ sessionId, events: jsonEvents });\n }\n\n // Optional rating prompt (interactive only)\n if (!json && sessionId) {\n const ratingChoice = await prompts.select<string>({\n message: 'Was this analysis helpful?',\n options: [\n { value: 'skip', label: 'Skip', hint: 'no rating' },\n { value: 'helpful', label: 'Helpful', hint: 'solved or pointed in right direction' },\n { value: 'not_helpful', label: 'Not helpful', hint: 'didn\\'t apply to the problem' },\n { value: 'incorrect', label: 'Incorrect', hint: 'diagnosis was wrong or misleading' },\n ],\n });\n\n if (!prompts.isCancel(ratingChoice) && ratingChoice !== 'skip') {\n try {\n await rateDiagnosticSession(\n sessionId,\n ratingChoice as 'helpful' | 'not_helpful' | 'incorrect',\n undefined,\n apiUrl,\n );\n clack.log.success('Thanks for your feedback!');\n } catch {\n clack.log.warn('Failed to submit rating.');\n }\n }\n }\n\n await reportCliUsage(usageEvent, true);\n return;\n }\n\n // Standard report mode\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n if (json) {\n outputJson({ project: projectName, ...data });\n } else {\n console.log(`\\n InsForge Health Report — ${projectName}\\n`);\n\n // Metrics section\n console.log(sectionHeader('System Metrics (last 1h)'));\n if (data.metrics) {\n const metricsArr = data.metrics as { metric: string; latest: number }[];\n if (metricsArr.length === 0) {\n console.log(' No metrics data available.');\n } else {\n const vals: Record<string, number> = {};\n for (const m of metricsArr) {\n vals[m.metric] = m.latest;\n }\n const cpu = vals.cpu_usage !== undefined ? `${vals.cpu_usage.toFixed(1)}%` : 'N/A';\n const mem = vals.memory_usage !== undefined ? `${vals.memory_usage.toFixed(1)}%` : 'N/A';\n const disk = vals.disk_usage !== undefined ? `${vals.disk_usage.toFixed(1)}%` : 'N/A';\n const netIn = vals.network_in !== undefined ? formatBytesCompact(vals.network_in) + '/s' : 'N/A';\n const netOut = vals.network_out !== undefined ? formatBytesCompact(vals.network_out) + '/s' : 'N/A';\n console.log(` CPU: ${cpu} Memory: ${mem}`);\n console.log(` Disk: ${disk} Network: ↓${netIn} ↑${netOut}`);\n }\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Metrics') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // Advisor section\n console.log('\\n' + sectionHeader('Advisor Scan'));\n if (data.advisor) {\n const scan = data.advisor as { scannedAt: string; status: string; summary: { critical: number; warning: number; info: number } };\n const date = new Date(scan.scannedAt).toLocaleDateString();\n console.log(` ${date} (${scan.status}) — ${scan.summary.critical} critical · ${scan.summary.warning} warning · ${scan.summary.info} info`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Advisor') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // DB section\n console.log('\\n' + sectionHeader('Database'));\n if (data.db) {\n const db = data.db as Record<string, Record<string, unknown>[]>;\n const conn = db.connections?.[0];\n const cache = db['cache-hit']?.[0];\n const deadTuples = (db.bloat ?? []).reduce(\n (sum: number, r: Record<string, unknown>) => sum + (Number(r.dead_tuples) || 0),\n 0,\n );\n const lockCount = (db.locks ?? []).length;\n\n console.log(\n ` Connections: ${conn?.active ?? '?'}/${conn?.max ?? '?'} Cache Hit: ${cache?.ratio ?? '?'}%`,\n );\n console.log(\n ` Dead tuples: ${deadTuples.toLocaleString()} Locks waiting: ${lockCount}`,\n );\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('DB')) ?? 'unavailable'}`);\n }\n\n // Logs section\n console.log('\\n' + sectionHeader('Recent Errors (last 100 logs/source)'));\n if (data.logs) {\n const summaries = data.logs as { source: string; errors: unknown[] }[];\n const parts = summaries.map((s) => `${s.source}: ${s.errors.length}`);\n console.log(` ${parts.join(' ')}`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Logs')) ?? 'unavailable'}`);\n }\n\n console.log('');\n }\n await reportCliUsage(usageEvent, true);\n } catch (err) {\n await reportCliUsage(usageEvent, false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n\n // Register subcommands\n registerDiagnoseMetricsCommand(diagnoseCmd);\n registerDiagnoseAdvisorCommand(diagnoseCmd);\n registerDiagnoseDbCommand(diagnoseCmd);\n registerDiagnoseLogsCommand(diagnoseCmd);\n}\n\nfunction formatBytesCompact(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(0)}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface MetricDataPoint {\n timestamp: number;\n value: number;\n}\n\ninterface MetricSeries {\n metric: string;\n instance_id: string;\n data: MetricDataPoint[];\n}\n\ninterface MetricsResponse {\n project_id: string;\n range: string;\n metrics: MetricSeries[];\n _meta?: { requested_at: string; query_time_ms: number; cached: boolean };\n}\n\nconst METRIC_LABELS: Record<string, string> = {\n cpu_usage: 'CPU Usage',\n memory_usage: 'Memory Usage',\n disk_usage: 'Disk Usage',\n network_in: 'Network In',\n network_out: 'Network Out',\n};\n\nconst NETWORK_METRICS = new Set(['network_in', 'network_out']);\n\nfunction formatValue(metric: string, value: number): string {\n if (NETWORK_METRICS.has(metric)) {\n return formatBytes(value) + '/s';\n }\n return `${value.toFixed(1)}%`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(1)} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction computeStats(data: MetricDataPoint[]): { latest: number; avg: number; max: number } {\n if (data.length === 0) return { latest: 0, avg: 0, max: 0 };\n const latest = data[data.length - 1].value;\n let sum = 0;\n let max = -Infinity;\n for (const d of data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return { latest, avg: sum / data.length, max };\n}\n\n/**\n * Aggregate multiple series of the same metric (e.g. multiple network interfaces)\n * into a single series per metric name. Network metrics are summed; others take the first series.\n */\nfunction aggregateByMetric(series: MetricSeries[]): MetricSeries[] {\n const grouped = new Map<string, MetricSeries[]>();\n for (const s of series) {\n const existing = grouped.get(s.metric);\n if (existing) existing.push(s);\n else grouped.set(s.metric, [s]);\n }\n\n const result: MetricSeries[] = [];\n for (const [metric, group] of grouped) {\n if (group.length === 1 || !NETWORK_METRICS.has(metric)) {\n result.push(group[0]);\n continue;\n }\n // Sum network metrics across interfaces by matching timestamps\n const tsMap = new Map<number, number>();\n for (const s of group) {\n for (const d of s.data) {\n tsMap.set(d.timestamp, (tsMap.get(d.timestamp) ?? 0) + d.value);\n }\n }\n const merged: MetricDataPoint[] = [...tsMap.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([timestamp, value]) => ({ timestamp, value }));\n result.push({ metric, instance_id: 'aggregate', data: merged });\n }\n return result;\n}\n\nexport async function fetchMetricsSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<MetricsResponse> {\n const res = await platformFetch(`/projects/v1/${projectId}/metrics?range=1h`, {}, apiUrl);\n return (await res.json()) as MetricsResponse;\n}\n\nexport function registerDiagnoseMetricsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('metrics')\n .description('Display EC2 instance metrics (CPU, memory, disk, network)')\n .option('--range <range>', 'Time range: 1h, 6h, 24h, 7d', '1h')\n .option('--metrics <list>', 'Comma-separated metrics to query')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Metrics requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('metrics', config);\n\n const params = new URLSearchParams({ range: opts.range });\n if (opts.metrics) params.set('metrics', opts.metrics);\n\n const res = await platformFetch(\n `/projects/v1/${config.project_id}/metrics?${params.toString()}`,\n {},\n apiUrl,\n );\n const data = (await res.json()) as MetricsResponse;\n\n const aggregated = aggregateByMetric(data.metrics);\n\n if (json) {\n const enriched = {\n ...data,\n metrics: aggregated.map((m) => {\n const stats = computeStats(m.data);\n return { ...m, latest: stats.latest, avg: stats.avg, max: stats.max };\n }),\n };\n outputJson(enriched);\n } else {\n if (!aggregated.length) {\n console.log('No metrics data available.');\n return;\n }\n const headers = ['Metric', 'Latest', 'Avg', 'Max', 'Range'];\n const rows = aggregated.map((m) => {\n const stats = computeStats(m.data);\n return [\n METRIC_LABELS[m.metric] ?? m.metric,\n formatValue(m.metric, stats.latest),\n formatValue(m.metric, stats.avg),\n formatValue(m.metric, stats.max),\n data.range,\n ];\n });\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.metrics', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.metrics', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\n\ninterface AdvisorScanSummary {\n scanId: string;\n status: string;\n scanType: string;\n scannedAt: string;\n summary: { total: number; critical: number; warning: number; info: number };\n collectorErrors: { collector: string; error: string; timestamp: string }[];\n}\n\ninterface AdvisorIssue {\n id: string;\n ruleId: string;\n severity: string;\n category: string;\n title: string;\n description: string;\n affectedObject: string;\n recommendation: string;\n isResolved: boolean;\n}\n\ninterface AdvisorIssuesResponse {\n issues: AdvisorIssue[];\n total: number;\n}\n\nexport async function fetchAdvisorSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<AdvisorScanSummary> {\n const res = await platformFetch(`/projects/v1/${projectId}/advisor/latest`, {}, apiUrl);\n return (await res.json()) as AdvisorScanSummary;\n}\n\nexport function registerDiagnoseAdvisorCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('advisor')\n .description('Display latest advisor scan results and issues')\n .option('--severity <level>', 'Filter by severity: critical, warning, info')\n .option('--category <cat>', 'Filter by category: security, performance, health')\n .option('--limit <n>', 'Maximum number of issues to return', '50')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Advisor requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('advisor', config);\n\n const projectId = config.project_id;\n\n // Fetch scan summary\n const scanRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest`,\n {},\n apiUrl,\n );\n const scan = (await scanRes.json()) as AdvisorScanSummary;\n\n // Fetch issues\n const issueParams = new URLSearchParams();\n if (opts.severity) issueParams.set('severity', opts.severity);\n if (opts.category) issueParams.set('category', opts.category);\n issueParams.set('limit', opts.limit);\n\n const issuesRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest/issues?${issueParams.toString()}`,\n {},\n apiUrl,\n );\n const issuesData = (await issuesRes.json()) as AdvisorIssuesResponse;\n\n if (json) {\n outputJson({ scan, issues: issuesData.issues });\n } else {\n // Scan summary line\n const date = new Date(scan.scannedAt).toLocaleDateString();\n const s = scan.summary;\n console.log(\n `Scan: ${date} (${scan.status}) — ${s.critical} critical, ${s.warning} warning, ${s.info} info\\n`,\n );\n\n if (!issuesData.issues || issuesData.issues.length === 0) {\n console.log('No issues found.');\n return;\n }\n\n const headers = ['Severity', 'Category', 'Affected Object', 'Title'];\n const rows = issuesData.issues.map((issue) => [\n issue.severity,\n issue.category,\n issue.affectedObject,\n issue.title,\n ]);\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.advisor', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.advisor', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface DbCheck {\n label: string;\n sql: string;\n format: (rows: Record<string, unknown>[]) => void;\n}\n\nconst DB_CHECKS: Record<string, DbCheck> = {\n connections: {\n label: 'Connections',\n sql: `SELECT\n (SELECT count(*) FROM pg_stat_activity WHERE state IS NOT NULL) AS active,\n (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max`,\n format(rows) {\n const r = rows[0] ?? {};\n console.log(` Active: ${r.active} / ${r.max}`);\n },\n },\n 'slow-queries': {\n label: 'Slow Queries (>5s)',\n sql: `SELECT pid, now() - query_start AS duration, substring(query for 80) AS query\n FROM pg_stat_activity\n WHERE state = 'active' AND now() - query_start > interval '5 seconds'\n ORDER BY query_start ASC`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Duration', 'Query'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.duration ?? ''),\n String(r.query ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n bloat: {\n label: 'Table Bloat (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table, n_dead_tup AS dead_tuples\n FROM pg_stat_user_tables\n ORDER BY n_dead_tup DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Dead Tuples'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.dead_tuples ?? 0),\n ]);\n outputTable(headers, tableRows);\n },\n },\n size: {\n label: 'Table Sizes (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table,\n pg_size_pretty(pg_total_relation_size(relid)) AS size\n FROM pg_stat_user_tables\n ORDER BY pg_total_relation_size(relid) DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Size'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.size ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'index-usage': {\n label: 'Index Usage (worst 10)',\n sql: `SELECT schemaname || '.' || relname AS table, idx_scan, seq_scan,\n CASE WHEN (idx_scan + seq_scan) > 0\n THEN round(100.0 * idx_scan / (idx_scan + seq_scan), 1)\n ELSE 0 END AS idx_ratio\n FROM pg_stat_user_tables\n WHERE (idx_scan + seq_scan) > 0\n ORDER BY idx_ratio ASC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No scan data available.');\n return;\n }\n const headers = ['Table', 'Index Scans', 'Seq Scans', 'Index Ratio'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.idx_scan ?? 0),\n String(r.seq_scan ?? 0),\n `${r.idx_ratio ?? 0}%`,\n ]);\n outputTable(headers, tableRows);\n },\n },\n locks: {\n label: 'Waiting Locks',\n sql: `SELECT pid, mode, relation::regclass AS relation, granted\n FROM pg_locks\n WHERE NOT granted`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Mode', 'Relation', 'Granted'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.mode ?? ''),\n String(r.relation ?? ''),\n String(r.granted ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'cache-hit': {\n label: 'Cache Hit Ratio',\n sql: `SELECT CASE WHEN sum(heap_blks_hit + heap_blks_read) > 0\n THEN round(100.0 * sum(heap_blks_hit) / sum(heap_blks_hit + heap_blks_read), 1)\n ELSE 0 END AS ratio\n FROM pg_statio_user_tables`,\n format(rows) {\n const ratio = rows[0]?.ratio ?? 0;\n console.log(` ${ratio}%`);\n },\n },\n};\n\nconst ALL_CHECKS = Object.keys(DB_CHECKS);\n\nexport async function runDbChecks(): Promise<Record<string, Record<string, unknown>[]>> {\n const results: Record<string, Record<string, unknown>[]> = {};\n for (const key of ALL_CHECKS) {\n try {\n const { rows } = await runRawSql(DB_CHECKS[key].sql, true);\n results[key] = rows;\n } catch {\n results[key] = [];\n }\n }\n return results;\n}\n\nexport function registerDiagnoseDbCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('db')\n .description('Run database health checks (connections, bloat, index usage, etc.)')\n .option('--check <checks>', 'Comma-separated checks: ' + ALL_CHECKS.join(', '), 'all')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('db', config);\n\n const checkNames =\n opts.check === 'all'\n ? ALL_CHECKS\n : (opts.check as string).split(',').map((s: string) => s.trim());\n\n const results: Record<string, Record<string, unknown>[]> = {};\n\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) {\n console.error(`Unknown check: ${name}. Available: ${ALL_CHECKS.join(', ')}`);\n continue;\n }\n try {\n const { rows } = await runRawSql(check.sql, true);\n results[name] = rows;\n } catch (err) {\n results[name] = [];\n if (!json) {\n console.error(` Failed to run ${name}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n if (json) {\n outputJson(results);\n } else {\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) continue;\n console.log(`\\n── ${check.label} ${'─'.repeat(Math.max(0, 40 - check.label.length))}`);\n check.format(results[name] ?? []);\n }\n console.log('');\n }\n await reportCliUsage('cli.diagnose.db', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.db', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\nconst LOG_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\n\nconst ERROR_PATTERN = /\\b(error|fatal|panic)\\b/i;\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\ninterface LogEntry {\n timestamp: string;\n message: string;\n source: string;\n}\n\ninterface SourceSummary {\n source: string;\n total: number;\n errors: LogEntry[];\n}\n\nfunction parseLogEntry(entry: unknown): { ts: string; msg: string } {\n if (typeof entry === 'string') {\n return { ts: '', msg: entry };\n }\n const e = entry as Record<string, unknown>;\n const ts = String(e.timestamp ?? e.time ?? '');\n const msg = String(e.message ?? e.msg ?? e.log ?? JSON.stringify(e));\n return { ts, msg };\n}\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nasync function fetchSourceLogs(source: string, limit: number): Promise<SourceSummary> {\n const res = await ossFetch(getLogPath(source, limit));\n const data = await res.json();\n const logs = Array.isArray(data) ? data : ((data as Record<string, unknown>).logs as unknown[]) ?? [];\n\n const errors: LogEntry[] = [];\n for (const entry of logs) {\n const { ts, msg } = parseLogEntry(entry);\n if (ERROR_PATTERN.test(msg)) {\n errors.push({ timestamp: ts, message: msg, source });\n }\n }\n\n return { source, total: logs.length, errors };\n}\n\nexport async function fetchLogsSummary(limit = 100): Promise<SourceSummary[]> {\n const results: SourceSummary[] = [];\n for (const source of LOG_SOURCES) {\n try {\n results.push(await fetchSourceLogs(source, limit));\n } catch {\n results.push({ source, total: 0, errors: [] });\n }\n }\n return results;\n}\n\nexport function registerDiagnoseLogsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('logs')\n .description('Aggregate error-level logs from all backend sources')\n .option('--source <name>', 'Specific log source to check')\n .option('--limit <n>', 'Number of log entries per source', '100')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('logs', config);\n\n const limit = parseInt(opts.limit, 10) || 100;\n const sources = opts.source ? [opts.source as string] : [...LOG_SOURCES];\n\n const summaries: SourceSummary[] = [];\n for (const source of sources) {\n try {\n summaries.push(await fetchSourceLogs(source, limit));\n } catch {\n summaries.push({ source, total: 0, errors: [] });\n }\n }\n\n if (json) {\n outputJson({ sources: summaries });\n } else {\n // Summary table\n const headers = ['Source', 'Total', 'Errors'];\n const rows = summaries.map((s) => [s.source, String(s.total), String(s.errors.length)]);\n outputTable(headers, rows);\n\n // Error details\n const allErrors = summaries.flatMap((s) => s.errors);\n if (allErrors.length > 0) {\n console.log('\\n── Error Details ' + '─'.repeat(30));\n for (const err of allErrors) {\n const prefix = err.timestamp ? `[${err.source}] ${err.timestamp}` : `[${err.source}]`;\n console.log(`\\n ${prefix}`);\n console.log(` ${err.message}`);\n }\n console.log('');\n }\n }\n await reportCliUsage('cli.diagnose.logs', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.logs', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import { ossFetch } from './oss.js';\nimport type {\n ArchivePaymentPriceResponse,\n ConfigurePaymentWebhookResponse,\n CreatePaymentPriceRequest,\n CreatePaymentProductRequest,\n DeletePaymentProductResponse,\n GetPaymentPriceResponse,\n GetPaymentProductResponse,\n GetPaymentsConfigResponse,\n GetPaymentsStatusResponse,\n ListPaymentCatalogResponse,\n ListPaymentHistoryRequest,\n ListPaymentHistoryResponse,\n ListPaymentPricesResponse,\n ListPaymentProductsResponse,\n ListSubscriptionsRequest,\n ListSubscriptionsResponse,\n MutatePaymentPriceResponse,\n MutatePaymentProductResponse,\n StripeEnvironment,\n SyncPaymentsRequest,\n SyncPaymentsResponse,\n UpdatePaymentPriceRequest,\n UpdatePaymentProductRequest,\n} from '@insforge/shared-schemas';\n\nfunction withQuery(path: string, params: Record<string, string | number | undefined>): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) query.set(key, String(value));\n }\n const suffix = query.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n\nasync function readJson<T>(res: Response): Promise<T> {\n return await res.json() as T;\n}\n\nexport async function getPaymentsStatus(): Promise<GetPaymentsStatusResponse> {\n return readJson(await ossFetch('/api/payments/status'));\n}\n\nexport async function getPaymentsConfig(): Promise<GetPaymentsConfigResponse> {\n return readJson(await ossFetch('/api/payments/config'));\n}\n\nexport async function setStripeSecretKey(\n environment: StripeEnvironment,\n secretKey: string,\n): Promise<GetPaymentsConfigResponse> {\n return readJson(await ossFetch('/api/payments/config', {\n method: 'POST',\n body: JSON.stringify({ environment, secretKey }),\n }));\n}\n\nexport async function removeStripeSecretKey(\n environment: StripeEnvironment,\n): Promise<GetPaymentsConfigResponse> {\n return readJson(await ossFetch(`/api/payments/config/${encodeURIComponent(environment)}`, {\n method: 'DELETE',\n }));\n}\n\nexport async function syncPayments(environment: SyncPaymentsRequest['environment'] = 'all'): Promise<SyncPaymentsResponse> {\n return readJson(await ossFetch('/api/payments/sync', {\n method: 'POST',\n body: JSON.stringify({ environment }),\n }));\n}\n\nexport async function configurePaymentWebhook(\n environment: StripeEnvironment,\n): Promise<ConfigurePaymentWebhookResponse> {\n return readJson(await ossFetch(\n `/api/payments/webhooks/${encodeURIComponent(environment)}/configure`,\n { method: 'POST' },\n ));\n}\n\nexport async function listPaymentCatalog(\n environment?: StripeEnvironment,\n): Promise<ListPaymentCatalogResponse> {\n return readJson(await ossFetch(withQuery('/api/payments/catalog', { environment })));\n}\n\nexport async function listPaymentProducts(\n environment: StripeEnvironment,\n): Promise<ListPaymentProductsResponse> {\n return readJson(await ossFetch(withQuery('/api/payments/products', { environment })));\n}\n\nexport async function getPaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n): Promise<GetPaymentProductResponse> {\n return readJson(await ossFetch(withQuery(\n `/api/payments/products/${encodeURIComponent(productId)}`,\n { environment },\n )));\n}\n\nexport async function createPaymentProduct(\n request: CreatePaymentProductRequest,\n): Promise<MutatePaymentProductResponse> {\n return readJson(await ossFetch('/api/payments/products', {\n method: 'POST',\n body: JSON.stringify(request),\n }));\n}\n\nexport async function updatePaymentProduct(\n productId: string,\n request: UpdatePaymentProductRequest,\n): Promise<MutatePaymentProductResponse> {\n return readJson(await ossFetch(`/api/payments/products/${encodeURIComponent(productId)}`, {\n method: 'PATCH',\n body: JSON.stringify(request),\n }));\n}\n\nexport async function deletePaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n): Promise<DeletePaymentProductResponse> {\n return readJson(await ossFetch(withQuery(\n `/api/payments/products/${encodeURIComponent(productId)}`,\n { environment },\n ), { method: 'DELETE' }));\n}\n\nexport async function listPaymentPrices(\n environment: StripeEnvironment,\n stripeProductId?: string,\n): Promise<ListPaymentPricesResponse> {\n return readJson(await ossFetch(withQuery('/api/payments/prices', {\n environment,\n stripeProductId,\n })));\n}\n\nexport async function getPaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n): Promise<GetPaymentPriceResponse> {\n return readJson(await ossFetch(withQuery(\n `/api/payments/prices/${encodeURIComponent(priceId)}`,\n { environment },\n )));\n}\n\nexport async function createPaymentPrice(\n request: CreatePaymentPriceRequest,\n): Promise<MutatePaymentPriceResponse> {\n return readJson(await ossFetch('/api/payments/prices', {\n method: 'POST',\n body: JSON.stringify(request),\n }));\n}\n\nexport async function updatePaymentPrice(\n priceId: string,\n request: UpdatePaymentPriceRequest,\n): Promise<MutatePaymentPriceResponse> {\n return readJson(await ossFetch(`/api/payments/prices/${encodeURIComponent(priceId)}`, {\n method: 'PATCH',\n body: JSON.stringify(request),\n }));\n}\n\nexport async function archivePaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n): Promise<ArchivePaymentPriceResponse> {\n return readJson(await ossFetch(withQuery(\n `/api/payments/prices/${encodeURIComponent(priceId)}`,\n { environment },\n ), { method: 'DELETE' }));\n}\n\nexport async function listSubscriptions(\n request: ListSubscriptionsRequest,\n): Promise<ListSubscriptionsResponse> {\n return readJson(await ossFetch(withQuery('/api/payments/subscriptions', request)));\n}\n\nexport async function listPaymentHistory(\n request: ListPaymentHistoryRequest,\n): Promise<ListPaymentHistoryResponse> {\n return readJson(await ossFetch(withQuery('/api/payments/payment-history', request)));\n}\n","import type { StripeEnvironment } from '@insforge/shared-schemas';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { CLIError } from '../../lib/errors.js';\nimport { shutdownAnalytics, trackPayments } from '../../lib/analytics.js';\n\nexport type PaymentCommandTelemetry = Record<string, string | number | boolean | undefined>;\n\nexport function parseEnvironment(value: string): StripeEnvironment {\n if (value === 'test' || value === 'live') return value;\n throw new CLIError('Environment must be \"test\" or \"live\".');\n}\n\nexport function parseEnvironmentOrAll(value: string): StripeEnvironment | 'all' {\n if (value === 'all') return value;\n return parseEnvironment(value);\n}\n\nexport function parseBooleanOption(value: string | undefined, flagName: string): boolean | undefined {\n if (value === undefined) return undefined;\n\n const normalized = value.toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n\n throw new CLIError(`${flagName} must be \"true\" or \"false\".`);\n}\n\nexport function parseIntegerOption(\n value: string | undefined,\n flagName: string,\n options: { min?: number; max?: number } = {},\n): number | undefined {\n if (value === undefined) return undefined;\n\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || String(parsed) !== value.trim()) {\n throw new CLIError(`${flagName} must be an integer.`);\n }\n if (options.min !== undefined && parsed < options.min) {\n throw new CLIError(`${flagName} must be at least ${options.min}.`);\n }\n if (options.max !== undefined && parsed > options.max) {\n throw new CLIError(`${flagName} must be at most ${options.max}.`);\n }\n return parsed;\n}\n\nexport function parseMetadataOption(value: string | undefined): Record<string, string> | undefined {\n if (value === undefined) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new CLIError('Invalid JSON for --metadata.');\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new CLIError('--metadata must be a JSON object.');\n }\n\n const metadata: Record<string, string> = {};\n for (const [key, raw] of Object.entries(parsed)) {\n if (typeof raw !== 'string') {\n throw new CLIError(`Metadata value for \"${key}\" must be a string.`);\n }\n metadata[key] = raw;\n }\n\n return metadata;\n}\n\nexport function formatDate(value: string | null | undefined): string {\n if (!value) return '-';\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString();\n}\n\nexport function formatAmount(\n amount: number | null | undefined,\n currency: string | null | undefined,\n): string {\n if (amount === null || amount === undefined) return '-';\n const code = currency?.toUpperCase();\n let fractionDigits = 2;\n\n if (code) {\n try {\n fractionDigits = new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: code,\n }).resolvedOptions().maximumFractionDigits;\n } catch {\n fractionDigits = 2;\n }\n }\n\n const divisor = 10 ** fractionDigits;\n return `${(amount / divisor).toFixed(fractionDigits)} ${code ?? ''}`.trim();\n}\n\nexport function formatRecurring(\n interval: string | null | undefined,\n intervalCount: number | null | undefined,\n): string {\n if (!interval) return 'one-time';\n return `${intervalCount && intervalCount > 1 ? `${intervalCount} ` : ''}${interval}`;\n}\n\nexport async function trackPaymentUsage(\n subcommand: string,\n success: boolean,\n properties: PaymentCommandTelemetry = {},\n): Promise<void> {\n try {\n try {\n const config = getProjectConfig();\n if (config) {\n trackPayments(subcommand, config, {\n success,\n ...properties,\n });\n }\n } catch {\n // Telemetry should never affect command behavior.\n }\n } finally {\n await shutdownAnalytics();\n }\n}\n","import type { Command } from 'commander';\nimport { listPaymentCatalog } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { formatAmount, formatRecurring, parseEnvironment, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsCatalogCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('catalog')\n .description('List mirrored Stripe products and prices')\n .option('--environment <environment>', 'Stripe environment: test or live')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = opts.environment ? parseEnvironment(opts.environment) : undefined;\n await requireAuth();\n\n const data = await listPaymentCatalog(environment);\n\n if (json) {\n outputJson(data);\n } else {\n if (data.products.length === 0 && data.prices.length === 0) {\n console.log('No Stripe catalog records found.');\n await trackPaymentUsage('catalog', true, { environment });\n return;\n }\n\n if (data.products.length > 0) {\n console.log('Products');\n outputTable(\n ['Env', 'Product ID', 'Name', 'Active', 'Default Price'],\n data.products.map((product) => [\n product.environment,\n product.stripeProductId,\n product.name,\n product.active ? 'Yes' : 'No',\n product.defaultPriceId ?? '-',\n ]),\n );\n }\n\n if (data.prices.length > 0) {\n console.log('Prices');\n outputTable(\n ['Env', 'Price ID', 'Product ID', 'Amount', 'Type', 'Active', 'Recurring'],\n data.prices.map((price) => [\n price.environment,\n price.stripePriceId,\n price.stripeProductId ?? '-',\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? 'Yes' : 'No',\n formatRecurring(price.recurringInterval, price.recurringIntervalCount),\n ]),\n );\n }\n }\n\n await trackPaymentUsage('catalog', true, { environment });\n } catch (err) {\n await trackPaymentUsage('catalog', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n getPaymentsConfig,\n removeStripeSecretKey,\n setStripeSecretKey,\n} from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { parseEnvironment, trackPaymentUsage } from './utils.js';\n\nfunction outputConfigTable(data: Awaited<ReturnType<typeof getPaymentsConfig>>): void {\n if (data.keys.length === 0) {\n console.log('No Stripe keys configured.');\n return;\n }\n\n outputTable(\n ['Env', 'Configured', 'Key'],\n data.keys.map((key) => [\n key.environment,\n key.hasKey ? 'Yes' : 'No',\n key.maskedKey ?? '-',\n ]),\n );\n}\n\nexport function registerPaymentsConfigCommand(paymentsCmd: Command): void {\n const configCmd = paymentsCmd\n .command('config')\n .description('Manage Stripe API keys for payments')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const data = await getPaymentsConfig();\n\n if (json) {\n outputJson(data);\n } else {\n outputConfigTable(data);\n }\n\n await trackPaymentUsage('config', true);\n } catch (err) {\n await trackPaymentUsage('config', false);\n handleError(err, json);\n }\n });\n\n configCmd\n .command('set <environment> [secretKey]')\n .description('Configure a Stripe secret key for test or live payments')\n .action(async (environmentValue: string, secretKeyValue: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n let secretKey = secretKeyValue;\n if (!secretKey) {\n if (json) {\n throw new CLIError('Provide secretKey when using --json.');\n }\n\n const input = await prompts.password({\n message: `Stripe ${environment} secret key`,\n });\n if (prompts.isCancel(input)) process.exit(0);\n secretKey = input;\n }\n\n const data = await setStripeSecretKey(environment, secretKey);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe ${environment} key configured.`);\n }\n\n await trackPaymentUsage('config.set', true, { environment });\n } catch (err) {\n await trackPaymentUsage('config.set', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n\n configCmd\n .command('remove <environment>')\n .alias('delete')\n .description('Remove a configured Stripe secret key')\n .action(async (environmentValue: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n if (json && !yes) {\n throw new CLIError('Use --yes with --json to remove a Stripe key non-interactively.');\n }\n\n if (!yes) {\n const confirm = await prompts.confirm({\n message: `Remove Stripe ${environment} key? Payment sync and mutations for this environment will stop.`,\n });\n if (prompts.isCancel(confirm) || !confirm) process.exit(0);\n }\n\n const data = await removeStripeSecretKey(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe ${environment} key removed.`);\n }\n\n await trackPaymentUsage('config.remove', true, { environment });\n } catch (err) {\n await trackPaymentUsage('config.remove', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listPaymentHistory } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport {\n formatAmount,\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from './utils.js';\n\nexport function registerPaymentsHistoryCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('history')\n .description('List mirrored Stripe payment history')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .option('--subject-type <type>', 'Filter by billing subject type')\n .option('--subject-id <id>', 'Filter by billing subject id')\n .option('--limit <limit>', 'Maximum rows to return (1-100)', '50')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit = parseIntegerOption(opts.limit, '--limit', { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listPaymentHistory({\n environment,\n limit,\n ...(opts.subjectType !== undefined ? { subjectType: opts.subjectType } : {}),\n ...(opts.subjectId !== undefined ? { subjectId: opts.subjectId } : {}),\n });\n\n if (json) {\n outputJson(data);\n } else if (data.paymentHistory.length === 0) {\n console.log('No Stripe payment history found.');\n } else {\n outputTable(\n ['Type', 'Status', 'Subject', 'Amount', 'Customer', 'Stripe Object', 'When'],\n data.paymentHistory.map((entry) => [\n entry.type,\n entry.status,\n entry.subjectType && entry.subjectId ? `${entry.subjectType}:${entry.subjectId}` : '-',\n formatAmount(entry.amount, entry.currency),\n entry.stripeCustomerId ?? '-',\n entry.stripeCheckoutSessionId\n ?? entry.stripeInvoiceId\n ?? entry.stripePaymentIntentId\n ?? entry.stripeRefundId\n ?? '-',\n formatDate(entry.paidAt ?? entry.failedAt ?? entry.refundedAt ?? entry.stripeCreatedAt),\n ]),\n );\n }\n\n await trackPaymentUsage('history', true, { environment });\n } catch (err) {\n await trackPaymentUsage('history', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport {\n archivePaymentPrice,\n createPaymentPrice,\n getPaymentPrice,\n listPaymentPrices,\n updatePaymentPrice,\n} from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport type {\n CreatePaymentPriceRequest,\n StripePriceMirror,\n StripePriceRecurringInterval,\n StripePriceTaxBehavior,\n UpdatePaymentPriceRequest,\n} from '@insforge/shared-schemas';\nimport {\n formatAmount,\n formatDate,\n formatRecurring,\n parseBooleanOption,\n parseEnvironment,\n parseIntegerOption,\n parseMetadataOption,\n trackPaymentUsage,\n} from './utils.js';\n\nfunction nullableString(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n return value === 'null' ? null : value;\n}\n\nfunction parseRecurringInterval(value: string | undefined): StripePriceRecurringInterval | undefined {\n if (value === undefined) return undefined;\n if (value === 'day' || value === 'week' || value === 'month' || value === 'year') return value;\n throw new CLIError('--interval must be one of: day, week, month, year.');\n}\n\nfunction parseTaxBehavior(value: string | undefined): StripePriceTaxBehavior | undefined {\n if (value === undefined) return undefined;\n if (value === 'exclusive' || value === 'inclusive' || value === 'unspecified') return value;\n throw new CLIError('--tax-behavior must be one of: exclusive, inclusive, unspecified.');\n}\n\nfunction outputPricesTable(prices: StripePriceMirror[]): void {\n if (prices.length === 0) {\n console.log('No Stripe prices found.');\n return;\n }\n\n outputTable(\n ['Env', 'Price ID', 'Product ID', 'Amount', 'Type', 'Active', 'Recurring', 'Synced At'],\n prices.map((price) => [\n price.environment,\n price.stripePriceId,\n price.stripeProductId ?? '-',\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? 'Yes' : 'No',\n formatRecurring(price.recurringInterval, price.recurringIntervalCount),\n formatDate(price.syncedAt),\n ]),\n );\n}\n\nexport function registerPaymentsPricesCommand(paymentsCmd: Command): void {\n const pricesCmd = paymentsCmd\n .command('prices')\n .description('Manage Stripe prices');\n\n pricesCmd\n .command('list')\n .description('List mirrored Stripe prices')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .option('--product <productId>', 'Filter by Stripe product id')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentPrices(environment, opts.product);\n\n if (json) {\n outputJson(data);\n } else {\n outputPricesTable(data.prices);\n }\n\n await trackPaymentUsage('prices.list', true, { environment });\n } catch (err) {\n await trackPaymentUsage('prices.list', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command('get <priceId>')\n .description('Show one Stripe price')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await getPaymentPrice(environment, priceId);\n\n if (json) {\n outputJson(data);\n } else {\n outputPricesTable([data.price]);\n }\n\n await trackPaymentUsage('prices.get', true, { environment });\n } catch (err) {\n await trackPaymentUsage('prices.get', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command('create')\n .description('Create a Stripe one-time or recurring price')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .requiredOption('--product <productId>', 'Stripe product id')\n .requiredOption('--currency <currency>', 'Three-letter currency code, e.g. usd')\n .requiredOption('--unit-amount <amount>', 'Unit amount in the smallest currency unit, e.g. cents')\n .option('--interval <interval>', 'Recurring interval: day, week, month, or year')\n .option('--interval-count <count>', 'Recurring interval count')\n .option('--lookup-key <key>', 'Stripe lookup key, or \"null\"')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--tax-behavior <behavior>', 'exclusive, inclusive, or unspecified')\n .option('--metadata <json>', 'Metadata JSON object with string values')\n .option('--idempotency-key <key>', 'Caller-stable idempotency key')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const interval = parseRecurringInterval(opts.interval);\n const intervalCount = parseIntegerOption(opts.intervalCount, '--interval-count', { min: 1 });\n if (!interval && intervalCount !== undefined) {\n throw new CLIError('Provide --interval when using --interval-count.');\n }\n\n const request: CreatePaymentPriceRequest = {\n environment,\n stripeProductId: opts.product,\n currency: opts.currency,\n unitAmount: parseIntegerOption(opts.unitAmount, '--unit-amount', { min: 0 }) ?? 0,\n };\n const lookupKey = nullableString(opts.lookupKey);\n const active = parseBooleanOption(opts.active, '--active');\n const taxBehavior = parseTaxBehavior(opts.taxBehavior);\n const metadata = parseMetadataOption(opts.metadata);\n if (lookupKey !== undefined) request.lookupKey = lookupKey;\n if (active !== undefined) request.active = active;\n if (taxBehavior !== undefined) request.taxBehavior = taxBehavior;\n if (metadata !== undefined) request.metadata = metadata;\n if (opts.idempotencyKey !== undefined) request.idempotencyKey = opts.idempotencyKey;\n if (interval) {\n request.recurring = {\n interval,\n ...(intervalCount !== undefined ? { intervalCount } : {}),\n };\n }\n\n const data = await createPaymentPrice(request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price created: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage('prices.create', true, { environment });\n } catch (err) {\n await trackPaymentUsage('prices.create', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command('update <priceId>')\n .description('Update a Stripe price')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--lookup-key <key>', 'Stripe lookup key, or \"null\"')\n .option('--tax-behavior <behavior>', 'exclusive, inclusive, or unspecified')\n .option('--metadata <json>', 'Metadata JSON object with string values')\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: UpdatePaymentPriceRequest = { environment };\n const active = parseBooleanOption(opts.active, '--active');\n const lookupKey = nullableString(opts.lookupKey);\n const taxBehavior = parseTaxBehavior(opts.taxBehavior);\n const metadata = parseMetadataOption(opts.metadata);\n if (active !== undefined) request.active = active;\n if (lookupKey !== undefined) request.lookupKey = lookupKey;\n if (taxBehavior !== undefined) request.taxBehavior = taxBehavior;\n if (metadata !== undefined) request.metadata = metadata;\n\n if (Object.keys(request).length === 1) {\n throw new CLIError('Provide at least one option to update (--active, --lookup-key, --tax-behavior, --metadata).');\n }\n\n const data = await updatePaymentPrice(priceId, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price updated: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage('prices.update', true, { environment });\n } catch (err) {\n await trackPaymentUsage('prices.update', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command('archive <priceId>')\n .alias('delete')\n .description('Archive a Stripe price')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await archivePaymentPrice(environment, priceId);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price archived: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage('prices.archive', true, { environment });\n } catch (err) {\n await trackPaymentUsage('prices.archive', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n createPaymentProduct,\n deletePaymentProduct,\n getPaymentProduct,\n listPaymentProducts,\n updatePaymentProduct,\n} from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport type {\n CreatePaymentProductRequest,\n StripeProductMirror,\n UpdatePaymentProductRequest,\n} from '@insforge/shared-schemas';\nimport {\n formatAmount,\n formatDate,\n parseBooleanOption,\n parseEnvironment,\n parseMetadataOption,\n trackPaymentUsage,\n} from './utils.js';\n\nfunction nullableString(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n return value === 'null' ? null : value;\n}\n\nfunction outputProductsTable(products: StripeProductMirror[]): void {\n if (products.length === 0) {\n console.log('No Stripe products found.');\n return;\n }\n\n outputTable(\n ['Env', 'Product ID', 'Name', 'Active', 'Default Price', 'Synced At'],\n products.map((product) => [\n product.environment,\n product.stripeProductId,\n product.name,\n product.active ? 'Yes' : 'No',\n product.defaultPriceId ?? '-',\n formatDate(product.syncedAt),\n ]),\n );\n}\n\nexport function registerPaymentsProductsCommand(paymentsCmd: Command): void {\n const productsCmd = paymentsCmd\n .command('products')\n .description('Manage Stripe products');\n\n productsCmd\n .command('list')\n .description('List mirrored Stripe products')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentProducts(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputProductsTable(data.products);\n }\n\n await trackPaymentUsage('products.list', true, { environment });\n } catch (err) {\n await trackPaymentUsage('products.list', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command('get <productId>')\n .description('Show one Stripe product and its prices')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .action(async (productId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await getPaymentProduct(environment, productId);\n\n if (json) {\n outputJson(data);\n } else {\n outputProductsTable([data.product]);\n if (data.prices.length > 0) {\n console.log('Prices');\n outputTable(\n ['Price ID', 'Amount', 'Type', 'Active', 'Lookup Key'],\n data.prices.map((price) => [\n price.stripePriceId,\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? 'Yes' : 'No',\n price.lookupKey ?? '-',\n ]),\n );\n }\n }\n\n await trackPaymentUsage('products.get', true, { environment });\n } catch (err) {\n await trackPaymentUsage('products.get', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command('create')\n .description('Create a Stripe product')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .requiredOption('--name <name>', 'Product name')\n .option('--description <description>', 'Product description, or \"null\"')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--metadata <json>', 'Metadata JSON object with string values')\n .option('--idempotency-key <key>', 'Caller-stable idempotency key')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: CreatePaymentProductRequest = {\n environment,\n name: opts.name,\n };\n const description = nullableString(opts.description);\n const active = parseBooleanOption(opts.active, '--active');\n const metadata = parseMetadataOption(opts.metadata);\n if (description !== undefined) request.description = description;\n if (active !== undefined) request.active = active;\n if (metadata !== undefined) request.metadata = metadata;\n if (opts.idempotencyKey !== undefined) request.idempotencyKey = opts.idempotencyKey;\n\n const data = await createPaymentProduct(request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe product created: ${data.product.stripeProductId}`);\n }\n\n await trackPaymentUsage('products.create', true, { environment });\n } catch (err) {\n await trackPaymentUsage('products.create', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command('update <productId>')\n .description('Update a Stripe product')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .option('--name <name>', 'Product name')\n .option('--description <description>', 'Product description, or \"null\"')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--metadata <json>', 'Metadata JSON object with string values')\n .action(async (productId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: UpdatePaymentProductRequest = { environment };\n const description = nullableString(opts.description);\n const active = parseBooleanOption(opts.active, '--active');\n const metadata = parseMetadataOption(opts.metadata);\n if (opts.name !== undefined) request.name = opts.name;\n if (description !== undefined) request.description = description;\n if (active !== undefined) request.active = active;\n if (metadata !== undefined) request.metadata = metadata;\n\n if (Object.keys(request).length === 1) {\n throw new CLIError('Provide at least one option to update (--name, --description, --active, --metadata).');\n }\n\n const data = await updatePaymentProduct(productId, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe product updated: ${data.product.stripeProductId}`);\n }\n\n await trackPaymentUsage('products.update', true, { environment });\n } catch (err) {\n await trackPaymentUsage('products.update', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command('delete <productId>')\n .description('Delete a Stripe product that has no prices')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .action(async (productId: string, opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n if (json && !yes) {\n throw new CLIError('Use --yes with --json to delete a Stripe product non-interactively.');\n }\n\n if (!yes) {\n const confirm = await prompts.confirm({\n message: `Delete Stripe ${environment} product \"${productId}\"?`,\n });\n if (prompts.isCancel(confirm) || !confirm) process.exit(0);\n }\n\n const data = await deletePaymentProduct(environment, productId);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe product deleted: ${data.stripeProductId}`);\n }\n\n await trackPaymentUsage('products.delete', true, { environment });\n } catch (err) {\n await trackPaymentUsage('products.delete', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getPaymentsStatus } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { formatDate, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsStatusCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('status')\n .description('Show Stripe payment connection, sync, and webhook status')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const data = await getPaymentsStatus();\n\n if (json) {\n outputJson(data);\n } else if (data.connections.length === 0) {\n console.log('No Stripe payment environments found.');\n } else {\n outputTable(\n ['Env', 'Status', 'Key', 'Account', 'Webhook', 'Last Sync', 'Synced At'],\n data.connections.map((connection) => [\n connection.environment,\n connection.status,\n connection.maskedKey ?? '-',\n connection.stripeAccountId ?? '-',\n connection.webhookEndpointId ? 'Configured' : '-',\n connection.lastSyncStatus ?? '-',\n formatDate(connection.lastSyncedAt),\n ]),\n );\n }\n\n await trackPaymentUsage('status', true);\n } catch (err) {\n await trackPaymentUsage('status', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listSubscriptions } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport {\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from './utils.js';\n\nexport function registerPaymentsSubscriptionsCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('subscriptions')\n .description('List mirrored Stripe subscriptions')\n .requiredOption('--environment <environment>', 'Stripe environment: test or live')\n .option('--subject-type <type>', 'Filter by billing subject type')\n .option('--subject-id <id>', 'Filter by billing subject id')\n .option('--limit <limit>', 'Maximum rows to return (1-100)', '50')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit = parseIntegerOption(opts.limit, '--limit', { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listSubscriptions({\n environment,\n limit,\n ...(opts.subjectType !== undefined ? { subjectType: opts.subjectType } : {}),\n ...(opts.subjectId !== undefined ? { subjectId: opts.subjectId } : {}),\n });\n\n if (json) {\n outputJson(data);\n } else if (data.subscriptions.length === 0) {\n console.log('No Stripe subscriptions found.');\n } else {\n outputTable(\n ['Subscription ID', 'Customer', 'Subject', 'Status', 'Items', 'Period End'],\n data.subscriptions.map((subscription) => [\n subscription.stripeSubscriptionId,\n subscription.stripeCustomerId,\n subscription.subjectType && subscription.subjectId\n ? `${subscription.subjectType}:${subscription.subjectId}`\n : '-',\n subscription.status,\n String(subscription.items?.length ?? 0),\n formatDate(subscription.currentPeriodEnd),\n ]),\n );\n }\n\n await trackPaymentUsage('subscriptions', true, { environment });\n } catch (err) {\n await trackPaymentUsage('subscriptions', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { syncPayments } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { formatDate, parseEnvironmentOrAll, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsSyncCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('sync')\n .description('Sync configured Stripe products, prices, and subscriptions')\n .option('--environment <environment>', 'Stripe environment: test, live, or all', 'all')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironmentOrAll(opts.environment);\n await requireAuth();\n\n const data = await syncPayments(environment);\n\n if (json) {\n outputJson(data);\n } else if (data.results.length === 0) {\n console.log('No configured Stripe environments to sync.');\n } else {\n outputTable(\n ['Env', 'Status', 'Products', 'Prices', 'Subscriptions', 'Unmapped', 'Synced At'],\n data.results.map((result) => [\n result.environment,\n result.connection.lastSyncStatus ?? result.connection.status,\n String(result.connection.lastSyncCounts.products ?? 0),\n String(result.connection.lastSyncCounts.prices ?? 0),\n String(result.subscriptions?.synced ?? 0),\n String(result.subscriptions?.unmapped ?? 0),\n formatDate(result.connection.lastSyncedAt),\n ]),\n );\n outputSuccess('Stripe payments synced.');\n }\n\n await trackPaymentUsage('sync', true, { environment });\n } catch (err) {\n await trackPaymentUsage('sync', false, { environment: opts.environment });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { configurePaymentWebhook } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { formatDate, parseEnvironment, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsWebhooksCommand(paymentsCmd: Command): void {\n const webhooksCmd = paymentsCmd\n .command('webhooks')\n .description('Manage InsForge-managed Stripe webhooks');\n\n webhooksCmd\n .command('configure <environment>')\n .description('Create or recreate the managed Stripe webhook endpoint')\n .action(async (environmentValue: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n const data = await configurePaymentWebhook(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputTable(\n ['Env', 'Webhook ID', 'URL', 'Configured At'],\n [[\n data.connection.environment,\n data.connection.webhookEndpointId ?? '-',\n data.connection.webhookEndpointUrl ?? '-',\n formatDate(data.connection.webhookConfiguredAt),\n ]],\n );\n outputSuccess(`Stripe ${environment} webhook configured.`);\n }\n\n await trackPaymentUsage('webhooks.configure', true, { environment });\n } catch (err) {\n await trackPaymentUsage('webhooks.configure', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { registerPaymentsCatalogCommand } from './catalog.js';\nimport { registerPaymentsConfigCommand } from './config.js';\nimport { registerPaymentsHistoryCommand } from './history.js';\nimport { registerPaymentsPricesCommand } from './prices.js';\nimport { registerPaymentsProductsCommand } from './products.js';\nimport { registerPaymentsStatusCommand } from './status.js';\nimport { registerPaymentsSubscriptionsCommand } from './subscriptions.js';\nimport { registerPaymentsSyncCommand } from './sync.js';\nimport { registerPaymentsWebhooksCommand } from './webhooks.js';\n\nexport function registerPaymentsCommands(paymentsCmd: Command): void {\n paymentsCmd.description('Manage Stripe payments');\n\n registerPaymentsStatusCommand(paymentsCmd);\n registerPaymentsConfigCommand(paymentsCmd);\n registerPaymentsSyncCommand(paymentsCmd);\n registerPaymentsWebhooksCommand(paymentsCmd);\n registerPaymentsCatalogCommand(paymentsCmd);\n registerPaymentsProductsCommand(paymentsCmd);\n registerPaymentsPricesCommand(paymentsCmd);\n registerPaymentsSubscriptionsCommand(paymentsCmd);\n registerPaymentsHistoryCommand(paymentsCmd);\n}\n"],"mappings":"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","names":["readFileSync","join","clack","resolve","isCancel","text","select","confirm","password","clack","URL","clack","URL","resolve","clack","confirm","isCancel","path","password","program","text","isCancel","password","program","program","orgsCmd","projectsCmd","select","isCancel","exec","promisify","fs","path","clack","pc","existsSync","readFileSync","join","clack","join","existsSync","readFileSync","exec","promisify","fs","path","clack","path","path","fs","createHash","clack","createHash","resolve","spinner","deploymentsCmd","execAsync","promisify","exec","program","select","isCancel","text","confirm","s","stat","execAsync","promisify","exec","buildOssHost","program","projectConfig","template","text","isCancel","pc","select","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","writeFileSync","dbCmd","writeFileSync","readFileSync","basename","dbCmd","readFileSync","basename","existsSync","readFileSync","writeFileSync","join","existsSync","mkdirSync","join","join","existsSync","mkdirSync","dbCmd","join","existsSync","writeFileSync","readFileSync","recordsCmd","path","recordsCmd","recordsCmd","recordsCmd","functionsCmd","readFileSync","existsSync","join","functionsCmd","join","existsSync","readFileSync","functionsCmd","text","functionsCmd","clack","functionsCmd","confirm","isCancel","storageCmd","readFileSync","existsSync","basename","storageCmd","existsSync","readFileSync","basename","writeFileSync","join","basename","storageCmd","join","basename","writeFileSync","storageCmd","storageCmd","confirm","isCancel","storageCmd","program","program","deploymentsCmd","deploymentsCmd","deploymentsCmd","confirm","isCancel","deploymentsCmd","program","path","secretsCmd","secretsCmd","secretsCmd","secretsCmd","secretsCmd","confirm","isCancel","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","confirm","isCancel","schedulesCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","existsSync","join","resolve","existsSync","writeFileSync","unlinkSync","join","path","join","existsSync","writeFileSync","unlinkSync","resolve","computeCmd","listRes","existing","updateBody","service","resolve","join","existsSync","program","program","formatSize","clack","diagnoseCmd","diagnoseCmd","diagnoseCmd","SOURCE_PATH","getLogPath","diagnoseCmd","diagnoseCmd","data","s","select","isCancel","path","paymentsCmd","paymentsCmd","password","isCancel","confirm","paymentsCmd","paymentsCmd","nullableString","paymentsCmd","confirm","isCancel","paymentsCmd","paymentsCmd","paymentsCmd","paymentsCmd","paymentsCmd","readFileSync","join","select","isCancel"]}
|