@vm0/cli 9.244.8 → 9.245.0
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/{agent-QLXX4WY7.js → agent-VZXA6XR3.js} +6 -5
- package/{agent-QLXX4WY7.js.map → agent-VZXA6XR3.js.map} +1 -1
- package/{banking-WY3J5BTJ.js → banking-QOV2GZE6.js} +4 -3
- package/{banking-WY3J5BTJ.js.map → banking-QOV2GZE6.js.map} +1 -1
- package/{chat-L3EFI2XJ.js → chat-7PONFLUP.js} +5 -4
- package/{chat-L3EFI2XJ.js.map → chat-7PONFLUP.js.map} +1 -1
- package/{chunk-MX32FFQR.js → chunk-5XVBOER3.js} +60 -506
- package/chunk-5XVBOER3.js.map +1 -0
- package/{chunk-65MTNZ44.js → chunk-6P7XBY46.js} +767 -1217
- package/chunk-6P7XBY46.js.map +1 -0
- package/{chunk-43PGP5OI.js → chunk-ARENVRJY.js} +4 -4
- package/{chunk-JVIFZRZ7.js → chunk-DE4HMRSU.js} +3 -3
- package/{chunk-TTP663DN.js → chunk-FVYB5CBP.js} +2 -2
- package/chunk-HOIDOML4.js +678 -0
- package/chunk-HOIDOML4.js.map +1 -0
- package/{chunk-KMLBXZVR.js → chunk-VN4PPSXU.js} +2 -2
- package/{chunk-MA37R4QS.js → chunk-XYZN3XWH.js} +3 -665
- package/chunk-XYZN3XWH.js.map +1 -0
- package/{chunk-LHR5Z775.js → chunk-YSVL5RAP.js} +2 -2
- package/{chunk-WCRXAO2G.js → chunk-ZXCF4ARW.js} +2 -2
- package/{computer-use-7FYLJXZS.js → computer-use-Y54YFGNC.js} +4 -3
- package/{computer-use-7FYLJXZS.js.map → computer-use-Y54YFGNC.js.map} +1 -1
- package/{connector-BSBQIFMQ.js → connector-2PAPMRZG.js} +7 -6
- package/{connector-BSBQIFMQ.js.map → connector-2PAPMRZG.js.map} +1 -1
- package/{credit-JBFJY5US.js → credit-PX6354BA.js} +5 -4
- package/{credit-JBFJY5US.js.map → credit-PX6354BA.js.map} +1 -1
- package/{developer-support-RUWSZBFP.js → developer-support-R5K6XKFG.js} +4 -3
- package/{developer-support-RUWSZBFP.js.map → developer-support-R5K6XKFG.js.map} +1 -1
- package/{doctor-YLD526OE.js → doctor-JNHZPFHW.js} +4 -3
- package/{doctor-YLD526OE.js.map → doctor-JNHZPFHW.js.map} +1 -1
- package/{generate-5EMJ3PE6.js → generate-TY4LZA3R.js} +10 -8
- package/{generate-5EMJ3PE6.js.map → generate-TY4LZA3R.js.map} +1 -1
- package/{github-36XCAIUP.js → github-UHTFPDZJ.js} +4 -3
- package/{github-36XCAIUP.js.map → github-UHTFPDZJ.js.map} +1 -1
- package/{goal-FRXLYRUG.js → goal-CKBOG76D.js} +4 -3
- package/{goal-FRXLYRUG.js.map → goal-CKBOG76D.js.map} +1 -1
- package/{host-X2KS3WTS.js → host-HAVFML26.js} +28 -7
- package/host-HAVFML26.js.map +1 -0
- package/index.js +4 -715
- package/index.js.map +1 -1
- package/{logs-WHQES7BY.js → logs-OXZZHIMA.js} +13 -14
- package/logs-OXZZHIMA.js.map +1 -0
- package/{mail-LOXCIZZN.js → mail-QCU47LFX.js} +6 -5
- package/{mail-LOXCIZZN.js.map → mail-QCU47LFX.js.map} +1 -1
- package/{maps-KQWCQLHW.js → maps-F3YPBNGC.js} +4 -3
- package/{maps-KQWCQLHW.js.map → maps-F3YPBNGC.js.map} +1 -1
- package/{model-2BBROTMX.js → model-5CYADUCZ.js} +5 -4
- package/{model-2BBROTMX.js.map → model-5CYADUCZ.js.map} +1 -1
- package/{model-provider-BOMTZ6JA.js → model-provider-676BK2JF.js} +5 -4
- package/{model-provider-BOMTZ6JA.js.map → model-provider-676BK2JF.js.map} +1 -1
- package/{org-SO7ELOV6.js → org-M637OTRU.js} +4 -3
- package/{org-SO7ELOV6.js.map → org-M637OTRU.js.map} +1 -1
- package/package.json +1 -1
- package/{phone-IYUG3RGY.js → phone-WBFLXP4V.js} +4 -3
- package/{phone-IYUG3RGY.js.map → phone-WBFLXP4V.js.map} +1 -1
- package/{preference-TGBWXIP7.js → preference-5AVRP7UU.js} +4 -3
- package/{preference-TGBWXIP7.js.map → preference-5AVRP7UU.js.map} +1 -1
- package/{resource-EA5OUVG4.js → resource-N6ADJPCL.js} +4 -3
- package/{resource-EA5OUVG4.js.map → resource-N6ADJPCL.js.map} +1 -1
- package/{scrape-2S3B33RA.js → scrape-XIJ5J6LW.js} +4 -3
- package/{scrape-2S3B33RA.js.map → scrape-XIJ5J6LW.js.map} +1 -1
- package/{search-LCGK3BJI.js → search-V2PWSYSL.js} +9 -10
- package/search-V2PWSYSL.js.map +1 -0
- package/{secret-M5C54VAT.js → secret-JLGGOPTX.js} +4 -3
- package/{secret-M5C54VAT.js.map → secret-JLGGOPTX.js.map} +1 -1
- package/{slack-FJV2NEOT.js → slack-QNQY6TVX.js} +4 -3
- package/{slack-FJV2NEOT.js.map → slack-QNQY6TVX.js.map} +1 -1
- package/{teams-XBLEN2XV.js → teams-QZZG5ERQ.js} +4 -3
- package/{teams-XBLEN2XV.js.map → teams-QZZG5ERQ.js.map} +1 -1
- package/{telegram-RE6IO7ZT.js → telegram-JEQYIW2X.js} +4 -3
- package/{telegram-RE6IO7ZT.js.map → telegram-JEQYIW2X.js.map} +1 -1
- package/{variable-5MVUR6U4.js → variable-LDKUIYU7.js} +4 -3
- package/{variable-5MVUR6U4.js.map → variable-LDKUIYU7.js.map} +1 -1
- package/{video-DIVG6CMM.js → video-D3AUHQL2.js} +6 -4
- package/{video-DIVG6CMM.js.map → video-D3AUHQL2.js.map} +1 -1
- package/{web-KVZL6WM4.js → web-MUTRFMMA.js} +7 -5
- package/{web-KVZL6WM4.js.map → web-MUTRFMMA.js.map} +1 -1
- package/{web-search-XNJH2FXZ.js → web-search-KBLKNBIF.js} +4 -3
- package/{web-search-XNJH2FXZ.js.map → web-search-KBLKNBIF.js.map} +1 -1
- package/{whoami-NQYYRWEE.js → whoami-POJMF7BB.js} +6 -5
- package/{whoami-NQYYRWEE.js.map → whoami-POJMF7BB.js.map} +1 -1
- package/{workflow-5CGPRRAY.js → workflow-GXTNSIWC.js} +4 -3
- package/{workflow-5CGPRRAY.js.map → workflow-GXTNSIWC.js.map} +1 -1
- package/zero.js +35 -35
- package/chunk-65MTNZ44.js.map +0 -1
- package/chunk-MA37R4QS.js.map +0 -1
- package/chunk-MPSVIFKZ.js +0 -240
- package/chunk-MPSVIFKZ.js.map +0 -1
- package/chunk-MX32FFQR.js.map +0 -1
- package/chunk-ZUSDQG2O.js +0 -50
- package/chunk-ZUSDQG2O.js.map +0 -1
- package/host-X2KS3WTS.js.map +0 -1
- package/logs-WHQES7BY.js.map +0 -1
- package/search-LCGK3BJI.js.map +0 -1
- /package/{chunk-43PGP5OI.js.map → chunk-ARENVRJY.js.map} +0 -0
- /package/{chunk-JVIFZRZ7.js.map → chunk-DE4HMRSU.js.map} +0 -0
- /package/{chunk-TTP663DN.js.map → chunk-FVYB5CBP.js.map} +0 -0
- /package/{chunk-KMLBXZVR.js.map → chunk-VN4PPSXU.js.map} +0 -0
- /package/{chunk-LHR5Z775.js.map → chunk-YSVL5RAP.js.map} +0 -0
- /package/{chunk-WCRXAO2G.js.map → chunk-ZXCF4ARW.js.map} +0 -0
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/api/auth.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/auth/setup-token.ts","../src/commands/run/index.ts","../src/commands/run/run.ts","../src/lib/utils/update-checker.ts","../src/lib/utils/spawn.ts","../src/commands/run/resume.ts","../src/commands/run/continue.ts","../src/commands/run/list.ts","../src/commands/run/kill.ts","../src/commands/run/queue.ts","../src/commands/whoami.ts"],"sourcesContent":["// VM0 CLI entry point - main module\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { authCommand } from \"./commands/auth\";\nimport { runCommand } from \"./commands/run\";\nimport { whoamiCommand } from \"./commands/whoami\";\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"vm0\")\n .description(\"VM0 CLI - Build and run agents with natural language\")\n .version(__CLI_VERSION__);\n\n// Register all commands\nprogram.addCommand(authCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(whoamiCommand);\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"vm0\")\n) {\n await configureGlobalProxyFromEnv();\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { loginCommand } from \"./login\";\nimport { logoutCommand } from \"./logout\";\nimport { statusCommand } from \"./status\";\nimport { setupTokenCommand } from \"./setup-token\";\n\nexport const authCommand = new Command()\n .name(\"auth\")\n .description(\"Authenticate vm0\")\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand)\n .addCommand(setupTokenCommand);\n","import { Command } from \"commander\";\nimport { authenticate } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const loginCommand = new Command()\n .name(\"login\")\n .description(\"Log in to VM0 (use VM0_API_BACKEND_URL env var to set API URL)\")\n .action(\n withErrorHandler(async () => {\n await authenticate();\n }),\n );\n","import chalk from \"chalk\";\nimport {\n saveConfig,\n clearConfig,\n loadConfig,\n getApiUrl,\n getToken,\n} from \"./config\";\nimport { headersWithCliClientHeaders } from \"./client-headers\";\n\n/**\n * Build headers with optional Vercel bypass secret\n * Used to bypass Vercel deployment protection in CI/preview environments\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add Vercel bypass secret if available (for CI/preview deployments)\n const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;\n if (bypassSecret) {\n headers[\"x-vercel-protection-bypass\"] = bypassSecret;\n }\n\n return headers;\n}\n\nasync function requestDeviceCode(apiUrl: string): Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/device`, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(buildHeaders()),\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\"An unexpected network issue occurred\");\n }\n throw new Error(`Failed to request device code: ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n }>;\n}\n\nasync function exchangeToken(\n apiUrl: string,\n deviceCode: string,\n): Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/token`, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(buildHeaders()),\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n return response.json() as Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n }>;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\nexport async function authenticate(apiUrl?: string): Promise<void> {\n // Use provided apiUrl or get from config/env (with fallback to production)\n const targetApiUrl = apiUrl ?? (await getApiUrl());\n console.log(\"Initiating authentication...\");\n\n // Request device code\n const deviceAuth = await requestDeviceCode(targetApiUrl);\n\n console.log(chalk.green(\"\\nDevice code generated\"));\n\n // Construct verification URL from API URL and server-provided path\n const verificationUrl = `${targetApiUrl}${deviceAuth.verification_path}`;\n console.log(chalk.cyan(`\\nTo authenticate, visit: ${verificationUrl}`));\n console.log(`And enter this code: ${chalk.bold(deviceAuth.user_code)}`);\n console.log(\n `\\nThe code expires in ${Math.floor(deviceAuth.expires_in / 60)} minutes.`,\n );\n\n console.log(\"\\nWaiting for authentication...\");\n\n // Poll for token\n const startTime = Date.now();\n const maxWaitTime = deviceAuth.expires_in * 1000; // Convert to milliseconds\n const pollInterval = (deviceAuth.interval || 5) * 1000; // Use server-specified interval or default to 5 seconds\n\n let isFirstPoll = true;\n\n while (Date.now() - startTime < maxWaitTime) {\n // Skip delay on first poll for faster response\n if (!isFirstPoll) {\n await delay(pollInterval); // Use dynamic polling interval\n }\n isFirstPoll = false;\n\n const tokenResult = await exchangeToken(\n targetApiUrl,\n deviceAuth.device_code,\n );\n\n if (tokenResult.access_token) {\n // Success! Store the token and org context\n await saveConfig({\n token: tokenResult.access_token,\n apiUrl: targetApiUrl,\n });\n\n console.log(chalk.green(\"\\nAuthentication successful!\"));\n console.log(\"Your credentials have been saved\");\n return;\n }\n\n if (tokenResult.error === \"authorization_pending\") {\n // Still waiting for user to authenticate\n process.stdout.write(chalk.dim(\".\"));\n continue;\n }\n\n // Handle other errors\n if (tokenResult.error === \"expired_token\") {\n throw new Error(\"Device code expired, please try again\");\n }\n\n if (tokenResult.error) {\n throw new Error(\n `Authentication failed: ${tokenResult.error_description ?? tokenResult.error}`,\n );\n }\n }\n\n // Timeout\n throw new Error(\"Authentication timed out, please try again\");\n}\n\nexport async function logout(): Promise<void> {\n await clearConfig();\n console.log(chalk.green(\"✓ Successfully logged out\"));\n console.log(\"Your credentials have been cleared\");\n}\n\nexport async function checkAuthStatus(): Promise<void> {\n const config = await loadConfig();\n\n if (config.token) {\n console.log(chalk.green(\"✓ Authenticated\"));\n console.log(\"You are logged in to VM0.\");\n } else {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(chalk.dim(\" Run: vm0 auth login\"));\n }\n\n // Also check for environment variable\n if (process.env.VM0_TOKEN) {\n console.log(\"Using token from VM0_TOKEN environment variable\");\n }\n}\n\nexport async function setupToken(): Promise<void> {\n const token = await getToken();\n\n if (!token) {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(\"\");\n console.error(\"To get a token for CI/CD:\");\n console.error(\" 1. Run 'vm0 auth login' to authenticate\");\n console.error(\" 2. Run 'vm0 auth setup-token' to get your token\");\n console.error(\n \" 3. Store the token in your CI/CD secrets (e.g., VM0_TOKEN)\",\n );\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Authentication token exported successfully!\"));\n console.log(\"\");\n console.log(\"Your token:\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\n `Use this token by setting: ${chalk.cyan(\"export VM0_TOKEN=<token>\")}`,\n );\n}\n","import { Command } from \"commander\";\nimport { logout } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const logoutCommand = new Command()\n .name(\"logout\")\n .description(\"Log out of VM0\")\n .action(\n withErrorHandler(async () => {\n await logout();\n }),\n );\n","import { Command } from \"commander\";\nimport { checkAuthStatus } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show current authentication status\")\n .action(\n withErrorHandler(async () => {\n await checkAuthStatus();\n }),\n );\n","import { Command } from \"commander\";\nimport { setupToken } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const setupTokenCommand = new Command()\n .name(\"setup-token\")\n .description(\"Output auth token for CI/CD environments\")\n .action(\n withErrorHandler(async () => {\n await setupToken();\n }),\n );\n","import { mainRunCommand } from \"./run\";\nimport { resumeCommand } from \"./resume\";\nimport { continueCommand } from \"./continue\";\nimport { listCommand } from \"./list\";\nimport { killCommand } from \"./kill\";\nimport { queueCommand } from \"./queue\";\n\n// Add subcommands to the main run command\nmainRunCommand.addCommand(resumeCommand);\nmainRunCommand.addCommand(continueCommand);\nmainRunCommand.addCommand(listCommand);\nmainRunCommand.addCommand(killCommand);\nmainRunCommand.addCommand(queueCommand);\n\nexport const runCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport {\n directRunModelProviderTypeSchema,\n type DirectRunModelProviderType,\n} from \"@vm0/api-contracts/contracts/runs\";\nimport {\n getComposeById,\n getComposeByName,\n getComposeVersion,\n createRun,\n} from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n collectMounts,\n collectArtifacts,\n isUUID,\n extractVarNames,\n extractSecretNames,\n loadValues,\n parsePermissionPolicies,\n parseIdentifier,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction parseModelProviderType(\n value: string | undefined,\n): DirectRunModelProviderType | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = directRunModelProviderTypeSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid model provider type: ${value}`);\n }\n return parsed.data;\n}\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Run an agent\")\n .argument(\n \"<agent-name>\",\n \"Agent reference: name[:version] (e.g., 'my-agent', 'my-agent:abc123', 'my-agent:latest')\",\n )\n .argument(\"<prompt>\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable, format: volumeName=version)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--conversation <id>\",\n \"Resume from conversation ID (for fine-grained control)\",\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .option(\n \"--capture-network-bodies\",\n \"Capture HTTP header names, selected safe header values, request bodies, and response bodies in network logs\",\n )\n .addOption(new Option(\"--real-agent-in-preview\").hideHelp())\n .addOption(new Option(\"--model-provider-type <type>\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n identifier: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volumeVersion: Record<string, string>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n conversation?: string;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n captureNetworkBodies?: boolean;\n realAgentInPreview?: boolean;\n modelProviderType?: string;\n autoUpdate?: boolean;\n },\n ) => {\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n // 1. Parse identifier for optional version specifier\n const { name, version } = parseIdentifier(identifier);\n\n // 2. Resolve name to composeId and get compose content\n let composeId: string;\n let composeContent: unknown;\n\n if (isUUID(name)) {\n // It's a UUID compose ID - fetch compose to get content\n const compose = await getComposeById(name);\n composeId = compose.id;\n composeContent = compose.content;\n } else {\n // It's an agent name - resolve to compose ID\n const compose = await getComposeByName(name);\n if (!compose) {\n throw new Error(`Agent not found: ${identifier}`);\n }\n\n composeId = compose.id;\n composeContent = compose.content;\n }\n\n // 3. Resolve version if specified\n let agentComposeVersionId: string | undefined;\n\n if (version && version !== \"latest\") {\n // Resolve version hash to full version ID\n try {\n const versionInfo = await getComposeVersion(composeId, version);\n agentComposeVersionId = versionInfo.versionId;\n } catch (error) {\n throw new Error(`Version not found: ${version}`, {\n cause: error,\n });\n }\n }\n // Note: \"latest\" version uses agentComposeId which resolves to HEAD\n\n // 4. Load vars and secrets with priority: CLI args > --env-file > env vars\n const varNames = extractVarNames(composeContent);\n const vars = loadValues(options.vars, varNames, options.envFile);\n\n const secretNames = extractSecretNames(composeContent);\n const secrets = loadValues(\n options.secrets,\n secretNames,\n options.envFile,\n );\n\n // 5. Prepare optional fields\n const volumeVersions =\n Object.keys(options.volumeVersion).length > 0\n ? options.volumeVersion\n : undefined;\n const additionalVolumes =\n options.volume.length > 0 ? options.volume : undefined;\n const artifacts =\n options.artifact.length > 0 ? options.artifact : undefined;\n\n // 6. Call unified API (server handles all variable expansion)\n const response = await createRun({\n // Use agentComposeVersionId if resolved, otherwise use agentComposeId (resolves to HEAD)\n ...(agentComposeVersionId\n ? { agentComposeVersionId }\n : { agentComposeId: composeId }),\n prompt,\n vars,\n secrets,\n artifacts,\n volumeVersions,\n additionalVolumes,\n conversationId: options.conversation,\n appendSystemPrompt: options.appendSystemPrompt,\n disallowedTools: options.disallowedTools,\n tools: options.tools,\n settings: options.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies,\n ),\n captureNetworkBodies: options.captureNetworkBodies || undefined,\n realAgentInPreview: options.realAgentInPreview || undefined,\n modelProviderType: parseModelProviderType(options.modelProviderType),\n });\n\n // 7. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 8. Display run started/queued info\n renderRunCreated(response);\n\n // 9. Poll for events and exit with appropriate code\n const result = await pollEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n },\n ),\n );\n","import type { ChildProcess } from \"child_process\";\nimport chalk from \"chalk\";\nimport { safeSpawn } from \"./spawn\";\n\nconst PACKAGE_NAME = \"@vm0/cli\";\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;\nconst TIMEOUT_MS = 5000;\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"bun\" | \"yarn\" | \"unknown\";\n\n/**\n * Internal state for pending upgrade process\n */\ninterface UpgradeHandle {\n promise: Promise<boolean>;\n child: ChildProcess;\n packageManager: \"npm\" | \"pnpm\";\n}\n\n// Module-level state for pending upgrade\nlet pendingUpgrade: UpgradeHandle | null = null;\n\n/**\n * Detect which package manager was used to install the CLI\n * by checking the executable path for known package manager patterns.\n * Returns \"unknown\" if no known pattern is matched.\n */\nfunction detectPackageManager(): PackageManager {\n const execPath = process.argv[1] ?? \"\";\n\n // Check for pnpm (supported for auto-upgrade)\n if (execPath.includes(\"pnpm\")) {\n return \"pnpm\";\n }\n\n // Check for bun (unsupported - manual upgrade only)\n if (execPath.includes(\"/.bun/\") || execPath.includes(\"/bun/\")) {\n return \"bun\";\n }\n\n // Check for yarn (unsupported - manual upgrade only)\n if (execPath.includes(\"/.yarn/\") || execPath.includes(\"/yarn/\")) {\n return \"yarn\";\n }\n\n // Check for npm (supported for auto-upgrade)\n // Common npm paths: Homebrew, nvm, fnm, volta, nodenv, n, or node_modules\n if (\n execPath.includes(\"/usr/local/\") || // Homebrew on Intel Mac\n execPath.includes(\"/opt/homebrew/\") || // Homebrew on arm64 Mac\n execPath.includes(\"/.nvm/\") ||\n execPath.includes(\"/.fnm/\") ||\n execPath.includes(\"/.volta/\") ||\n execPath.includes(\"/.nodenv/\") ||\n execPath.includes(\"/.n/\") ||\n execPath.includes(\"/node_modules/\") ||\n execPath.includes(\"\\\\npm\\\\\") || // Windows: AppData\\Roaming\\npm\n execPath.includes(\"\\\\nodejs\\\\\") // Windows: Program Files\\nodejs\n ) {\n return \"npm\";\n }\n\n // Unknown package manager - don't assume npm\n return \"unknown\";\n}\n\n/**\n * Check if the package manager supports auto-upgrade\n */\nfunction isAutoUpgradeSupported(pm: PackageManager): pm is \"npm\" | \"pnpm\" {\n return pm === \"npm\" || pm === \"pnpm\";\n}\n\n/**\n * Get the manual upgrade command for a package manager\n */\nfunction getManualUpgradeCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return `bun add -g ${PACKAGE_NAME}@latest`;\n case \"yarn\":\n return `yarn global add ${PACKAGE_NAME}@latest`;\n case \"pnpm\":\n return `pnpm add -g ${PACKAGE_NAME}@latest`;\n case \"npm\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n case \"unknown\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n }\n}\n\n/**\n * Fetch the latest version of the package from npm registry\n * Returns null if the request fails or times out\n */\nasync function getLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n return controller.abort();\n }, TIMEOUT_MS);\n\n const response = await fetch(NPM_REGISTRY_URL, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const json = (await response.json()) as { version?: string };\n return json.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Start silent upgrade in background.\n * Call this at command start. Does NOT block after spawning.\n * The upgrade runs in parallel with command execution.\n *\n * @param currentVersion - Current CLI version\n * @returns Promise that resolves after starting upgrade (or determining no upgrade needed)\n */\nexport async function startSilentUpgrade(\n currentVersion: string,\n): Promise<void> {\n // Reset any previous state\n pendingUpgrade = null;\n\n // Check for new version\n const latestVersion = await getLatestVersion();\n\n // If check failed or already on latest, return silently\n if (latestVersion === null || latestVersion === currentVersion) {\n return;\n }\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, return silently (no whisper)\n if (!isAutoUpgradeSupported(packageManager)) {\n return;\n }\n\n // Spawn upgrade process (don't wait for completion)\n const isWindows = process.platform === \"win32\";\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"pipe\",\n detached: !isWindows,\n windowsHide: true,\n });\n\n const promise = new Promise<boolean>((resolve) => {\n child.on(\"close\", (code) => {\n return resolve(code === 0);\n });\n child.on(\"error\", () => {\n return resolve(false);\n });\n });\n\n pendingUpgrade = { promise, child, packageManager };\n}\n\n/**\n * Wait for pending upgrade to complete and show warning if failed.\n * Call this at command end.\n *\n * @param timeout - Max time to wait if upgrade still running (ms)\n * @returns Promise that resolves when upgrade completes or times out\n */\nexport async function waitForSilentUpgrade(\n timeout: number = TIMEOUT_MS,\n): Promise<void> {\n if (!pendingUpgrade) {\n return;\n }\n\n const { promise, child, packageManager } = pendingUpgrade;\n pendingUpgrade = null; // Clear state\n\n // Race between upgrade completion and timeout\n const result = await Promise.race([\n promise,\n new Promise<false>((resolve) => {\n setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeout);\n }),\n ]);\n\n // Show whisper message only on failure\n if (!result) {\n console.log(\n chalk.yellow(\n `\\n⚠ vm0 auto upgrade failed. Please run: ${getManualUpgradeCommand(packageManager)}`,\n ),\n );\n }\n}\n","import { spawn, type SpawnOptions, type ChildProcess } from \"child_process\";\n\n/**\n * Spawn a child process with safe Windows shell handling.\n *\n * On Windows, `shell: true` is required to resolve `.cmd` extensions for\n * commands like `npm`, `pnpm`, etc. On other platforms, shell is disabled\n * to avoid unnecessary shell interpretation. Commands passed to this\n * function must be hardcoded strings (not user input), and arguments\n * must use array form to prevent shell injection.\n *\n */\nexport function safeSpawn(\n command: string,\n args: string[],\n options?: Omit<SpawnOptions, \"shell\">,\n): ChildProcess {\n const isWindows = process.platform === \"win32\";\n const resolvedCommand = isWindows ? `${command}.cmd` : command;\n\n // nosemgrep: javascript.lang.security.audit.spawn-shell-true.spawn-shell-true, javascript.lang.security.detect-child-process.detect-child-process\n return spawn(resolvedCommand, args, {\n ...options,\n shell: isWindows,\n });\n}\n","import { Command, Option } from \"commander\";\nimport { getCheckpoint, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n collectMounts,\n collectArtifacts,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\"Resume an agent run from a checkpoint (uses all snapshot data)\")\n .argument(\"<checkpointId>\", \"Checkpoint ID to resume from\")\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--real-agent-in-preview\").hideHelp())\n .action(\n withErrorHandler(\n async (\n checkpointId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n realAgentInPreview?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n volumeVersion: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n realAgentInPreview?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate checkpoint ID format\n if (!isUUID(checkpointId)) {\n throw new Error(`Invalid checkpoint ID format: ${checkpointId}`, {\n cause: new Error(\"Checkpoint ID must be a valid UUID\"),\n });\n }\n\n // 2. Fetch checkpoint info to get required secret names\n // This allows loading secrets from environment variables\n const checkpointInfo = await getCheckpoint(checkpointId);\n const requiredSecretNames =\n checkpointInfo.agentComposeSnapshot.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Prepare optional fields\n // Commander routes the repeatable --artifact to either the subcommand's\n // own options or the parent's, depending on where the user put the flag.\n // Prefer the one with entries; fall back to the other.\n const artifactsInput =\n options.artifact.length > 0 ? options.artifact : allOpts.artifact;\n const artifacts =\n artifactsInput.length > 0 ? artifactsInput : undefined;\n const resolvedVars = Object.keys(vars).length > 0 ? vars : undefined;\n const volumeVersions =\n Object.keys(allOpts.volumeVersion).length > 0\n ? allOpts.volumeVersion\n : undefined;\n const additionalVolumes =\n allOpts.volume.length > 0 ? allOpts.volume : undefined;\n\n // 5. Call unified API with checkpointId\n const response = await createRun({\n checkpointId,\n prompt,\n vars: resolvedVars,\n secrets: loadedSecrets,\n artifacts,\n volumeVersions,\n additionalVolumes,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n realAgentInPreview:\n options.realAgentInPreview ||\n allOpts.realAgentInPreview ||\n undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getSession, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectMounts,\n collectArtifacts,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Pick the first truthy value, falling back to `undefined`. Used to merge\n * commander.js subcommand options with parent options when a flag can land\n * on either depending on argv ordering. Extracted to keep the action\n * handler's cyclomatic complexity below the lint threshold.\n */\nfunction pickOpt<T>(a: T | undefined, b: T | undefined): T | undefined {\n return a || b || undefined;\n}\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue an agent run from a session (uses latest artifact version)\",\n )\n .argument(\"<agentSessionId>\", \"Agent session ID to continue from\")\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--artifact <artifact>\",\n \"Mount an artifact (repeatable, format: name:/path or name:version:/path)\",\n collectArtifacts,\n [],\n )\n .option(\n \"--volume <volume>\",\n \"Mount a volume (repeatable, format: name:/path or name:version:/path)\",\n collectMounts,\n [],\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--real-agent-in-preview\").hideHelp())\n .action(\n withErrorHandler(\n async (\n agentSessionId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n realAgentInPreview?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifact: Array<{\n name: string;\n version?: string;\n mountPath: string;\n }>;\n volume: Array<{ name: string; version?: string; mountPath: string }>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n realAgentInPreview?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate session ID format\n if (!isUUID(agentSessionId)) {\n throw new Error(\n `Invalid agent session ID format: ${agentSessionId}`,\n { cause: new Error(\"Agent session ID must be a valid UUID\") },\n );\n }\n\n // 2. Fetch session info to get required secret names\n // This allows loading secrets from environment variables\n const sessionInfo = await getSession(agentSessionId);\n const requiredSecretNames = sessionInfo.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Prepare optional fields\n // Commander routes the repeatable --artifact to either the subcommand's\n // own options or the parent's, depending on where the user put the flag.\n // Prefer the one with entries; fall back to the other.\n const artifactsInput =\n options.artifact.length > 0 ? options.artifact : allOpts.artifact;\n const artifacts =\n artifactsInput.length > 0 ? artifactsInput : undefined;\n\n // 5. Call unified API with sessionId\n const response = await createRun({\n sessionId: agentSessionId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n artifacts,\n additionalVolumes:\n allOpts.volume.length > 0 ? allOpts.volume : undefined,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n realAgentInPreview: pickOpt(\n options.realAgentInPreview,\n allOpts.realAgentInPreview,\n ),\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listRuns } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport {\n ALL_RUN_STATUSES,\n type RunListItem,\n type RunStatus,\n} from \"@vm0/api-contracts/contracts/runs\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/** Standard UUID string length (with hyphens) */\nconst UUID_LENGTH = 36;\n\n/** All valid status values as a string for help text */\nconst VALID_STATUSES = ALL_RUN_STATUSES.join(\",\");\n\n/**\n * Command options type\n */\ninterface ListOptions {\n status?: string;\n all?: boolean;\n agent?: string;\n since?: string;\n until?: string;\n limit?: string;\n}\n\n/**\n * Format run status with color and optional padding\n */\nfunction formatRunStatus(status: RunStatus, width?: number): string {\n const paddedStatus = width ? status.padEnd(width) : status;\n switch (status) {\n case \"queued\":\n return chalk.blue(paddedStatus);\n case \"running\":\n return chalk.green(paddedStatus);\n case \"pending\":\n return chalk.yellow(paddedStatus);\n case \"completed\":\n return chalk.dim(paddedStatus);\n case \"failed\":\n case \"timeout\":\n return chalk.red(paddedStatus);\n default:\n return paddedStatus;\n }\n}\n\n/**\n * Validate and parse status filter from options\n */\nfunction parseStatusFilter(options: ListOptions): string | undefined {\n if (options.all) {\n return VALID_STATUSES;\n }\n\n if (options.status) {\n const values = options.status.split(\",\").map((s) => {\n return s.trim();\n });\n for (const v of values) {\n if (!ALL_RUN_STATUSES.includes(v as RunStatus)) {\n throw new Error(`Invalid status \"${v}\"`, {\n cause: new Error(`Valid values: ${VALID_STATUSES}`),\n });\n }\n }\n return values.join(\",\");\n }\n\n if (options.since) {\n // Implicit all when --since is used\n return VALID_STATUSES;\n }\n\n // undefined = backend default (pending,running)\n return undefined;\n}\n\n/**\n * Parse time option to ISO string\n */\nfunction parseTimeOption(value: string, optionName: string): string {\n try {\n return new Date(parseTime(value)).toISOString();\n } catch {\n throw new Error(\n `Invalid ${optionName} format. Use ISO (2026-01-01) or relative (1h, 7d, 30d)`,\n );\n }\n}\n\n/**\n * Parse and validate limit option\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 100) {\n throw new Error(\"--limit must be between 1 and 100\");\n }\n return limit;\n}\n\n/**\n * Display runs in table format\n */\nfunction displayRuns(runs: RunListItem[]): void {\n // Calculate column widths\n const agentWidth = Math.max(\n 5,\n ...runs.map((r) => {\n return r.agentName.length;\n }),\n );\n const statusWidth = Math.max(\n 6,\n ...runs.map((r) => {\n return r.status.length;\n }),\n );\n\n // Print header\n const header = [\n \"ID\".padEnd(UUID_LENGTH),\n \"AGENT\".padEnd(agentWidth),\n \"STATUS\".padEnd(statusWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const run of runs) {\n const row = [\n run.id.padEnd(UUID_LENGTH),\n run.agentName.padEnd(agentWidth),\n formatRunStatus(run.status, statusWidth),\n formatRelativeTime(run.createdAt),\n ].join(\" \");\n console.log(row);\n }\n}\n\n/**\n * Display empty state message\n */\nfunction displayEmptyState(hasFilters: boolean): void {\n if (hasFilters) {\n console.log(chalk.dim(\"No runs found matching filters\"));\n } else {\n console.log(chalk.dim(\"No active runs\"));\n console.log(chalk.dim(' Run: vm0 run <agent> \"<prompt>\"'));\n }\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List runs\")\n .option(\n \"--status <status,...>\",\n `Filter by status: ${VALID_STATUSES} (default: pending,running)`,\n )\n .option(\"--all\", \"Show all statuses (mutually exclusive with --status)\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--since <date>\", \"Start time (ISO format or relative: 1h, 7d, 30d)\")\n .option(\"--until <date>\", \"End time (defaults to now)\")\n .option(\"--limit <n>\", \"Maximum number of results (default: 50, max: 100)\")\n .action(\n withErrorHandler(async (options: ListOptions) => {\n // Validate mutual exclusion\n if (options.all && options.status) {\n throw new Error(\"--all and --status are mutually exclusive\");\n }\n\n // Parse options\n const statusFilter = parseStatusFilter(options);\n const since = options.since\n ? parseTimeOption(options.since, \"--since\")\n : undefined;\n const until = options.until\n ? parseTimeOption(options.until, \"--until\")\n : undefined;\n const limit = parseLimit(options.limit);\n\n // Validate since < until\n if (since && until && new Date(since) >= new Date(until)) {\n throw new Error(\"--since must be before --until\");\n }\n\n // Fetch runs with filters\n const response = await listRuns({\n status: statusFilter,\n agent: options.agent,\n since,\n until,\n limit,\n });\n\n const runs = response.runs;\n\n if (runs.length === 0) {\n const hasFilters = !!(\n options.status ||\n options.all ||\n options.agent ||\n options.since\n );\n displayEmptyState(hasFilters);\n return;\n }\n\n displayRuns(runs);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cancelRun } from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const killCommand = new Command()\n .name(\"kill\")\n .description(\"Kill (cancel) a pending or running run\")\n .argument(\"<run-id>\", \"Run ID to kill\")\n .action(\n withErrorHandler(async (runId: string) => {\n await cancelRun(runId);\n console.log(chalk.green(`✓ Run ${runId} cancelled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getRunQueue } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const queueCommand = new Command()\n .name(\"queue\")\n .description(\"Show org run queue status\")\n .action(\n withErrorHandler(async () => {\n const data = await getRunQueue();\n const { concurrency, queue } = data;\n\n // Concurrency header\n const limitDisplay =\n concurrency.limit === 0\n ? \"unlimited\"\n : `${concurrency.active}/${concurrency.limit} slots used`;\n console.log(`Concurrency: ${limitDisplay} (${concurrency.tier} tier)`);\n\n // Queue status\n if (queue.length === 0) {\n console.log(chalk.dim(\"Queue: empty — all slots available\"));\n return;\n }\n\n console.log(\n `Queue: ${queue.length} run${queue.length > 1 ? \"s\" : \"\"} waiting`,\n );\n console.log();\n\n // Dynamic column widths\n const posWidth = Math.max(1, String(queue.length).length);\n const agentWidth = Math.max(\n 5,\n ...queue.map((e) => {\n return (e.agentName ?? \"-\").length;\n }),\n );\n const emailWidth = Math.max(\n 4,\n ...queue.map((e) => {\n return (e.userEmail ?? \"-\").length;\n }),\n );\n\n // Header\n const header = [\n \"#\".padEnd(posWidth),\n \"AGENT\".padEnd(agentWidth),\n \"USER\".padEnd(emailWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Rows\n for (const entry of queue) {\n const marker = entry.runId !== null ? chalk.cyan(\" ← you\") : \"\";\n const row = [\n String(entry.position).padEnd(posWidth),\n (entry.agentName ?? \"-\").padEnd(agentWidth),\n (entry.userEmail ?? \"-\").padEnd(emailWidth),\n formatRelativeTime(entry.createdAt),\n ].join(\" \");\n console.log(row + marker);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getApiUrl, getActiveOrg, getToken } from \"../lib/api/config\";\nimport { withErrorHandler } from \"../lib/command\";\n\n/**\n * Detect if running inside a VM0 sandbox (agent runtime).\n * Presence of VM0_RUN_ID indicates sandbox execution.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.VM0_RUN_ID;\n}\n\n/**\n * Display agent identity and run information when inside a sandbox.\n */\nasync function showSandboxInfo(): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const cliAgentType = process.env.CLI_AGENT_TYPE;\n\n const runId = process.env.VM0_RUN_ID;\n const activeOrg = await getActiveOrg();\n const apiUrl = process.env.VM0_API_BACKEND_URL;\n\n // Agent section\n const hasAgentInfo = agentId || cliAgentType;\n if (hasAgentInfo) {\n console.log(chalk.bold(\"Agent:\"));\n if (agentId) console.log(` ID: ${agentId}`);\n if (cliAgentType) console.log(` Framework: ${cliAgentType}`);\n console.log();\n }\n\n // Run section\n console.log(chalk.bold(\"Run:\"));\n if (runId) console.log(` ID: ${runId}`);\n if (activeOrg) console.log(` Org: ${activeOrg}`);\n if (apiUrl) console.log(` API: ${apiUrl}`);\n}\n\n/**\n * Display authentication and org information when running outside a sandbox.\n */\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const whoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show current identity and environment information\")\n .action(\n withErrorHandler(async () => {\n if (isInsideSandbox()) {\n await showSandboxInfo();\n } else {\n await showLocalInfo();\n }\n }),\n );\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/api/auth.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/auth/setup-token.ts","../src/commands/whoami.ts"],"sourcesContent":["// VM0 CLI entry point - main module\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { authCommand } from \"./commands/auth\";\nimport { whoamiCommand } from \"./commands/whoami\";\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"vm0\")\n .description(\"VM0 CLI - Developer authentication utilities\")\n .version(__CLI_VERSION__);\n\n// Register all commands\nprogram.addCommand(authCommand);\nprogram.addCommand(whoamiCommand);\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"vm0\")\n) {\n await configureGlobalProxyFromEnv();\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { loginCommand } from \"./login\";\nimport { logoutCommand } from \"./logout\";\nimport { statusCommand } from \"./status\";\nimport { setupTokenCommand } from \"./setup-token\";\n\nexport const authCommand = new Command()\n .name(\"auth\")\n .description(\"Authenticate vm0\")\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand)\n .addCommand(setupTokenCommand);\n","import { Command } from \"commander\";\nimport { authenticate } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const loginCommand = new Command()\n .name(\"login\")\n .description(\"Log in to VM0 (use VM0_API_BACKEND_URL env var to set API URL)\")\n .action(\n withErrorHandler(async () => {\n await authenticate();\n }),\n );\n","import chalk from \"chalk\";\nimport {\n saveConfig,\n clearConfig,\n loadConfig,\n getApiUrl,\n getToken,\n} from \"./config\";\nimport { headersWithCliClientHeaders } from \"./client-headers\";\n\n/**\n * Build headers with optional Vercel bypass secret\n * Used to bypass Vercel deployment protection in CI/preview environments\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add Vercel bypass secret if available (for CI/preview deployments)\n const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;\n if (bypassSecret) {\n headers[\"x-vercel-protection-bypass\"] = bypassSecret;\n }\n\n return headers;\n}\n\nasync function requestDeviceCode(apiUrl: string): Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/device`, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(buildHeaders()),\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\"An unexpected network issue occurred\");\n }\n throw new Error(`Failed to request device code: ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n }>;\n}\n\nasync function exchangeToken(\n apiUrl: string,\n deviceCode: string,\n): Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/token`, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(buildHeaders()),\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n return response.json() as Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n }>;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\nexport async function authenticate(apiUrl?: string): Promise<void> {\n // Use provided apiUrl or get from config/env (with fallback to production)\n const targetApiUrl = apiUrl ?? (await getApiUrl());\n console.log(\"Initiating authentication...\");\n\n // Request device code\n const deviceAuth = await requestDeviceCode(targetApiUrl);\n\n console.log(chalk.green(\"\\nDevice code generated\"));\n\n // Construct verification URL from API URL and server-provided path\n const verificationUrl = `${targetApiUrl}${deviceAuth.verification_path}`;\n console.log(chalk.cyan(`\\nTo authenticate, visit: ${verificationUrl}`));\n console.log(`And enter this code: ${chalk.bold(deviceAuth.user_code)}`);\n console.log(\n `\\nThe code expires in ${Math.floor(deviceAuth.expires_in / 60)} minutes.`,\n );\n\n console.log(\"\\nWaiting for authentication...\");\n\n // Poll for token\n const startTime = Date.now();\n const maxWaitTime = deviceAuth.expires_in * 1000; // Convert to milliseconds\n const pollInterval = (deviceAuth.interval || 5) * 1000; // Use server-specified interval or default to 5 seconds\n\n let isFirstPoll = true;\n\n while (Date.now() - startTime < maxWaitTime) {\n // Skip delay on first poll for faster response\n if (!isFirstPoll) {\n await delay(pollInterval); // Use dynamic polling interval\n }\n isFirstPoll = false;\n\n const tokenResult = await exchangeToken(\n targetApiUrl,\n deviceAuth.device_code,\n );\n\n if (tokenResult.access_token) {\n // Success! Store the token and org context\n await saveConfig({\n token: tokenResult.access_token,\n apiUrl: targetApiUrl,\n });\n\n console.log(chalk.green(\"\\nAuthentication successful!\"));\n console.log(\"Your credentials have been saved\");\n return;\n }\n\n if (tokenResult.error === \"authorization_pending\") {\n // Still waiting for user to authenticate\n process.stdout.write(chalk.dim(\".\"));\n continue;\n }\n\n // Handle other errors\n if (tokenResult.error === \"expired_token\") {\n throw new Error(\"Device code expired, please try again\");\n }\n\n if (tokenResult.error) {\n throw new Error(\n `Authentication failed: ${tokenResult.error_description ?? tokenResult.error}`,\n );\n }\n }\n\n // Timeout\n throw new Error(\"Authentication timed out, please try again\");\n}\n\nexport async function logout(): Promise<void> {\n await clearConfig();\n console.log(chalk.green(\"✓ Successfully logged out\"));\n console.log(\"Your credentials have been cleared\");\n}\n\nexport async function checkAuthStatus(): Promise<void> {\n const config = await loadConfig();\n\n if (config.token) {\n console.log(chalk.green(\"✓ Authenticated\"));\n console.log(\"You are logged in to VM0.\");\n } else {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(chalk.dim(\" Run: vm0 auth login\"));\n }\n\n // Also check for environment variable\n if (process.env.VM0_TOKEN) {\n console.log(\"Using token from VM0_TOKEN environment variable\");\n }\n}\n\nexport async function setupToken(): Promise<void> {\n const token = await getToken();\n\n if (!token) {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(\"\");\n console.error(\"To get a token for CI/CD:\");\n console.error(\" 1. Run 'vm0 auth login' to authenticate\");\n console.error(\" 2. Run 'vm0 auth setup-token' to get your token\");\n console.error(\n \" 3. Store the token in your CI/CD secrets (e.g., VM0_TOKEN)\",\n );\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Authentication token exported successfully!\"));\n console.log(\"\");\n console.log(\"Your token:\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\n `Use this token by setting: ${chalk.cyan(\"export VM0_TOKEN=<token>\")}`,\n );\n}\n","import { Command } from \"commander\";\nimport { logout } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const logoutCommand = new Command()\n .name(\"logout\")\n .description(\"Log out of VM0\")\n .action(\n withErrorHandler(async () => {\n await logout();\n }),\n );\n","import { Command } from \"commander\";\nimport { checkAuthStatus } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show current authentication status\")\n .action(\n withErrorHandler(async () => {\n await checkAuthStatus();\n }),\n );\n","import { Command } from \"commander\";\nimport { setupToken } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const setupTokenCommand = new Command()\n .name(\"setup-token\")\n .description(\"Output auth token for CI/CD environments\")\n .action(\n withErrorHandler(async () => {\n await setupToken();\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getApiUrl, getActiveOrg, getToken } from \"../lib/api/config\";\nimport { withErrorHandler } from \"../lib/command\";\n\n/**\n * Detect if running inside a VM0 sandbox (agent runtime).\n * Presence of VM0_RUN_ID indicates sandbox execution.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.VM0_RUN_ID;\n}\n\n/**\n * Display agent identity and run information when inside a sandbox.\n */\nasync function showSandboxInfo(): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const cliAgentType = process.env.CLI_AGENT_TYPE;\n\n const runId = process.env.VM0_RUN_ID;\n const activeOrg = await getActiveOrg();\n const apiUrl = process.env.VM0_API_BACKEND_URL;\n\n // Agent section\n const hasAgentInfo = agentId || cliAgentType;\n if (hasAgentInfo) {\n console.log(chalk.bold(\"Agent:\"));\n if (agentId) console.log(` ID: ${agentId}`);\n if (cliAgentType) console.log(` Framework: ${cliAgentType}`);\n console.log();\n }\n\n // Run section\n console.log(chalk.bold(\"Run:\"));\n if (runId) console.log(` ID: ${runId}`);\n if (activeOrg) console.log(` Org: ${activeOrg}`);\n if (apiUrl) console.log(` API: ${apiUrl}`);\n}\n\n/**\n * Display authentication and org information when running outside a sandbox.\n */\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const whoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show current identity and environment information\")\n .action(\n withErrorHandler(async () => {\n if (isInsideSandbox()) {\n await showSandboxInfo();\n } else {\n await showLocalInfo();\n }\n }),\n );\n"],"mappings":"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","names":[]}
|
|
@@ -1,30 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __createRequire } from "node:module";
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
|
-
import {
|
|
5
|
-
collectLogItems,
|
|
6
|
-
parseBoundedLogCount,
|
|
7
|
-
parsePositiveLogCount,
|
|
8
|
-
searchCommand
|
|
9
|
-
} from "./chunk-MPSVIFKZ.js";
|
|
10
4
|
import {
|
|
11
5
|
EventRenderer,
|
|
12
6
|
EventStreamNormalizer,
|
|
7
|
+
collectLogItems,
|
|
13
8
|
formatIsoTimestamp,
|
|
14
9
|
isSupportedFramework,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
isUuid,
|
|
11
|
+
parseBoundedLogCount,
|
|
12
|
+
parsePositiveLogCount,
|
|
13
|
+
parseTime,
|
|
14
|
+
searchCommand
|
|
15
|
+
} from "./chunk-6P7XBY46.js";
|
|
18
16
|
import "./chunk-DWWE7STW.js";
|
|
19
17
|
import {
|
|
20
18
|
getZeroRunAgentEvents,
|
|
21
19
|
listZeroLogs
|
|
22
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-5XVBOER3.js";
|
|
21
|
+
import "./chunk-HOIDOML4.js";
|
|
23
22
|
import "./chunk-LTDQISD7.js";
|
|
24
23
|
import {
|
|
25
24
|
source_default,
|
|
26
25
|
withErrorHandler
|
|
27
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-XYZN3XWH.js";
|
|
28
27
|
import "./chunk-LRHXR7JT.js";
|
|
29
28
|
import {
|
|
30
29
|
Command
|
|
@@ -78,7 +77,7 @@ Examples:
|
|
|
78
77
|
async (options) => {
|
|
79
78
|
const limit = options.limit !== void 0 ? parseBoundedLogCount(options.limit, "--limit", 1, 100) : void 0;
|
|
80
79
|
const since = options.since !== void 0 ? parseTime(options.since) : void 0;
|
|
81
|
-
if (options.agent !== void 0 && !
|
|
80
|
+
if (options.agent !== void 0 && !isUuid(options.agent)) {
|
|
82
81
|
console.error(
|
|
83
82
|
source_default.red(
|
|
84
83
|
`\u2717 Invalid agent ID "${options.agent}" \u2014 expected a UUID`
|
|
@@ -228,7 +227,7 @@ Examples:
|
|
|
228
227
|
zeroLogsCommand.help();
|
|
229
228
|
return;
|
|
230
229
|
}
|
|
231
|
-
if (!
|
|
230
|
+
if (!isUuid(runId)) {
|
|
232
231
|
console.error(
|
|
233
232
|
source_default.red(`\u2717 Invalid run ID "${runId}" \u2014 expected a UUID`)
|
|
234
233
|
);
|
|
@@ -270,4 +269,4 @@ Examples:
|
|
|
270
269
|
export {
|
|
271
270
|
zeroLogsCommand
|
|
272
271
|
};
|
|
273
|
-
//# sourceMappingURL=logs-
|
|
272
|
+
//# sourceMappingURL=logs-OXZZHIMA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { EventStreamNormalizer } from \"../../../lib/events/event-stream-normalizer\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport {\n collectLogItems,\n parsePositiveLogCount,\n} from \"../../../lib/utils/log-pagination\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { isSupportedFramework } from \"@vm0/core/frameworks\";\n\nconst PAGE_LIMIT = 100;\n\ninterface AgentEventWithFramework {\n readonly event: RunEvent;\n readonly framework?: string;\n readonly useDefaultFramework: boolean;\n}\n\nfunction supportedLogFramework(\n framework: string | undefined,\n): string | undefined {\n return isSupportedFramework(framework) ? framework : undefined;\n}\n\nfunction hasLogFramework(framework: string | null | undefined): boolean {\n return framework !== undefined && framework !== null;\n}\n\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n framework: string | undefined,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n framework,\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const events = await collectLogItems<AgentEventWithFramework>({\n fetchPage: async (request) => {\n const response = await getZeroRunAgentEvents(runId, request);\n const responseFramework: string | null | undefined = response.framework;\n return {\n items: response.events.map((event) => {\n const framework = supportedLogFramework(\n responseFramework ?? undefined,\n );\n return {\n event,\n ...(framework ? { framework } : {}),\n useDefaultFramework: !hasLogFramework(responseFramework),\n };\n }),\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n const framework = events.find((item) => {\n return item.framework !== undefined;\n })?.framework;\n const normalizer = new EventStreamNormalizer();\n\n for (const item of events) {\n renderAgentEvent(\n item.event,\n renderer,\n normalizer,\n item.framework ?? (item.useDefaultFramework ? framework : undefined),\n );\n }\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n renderer.flush();\n}\n\nexport const zeroLogsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to view agent events for\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs <runId>\n zero logs <runId> --tail 10\n zero logs <runId> --all\n zero logs search \"error\"`,\n )\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n zeroLogsCommand.help();\n return;\n }\n\n if (!isUuid(runId)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${runId}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n let since: number | undefined;\n if (options.since !== undefined) {\n since = parseTime(options.since);\n }\n\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = parsePositiveLogCount(options.head!, \"--head\");\n } else if (isTail) {\n targetCount = parsePositiveLogCount(options.tail!, \"--tail\");\n } else {\n targetCount = 5;\n }\n\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n await showAgentEvents(runId, { since, targetCount, order });\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroLogs } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUuid } from \"../../../lib/utils/uuid\";\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"failed\":\n case \"timeout\":\n return chalk.red(status);\n case \"running\":\n case \"pending\":\n case \"queued\":\n return chalk.yellow(status);\n case \"cancelled\":\n return chalk.dim(status);\n default:\n return status;\n }\n}\n\nfunction formatTime(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\n \"--status <status>\",\n \"Filter by status (queued|pending|running|completed|failed|timeout|cancelled)\",\n )\n .option(\n \"--since <time>\",\n \"Filter runs created since (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--limit <n>\", \"Maximum number of results (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs list --agent 123e4567-e89b-12d3-a456-426614174000\n zero logs list --status completed --limit 10\n zero logs list --since 1h\n zero logs list --since 1d --status completed`,\n )\n .action(\n withErrorHandler(\n async (options: {\n agent?: string;\n status?: string;\n since?: string;\n limit?: string;\n }) => {\n const limit =\n options.limit !== undefined\n ? parseBoundedLogCount(options.limit, \"--limit\", 1, 100)\n : undefined;\n const since =\n options.since !== undefined ? parseTime(options.since) : undefined;\n if (options.agent !== undefined && !isUuid(options.agent)) {\n console.error(\n chalk.red(\n `✗ Invalid agent ID \"${options.agent}\" — expected a UUID`,\n ),\n );\n console.error(\n chalk.dim(\" Run: zero logs list to find agent IDs\"),\n );\n process.exit(1);\n }\n\n const result = await listZeroLogs({\n agentId: options.agent,\n status: options.status,\n since,\n limit,\n });\n\n if (result.data.length === 0) {\n console.log(chalk.dim(\"No logs found\"));\n return;\n }\n\n const nameCol = Math.max(\n 5,\n ...result.data.map((r) => {\n return (r.displayName || r.agentId || \"-\").length;\n }),\n );\n const statusCol = Math.max(\n 6,\n ...result.data.map((r) => {\n return r.status.length;\n }),\n );\n\n const header = [\n \"RUN ID\".padEnd(38),\n \"AGENT\".padEnd(nameCol),\n \"STATUS\".padEnd(statusCol),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const entry of result.data) {\n const runId = entry.id;\n const name = entry.displayName || entry.agentId || \"-\";\n const row = [\n runId.padEnd(38),\n name.padEnd(nameCol),\n formatStatus(entry.status).padEnd(statusCol),\n formatTime(entry.createdAt),\n ].join(\" \");\n console.log(row);\n }\n\n if (result.pagination.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing ${result.data.length} of more results. Use --limit to adjust.`,\n ),\n );\n }\n },\n ),\n );\n"],"mappings":"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","names":["framework"]}
|
|
@@ -4,19 +4,20 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
findConnectorStatusItem,
|
|
6
6
|
resolveAgentContext
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZXCF4ARW.js";
|
|
8
8
|
import {
|
|
9
9
|
getPlatformOrigin
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-VN4PPSXU.js";
|
|
11
11
|
import {
|
|
12
12
|
linkZeroMailDraft,
|
|
13
13
|
listZeroConnectorCatalogStatus
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-5XVBOER3.js";
|
|
15
|
+
import "./chunk-HOIDOML4.js";
|
|
15
16
|
import "./chunk-LTDQISD7.js";
|
|
16
17
|
import {
|
|
17
18
|
source_default,
|
|
18
19
|
withErrorHandler
|
|
19
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-XYZN3XWH.js";
|
|
20
21
|
import "./chunk-LRHXR7JT.js";
|
|
21
22
|
import {
|
|
22
23
|
Command
|
|
@@ -183,4 +184,4 @@ var zeroMailCommand = new Command().name("mail").description("Review linked Gmai
|
|
|
183
184
|
export {
|
|
184
185
|
zeroMailCommand
|
|
185
186
|
};
|
|
186
|
-
//# sourceMappingURL=mail-
|
|
187
|
+
//# sourceMappingURL=mail-QCU47LFX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/mail/index.ts","../src/commands/zero/mail/connect.ts","../src/commands/zero/mail/shared.ts","../src/commands/zero/mail/link.ts","../src/commands/zero/mail/list.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { connectCommand } from \"./connect\";\nimport { linkCommand } from \"./link\";\nimport { listCommand } from \"./list\";\n\nexport const zeroMailCommand = new Command()\n .name(\"mail\")\n .description(\"Review linked Gmail drafts\")\n .addCommand(listCommand)\n .addCommand(connectCommand)\n .addCommand(linkCommand);\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n MAIL_CONNECTOR_REF,\n currentAgentId,\n parseMailProvider,\n} from \"./shared\";\n\ninterface ConnectOptions {\n readonly json?: boolean;\n}\n\nexport const connectCommand = new Command()\n .name(\"connect\")\n .description(\"Get a connect or authorization link for a mail provider\")\n .argument(\"<provider>\", \"Mail provider: gmail or outlook\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .action(\n withErrorHandler(async (providerValue: string, options: ConnectOptions) => {\n const provider = parseMailProvider(providerValue);\n const agentId = currentAgentId();\n const connectorRef = MAIL_CONNECTOR_REF[provider];\n const [{ connectors }, agent, origin] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n getPlatformOrigin(),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n const connector = findConnectorStatusItem(connectors, connectorRef);\n if (!connector) {\n throw new Error(`${provider} is not available`);\n }\n\n const authorized = agent.authorizedTypes.has(connectorRef);\n const action =\n connector.connectionStatus === \"reconnect-required\" ||\n connector.connectionStatus === \"scope-mismatch\"\n ? \"reconnect\"\n : connector.connected && !authorized\n ? \"authorize\"\n : !connector.connected\n ? \"connect\"\n : \"ready\";\n const url =\n action === \"reconnect\"\n ? connector.connectionStatus === \"scope-mismatch\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : `${origin}/connectors`\n : action === \"authorize\"\n ? `${origin}/connectors/${connectorRef}/authorize?agentId=${agentId}`\n : action === \"connect\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : null;\n\n if (options.json) {\n console.log(JSON.stringify({ provider, action, url }));\n return;\n }\n if (!url) {\n console.log(chalk.green(`✓ ${connector.label} is ready`));\n console.log(\n chalk.dim(` Sender: ${connector.connection?.externalEmail}`),\n );\n console.log(\n chalk.dim(\n \" After creating a Gmail draft: zero mail link <draft-id>\",\n ),\n );\n return;\n }\n const label =\n action === \"authorize\"\n ? `Authorize ${connector.label}`\n : action === \"reconnect\"\n ? `Reconnect ${connector.label}`\n : `Connect ${connector.label}`;\n console.log(`${label}: [${label}](${url})`);\n }),\n );\n","import type { ZeroMailProvider } from \"@vm0/api-contracts/contracts/zero-mail\";\n\nexport const MAIL_CONNECTOR_REF = {\n gmail: \"gmail\",\n outlook: \"outlook-mail\",\n} as const;\n\nexport function parseMailProvider(value: string): ZeroMailProvider {\n if (value === \"gmail\" || value === \"outlook\") {\n return value;\n }\n throw new Error(`Unsupported mail provider: ${value}`, {\n cause: new Error(\"Use gmail or outlook\"),\n });\n}\n\nexport function currentAgentId(): string {\n const agentId = process.env.ZERO_AGENT_ID?.trim();\n if (!agentId) {\n throw new Error(\"ZERO_AGENT_ID is not set\", {\n cause: new Error(\"Run this command from an active Zero agent run\"),\n });\n }\n return agentId;\n}\n","import { Command } from \"commander\";\n\nimport { linkZeroMailDraft } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { currentAgentId } from \"./shared\";\n\nfunction currentChatThreadId(): string {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n if (!threadId) {\n throw new Error(\"ZERO_CHAT_THREAD_ID is not set\", {\n cause: new Error(\"Run this command from a Zero web chat thread\"),\n });\n }\n return threadId;\n}\n\nexport const linkCommand = new Command()\n .name(\"link\")\n .description(\"Link an existing Gmail draft to the current web chat\")\n .argument(\"<gmail-draft-id>\", \"Gmail draft ID\")\n .action(\n withErrorHandler(async (gmailDraftId: string) => {\n const result = await linkZeroMailDraft({\n threadId: currentChatThreadId(),\n agentId: currentAgentId(),\n gmailDraftId,\n });\n console.log(result.mailDraftUrl);\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { MAIL_CONNECTOR_REF, currentAgentId } from \"./shared\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Gmail and Outlook Mail availability for the current agent\")\n .action(\n withErrorHandler(async () => {\n const agentId = currentAgentId();\n const [{ connectors }, agent] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n\n const rows = Object.entries(MAIL_CONNECTOR_REF).map(\n ([provider, connectorRef]) => {\n const connector = findConnectorStatusItem(connectors, connectorRef);\n const authorized = agent.authorizedTypes.has(connectorRef);\n const ready =\n authorized &&\n connector?.connected === true &&\n connector.connectionStatus === \"connected\";\n const sender = authorized\n ? (connector?.connection?.externalEmail ?? \"-\")\n : \"-\";\n const status = ready\n ? chalk.green(\"ready\")\n : connector?.connectionStatus === \"reconnect-required\" ||\n connector?.connectionStatus === \"scope-mismatch\"\n ? chalk.yellow(\"reconnect\")\n : connector?.connected\n ? chalk.yellow(\"authorize\")\n : chalk.dim(\"connect\");\n return { provider, sender, status };\n },\n );\n\n const providerWidth = Math.max(\n \"PROVIDER\".length,\n ...rows.map((row) => {\n return row.provider.length;\n }),\n );\n const senderWidth = Math.max(\n \"SENDER\".length,\n ...rows.map((row) => {\n return row.sender.length;\n }),\n );\n console.log(\n chalk.dim(\n [\n \"PROVIDER\".padEnd(providerWidth),\n \"SENDER\".padEnd(senderWidth),\n \"STATUS\",\n ].join(\" \"),\n ),\n );\n for (const row of rows) {\n console.log(\n [\n row.provider.padEnd(providerWidth),\n row.sender.padEnd(senderWidth),\n row.status,\n ].join(\" \"),\n );\n }\n console.log();\n console.log(\n chalk.dim(\" Run: zero mail connect gmail|outlook when needed\"),\n );\n }),\n );\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/mail/index.ts","../src/commands/zero/mail/connect.ts","../src/commands/zero/mail/shared.ts","../src/commands/zero/mail/link.ts","../src/commands/zero/mail/list.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { connectCommand } from \"./connect\";\nimport { linkCommand } from \"./link\";\nimport { listCommand } from \"./list\";\n\nexport const zeroMailCommand = new Command()\n .name(\"mail\")\n .description(\"Review linked Gmail drafts\")\n .addCommand(listCommand)\n .addCommand(connectCommand)\n .addCommand(linkCommand);\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n MAIL_CONNECTOR_REF,\n currentAgentId,\n parseMailProvider,\n} from \"./shared\";\n\ninterface ConnectOptions {\n readonly json?: boolean;\n}\n\nexport const connectCommand = new Command()\n .name(\"connect\")\n .description(\"Get a connect or authorization link for a mail provider\")\n .argument(\"<provider>\", \"Mail provider: gmail or outlook\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .action(\n withErrorHandler(async (providerValue: string, options: ConnectOptions) => {\n const provider = parseMailProvider(providerValue);\n const agentId = currentAgentId();\n const connectorRef = MAIL_CONNECTOR_REF[provider];\n const [{ connectors }, agent, origin] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n getPlatformOrigin(),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n const connector = findConnectorStatusItem(connectors, connectorRef);\n if (!connector) {\n throw new Error(`${provider} is not available`);\n }\n\n const authorized = agent.authorizedTypes.has(connectorRef);\n const action =\n connector.connectionStatus === \"reconnect-required\" ||\n connector.connectionStatus === \"scope-mismatch\"\n ? \"reconnect\"\n : connector.connected && !authorized\n ? \"authorize\"\n : !connector.connected\n ? \"connect\"\n : \"ready\";\n const url =\n action === \"reconnect\"\n ? connector.connectionStatus === \"scope-mismatch\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : `${origin}/connectors`\n : action === \"authorize\"\n ? `${origin}/connectors/${connectorRef}/authorize?agentId=${agentId}`\n : action === \"connect\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : null;\n\n if (options.json) {\n console.log(JSON.stringify({ provider, action, url }));\n return;\n }\n if (!url) {\n console.log(chalk.green(`✓ ${connector.label} is ready`));\n console.log(\n chalk.dim(` Sender: ${connector.connection?.externalEmail}`),\n );\n console.log(\n chalk.dim(\n \" After creating a Gmail draft: zero mail link <draft-id>\",\n ),\n );\n return;\n }\n const label =\n action === \"authorize\"\n ? `Authorize ${connector.label}`\n : action === \"reconnect\"\n ? `Reconnect ${connector.label}`\n : `Connect ${connector.label}`;\n console.log(`${label}: [${label}](${url})`);\n }),\n );\n","import type { ZeroMailProvider } from \"@vm0/api-contracts/contracts/zero-mail\";\n\nexport const MAIL_CONNECTOR_REF = {\n gmail: \"gmail\",\n outlook: \"outlook-mail\",\n} as const;\n\nexport function parseMailProvider(value: string): ZeroMailProvider {\n if (value === \"gmail\" || value === \"outlook\") {\n return value;\n }\n throw new Error(`Unsupported mail provider: ${value}`, {\n cause: new Error(\"Use gmail or outlook\"),\n });\n}\n\nexport function currentAgentId(): string {\n const agentId = process.env.ZERO_AGENT_ID?.trim();\n if (!agentId) {\n throw new Error(\"ZERO_AGENT_ID is not set\", {\n cause: new Error(\"Run this command from an active Zero agent run\"),\n });\n }\n return agentId;\n}\n","import { Command } from \"commander\";\n\nimport { linkZeroMailDraft } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { currentAgentId } from \"./shared\";\n\nfunction currentChatThreadId(): string {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n if (!threadId) {\n throw new Error(\"ZERO_CHAT_THREAD_ID is not set\", {\n cause: new Error(\"Run this command from a Zero web chat thread\"),\n });\n }\n return threadId;\n}\n\nexport const linkCommand = new Command()\n .name(\"link\")\n .description(\"Link an existing Gmail draft to the current web chat\")\n .argument(\"<gmail-draft-id>\", \"Gmail draft ID\")\n .action(\n withErrorHandler(async (gmailDraftId: string) => {\n const result = await linkZeroMailDraft({\n threadId: currentChatThreadId(),\n agentId: currentAgentId(),\n gmailDraftId,\n });\n console.log(result.mailDraftUrl);\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { MAIL_CONNECTOR_REF, currentAgentId } from \"./shared\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Gmail and Outlook Mail availability for the current agent\")\n .action(\n withErrorHandler(async () => {\n const agentId = currentAgentId();\n const [{ connectors }, agent] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n\n const rows = Object.entries(MAIL_CONNECTOR_REF).map(\n ([provider, connectorRef]) => {\n const connector = findConnectorStatusItem(connectors, connectorRef);\n const authorized = agent.authorizedTypes.has(connectorRef);\n const ready =\n authorized &&\n connector?.connected === true &&\n connector.connectionStatus === \"connected\";\n const sender = authorized\n ? (connector?.connection?.externalEmail ?? \"-\")\n : \"-\";\n const status = ready\n ? chalk.green(\"ready\")\n : connector?.connectionStatus === \"reconnect-required\" ||\n connector?.connectionStatus === \"scope-mismatch\"\n ? chalk.yellow(\"reconnect\")\n : connector?.connected\n ? chalk.yellow(\"authorize\")\n : chalk.dim(\"connect\");\n return { provider, sender, status };\n },\n );\n\n const providerWidth = Math.max(\n \"PROVIDER\".length,\n ...rows.map((row) => {\n return row.provider.length;\n }),\n );\n const senderWidth = Math.max(\n \"SENDER\".length,\n ...rows.map((row) => {\n return row.sender.length;\n }),\n );\n console.log(\n chalk.dim(\n [\n \"PROVIDER\".padEnd(providerWidth),\n \"SENDER\".padEnd(senderWidth),\n \"STATUS\",\n ].join(\" \"),\n ),\n );\n for (const row of rows) {\n console.log(\n [\n row.provider.padEnd(providerWidth),\n row.sender.padEnd(senderWidth),\n row.status,\n ].join(\" \"),\n );\n }\n console.log();\n console.log(\n chalk.dim(\" Run: zero mail connect gmail|outlook when needed\"),\n );\n }),\n );\n"],"mappings":"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","names":[]}
|
|
@@ -3,12 +3,13 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
callZeroMaps
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-5XVBOER3.js";
|
|
7
|
+
import "./chunk-HOIDOML4.js";
|
|
7
8
|
import "./chunk-LTDQISD7.js";
|
|
8
9
|
import {
|
|
9
10
|
source_default,
|
|
10
11
|
withErrorHandler
|
|
11
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-XYZN3XWH.js";
|
|
12
13
|
import "./chunk-LRHXR7JT.js";
|
|
13
14
|
import {
|
|
14
15
|
Command,
|
|
@@ -482,4 +483,4 @@ Notes:
|
|
|
482
483
|
export {
|
|
483
484
|
zeroMapsCommand
|
|
484
485
|
};
|
|
485
|
-
//# sourceMappingURL=maps-
|
|
486
|
+
//# sourceMappingURL=maps-F3YPBNGC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/maps/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { Command, InvalidArgumentError } from \"commander\";\nimport chalk from \"chalk\";\nimport { callZeroMaps, type ZeroMapsResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst TRAVEL_MODES = [\"driving\", \"walking\", \"bicycling\", \"transit\"] as const;\nconst PLACE_SEARCH_FIELDSETS = [\"pro\", \"enterprise\"] as const;\nconst PLACE_DETAIL_FIELDSETS = [\"essentials\", \"pro\", \"enterprise\"] as const;\nconst OSM_LAYERS = [\"roads\", \"buildings\", \"water\", \"parks\"] as const;\nconst OSM_STYLES = [\"standard\", \"guide\"] as const;\n\ntype TravelMode = (typeof TRAVEL_MODES)[number];\ntype PlaceSearchFieldset = (typeof PLACE_SEARCH_FIELDSETS)[number];\ntype PlaceDetailFieldset = (typeof PLACE_DETAIL_FIELDSETS)[number];\ntype OsmLayer = (typeof OSM_LAYERS)[number];\ntype OsmStyle = (typeof OSM_STYLES)[number];\n\ninterface JsonOption {\n json?: boolean;\n}\n\ninterface GeocodeOptions extends JsonOption {\n address: string;\n region?: string;\n}\n\ninterface ReverseGeocodeOptions extends JsonOption {\n lat: number;\n lng: number;\n}\n\ninterface DirectionsOptions extends JsonOption {\n origin: string;\n destination: string;\n mode: TravelMode;\n departureTime?: string;\n}\n\ninterface PlacesSearchOptions extends JsonOption {\n query: string;\n location?: string;\n radius?: number;\n limit: number;\n region?: string;\n fields: PlaceSearchFieldset;\n}\n\ninterface PlacesDetailsOptions extends JsonOption {\n placeId: string;\n fields: PlaceDetailFieldset;\n}\n\ninterface BBox {\n readonly west: number;\n readonly south: number;\n readonly east: number;\n readonly north: number;\n}\n\ninterface LatLng {\n readonly lat: number;\n readonly lng: number;\n}\n\ninterface OsmMarker extends LatLng {\n readonly label?: string;\n}\n\ninterface OsmAreaOptions extends JsonOption {\n bbox?: BBox;\n center?: LatLng;\n radius?: number;\n layers: readonly OsmLayer[];\n output?: string;\n}\n\ninterface OsmRenderOptions extends OsmAreaOptions {\n width: number;\n height: number;\n style: OsmStyle;\n title?: string;\n marker: readonly OsmMarker[];\n output: string;\n}\n\nfunction parseLatitude(value: string): number {\n const latitude = Number(value);\n if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new InvalidArgumentError(\"latitude must be a number from -90 to 90\");\n }\n return latitude;\n}\n\nfunction parseLongitude(value: string): number {\n const longitude = Number(value);\n if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new InvalidArgumentError(\n \"longitude must be a number from -180 to 180\",\n );\n }\n return longitude;\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\"value must be a positive integer\");\n }\n return parsed;\n}\n\nfunction parseLimit(value: string): number {\n const limit = parsePositiveInteger(value);\n if (limit > 20) {\n throw new InvalidArgumentError(\"limit must be between 1 and 20\");\n }\n return limit;\n}\n\nfunction parseIntegerInRange(value: string, min: number, max: number): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new InvalidArgumentError(\n `value must be an integer from ${min} to ${max}`,\n );\n }\n return parsed;\n}\n\nfunction parseTravelMode(value: string): TravelMode {\n if (TRAVEL_MODES.includes(value as TravelMode)) {\n return value as TravelMode;\n }\n throw new InvalidArgumentError(\n `mode must be one of: ${TRAVEL_MODES.join(\", \")}`,\n );\n}\n\nfunction parsePlaceSearchFields(value: string): PlaceSearchFieldset {\n if (PLACE_SEARCH_FIELDSETS.includes(value as PlaceSearchFieldset)) {\n return value as PlaceSearchFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_SEARCH_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parsePlaceDetailFields(value: string): PlaceDetailFieldset {\n if (PLACE_DETAIL_FIELDSETS.includes(value as PlaceDetailFieldset)) {\n return value as PlaceDetailFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_DETAIL_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parseBBox(value: string): BBox {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 4) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const [westRaw, southRaw, eastRaw, northRaw] = parts;\n if (!westRaw || !southRaw || !eastRaw || !northRaw) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const bbox = {\n west: parseLongitude(westRaw),\n south: parseLatitude(southRaw),\n east: parseLongitude(eastRaw),\n north: parseLatitude(northRaw),\n };\n if (bbox.east <= bbox.west || bbox.north <= bbox.south) {\n throw new InvalidArgumentError(\n \"bbox east/north must be greater than west/south\",\n );\n }\n return bbox;\n}\n\nfunction parseLatLng(value: string): LatLng {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new InvalidArgumentError(\"coordinates must be lat,lng\");\n }\n return {\n lat: parseLatitude(parts[0]),\n lng: parseLongitude(parts[1]),\n };\n}\n\nfunction parseOsmLayers(value: string): readonly OsmLayer[] {\n const layers = [\n ...new Set(\n value\n .split(\",\")\n .map((layer) => {\n return layer.trim();\n })\n .filter(Boolean),\n ),\n ];\n if (layers.length === 0) {\n throw new InvalidArgumentError(\"layers must include at least one value\");\n }\n const invalid = layers.find((layer) => {\n return !OSM_LAYERS.includes(layer as OsmLayer);\n });\n if (invalid) {\n throw new InvalidArgumentError(\n `layers must be drawn from: ${OSM_LAYERS.join(\", \")}`,\n );\n }\n return layers as readonly OsmLayer[];\n}\n\nfunction parseOsmStyle(value: string): OsmStyle {\n if (OSM_STYLES.includes(value as OsmStyle)) {\n return value as OsmStyle;\n }\n throw new InvalidArgumentError(\n `style must be one of: ${OSM_STYLES.join(\", \")}`,\n );\n}\n\nfunction parseOsmMarker(value: string): OsmMarker {\n const [latRaw, lngRaw, ...labelParts] = value.split(\",\");\n if (!latRaw?.trim() || !lngRaw?.trim()) {\n throw new InvalidArgumentError(\"marker must be lat,lng or lat,lng,label\");\n }\n const label = labelParts.join(\",\").trim();\n return {\n lat: parseLatitude(latRaw.trim()),\n lng: parseLongitude(lngRaw.trim()),\n ...(label ? { label } : {}),\n };\n}\n\nfunction collectOsmMarker(\n value: string,\n previous: readonly OsmMarker[],\n): readonly OsmMarker[] {\n return [...previous, parseOsmMarker(value)];\n}\n\nfunction osmAreaPayload(options: OsmAreaOptions): Record<string, unknown> {\n const hasBbox = options.bbox !== undefined;\n const hasCenterRadius =\n options.center !== undefined && options.radius !== undefined;\n if (hasBbox === hasCenterRadius) {\n throw new Error(\"Provide either --bbox or --center with --radius\");\n }\n return {\n ...(options.bbox ? { bbox: options.bbox } : {}),\n ...(options.center ? { center: options.center } : {}),\n ...(options.radius !== undefined ? { radiusMeters: options.radius } : {}),\n layers: options.layers,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resultRecord(response: ZeroMapsResponse): Record<string, unknown> {\n if (!isRecord(response.result)) {\n throw new Error(\"Zero Maps response did not include an object result\");\n }\n return response.result;\n}\n\nfunction stringField(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nfunction numberField(\n value: Record<string, unknown>,\n key: string,\n): number | undefined {\n const field = value[key];\n return typeof field === \"number\" ? field : undefined;\n}\n\nasync function writeOutputFile(\n outputPath: string,\n content: string | Buffer,\n): Promise<void> {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, content);\n}\n\nasync function writeOsmGeoJson(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n if (!(\"geojson\" in result)) {\n throw new Error(\"Zero Maps OSM download response did not include geojson\");\n }\n await writeOutputFile(\n outputPath,\n `${JSON.stringify(result.geojson, null, 2)}\\n`,\n );\n}\n\nasync function writeOsmPng(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n const image = result.image;\n if (!isRecord(image) || typeof image.base64 !== \"string\") {\n throw new Error(\n \"Zero Maps OSM render response did not include a PNG image\",\n );\n }\n await writeOutputFile(outputPath, Buffer.from(image.base64, \"base64\"));\n}\n\nfunction renderMapsMetadata(response: ZeroMapsResponse): void {\n if (response.provider) {\n console.log(chalk.dim(` Provider: ${response.provider}`));\n }\n if (response.billingCategory) {\n console.log(chalk.dim(` Billing category: ${response.billingCategory}`));\n }\n if (response.billingQuantity !== undefined) {\n console.log(chalk.dim(` Billing quantity: ${response.billingQuantity}`));\n }\n if (response.creditsCharged !== undefined) {\n console.log(chalk.dim(` Credits charged: ${response.creditsCharged}`));\n }\n}\n\nfunction renderMapsResponse(label: string, response: ZeroMapsResponse): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = response.result ?? response;\n console.log(JSON.stringify(result, null, 2));\n}\n\nfunction renderOsmFileResponse(\n label: string,\n response: ZeroMapsResponse,\n outputPath: string,\n): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = isRecord(response.result) ? response.result : {};\n const featureCount = numberField(result, \"featureCount\");\n const attribution = stringField(result, \"attribution\");\n if (featureCount !== undefined) {\n console.log(chalk.dim(` Features: ${featureCount}`));\n }\n if (attribution) {\n console.log(chalk.dim(` Attribution: ${attribution}`));\n }\n console.log(chalk.dim(` Output: ${outputPath}`));\n}\n\nasync function runMapsRequest(\n label: string,\n endpoint:\n | \"geocode\"\n | \"reverse-geocode\"\n | \"directions\"\n | \"places/search\"\n | \"places/details\"\n | \"osm/download\"\n | \"osm/render\",\n payload: Record<string, unknown>,\n options: JsonOption,\n): Promise<void> {\n const response = await callZeroMaps(endpoint, payload);\n\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n renderMapsResponse(label, response);\n}\n\nconst geocodeCommand = new Command()\n .name(\"geocode\")\n .description(\"Convert an address into coordinates\")\n .requiredOption(\"--address <address>\", \"Address to geocode\")\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: GeocodeOptions) => {\n await runMapsRequest(\n \"Geocode completed\",\n \"geocode\",\n { address: options.address, region: options.region },\n options,\n );\n }),\n );\n\nconst reverseGeocodeCommand = new Command()\n .name(\"reverse-geocode\")\n .description(\"Convert coordinates into an address\")\n .requiredOption(\"--lat <number>\", \"Latitude\", parseLatitude)\n .requiredOption(\"--lng <number>\", \"Longitude\", parseLongitude)\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: ReverseGeocodeOptions) => {\n await runMapsRequest(\n \"Reverse geocode completed\",\n \"reverse-geocode\",\n { lat: options.lat, lng: options.lng },\n options,\n );\n }),\n );\n\nconst directionsCommand = new Command()\n .name(\"directions\")\n .description(\"Get a route between two places\")\n .requiredOption(\n \"--origin <place>\",\n \"Origin address, coordinates, or place ID\",\n )\n .requiredOption(\n \"--destination <place>\",\n \"Destination address, coordinates, or place ID\",\n )\n .option(\n \"--mode <mode>\",\n \"Travel mode: driving, walking, bicycling, or transit\",\n parseTravelMode,\n \"driving\",\n )\n .option(\"--departure-time <time>\", \"ISO departure time or provider keyword\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: DirectionsOptions) => {\n await runMapsRequest(\n \"Directions completed\",\n \"directions\",\n {\n origin: options.origin,\n destination: options.destination,\n mode: options.mode,\n departureTime: options.departureTime,\n },\n options,\n );\n }),\n );\n\nconst placesSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search for places\")\n .requiredOption(\"--query <query>\", \"Place search query\")\n .option(\"--location <lat,lng>\", \"Optional location bias\")\n .option(\n \"--radius <meters>\",\n \"Optional search radius in meters\",\n parsePositiveInteger,\n )\n .option(\n \"--limit <n>\",\n \"Maximum places to return, from 1 to 20\",\n parseLimit,\n 5,\n )\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\n \"--fields <fields>\",\n \"Field set: pro or enterprise\",\n parsePlaceSearchFields,\n \"pro\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesSearchOptions) => {\n await runMapsRequest(\n \"Places search completed\",\n \"places/search\",\n {\n query: options.query,\n location: options.location,\n radius: options.radius,\n limit: options.limit,\n region: options.region,\n fields: options.fields,\n },\n options,\n );\n }),\n );\n\nconst placesDetailsCommand = new Command()\n .name(\"details\")\n .description(\"Get details for a place\")\n .requiredOption(\"--place-id <id>\", \"Provider place ID\")\n .option(\n \"--fields <fields>\",\n \"Field set: essentials, pro, or enterprise\",\n parsePlaceDetailFields,\n \"essentials\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesDetailsOptions) => {\n await runMapsRequest(\n \"Place details completed\",\n \"places/details\",\n { placeId: options.placeId, fields: options.fields },\n options,\n );\n }),\n );\n\nconst osmDownloadCommand = new Command()\n .name(\"download\")\n .description(\"Download OpenStreetMap vector features as GeoJSON\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\"--output <path>\", \"Write GeoJSON to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmAreaOptions) => {\n const response = await callZeroMaps(\n \"osm/download\",\n osmAreaPayload(options),\n );\n if (options.output) {\n await writeOsmGeoJson(options.output, response);\n }\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n if (options.output) {\n renderOsmFileResponse(\n \"OSM download completed\",\n response,\n options.output,\n );\n return;\n }\n renderMapsResponse(\"OSM download completed\", response);\n }),\n );\n\nconst osmRenderCommand = new Command()\n .name(\"render\")\n .description(\"Render OpenStreetMap vector features to PNG\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\n \"--width <px>\",\n \"PNG width in pixels, from 320 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 320, 2_048);\n },\n 1_536,\n )\n .option(\n \"--height <px>\",\n \"PNG height in pixels, from 240 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 240, 2_048);\n },\n 1_024,\n )\n .option(\n \"--style <style>\",\n \"Render style: standard or guide\",\n parseOsmStyle,\n \"standard\",\n )\n .option(\"--title <text>\", \"Optional title drawn onto the PNG\")\n .option(\n \"--marker <lat,lng[,label]>\",\n \"Marker to draw; repeat for multiple markers\",\n collectOsmMarker,\n [],\n )\n .requiredOption(\"--output <path>\", \"Write PNG to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmRenderOptions) => {\n const response = await callZeroMaps(\"osm/render\", {\n ...osmAreaPayload(options),\n width: options.width,\n height: options.height,\n style: options.style,\n title: options.title,\n markers: options.marker,\n });\n await writeOsmPng(options.output, response);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n renderOsmFileResponse(\"OSM render completed\", response, options.output);\n }),\n );\n\nconst osmCommand = new Command()\n .name(\"osm\")\n .description(\"Download and render OpenStreetMap data\")\n .addCommand(osmDownloadCommand)\n .addCommand(osmRenderCommand);\n\nconst placesCommand = new Command()\n .name(\"places\")\n .description(\"Search places and fetch place details\")\n .addCommand(placesSearchCommand)\n .addCommand(placesDetailsCommand);\n\nexport const zeroMapsCommand = new Command()\n .name(\"maps\")\n .description(\"Use managed zero maps services\")\n .addCommand(geocodeCommand)\n .addCommand(reverseGeocodeCommand)\n .addCommand(directionsCommand)\n .addCommand(placesCommand)\n .addCommand(osmCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Geocode address: zero maps geocode --address \"1 Infinite Loop, Cupertino\" --json\n Get route: zero maps directions --origin \"SFO\" --destination \"Mountain View\" --mode driving --json\n Search places: zero maps places search --query \"coffee near Union Square SF\" --limit 5 --json\n Enterprise search: zero maps places search --query \"restaurants in SoMa\" --fields enterprise --json\n Place details: zero maps places details --place-id <id> --fields essentials --json\n Enterprise details: zero maps places details --place-id <id> --fields enterprise --json\n Download OSM data: zero maps osm download --bbox -122.43,37.76,-122.40,37.79 --output map.geojson\n Render OSM PNG: zero maps osm render --center 37.7749,-122.4194 --radius 1200 --output map.png\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires maps:read capability) or a CLI token\n - Google Maps and OpenStreetMap calls and credit billing happen on the vm0 API server\n - Use --fields essentials for place details unless paid fields are required`,\n );\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/maps/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { Command, InvalidArgumentError } from \"commander\";\nimport chalk from \"chalk\";\nimport { callZeroMaps, type ZeroMapsResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst TRAVEL_MODES = [\"driving\", \"walking\", \"bicycling\", \"transit\"] as const;\nconst PLACE_SEARCH_FIELDSETS = [\"pro\", \"enterprise\"] as const;\nconst PLACE_DETAIL_FIELDSETS = [\"essentials\", \"pro\", \"enterprise\"] as const;\nconst OSM_LAYERS = [\"roads\", \"buildings\", \"water\", \"parks\"] as const;\nconst OSM_STYLES = [\"standard\", \"guide\"] as const;\n\ntype TravelMode = (typeof TRAVEL_MODES)[number];\ntype PlaceSearchFieldset = (typeof PLACE_SEARCH_FIELDSETS)[number];\ntype PlaceDetailFieldset = (typeof PLACE_DETAIL_FIELDSETS)[number];\ntype OsmLayer = (typeof OSM_LAYERS)[number];\ntype OsmStyle = (typeof OSM_STYLES)[number];\n\ninterface JsonOption {\n json?: boolean;\n}\n\ninterface GeocodeOptions extends JsonOption {\n address: string;\n region?: string;\n}\n\ninterface ReverseGeocodeOptions extends JsonOption {\n lat: number;\n lng: number;\n}\n\ninterface DirectionsOptions extends JsonOption {\n origin: string;\n destination: string;\n mode: TravelMode;\n departureTime?: string;\n}\n\ninterface PlacesSearchOptions extends JsonOption {\n query: string;\n location?: string;\n radius?: number;\n limit: number;\n region?: string;\n fields: PlaceSearchFieldset;\n}\n\ninterface PlacesDetailsOptions extends JsonOption {\n placeId: string;\n fields: PlaceDetailFieldset;\n}\n\ninterface BBox {\n readonly west: number;\n readonly south: number;\n readonly east: number;\n readonly north: number;\n}\n\ninterface LatLng {\n readonly lat: number;\n readonly lng: number;\n}\n\ninterface OsmMarker extends LatLng {\n readonly label?: string;\n}\n\ninterface OsmAreaOptions extends JsonOption {\n bbox?: BBox;\n center?: LatLng;\n radius?: number;\n layers: readonly OsmLayer[];\n output?: string;\n}\n\ninterface OsmRenderOptions extends OsmAreaOptions {\n width: number;\n height: number;\n style: OsmStyle;\n title?: string;\n marker: readonly OsmMarker[];\n output: string;\n}\n\nfunction parseLatitude(value: string): number {\n const latitude = Number(value);\n if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new InvalidArgumentError(\"latitude must be a number from -90 to 90\");\n }\n return latitude;\n}\n\nfunction parseLongitude(value: string): number {\n const longitude = Number(value);\n if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new InvalidArgumentError(\n \"longitude must be a number from -180 to 180\",\n );\n }\n return longitude;\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\"value must be a positive integer\");\n }\n return parsed;\n}\n\nfunction parseLimit(value: string): number {\n const limit = parsePositiveInteger(value);\n if (limit > 20) {\n throw new InvalidArgumentError(\"limit must be between 1 and 20\");\n }\n return limit;\n}\n\nfunction parseIntegerInRange(value: string, min: number, max: number): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new InvalidArgumentError(\n `value must be an integer from ${min} to ${max}`,\n );\n }\n return parsed;\n}\n\nfunction parseTravelMode(value: string): TravelMode {\n if (TRAVEL_MODES.includes(value as TravelMode)) {\n return value as TravelMode;\n }\n throw new InvalidArgumentError(\n `mode must be one of: ${TRAVEL_MODES.join(\", \")}`,\n );\n}\n\nfunction parsePlaceSearchFields(value: string): PlaceSearchFieldset {\n if (PLACE_SEARCH_FIELDSETS.includes(value as PlaceSearchFieldset)) {\n return value as PlaceSearchFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_SEARCH_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parsePlaceDetailFields(value: string): PlaceDetailFieldset {\n if (PLACE_DETAIL_FIELDSETS.includes(value as PlaceDetailFieldset)) {\n return value as PlaceDetailFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_DETAIL_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parseBBox(value: string): BBox {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 4) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const [westRaw, southRaw, eastRaw, northRaw] = parts;\n if (!westRaw || !southRaw || !eastRaw || !northRaw) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const bbox = {\n west: parseLongitude(westRaw),\n south: parseLatitude(southRaw),\n east: parseLongitude(eastRaw),\n north: parseLatitude(northRaw),\n };\n if (bbox.east <= bbox.west || bbox.north <= bbox.south) {\n throw new InvalidArgumentError(\n \"bbox east/north must be greater than west/south\",\n );\n }\n return bbox;\n}\n\nfunction parseLatLng(value: string): LatLng {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new InvalidArgumentError(\"coordinates must be lat,lng\");\n }\n return {\n lat: parseLatitude(parts[0]),\n lng: parseLongitude(parts[1]),\n };\n}\n\nfunction parseOsmLayers(value: string): readonly OsmLayer[] {\n const layers = [\n ...new Set(\n value\n .split(\",\")\n .map((layer) => {\n return layer.trim();\n })\n .filter(Boolean),\n ),\n ];\n if (layers.length === 0) {\n throw new InvalidArgumentError(\"layers must include at least one value\");\n }\n const invalid = layers.find((layer) => {\n return !OSM_LAYERS.includes(layer as OsmLayer);\n });\n if (invalid) {\n throw new InvalidArgumentError(\n `layers must be drawn from: ${OSM_LAYERS.join(\", \")}`,\n );\n }\n return layers as readonly OsmLayer[];\n}\n\nfunction parseOsmStyle(value: string): OsmStyle {\n if (OSM_STYLES.includes(value as OsmStyle)) {\n return value as OsmStyle;\n }\n throw new InvalidArgumentError(\n `style must be one of: ${OSM_STYLES.join(\", \")}`,\n );\n}\n\nfunction parseOsmMarker(value: string): OsmMarker {\n const [latRaw, lngRaw, ...labelParts] = value.split(\",\");\n if (!latRaw?.trim() || !lngRaw?.trim()) {\n throw new InvalidArgumentError(\"marker must be lat,lng or lat,lng,label\");\n }\n const label = labelParts.join(\",\").trim();\n return {\n lat: parseLatitude(latRaw.trim()),\n lng: parseLongitude(lngRaw.trim()),\n ...(label ? { label } : {}),\n };\n}\n\nfunction collectOsmMarker(\n value: string,\n previous: readonly OsmMarker[],\n): readonly OsmMarker[] {\n return [...previous, parseOsmMarker(value)];\n}\n\nfunction osmAreaPayload(options: OsmAreaOptions): Record<string, unknown> {\n const hasBbox = options.bbox !== undefined;\n const hasCenterRadius =\n options.center !== undefined && options.radius !== undefined;\n if (hasBbox === hasCenterRadius) {\n throw new Error(\"Provide either --bbox or --center with --radius\");\n }\n return {\n ...(options.bbox ? { bbox: options.bbox } : {}),\n ...(options.center ? { center: options.center } : {}),\n ...(options.radius !== undefined ? { radiusMeters: options.radius } : {}),\n layers: options.layers,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resultRecord(response: ZeroMapsResponse): Record<string, unknown> {\n if (!isRecord(response.result)) {\n throw new Error(\"Zero Maps response did not include an object result\");\n }\n return response.result;\n}\n\nfunction stringField(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nfunction numberField(\n value: Record<string, unknown>,\n key: string,\n): number | undefined {\n const field = value[key];\n return typeof field === \"number\" ? field : undefined;\n}\n\nasync function writeOutputFile(\n outputPath: string,\n content: string | Buffer,\n): Promise<void> {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, content);\n}\n\nasync function writeOsmGeoJson(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n if (!(\"geojson\" in result)) {\n throw new Error(\"Zero Maps OSM download response did not include geojson\");\n }\n await writeOutputFile(\n outputPath,\n `${JSON.stringify(result.geojson, null, 2)}\\n`,\n );\n}\n\nasync function writeOsmPng(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n const image = result.image;\n if (!isRecord(image) || typeof image.base64 !== \"string\") {\n throw new Error(\n \"Zero Maps OSM render response did not include a PNG image\",\n );\n }\n await writeOutputFile(outputPath, Buffer.from(image.base64, \"base64\"));\n}\n\nfunction renderMapsMetadata(response: ZeroMapsResponse): void {\n if (response.provider) {\n console.log(chalk.dim(` Provider: ${response.provider}`));\n }\n if (response.billingCategory) {\n console.log(chalk.dim(` Billing category: ${response.billingCategory}`));\n }\n if (response.billingQuantity !== undefined) {\n console.log(chalk.dim(` Billing quantity: ${response.billingQuantity}`));\n }\n if (response.creditsCharged !== undefined) {\n console.log(chalk.dim(` Credits charged: ${response.creditsCharged}`));\n }\n}\n\nfunction renderMapsResponse(label: string, response: ZeroMapsResponse): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = response.result ?? response;\n console.log(JSON.stringify(result, null, 2));\n}\n\nfunction renderOsmFileResponse(\n label: string,\n response: ZeroMapsResponse,\n outputPath: string,\n): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = isRecord(response.result) ? response.result : {};\n const featureCount = numberField(result, \"featureCount\");\n const attribution = stringField(result, \"attribution\");\n if (featureCount !== undefined) {\n console.log(chalk.dim(` Features: ${featureCount}`));\n }\n if (attribution) {\n console.log(chalk.dim(` Attribution: ${attribution}`));\n }\n console.log(chalk.dim(` Output: ${outputPath}`));\n}\n\nasync function runMapsRequest(\n label: string,\n endpoint:\n | \"geocode\"\n | \"reverse-geocode\"\n | \"directions\"\n | \"places/search\"\n | \"places/details\"\n | \"osm/download\"\n | \"osm/render\",\n payload: Record<string, unknown>,\n options: JsonOption,\n): Promise<void> {\n const response = await callZeroMaps(endpoint, payload);\n\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n renderMapsResponse(label, response);\n}\n\nconst geocodeCommand = new Command()\n .name(\"geocode\")\n .description(\"Convert an address into coordinates\")\n .requiredOption(\"--address <address>\", \"Address to geocode\")\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: GeocodeOptions) => {\n await runMapsRequest(\n \"Geocode completed\",\n \"geocode\",\n { address: options.address, region: options.region },\n options,\n );\n }),\n );\n\nconst reverseGeocodeCommand = new Command()\n .name(\"reverse-geocode\")\n .description(\"Convert coordinates into an address\")\n .requiredOption(\"--lat <number>\", \"Latitude\", parseLatitude)\n .requiredOption(\"--lng <number>\", \"Longitude\", parseLongitude)\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: ReverseGeocodeOptions) => {\n await runMapsRequest(\n \"Reverse geocode completed\",\n \"reverse-geocode\",\n { lat: options.lat, lng: options.lng },\n options,\n );\n }),\n );\n\nconst directionsCommand = new Command()\n .name(\"directions\")\n .description(\"Get a route between two places\")\n .requiredOption(\n \"--origin <place>\",\n \"Origin address, coordinates, or place ID\",\n )\n .requiredOption(\n \"--destination <place>\",\n \"Destination address, coordinates, or place ID\",\n )\n .option(\n \"--mode <mode>\",\n \"Travel mode: driving, walking, bicycling, or transit\",\n parseTravelMode,\n \"driving\",\n )\n .option(\"--departure-time <time>\", \"ISO departure time or provider keyword\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: DirectionsOptions) => {\n await runMapsRequest(\n \"Directions completed\",\n \"directions\",\n {\n origin: options.origin,\n destination: options.destination,\n mode: options.mode,\n departureTime: options.departureTime,\n },\n options,\n );\n }),\n );\n\nconst placesSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search for places\")\n .requiredOption(\"--query <query>\", \"Place search query\")\n .option(\"--location <lat,lng>\", \"Optional location bias\")\n .option(\n \"--radius <meters>\",\n \"Optional search radius in meters\",\n parsePositiveInteger,\n )\n .option(\n \"--limit <n>\",\n \"Maximum places to return, from 1 to 20\",\n parseLimit,\n 5,\n )\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\n \"--fields <fields>\",\n \"Field set: pro or enterprise\",\n parsePlaceSearchFields,\n \"pro\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesSearchOptions) => {\n await runMapsRequest(\n \"Places search completed\",\n \"places/search\",\n {\n query: options.query,\n location: options.location,\n radius: options.radius,\n limit: options.limit,\n region: options.region,\n fields: options.fields,\n },\n options,\n );\n }),\n );\n\nconst placesDetailsCommand = new Command()\n .name(\"details\")\n .description(\"Get details for a place\")\n .requiredOption(\"--place-id <id>\", \"Provider place ID\")\n .option(\n \"--fields <fields>\",\n \"Field set: essentials, pro, or enterprise\",\n parsePlaceDetailFields,\n \"essentials\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesDetailsOptions) => {\n await runMapsRequest(\n \"Place details completed\",\n \"places/details\",\n { placeId: options.placeId, fields: options.fields },\n options,\n );\n }),\n );\n\nconst osmDownloadCommand = new Command()\n .name(\"download\")\n .description(\"Download OpenStreetMap vector features as GeoJSON\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\"--output <path>\", \"Write GeoJSON to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmAreaOptions) => {\n const response = await callZeroMaps(\n \"osm/download\",\n osmAreaPayload(options),\n );\n if (options.output) {\n await writeOsmGeoJson(options.output, response);\n }\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n if (options.output) {\n renderOsmFileResponse(\n \"OSM download completed\",\n response,\n options.output,\n );\n return;\n }\n renderMapsResponse(\"OSM download completed\", response);\n }),\n );\n\nconst osmRenderCommand = new Command()\n .name(\"render\")\n .description(\"Render OpenStreetMap vector features to PNG\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\n \"--width <px>\",\n \"PNG width in pixels, from 320 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 320, 2_048);\n },\n 1_536,\n )\n .option(\n \"--height <px>\",\n \"PNG height in pixels, from 240 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 240, 2_048);\n },\n 1_024,\n )\n .option(\n \"--style <style>\",\n \"Render style: standard or guide\",\n parseOsmStyle,\n \"standard\",\n )\n .option(\"--title <text>\", \"Optional title drawn onto the PNG\")\n .option(\n \"--marker <lat,lng[,label]>\",\n \"Marker to draw; repeat for multiple markers\",\n collectOsmMarker,\n [],\n )\n .requiredOption(\"--output <path>\", \"Write PNG to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmRenderOptions) => {\n const response = await callZeroMaps(\"osm/render\", {\n ...osmAreaPayload(options),\n width: options.width,\n height: options.height,\n style: options.style,\n title: options.title,\n markers: options.marker,\n });\n await writeOsmPng(options.output, response);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n renderOsmFileResponse(\"OSM render completed\", response, options.output);\n }),\n );\n\nconst osmCommand = new Command()\n .name(\"osm\")\n .description(\"Download and render OpenStreetMap data\")\n .addCommand(osmDownloadCommand)\n .addCommand(osmRenderCommand);\n\nconst placesCommand = new Command()\n .name(\"places\")\n .description(\"Search places and fetch place details\")\n .addCommand(placesSearchCommand)\n .addCommand(placesDetailsCommand);\n\nexport const zeroMapsCommand = new Command()\n .name(\"maps\")\n .description(\"Use managed zero maps services\")\n .addCommand(geocodeCommand)\n .addCommand(reverseGeocodeCommand)\n .addCommand(directionsCommand)\n .addCommand(placesCommand)\n .addCommand(osmCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Geocode address: zero maps geocode --address \"1 Infinite Loop, Cupertino\" --json\n Get route: zero maps directions --origin \"SFO\" --destination \"Mountain View\" --mode driving --json\n Search places: zero maps places search --query \"coffee near Union Square SF\" --limit 5 --json\n Enterprise search: zero maps places search --query \"restaurants in SoMa\" --fields enterprise --json\n Place details: zero maps places details --place-id <id> --fields essentials --json\n Enterprise details: zero maps places details --place-id <id> --fields enterprise --json\n Download OSM data: zero maps osm download --bbox -122.43,37.76,-122.40,37.79 --output map.geojson\n Render OSM PNG: zero maps osm render --center 37.7749,-122.4194 --radius 1200 --output map.png\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires maps:read capability) or a CLI token\n - Google Maps and OpenStreetMap calls and credit billing happen on the vm0 API server\n - Use --fields essentials for place details unless paid fields are required`,\n );\n"],"mappings":"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","names":[]}
|