@01.software/cli 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/client.ts","../src/lib/credentials.ts","../src/lib/output.ts","../src/lib/admin-error.ts","../src/lib/i18n.ts","../src/commands/crud.ts","../src/lib/collections.ts","../src/lib/parse.ts","../src/commands/order.ts","../src/commands/return.ts","../src/commands/cart.ts","../src/commands/stock.ts","../src/commands/transaction.ts","../src/commands/auth.ts","../src/commands/schema.ts","../../contracts/src/tenant/index.ts","../src/commands/feature.ts","../src/commands/mcp.ts","../src/commands/agent.ts","../src/lib/agent-output.ts"],"sourcesContent":["import { createRequire } from 'node:module'\nimport { Command } from 'commander'\nimport { resolveClient, resolveClientOrThrow } from './lib/client.js'\nimport { exitWithError } from './lib/output.js'\nimport { setLocale, type Locale } from './lib/i18n.js'\nimport { registerCrudCommands } from './commands/crud.js'\nimport { registerOrderCommands } from './commands/order.js'\nimport { registerReturnCommands } from './commands/return.js'\nimport { registerCartCommands } from './commands/cart.js'\nimport { registerStockCommands } from './commands/stock.js'\nimport { registerTransactionCommands } from './commands/transaction.js'\nimport { registerAuthCommands } from './commands/auth.js'\nimport { registerSchemaCommands } from './commands/schema.js'\nimport { registerFeatureCommands } from './commands/feature.js'\nimport { registerMcpCommands } from './commands/mcp.js'\nimport { registerAgentCommands } from './commands/agent.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\nconst program = new Command()\n\nprogram\n .name('01')\n .description('CLI for the 01.software platform')\n .version(version)\n .option('--api-key <key>', 'API key (sk01_... or pat01_... token)')\n .option('--format <format>', 'Output format: json, table, or ndjson')\n .option('--lang <locale>', 'Force locale (ko or en)')\n\nconst getFormat = () =>\n (program.opts().format ?? process.env.OUTPUT_FORMAT ?? 'json') as string\n\n// Surface the explicit `--lang` flag (when supplied) so the i18n table\n// detection in `lib/i18n.ts` honours it before falling back to LC_ALL/LANG.\n// Also pin OUTPUT_FORMAT into the env so `exitWithError(e)` calls inside\n// command bodies pick up the format without threading it through every\n// call site.\nprogram.hook('preAction', () => {\n const lang = program.opts().lang as string | undefined\n if (lang === 'ko' || lang === 'en') setLocale(lang as Locale)\n process.env.OUTPUT_FORMAT = getFormat()\n})\n\nprocess.on('unhandledRejection', (err) => {\n exitWithError(err, { format: getFormat() })\n})\n\nconst getClient = () =>\n resolveClient(program.opts().apiKey as string | undefined)\nconst getAgentClient = () =>\n resolveClientOrThrow(program.opts().apiKey as string | undefined)\n\nregisterAgentCommands(program, getAgentClient)\nregisterCrudCommands(program, getClient, getFormat)\nregisterOrderCommands(program, getClient, getFormat)\nregisterReturnCommands(program, getClient, getFormat)\nregisterCartCommands(program, getClient, getFormat)\nregisterStockCommands(program, getClient, getFormat)\nregisterTransactionCommands(program, getClient, getFormat)\nregisterSchemaCommands(program, getClient, getFormat)\nregisterFeatureCommands(program, getClient, getFormat)\nregisterMcpCommands(program)\nregisterAuthCommands(program)\n\nprogram.parse()\n","import {\n CollectionClient,\n ServerCommerceClient,\n TenantIntrospectionApi,\n type TenantIntrospectionClient,\n} from '@01.software/sdk/server'\nimport { loadCredentials, loadLocalCredentials } from './credentials.js'\nimport { exitWithError } from './output.js'\nimport { t } from './i18n.js'\nimport type { AdminError } from './admin-error.js'\n\nexport interface ResolvedClient {\n collections: CollectionClient\n commerce: ServerCommerceClient\n tenant: TenantIntrospectionClient\n publishableKey: string\n secretKey: string\n}\n\ninterface ResolvedCredentials {\n publishableKey: string\n secretKey: string\n}\n\n/**\n * Accepted opaque bearer token prefixes.\n * - `sk01_` = tenant-level API key (created in Console > Settings > API Keys)\n * - `pat01_` = user-level Personal Access Token\n * Hex HMAC secrets from the pre-2026-04 auth system are rejected.\n */\nfunction isValidBearerToken(secret: string): boolean {\n return secret.startsWith('sk01_') || secret.startsWith('pat01_')\n}\n\nfunction credentialError(detail: Record<string, unknown>): AdminError {\n return {\n type: 'permission',\n code: 'credential_invalid',\n detail,\n }\n}\n\n/**\n * Resolve credentials in priority order:\n * 1. `--api-key <token>` flag (overrides secretKey only; publishableKey still\n * comes from env/credentials)\n * 2. `SOFTWARE_PUBLISHABLE_KEY` + `SOFTWARE_SECRET_KEY` env vars\n * 3. Local project credentials (`./01software/credentials.json`)\n * 4. Global user credentials (`~/.01software/credentials.json`)\n */\nfunction resolveClientCredentials(apiKeyFlag?: string): ResolvedCredentials {\n let publishableKey: string | undefined = process.env.SOFTWARE_PUBLISHABLE_KEY\n let secretKey: string | undefined =\n apiKeyFlag ?? process.env.SOFTWARE_SECRET_KEY\n\n if (!publishableKey || !secretKey) {\n const local = loadLocalCredentials()\n if (local) {\n publishableKey = publishableKey ?? local.publishableKey\n secretKey = secretKey ?? local.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n const stored = loadCredentials()\n if (stored) {\n publishableKey = publishableKey ?? stored.publishableKey\n secretKey = secretKey ?? stored.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n throw credentialError({\n message: t('AuthenticationRequired'),\n steps: [\n t('RunLoginToAuthenticate'),\n t('PassApiKey'),\n t('SetEnvVars'),\n ],\n })\n }\n\n if (!isValidBearerToken(secretKey)) {\n throw credentialError({\n message: t('InvalidApiKeyFormat'),\n suggestion: t('RetiredHexCredentialsRejected'),\n })\n }\n\n return { publishableKey, secretKey }\n}\n\nexport function resolveClientOrThrow(apiKeyFlag?: string): ResolvedClient {\n const { publishableKey, secretKey } = resolveClientCredentials(apiKeyFlag)\n const serverOptions = { publishableKey, secretKey }\n\n return {\n collections: new CollectionClient(\n publishableKey,\n secretKey,\n undefined,\n undefined,\n undefined,\n ),\n commerce: new ServerCommerceClient(serverOptions),\n tenant: new TenantIntrospectionApi(serverOptions),\n publishableKey,\n secretKey,\n }\n}\n\nexport function resolveClient(apiKeyFlag?: string): ResolvedClient {\n try {\n return resolveClientOrThrow(apiKeyFlag)\n } catch (error) {\n exitWithError(error)\n }\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n appendFileSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nexport interface StoredCredentials {\n publishableKey: string\n /** Opaque bearer token — tenant API key (sk01_...) or PAT (pat01_...) */\n secretKey: string\n tenantId?: string\n tenantName: string\n storedAt: string\n}\n\nexport interface TenantInfo {\n id: string\n name: string\n}\n\nconst DIR_NAME = '.01software'\nconst FILE_NAME = 'credentials.json'\nconst TENANTS_FILE = 'tenants.json'\n\n// ---------------------------------------------------------------------------\n// Global credentials (~/.01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getCredentialsPath(): string {\n return join(homedir(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getCredentialsPath())\n}\n\nexport function saveCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function deleteCredentials(): boolean {\n const filePath = getCredentialsPath()\n if (!existsSync(filePath)) return false\n\n unlinkSync(filePath)\n return true\n}\n\n// ---------------------------------------------------------------------------\n// Local credentials (./01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getLocalCredentialsPath(): string {\n return join(process.cwd(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadLocalCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getLocalCredentialsPath())\n}\n\nexport function saveLocalCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(process.cwd(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getLocalCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n\n // Ensure .01software/ is in .gitignore\n ensureGitignore()\n}\n\n// ---------------------------------------------------------------------------\n// Tenant list cache (~/.01software/tenants.json)\n// ---------------------------------------------------------------------------\n\nexport function saveTenantList(tenants: TenantInfo[]): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n writeFileSync(filePath, JSON.stringify(tenants, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function loadTenantList(): TenantInfo[] | null {\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (!Array.isArray(data)) return null\n const valid = data.filter(\n (t): t is TenantInfo =>\n typeof t?.id === 'string' && typeof t?.name === 'string',\n )\n return valid.length > 0 ? valid : null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction loadCredentialsFrom(filePath: string): StoredCredentials | null {\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw) as StoredCredentials\n if (!data.publishableKey || !data.secretKey) return null\n return data\n } catch {\n return null\n }\n}\n\nfunction ensureGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore')\n const entry = '.01software/'\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.includes(entry)) return\n appendFileSync(gitignorePath, `\\n${entry}\\n`, 'utf-8')\n } else {\n writeFileSync(gitignorePath, `${entry}\\n`, 'utf-8')\n }\n}\n","import pc from 'picocolors'\nimport {\n type AdminError,\n classifyError,\n adminErrorExitCode,\n} from './admin-error.js'\nimport { CLI_I18N_KO, t } from './i18n.js'\n\n// Build a Set of valid i18n keys for fast lookup when localizing AdminError\n// codes. Reused below to choose between localized and fallback rendering.\nconst CLI_I18N_KEYS: readonly string[] = Object.keys(CLI_I18N_KO)\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n\nexport function printTable(data: unknown): void {\n if (Array.isArray(data)) {\n if (data.length === 0) {\n console.log(pc.dim(t('Empty')))\n return\n }\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map((k) =>\n Math.max(\n k.length,\n ...data.map(\n (row) => String((row as Record<string, unknown>)[k] ?? '').length,\n ),\n ),\n )\n\n // Header\n console.log(keys.map((k, i) => k.padEnd(widths[i]!)).join(' '))\n console.log(keys.map((_, i) => '-'.repeat(widths[i]!)).join(' '))\n\n // Rows\n for (const row of data) {\n console.log(\n keys\n .map((k, i) =>\n String((row as Record<string, unknown>)[k] ?? '').padEnd(\n widths[i]!,\n ),\n )\n .join(' '),\n )\n }\n } else if (data && typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKey = Math.max(...entries.map(([k]) => k.length))\n for (const [key, value] of entries) {\n const display =\n typeof value === 'object' ? JSON.stringify(value) : String(value)\n console.log(`${pc.bold(key.padEnd(maxKey))} ${display}`)\n }\n } else {\n console.log(String(data))\n }\n}\n\nfunction printNdjson(data: unknown): void {\n if (Array.isArray(data)) {\n data.forEach((item) => console.log(JSON.stringify(item)))\n } else if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const { docs, ...meta } = data as {\n docs: unknown[]\n [key: string]: unknown\n }\n ;(docs as unknown[]).forEach((doc) => console.log(JSON.stringify(doc)))\n if (Object.keys(meta).length > 0)\n console.log(JSON.stringify({ _meta: meta }))\n } else {\n console.log(JSON.stringify(data))\n }\n}\n\nexport function printResult(data: unknown, format: string): void {\n if (format === 'ndjson') {\n printNdjson(data)\n } else if (format === 'table') {\n // For find responses with docs array, print the docs as table\n if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const resp = data as {\n docs: unknown[]\n totalDocs: number\n page: number\n totalPages: number\n }\n printTable(resp.docs)\n console.log(\n pc.dim(\n `\\n${t('Total', { n: resp.totalDocs })} | ${t('PageOf', {\n page: resp.page,\n total: resp.totalPages,\n })}`,\n ),\n )\n return\n }\n printTable(data)\n } else {\n printJson(data)\n }\n}\n\n/**\n * Map an unknown error → CLI exit code per `docs/packages/cli-exit-codes.md`.\n *\n * Routes through `classifyError()` (the AdminError discriminated union is\n * the canonical source). The SDK-error-name + HTTP-status heuristic lives\n * inside `classifyError` so existing thrown values keep their mapping.\n * The `unknown` code → exit 1 fallback is encoded in\n * `adminErrorExitCode` itself.\n */\nexport function getExitCode(error: unknown): number {\n return adminErrorExitCode(classifyError(error))\n}\n\nexport interface ErrorPrintOptions {\n format?: string\n}\n\n/**\n * Resolve the active output format. The entry point (`index.ts`) sets\n * `process.env.OUTPUT_FORMAT` from `--format` / fallback so command bodies\n * can call `exitWithError(e)` without threading the format through every\n * call site. Explicit `options.format` always wins.\n */\nfunction resolveFormat(options: ErrorPrintOptions): string {\n return options.format ?? process.env.OUTPUT_FORMAT ?? 'json'\n}\n\n/**\n * Render an error to the user. With `--format json` (or\n * `OUTPUT_FORMAT=json`), serialize the AdminError discriminated union to\n * stdout per the contract in `docs/packages/cli-exit-codes.md`. Otherwise\n * print a localized one-line message + supporting metadata to stderr.\n */\nexport function printError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): void {\n const adminError = classifyError(error)\n\n // Per docs/packages/cli-exit-codes.md: ALWAYS emit a one-line human\n // message on stderr before exiting non-zero. Under `--format json` the\n // AdminError JSON is ALSO serialized to stdout so scripts can parse it.\n const knownKey = CLI_I18N_KEYS.includes(adminError.code)\n ? (adminError.code as Parameters<typeof t>[0])\n : null\n const localized = knownKey ? t(knownKey) : null\n const rawErr =\n error && typeof error === 'object'\n ? (error as Record<string, unknown>)\n : null\n const rawMessage =\n rawErr && typeof rawErr.message === 'string' ? rawErr.message : ''\n const stringErr = typeof error === 'string' ? error : ''\n const detailMessage =\n rawErr &&\n rawErr.detail &&\n typeof rawErr.detail === 'object' &&\n typeof (rawErr.detail as Record<string, unknown>).message === 'string'\n ? String((rawErr.detail as Record<string, unknown>).message)\n : ''\n // Headline: prefer the most specific human-readable text on hand —\n // raw `message` (most common SDK shape), then a string-error directly,\n // then `detail.message`, then the localized AdminError-code translation,\n // then the bare code.\n const headline =\n rawMessage || stringErr || detailMessage || localized || adminError.code\n\n console.error(pc.red(`Error: ${headline}`))\n // Surface the raw `code`/`status` (when present and distinct) so callers\n // who throw SDK errors with proprietary codes don't lose them in the\n // human-readable rendering. The AdminError type/code is always emitted\n // — that's the canonical contract.\n if (\n rawErr &&\n typeof rawErr.code === 'string' &&\n rawErr.code !== adminError.code\n ) {\n console.error(pc.dim(`Code: ${rawErr.code}`))\n } else {\n console.error(pc.dim(`Code: ${adminError.code}`))\n }\n if (rawErr && typeof rawErr.status === 'number') {\n console.error(pc.dim(`Status: ${rawErr.status}`))\n }\n console.error(pc.dim(`Type: ${adminError.type}`))\n\n if (\n adminError.type === 'degraded' &&\n typeof adminError.retryAfter === 'number'\n ) {\n console.error(pc.yellow(`Retry after: ${adminError.retryAfter}s`))\n }\n if (rawErr && typeof rawErr.suggestion === 'string') {\n console.error(pc.yellow(rawErr.suggestion))\n }\n\n if (resolveFormat(options) === 'json') {\n console.log(JSON.stringify(adminError))\n }\n}\n\nexport function exitWithError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): never {\n printError(error, options)\n process.exit(getExitCode(error))\n}\n","// Mirror of `apps/console/src/lib/admin-error.ts`.\n//\n// Kept as a hand-mirrored copy rather than an import because the CLI ships\n// to npm as a standalone package that cannot reach into apps/console at\n// runtime. Drift is locked by `apps/console/scripts/check-i18n-parity.ts`,\n// which asserts every code listed in the console source has a matching CLI\n// translation entry.\n\nexport type ValidationCode = string\n\nexport type PermissionCode =\n | 'tenant_mismatch'\n | 'account_suspended'\n | 'feature_disabled'\n | 'role_denied'\n | 'credential_invalid'\n | 'pat_tenant_unpinned'\n | 'publishable_key_mismatch'\n | 'scope_denied'\n\nexport type DegradedCode =\n | 'redis_unavailable'\n | 'provider_unavailable'\n | 'rate_limited'\n\nexport type NetworkCode = 'upstream_timeout' | 'upstream_5xx' | 'dns_failure'\n\nexport type AdminErrorCode =\n | PermissionCode\n | DegradedCode\n | NetworkCode\n | ValidationCode\n\nexport type AdminError =\n | {\n type: 'validation'\n code: ValidationCode\n field?: string\n detail?: Record<string, unknown>\n }\n | {\n type: 'permission'\n code: PermissionCode\n detail?: Record<string, unknown>\n }\n | {\n type: 'degraded'\n code: DegradedCode\n retryAfter?: number\n detail?: Record<string, unknown>\n }\n | {\n type: 'network'\n code: NetworkCode\n detail?: Record<string, unknown>\n }\n\nconst PERMISSION_CODES: readonly PermissionCode[] = [\n 'tenant_mismatch',\n 'account_suspended',\n 'feature_disabled',\n 'role_denied',\n 'credential_invalid',\n 'pat_tenant_unpinned',\n 'publishable_key_mismatch',\n 'scope_denied',\n]\n\nconst DEGRADED_CODES: readonly DegradedCode[] = [\n 'redis_unavailable',\n 'provider_unavailable',\n 'rate_limited',\n]\n\nconst NETWORK_CODES: readonly NetworkCode[] = [\n 'upstream_timeout',\n 'upstream_5xx',\n 'dns_failure',\n]\n\nfunction isPermissionCode(code: string): code is PermissionCode {\n return (PERMISSION_CODES as readonly string[]).includes(code)\n}\n\nfunction isDegradedCode(code: string): code is DegradedCode {\n return (DEGRADED_CODES as readonly string[]).includes(code)\n}\n\nfunction isNetworkCode(code: string): code is NetworkCode {\n return (NETWORK_CODES as readonly string[]).includes(code)\n}\n\n/**\n * Classify an unknown thrown / rejected value into the AdminError union.\n * Heuristic mirrors `apps/console/src/lib/admin-error.ts:classifyError`:\n * 1. Object with `code: string` matching a known literal → typed bucket.\n * 2. Object with explicit `type` matching a union tag → trusted as-is.\n * 3. Anything else → `validation` / `unknown`.\n *\n * Additional heuristic (CLI-only): SDK error names + HTTP status fall\n * through to a sensible AdminError so existing thrown values continue to\n * classify even before callers migrate to literal codes.\n */\nexport function classifyError(err: unknown): AdminError {\n if (err && typeof err === 'object') {\n const obj = err as Record<string, unknown>\n\n if (typeof obj.code === 'string') {\n const code = obj.code\n if (isPermissionCode(code)) {\n return { type: 'permission', code }\n }\n if (code === 'auth_error' || code === 'permission_error') {\n return { type: 'permission', code: 'credential_invalid' }\n }\n if (isDegradedCode(code)) {\n const out: AdminError = { type: 'degraded', code }\n if (typeof obj.retryAfter === 'number') {\n out.retryAfter = obj.retryAfter\n }\n return out\n }\n if (isNetworkCode(code)) {\n return { type: 'network', code }\n }\n }\n\n if (obj.type === 'validation' && typeof obj.code === 'string') {\n const out: AdminError = { type: 'validation', code: obj.code }\n if (typeof obj.field === 'string') out.field = obj.field\n if (obj.detail && typeof obj.detail === 'object') {\n out.detail = obj.detail as Record<string, unknown>\n }\n return out\n }\n\n // CLI fallback: SDK error names + HTTP status.\n const name = typeof obj.name === 'string' ? obj.name : undefined\n const status = typeof obj.status === 'number' ? obj.status : undefined\n if (\n name === 'ConfigError' ||\n name === 'AuthError' ||\n name === 'PermissionError' ||\n status === 401 ||\n status === 403\n ) {\n return { type: 'permission', code: 'credential_invalid' }\n }\n if (\n name === 'NetworkError' ||\n name === 'TimeoutError' ||\n status === 408 ||\n status === 503\n ) {\n return { type: 'network', code: 'upstream_timeout' }\n }\n if (name === 'GoneError' || status === 404) {\n return {\n type: 'validation',\n code: 'not_found',\n detail:\n typeof obj.message === 'string'\n ? { message: obj.message }\n : undefined,\n }\n }\n if (name === 'UsageLimitError' || status === 429) {\n const out: AdminError = { type: 'degraded', code: 'rate_limited' }\n if (typeof obj.retryAfter === 'number') out.retryAfter = obj.retryAfter\n return out\n }\n if (name === 'ValidationError' || status === 400 || status === 422) {\n return {\n type: 'validation',\n code: 'invalid_argument',\n detail:\n typeof obj.message === 'string'\n ? { message: obj.message }\n : undefined,\n }\n }\n }\n\n return {\n type: 'validation',\n code: 'unknown',\n detail: { message: err instanceof Error ? err.message : String(err) },\n }\n}\n\n/**\n * Map AdminError → CLI exit code per `docs/packages/cli-exit-codes.md`.\n * permission → 2\n * validation → 3 (`not_found` → 5; `unknown` → 1)\n * network → 4\n * degraded → 6 (`rate_limited`; provider_unavailable /\n * redis_unavailable keep 4 as the canonical \"upstream\n * failure\")\n *\n * Exit code 1 is reserved for the \"we don't know\" bucket (matching the\n * shell-script contract). The `unknown` validation code is the explicit\n * channel for that — `classifyError` routes anything it cannot identify\n * here.\n */\nexport function adminErrorExitCode(err: AdminError): number {\n if (err.code === 'unknown') return 1\n switch (err.type) {\n case 'permission':\n return 2\n case 'validation':\n return err.code === 'not_found' ? 5 : 3\n case 'network':\n return 4\n case 'degraded':\n return err.code === 'rate_limited' ? 6 : 4\n }\n}\n\nexport const ADMIN_ERROR_CODES = {\n permission: PERMISSION_CODES,\n degraded: DEGRADED_CODES,\n network: NETWORK_CODES,\n} as const\n","// CLI i18n table — mirrors `apps/console/src/lib/i18n/admin.ts` AdminError\n// code coverage so a single check (`apps/console/scripts/check-i18n-parity.ts`)\n// can verify the CLI carries every code with both KO and EN translations.\n//\n// Locale resolution:\n// 1. CLI `--lang <ko|en>` (resolved by the entry point and exported via\n// `setLocale`).\n// 2. `LANG` / `LC_ALL` environment variables — anything starting with\n// `ko` (`ko_KR.UTF-8`, `ko-KR`, …) → ko; else en.\n// 3. Default `en`.\n\nexport const CLI_I18N_KO = {\n // CLI-surface microcopy\n AuthenticationRequired: '인증이 필요합니다',\n RunLoginToAuthenticate: '`01 login` 명령으로 브라우저 인증을 진행하거나,',\n PassApiKey: '`--api-key <token>` 옵션을 전달하거나,',\n SetEnvVars:\n '`SOFTWARE_PUBLISHABLE_KEY` / `SOFTWARE_SECRET_KEY` 환경 변수를 설정하세요.',\n InvalidApiKeyFormat:\n 'API 키 형식이 올바르지 않습니다. `sk01_` 또는 `pat01_` 토큰이 필요합니다.',\n RetiredHexCredentialsRejected:\n '이전 hex 자격 증명은 더 이상 허용되지 않습니다 — `01 login`으로 다시 인증하세요.',\n InvalidJsonObject: '`--{{label}}` 인자는 JSON 객체여야 합니다.',\n InvalidJsonArray: '`--{{label}}` 인자는 JSON 배열이어야 합니다.',\n InvalidJsonValue: '`--{{label}}` 인자의 JSON 형식이 올바르지 않습니다: {{value}}',\n Empty: '(없음)',\n Total: '총 {{n}}개',\n PageOf: '{{page}} / {{total}} 페이지',\n\n // AdminError code translations (mirrors apps/console admin.ts).\n tenant_mismatch: '권한이 없는 테넌트',\n account_suspended: '계정이 정지되었습니다',\n feature_disabled: '이 기능이 비활성화되었습니다',\n role_denied: '권한이 부족합니다',\n credential_invalid: '자격 증명이 유효하지 않습니다',\n pat_tenant_unpinned: 'PAT 토큰의 테넌트가 고정되지 않았습니다',\n publishable_key_mismatch: '공개 키가 일치하지 않습니다',\n scope_denied: '범위 권한이 없습니다',\n redis_unavailable: '캐시가 일시적으로 사용 불가합니다',\n provider_unavailable: '외부 공급자가 응답하지 않습니다',\n rate_limited: '요청이 너무 많습니다 — 잠시 후 다시 시도하세요',\n upstream_timeout: '응답 시간이 초과되었습니다',\n upstream_5xx: '외부 서비스 오류',\n dns_failure: '네트워크 연결 오류',\n not_found: '리소스를 찾을 수 없습니다',\n invalid_argument: '인자가 올바르지 않습니다',\n unknown: '알 수 없는 오류',\n} as const\n\nexport type CliI18nKey = keyof typeof CLI_I18N_KO\n\nexport const CLI_I18N_EN: Record<CliI18nKey, string> = {\n AuthenticationRequired: 'Authentication required',\n RunLoginToAuthenticate:\n 'Run `01 login` to authenticate via browser, or',\n PassApiKey: 'pass `--api-key <token>`, or',\n SetEnvVars:\n 'set `SOFTWARE_PUBLISHABLE_KEY` and `SOFTWARE_SECRET_KEY` environment variables.',\n InvalidApiKeyFormat:\n 'Invalid API key format. Expected `sk01_` or `pat01_` token.',\n RetiredHexCredentialsRejected:\n 'Retired hex credentials are no longer accepted — run `01 login` to re-authenticate.',\n InvalidJsonObject: '--{{label}} must be a JSON object.',\n InvalidJsonArray: '--{{label}} must be a JSON array.',\n InvalidJsonValue: 'Invalid JSON for --{{label}}: {{value}}',\n Empty: '(empty)',\n Total: '{{n}} total',\n PageOf: 'page {{page}}/{{total}}',\n\n tenant_mismatch: 'Tenant access denied',\n account_suspended: 'Your account has been suspended',\n feature_disabled: 'This feature is disabled',\n role_denied: 'Insufficient role permissions',\n credential_invalid: 'Invalid credentials',\n pat_tenant_unpinned: 'PAT token tenant is not pinned',\n publishable_key_mismatch: 'Publishable key mismatch',\n scope_denied: 'Scope permission denied',\n redis_unavailable: 'Cache temporarily unavailable',\n provider_unavailable: 'Upstream provider unavailable',\n rate_limited: 'Too many requests — please try again shortly',\n upstream_timeout: 'Upstream request timed out',\n upstream_5xx: 'Upstream service error',\n dns_failure: 'Network connection error',\n not_found: 'Resource not found',\n invalid_argument: 'Invalid argument',\n unknown: 'Unknown error',\n}\n\nexport type Locale = 'ko' | 'en'\n\nlet activeLocale: Locale | null = null\n\nexport function detectLocale(): Locale {\n if (activeLocale) return activeLocale\n const raw =\n process.env.LC_ALL ?? process.env.LANG ?? process.env.LANGUAGE ?? ''\n return raw.toLowerCase().startsWith('ko') ? 'ko' : 'en'\n}\n\nexport function setLocale(locale: Locale | null | undefined): void {\n activeLocale = locale ?? null\n}\n\nexport function t(\n key: CliI18nKey,\n vars?: Record<string, string | number>,\n): string {\n const table = detectLocale() === 'ko' ? CLI_I18N_KO : CLI_I18N_EN\n let s: string = table[key]\n if (vars) {\n for (const [k, v] of Object.entries(vars)) {\n // Use a global regex (escape user-supplied key) instead of\n // String.prototype.replaceAll so we keep working on tsconfig\n // targets older than ES2021. Keys are statically declared above so\n // metacharacter escaping is defense-in-depth.\n const escaped = k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n s = s.replace(new RegExp(`\\\\{\\\\{${escaped}\\\\}\\\\}`, 'g'), String(v))\n }\n }\n return s\n}\n","import { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ApiQueryOptions } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { parseSelect, validateCollection } from '../lib/collections.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson } from '../lib/parse.js'\n\nfunction readFileAsBlob(filePath: string): { blob: Blob; filename: string } {\n const buffer = readFileSync(filePath)\n return { blob: new Blob([buffer]), filename: basename(filePath) }\n}\n\nexport function registerCrudCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n program\n .command('query <collection>')\n .description('Query documents from a collection')\n .option('--where <json>', 'Filter conditions (JSON)')\n .option('--limit <n>', 'Max results', (v: string) => parseInt(v, 10))\n .option('--page <n>', 'Page number', (v: string) => parseInt(v, 10))\n .option('--sort <field>', 'Sort field (prefix with - for descending)')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.where) options.where = parseJson(opts.where, 'where')\n if (opts.limit) options.limit = opts.limit\n if (opts.page) options.page = opts.page\n if (opts.sort) options.sort = opts.sort\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .find(options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('get <collection> <id>')\n .description('Get a document by ID')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .findById(id, options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('create <collection>')\n .description('Create a new document')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'create',\n collection: col,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .create(data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update <collection> <id>')\n .description('Update a document by ID')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update',\n collection: col,\n id,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .update(id, data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete <collection> <id>')\n .description('Delete a document by ID')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete',\n collection: col,\n id,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .remove(id)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update-many <collection>')\n .description('Update multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .requiredOption('--data <json>', 'Update data (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update-many',\n collection: col,\n where,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .updateMany(where, data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete-many <collection>')\n .description('Delete multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete-many',\n collection: col,\n where,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .removeMany(where)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { COLLECTIONS } from '@01.software/sdk'\n\nexport type CliCollection = (typeof COLLECTIONS)[number]\n\nexport function validateCollection(name: string): CliCollection {\n if ((COLLECTIONS as readonly string[]).includes(name)) {\n return name as CliCollection\n }\n\n const normalized = name.replace(/-/g, '').toLowerCase()\n const suggestions = (COLLECTIONS as readonly string[])\n .filter((collection) => {\n const candidate = collection.replace(/-/g, '').toLowerCase()\n return (\n candidate.startsWith(normalized) ||\n normalized.startsWith(candidate) ||\n (normalized.length >= 3 && candidate.includes(normalized))\n )\n })\n .slice(0, 5)\n\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 --help\" for available collections.'\n\n throw new Error(`Unknown collection \"${name}\". ${hint}`)\n}\n\nexport function parseSelect(input: string): Record<string, boolean> {\n return Object.fromEntries(\n input\n .split(',')\n .map((field) => field.trim())\n .map((field) => [field, true]),\n )\n}\n","import { exitWithError } from './output.js'\nimport { t } from './i18n.js'\nimport type { z } from 'zod'\n\n/**\n * Throw an AdminError-shaped object so `exitWithError` can render it correctly\n * under `--format json` and exit with code 3 (validation). The `code` literal\n * `invalid_argument` is already in the validation bucket per `admin-error.ts`.\n */\nfunction failArg(\n label: string,\n value: string,\n expectedKind: 'object' | 'array' | 'value',\n): never {\n const message =\n expectedKind === 'object'\n ? t('InvalidJsonObject', { label })\n : expectedKind === 'array'\n ? t('InvalidJsonArray', { label })\n : t('InvalidJsonValue', { label, value })\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n // `message` is read by `printError` for the stderr headline so the\n // user sees the label/value in the one-line summary; `detail` carries\n // the structured fields for `--format json` consumers.\n message,\n detail: { message, value, field: label },\n })\n}\n\nfunction stringifyValue(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatSchemaIssues(\n label: string,\n issues: readonly { path: readonly string[]; message: string }[],\n): string {\n return issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : label\n return `${path}: ${issue.message}`\n })\n .join('; ')\n}\n\nexport function parseWithSchema<T>(\n value: unknown,\n label: string,\n schema: z.ZodType<T>,\n): T {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n\n const issues = parsed.error.issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n }))\n const message = `Invalid value for --${label}: ${formatSchemaIssues(label, issues)}`\n\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n message,\n detail: {\n message,\n value: stringifyValue(value),\n field: label,\n issues,\n },\n })\n}\n\nexport function parseJson(\n value: string,\n label: string,\n options: { format?: string } = {},\n): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return failArg(label, value, 'object')\n }\n void options\n return parsed as Record<string, unknown>\n}\n\nexport function parseJsonArray(\n value: string,\n label: string,\n options: { format?: string } = {},\n): unknown[] {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (!Array.isArray(parsed)) {\n return failArg(label, value, 'array')\n }\n void options\n return parsed\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson, parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst customerSnapshotSchema = z\n .object({\n email: z.string().email('Invalid email format'),\n name: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst shippingAddressSchema = z\n .object({\n postalCode: z.string().optional(),\n address: z.string().optional(),\n detailAddress: z.string().optional(),\n deliveryMessage: z.string().optional(),\n recipientName: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst orderItemSchema = z\n .object({\n product: idSchema,\n variant: idSchema,\n option: idSchema,\n quantity: z.number().int().positive('quantity must be a positive integer'),\n unitPrice: z.number().optional(),\n totalPrice: z.number().optional(),\n })\n .strict()\n\nconst orderItemsSchema = z\n .array(orderItemSchema)\n .min(1, 'At least one order item is required')\n .max(100, 'Maximum 100 items per order')\n\nconst orderStatusSchema = z.enum([\n 'pending',\n 'paid',\n 'failed',\n 'canceled',\n 'preparing',\n 'shipped',\n 'delivered',\n 'confirmed',\n])\n\nconst fulfillmentItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n })\n .strict(),\n )\n .min(1, 'At least one fulfillment item is required')\n .max(100, 'Maximum 100 items per fulfillment')\n\nexport function registerOrderCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const order = program.command('order').description('Order management')\n\n order\n .command('create')\n .description('Create a new order')\n .option('--payment-id <id>', 'Payment ID')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--email <email>', 'Customer email')\n .option('--customer <id>', 'Customer ID')\n .option('--name <name>', 'Customer name')\n .option('--phone <phone>', 'Customer phone')\n .requiredOption('--shipping-address <json>', 'Shipping address (JSON)')\n .requiredOption('--products <json>', 'Order products array (JSON)')\n .requiredOption('--total-amount <n>', 'Total amount', parseFloat)\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const shippingAddress = parseWithSchema(\n parseJson(opts.shippingAddress, 'shipping-address'),\n 'shipping-address',\n shippingAddressSchema,\n )\n const orderItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n orderItemsSchema,\n )\n const totalAmount = parseWithSchema(\n opts.totalAmount,\n 'total-amount',\n z.number().nonnegative('totalAmount must be non-negative'),\n )\n const data = {\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot: {\n email: opts.email,\n name: opts.name,\n phone: opts.phone,\n },\n customer: opts.customer,\n shippingAddress,\n orderItems,\n totalAmount,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.create({\n ...data,\n orderItems: orderItems as Parameters<\n typeof client.commerce.orders.create\n >[0]['orderItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('get <orderNumber>')\n .description('Get an order by order number')\n .action(async (orderNumber: string) => {\n try {\n const client = getClient()\n const { docs: [order] } = await client.collections.from('orders').find({ where: { orderNumber: { equals: orderNumber } }, limit: 1, depth: 1 })\n if (!order) throw new Error('Order not found')\n printResult(order, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('update <orderNumber>')\n .description('Update order status')\n .requiredOption('--status <status>', 'New status')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', orderStatusSchema)\n const data = { orderNumber, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.update(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('checkout')\n .description('Convert a cart to an order')\n .requiredOption('--cart-id <id>', 'Cart ID')\n .option('--payment-id <id>', 'Payment ID (optional for free orders)')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--customer <json>', 'Customer snapshot (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const customerSnapshot = parseWithSchema(\n parseJson(opts.customer, 'customer'),\n 'customer',\n customerSnapshotSchema,\n )\n const data = {\n cartId: opts.cartId,\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order checkout', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.checkout({\n ...data,\n customerSnapshot: customerSnapshot as Parameters<\n typeof client.commerce.orders.checkout\n >[0]['customerSnapshot'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('fulfill <orderNumber>')\n .description('Create a fulfillment for an order')\n .requiredOption('--items <json>', 'Fulfillment items array (JSON)')\n .option('--carrier <name>', 'Shipping carrier')\n .option('--tracking-number <num>', 'Tracking number')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const items = parseWithSchema(\n parseJsonArray(opts.items, 'items'),\n 'items',\n fulfillmentItemsSchema,\n )\n const data = {\n orderNumber,\n items,\n carrier: opts.carrier,\n trackingNumber: opts.trackingNumber,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order fulfill', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createFulfillment({\n ...data,\n items: items as Parameters<\n typeof client.commerce.orders.createFulfillment\n >[0]['items'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst returnReasonSchema = z\n .enum(['change_of_mind', 'defective', 'wrong_delivery', 'damaged', 'other'])\n .optional()\n\nconst returnItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n restockAction: z\n .enum(['return_to_stock', 'discard'])\n .default('return_to_stock'),\n })\n .strict(),\n )\n .min(1, 'At least one return item is required')\n .max(100, 'Too many return items')\n\nconst returnStatusSchema = z.enum([\n 'processing',\n 'approved',\n 'rejected',\n 'completed',\n])\n\nconst refundAmountSchema = z\n .number()\n .nonnegative('refundAmount must be non-negative')\n\nexport function registerReturnCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const ret = program.command('return').description('Return management')\n\n ret\n .command('create <orderNumber>')\n .description('Create a return request')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .option(\n '--reason <reason>',\n 'Return reason (change_of_mind, defective, wrong_delivery, damaged, other)',\n )\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n reason,\n reasonDetail: opts.reasonDetail,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createReturn({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.createReturn\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('update <returnId>')\n .description('Update return status')\n .requiredOption(\n '--status <status>',\n 'New status (processing, approved, rejected, completed)',\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (returnId: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', returnStatusSchema)\n const data = { returnId, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateReturn(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('refund <orderNumber>')\n .description('Return with refund')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .requiredOption('--payment-id <id>', 'Payment ID')\n .option('--reason <reason>', 'Return reason')\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--refund-receipt-url <url>', 'Refund receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n pgPaymentId: opts.paymentId,\n reason,\n reasonDetail: opts.reasonDetail,\n refundReceiptUrl: opts.refundReceiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return refund', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.returnWithRefund({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.returnWithRefund\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerCartCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const cart = program.command('cart').description('Cart management')\n\n cart\n .command('add <cartId>')\n .description('Add an item to cart')\n .requiredOption('--product <id>', 'Product ID')\n .requiredOption('--variant <id>', 'Variant ID')\n .requiredOption('--option <id>', 'Option ID')\n .requiredOption('--quantity <n>', 'Quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartId: string, opts) => {\n try {\n const data = {\n cartId,\n product: opts.product,\n variant: opts.variant,\n option: opts.option,\n quantity: opts.quantity,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart add', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.addItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('update <cartItemId>')\n .description('Update cart item quantity')\n .requiredOption('--quantity <n>', 'New quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n const data = { cartItemId, quantity: opts.quantity }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.updateItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('remove <cartItemId>')\n .description('Remove an item from cart')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'cart remove',\n data: { cartItemId },\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.removeItem({ cartItemId })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray } from '../lib/parse.js'\n\nexport function registerStockCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const stock = program.command('stock').description('Stock management')\n\n stock\n .command('check')\n .description('Check stock availability')\n .requiredOption(\n '--items <json>',\n 'Items to check (JSON array of { optionId, quantity })',\n )\n .action(async (opts) => {\n try {\n const client = getClient()\n const items = parseJsonArray(opts.items, 'items') as Parameters<\n typeof client.commerce.product.stockCheck\n >[0]['items']\n const result = await client.commerce.product.stockCheck({ items })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerTransactionCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const tx = program\n .command('transaction')\n .description('Transaction management')\n\n tx.command('update')\n .description('Update transaction status')\n .requiredOption('--payment-id <id>', 'Payment ID')\n .requiredOption(\n '--status <status>',\n 'New status (pending, paid, failed, canceled)',\n )\n .requiredOption('--payment-method <method>', 'Payment method')\n .requiredOption('--receipt-url <url>', 'Receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const data = {\n pgPaymentId: opts.paymentId,\n status: opts.status,\n paymentMethod: opts.paymentMethod,\n receiptUrl: opts.receiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'transaction update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateTransaction(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { randomBytes } from 'node:crypto'\nimport { createServer } from 'node:http'\nimport { execFile, exec } from 'node:child_process'\nimport { platform } from 'node:os'\nimport { URL } from 'node:url'\nimport type { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n loadCredentials,\n saveCredentials,\n deleteCredentials,\n getCredentialsPath,\n loadLocalCredentials,\n saveLocalCredentials,\n getLocalCredentialsPath,\n loadTenantList,\n saveTenantList,\n type TenantInfo,\n} from '../lib/credentials.js'\n\nconst WEB_URL = process.env.SOFTWARE_WEB_URL || 'https://01.software'\nconst TIMEOUT_MS = 3 * 60 * 1000 // 3 minutes\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nfunction openBrowser(url: string): void {\n const os = platform()\n\n const onError = () => {\n console.log(\n pc.yellow(\n `Could not open browser automatically. Open this URL manually:\\n${url}`,\n ),\n )\n }\n\n if (os === 'win32') {\n exec(`start \"\" \"${url}\"`, (err) => {\n if (err) onError()\n })\n } else {\n const cmd = os === 'darwin' ? 'open' : 'xdg-open'\n execFile(cmd, [url], (err) => {\n if (err) onError()\n })\n }\n}\n\nconst PAGE_STYLE = `*{margin:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;display:flex;justify-content:center;align-items:center;min-height:100vh;background:#fff;color:#252525}\n@media(prefers-color-scheme:dark){body{background:#252525;color:#f5f5f5}}\n.card{text-align:center;padding:2rem 2.5rem;border-radius:10px;max-width:380px;width:100%}\n.icon{width:40px;height:40px;margin:0 auto 1rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1.25rem}\n.icon.ok{background:rgba(0,0,0,.05);color:#252525}\n.icon.err{background:rgba(220,38,38,.08);color:#dc2626}\n@media(prefers-color-scheme:dark){.icon.ok{background:rgba(255,255,255,.08);color:#f5f5f5}}\nh1{font-size:.875rem;font-weight:600;margin-bottom:.375rem}\np{font-size:.75rem;color:#737373;line-height:1.5}`\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon ok\">\\u2713</div><h1>Authenticated</h1><p>You can close this tab and return to the terminal.</p></div></body></html>`\n\nconst ERROR_HTML = (msg: string) => `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login Error</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon err\">!</div><h1>Authentication failed</h1><p>${escapeHtml(msg)}</p></div></body></html>`\n\ninterface ExchangeResponse {\n publishableKey: string\n secretKey: string\n tenantName: string\n tenantId: string\n tenants?: TenantInfo[]\n}\n\nasync function exchangeCode(code: string): Promise<ExchangeResponse | null> {\n const url = `${WEB_URL}/api/cli/exchange`\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(\n pc.red(\n `Exchange failed: HTTP ${res.status} from ${url}${body ? ` — ${body.slice(0, 200)}` : ''}`,\n ),\n )\n return null\n }\n const data = (await res.json()) as Partial<ExchangeResponse>\n if (\n typeof data.publishableKey !== 'string' ||\n typeof data.secretKey !== 'string' ||\n typeof data.tenantName !== 'string' ||\n typeof data.tenantId !== 'string'\n ) {\n console.error(pc.red(`Exchange failed: malformed response from ${url}`))\n return null\n }\n return {\n publishableKey: data.publishableKey,\n secretKey: data.secretKey,\n tenantName: data.tenantName,\n tenantId: data.tenantId,\n tenants: Array.isArray(data.tenants)\n ? data.tenants.filter(\n (t): t is TenantInfo =>\n typeof (t as TenantInfo)?.id === 'string' &&\n typeof (t as TenantInfo)?.name === 'string',\n )\n : undefined,\n }\n } catch (err) {\n console.error(\n pc.red(\n `Exchange request to ${url} failed: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n return null\n }\n}\n\n/**\n * Start a local HTTP server that receives the OAuth-style redirect callback\n * from the browser. The browser top-level-navigates to\n * http://127.0.0.1:{port}/callback?code={encryptedCode}&state={state}\n * and the CLI exchanges the opaque code with the web API to receive the\n * actual credentials server-to-server. This path has no CORS or PNA\n * preflight because the browser never issues a subresource fetch.\n */\nfunction startAuthServer(options: {\n state: string\n saveFn: (creds: {\n publishableKey: string\n secretKey: string\n tenantId?: string\n tenantName: string\n }) => void\n}): Promise<{ port: number; cleanup: (exitCode?: number) => void }> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400).end()\n return\n }\n\n const url = new URL(req.url, `http://localhost`)\n\n if (url.pathname !== '/callback' || req.method !== 'GET') {\n res.writeHead(404).end()\n return\n }\n\n const error = url.searchParams.get('error')\n if (error) {\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML(error))\n console.error(pc.red(`Login failed: ${error}`))\n cleanup(2)\n return\n }\n\n const code = url.searchParams.get('code')\n const receivedState = url.searchParams.get('state')\n\n if (!code || !receivedState) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Missing code or state. Start over with \"01 login\".'))\n cleanup(2)\n return\n }\n\n if (receivedState !== options.state) {\n res\n .writeHead(403, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('State mismatch. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: state mismatch.'))\n cleanup(2)\n return\n }\n\n exchangeCode(code).then((creds) => {\n if (!creds) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Invalid or expired code. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: code exchange failed.'))\n cleanup(2)\n return\n }\n\n options.saveFn({\n publishableKey: creds.publishableKey,\n secretKey: creds.secretKey,\n tenantId: creds.tenantId,\n tenantName: creds.tenantName,\n })\n\n if (creds.tenants && creds.tenants.length > 0) {\n saveTenantList(creds.tenants)\n }\n\n console.log(pc.green(`\\nLogged in successfully!`))\n console.log(pc.dim(`Tenant: ${creds.tenantName}`))\n\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(SUCCESS_HTML)\n cleanup(0)\n })\n })\n\n let timeout: ReturnType<typeof setTimeout>\n let completed = false\n\n function cleanup(exitCode = 0) {\n if (completed) return\n completed = true\n clearTimeout(timeout)\n server.closeAllConnections?.()\n server.close(() => process.exit(exitCode))\n }\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address()\n if (!addr || typeof addr === 'string') {\n reject(new Error('Failed to start local server.'))\n return\n }\n\n timeout = setTimeout(() => {\n console.error(\n pc.red('\\nLogin timed out (3 minutes). Please try again.'),\n )\n cleanup(4)\n }, TIMEOUT_MS)\n\n resolve({ port: addr.port, cleanup })\n })\n\n server.on('error', (err) => {\n reject(err)\n })\n })\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command('login')\n .description('Login via browser and store credentials')\n .action(async () => {\n const state = randomBytes(32).toString('hex')\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n saveCredentials(creds)\n console.log(pc.dim(`Credentials saved to ${getCredentialsPath()}`))\n },\n })\n\n const params = new URLSearchParams({ port: String(port), state })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim('Opening browser for login...'))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n\n program\n .command('logout')\n .description('Remove stored credentials')\n .action(() => {\n const deleted = deleteCredentials()\n if (deleted) {\n console.log(pc.green('Logged out. Credentials removed.'))\n } else {\n console.log(pc.dim('No stored credentials found.'))\n }\n })\n\n program\n .command('whoami')\n .description('Show current authentication status')\n .action(() => {\n // Check local credentials first\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const creds = localCreds || globalCreds\n const isLocal = !!localCreds\n\n if (!creds) {\n console.log(pc.dim('Not logged in. Run \"01 login\" to authenticate.'))\n return\n }\n\n const masked =\n creds.publishableKey.length > 8\n ? creds.publishableKey.slice(0, 4) + '...' + creds.publishableKey.slice(-4)\n : '****'\n\n const scope = isLocal ? pc.cyan(' (local)') : ''\n console.log(`Tenant: ${pc.bold(creds.tenantName)}${scope}`)\n console.log(`Publishable Key: ${pc.dim(masked)}`)\n console.log(`Stored at: ${pc.dim(creds.storedAt)}`)\n console.log(\n `File: ${pc.dim(isLocal ? getLocalCredentialsPath() : getCredentialsPath())}`,\n )\n })\n\n // -------------------------------------------------------------------------\n // tenant subcommands\n // -------------------------------------------------------------------------\n const tenant = program\n .command('tenant')\n .description('Manage tenant switching')\n\n tenant\n .command('list')\n .description('Show cached tenant list')\n .action(() => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.log(pc.dim('No cached tenants. Run \"01 login\" first.'))\n return\n }\n\n // Determine active tenant\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const activeCreds = localCreds || globalCreds\n const activeId = activeCreds?.tenantId\n const activeName = activeCreds?.tenantName\n\n console.log(pc.bold('Cached tenants:\\n'))\n for (const t of tenants) {\n const active = (activeId ? t.id === activeId : t.name === activeName)\n ? pc.green(' *')\n : ''\n console.log(` ${t.name}${active}`)\n }\n console.log()\n if (activeName) {\n const scope = localCreds ? '(local)' : '(global)'\n console.log(pc.dim(`* active ${scope}`))\n }\n })\n\n tenant\n .command('use <name>')\n .description('Switch to a different tenant via browser')\n .option('--local', 'Save credentials locally in the current project')\n .action(async (name: string, opts: { local?: boolean }) => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.error(pc.red('No cached tenants. Run \"01 login\" first.'))\n process.exit(2)\n }\n\n const match = tenants.find(\n (t) => t.name.toLowerCase() === name.toLowerCase(),\n )\n if (!match) {\n console.error(pc.red(`Tenant \"${name}\" not found in cache.`))\n console.error(\n pc.dim(`Available: ${tenants.map((t) => t.name).join(', ')}`),\n )\n process.exit(3)\n }\n\n const state = randomBytes(32).toString('hex')\n const isLocal = !!opts.local\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n if (isLocal) {\n saveLocalCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getLocalCredentialsPath()}`),\n )\n } else {\n saveCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getCredentialsPath()}`),\n )\n }\n },\n })\n\n const params = new URLSearchParams({\n port: String(port),\n state,\n tenantId: match.id,\n })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim(`Switching to tenant \"${match.name}\"...`))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n}\n","import { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerSchemaCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const schema = program\n .command('schema')\n .description('Collection schema introspection')\n\n schema\n .command('list')\n .description('List available collections')\n .action(() => {\n printResult(COLLECTIONS, getFormat())\n })\n\n schema\n .command('show <collection>')\n .description('Show collection field schema')\n .action(async (collection: string) => {\n try {\n if (!(COLLECTIONS as readonly string[]).includes(collection)) {\n const normalized = collection.replace(/-/g, '').toLowerCase()\n const suggestions = (COLLECTIONS as readonly string[])\n .filter((c) => {\n const cn = c.replace(/-/g, '').toLowerCase()\n return (\n cn.startsWith(normalized) ||\n normalized.startsWith(cn) ||\n (normalized.length >= 3 && cn.includes(normalized))\n )\n })\n .slice(0, 5)\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 schema list\" for available collections.'\n throw new Error(`Unknown collection \"${collection}\". ${hint}`)\n }\n const client = getClient()\n const result = await client.tenant.collectionSchema(collection)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { z } from 'zod'\n\nexport const tenantFieldConfigStateSchema = z\n .object({\n hiddenFields: z.array(z.string()),\n isHidden: z.boolean(),\n })\n .strict()\n\nexport const tenantContextQuerySchema = z\n .object({\n counts: z.literal('true').optional(),\n })\n .strict()\n\nexport const tenantContextToolInputSchema = z\n .object({\n includeCounts: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Include per-collection document counts and config status (bypasses cache, slower)',\n ),\n })\n .strict()\n\nexport const tenantContextResponseSchema = z\n .object({\n tenant: z\n .object({\n id: z.string(),\n name: z.string(),\n plan: z.string(),\n planSource: z.string().optional(),\n authoritative: z.boolean().optional(),\n capabilityVersion: z.string().optional(),\n })\n .strict(),\n features: z.array(z.string()),\n collections: z\n .object({\n active: z.array(z.string()),\n inactive: z.array(z.string()),\n })\n .strict(),\n fieldConfigs: z.record(z.string(), tenantFieldConfigStateSchema),\n counts: z.record(z.string(), z.number()).optional(),\n config: z\n .object({\n webhookConfigured: z.boolean(),\n })\n .strict()\n .optional(),\n })\n .strict()\n\nexport const tenantFeatureProgressFeatureSchema = z.enum(['ecommerce'])\n\nexport const tenantFeatureProgressInputSchema = z\n .object({\n feature: tenantFeatureProgressFeatureSchema.describe(\n 'Feature to inspect for tenant implementation readiness',\n ),\n includeEvidence: z\n .boolean()\n .optional()\n .default(false)\n .describe('Include sanitized counts and static surface evidence'),\n })\n .strict()\n\nexport const tenantFeatureProgressStatusSchema = z.enum([\n 'ready',\n 'attention',\n 'blocked',\n])\n\nexport const tenantFeatureProgressItemStateSchema = z.enum([\n 'complete',\n 'incomplete',\n 'blocked',\n 'attention',\n 'optional',\n 'unknown',\n 'manual',\n 'not-applicable',\n])\n\nexport const tenantFeatureProgressSeveritySchema = z.enum([\n 'required',\n 'recommended',\n 'optional',\n])\n\nexport const tenantFeatureProgressEvidenceValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n])\n\nexport const tenantFeatureProgressItemSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n state: tenantFeatureProgressItemStateSchema,\n severity: tenantFeatureProgressSeveritySchema,\n summary: z.string(),\n evidence: z\n .record(z.string(), tenantFeatureProgressEvidenceValueSchema)\n .optional(),\n })\n .strict()\n\nexport const tenantFeatureProgressGroupSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n summary: z.string().optional(),\n items: z.array(tenantFeatureProgressItemSchema),\n })\n .strict()\n\nexport const tenantFeatureProgressResponseSchema = z\n .object({\n schemaVersion: z.literal(1),\n feature: tenantFeatureProgressFeatureSchema,\n status: tenantFeatureProgressStatusSchema,\n generatedAt: z.string(),\n tenant: z\n .object({\n id: z.string(),\n name: z.string(),\n plan: z.string(),\n })\n .strict(),\n capability: z\n .object({\n effectiveFeatures: z.array(z.string()),\n planBlocked: z.array(z.string()),\n closureAdded: z.array(z.string()),\n })\n .strict(),\n summary: z\n .object({\n complete: z.number().int().nonnegative(),\n total: z.number().int().nonnegative(),\n blocking: z.number().int().nonnegative(),\n manual: z.number().int().nonnegative(),\n unknown: z.number().int().nonnegative(),\n })\n .strict(),\n groups: z.array(tenantFeatureProgressGroupSchema),\n })\n .strict()\n\nexport const COLLECTION_SCHEMA_CONTRACT_VERSION = 1\n\nexport const collectionSchemaEndpointParamsSchema = z\n .object({\n collectionSlug: z.string().min(1, 'collectionSlug is required'),\n })\n .strict()\n\nexport function createCollectionSchemaToolInputSchema<\n const T extends readonly [string, ...string[]],\n>(collections: T) {\n return z\n .object({\n collection: z.enum(collections).describe('Collection name (required)'),\n })\n .strict()\n}\n\nexport const collectionFieldOptionSchema = z\n .object({\n label: z.string(),\n value: z.string(),\n })\n .strict()\n\nexport interface CollectionFieldSchema {\n name: string\n path: string\n type: string\n required?: true\n unique?: true\n hasMany?: true\n relationTo?: string | string[]\n options?: Array<{ label: string; value: string }>\n hidden?: true\n systemManaged?: true\n writable?: boolean\n fields?: CollectionFieldSchema[]\n}\n\nexport const collectionFieldSchema: z.ZodType<CollectionFieldSchema> = z.lazy(\n () =>\n z\n .object({\n name: z.string(),\n path: z.string(),\n type: z.string(),\n required: z.literal(true).optional(),\n unique: z.literal(true).optional(),\n hasMany: z.literal(true).optional(),\n relationTo: z.union([z.string(), z.array(z.string())]).optional(),\n options: z.array(collectionFieldOptionSchema).optional(),\n hidden: z.literal(true).optional(),\n systemManaged: z.literal(true).optional(),\n writable: z.boolean().optional(),\n fields: z.array(collectionFieldSchema).optional(),\n })\n .strict(),\n)\n\nexport const collectionSchemaResponseSchema = z\n .object({\n contractVersion: z.literal(COLLECTION_SCHEMA_CONTRACT_VERSION),\n mode: z.literal('effective'),\n collection: z\n .object({\n slug: z.string(),\n timestamps: z.boolean(),\n alwaysActive: z.boolean(),\n feature: z.string().nullable(),\n systemFields: z.array(z.string()),\n visibility: z\n .object({\n collectionHidden: z.boolean(),\n hiddenFields: z.array(z.string()),\n })\n .strict(),\n fields: z.array(collectionFieldSchema),\n })\n .strict(),\n })\n .strict()\n\nexport type TenantFieldConfigState = z.infer<\n typeof tenantFieldConfigStateSchema\n>\nexport type TenantContextQuery = z.input<typeof tenantContextQuerySchema>\nexport type TenantContextToolInput = z.infer<\n typeof tenantContextToolInputSchema\n>\nexport type TenantContextResponse = z.infer<typeof tenantContextResponseSchema>\nexport type TenantFeatureProgressFeature = z.infer<\n typeof tenantFeatureProgressFeatureSchema\n>\nexport type TenantFeatureProgressInput = z.infer<\n typeof tenantFeatureProgressInputSchema\n>\n/**\n * Raw feature-progress request input before schema defaults are applied.\n * `TenantFeatureProgressInput` is the parsed/effective shape.\n */\nexport type TenantFeatureProgressRequestInput = z.input<\n typeof tenantFeatureProgressInputSchema\n>\nexport type TenantFeatureProgressStatus = z.infer<\n typeof tenantFeatureProgressStatusSchema\n>\nexport type TenantFeatureProgressItemState = z.infer<\n typeof tenantFeatureProgressItemStateSchema\n>\nexport type TenantFeatureProgressSeverity = z.infer<\n typeof tenantFeatureProgressSeveritySchema\n>\nexport type TenantFeatureProgressEvidenceValue = z.infer<\n typeof tenantFeatureProgressEvidenceValueSchema\n>\nexport type TenantFeatureProgressItem = z.infer<\n typeof tenantFeatureProgressItemSchema\n>\nexport type TenantFeatureProgressGroup = z.infer<\n typeof tenantFeatureProgressGroupSchema\n>\nexport type TenantFeatureProgressResponse = z.infer<\n typeof tenantFeatureProgressResponseSchema\n>\nexport type CollectionSchemaEndpointParams = z.infer<\n typeof collectionSchemaEndpointParamsSchema\n>\nexport type CollectionFieldOption = z.infer<typeof collectionFieldOptionSchema>\nexport type CollectionSchemaResponse = z.infer<\n typeof collectionSchemaResponseSchema\n>\n","import { Command } from 'commander'\nimport {\n tenantFeatureProgressInputSchema,\n tenantFeatureProgressResponseSchema,\n type TenantFeatureProgressResponse,\n} from '@01.software/contracts'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseWithSchema } from '../lib/parse.js'\n\nfunction flattenProgress(progress: TenantFeatureProgressResponse) {\n return progress.groups.flatMap((group) =>\n group.items.map((item) => ({\n group: group.title,\n item: item.title,\n state: item.state,\n severity: item.severity,\n summary: item.summary,\n })),\n )\n}\n\nexport function registerFeatureCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const feature = program\n .command('feature')\n .description('Feature implementation progress checks')\n\n feature\n .command('check <feature>')\n .description('Check tenant implementation progress for a feature')\n .option('--evidence', 'Include sanitized evidence counts and surface flags')\n .action(async (featureName: string, options: { evidence?: boolean }) => {\n try {\n const input = parseWithSchema(\n {\n feature: featureName,\n includeEvidence: Boolean(options.evidence),\n },\n 'feature',\n tenantFeatureProgressInputSchema,\n )\n const client = getClient()\n const result = tenantFeatureProgressResponseSchema.parse(\n await client.tenant.featureProgress(input),\n )\n const format = getFormat()\n printResult(\n format === 'table' ? flattenProgress(result) : result,\n format,\n )\n } catch (error) {\n exitWithError(error)\n }\n })\n}\n","import { resolve, dirname } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { spawn } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport type { Command } from 'commander'\nimport { resolveClient } from '../lib/client.js'\nimport { exitWithError } from '../lib/output.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nexport interface StdioEntryCandidate {\n label: string\n path: string\n}\n\n/**\n * Locate the MCP stdio entry point.\n * Resolve order:\n * 1. Packaged MCP server copied into packages/cli/dist/mcp/stdio.js\n * 2. Monorepo MCP build output: apps/mcp/dist/stdio.js\n * 3. xmcp output: apps/mcp/.xmcp/stdio.js\n */\nexport function getStdioEntryCandidates(\n baseDir = __dirname,\n): StdioEntryCandidate[] {\n const candidates: StdioEntryCandidate[] = [\n {\n label: 'packaged CLI artifact',\n path: resolve(baseDir, 'mcp/stdio.js'),\n },\n ]\n const roots = ['../../../..', '../../..', '../..']\n const entries = [\n {\n label: 'monorepo build output',\n path: 'apps/mcp/dist/stdio.js',\n },\n {\n label: 'xmcp build output',\n path: 'apps/mcp/.xmcp/stdio.js',\n },\n ]\n\n for (const entry of entries) {\n for (const root of roots) {\n candidates.push({\n label: entry.label,\n path: resolve(baseDir, root, entry.path),\n })\n }\n }\n\n return candidates\n}\n\nexport function findStdioEntry(baseDir = __dirname): string | null {\n for (const candidate of getStdioEntryCandidates(baseDir)) {\n if (existsSync(candidate.path)) return candidate.path\n }\n\n return null\n}\n\nexport function formatMissingStdioEntryMessage(baseDir = __dirname): string {\n const checked = getStdioEntryCandidates(baseDir)\n .map((candidate) => ` - ${candidate.label}: ${candidate.path}`)\n .join('\\n')\n\n return [\n 'MCP stdio entry not found.',\n 'Checked:',\n checked,\n 'Fix:',\n ' - Monorepo checkout: run pnpm --filter mcp build.',\n ' - Published CLI: reinstall or update @01.software/cli so dist/mcp/stdio.js is included.',\n ].join('\\n')\n}\n\nexport function createMcpEnv(\n baseEnv: NodeJS.ProcessEnv,\n client: { publishableKey: string; secretKey: string },\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...baseEnv,\n SOFTWARE_PUBLISHABLE_KEY: client.publishableKey,\n SOFTWARE_SECRET_KEY: client.secretKey,\n }\n\n delete env.SOFTWARE_TENANT_ID\n\n return env\n}\n\nexport function registerMcpCommands(program: Command) {\n program\n .command('mcp')\n .description('Start local MCP stdio server for trusted server-key workflows')\n .addHelpText(\n 'after',\n `\nPrerequisites:\n Run 01 login, or set SOFTWARE_PUBLISHABLE_KEY and SOFTWARE_SECRET_KEY.\n Local stdio exposes the full MCP tool surface; HTTP OAuth MCP uses the\n narrower remote surface documented in the web integration guide.\n In a monorepo checkout, build the stdio artifact first:\n pnpm --filter mcp build\n`,\n )\n .action(() => {\n // 1. Validate credentials before spawning (exits with code 2 if missing)\n const client = resolveClient(program.opts().apiKey as string | undefined)\n\n // 2. Find stdio.js entry point\n const stdioEntry = findStdioEntry()\n if (!stdioEntry) {\n exitWithError(new Error(formatMissingStdioEntryMessage()))\n }\n\n // 3. Spawn stdio process (inherits env with SOFTWARE_PUBLISHABLE_KEY + SOFTWARE_SECRET_KEY)\n const child = spawn(process.execPath, [stdioEntry], {\n env: createMcpEnv(process.env, client),\n stdio: ['inherit', 'inherit', 'inherit'],\n })\n\n child.on('error', (err) => {\n exitWithError(new Error(`Failed to start MCP server: ${err.message}`))\n })\n\n child.on('exit', (code) => {\n process.exit(code ?? 0)\n })\n })\n}\n","import { Command, type CommanderError } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { exitWithAgentError, printAgentSuccess } from '../lib/agent-output.js'\nimport { parseSelect, validateCollection } from '../lib/collections.js'\n\nconst AGENT_PROTOCOL_VERSION = '1'\n\ntype AgentOperation = 'query' | 'get'\n\ntype AgentFieldName = 'id' | 'createdAt' | 'updatedAt'\n\ninterface AgentFieldMetadata {\n type: 'string'\n queryable: boolean\n}\n\ntype AgentFieldMap = Record<AgentFieldName, AgentFieldMetadata>\n\nexport interface AgentManifest {\n version: typeof AGENT_PROTOCOL_VERSION\n collections: Record<\n (typeof COLLECTIONS)[number],\n {\n operations: readonly AgentOperation[]\n fields: AgentFieldMap\n }\n >\n}\n\nfunction buildStableAgentFields(): AgentFieldMap {\n return {\n id: { type: 'string', queryable: true },\n createdAt: { type: 'string', queryable: true },\n updatedAt: { type: 'string', queryable: true },\n }\n}\n\nfunction invalidInput(message: string, field: string, value?: unknown): Error {\n const error = new Error(message)\n Object.assign(error, {\n type: 'validation',\n code: 'invalid_argument',\n field,\n detail: { message, value, field },\n })\n return error\n}\n\nfunction parsePositiveInteger(\n value: string | undefined,\n field: 'limit' | 'page',\n): number | undefined {\n if (value == null) return undefined\n if (/^[1-9]\\d*$/.test(value)) return Number(value)\n throw invalidInput(`--${field} must be a positive integer`, field, value)\n}\n\nfunction handleCommanderError(error: CommanderError): never {\n if (error.code === 'commander.helpDisplayed') {\n process.exit(error.exitCode)\n }\n\n exitWithAgentError(invalidInput(error.message, 'command'))\n}\n\nfunction configureAgentParser(command: Command): Command {\n command.configureOutput({\n writeErr: () => {},\n writeOut: (str) => {\n process.stdout.write(str)\n },\n })\n command.exitOverride(handleCommanderError)\n return command\n}\n\nfunction parseWhere(\n value: string | undefined,\n): Record<string, unknown> | undefined {\n if (value == null) return undefined\n\n try {\n const parsed: unknown = JSON.parse(value)\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>\n }\n } catch {\n throw invalidInput('--where must be a JSON object', 'where', value)\n }\n\n throw invalidInput('--where must be a JSON object', 'where', value)\n}\n\nexport function buildAgentManifest(): AgentManifest {\n const collections = {} as AgentManifest['collections']\n for (const collection of COLLECTIONS) {\n collections[collection] = {\n operations: ['query', 'get'],\n fields: buildStableAgentFields(),\n }\n }\n\n return {\n version: AGENT_PROTOCOL_VERSION,\n collections,\n }\n}\n\nfunction validateAgentCollection(collection: string): (typeof COLLECTIONS)[number] {\n try {\n return validateCollection(collection)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : `Unknown collection \"${collection}\".`\n throw invalidInput(message, 'collection', collection)\n }\n}\n\nexport function registerAgentCommands(\n program: Command,\n getClient: () => ResolvedClient,\n): void {\n const agent = configureAgentParser(\n program\n .command('agent')\n .description('Machine-stable CLI namespace for coding agents')\n .addHelpText(\n 'after',\n '\\nContract: docs/agent-cli-contract.md\\nJSON only on stdout; no TTY effects.',\n ),\n )\n\n configureAgentParser(\n agent\n .command('manifest')\n .description('Print the Agent CLI protocol manifest')\n .option('--pretty', 'Print 2-space indented JSON')\n .action((opts: { pretty?: boolean }) => {\n printAgentSuccess(buildAgentManifest(), { pretty: Boolean(opts.pretty) })\n }),\n )\n\n configureAgentParser(\n agent\n .command('query <collection>')\n .description('Query documents from a collection')\n .option('--where <json>', 'Filter conditions as a JSON object')\n .option('--limit <n>', 'Max results')\n .option('--page <n>', 'Page number')\n .option('--sort <field>', 'Sort field; prefix with - for descending')\n .option('--select <fields>', 'Comma-separated fields to select')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n opts: {\n where?: string\n limit?: string\n page?: string\n sort?: string\n select?: string\n pretty?: boolean\n },\n ) => {\n try {\n const col = validateAgentCollection(collection)\n const options: Record<string, unknown> = {}\n const where = parseWhere(opts.where)\n const limit = parsePositiveInteger(opts.limit, 'limit')\n const page = parsePositiveInteger(opts.page, 'page')\n\n if (where) options.where = where\n if (limit != null) options.limit = limit\n if (page != null) options.page = page\n if (opts.sort) options.sort = opts.sort\n if (opts.select) options.select = parseSelect(opts.select)\n\n const client = getClient()\n const result = await client.collections.from(col).find(options)\n printAgentSuccess(result, { pretty: Boolean(opts.pretty) })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n\n configureAgentParser(\n agent\n .command('get <collection> [id]')\n .description('Get a document by ID')\n .option('--select <fields>', 'Comma-separated fields to select')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n id: string | undefined,\n opts: { select?: string; pretty?: boolean },\n ) => {\n try {\n const col = validateAgentCollection(collection)\n if (!id) {\n throw invalidInput('Missing required argument: id', 'id')\n }\n\n const options: Record<string, unknown> = {}\n if (opts.select) options.select = parseSelect(opts.select)\n\n const client = getClient()\n const result = await client.collections\n .from(col)\n .findById(id, options)\n printAgentSuccess(result, { pretty: Boolean(opts.pretty) })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n}\n","import { classifyError } from './admin-error.js'\n\nexport type AgentErrorCode =\n | 'INVALID_INPUT'\n | 'AUTH_FAILED'\n | 'NOT_FOUND'\n | 'INTERNAL'\n\nexport interface AgentErrorEnvelope {\n error: {\n code: AgentErrorCode\n message: string\n }\n}\n\nexport interface AgentPrintOptions {\n pretty?: boolean\n}\n\nfunction stringifyAgentJson(\n data: unknown,\n options: AgentPrintOptions = {},\n): string {\n return options.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data)\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object'\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction errorMessage(error: unknown): string {\n const raw = asRecord(error)\n if (raw) {\n if (typeof raw.message === 'string' && raw.message.length > 0) {\n return raw.message\n }\n if (\n raw.detail &&\n typeof raw.detail === 'object' &&\n typeof (raw.detail as Record<string, unknown>).message === 'string'\n ) {\n return String((raw.detail as Record<string, unknown>).message)\n }\n }\n if (error instanceof Error && error.message.length > 0) {\n return error.message\n }\n if (typeof error === 'string' && error.length > 0) {\n return error\n }\n return 'Internal error'\n}\n\nfunction isRawNotFound(error: unknown): boolean {\n const raw = asRecord(error)\n return (\n raw?.status === 404 ||\n raw?.code === 'not_found' ||\n raw?.name === 'GoneError'\n )\n}\n\nexport function agentErrorExitCode(code: AgentErrorCode): number {\n switch (code) {\n case 'INVALID_INPUT':\n return 2\n case 'AUTH_FAILED':\n return 3\n case 'NOT_FOUND':\n return 4\n case 'INTERNAL':\n return 1\n }\n}\n\nexport function classifyAgentError(error: unknown): AgentErrorEnvelope {\n const adminError = classifyError(error)\n const message = errorMessage(error)\n\n if (isRawNotFound(error) || adminError.code === 'not_found') {\n return { error: { code: 'NOT_FOUND', message } }\n }\n\n if (adminError.type === 'permission') {\n return { error: { code: 'AUTH_FAILED', message } }\n }\n\n if (adminError.type === 'validation' && adminError.code !== 'unknown') {\n return { error: { code: 'INVALID_INPUT', message } }\n }\n\n return { error: { code: 'INTERNAL', message } }\n}\n\nexport function printAgentSuccess(\n data: unknown,\n options: AgentPrintOptions = {},\n): void {\n console.log(stringifyAgentJson(data, options))\n}\n\nexport function printAgentError(\n error: unknown,\n options: AgentPrintOptions = {},\n): AgentErrorEnvelope {\n const envelope = classifyAgentError(error)\n console.log(stringifyAgentJson(envelope, options))\n return envelope\n}\n\nexport function exitWithAgentError(\n error: unknown,\n options: AgentPrintOptions = {},\n): never {\n const envelope = printAgentError(error, options)\n process.exit(agentErrorExitCode(envelope.error.code))\n}\n"],"mappings":"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","names":["t","readFileSync","readFileSync","program","getClient","getFormat","program","getClient","getFormat","order","z","idSchema","z","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","pc","pc","t","resolve","program","COLLECTIONS","program","getClient","getFormat","COLLECTIONS","z","z","program","getClient","getFormat","existsSync","existsSync","program","COLLECTIONS","COLLECTIONS","program","getClient","require"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/client.ts","../src/lib/credentials.ts","../src/lib/output.ts","../../errors/src/admin-error.ts","../src/lib/admin-error.ts","../src/lib/i18n.ts","../src/commands/crud.ts","../src/lib/collections.ts","../src/lib/parse.ts","../src/commands/order.ts","../src/commands/return.ts","../src/commands/cart.ts","../src/commands/stock.ts","../src/commands/transaction.ts","../src/commands/auth.ts","../src/commands/schema.ts","../../contracts/src/tenant/index.ts","../src/commands/feature.ts","../src/commands/mcp.ts","../src/commands/agent.ts","../src/lib/agent-output.ts","../src/lib/agent-plan-allowlist.ts","../src/lib/agent-plan-auth.ts","../src/lib/agent-plan-store.ts","../src/lib/agent-plan-hash.ts","../src/lib/agent-plan-id.ts","../src/lib/agent-plan-stale.ts","../src/lib/agent-plan-confirm.ts","../src/lib/agent-plan-payload.ts","../src/lib/agent-plan-secrets.ts","../src/lib/agent-plan-token.ts","../src/commands/agent-plan.ts"],"sourcesContent":["import { createRequire } from 'node:module'\nimport { Command } from 'commander'\nimport { resolveClient, resolveClientOrThrow } from './lib/client.js'\nimport { exitWithError } from './lib/output.js'\nimport { setLocale, type Locale } from './lib/i18n.js'\nimport { registerCrudCommands } from './commands/crud.js'\nimport { registerOrderCommands } from './commands/order.js'\nimport { registerReturnCommands } from './commands/return.js'\nimport { registerCartCommands } from './commands/cart.js'\nimport { registerStockCommands } from './commands/stock.js'\nimport { registerTransactionCommands } from './commands/transaction.js'\nimport { registerAuthCommands } from './commands/auth.js'\nimport { registerSchemaCommands } from './commands/schema.js'\nimport { registerFeatureCommands } from './commands/feature.js'\nimport { registerMcpCommands } from './commands/mcp.js'\nimport { registerAgentCommands } from './commands/agent.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\nconst program = new Command()\n\nprogram\n .name('01')\n .description('CLI for the 01.software platform')\n .version(version)\n .option('--api-key <key>', 'API key (sk01_... or pat01_... token)')\n .option('--format <format>', 'Output format: json, table, or ndjson')\n .option('--lang <locale>', 'Force locale (ko or en)')\n\nconst getFormat = () =>\n (program.opts().format ?? process.env.OUTPUT_FORMAT ?? 'json') as string\n\n// Surface the explicit `--lang` flag (when supplied) so the i18n table\n// detection in `lib/i18n.ts` honours it before falling back to LC_ALL/LANG.\n// Also pin OUTPUT_FORMAT into the env so `exitWithError(e)` calls inside\n// command bodies pick up the format without threading it through every\n// call site.\nprogram.hook('preAction', () => {\n const lang = program.opts().lang as string | undefined\n if (lang === 'ko' || lang === 'en') setLocale(lang as Locale)\n process.env.OUTPUT_FORMAT = getFormat()\n})\n\nprocess.on('unhandledRejection', (err) => {\n exitWithError(err, { format: getFormat() })\n})\n\nconst getClient = () =>\n resolveClient(program.opts().apiKey as string | undefined)\nconst getAgentClient = () =>\n resolveClientOrThrow(program.opts().apiKey as string | undefined)\n\nregisterAgentCommands(program, getAgentClient)\nregisterCrudCommands(program, getClient, getFormat)\nregisterOrderCommands(program, getClient, getFormat)\nregisterReturnCommands(program, getClient, getFormat)\nregisterCartCommands(program, getClient, getFormat)\nregisterStockCommands(program, getClient, getFormat)\nregisterTransactionCommands(program, getClient, getFormat)\nregisterSchemaCommands(program, getClient, getFormat)\nregisterFeatureCommands(program, getClient, getFormat)\nregisterMcpCommands(program)\nregisterAuthCommands(program)\n\nprogram.parse()\n","import {\n CollectionClient,\n ServerCommerceClient,\n TenantIntrospectionApi,\n type TenantIntrospectionClient,\n} from '@01.software/sdk/server'\nimport { loadCredentials, loadLocalCredentials } from './credentials.js'\nimport { exitWithError } from './output.js'\nimport { t } from './i18n.js'\nimport type { AdminError } from './admin-error.js'\n\nexport interface ResolvedClient {\n collections: CollectionClient\n commerce: ServerCommerceClient\n tenant: TenantIntrospectionClient\n publishableKey: string\n secretKey: string\n}\n\ninterface ResolvedCredentials {\n publishableKey: string\n secretKey: string\n}\n\n/**\n * Accepted opaque bearer token prefixes.\n * - `sk01_` = tenant-level API key (created in Console > Settings > API Keys)\n * - `pat01_` = user-level Personal Access Token\n * Hex HMAC secrets from the pre-2026-04 auth system are rejected.\n */\nfunction isValidBearerToken(secret: string): boolean {\n return secret.startsWith('sk01_') || secret.startsWith('pat01_')\n}\n\nfunction credentialError(detail: Record<string, unknown>): AdminError {\n return {\n type: 'permission',\n code: 'credential_invalid',\n detail,\n }\n}\n\n/**\n * Resolve credentials in priority order:\n * 1. `--api-key <token>` flag (overrides secretKey only; publishableKey still\n * comes from env/credentials)\n * 2. `SOFTWARE_PUBLISHABLE_KEY` + `SOFTWARE_SECRET_KEY` env vars\n * 3. Local project credentials (`./01software/credentials.json`)\n * 4. Global user credentials (`~/.01software/credentials.json`)\n */\nfunction resolveClientCredentials(apiKeyFlag?: string): ResolvedCredentials {\n let publishableKey: string | undefined = process.env.SOFTWARE_PUBLISHABLE_KEY\n let secretKey: string | undefined =\n apiKeyFlag ?? process.env.SOFTWARE_SECRET_KEY\n\n if (!publishableKey || !secretKey) {\n const local = loadLocalCredentials()\n if (local) {\n publishableKey = publishableKey ?? local.publishableKey\n secretKey = secretKey ?? local.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n const stored = loadCredentials()\n if (stored) {\n publishableKey = publishableKey ?? stored.publishableKey\n secretKey = secretKey ?? stored.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n throw credentialError({\n message: t('AuthenticationRequired'),\n steps: [\n t('RunLoginToAuthenticate'),\n t('PassApiKey'),\n t('SetEnvVars'),\n ],\n })\n }\n\n if (!isValidBearerToken(secretKey)) {\n throw credentialError({\n message: t('InvalidApiKeyFormat'),\n suggestion: t('RetiredHexCredentialsRejected'),\n })\n }\n\n return { publishableKey, secretKey }\n}\n\nexport function resolveClientOrThrow(apiKeyFlag?: string): ResolvedClient {\n const { publishableKey, secretKey } = resolveClientCredentials(apiKeyFlag)\n const serverOptions = { publishableKey, secretKey }\n\n return {\n collections: new CollectionClient(\n publishableKey,\n secretKey,\n undefined,\n undefined,\n undefined,\n ),\n commerce: new ServerCommerceClient(serverOptions),\n tenant: new TenantIntrospectionApi(serverOptions),\n publishableKey,\n secretKey,\n }\n}\n\nexport function resolveClient(apiKeyFlag?: string): ResolvedClient {\n try {\n return resolveClientOrThrow(apiKeyFlag)\n } catch (error) {\n exitWithError(error)\n }\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n appendFileSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nexport interface StoredCredentials {\n publishableKey: string\n /** Opaque bearer token — tenant API key (sk01_...) or PAT (pat01_...) */\n secretKey: string\n tenantId?: string\n tenantName: string\n storedAt: string\n}\n\nexport interface TenantInfo {\n id: string\n name: string\n}\n\nconst DIR_NAME = '.01software'\nconst FILE_NAME = 'credentials.json'\nconst TENANTS_FILE = 'tenants.json'\n\n// ---------------------------------------------------------------------------\n// Global credentials (~/.01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getCredentialsPath(): string {\n return join(homedir(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getCredentialsPath())\n}\n\nexport function saveCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function deleteCredentials(): boolean {\n const filePath = getCredentialsPath()\n if (!existsSync(filePath)) return false\n\n unlinkSync(filePath)\n return true\n}\n\n// ---------------------------------------------------------------------------\n// Local credentials (./01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getLocalCredentialsPath(): string {\n return join(process.cwd(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadLocalCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getLocalCredentialsPath())\n}\n\nexport function saveLocalCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(process.cwd(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getLocalCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n\n // Ensure .01software/ is in .gitignore\n ensureGitignore()\n}\n\n// ---------------------------------------------------------------------------\n// Tenant list cache (~/.01software/tenants.json)\n// ---------------------------------------------------------------------------\n\nexport function saveTenantList(tenants: TenantInfo[]): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n writeFileSync(filePath, JSON.stringify(tenants, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function loadTenantList(): TenantInfo[] | null {\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (!Array.isArray(data)) return null\n const valid = data.filter(\n (t): t is TenantInfo =>\n typeof t?.id === 'string' && typeof t?.name === 'string',\n )\n return valid.length > 0 ? valid : null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction loadCredentialsFrom(filePath: string): StoredCredentials | null {\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw) as StoredCredentials\n if (!data.publishableKey || !data.secretKey) return null\n return data\n } catch {\n return null\n }\n}\n\nfunction ensureGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore')\n const entry = '.01software/'\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.includes(entry)) return\n appendFileSync(gitignorePath, `\\n${entry}\\n`, 'utf-8')\n } else {\n writeFileSync(gitignorePath, `${entry}\\n`, 'utf-8')\n }\n}\n","import pc from 'picocolors'\nimport {\n type AdminError,\n classifyError,\n adminErrorExitCode,\n} from './admin-error.js'\nimport { CLI_I18N_KO, t } from './i18n.js'\n\n// Build a Set of valid i18n keys for fast lookup when localizing AdminError\n// codes. Reused below to choose between localized and fallback rendering.\nconst CLI_I18N_KEYS: readonly string[] = Object.keys(CLI_I18N_KO)\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n\nexport function printTable(data: unknown): void {\n if (Array.isArray(data)) {\n if (data.length === 0) {\n console.log(pc.dim(t('Empty')))\n return\n }\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map((k) =>\n Math.max(\n k.length,\n ...data.map(\n (row) => String((row as Record<string, unknown>)[k] ?? '').length,\n ),\n ),\n )\n\n // Header\n console.log(keys.map((k, i) => k.padEnd(widths[i]!)).join(' '))\n console.log(keys.map((_, i) => '-'.repeat(widths[i]!)).join(' '))\n\n // Rows\n for (const row of data) {\n console.log(\n keys\n .map((k, i) =>\n String((row as Record<string, unknown>)[k] ?? '').padEnd(\n widths[i]!,\n ),\n )\n .join(' '),\n )\n }\n } else if (data && typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKey = Math.max(...entries.map(([k]) => k.length))\n for (const [key, value] of entries) {\n const display =\n typeof value === 'object' ? JSON.stringify(value) : String(value)\n console.log(`${pc.bold(key.padEnd(maxKey))} ${display}`)\n }\n } else {\n console.log(String(data))\n }\n}\n\nfunction printNdjson(data: unknown): void {\n if (Array.isArray(data)) {\n data.forEach((item) => console.log(JSON.stringify(item)))\n } else if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const { docs, ...meta } = data as {\n docs: unknown[]\n [key: string]: unknown\n }\n ;(docs as unknown[]).forEach((doc) => console.log(JSON.stringify(doc)))\n if (Object.keys(meta).length > 0)\n console.log(JSON.stringify({ _meta: meta }))\n } else {\n console.log(JSON.stringify(data))\n }\n}\n\nexport function printResult(data: unknown, format: string): void {\n if (format === 'ndjson') {\n printNdjson(data)\n } else if (format === 'table') {\n // For find responses with docs array, print the docs as table\n if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const resp = data as {\n docs: unknown[]\n totalDocs: number\n page: number\n totalPages: number\n }\n printTable(resp.docs)\n console.log(\n pc.dim(\n `\\n${t('Total', { n: resp.totalDocs })} | ${t('PageOf', {\n page: resp.page,\n total: resp.totalPages,\n })}`,\n ),\n )\n return\n }\n printTable(data)\n } else {\n printJson(data)\n }\n}\n\n/**\n * Map an unknown error → CLI exit code per `docs/packages/cli-exit-codes.md`.\n *\n * Routes through `classifyError()` (the AdminError discriminated union is\n * the canonical source). The SDK-error-name + HTTP-status heuristic lives\n * inside `classifyError` so existing thrown values keep their mapping.\n * The `unknown` code → exit 1 fallback is encoded in\n * `adminErrorExitCode` itself.\n */\nexport function getExitCode(error: unknown): number {\n return adminErrorExitCode(classifyError(error))\n}\n\nexport interface ErrorPrintOptions {\n format?: string\n}\n\n/**\n * Resolve the active output format. The entry point (`index.ts`) sets\n * `process.env.OUTPUT_FORMAT` from `--format` / fallback so command bodies\n * can call `exitWithError(e)` without threading the format through every\n * call site. Explicit `options.format` always wins.\n */\nfunction resolveFormat(options: ErrorPrintOptions): string {\n return options.format ?? process.env.OUTPUT_FORMAT ?? 'json'\n}\n\n/**\n * Render an error to the user. With `--format json` (or\n * `OUTPUT_FORMAT=json`), serialize the AdminError discriminated union to\n * stdout per the contract in `docs/packages/cli-exit-codes.md`. Otherwise\n * print a localized one-line message + supporting metadata to stderr.\n */\nexport function printError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): void {\n const adminError = classifyError(error)\n\n // Per docs/packages/cli-exit-codes.md: ALWAYS emit a one-line human\n // message on stderr before exiting non-zero. Under `--format json` the\n // AdminError JSON is ALSO serialized to stdout so scripts can parse it.\n const knownKey = CLI_I18N_KEYS.includes(adminError.code)\n ? (adminError.code as Parameters<typeof t>[0])\n : null\n const localized = knownKey ? t(knownKey) : null\n const rawErr =\n error && typeof error === 'object'\n ? (error as Record<string, unknown>)\n : null\n const rawMessage =\n rawErr && typeof rawErr.message === 'string' ? rawErr.message : ''\n const stringErr = typeof error === 'string' ? error : ''\n const detailMessage =\n rawErr &&\n rawErr.detail &&\n typeof rawErr.detail === 'object' &&\n typeof (rawErr.detail as Record<string, unknown>).message === 'string'\n ? String((rawErr.detail as Record<string, unknown>).message)\n : ''\n // Headline: prefer the most specific human-readable text on hand —\n // raw `message` (most common SDK shape), then a string-error directly,\n // then `detail.message`, then the localized AdminError-code translation,\n // then the bare code.\n const headline =\n rawMessage || stringErr || detailMessage || localized || adminError.code\n\n console.error(pc.red(`Error: ${headline}`))\n // Surface the raw `code`/`status` (when present and distinct) so callers\n // who throw SDK errors with proprietary codes don't lose them in the\n // human-readable rendering. The AdminError type/code is always emitted\n // — that's the canonical contract.\n if (\n rawErr &&\n typeof rawErr.code === 'string' &&\n rawErr.code !== adminError.code\n ) {\n console.error(pc.dim(`Code: ${rawErr.code}`))\n } else {\n console.error(pc.dim(`Code: ${adminError.code}`))\n }\n if (rawErr && typeof rawErr.status === 'number') {\n console.error(pc.dim(`Status: ${rawErr.status}`))\n }\n console.error(pc.dim(`Type: ${adminError.type}`))\n\n if (\n adminError.type === 'degraded' &&\n typeof adminError.retryAfter === 'number'\n ) {\n console.error(pc.yellow(`Retry after: ${adminError.retryAfter}s`))\n }\n if (rawErr && typeof rawErr.suggestion === 'string') {\n console.error(pc.yellow(rawErr.suggestion))\n }\n\n if (resolveFormat(options) === 'json') {\n console.log(JSON.stringify(adminError))\n }\n}\n\nexport function exitWithError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): never {\n printError(error, options)\n process.exit(getExitCode(error))\n}\n","export type ValidationCode = string\n\nexport type PermissionCode =\n | 'tenant_mismatch'\n | 'account_suspended'\n | 'feature_disabled'\n | 'role_denied'\n | 'credential_invalid'\n | 'pat_tenant_unpinned'\n | 'publishable_key_mismatch'\n | 'scope_denied'\n\nexport type DegradedCode =\n | 'redis_unavailable'\n | 'provider_unavailable'\n | 'rate_limited'\n\nexport type NetworkCode = 'upstream_timeout' | 'upstream_5xx' | 'dns_failure'\n\nexport type AdminErrorCode =\n | PermissionCode\n | DegradedCode\n | NetworkCode\n | ValidationCode\n\nexport type AdminError =\n | {\n type: 'validation'\n code: ValidationCode\n field?: string\n detail?: Record<string, unknown>\n }\n | {\n type: 'permission'\n code: PermissionCode\n detail?: Record<string, unknown>\n }\n | {\n type: 'degraded'\n code: DegradedCode\n retryAfter?: number\n detail?: Record<string, unknown>\n }\n | {\n type: 'network'\n code: NetworkCode\n detail?: Record<string, unknown>\n }\n\nexport const ADMIN_ERROR_CODES = {\n permission: [\n 'tenant_mismatch',\n 'account_suspended',\n 'feature_disabled',\n 'role_denied',\n 'credential_invalid',\n 'pat_tenant_unpinned',\n 'publishable_key_mismatch',\n 'scope_denied',\n ] as const satisfies readonly PermissionCode[],\n degraded: [\n 'redis_unavailable',\n 'provider_unavailable',\n 'rate_limited',\n ] as const satisfies readonly DegradedCode[],\n network: [\n 'upstream_timeout',\n 'upstream_5xx',\n 'dns_failure',\n ] as const satisfies readonly NetworkCode[],\n} as const\n\nconst PERMISSION_CODES = ADMIN_ERROR_CODES.permission\nconst DEGRADED_CODES = ADMIN_ERROR_CODES.degraded\nconst NETWORK_CODES = ADMIN_ERROR_CODES.network\n\nfunction isPermissionCode(code: string): code is PermissionCode {\n return (PERMISSION_CODES as readonly string[]).includes(code)\n}\n\nfunction isDegradedCode(code: string): code is DegradedCode {\n return (DEGRADED_CODES as readonly string[]).includes(code)\n}\n\nfunction isNetworkCode(code: string): code is NetworkCode {\n return (NETWORK_CODES as readonly string[]).includes(code)\n}\n\nexport function isUnknownAdminError(err: AdminError): boolean {\n return err.type === 'validation' && err.code === 'unknown'\n}\n\n/**\n * Shared AdminError classifier for literal codes and explicit validation shapes.\n * Surfaces that need SDK/HTTP heuristics wrap this and handle `unknown` locally.\n */\nexport function classifyAdminError(err: unknown): AdminError {\n if (err && typeof err === 'object') {\n const obj = err as Record<string, unknown>\n\n if (typeof obj.code === 'string') {\n const code = obj.code\n if (isPermissionCode(code)) {\n return { type: 'permission', code }\n }\n if (isDegradedCode(code)) {\n const out: AdminError = { type: 'degraded', code }\n if (typeof obj.retryAfter === 'number') {\n out.retryAfter = obj.retryAfter\n }\n return out\n }\n if (isNetworkCode(code)) {\n return { type: 'network', code }\n }\n }\n\n if (obj.type === 'validation' && typeof obj.code === 'string') {\n const out: AdminError = { type: 'validation', code: obj.code }\n if (typeof obj.field === 'string') out.field = obj.field\n if (obj.detail && typeof obj.detail === 'object') {\n out.detail = obj.detail as Record<string, unknown>\n }\n return out\n }\n }\n\n return {\n type: 'validation',\n code: 'unknown',\n detail: { message: err instanceof Error ? err.message : String(err) },\n }\n}\n","// CLI AdminError surface. Shared taxonomy and core classifier live in\n// `@01.software/errors`. Locale copy stays in `packages/cli/src/lib/i18n.ts`.\n// Drift is enforced by `pnpm verify:i18n-parity`.\n\nimport {\n ADMIN_ERROR_CODES,\n classifyAdminError,\n isUnknownAdminError,\n type AdminError,\n type AdminErrorCode,\n type DegradedCode,\n type NetworkCode,\n type PermissionCode,\n type ValidationCode,\n} from '@01.software/errors'\n\nexport type {\n AdminError,\n AdminErrorCode,\n DegradedCode,\n NetworkCode,\n PermissionCode,\n ValidationCode,\n}\n\nexport { ADMIN_ERROR_CODES }\n\nfunction classifyCliExtensions(err: unknown): AdminError | null {\n if (!err || typeof err !== 'object') return null\n\n const obj = err as Record<string, unknown>\n\n if (obj.code === 'auth_error' || obj.code === 'permission_error') {\n return { type: 'permission', code: 'credential_invalid' }\n }\n\n const name = typeof obj.name === 'string' ? obj.name : undefined\n const status = typeof obj.status === 'number' ? obj.status : undefined\n if (\n name === 'ConfigError' ||\n name === 'AuthError' ||\n name === 'PermissionError' ||\n status === 401 ||\n status === 403\n ) {\n return { type: 'permission', code: 'credential_invalid' }\n }\n if (\n name === 'NetworkError' ||\n name === 'TimeoutError' ||\n status === 408 ||\n status === 503\n ) {\n return { type: 'network', code: 'upstream_timeout' }\n }\n if (name === 'GoneError' || status === 404) {\n return {\n type: 'validation',\n code: 'not_found',\n detail:\n typeof obj.message === 'string' ? { message: obj.message } : undefined,\n }\n }\n if (name === 'UsageLimitError' || status === 429) {\n const out: AdminError = { type: 'degraded', code: 'rate_limited' }\n if (typeof obj.retryAfter === 'number') out.retryAfter = obj.retryAfter\n return out\n }\n if (name === 'ValidationError' || status === 400 || status === 422) {\n return {\n type: 'validation',\n code: 'invalid_argument',\n detail:\n typeof obj.message === 'string' ? { message: obj.message } : undefined,\n }\n }\n\n return null\n}\n\n/**\n * Classify an unknown thrown / rejected value into the AdminError union.\n * Applies shared taxonomy first, then CLI-only SDK/HTTP fallbacks.\n */\nexport function classifyError(err: unknown): AdminError {\n const classified = classifyAdminError(err)\n if (!isUnknownAdminError(classified)) return classified\n return classifyCliExtensions(err) ?? classified\n}\n\n/**\n * Map AdminError → CLI exit code per `docs/packages/cli-exit-codes.md`.\n */\nexport function adminErrorExitCode(err: AdminError): number {\n if (err.code === 'unknown') return 1\n switch (err.type) {\n case 'permission':\n return 2\n case 'validation':\n return err.code === 'not_found' ? 5 : 3\n case 'network':\n return 4\n case 'degraded':\n return err.code === 'rate_limited' ? 6 : 4\n }\n}\n","// CLI i18n table — mirrors `apps/console/src/lib/i18n/admin.ts` AdminError\n// code coverage so a single check (`apps/console/scripts/check-i18n-parity.ts`)\n// can verify the CLI carries every code with both KO and EN translations.\n//\n// Locale resolution:\n// 1. CLI `--lang <ko|en>` (resolved by the entry point and exported via\n// `setLocale`).\n// 2. `LANG` / `LC_ALL` environment variables — anything starting with\n// `ko` (`ko_KR.UTF-8`, `ko-KR`, …) → ko; else en.\n// 3. Default `en`.\n\nexport const CLI_I18N_KO = {\n // CLI-surface microcopy\n AuthenticationRequired: '인증이 필요합니다',\n RunLoginToAuthenticate: '`01 login` 명령으로 브라우저 인증을 진행하거나,',\n PassApiKey: '`--api-key <token>` 옵션을 전달하거나,',\n SetEnvVars:\n '`SOFTWARE_PUBLISHABLE_KEY` / `SOFTWARE_SECRET_KEY` 환경 변수를 설정하세요.',\n InvalidApiKeyFormat:\n 'API 키 형식이 올바르지 않습니다. `sk01_` 또는 `pat01_` 토큰이 필요합니다.',\n RetiredHexCredentialsRejected:\n '이전 hex 자격 증명은 더 이상 허용되지 않습니다 — `01 login`으로 다시 인증하세요.',\n InvalidJsonObject: '`--{{label}}` 인자는 JSON 객체여야 합니다.',\n InvalidJsonArray: '`--{{label}}` 인자는 JSON 배열이어야 합니다.',\n InvalidJsonValue: '`--{{label}}` 인자의 JSON 형식이 올바르지 않습니다: {{value}}',\n Empty: '(없음)',\n Total: '총 {{n}}개',\n PageOf: '{{page}} / {{total}} 페이지',\n\n // AdminError code translations (mirrors apps/console admin.ts).\n tenant_mismatch: '권한이 없는 테넌트',\n account_suspended: '계정이 정지되었습니다',\n feature_disabled: '이 기능이 비활성화되었습니다',\n role_denied: '권한이 부족합니다',\n credential_invalid: '자격 증명이 유효하지 않습니다',\n pat_tenant_unpinned: 'PAT 토큰의 테넌트가 고정되지 않았습니다',\n publishable_key_mismatch: '공개 키가 일치하지 않습니다',\n scope_denied: '범위 권한이 없습니다',\n redis_unavailable: '캐시가 일시적으로 사용 불가합니다',\n provider_unavailable: '외부 공급자가 응답하지 않습니다',\n rate_limited: '요청이 너무 많습니다 — 잠시 후 다시 시도하세요',\n upstream_timeout: '응답 시간이 초과되었습니다',\n upstream_5xx: '외부 서비스 오류',\n dns_failure: '네트워크 연결 오류',\n not_found: '리소스를 찾을 수 없습니다',\n invalid_argument: '인자가 올바르지 않습니다',\n unknown: '알 수 없는 오류',\n} as const\n\nexport type CliI18nKey = keyof typeof CLI_I18N_KO\n\nexport const CLI_I18N_EN: Record<CliI18nKey, string> = {\n AuthenticationRequired: 'Authentication required',\n RunLoginToAuthenticate:\n 'Run `01 login` to authenticate via browser, or',\n PassApiKey: 'pass `--api-key <token>`, or',\n SetEnvVars:\n 'set `SOFTWARE_PUBLISHABLE_KEY` and `SOFTWARE_SECRET_KEY` environment variables.',\n InvalidApiKeyFormat:\n 'Invalid API key format. Expected `sk01_` or `pat01_` token.',\n RetiredHexCredentialsRejected:\n 'Retired hex credentials are no longer accepted — run `01 login` to re-authenticate.',\n InvalidJsonObject: '--{{label}} must be a JSON object.',\n InvalidJsonArray: '--{{label}} must be a JSON array.',\n InvalidJsonValue: 'Invalid JSON for --{{label}}: {{value}}',\n Empty: '(empty)',\n Total: '{{n}} total',\n PageOf: 'page {{page}}/{{total}}',\n\n tenant_mismatch: 'Tenant access denied',\n account_suspended: 'Your account has been suspended',\n feature_disabled: 'This feature is disabled',\n role_denied: 'Insufficient role permissions',\n credential_invalid: 'Invalid credentials',\n pat_tenant_unpinned: 'PAT token tenant is not pinned',\n publishable_key_mismatch: 'Publishable key mismatch',\n scope_denied: 'Scope permission denied',\n redis_unavailable: 'Cache temporarily unavailable',\n provider_unavailable: 'Upstream provider unavailable',\n rate_limited: 'Too many requests — please try again shortly',\n upstream_timeout: 'Upstream request timed out',\n upstream_5xx: 'Upstream service error',\n dns_failure: 'Network connection error',\n not_found: 'Resource not found',\n invalid_argument: 'Invalid argument',\n unknown: 'Unknown error',\n}\n\nexport type Locale = 'ko' | 'en'\n\nlet activeLocale: Locale | null = null\n\nexport function detectLocale(): Locale {\n if (activeLocale) return activeLocale\n const raw =\n process.env.LC_ALL ?? process.env.LANG ?? process.env.LANGUAGE ?? ''\n return raw.toLowerCase().startsWith('ko') ? 'ko' : 'en'\n}\n\nexport function setLocale(locale: Locale | null | undefined): void {\n activeLocale = locale ?? null\n}\n\nexport function t(\n key: CliI18nKey,\n vars?: Record<string, string | number>,\n): string {\n const table = detectLocale() === 'ko' ? CLI_I18N_KO : CLI_I18N_EN\n let s: string = table[key]\n if (vars) {\n for (const [k, v] of Object.entries(vars)) {\n // Use a global regex (escape user-supplied key) instead of\n // String.prototype.replaceAll so we keep working on tsconfig\n // targets older than ES2021. Keys are statically declared above so\n // metacharacter escaping is defense-in-depth.\n const escaped = k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n s = s.replace(new RegExp(`\\\\{\\\\{${escaped}\\\\}\\\\}`, 'g'), String(v))\n }\n }\n return s\n}\n","import { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ApiQueryOptions } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { parseSelect, validateCollection } from '../lib/collections.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson } from '../lib/parse.js'\n\nfunction readFileAsBlob(filePath: string): { blob: Blob; filename: string } {\n const buffer = readFileSync(filePath)\n return { blob: new Blob([buffer]), filename: basename(filePath) }\n}\n\nexport function registerCrudCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n program\n .command('query <collection>')\n .description('Query documents from a collection')\n .option('--where <json>', 'Filter conditions (JSON)')\n .option('--limit <n>', 'Max results', (v: string) => parseInt(v, 10))\n .option('--page <n>', 'Page number', (v: string) => parseInt(v, 10))\n .option('--sort <field>', 'Sort field (prefix with - for descending)')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.where) options.where = parseJson(opts.where, 'where')\n if (opts.limit) options.limit = opts.limit\n if (opts.page) options.page = opts.page\n if (opts.sort) options.sort = opts.sort\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .find(options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('get <collection> <id>')\n .description('Get a document by ID')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .findById(id, options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('create <collection>')\n .description('Create a new document')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'create',\n collection: col,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .create(data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update <collection> <id>')\n .description('Update a document by ID')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update',\n collection: col,\n id,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .update(id, data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete <collection> <id>')\n .description('Delete a document by ID')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete',\n collection: col,\n id,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .remove(id)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update-many <collection>')\n .description('Update multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .requiredOption('--data <json>', 'Update data (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update-many',\n collection: col,\n where,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .updateMany(where, data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete-many <collection>')\n .description('Delete multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete-many',\n collection: col,\n where,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .removeMany(where)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { COLLECTIONS } from '@01.software/sdk'\n\nexport type CliCollection = (typeof COLLECTIONS)[number]\n\nexport function validateCollection(name: string): CliCollection {\n if ((COLLECTIONS as readonly string[]).includes(name)) {\n return name as CliCollection\n }\n\n const normalized = name.replace(/-/g, '').toLowerCase()\n const suggestions = (COLLECTIONS as readonly string[])\n .filter((collection) => {\n const candidate = collection.replace(/-/g, '').toLowerCase()\n return (\n candidate.startsWith(normalized) ||\n normalized.startsWith(candidate) ||\n (normalized.length >= 3 && candidate.includes(normalized))\n )\n })\n .slice(0, 5)\n\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 --help\" for available collections.'\n\n throw new Error(`Unknown collection \"${name}\". ${hint}`)\n}\n\nexport function parseSelect(input: string): Record<string, boolean> {\n return Object.fromEntries(\n input\n .split(',')\n .map((field) => field.trim())\n .map((field) => [field, true]),\n )\n}\n","import { exitWithError } from './output.js'\nimport { t } from './i18n.js'\nimport type { z } from 'zod'\n\n/**\n * Throw an AdminError-shaped object so `exitWithError` can render it correctly\n * under `--format json` and exit with code 3 (validation). The `code` literal\n * `invalid_argument` is already in the validation bucket per `admin-error.ts`.\n */\nfunction failArg(\n label: string,\n value: string,\n expectedKind: 'object' | 'array' | 'value',\n): never {\n const message =\n expectedKind === 'object'\n ? t('InvalidJsonObject', { label })\n : expectedKind === 'array'\n ? t('InvalidJsonArray', { label })\n : t('InvalidJsonValue', { label, value })\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n // `message` is read by `printError` for the stderr headline so the\n // user sees the label/value in the one-line summary; `detail` carries\n // the structured fields for `--format json` consumers.\n message,\n detail: { message, value, field: label },\n })\n}\n\nfunction stringifyValue(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatSchemaIssues(\n label: string,\n issues: readonly { path: readonly string[]; message: string }[],\n): string {\n return issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : label\n return `${path}: ${issue.message}`\n })\n .join('; ')\n}\n\nexport function parseWithSchema<T>(\n value: unknown,\n label: string,\n schema: z.ZodType<T>,\n): T {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n\n const issues = parsed.error.issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n }))\n const message = `Invalid value for --${label}: ${formatSchemaIssues(label, issues)}`\n\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n message,\n detail: {\n message,\n value: stringifyValue(value),\n field: label,\n issues,\n },\n })\n}\n\nexport function parseJson(\n value: string,\n label: string,\n options: { format?: string } = {},\n): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return failArg(label, value, 'object')\n }\n void options\n return parsed as Record<string, unknown>\n}\n\nexport function parseJsonArray(\n value: string,\n label: string,\n options: { format?: string } = {},\n): unknown[] {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (!Array.isArray(parsed)) {\n return failArg(label, value, 'array')\n }\n void options\n return parsed\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson, parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst customerSnapshotSchema = z\n .object({\n email: z.string().email('Invalid email format'),\n name: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst shippingAddressSchema = z\n .object({\n postalCode: z.string().optional(),\n address: z.string().optional(),\n detailAddress: z.string().optional(),\n deliveryMessage: z.string().optional(),\n recipientName: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst orderItemSchema = z\n .object({\n product: idSchema,\n variant: idSchema,\n option: idSchema,\n quantity: z.number().int().positive('quantity must be a positive integer'),\n unitPrice: z.number().optional(),\n totalPrice: z.number().optional(),\n })\n .strict()\n\nconst orderItemsSchema = z\n .array(orderItemSchema)\n .min(1, 'At least one order item is required')\n .max(100, 'Maximum 100 items per order')\n\nconst orderStatusSchema = z.enum([\n 'pending',\n 'paid',\n 'failed',\n 'canceled',\n 'preparing',\n 'shipped',\n 'delivered',\n 'confirmed',\n])\n\nconst fulfillmentItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n })\n .strict(),\n )\n .min(1, 'At least one fulfillment item is required')\n .max(100, 'Maximum 100 items per fulfillment')\n\nexport function registerOrderCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const order = program.command('order').description('Order management')\n\n order\n .command('create')\n .description('Create a new order')\n .option('--payment-id <id>', 'Payment ID')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--email <email>', 'Customer email')\n .option('--customer <id>', 'Customer ID')\n .option('--name <name>', 'Customer name')\n .option('--phone <phone>', 'Customer phone')\n .requiredOption('--shipping-address <json>', 'Shipping address (JSON)')\n .requiredOption('--products <json>', 'Order products array (JSON)')\n .requiredOption('--total-amount <n>', 'Total amount', parseFloat)\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const shippingAddress = parseWithSchema(\n parseJson(opts.shippingAddress, 'shipping-address'),\n 'shipping-address',\n shippingAddressSchema,\n )\n const orderItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n orderItemsSchema,\n )\n const totalAmount = parseWithSchema(\n opts.totalAmount,\n 'total-amount',\n z.number().nonnegative('totalAmount must be non-negative'),\n )\n const data = {\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot: {\n email: opts.email,\n name: opts.name,\n phone: opts.phone,\n },\n customer: opts.customer,\n shippingAddress,\n orderItems,\n totalAmount,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.create({\n ...data,\n orderItems: orderItems as Parameters<\n typeof client.commerce.orders.create\n >[0]['orderItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('get <orderNumber>')\n .description('Get an order by order number')\n .action(async (orderNumber: string) => {\n try {\n const client = getClient()\n const { docs: [order] } = await client.collections.from('orders').find({ where: { orderNumber: { equals: orderNumber } }, limit: 1, depth: 1 })\n if (!order) throw new Error('Order not found')\n printResult(order, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('update <orderNumber>')\n .description('Update order status')\n .requiredOption('--status <status>', 'New status')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', orderStatusSchema)\n const data = { orderNumber, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.update(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('checkout')\n .description('Convert a cart to an order')\n .requiredOption('--cart-id <id>', 'Cart ID')\n .option('--payment-id <id>', 'Payment ID (optional for free orders)')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--customer <json>', 'Customer snapshot (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const customerSnapshot = parseWithSchema(\n parseJson(opts.customer, 'customer'),\n 'customer',\n customerSnapshotSchema,\n )\n const data = {\n cartId: opts.cartId,\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order checkout', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.checkout({\n ...data,\n customerSnapshot: customerSnapshot as Parameters<\n typeof client.commerce.orders.checkout\n >[0]['customerSnapshot'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('fulfill <orderNumber>')\n .description('Create a fulfillment for an order')\n .requiredOption('--items <json>', 'Fulfillment items array (JSON)')\n .option('--carrier <name>', 'Shipping carrier')\n .option('--tracking-number <num>', 'Tracking number')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const items = parseWithSchema(\n parseJsonArray(opts.items, 'items'),\n 'items',\n fulfillmentItemsSchema,\n )\n const data = {\n orderNumber,\n items,\n carrier: opts.carrier,\n trackingNumber: opts.trackingNumber,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order fulfill', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createFulfillment({\n ...data,\n items: items as Parameters<\n typeof client.commerce.orders.createFulfillment\n >[0]['items'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst returnReasonSchema = z\n .enum(['change_of_mind', 'defective', 'wrong_delivery', 'damaged', 'other'])\n .optional()\n\nconst returnItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n restockAction: z\n .enum(['return_to_stock', 'discard'])\n .default('return_to_stock'),\n })\n .strict(),\n )\n .min(1, 'At least one return item is required')\n .max(100, 'Too many return items')\n\nconst returnStatusSchema = z.enum([\n 'processing',\n 'approved',\n 'rejected',\n 'completed',\n])\n\nconst refundAmountSchema = z\n .number()\n .nonnegative('refundAmount must be non-negative')\n\nexport function registerReturnCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const ret = program.command('return').description('Return management')\n\n ret\n .command('create <orderNumber>')\n .description('Create a return request')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .option(\n '--reason <reason>',\n 'Return reason (change_of_mind, defective, wrong_delivery, damaged, other)',\n )\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n reason,\n reasonDetail: opts.reasonDetail,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createReturn({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.createReturn\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('update <returnId>')\n .description('Update return status')\n .requiredOption(\n '--status <status>',\n 'New status (processing, approved, rejected, completed)',\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (returnId: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', returnStatusSchema)\n const data = { returnId, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateReturn(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('refund <orderNumber>')\n .description('Return with refund')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .requiredOption('--payment-id <id>', 'Payment ID')\n .option('--reason <reason>', 'Return reason')\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--refund-receipt-url <url>', 'Refund receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n pgPaymentId: opts.paymentId,\n reason,\n reasonDetail: opts.reasonDetail,\n refundReceiptUrl: opts.refundReceiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return refund', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.returnWithRefund({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.returnWithRefund\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerCartCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const cart = program.command('cart').description('Cart management')\n\n cart\n .command('add <cartId>')\n .description('Add an item to cart')\n .requiredOption('--product <id>', 'Product ID')\n .requiredOption('--variant <id>', 'Variant ID')\n .requiredOption('--option <id>', 'Option ID')\n .requiredOption('--quantity <n>', 'Quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartId: string, opts) => {\n try {\n const data = {\n cartId,\n product: opts.product,\n variant: opts.variant,\n option: opts.option,\n quantity: opts.quantity,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart add', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.addItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('update <cartItemId>')\n .description('Update cart item quantity')\n .requiredOption('--quantity <n>', 'New quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n const data = { cartItemId, quantity: opts.quantity }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.updateItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('remove <cartItemId>')\n .description('Remove an item from cart')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'cart remove',\n data: { cartItemId },\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.removeItem({ cartItemId })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray } from '../lib/parse.js'\n\nexport function registerStockCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const stock = program.command('stock').description('Stock management')\n\n stock\n .command('check')\n .description('Check stock availability')\n .requiredOption(\n '--items <json>',\n 'Items to check (JSON array of { optionId, quantity })',\n )\n .action(async (opts) => {\n try {\n const client = getClient()\n const items = parseJsonArray(opts.items, 'items') as Parameters<\n typeof client.commerce.product.stockCheck\n >[0]['items']\n const result = await client.commerce.product.stockCheck({ items })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerTransactionCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const tx = program\n .command('transaction')\n .description('Transaction management')\n\n tx.command('update')\n .description('Update transaction status')\n .requiredOption('--payment-id <id>', 'Payment ID')\n .requiredOption(\n '--status <status>',\n 'New status (pending, paid, failed, canceled)',\n )\n .requiredOption('--payment-method <method>', 'Payment method')\n .requiredOption('--receipt-url <url>', 'Receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const data = {\n pgPaymentId: opts.paymentId,\n status: opts.status,\n paymentMethod: opts.paymentMethod,\n receiptUrl: opts.receiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'transaction update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateTransaction(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { randomBytes } from 'node:crypto'\nimport { createServer } from 'node:http'\nimport { execFile, exec } from 'node:child_process'\nimport { platform } from 'node:os'\nimport { URL } from 'node:url'\nimport type { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n loadCredentials,\n saveCredentials,\n deleteCredentials,\n getCredentialsPath,\n loadLocalCredentials,\n saveLocalCredentials,\n getLocalCredentialsPath,\n loadTenantList,\n saveTenantList,\n type TenantInfo,\n} from '../lib/credentials.js'\n\nconst WEB_URL = process.env.SOFTWARE_WEB_URL || 'https://01.software'\nconst TIMEOUT_MS = 3 * 60 * 1000 // 3 minutes\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nfunction openBrowser(url: string): void {\n const os = platform()\n\n const onError = () => {\n console.log(\n pc.yellow(\n `Could not open browser automatically. Open this URL manually:\\n${url}`,\n ),\n )\n }\n\n if (os === 'win32') {\n exec(`start \"\" \"${url}\"`, (err) => {\n if (err) onError()\n })\n } else {\n const cmd = os === 'darwin' ? 'open' : 'xdg-open'\n execFile(cmd, [url], (err) => {\n if (err) onError()\n })\n }\n}\n\nconst PAGE_STYLE = `*{margin:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;display:flex;justify-content:center;align-items:center;min-height:100vh;background:#fff;color:#252525}\n@media(prefers-color-scheme:dark){body{background:#252525;color:#f5f5f5}}\n.card{text-align:center;padding:2rem 2.5rem;border-radius:10px;max-width:380px;width:100%}\n.icon{width:40px;height:40px;margin:0 auto 1rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1.25rem}\n.icon.ok{background:rgba(0,0,0,.05);color:#252525}\n.icon.err{background:rgba(220,38,38,.08);color:#dc2626}\n@media(prefers-color-scheme:dark){.icon.ok{background:rgba(255,255,255,.08);color:#f5f5f5}}\nh1{font-size:.875rem;font-weight:600;margin-bottom:.375rem}\np{font-size:.75rem;color:#737373;line-height:1.5}`\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon ok\">\\u2713</div><h1>Authenticated</h1><p>You can close this tab and return to the terminal.</p></div></body></html>`\n\nconst ERROR_HTML = (msg: string) => `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login Error</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon err\">!</div><h1>Authentication failed</h1><p>${escapeHtml(msg)}</p></div></body></html>`\n\ninterface ExchangeResponse {\n publishableKey: string\n secretKey: string\n tenantName: string\n tenantId: string\n tenants?: TenantInfo[]\n}\n\nasync function exchangeCode(code: string): Promise<ExchangeResponse | null> {\n const url = `${WEB_URL}/api/cli/exchange`\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(\n pc.red(\n `Exchange failed: HTTP ${res.status} from ${url}${body ? ` — ${body.slice(0, 200)}` : ''}`,\n ),\n )\n return null\n }\n const data = (await res.json()) as Partial<ExchangeResponse>\n if (\n typeof data.publishableKey !== 'string' ||\n typeof data.secretKey !== 'string' ||\n typeof data.tenantName !== 'string' ||\n typeof data.tenantId !== 'string'\n ) {\n console.error(pc.red(`Exchange failed: malformed response from ${url}`))\n return null\n }\n return {\n publishableKey: data.publishableKey,\n secretKey: data.secretKey,\n tenantName: data.tenantName,\n tenantId: data.tenantId,\n tenants: Array.isArray(data.tenants)\n ? data.tenants.filter(\n (t): t is TenantInfo =>\n typeof (t as TenantInfo)?.id === 'string' &&\n typeof (t as TenantInfo)?.name === 'string',\n )\n : undefined,\n }\n } catch (err) {\n console.error(\n pc.red(\n `Exchange request to ${url} failed: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n return null\n }\n}\n\n/**\n * Start a local HTTP server that receives the OAuth-style redirect callback\n * from the browser. The browser top-level-navigates to\n * http://127.0.0.1:{port}/callback?code={encryptedCode}&state={state}\n * and the CLI exchanges the opaque code with the web API to receive the\n * actual credentials server-to-server. This path has no CORS or PNA\n * preflight because the browser never issues a subresource fetch.\n */\nfunction startAuthServer(options: {\n state: string\n saveFn: (creds: {\n publishableKey: string\n secretKey: string\n tenantId?: string\n tenantName: string\n }) => void\n}): Promise<{ port: number; cleanup: (exitCode?: number) => void }> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400).end()\n return\n }\n\n const url = new URL(req.url, `http://localhost`)\n\n if (url.pathname !== '/callback' || req.method !== 'GET') {\n res.writeHead(404).end()\n return\n }\n\n const error = url.searchParams.get('error')\n if (error) {\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML(error))\n console.error(pc.red(`Login failed: ${error}`))\n cleanup(2)\n return\n }\n\n const code = url.searchParams.get('code')\n const receivedState = url.searchParams.get('state')\n\n if (!code || !receivedState) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Missing code or state. Start over with \"01 login\".'))\n cleanup(2)\n return\n }\n\n if (receivedState !== options.state) {\n res\n .writeHead(403, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('State mismatch. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: state mismatch.'))\n cleanup(2)\n return\n }\n\n exchangeCode(code).then((creds) => {\n if (!creds) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Invalid or expired code. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: code exchange failed.'))\n cleanup(2)\n return\n }\n\n options.saveFn({\n publishableKey: creds.publishableKey,\n secretKey: creds.secretKey,\n tenantId: creds.tenantId,\n tenantName: creds.tenantName,\n })\n\n if (creds.tenants && creds.tenants.length > 0) {\n saveTenantList(creds.tenants)\n }\n\n console.log(pc.green(`\\nLogged in successfully!`))\n console.log(pc.dim(`Tenant: ${creds.tenantName}`))\n\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(SUCCESS_HTML)\n cleanup(0)\n })\n })\n\n let timeout: ReturnType<typeof setTimeout>\n let completed = false\n\n function cleanup(exitCode = 0) {\n if (completed) return\n completed = true\n clearTimeout(timeout)\n server.closeAllConnections?.()\n server.close(() => process.exit(exitCode))\n }\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address()\n if (!addr || typeof addr === 'string') {\n reject(new Error('Failed to start local server.'))\n return\n }\n\n timeout = setTimeout(() => {\n console.error(\n pc.red('\\nLogin timed out (3 minutes). Please try again.'),\n )\n cleanup(4)\n }, TIMEOUT_MS)\n\n resolve({ port: addr.port, cleanup })\n })\n\n server.on('error', (err) => {\n reject(err)\n })\n })\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command('login')\n .description('Login via browser and store credentials')\n .action(async () => {\n const state = randomBytes(32).toString('hex')\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n saveCredentials(creds)\n console.log(pc.dim(`Credentials saved to ${getCredentialsPath()}`))\n },\n })\n\n const params = new URLSearchParams({ port: String(port), state })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim('Opening browser for login...'))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n\n program\n .command('logout')\n .description('Remove stored credentials')\n .action(() => {\n const deleted = deleteCredentials()\n if (deleted) {\n console.log(pc.green('Logged out. Credentials removed.'))\n } else {\n console.log(pc.dim('No stored credentials found.'))\n }\n })\n\n program\n .command('whoami')\n .description('Show current authentication status')\n .action(() => {\n // Check local credentials first\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const creds = localCreds || globalCreds\n const isLocal = !!localCreds\n\n if (!creds) {\n console.log(pc.dim('Not logged in. Run \"01 login\" to authenticate.'))\n return\n }\n\n const masked =\n creds.publishableKey.length > 8\n ? creds.publishableKey.slice(0, 4) + '...' + creds.publishableKey.slice(-4)\n : '****'\n\n const scope = isLocal ? pc.cyan(' (local)') : ''\n console.log(`Tenant: ${pc.bold(creds.tenantName)}${scope}`)\n console.log(`Publishable Key: ${pc.dim(masked)}`)\n console.log(`Stored at: ${pc.dim(creds.storedAt)}`)\n console.log(\n `File: ${pc.dim(isLocal ? getLocalCredentialsPath() : getCredentialsPath())}`,\n )\n })\n\n // -------------------------------------------------------------------------\n // tenant subcommands\n // -------------------------------------------------------------------------\n const tenant = program\n .command('tenant')\n .description('Manage tenant switching')\n\n tenant\n .command('list')\n .description('Show cached tenant list')\n .action(() => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.log(pc.dim('No cached tenants. Run \"01 login\" first.'))\n return\n }\n\n // Determine active tenant\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const activeCreds = localCreds || globalCreds\n const activeId = activeCreds?.tenantId\n const activeName = activeCreds?.tenantName\n\n console.log(pc.bold('Cached tenants:\\n'))\n for (const t of tenants) {\n const active = (activeId ? t.id === activeId : t.name === activeName)\n ? pc.green(' *')\n : ''\n console.log(` ${t.name}${active}`)\n }\n console.log()\n if (activeName) {\n const scope = localCreds ? '(local)' : '(global)'\n console.log(pc.dim(`* active ${scope}`))\n }\n })\n\n tenant\n .command('use <name>')\n .description('Switch to a different tenant via browser')\n .option('--local', 'Save credentials locally in the current project')\n .action(async (name: string, opts: { local?: boolean }) => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.error(pc.red('No cached tenants. Run \"01 login\" first.'))\n process.exit(2)\n }\n\n const match = tenants.find(\n (t) => t.name.toLowerCase() === name.toLowerCase(),\n )\n if (!match) {\n console.error(pc.red(`Tenant \"${name}\" not found in cache.`))\n console.error(\n pc.dim(`Available: ${tenants.map((t) => t.name).join(', ')}`),\n )\n process.exit(3)\n }\n\n const state = randomBytes(32).toString('hex')\n const isLocal = !!opts.local\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n if (isLocal) {\n saveLocalCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getLocalCredentialsPath()}`),\n )\n } else {\n saveCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getCredentialsPath()}`),\n )\n }\n },\n })\n\n const params = new URLSearchParams({\n port: String(port),\n state,\n tenantId: match.id,\n })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim(`Switching to tenant \"${match.name}\"...`))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n}\n","import { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerSchemaCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const schema = program\n .command('schema')\n .description('Collection schema introspection')\n\n schema\n .command('list')\n .description('List available collections')\n .action(() => {\n printResult(COLLECTIONS, getFormat())\n })\n\n schema\n .command('show <collection>')\n .description('Show collection field schema')\n .action(async (collection: string) => {\n try {\n if (!(COLLECTIONS as readonly string[]).includes(collection)) {\n const normalized = collection.replace(/-/g, '').toLowerCase()\n const suggestions = (COLLECTIONS as readonly string[])\n .filter((c) => {\n const cn = c.replace(/-/g, '').toLowerCase()\n return (\n cn.startsWith(normalized) ||\n normalized.startsWith(cn) ||\n (normalized.length >= 3 && cn.includes(normalized))\n )\n })\n .slice(0, 5)\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 schema list\" for available collections.'\n throw new Error(`Unknown collection \"${collection}\". ${hint}`)\n }\n const client = getClient()\n const result = await client.tenant.collectionSchema(collection)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { z } from 'zod'\n\nexport const tenantFieldConfigStateSchema = z\n .object({\n hiddenFields: z.array(z.string()),\n isHidden: z.boolean(),\n })\n .strict()\n\nexport const tenantContextQuerySchema = z\n .object({\n counts: z.literal('true').optional(),\n })\n .strict()\n\nexport const tenantContextToolInputSchema = z\n .object({\n includeCounts: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Include per-collection document counts and config status (bypasses cache, slower)',\n ),\n })\n .strict()\n\nexport const tenantContextResponseSchema = z\n .object({\n tenant: z\n .object({\n id: z.string(),\n name: z.string(),\n plan: z.string(),\n planSource: z.string().optional(),\n authoritative: z.boolean().optional(),\n capabilityVersion: z.string().optional(),\n })\n .strict(),\n features: z.array(z.string()),\n collections: z\n .object({\n active: z.array(z.string()),\n inactive: z.array(z.string()),\n })\n .strict(),\n fieldConfigs: z.record(z.string(), tenantFieldConfigStateSchema),\n counts: z.record(z.string(), z.number()).optional(),\n config: z\n .object({\n webhookConfigured: z.boolean(),\n })\n .strict()\n .optional(),\n })\n .strict()\n\nexport const tenantFeatureProgressFeatureSchema = z.enum(['ecommerce'])\n\nexport const tenantFeatureProgressInputSchema = z\n .object({\n feature: tenantFeatureProgressFeatureSchema.describe(\n 'Feature to inspect for tenant implementation readiness',\n ),\n includeEvidence: z\n .boolean()\n .optional()\n .default(false)\n .describe('Include sanitized counts and static surface evidence'),\n })\n .strict()\n\nexport const tenantFeatureProgressStatusSchema = z.enum([\n 'ready',\n 'attention',\n 'blocked',\n])\n\nexport const tenantFeatureProgressItemStateSchema = z.enum([\n 'complete',\n 'incomplete',\n 'blocked',\n 'attention',\n 'optional',\n 'unknown',\n 'manual',\n 'not-applicable',\n])\n\nexport const tenantFeatureProgressSeveritySchema = z.enum([\n 'required',\n 'recommended',\n 'optional',\n])\n\nexport const tenantFeatureProgressEvidenceValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n])\n\nexport const tenantFeatureProgressItemSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n state: tenantFeatureProgressItemStateSchema,\n severity: tenantFeatureProgressSeveritySchema,\n summary: z.string(),\n evidence: z\n .record(z.string(), tenantFeatureProgressEvidenceValueSchema)\n .optional(),\n })\n .strict()\n\nexport const tenantFeatureProgressGroupSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n summary: z.string().optional(),\n items: z.array(tenantFeatureProgressItemSchema),\n })\n .strict()\n\nexport const tenantFeatureProgressResponseSchema = z\n .object({\n schemaVersion: z.literal(1),\n feature: tenantFeatureProgressFeatureSchema,\n status: tenantFeatureProgressStatusSchema,\n generatedAt: z.string(),\n tenant: z\n .object({\n id: z.string(),\n name: z.string(),\n plan: z.string(),\n })\n .strict(),\n capability: z\n .object({\n effectiveFeatures: z.array(z.string()),\n planBlocked: z.array(z.string()),\n closureAdded: z.array(z.string()),\n })\n .strict(),\n summary: z\n .object({\n complete: z.number().int().nonnegative(),\n total: z.number().int().nonnegative(),\n blocking: z.number().int().nonnegative(),\n manual: z.number().int().nonnegative(),\n unknown: z.number().int().nonnegative(),\n })\n .strict(),\n groups: z.array(tenantFeatureProgressGroupSchema),\n })\n .strict()\n\nexport const COLLECTION_SCHEMA_CONTRACT_VERSION = 1\n\nexport const collectionSchemaEndpointParamsSchema = z\n .object({\n collectionSlug: z.string().min(1, 'collectionSlug is required'),\n })\n .strict()\n\nexport function createCollectionSchemaToolInputSchema<\n const T extends readonly [string, ...string[]],\n>(collections: T) {\n return z\n .object({\n collection: z.enum(collections).describe('Collection name (required)'),\n })\n .strict()\n}\n\nexport const collectionFieldOptionSchema = z\n .object({\n label: z.string(),\n value: z.string(),\n })\n .strict()\n\nexport interface CollectionFieldSchema {\n name: string\n path: string\n type: string\n required?: true\n unique?: true\n hasMany?: true\n relationTo?: string | string[]\n options?: Array<{ label: string; value: string }>\n hidden?: true\n systemManaged?: true\n writable?: boolean\n fields?: CollectionFieldSchema[]\n}\n\nexport const collectionFieldSchema: z.ZodType<CollectionFieldSchema> = z.lazy(\n () =>\n z\n .object({\n name: z.string(),\n path: z.string(),\n type: z.string(),\n required: z.literal(true).optional(),\n unique: z.literal(true).optional(),\n hasMany: z.literal(true).optional(),\n relationTo: z.union([z.string(), z.array(z.string())]).optional(),\n options: z.array(collectionFieldOptionSchema).optional(),\n hidden: z.literal(true).optional(),\n systemManaged: z.literal(true).optional(),\n writable: z.boolean().optional(),\n fields: z.array(collectionFieldSchema).optional(),\n })\n .strict(),\n)\n\nexport const collectionSchemaResponseSchema = z\n .object({\n contractVersion: z.literal(COLLECTION_SCHEMA_CONTRACT_VERSION),\n mode: z.literal('effective'),\n collection: z\n .object({\n slug: z.string(),\n timestamps: z.boolean(),\n alwaysActive: z.boolean(),\n feature: z.string().nullable(),\n systemFields: z.array(z.string()),\n visibility: z\n .object({\n collectionHidden: z.boolean(),\n hiddenFields: z.array(z.string()),\n })\n .strict(),\n fields: z.array(collectionFieldSchema),\n })\n .strict(),\n })\n .strict()\n\nexport type TenantFieldConfigState = z.infer<\n typeof tenantFieldConfigStateSchema\n>\nexport type TenantContextQuery = z.input<typeof tenantContextQuerySchema>\nexport type TenantContextToolInput = z.infer<\n typeof tenantContextToolInputSchema\n>\nexport type TenantContextResponse = z.infer<typeof tenantContextResponseSchema>\nexport type TenantFeatureProgressFeature = z.infer<\n typeof tenantFeatureProgressFeatureSchema\n>\nexport type TenantFeatureProgressInput = z.infer<\n typeof tenantFeatureProgressInputSchema\n>\n/**\n * Raw feature-progress request input before schema defaults are applied.\n * `TenantFeatureProgressInput` is the parsed/effective shape.\n */\nexport type TenantFeatureProgressRequestInput = z.input<\n typeof tenantFeatureProgressInputSchema\n>\nexport type TenantFeatureProgressStatus = z.infer<\n typeof tenantFeatureProgressStatusSchema\n>\nexport type TenantFeatureProgressItemState = z.infer<\n typeof tenantFeatureProgressItemStateSchema\n>\nexport type TenantFeatureProgressSeverity = z.infer<\n typeof tenantFeatureProgressSeveritySchema\n>\nexport type TenantFeatureProgressEvidenceValue = z.infer<\n typeof tenantFeatureProgressEvidenceValueSchema\n>\nexport type TenantFeatureProgressItem = z.infer<\n typeof tenantFeatureProgressItemSchema\n>\nexport type TenantFeatureProgressGroup = z.infer<\n typeof tenantFeatureProgressGroupSchema\n>\nexport type TenantFeatureProgressResponse = z.infer<\n typeof tenantFeatureProgressResponseSchema\n>\nexport type CollectionSchemaEndpointParams = z.infer<\n typeof collectionSchemaEndpointParamsSchema\n>\nexport type CollectionFieldOption = z.infer<typeof collectionFieldOptionSchema>\nexport type CollectionSchemaResponse = z.infer<\n typeof collectionSchemaResponseSchema\n>\n","import { Command } from 'commander'\nimport {\n tenantFeatureProgressInputSchema,\n tenantFeatureProgressResponseSchema,\n type TenantFeatureProgressResponse,\n} from '@01.software/contracts'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseWithSchema } from '../lib/parse.js'\n\nfunction flattenProgress(progress: TenantFeatureProgressResponse) {\n return progress.groups.flatMap((group) =>\n group.items.map((item) => ({\n group: group.title,\n item: item.title,\n state: item.state,\n severity: item.severity,\n summary: item.summary,\n })),\n )\n}\n\nexport function registerFeatureCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const feature = program\n .command('feature')\n .description('Feature implementation progress checks')\n\n feature\n .command('check <feature>')\n .description('Check tenant implementation progress for a feature')\n .option('--evidence', 'Include sanitized evidence counts and surface flags')\n .action(async (featureName: string, options: { evidence?: boolean }) => {\n try {\n const input = parseWithSchema(\n {\n feature: featureName,\n includeEvidence: Boolean(options.evidence),\n },\n 'feature',\n tenantFeatureProgressInputSchema,\n )\n const client = getClient()\n const result = tenantFeatureProgressResponseSchema.parse(\n await client.tenant.featureProgress(input),\n )\n const format = getFormat()\n printResult(\n format === 'table' ? flattenProgress(result) : result,\n format,\n )\n } catch (error) {\n exitWithError(error)\n }\n })\n}\n","import { resolve, dirname } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { spawn } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport type { Command } from 'commander'\nimport { resolveClient } from '../lib/client.js'\nimport { exitWithError } from '../lib/output.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nexport interface StdioEntryCandidate {\n label: string\n path: string\n}\n\n/**\n * Locate the MCP stdio entry point.\n * Resolve order:\n * 1. Packaged MCP server copied into packages/cli/dist/mcp/stdio.js\n * 2. Monorepo MCP build output: apps/mcp/dist/stdio.js\n * 3. xmcp output: apps/mcp/.xmcp/stdio.js\n */\nexport function getStdioEntryCandidates(\n baseDir = __dirname,\n): StdioEntryCandidate[] {\n const candidates: StdioEntryCandidate[] = [\n {\n label: 'packaged CLI artifact',\n path: resolve(baseDir, 'mcp/stdio.js'),\n },\n ]\n const roots = ['../../../..', '../../..', '../..']\n const entries = [\n {\n label: 'monorepo build output',\n path: 'apps/mcp/dist/stdio.js',\n },\n {\n label: 'xmcp build output',\n path: 'apps/mcp/.xmcp/stdio.js',\n },\n ]\n\n for (const entry of entries) {\n for (const root of roots) {\n candidates.push({\n label: entry.label,\n path: resolve(baseDir, root, entry.path),\n })\n }\n }\n\n return candidates\n}\n\nexport function findStdioEntry(baseDir = __dirname): string | null {\n for (const candidate of getStdioEntryCandidates(baseDir)) {\n if (existsSync(candidate.path)) return candidate.path\n }\n\n return null\n}\n\nexport function formatMissingStdioEntryMessage(baseDir = __dirname): string {\n const checked = getStdioEntryCandidates(baseDir)\n .map((candidate) => ` - ${candidate.label}: ${candidate.path}`)\n .join('\\n')\n\n return [\n 'MCP stdio entry not found.',\n 'Checked:',\n checked,\n 'Fix:',\n ' - Monorepo checkout: run pnpm --filter mcp build.',\n ' - Published CLI: reinstall or update @01.software/cli so dist/mcp/stdio.js is included.',\n ].join('\\n')\n}\n\nexport function createMcpEnv(\n baseEnv: NodeJS.ProcessEnv,\n client: { publishableKey: string; secretKey: string },\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...baseEnv,\n SOFTWARE_PUBLISHABLE_KEY: client.publishableKey,\n SOFTWARE_SECRET_KEY: client.secretKey,\n }\n\n delete env.SOFTWARE_TENANT_ID\n\n return env\n}\n\nexport function registerMcpCommands(program: Command) {\n program\n .command('mcp')\n .description('Start local MCP stdio server for trusted server-key workflows')\n .addHelpText(\n 'after',\n `\nPrerequisites:\n Run 01 login, or set SOFTWARE_PUBLISHABLE_KEY and SOFTWARE_SECRET_KEY.\n Local stdio exposes the full MCP tool surface; HTTP OAuth MCP uses the\n narrower remote surface documented in the web integration guide.\n In a monorepo checkout, build the stdio artifact first:\n pnpm --filter mcp build\n`,\n )\n .action(() => {\n // 1. Validate credentials before spawning (exits with code 2 if missing)\n const client = resolveClient(program.opts().apiKey as string | undefined)\n\n // 2. Find stdio.js entry point\n const stdioEntry = findStdioEntry()\n if (!stdioEntry) {\n exitWithError(new Error(formatMissingStdioEntryMessage()))\n }\n\n // 3. Spawn stdio process (inherits env with SOFTWARE_PUBLISHABLE_KEY + SOFTWARE_SECRET_KEY)\n const child = spawn(process.execPath, [stdioEntry], {\n env: createMcpEnv(process.env, client),\n stdio: ['inherit', 'inherit', 'inherit'],\n })\n\n child.on('error', (err) => {\n exitWithError(new Error(`Failed to start MCP server: ${err.message}`))\n })\n\n child.on('exit', (code) => {\n process.exit(code ?? 0)\n })\n })\n}\n","import { Command, type CommanderError } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { isAgentPlanCollection } from '../lib/agent-plan-allowlist.js'\nimport { exitWithAgentError, printAgentSuccess } from '../lib/agent-output.js'\nimport { parseSelect, validateCollection } from '../lib/collections.js'\nimport { registerAgentPlanCommands } from './agent-plan.js'\n\nconst AGENT_PROTOCOL_VERSION = '1'\n\ntype AgentReadOperation = 'query' | 'get'\ntype AgentPlanOperationName = 'plan:create' | 'plan:update' | 'plan:delete'\ntype AgentOperation = AgentReadOperation | AgentPlanOperationName\n\ntype AgentFieldName = 'id' | 'createdAt' | 'updatedAt'\n\ninterface AgentFieldMetadata {\n type: 'string'\n queryable: boolean\n}\n\ntype AgentFieldMap = Record<AgentFieldName, AgentFieldMetadata>\n\nexport interface AgentManifest {\n version: typeof AGENT_PROTOCOL_VERSION\n collections: Record<\n (typeof COLLECTIONS)[number],\n {\n operations: readonly AgentOperation[]\n fields: AgentFieldMap\n }\n >\n}\n\nfunction buildStableAgentFields(): AgentFieldMap {\n return {\n id: { type: 'string', queryable: true },\n createdAt: { type: 'string', queryable: true },\n updatedAt: { type: 'string', queryable: true },\n }\n}\n\nfunction invalidInput(message: string, field: string, value?: unknown): Error {\n const error = new Error(message)\n Object.assign(error, {\n type: 'validation',\n code: 'invalid_argument',\n field,\n detail: { message, value, field },\n })\n return error\n}\n\nfunction parsePositiveInteger(\n value: string | undefined,\n field: 'limit' | 'page',\n): number | undefined {\n if (value == null) return undefined\n if (/^[1-9]\\d*$/.test(value)) return Number(value)\n throw invalidInput(`--${field} must be a positive integer`, field, value)\n}\n\nfunction handleCommanderError(error: CommanderError): never {\n if (error.code === 'commander.helpDisplayed') {\n process.exit(error.exitCode)\n }\n\n exitWithAgentError(invalidInput(error.message, 'command'))\n}\n\nfunction configureAgentParser(command: Command): Command {\n command.configureOutput({\n writeErr: () => {},\n writeOut: (str) => {\n process.stdout.write(str)\n },\n })\n command.exitOverride(handleCommanderError)\n return command\n}\n\nfunction parseWhere(\n value: string | undefined,\n): Record<string, unknown> | undefined {\n if (value == null) return undefined\n\n try {\n const parsed: unknown = JSON.parse(value)\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>\n }\n } catch {\n throw invalidInput('--where must be a JSON object', 'where', value)\n }\n\n throw invalidInput('--where must be a JSON object', 'where', value)\n}\n\nconst AGENT_READ_OPERATIONS = ['query', 'get'] as const satisfies readonly AgentReadOperation[]\nconst AGENT_PLAN_OPERATIONS = [\n 'plan:create',\n 'plan:update',\n 'plan:delete',\n] as const satisfies readonly AgentPlanOperationName[]\n\nexport function buildAgentManifest(): AgentManifest {\n const collections = {} as AgentManifest['collections']\n for (const collection of COLLECTIONS) {\n const operations: AgentOperation[] = isAgentPlanCollection(collection)\n ? [...AGENT_READ_OPERATIONS, ...AGENT_PLAN_OPERATIONS]\n : [...AGENT_READ_OPERATIONS]\n collections[collection] = {\n operations,\n fields: buildStableAgentFields(),\n }\n }\n\n return {\n version: AGENT_PROTOCOL_VERSION,\n collections,\n }\n}\n\nfunction validateAgentCollection(collection: string): (typeof COLLECTIONS)[number] {\n try {\n return validateCollection(collection)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : `Unknown collection \"${collection}\".`\n throw invalidInput(message, 'collection', collection)\n }\n}\n\nexport function registerAgentCommands(\n program: Command,\n getClient: () => ResolvedClient,\n): void {\n const agent = configureAgentParser(\n program\n .command('agent')\n .description('Machine-stable CLI namespace for coding agents')\n .addHelpText(\n 'after',\n '\\nContract: docs/agent-cli-contract.md\\nJSON only on stdout; no TTY effects.',\n ),\n )\n\n configureAgentParser(\n agent\n .command('manifest')\n .description('Print the Agent CLI protocol manifest')\n .option('--pretty', 'Print 2-space indented JSON')\n .action((opts: { pretty?: boolean }) => {\n printAgentSuccess(buildAgentManifest(), { pretty: Boolean(opts.pretty) })\n }),\n )\n\n configureAgentParser(\n agent\n .command('query <collection>')\n .description('Query documents from a collection')\n .option('--where <json>', 'Filter conditions as a JSON object')\n .option('--limit <n>', 'Max results')\n .option('--page <n>', 'Page number')\n .option('--sort <field>', 'Sort field; prefix with - for descending')\n .option('--select <fields>', 'Comma-separated fields to select')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n opts: {\n where?: string\n limit?: string\n page?: string\n sort?: string\n select?: string\n pretty?: boolean\n },\n ) => {\n try {\n const col = validateAgentCollection(collection)\n const options: Record<string, unknown> = {}\n const where = parseWhere(opts.where)\n const limit = parsePositiveInteger(opts.limit, 'limit')\n const page = parsePositiveInteger(opts.page, 'page')\n\n if (where) options.where = where\n if (limit != null) options.limit = limit\n if (page != null) options.page = page\n if (opts.sort) options.sort = opts.sort\n if (opts.select) options.select = parseSelect(opts.select)\n\n const client = getClient()\n const result = await client.collections.from(col).find(options)\n printAgentSuccess(result, { pretty: Boolean(opts.pretty) })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n\n configureAgentParser(\n agent\n .command('get <collection> [id]')\n .description('Get a document by ID')\n .option('--select <fields>', 'Comma-separated fields to select')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n id: string | undefined,\n opts: { select?: string; pretty?: boolean },\n ) => {\n try {\n const col = validateAgentCollection(collection)\n if (!id) {\n throw invalidInput('Missing required argument: id', 'id')\n }\n\n const options: Record<string, unknown> = {}\n if (opts.select) options.select = parseSelect(opts.select)\n\n const client = getClient()\n const result = await client.collections\n .from(col)\n .findById(id, options)\n printAgentSuccess(result, { pretty: Boolean(opts.pretty) })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n\n registerAgentPlanCommands(agent, getClient)\n}\n","import { classifyError } from './admin-error.js'\n\nexport type AgentErrorCode =\n | 'INVALID_INPUT'\n | 'AUTH_FAILED'\n | 'NOT_FOUND'\n | 'INTERNAL'\n | 'PLAN_EXPIRED'\n | 'PLAN_MISMATCH'\n | 'PLAN_STALE'\n | 'UNSUPPORTED_OPERATION'\n\nconst PLAN_AGENT_ERROR_CODES: ReadonlySet<AgentErrorCode> = new Set([\n 'PLAN_EXPIRED',\n 'PLAN_MISMATCH',\n 'PLAN_STALE',\n 'UNSUPPORTED_OPERATION',\n])\n\nexport function agentPlanError(\n code:\n | 'PLAN_EXPIRED'\n | 'PLAN_MISMATCH'\n | 'PLAN_STALE'\n | 'UNSUPPORTED_OPERATION'\n | 'INVALID_INPUT',\n message: string,\n): Error {\n const error = new Error(message)\n Object.assign(error, {\n type: 'validation',\n code: code.toLowerCase(),\n agentCode: code,\n detail: { message, agentCode: code },\n })\n return error\n}\n\nexport interface AgentErrorEnvelope {\n error: {\n code: AgentErrorCode\n message: string\n }\n}\n\nexport interface AgentPrintOptions {\n pretty?: boolean\n}\n\nfunction stringifyAgentJson(\n data: unknown,\n options: AgentPrintOptions = {},\n): string {\n return options.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data)\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object'\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction errorMessage(error: unknown): string {\n const raw = asRecord(error)\n if (raw) {\n if (typeof raw.message === 'string' && raw.message.length > 0) {\n return raw.message\n }\n if (\n raw.detail &&\n typeof raw.detail === 'object' &&\n typeof (raw.detail as Record<string, unknown>).message === 'string'\n ) {\n return String((raw.detail as Record<string, unknown>).message)\n }\n }\n if (error instanceof Error && error.message.length > 0) {\n return error.message\n }\n if (typeof error === 'string' && error.length > 0) {\n return error\n }\n return 'Internal error'\n}\n\nfunction isRawNotFound(error: unknown): boolean {\n const raw = asRecord(error)\n return (\n raw?.status === 404 ||\n raw?.code === 'not_found' ||\n raw?.name === 'GoneError'\n )\n}\n\nexport function agentErrorExitCode(code: AgentErrorCode): number {\n switch (code) {\n case 'INVALID_INPUT':\n case 'PLAN_EXPIRED':\n case 'PLAN_MISMATCH':\n case 'PLAN_STALE':\n case 'UNSUPPORTED_OPERATION':\n return 2\n case 'AUTH_FAILED':\n return 3\n case 'NOT_FOUND':\n return 4\n case 'INTERNAL':\n return 1\n }\n}\n\nexport function classifyAgentError(error: unknown): AgentErrorEnvelope {\n const raw = asRecord(error)\n const message = errorMessage(error)\n const detail = raw?.detail\n const detailRecord =\n detail && typeof detail === 'object'\n ? (detail as Record<string, unknown>)\n : null\n const agentCode = raw?.agentCode ?? detailRecord?.agentCode\n if (\n typeof agentCode === 'string' &&\n PLAN_AGENT_ERROR_CODES.has(agentCode as AgentErrorCode)\n ) {\n return { error: { code: agentCode as AgentErrorCode, message } }\n }\n\n const adminError = classifyError(error)\n\n if (isRawNotFound(error) || adminError.code === 'not_found') {\n return { error: { code: 'NOT_FOUND', message } }\n }\n\n if (adminError.type === 'permission') {\n return { error: { code: 'AUTH_FAILED', message } }\n }\n\n if (adminError.type === 'validation' && adminError.code !== 'unknown') {\n return { error: { code: 'INVALID_INPUT', message } }\n }\n\n return { error: { code: 'INTERNAL', message } }\n}\n\nexport function printAgentSuccess(\n data: unknown,\n options: AgentPrintOptions = {},\n): void {\n console.log(stringifyAgentJson(data, options))\n}\n\nexport function printAgentError(\n error: unknown,\n options: AgentPrintOptions = {},\n): AgentErrorEnvelope {\n const envelope = classifyAgentError(error)\n console.log(stringifyAgentJson(envelope, options))\n return envelope\n}\n\nexport function exitWithAgentError(\n error: unknown,\n options: AgentPrintOptions = {},\n): never {\n const envelope = printAgentError(error, options)\n process.exit(agentErrorExitCode(envelope.error.code))\n}\n","import { agentPlanError } from './agent-output.js'\n\nexport const AGENT_PLAN_COLLECTIONS = [\n 'articles',\n 'article-categories',\n 'article-tags',\n 'links',\n 'link-categories',\n 'link-tags',\n] as const\n\nexport type AgentPlanCollection = (typeof AGENT_PLAN_COLLECTIONS)[number]\nexport type AgentPlanOperation = 'create' | 'update' | 'delete'\n\nconst AGENT_PLAN_COLLECTION_SET = new Set<string>(AGENT_PLAN_COLLECTIONS)\n\nexport function isAgentPlanCollection(\n collection: string,\n): collection is AgentPlanCollection {\n return AGENT_PLAN_COLLECTION_SET.has(collection)\n}\n\nexport function assertAgentPlanCollection(collection: string): AgentPlanCollection {\n if (isAgentPlanCollection(collection)) {\n return collection\n }\n throw agentPlanError(\n 'UNSUPPORTED_OPERATION',\n `Collection \"${collection}\" is not supported for agent plan mutations.`,\n )\n}\n\nexport function assertAgentPlanOperation(\n operation: string,\n): AgentPlanOperation {\n if (operation === 'create' || operation === 'update' || operation === 'delete') {\n return operation\n }\n throw agentPlanError(\n 'UNSUPPORTED_OPERATION',\n `Operation \"${operation}\" is not supported for agent plan mutations.`,\n )\n}\n","import { createHash } from 'node:crypto'\n\nexport function buildAuthContextFingerprint(input: {\n publishableKey: string\n secretKey: string\n apiUrl?: string\n tenantId?: string\n}): string {\n const apiUrl =\n input.apiUrl ??\n process.env.SOFTWARE_API_URL ??\n process.env.NEXT_PUBLIC_SOFTWARE_API_URL ??\n ''\n const tenantId = input.tenantId ?? process.env.SOFTWARE_TENANT_ID ?? ''\n const secretDigest = createHash('sha256').update(input.secretKey).digest('hex')\n const material = [input.publishableKey, secretDigest, apiUrl, tenantId].join('\\n')\n return createHash('sha256').update(material).digest('hex')\n}\n","import { mkdir, open, readFile, unlink, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport {\n isAgentPlanCollection,\n type AgentPlanCollection,\n type AgentPlanOperation,\n} from './agent-plan-allowlist.js'\nimport { hashAgentPlanEnvelope } from './agent-plan-hash.js'\nimport { assertValidPlanId, safePlanPath } from './agent-plan-id.js'\nimport { agentPlanError } from './agent-output.js'\n\nexport const AGENT_PLAN_TTL_MS = 15 * 60 * 1000\n\nexport type AgentPlanStatus = 'pending' | 'claimed' | 'consumed'\n\nexport interface StoredAgentPlan {\n planId: string\n planHash: string\n operation: AgentPlanOperation\n collection: AgentPlanCollection\n documentId?: string\n payload?: Record<string, unknown>\n baseUpdatedAt?: string\n authFingerprint: string\n createdAt: string\n expiresAt: string\n status: AgentPlanStatus\n}\n\nexport function resolveAgentPlanDir(): string {\n const override = process.env.SOFTWARE_AGENT_PLAN_DIR?.trim()\n if (override) {\n return override\n }\n return join(homedir(), '.01software', 'agent-plans')\n}\n\nfunction parseExpiresAtMs(expiresAt: string): number {\n const ms = Date.parse(expiresAt)\n if (!Number.isFinite(ms)) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan has invalid expiresAt.')\n }\n return ms\n}\n\nfunction parseStoredAgentPlan(raw: unknown, planId: string): StoredAgentPlan {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan is corrupted.')\n }\n const record = raw as Record<string, unknown>\n if (record.planId !== planId) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan id does not match token.')\n }\n if (\n typeof record.planHash !== 'string' ||\n typeof record.operation !== 'string' ||\n typeof record.collection !== 'string' ||\n typeof record.authFingerprint !== 'string' ||\n typeof record.createdAt !== 'string' ||\n typeof record.expiresAt !== 'string' ||\n typeof record.status !== 'string'\n ) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan is missing required fields.')\n }\n if (\n record.status !== 'pending' &&\n record.status !== 'claimed' &&\n record.status !== 'consumed'\n ) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan has invalid status.')\n }\n\n if (!isAgentPlanCollection(record.collection)) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan has unsupported collection.')\n }\n const collection = record.collection\n const operation = record.operation\n if (operation !== 'create' && operation !== 'update' && operation !== 'delete') {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan has invalid operation.')\n }\n\n const payload =\n record.payload == null\n ? undefined\n : typeof record.payload === 'object' && !Array.isArray(record.payload)\n ? (record.payload as Record<string, unknown>)\n : (() => {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan payload is invalid.')\n })()\n\n const documentId =\n record.documentId == null\n ? undefined\n : typeof record.documentId === 'string'\n ? record.documentId\n : (() => {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan documentId is invalid.')\n })()\n\n const baseUpdatedAt =\n record.baseUpdatedAt == null\n ? undefined\n : typeof record.baseUpdatedAt === 'string'\n ? record.baseUpdatedAt\n : (() => {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan baseUpdatedAt is invalid.')\n })()\n\n return {\n planId,\n planHash: record.planHash,\n operation,\n collection,\n documentId,\n payload,\n baseUpdatedAt,\n authFingerprint: record.authFingerprint,\n createdAt: record.createdAt,\n expiresAt: record.expiresAt,\n status: record.status,\n }\n}\n\nexport function assertStoredPlanHashMatches(plan: StoredAgentPlan): void {\n const expected = hashAgentPlanEnvelope({\n operation: plan.operation,\n collection: plan.collection,\n documentId: plan.documentId,\n payload: plan.payload,\n })\n if (plan.planHash !== expected) {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan hash does not match plan contents.')\n }\n}\n\nfunction assertPlanNotExpired(plan: StoredAgentPlan): void {\n if (Date.now() > parseExpiresAtMs(plan.expiresAt)) {\n throw agentPlanError('PLAN_EXPIRED', 'Plan expired.')\n }\n}\n\nasync function readAgentPlanFile(\n planDir: string,\n planId: string,\n): Promise<StoredAgentPlan> {\n assertValidPlanId(planId)\n let raw: string\n try {\n raw = await readFile(safePlanPath(planDir, planId), 'utf8')\n } catch {\n throw agentPlanError('PLAN_MISMATCH', 'Plan not found.')\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw agentPlanError('PLAN_MISMATCH', 'Stored plan is corrupted.')\n }\n\n return parseStoredAgentPlan(parsed, planId)\n}\n\nasync function writeAgentPlanFile(\n planDir: string,\n plan: StoredAgentPlan,\n): Promise<void> {\n await writeFile(safePlanPath(planDir, plan.planId), JSON.stringify(plan), {\n encoding: 'utf8',\n mode: 0o600,\n })\n}\n\nexport async function writeAgentPlan(input: {\n planDir: string\n record: Omit<StoredAgentPlan, 'planId' | 'status'> & { planId?: string }\n}): Promise<StoredAgentPlan> {\n await mkdir(input.planDir, { recursive: true, mode: 0o700 })\n const planId = input.record.planId ?? randomUUID()\n assertValidPlanId(planId)\n const plan: StoredAgentPlan = {\n ...input.record,\n planId,\n status: 'pending',\n }\n assertStoredPlanHashMatches(plan)\n await writeAgentPlanFile(input.planDir, plan)\n return plan\n}\n\nexport async function claimAgentPlan(input: {\n planDir: string\n planId: string\n planHash: string\n authFingerprint: string\n}): Promise<StoredAgentPlan> {\n assertValidPlanId(input.planId)\n const planPath = safePlanPath(input.planDir, input.planId)\n const lockPath = `${planPath}.lock`\n let lockHandle: Awaited<ReturnType<typeof open>> | undefined\n\n try {\n lockHandle = await open(lockPath, 'wx', 0o600)\n } catch {\n throw agentPlanError('PLAN_MISMATCH', 'Plan was already claimed or consumed.')\n }\n\n try {\n const plan = await readAgentPlanFile(input.planDir, input.planId)\n assertPlanNotExpired(plan)\n assertStoredPlanHashMatches(plan)\n\n if (plan.planHash !== input.planHash) {\n throw agentPlanError('PLAN_MISMATCH', 'Plan hash does not match stored plan.')\n }\n\n if (plan.authFingerprint !== input.authFingerprint) {\n throw agentPlanError(\n 'PLAN_MISMATCH',\n 'Plan auth context does not match current credentials.',\n )\n }\n\n if (plan.status !== 'pending') {\n throw agentPlanError('PLAN_MISMATCH', 'Plan was already claimed or consumed.')\n }\n\n const claimed: StoredAgentPlan = { ...plan, status: 'claimed' }\n await writeAgentPlanFile(input.planDir, claimed)\n return claimed\n } finally {\n if (lockHandle) {\n await lockHandle.close().catch(() => {})\n }\n await unlink(lockPath).catch(() => {})\n }\n}\n\nexport async function releaseAgentPlanClaim(input: {\n planDir: string\n planId: string\n}): Promise<void> {\n const plan = await readAgentPlanFile(input.planDir, input.planId)\n if (plan.status !== 'claimed') {\n return\n }\n await writeAgentPlanFile(input.planDir, { ...plan, status: 'pending' })\n}\n\nexport async function markAgentPlanConsumed(input: {\n planDir: string\n planId: string\n}): Promise<void> {\n const plan = await readAgentPlanFile(input.planDir, input.planId)\n await writeAgentPlanFile(input.planDir, { ...plan, status: 'consumed' })\n}\n","import { createHash } from 'node:crypto'\nimport type {\n AgentPlanCollection,\n AgentPlanOperation,\n} from './agent-plan-allowlist.js'\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortKeys)\n }\n if (value && typeof value === 'object') {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeys((value as Record<string, unknown>)[key])\n return acc\n }, {})\n }\n return value\n}\n\nexport function hashPlanPayload(payload: unknown): string {\n const canonical = JSON.stringify(sortKeys(payload))\n return createHash('sha256').update(canonical).digest('hex')\n}\n\nexport interface AgentPlanHashInput {\n operation: AgentPlanOperation\n collection: AgentPlanCollection\n documentId?: string\n payload?: Record<string, unknown>\n}\n\nexport function hashAgentPlanEnvelope(input: AgentPlanHashInput): string {\n return hashPlanPayload({\n operation: input.operation,\n collection: input.collection,\n documentId: input.documentId,\n payload: input.payload,\n })\n}\n","import { resolve, sep } from 'node:path'\nimport { agentPlanError } from './agent-output.js'\n\nconst PLAN_ID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\nexport function assertValidPlanId(planId: string): void {\n if (!PLAN_ID_PATTERN.test(planId)) {\n throw agentPlanError('INVALID_INPUT', 'Invalid plan token.')\n }\n}\n\nexport function safePlanPath(planDir: string, planId: string): string {\n assertValidPlanId(planId)\n const resolvedDir = resolve(planDir)\n const resolvedPath = resolve(resolvedDir, `${planId}.json`)\n if (\n resolvedPath !== resolvedDir &&\n !resolvedPath.startsWith(`${resolvedDir}${sep}`)\n ) {\n throw agentPlanError('INVALID_INPUT', 'Invalid plan token.')\n }\n return resolvedPath\n}\n","import type { AgentPlanOperation } from './agent-plan-allowlist.js'\nimport { agentPlanError } from './agent-output.js'\n\nexport function readDocumentUpdatedAt(doc: unknown): string | undefined {\n if (!doc || typeof doc !== 'object') {\n return undefined\n }\n const updatedAt = (doc as Record<string, unknown>).updatedAt\n return typeof updatedAt === 'string' && updatedAt.length > 0\n ? updatedAt\n : undefined\n}\n\nexport function assertPlanBaseUpdatedAt(\n operation: AgentPlanOperation,\n baseUpdatedAt: string | undefined,\n): void {\n if (operation === 'create') {\n return\n }\n if (!baseUpdatedAt) {\n throw agentPlanError(\n 'INVALID_INPUT',\n 'Document is missing updatedAt; cannot plan update or delete.',\n )\n }\n}\n\nexport async function assertPlanNotStale(input: {\n operation: AgentPlanOperation\n baseUpdatedAt?: string\n currentUpdatedAt?: string\n}): Promise<void> {\n if (input.operation === 'create') {\n return\n }\n if (!input.baseUpdatedAt || !input.currentUpdatedAt) {\n throw agentPlanError(\n 'PLAN_STALE',\n 'Document is missing updatedAt for stale check.',\n )\n }\n if (input.baseUpdatedAt !== input.currentUpdatedAt) {\n throw agentPlanError(\n 'PLAN_STALE',\n 'Document changed since the plan was created.',\n )\n }\n}\n","import type { ResolvedClient } from './client.js'\nimport { agentPlanError } from './agent-output.js'\nimport type { StoredAgentPlan } from './agent-plan-store.js'\nimport {\n markAgentPlanConsumed,\n resolveAgentPlanDir,\n} from './agent-plan-store.js'\nimport {\n assertPlanNotStale,\n readDocumentUpdatedAt,\n} from './agent-plan-stale.js'\n\nexport async function executeAgentPlanMutation(\n client: ResolvedClient,\n plan: StoredAgentPlan,\n): Promise<unknown> {\n const collection = client.collections.from(plan.collection)\n\n if (plan.operation === 'create') {\n const response = await collection.create(plan.payload ?? {})\n return response.doc\n }\n\n if (!plan.documentId) {\n throw agentPlanError('PLAN_MISMATCH', 'Plan is missing document id.')\n }\n\n if (plan.operation === 'update') {\n const current = await collection.findById(plan.documentId)\n await assertPlanNotStale({\n operation: plan.operation,\n baseUpdatedAt: plan.baseUpdatedAt,\n currentUpdatedAt: readDocumentUpdatedAt(current),\n })\n const response = await collection.update(plan.documentId, plan.payload ?? {})\n return response.doc\n }\n\n const current = await collection.findById(plan.documentId)\n await assertPlanNotStale({\n operation: plan.operation,\n baseUpdatedAt: plan.baseUpdatedAt,\n currentUpdatedAt: readDocumentUpdatedAt(current),\n })\n return collection.remove(plan.documentId)\n}\n\nexport async function finalizeAgentPlan(plan: StoredAgentPlan): Promise<void> {\n await markAgentPlanConsumed({\n planDir: resolveAgentPlanDir(),\n planId: plan.planId,\n })\n}\n","import { readFileSync } from 'node:fs'\nimport { stdin } from 'node:process'\nimport { agentPlanError } from './agent-output.js'\n\nasync function readStdinUtf8(): Promise<string> {\n const chunks: Buffer[] = []\n for await (const chunk of stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n return Buffer.concat(chunks).toString('utf8')\n}\n\nexport async function readAgentPlanPayload(opts: {\n dataStdin?: boolean\n dataFile?: string\n}): Promise<Record<string, unknown>> {\n const sourceCount = [opts.dataStdin, opts.dataFile].filter(Boolean).length\n if (sourceCount !== 1) {\n throw agentPlanError(\n 'INVALID_INPUT',\n 'Exactly one of --data-stdin or --data-file is required.',\n )\n }\n\n let raw: string\n try {\n raw = opts.dataStdin\n ? await readStdinUtf8()\n : readFileSync(opts.dataFile!, 'utf8')\n } catch {\n throw agentPlanError(\n 'INVALID_INPUT',\n 'Mutation data file could not be read.',\n )\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw agentPlanError('INVALID_INPUT', 'Mutation data must be valid JSON.')\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw agentPlanError('INVALID_INPUT', 'Mutation data must be a JSON object.')\n }\n\n return parsed as Record<string, unknown>\n}\n","import { agentPlanError } from './agent-output.js'\n\nconst SECRET_KEY =\n /(?:^|_)(?:secret|password|token|api[_-]?key|private[_-]?key|credential)(?:$|_)/i\n\nfunction isSecretFieldName(key: string): boolean {\n if (SECRET_KEY.test(key)) {\n return true\n }\n const snake = key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()\n return SECRET_KEY.test(snake)\n}\n\nexport function assertNoSecretFields(value: unknown, path = ''): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n assertNoSecretFields(item, `${path}[${index}]`)\n })\n return\n }\n\n if (!value || typeof value !== 'object') {\n return\n }\n\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const fieldPath = path ? `${path}.${key}` : key\n if (isSecretFieldName(key)) {\n throw agentPlanError(\n 'INVALID_INPUT',\n `Secret-looking field \"${fieldPath}\" is not allowed in agent mutation payloads.`,\n )\n }\n assertNoSecretFields(child, fieldPath)\n }\n}\n","import { assertValidPlanId } from './agent-plan-id.js'\nimport { agentPlanError } from './agent-output.js'\n\nexport interface AgentPlanToken {\n planId: string\n planHash: string\n expiresAt: string\n}\n\nexport function encodePlanToken(token: AgentPlanToken): string {\n return Buffer.from(JSON.stringify(token), 'utf8').toString('base64url')\n}\n\nexport function decodePlanToken(raw: string): AgentPlanToken {\n try {\n const parsed: unknown = JSON.parse(\n Buffer.from(raw, 'base64url').toString('utf8'),\n )\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('invalid token')\n }\n const record = parsed as Record<string, unknown>\n if (\n typeof record.planId !== 'string' ||\n typeof record.planHash !== 'string' ||\n typeof record.expiresAt !== 'string'\n ) {\n throw new Error('invalid token fields')\n }\n assertValidPlanId(record.planId)\n return {\n planId: record.planId,\n planHash: record.planHash,\n expiresAt: record.expiresAt,\n }\n } catch {\n throw agentPlanError('INVALID_INPUT', 'Invalid plan token.')\n }\n}\n\nexport function buildConfirmCommand(planToken: string, planHash: string): string {\n return `01 agent confirm ${planToken} --hash ${planHash}`\n}\n","import { Command, type CommanderError } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport {\n assertAgentPlanCollection,\n type AgentPlanOperation,\n} from '../lib/agent-plan-allowlist.js'\nimport { buildAuthContextFingerprint } from '../lib/agent-plan-auth.js'\nimport {\n executeAgentPlanMutation,\n finalizeAgentPlan,\n} from '../lib/agent-plan-confirm.js'\nimport { hashAgentPlanEnvelope } from '../lib/agent-plan-hash.js'\nimport { readAgentPlanPayload } from '../lib/agent-plan-payload.js'\nimport { assertNoSecretFields } from '../lib/agent-plan-secrets.js'\nimport {\n AGENT_PLAN_TTL_MS,\n claimAgentPlan,\n releaseAgentPlanClaim,\n resolveAgentPlanDir,\n writeAgentPlan,\n} from '../lib/agent-plan-store.js'\nimport {\n assertPlanBaseUpdatedAt,\n readDocumentUpdatedAt,\n} from '../lib/agent-plan-stale.js'\nimport {\n buildConfirmCommand,\n decodePlanToken,\n encodePlanToken,\n} from '../lib/agent-plan-token.js'\nimport {\n agentPlanError,\n exitWithAgentError,\n printAgentSuccess,\n} from '../lib/agent-output.js'\n\nfunction invalidInput(message: string, field: string): Error {\n const error = new Error(message)\n Object.assign(error, {\n type: 'validation',\n code: 'invalid_argument',\n field,\n detail: { message, field },\n })\n return error\n}\n\nfunction handleCommanderError(error: CommanderError): never {\n if (error.code === 'commander.helpDisplayed') {\n process.exit(error.exitCode)\n }\n exitWithAgentError(invalidInput(error.message, 'command'))\n}\n\nfunction configureAgentParser(command: Command): Command {\n command.configureOutput({\n writeErr: () => {},\n writeOut: (str) => {\n process.stdout.write(str)\n },\n })\n command.exitOverride(handleCommanderError)\n return command\n}\n\nasync function captureBaseUpdatedAt(\n client: ResolvedClient,\n collection: ReturnType<typeof assertAgentPlanCollection>,\n documentId: string,\n): Promise<string | undefined> {\n const doc = await client.collections.from(collection).findById(documentId)\n return readDocumentUpdatedAt(doc)\n}\n\nasync function runPlanAction(input: {\n operation: AgentPlanOperation\n collection: string\n documentId?: string\n dataStdin?: boolean\n dataFile?: string\n pretty?: boolean\n getClient: () => ResolvedClient\n}): Promise<void> {\n const collection = assertAgentPlanCollection(input.collection)\n\n if (input.operation !== 'create' && !input.documentId) {\n throw invalidInput('Missing required argument: id', 'id')\n }\n\n let payload: Record<string, unknown> | undefined\n if (input.operation === 'create' || input.operation === 'update') {\n payload = await readAgentPlanPayload({\n dataStdin: input.dataStdin,\n dataFile: input.dataFile,\n })\n assertNoSecretFields(payload)\n }\n\n const client = input.getClient()\n const authFingerprint = buildAuthContextFingerprint({\n publishableKey: client.publishableKey,\n secretKey: client.secretKey,\n })\n\n let baseUpdatedAt: string | undefined\n if (input.operation !== 'create' && input.documentId) {\n baseUpdatedAt = await captureBaseUpdatedAt(\n client,\n collection,\n input.documentId,\n )\n assertPlanBaseUpdatedAt(input.operation, baseUpdatedAt)\n }\n\n const planHash = hashAgentPlanEnvelope({\n operation: input.operation,\n collection,\n documentId: input.documentId,\n payload,\n })\n\n const createdAt = new Date()\n const expiresAt = new Date(createdAt.getTime() + AGENT_PLAN_TTL_MS)\n\n const stored = await writeAgentPlan({\n planDir: resolveAgentPlanDir(),\n record: {\n planHash,\n operation: input.operation,\n collection,\n documentId: input.documentId,\n payload,\n baseUpdatedAt,\n authFingerprint,\n createdAt: createdAt.toISOString(),\n expiresAt: expiresAt.toISOString(),\n },\n })\n\n const planToken = encodePlanToken({\n planId: stored.planId,\n planHash: stored.planHash,\n expiresAt: stored.expiresAt,\n })\n\n printAgentSuccess(\n {\n planToken,\n planHash: stored.planHash,\n planId: stored.planId,\n expiresAt: stored.expiresAt,\n operation: stored.operation,\n collection: stored.collection,\n documentId: stored.documentId,\n confirmCommand: buildConfirmCommand(planToken, stored.planHash),\n },\n { pretty: Boolean(input.pretty) },\n )\n}\n\nexport function registerAgentPlanCommands(\n agent: Command,\n getClient: () => ResolvedClient,\n): void {\n const plan = configureAgentParser(\n agent.command('plan').description('Plan a mutation without executing'),\n )\n\n configureAgentParser(\n plan\n .command('create <collection>')\n .description('Plan a document create')\n .option('--data-stdin', 'Read mutation JSON from stdin')\n .option('--data-file <path>', 'Read mutation JSON from file')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n opts: { dataStdin?: boolean; dataFile?: string; pretty?: boolean },\n ) => {\n try {\n await runPlanAction({\n operation: 'create',\n collection,\n dataStdin: opts.dataStdin,\n dataFile: opts.dataFile,\n pretty: opts.pretty,\n getClient,\n })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n\n configureAgentParser(\n plan\n .command('update <collection> <id>')\n .description('Plan a document update')\n .option('--data-stdin', 'Read mutation JSON from stdin')\n .option('--data-file <path>', 'Read mutation JSON from file')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n id: string,\n opts: { dataStdin?: boolean; dataFile?: string; pretty?: boolean },\n ) => {\n try {\n await runPlanAction({\n operation: 'update',\n collection,\n documentId: id,\n dataStdin: opts.dataStdin,\n dataFile: opts.dataFile,\n pretty: opts.pretty,\n getClient,\n })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n\n configureAgentParser(\n plan\n .command('delete <collection> <id>')\n .description('Plan a document delete')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n collection: string,\n id: string,\n opts: { pretty?: boolean },\n ) => {\n try {\n await runPlanAction({\n operation: 'delete',\n collection,\n documentId: id,\n pretty: opts.pretty,\n getClient,\n })\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n\n configureAgentParser(\n agent\n .command('confirm <planToken>')\n .description('Execute a previously planned mutation')\n .requiredOption('--hash <planHash>', 'Plan hash from plan output')\n .option('--pretty', 'Print 2-space indented JSON')\n .action(\n async (\n planTokenRaw: string,\n opts: { hash: string; pretty?: boolean },\n ) => {\n try {\n const token = decodePlanToken(planTokenRaw)\n if (token.planHash !== opts.hash) {\n throw agentPlanError(\n 'PLAN_MISMATCH',\n 'Plan token does not match --hash.',\n )\n }\n\n const client = getClient()\n const authFingerprint = buildAuthContextFingerprint({\n publishableKey: client.publishableKey,\n secretKey: client.secretKey,\n })\n\n const planDir = resolveAgentPlanDir()\n const plan = await claimAgentPlan({\n planDir,\n planId: token.planId,\n planHash: opts.hash,\n authFingerprint,\n })\n\n if (token.planId !== plan.planId) {\n throw agentPlanError(\n 'PLAN_MISMATCH',\n 'Plan token does not match stored plan.',\n )\n }\n\n let doc: unknown\n try {\n doc = await executeAgentPlanMutation(client, plan)\n } catch (mutationError) {\n await releaseAgentPlanClaim({\n planDir,\n planId: plan.planId,\n }).catch(() => {})\n throw mutationError\n }\n\n await finalizeAgentPlan(plan)\n\n printAgentSuccess(\n {\n applied: true,\n operation: plan.operation,\n collection: plan.collection,\n id:\n doc && typeof doc === 'object' && 'id' in doc\n ? String((doc as Record<string, unknown>).id)\n : plan.documentId,\n doc,\n },\n { pretty: Boolean(opts.pretty) },\n )\n } catch (error) {\n exitWithAgentError(error, { pretty: Boolean(opts.pretty) })\n }\n },\n ),\n )\n}\n"],"mappings":"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","names":["t","readFileSync","readFileSync","program","getClient","getFormat","program","getClient","getFormat","order","z","idSchema","z","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","pc","pc","t","resolve","program","COLLECTIONS","program","getClient","getFormat","COLLECTIONS","z","z","program","getClient","getFormat","existsSync","existsSync","program","COLLECTIONS","homedir","join","createHash","resolve","resolve","join","homedir","current","readFileSync","readFileSync","getClient","plan","invalidInput","handleCommanderError","configureAgentParser","COLLECTIONS","program","getClient","require"]}