@vm0/cli 9.139.3 → 9.140.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/{chunk-AQFESZSO.js → chunk-6LA4WVWX.js} +35 -4
- package/{chunk-AQFESZSO.js.map → chunk-6LA4WVWX.js.map} +1 -1
- package/index.js +9 -9
- package/package.json +1 -1
- package/zero.js +257 -3
- package/zero.js.map +1 -1
package/zero.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/zero.ts","../src/commands/zero/org/index.ts","../src/commands/zero/org/status.ts","../src/commands/zero/org/set.ts","../src/commands/zero/org/list.ts","../src/commands/zero/org/use.ts","../src/commands/zero/org/members.ts","../src/commands/zero/org/invite.ts","../src/commands/zero/org/remove.ts","../src/commands/zero/org/leave.ts","../src/commands/zero/org/delete.ts","../src/commands/zero/org/secret/index.ts","../src/commands/zero/org/secret/list.ts","../src/commands/zero/org/secret/set.ts","../src/commands/zero/org/secret/remove.ts","../src/commands/zero/org/variable/index.ts","../src/commands/zero/org/variable/list.ts","../src/commands/zero/org/variable/set.ts","../src/commands/zero/org/variable/remove.ts","../src/commands/zero/org/model-provider/index.ts","../src/commands/zero/org/model-provider/list.ts","../src/commands/zero/org/model-provider/setup.ts","../src/lib/domain/model-provider/shared.ts","../src/commands/zero/org/model-provider/remove.ts","../src/commands/zero/org/model-provider/set-default.ts","../src/commands/zero/agent/index.ts","../src/commands/zero/agent/create.ts","../src/commands/zero/agent/avatar.ts","../src/commands/zero/agent/edit.ts","../src/commands/zero/agent/view.ts","../src/lib/utils/format-utils.ts","../src/commands/zero/agent/list.ts","../src/commands/zero/agent/delete.ts","../src/commands/zero/connector/index.ts","../src/commands/zero/connector/list.ts","../src/commands/zero/connector/agent-context.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../src/commands/zero/connector/status.ts","../src/lib/domain/schedule-utils.ts","../src/commands/zero/doctor/platform-url.ts","../src/commands/zero/doctor/index.ts","../src/commands/zero/doctor/check-connector.ts","../src/commands/zero/doctor/permission-deny.ts","../src/commands/zero/doctor/permission-change.ts","../src/commands/zero/doctor/resolve-role.ts","../src/commands/zero/preference/index.ts","../src/commands/zero/run/index.ts","../src/commands/zero/run/run.ts","../src/commands/zero/run/shared.ts","../src/commands/zero/run/continue.ts","../src/commands/zero/schedule/index.ts","../src/commands/zero/schedule/setup.ts","../src/commands/zero/schedule/list.ts","../src/commands/zero/schedule/status.ts","../src/commands/zero/schedule/delete.ts","../src/commands/zero/schedule/enable.ts","../src/commands/zero/schedule/disable.ts","../src/commands/zero/secret/index.ts","../src/commands/zero/secret/list.ts","../src/commands/zero/secret/set.ts","../src/commands/zero/secret/delete.ts","../src/commands/zero/chat/index.ts","../src/commands/zero/chat/message/index.ts","../src/commands/zero/chat/message/send.ts","../src/commands/zero/slack/index.ts","../src/commands/zero/slack/message/index.ts","../src/commands/zero/slack/message/send.ts","../src/commands/zero/slack/upload-file.ts","../src/commands/zero/slack/download-file.ts","../src/commands/zero/telegram/index.ts","../src/commands/zero/telegram/bot/index.ts","../src/commands/zero/telegram/bot/list.ts","../src/commands/zero/telegram/download-file.ts","../src/commands/zero/telegram/message/index.ts","../src/commands/zero/telegram/message/send.ts","../src/commands/zero/telegram/upload-file.ts","../src/commands/zero/variable/index.ts","../src/commands/zero/variable/list.ts","../src/commands/zero/variable/set.ts","../src/commands/zero/variable/delete.ts","../src/commands/zero/whoami.ts","../src/commands/zero/skill/index.ts","../src/commands/zero/skill/create.ts","../src/lib/skill-directory.ts","../src/commands/zero/skill/edit.ts","../src/commands/zero/skill/view.ts","../src/commands/zero/skill/list.ts","../src/commands/zero/skill/delete.ts","../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts","../src/commands/zero/logs/search.ts","../src/commands/zero/search/index.ts","../src/commands/zero/developer-support.ts","../src/commands/zero/computer-use/index.ts","../src/commands/zero/computer-use/host.ts","../src/lib/computer-use/desktop-server.ts","../src/lib/computer-use/screencapture.ts","../src/lib/computer-use/cliclick.ts","../src/lib/computer-use/scroll.ts","../src/lib/computer-use/clipboard.ts","../src/lib/computer-use/application.ts","../src/lib/computer-use/ngrok.ts","../src/commands/zero/computer-use/client.ts","../src/lib/computer-use/client.ts","../src/commands/zero/web/index.ts","../src/commands/zero/web/download-file.ts","../src/commands/zero/web/upload-file.ts","../src/commands/zero/web/voice.ts"],"sourcesContent":["// Zero CLI entry point - standalone binary for zero platform commands\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { zeroOrgCommand } from \"./commands/zero/org\";\nimport { zeroAgentCommand } from \"./commands/zero/agent\";\nimport { zeroConnectorCommand } from \"./commands/zero/connector\";\nimport { zeroDoctorCommand } from \"./commands/zero/doctor\";\nimport { zeroPreferenceCommand } from \"./commands/zero/preference\";\nimport { zeroRunCommand } from \"./commands/zero/run\";\nimport { zeroScheduleCommand } from \"./commands/zero/schedule\";\nimport { zeroSecretCommand } from \"./commands/zero/secret\";\nimport { zeroChatCommand } from \"./commands/zero/chat\";\nimport { zeroSlackCommand } from \"./commands/zero/slack\";\nimport { zeroTelegramCommand } from \"./commands/zero/telegram\";\nimport { zeroVariableCommand } from \"./commands/zero/variable\";\nimport { zeroWhoamiCommand } from \"./commands/zero/whoami\";\nimport { zeroSkillCommand } from \"./commands/zero/skill\";\nimport { zeroLogsCommand } from \"./commands/zero/logs\";\nimport { zeroSearchCommand } from \"./commands/zero/search\";\nimport { zeroDeveloperSupportCommand } from \"./commands/zero/developer-support\";\nimport { zeroComputerUseCommand } from \"./commands/zero/computer-use\";\nimport { zeroWebCommand } from \"./commands/zero/web\";\nimport {\n decodeZeroTokenPayload,\n type ZeroTokenPayload,\n} from \"./lib/api/zero-token.js\";\n\n/**\n * Map of command names to the capability required to see them.\n * Commands not in this map are hidden when ZERO_TOKEN is active.\n * Use an array when a top-level command has subcommands with different\n * capability gates and any one of them should make the command visible.\n * Use `null` for commands that should always be visible in sandbox.\n */\nconst COMMAND_CAPABILITY_MAP: Record<\n string,\n string | readonly string[] | null\n> = {\n agent: \"agent:read\",\n skill: \"agent:read\",\n connector: \"connector:read\",\n run: \"agent-run:write\",\n schedule: \"schedule:read\",\n doctor: null,\n logs: \"agent-run:read\",\n search: \"chat-message:read\",\n chat: \"chat-message:write\",\n slack: \"slack:write\",\n telegram: [\"telegram:read\", \"telegram:write\"],\n whoami: null,\n \"developer-support\": null,\n \"computer-use\": \"computer-use:write\",\n web: null,\n};\n\nconst DEFAULT_COMMANDS: Command[] = [\n zeroOrgCommand,\n zeroAgentCommand,\n zeroConnectorCommand,\n zeroDoctorCommand,\n zeroPreferenceCommand,\n zeroRunCommand,\n zeroScheduleCommand,\n zeroSecretCommand,\n zeroChatCommand,\n zeroSlackCommand,\n zeroTelegramCommand,\n zeroVariableCommand,\n zeroLogsCommand,\n zeroSearchCommand,\n zeroWhoamiCommand,\n zeroSkillCommand,\n zeroDeveloperSupportCommand,\n zeroComputerUseCommand,\n zeroWebCommand,\n];\n\nfunction shouldHideCommand(\n name: string,\n payload: ZeroTokenPayload | undefined,\n): boolean {\n if (!payload) return false;\n const requiredCap = COMMAND_CAPABILITY_MAP[name];\n if (requiredCap === undefined) return true;\n if (requiredCap === null) return false;\n if (typeof requiredCap !== \"string\") {\n return !requiredCap.some((capability) => {\n return payload.capabilities.includes(capability);\n });\n }\n return !payload.capabilities.includes(requiredCap);\n}\n\n/**\n * Register commands with visibility based on ZERO_TOKEN capabilities.\n * Commands not granted by the token are registered as hidden via\n * Commander's public `addCommand(cmd, { hidden: true })` API.\n * When no ZERO_TOKEN is present, all commands remain visible.\n *\n * @param commands - override default commands (used in tests)\n */\nexport function registerZeroCommands(\n prog: Command,\n commands?: Command[],\n): void {\n const token = process.env.ZERO_TOKEN;\n const payload = token ? decodeZeroTokenPayload(token) : undefined;\n\n for (const cmd of commands ?? DEFAULT_COMMANDS) {\n const hidden = shouldHideCommand(cmd.name(), payload);\n prog.addCommand(cmd, hidden ? { hidden: true } : {});\n }\n}\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"zero\")\n .description(\n \"Zero CLI — interact with the zero platform from inside the sandbox\",\n )\n .version(__CLI_VERSION__)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name <ENV_NAME>\n Send a Slack message? zero slack message send --help\n List Telegram bots? zero telegram bot list\n Send Telegram? zero telegram message send --help\n Upload Telegram? zero telegram upload-file --help\n Download Telegram? zero telegram download-file --help\n Set up a schedule? zero schedule setup --help\n Update yourself? zero agent --help\n Manage custom skills? zero skill --help\n Check your identity? zero whoami`,\n );\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"zero.js\") ||\n process.argv[1]?.endsWith(\"zero.ts\") ||\n process.argv[1]?.endsWith(\"zero\")\n) {\n configureGlobalProxyFromEnv();\n registerZeroCommands(program);\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { statusCommand } from \"./status\";\nimport { setCommand } from \"./set\";\nimport { listCommand } from \"./list\";\nimport { useCommand } from \"./use\";\nimport { membersCommand } from \"./members\";\nimport { inviteCommand } from \"./invite\";\nimport { removeCommand } from \"./remove\";\nimport { leaveCommand } from \"./leave\";\nimport { deleteCommand } from \"./delete\";\nimport { zeroOrgSecretCommand } from \"./secret\";\nimport { zeroOrgVariableCommand } from \"./variable\";\nimport { zeroOrgModelProviderCommand } from \"./model-provider\";\n\nexport const zeroOrgCommand = new Command()\n .name(\"org\")\n .description(\"Manage organization settings, members, and providers\")\n .addCommand(statusCommand)\n .addCommand(setCommand)\n .addCommand(listCommand)\n .addCommand(useCommand)\n .addCommand(membersCommand)\n .addCommand(inviteCommand)\n .addCommand(removeCommand)\n .addCommand(leaveCommand)\n .addCommand(deleteCommand)\n .addCommand(zeroOrgSecretCommand)\n .addCommand(zeroOrgVariableCommand)\n .addCommand(zeroOrgModelProviderCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg } from \"../../../lib/api\";\nimport { ApiRequestError } from \"../../../lib/api/core/client-factory\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"View current organization status\")\n .action(\n withErrorHandler(async () => {\n try {\n const org = await getZeroOrg();\n\n console.log(chalk.bold(\"Organization Information:\"));\n console.log(` Slug: ${chalk.green(org.slug)}`);\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"No organization configured\", {\n cause: new Error(\"Set your organization with: zero org set <slug>\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg, updateZeroOrg, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Rename your organization slug\")\n .argument(\"<slug>\", \"The new organization slug\")\n .option(\n \"--force\",\n \"Force change existing organization (may break references)\",\n )\n .action(\n withErrorHandler(async (slug: string, options: { force?: boolean }) => {\n try {\n const existingOrg = await getZeroOrg();\n\n if (!options.force) {\n throw new Error(\n `You already have an organization: ${existingOrg.slug}`,\n {\n cause: new Error(`To change, use: zero org set ${slug} --force`),\n },\n );\n }\n\n const org = await updateZeroOrg({ slug, force: true });\n\n const result = await switchZeroOrg(org.slug);\n await saveConfig({\n token: result.access_token,\n });\n\n console.log(chalk.green(`✓ Organization updated to ${org.slug}`));\n console.log();\n console.log(\"Your agents will now be namespaced as:\");\n console.log(chalk.cyan(` ${org.slug}/<agent-name>`));\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"already exists\")\n ) {\n throw new Error(\n `Organization \"${slug}\" is already taken. Please choose a different slug.`,\n );\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .description(\"List all accessible organizations\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgs();\n const activeOrg = await getActiveOrg();\n\n console.log(chalk.bold(\"Available organizations:\"));\n for (const org of result.orgs) {\n const isCurrent = org.slug === activeOrg;\n const marker = isCurrent ? chalk.green(\"* \") : \" \";\n const roleLabel = org.role ? ` (${org.role})` : \"\";\n const currentLabel = isCurrent ? chalk.dim(\" ← current\") : \"\";\n console.log(`${marker}${org.slug}${roleLabel}${currentLabel}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const useCommand = new Command()\n .name(\"use\")\n .description(\"Switch to a different organization\")\n .argument(\"<slug>\", \"Organization slug to switch to\")\n .action(\n withErrorHandler(async (slug: string) => {\n const orgList = await listZeroOrgs();\n const target = orgList.orgs.find((s) => {\n return s.slug === slug;\n });\n if (!target) {\n throw new Error(`Organization '${slug}' not found or not accessible.`);\n }\n\n const result = await switchZeroOrg(slug);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Switched to organization: ${slug}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrgMembers } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const membersCommand = new Command()\n .name(\"members\")\n .description(\"View organization members\")\n .action(\n withErrorHandler(async () => {\n const status = await getZeroOrgMembers();\n\n console.log(chalk.bold(`Organization: ${status.slug}`));\n console.log(` Role: ${status.role}`);\n console.log(\n ` Created: ${new Date(status.createdAt).toLocaleDateString()}`,\n );\n console.log();\n console.log(chalk.bold(\"Members:\"));\n for (const member of status.members) {\n const roleTag =\n member.role === \"admin\"\n ? chalk.yellow(` (${member.role})`)\n : chalk.dim(` (${member.role})`);\n console.log(` ${member.email}${roleTag}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { inviteZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const inviteCommand = new Command()\n .name(\"invite\")\n .description(\"Invite a member to the current organization\")\n .requiredOption(\"--email <email>\", \"Email address of the member to invite\")\n .option(\n \"--role <role>\",\n \"Role for the invited member (member or admin)\",\n \"member\",\n )\n .action(\n withErrorHandler(async (options: { email: string; role: string }) => {\n if (options.role !== \"member\" && options.role !== \"admin\") {\n throw new Error(\n `Invalid role \"${options.role}\". Must be \"member\" or \"admin\".`,\n );\n }\n await inviteZeroOrgMember(options.email, options.role);\n console.log(\n chalk.green(`✓ Invitation sent to ${options.email} as ${options.role}`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { removeZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove a member from the current organization\")\n .argument(\"<email>\", \"Email address of the member to remove\")\n .action(\n withErrorHandler(async (email: string) => {\n await removeZeroOrgMember(email);\n console.log(chalk.green(`✓ Removed ${email} from organization`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { leaveZeroOrg, listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const leaveCommand = new Command()\n .name(\"leave\")\n .description(\"Leave the current organization\")\n .action(\n withErrorHandler(async () => {\n await leaveZeroOrg();\n\n const { orgs } = await listZeroOrgs();\n if (orgs.length === 0) {\n await saveConfig({ token: undefined });\n console.log(chalk.green(\"✓ Left organization.\"));\n console.log(\n chalk.yellow(\"No remaining organizations. Run: vm0 auth login\"),\n );\n return;\n }\n\n const nextOrg = orgs[0]!.slug;\n const result = await switchZeroOrg(nextOrg);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Left organization. Switched to: ${nextOrg}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrg } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete the current organization (admin only)\")\n .argument(\"<slug>\", \"Organization slug to confirm deletion\")\n .action(\n withErrorHandler(async (slug: string) => {\n await deleteZeroOrg(slug);\n console.log(chalk.green(`✓ Organization '${slug}' has been deleted.`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Manage org-level secrets (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgSecrets } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No org secrets found\"));\n console.log();\n console.log(\"To add an org secret:\");\n console.log(\n chalk.cyan(\" zero org secret set MY_API_KEY --body <value>\"),\n );\n return;\n }\n\n console.log(chalk.bold(\"Org Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n console.log(` ${chalk.cyan(secret.name)}`);\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptPassword,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero org secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroOrgSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgSecret(name);\n console.log(chalk.green(`✓ Org secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Manage org-level variables (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgVariables } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No org variables found\"));\n console.log();\n console.log(\"To add an org variable:\");\n console.log(chalk.cyan(\" zero org variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Org Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgVariable } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroOrgVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgVariable } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgVariable(name);\n console.log(chalk.green(`✓ Org variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setupCommand } from \"./setup\";\nimport { removeCommand } from \"./remove\";\nimport { setDefaultCommand } from \"./set-default\";\n\nexport const zeroOrgModelProviderCommand = new Command()\n .name(\"model-provider\")\n .description(\"Manage org-level model providers\")\n .addCommand(listCommand)\n .addCommand(setupCommand)\n .addCommand(removeCommand)\n .addCommand(setDefaultCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n MODEL_PROVIDER_TYPES,\n allowsCustomModel,\n getModels,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { listZeroOrgModelProviders } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level model providers\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgModelProviders();\n\n if (result.modelProviders.length === 0) {\n console.log(chalk.dim(\"No org-level model providers configured\"));\n console.log();\n console.log(\"To add an org-level model provider:\");\n console.log(chalk.cyan(\" zero org model-provider setup\"));\n return;\n }\n\n // Group by framework\n const byFramework = result.modelProviders.reduce(\n (acc, p) => {\n const fw = p.framework;\n if (!acc[fw]) {\n acc[fw] = [];\n }\n acc[fw].push(p);\n return acc;\n },\n {} as Record<string, typeof result.modelProviders>,\n );\n\n console.log(chalk.bold(\"Org Model Providers:\"));\n console.log();\n\n for (const [framework, providers] of Object.entries(byFramework)) {\n console.log(` ${chalk.cyan(framework)}:`);\n for (const provider of providers) {\n const defaultTag = provider.isDefault\n ? chalk.green(\" (default)\")\n : \"\";\n const modelTag = provider.selectedModel\n ? chalk.dim(` [${provider.selectedModel}]`)\n : \"\";\n console.log(` ${provider.type}${defaultTag}${modelTag}`);\n console.log(chalk.dim(` ID: ${provider.id}`));\n if (provider.type in MODEL_PROVIDER_TYPES) {\n const type = provider.type as ModelProviderType;\n const available = getModels(type) ?? [];\n if (available.length > 0) {\n console.log(\n chalk.dim(` Available models: ${available.join(\", \")}`),\n );\n } else if (allowsCustomModel(type)) {\n console.log(\n chalk.dim(\" Available models: (custom — any model name)\"),\n );\n }\n }\n console.log(\n chalk.dim(\n ` Updated: ${new Date(provider.updatedAt).toLocaleString()}`,\n ),\n );\n }\n console.log();\n }\n\n console.log(\n chalk.dim(`Total: ${result.modelProviders.length} provider(s)`),\n );\n console.log();\n console.log(\n chalk.dim(\n \"Use a provider ID with: zero agent edit <agent-id> --model-provider <id> --model <name>\",\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n listZeroOrgModelProviders,\n upsertZeroOrgModelProvider,\n updateZeroOrgModelProviderModel,\n setZeroOrgModelProviderDefault,\n} from \"../../../../lib/api\";\nimport {\n MODEL_PROVIDER_TYPES,\n hasModelSelection,\n hasAuthMethods,\n getSelectableProviderTypes,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { isInteractive } from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n type SetupInput,\n handleNonInteractiveMode,\n promptForModelSelection,\n promptForAuthMethod,\n promptForSecrets,\n collectSecrets,\n} from \"../../../../lib/domain/model-provider/shared\";\n\nasync function handleInteractiveMode(): Promise<SetupInput | null> {\n if (!isInteractive()) {\n throw new Error(\"Interactive mode requires a TTY\", {\n cause: new Error(\n 'Use non-interactive mode: zero org model-provider setup --type <type> --secret \"<value>\"',\n ),\n });\n }\n\n let cancelled = false;\n const onCancel = () => {\n cancelled = true;\n return false;\n };\n\n // Fetch configured org providers to annotate choices\n const { modelProviders: configuredProviders } =\n await listZeroOrgModelProviders();\n const configuredTypes = new Set(\n configuredProviders.map((p) => {\n return p.type;\n }),\n );\n\n // Build provider choices with configuration status (only selectable providers)\n const annotatedChoices = getSelectableProviderTypes().map((type) => {\n const config = MODEL_PROVIDER_TYPES[type];\n const isConfigured = configuredTypes.has(type);\n const isExperimental = hasAuthMethods(type);\n let title: string = config.label;\n if (isConfigured) {\n title = `${title} ✓`;\n }\n if (isExperimental) {\n title = `${title} ${chalk.dim(\"(experimental)\")}`;\n }\n return {\n title,\n value: type,\n };\n });\n\n const typeResponse = await prompts(\n {\n type: \"select\",\n name: \"type\",\n message: \"Select provider type:\",\n choices: annotatedChoices,\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const type = typeResponse.type as ModelProviderType;\n\n // Check if provider is already configured using the list we already fetched\n const existingProvider = configuredProviders.find((p) => {\n return p.type === type;\n });\n\n if (existingProvider) {\n console.log();\n console.log(`\"${type}\" is already configured`);\n console.log();\n\n const actionResponse = await prompts(\n {\n type: \"select\",\n name: \"action\",\n message: \"\",\n choices: [\n { title: \"Keep existing secret\", value: \"keep\" },\n { title: \"Update secret\", value: \"update\" },\n ],\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n if (actionResponse.action === \"keep\") {\n const selectedModel = await promptForModelSelection(type);\n return {\n type,\n keepExistingSecret: true,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n // Fall through to secret prompt for \"update\"\n }\n\n const config = MODEL_PROVIDER_TYPES[type];\n\n console.log();\n if (\"helpText\" in config) {\n console.log(chalk.dim(config.helpText));\n }\n console.log();\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n const authMethod = await promptForAuthMethod(type);\n const secrets = await promptForSecrets(type, authMethod);\n const selectedModel = await promptForModelSelection(type);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n\n // Single-secret provider (legacy)\n const secretLabel = \"secretLabel\" in config ? config.secretLabel : \"secret\";\n\n const secretResponse = await prompts(\n {\n type: \"password\",\n name: \"secret\",\n message: `Enter your ${secretLabel}:`,\n validate: (value: string) => {\n return value.length > 0 || `${secretLabel} is required`;\n },\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const secret = secretResponse.secret as string;\n const selectedModel = await promptForModelSelection(type);\n\n return { type, secret, selectedModel, isInteractiveMode: true };\n}\n\nasync function promptSetAsDefault(\n type: ModelProviderType,\n framework: string,\n isDefault: boolean,\n): Promise<void> {\n if (isDefault) return;\n\n let cancelled = false;\n const response = await prompts(\n {\n type: \"confirm\",\n name: \"setDefault\",\n message: \"Set this provider as default?\",\n initial: false,\n },\n {\n onCancel: () => {\n cancelled = true;\n return false;\n },\n },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n if (response.setDefault) {\n await setZeroOrgModelProviderDefault(type);\n console.log(chalk.green(`✓ Default for ${framework} set to \"${type}\"`));\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Configure an org-level model provider\")\n .option(\"-t, --type <type>\", \"Provider type (for non-interactive mode)\")\n .option(\n \"-s, --secret <value>\",\n \"Secret value (can be used multiple times, supports VALUE or KEY=VALUE format)\",\n collectSecrets,\n [],\n )\n .option(\n \"-a, --auth-method <method>\",\n \"Auth method (required for multi-auth providers like aws-bedrock)\",\n )\n .option(\"-m, --model <model>\", \"Model selection (for non-interactive mode)\")\n .action(\n withErrorHandler(\n async (options: {\n type?: string;\n secret?: string[];\n authMethod?: string;\n model?: string;\n }) => {\n let input: SetupInput;\n const secretArgs = options.secret ?? [];\n\n if (options.type && secretArgs.length > 0) {\n input = handleNonInteractiveMode({\n type: options.type,\n secret: secretArgs,\n authMethod: options.authMethod,\n model: options.model,\n commandPrefix: \"zero org model-provider setup\",\n });\n } else if (options.type || secretArgs.length > 0) {\n throw new Error(\"Both --type and --secret are required\");\n } else {\n const result = await handleInteractiveMode();\n if (result === null) {\n return;\n }\n input = result;\n }\n\n // Handle \"keep existing secret\" flow\n if (input.keepExistingSecret) {\n const provider = await updateZeroOrgModelProviderModel(\n input.type,\n input.selectedModel,\n );\n\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n\n if (!hasModelSelection(input.type)) {\n console.log(\n chalk.green(`✓ Org model provider \"${input.type}\" unchanged`),\n );\n } else {\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" updated${defaultNote}${modelNote}`,\n ),\n );\n }\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n return;\n }\n\n // Standard upsert flow with secret\n const { provider, created } = await upsertZeroOrgModelProvider({\n type: input.type,\n secret: input.secret,\n authMethod: input.authMethod,\n secrets: input.secrets,\n selectedModel: input.selectedModel,\n });\n\n const action = created ? \"created\" : \"updated\";\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" ${action}${defaultNote}${modelNote}`,\n ),\n );\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n },\n ),\n );\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n MODEL_PROVIDER_TYPES,\n getModels,\n getDefaultModel,\n hasModelSelection,\n allowsCustomModel,\n getCustomModelPlaceholder,\n hasAuthMethods,\n getAuthMethodsForType,\n getDefaultAuthMethod,\n getSecretsForAuthMethod,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport interface SetupInput {\n type: ModelProviderType;\n secret?: string;\n // Multi-auth support\n authMethod?: string;\n secrets?: Record<string, string>;\n selectedModel?: string;\n keepExistingSecret?: boolean;\n isInteractiveMode?: boolean;\n}\n\nfunction validateProviderType(typeStr: string): ModelProviderType {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(typeStr)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${typeStr}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n return typeStr as ModelProviderType;\n}\n\nfunction validateModel(\n type: ModelProviderType,\n modelStr: string,\n): string | never {\n const models = getModels(type);\n\n // Allow any model if provider supports custom models\n if (allowsCustomModel(type)) {\n return modelStr;\n }\n\n if (models && !models.includes(modelStr)) {\n throw new Error(`Invalid model \"${modelStr}\"`, {\n cause: new Error(`Valid models: ${models.join(\", \")}`),\n });\n }\n return modelStr;\n}\n\nfunction validateAuthMethod(\n type: ModelProviderType,\n authMethodStr: string,\n): string | never {\n const authMethods = getAuthMethodsForType(type);\n if (!authMethods || !(authMethodStr in authMethods)) {\n const validMethods = authMethods\n ? Object.keys(authMethods).join(\", \")\n : \"none\";\n throw new Error(`Invalid auth method \"${authMethodStr}\"`, {\n cause: new Error(`Valid auth methods: ${validMethods}`),\n });\n }\n return authMethodStr;\n}\n\n/**\n * Parse secret arguments into a secrets object.\n * Supports two formats:\n * - Single value (e.g., \"sk-xxx\") - auto-mapped to the provider's secret name\n * - KEY=VALUE format (e.g., \"AWS_REGION=us-east-1\") - explicit mapping\n */\nfunction parseSecrets(\n type: ModelProviderType,\n authMethod: string,\n secretArgs: string[],\n): Record<string, string> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secretNames = Object.keys(secretsConfig);\n\n // Single value without = sign: only allowed for single-secret auth methods\n const firstArg = secretArgs[0];\n if (secretArgs.length === 1 && firstArg && !firstArg.includes(\"=\")) {\n if (secretNames.length !== 1) {\n throw new Error(\n \"Must use KEY=VALUE format for multi-secret auth methods\",\n { cause: new Error(`Required secrets: ${secretNames.join(\", \")}`) },\n );\n }\n const firstSecretName = secretNames[0];\n if (!firstSecretName) {\n throw new Error(\"No secrets defined for this auth method\");\n }\n return { [firstSecretName]: firstArg };\n }\n\n // KEY=VALUE format\n const secrets: Record<string, string> = {};\n for (const arg of secretArgs) {\n const eqIndex = arg.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new Error(`Invalid secret format \"${arg}\"`, {\n cause: new Error(\"Use KEY=VALUE format (e.g., AWS_REGION=us-east-1)\"),\n });\n }\n const key = arg.slice(0, eqIndex);\n const value = arg.slice(eqIndex + 1);\n secrets[key] = value;\n }\n return secrets;\n}\n\n/**\n * Validate secrets against the auth method config.\n */\nfunction validateSecrets(\n type: ModelProviderType,\n authMethod: string,\n secrets: Record<string, string>,\n): void {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n // Check required fields\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.required && !secrets[name]) {\n const requiredNames = Object.entries(secretsConfig)\n .filter(([, fc]) => {\n return fc.required;\n })\n .map(([n]) => {\n return n;\n })\n .join(\", \");\n throw new Error(`Missing required secret: ${name}`, {\n cause: new Error(`Required secrets: ${requiredNames}`),\n });\n }\n }\n\n // Check for unknown fields\n for (const name of Object.keys(secrets)) {\n if (!(name in secretsConfig)) {\n const validNames = Object.keys(secretsConfig).join(\", \");\n throw new Error(`Unknown secret: ${name}`, {\n cause: new Error(`Valid secrets: ${validNames}`),\n });\n }\n }\n}\n\nexport function handleNonInteractiveMode(options: {\n type: string;\n secret: string[];\n authMethod?: string;\n model?: string;\n commandPrefix?: string;\n}): SetupInput {\n const type = validateProviderType(options.type);\n const cmdPrefix = options.commandPrefix ?? \"zero org model-provider setup\";\n\n let selectedModel: string | undefined;\n\n if (options.model) {\n selectedModel = validateModel(type, options.model);\n } else if (hasModelSelection(type)) {\n const defaultModel = getDefaultModel(type);\n // Empty defaultModel means \"auto\" mode - don't set selectedModel\n selectedModel = defaultModel || undefined;\n }\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n // Determine auth method\n let authMethod: string;\n if (options.authMethod) {\n authMethod = validateAuthMethod(type, options.authMethod);\n } else {\n const defaultAuthMethod = getDefaultAuthMethod(type);\n const authMethods = getAuthMethodsForType(type);\n if (!defaultAuthMethod || !authMethods) {\n throw new Error(`Provider \"${type}\" requires --auth-method`);\n }\n // If there's only one auth method, use it; otherwise require explicit selection\n const authMethodNames = Object.keys(authMethods);\n if (authMethodNames.length === 1) {\n authMethod = authMethodNames[0]!;\n } else {\n const methods = authMethodNames.join(\", \");\n throw new Error(\n `--auth-method is required for \"${type}\" (multiple auth methods available)`,\n {\n cause: new Error(\n `Available: ${methods}. Example: ${cmdPrefix} --type ${type} --auth-method ${authMethodNames[0]} --secret KEY=VALUE`,\n ),\n },\n );\n }\n }\n\n // Parse and validate secrets\n const secrets = parseSecrets(type, authMethod, options.secret);\n validateSecrets(type, authMethod, secrets);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: false,\n };\n }\n\n // Single-secret provider (legacy)\n // Accept single value or KEY=VALUE format\n const secretArgs = options.secret;\n const firstArg = secretArgs[0];\n if (!firstArg) {\n throw new Error(\"Secret is required\");\n }\n\n // If KEY=VALUE format, extract the value\n let secret: string;\n if (firstArg.includes(\"=\")) {\n secret = firstArg.slice(firstArg.indexOf(\"=\") + 1);\n } else {\n secret = firstArg;\n }\n\n return {\n type,\n secret,\n selectedModel,\n isInteractiveMode: false,\n };\n}\n\nexport async function promptForModelSelection(\n type: ModelProviderType,\n): Promise<string | undefined> {\n if (!hasModelSelection(type)) {\n return undefined;\n }\n\n const models = getModels(type) ?? [];\n const defaultModel = getDefaultModel(type);\n const supportsCustomModel = allowsCustomModel(type);\n\n // Build choices\n const modelChoices: { title: string; value: string }[] = [];\n\n // Add auto option if defaultModel is empty string\n if (defaultModel === \"\") {\n modelChoices.push({ title: \"auto (Recommended)\", value: \"\" });\n }\n\n // Add predefined models\n for (const model of models) {\n modelChoices.push({\n title: model === defaultModel ? `${model} (Recommended)` : model,\n value: model,\n });\n }\n\n // Add custom model option if supported\n if (supportsCustomModel) {\n modelChoices.push({ title: \"Custom model ID\", value: \"__custom__\" });\n }\n\n const modelResponse = await prompts(\n {\n type: \"select\",\n name: \"model\",\n message: \"Select model:\",\n choices: modelChoices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n const selected = modelResponse.model as string;\n\n // Handle custom model input\n if (selected === \"__custom__\") {\n const placeholder = getCustomModelPlaceholder(type);\n if (placeholder) {\n console.log(chalk.dim(`Example: ${placeholder}`));\n }\n const customResponse = await prompts(\n {\n type: \"text\",\n name: \"customModel\",\n message: \"Enter model ID:\",\n validate: (value: string) => {\n return value.length > 0 || \"Model ID is required\";\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n return customResponse.customModel as string;\n }\n\n // Return undefined for auto mode (empty string)\n return selected === \"\" ? undefined : selected;\n}\n\n/**\n * Prompt for auth method selection (only for multi-auth providers)\n */\nexport async function promptForAuthMethod(\n type: ModelProviderType,\n): Promise<string> {\n const authMethods = getAuthMethodsForType(type);\n const defaultAuthMethod = getDefaultAuthMethod(type);\n\n if (!authMethods) {\n return \"default\";\n }\n\n const choices = Object.entries(authMethods).map(([method, config]) => {\n return {\n title:\n method === defaultAuthMethod\n ? `${config.label} (Recommended)`\n : config.label,\n value: method,\n };\n });\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"authMethod\",\n message: \"Select authentication method:\",\n choices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n return response.authMethod as string;\n}\n\n/**\n * Determine if a secret should be masked (password type)\n * Non-secret values like region should be visible\n */\nfunction isSensitiveSecret(name: string): boolean {\n const nonSecretPatterns = [\"REGION\", \"ENDPOINT\", \"URL\"];\n return !nonSecretPatterns.some((pattern) => {\n return name.toUpperCase().includes(pattern);\n });\n}\n\nexport async function promptForSecrets(\n type: ModelProviderType,\n authMethod: string,\n): Promise<Record<string, string>> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secrets: Record<string, string> = {};\n\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.helpText) {\n console.log(chalk.dim(fieldConfig.helpText));\n }\n\n const isSensitive = isSensitiveSecret(name);\n const placeholder =\n \"placeholder\" in fieldConfig ? (fieldConfig.placeholder as string) : \"\";\n\n if (fieldConfig.required) {\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label}:`,\n initial: placeholder ? \"\" : undefined,\n validate: (value: string) => {\n return value.length > 0 || `${fieldConfig.label} is required`;\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n secrets[name] = response.value as string;\n } else {\n // Optional field\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label} (optional):`,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n const value = response.value as string;\n if (value && value.trim()) {\n secrets[name] = value.trim();\n }\n }\n }\n\n return secrets;\n}\n\n/**\n * Collect secret values from repeatable --secret option\n */\nexport function collectSecrets(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Parse a CLI model/model-provider flag value.\n *\n * Returns:\n * - `undefined` when the flag was not provided (preserve existing value)\n * - `null` when the user passed \"default\" (clear the override, inherit from org)\n * - the string value otherwise (set the specific model/provider)\n */\nexport function parseModelFlag(\n value: string | undefined,\n): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === \"default\") return null;\n return value;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgModelProvider } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove an org-level model provider\")\n .argument(\"<type>\", \"Model provider type to remove\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n await deleteZeroOrgModelProvider(type as ModelProviderType);\n console.log(chalk.green(`✓ Org model provider \"${type}\" removed`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgModelProviderDefault } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const setDefaultCommand = new Command()\n .name(\"set-default\")\n .description(\"Set an org-level model provider as default for its framework\")\n .argument(\"<type>\", \"Model provider type to set as default\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n const provider = await setZeroOrgModelProviderDefault(\n type as ModelProviderType,\n );\n console.log(\n chalk.green(\n `✓ Default for ${provider.framework} set to \"${provider.type}\"`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { editCommand } from \"./edit\";\nimport { viewCommand } from \"./view\";\nimport { listCommand } from \"./list\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroAgentCommand = new Command(\"agent\")\n .description(\"View or manage zero agents\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Your agent ID is in $ZERO_AGENT_ID (or run: zero whoami)\n View your config: zero agent view $ZERO_AGENT_ID --instructions\n Update description: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n Update tone: zero agent edit $ZERO_AGENT_ID --sound friendly\n Update instructions: zero agent edit $ZERO_AGENT_ID --instructions-file <path>\n Add a custom skill: zero agent edit $ZERO_AGENT_ID --add-skill my-skill\n Remove a skill: zero agent edit $ZERO_AGENT_ID --remove-skill my-skill\n\nNotes:\n Manage custom skills with 'zero skill --help'`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\nimport { createZeroAgent, updateZeroAgentInstructions } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAvatarUrl } from \"./avatar\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a new zero agent\")\n .option(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (e.g. my-skill,other-skill)\",\n )\n .option(\"--display-name <name>\", \"Agent display name\")\n .option(\"--description <text>\", \"Agent description\")\n .option(\n \"--sound <tone>\",\n \"Agent tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\"--instructions-file <path>\", \"Path to instructions file\")\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, omitted fields use defaults):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Minimal: zero agent create --display-name \"My Agent\"\n Quick preset: zero agent create --display-name \"My Agent\" --avatar preset:2\n Custom avatar: zero agent create --display-name \"My Agent\" --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n With skills: zero agent create --skills my-skill,other-skill --display-name \"My Agent\"\n With instructions: zero agent create --display-name \"My Agent\" --instructions-file ./instructions.md`,\n )\n .action(\n withErrorHandler(\n async (options: {\n skills?: string;\n displayName?: string;\n description?: string;\n sound?: string;\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n instructionsFile?: string;\n }) => {\n const customSkills = options.skills\n ? options.skills.split(\",\").map((s) => {\n return s.trim();\n })\n : undefined;\n\n if (customSkills) {\n for (const name of customSkills) {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n }\n }\n\n const avatarUrl = resolveAvatarUrl(options);\n\n const agent = await createZeroAgent({\n displayName: options.displayName,\n description: options.description,\n sound: options.sound,\n avatarUrl,\n customSkills,\n });\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agent.agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agent.agentId}\" created`));\n console.log(` Agent ID: ${agent.agentId}`);\n if (customSkills?.length) {\n console.log(` Skills: ${customSkills.join(\", \")}`);\n }\n if (agent.displayName) {\n console.log(` Display Name: ${agent.displayName}`);\n }\n\n console.log();\n console.log(\"Next steps to authorize connectors for this agent:\");\n console.log(\" - Search connectors this agent needs:\");\n console.log(\n ` zero connector search <keyword> --agent ${agent.agentId}`,\n );\n console.log(\n \" - Check authorization status (prints an authorize URL if not authorized):\",\n );\n console.log(\n ` zero connector status <type> --agent ${agent.agentId}`,\n );\n },\n ),\n );\n","const SKIN_MAP: Record<string, number> = {\n light: 0,\n \"light-medium\": 1,\n medium: 2,\n \"medium-dark\": 3,\n dark: 4,\n};\n\nconst HAIR_COLOR_MAP: Record<string, number> = {\n blonde: 1,\n teal: 2,\n grey: 3,\n pink: 4,\n brown: 5,\n};\n\nconst EXPRESSION_MAP: Record<string, number> = {\n calm: 1,\n content: 2,\n neutral: 3,\n pleasant: 4,\n excited: 5,\n};\n\nconst INTENSITY_MAP: Record<string, \"d\" | \"m\" | \"h\"> = {\n chill: \"d\",\n normal: \"m\",\n hyped: \"h\",\n};\n\nfunction lookupRequired<T>(\n value: string,\n map: Readonly<Record<string, T>>,\n flag: string,\n): T {\n if (!(value in map)) {\n throw new Error(\n `Invalid ${flag} \"${value}\". Must be one of: ${Object.keys(map).join(\", \")}`,\n );\n }\n return map[value]!;\n}\n\nfunction parseIntRange(\n value: string,\n flag: string,\n min: number,\n max: number,\n): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < min || n > max) {\n throw new Error(`Invalid ${flag} \"${value}\". Must be ${min}–${max}`);\n }\n return n;\n}\n\nfunction buildCustomSvgAvatar(opts: AvatarOptions): string {\n const r =\n opts.avatarRotation !== undefined\n ? parseIntRange(opts.avatarRotation, \"--avatar-rotation\", 1, 5)\n : 3;\n const h =\n opts.avatarHairStyle !== undefined\n ? parseIntRange(opts.avatarHairStyle, \"--avatar-hair-style\", 1, 5)\n : 1;\n const s =\n opts.avatarSkin !== undefined\n ? lookupRequired(opts.avatarSkin, SKIN_MAP, \"--avatar-skin\")\n : 2;\n const c =\n opts.avatarHairColor !== undefined\n ? lookupRequired(\n opts.avatarHairColor,\n HAIR_COLOR_MAP,\n \"--avatar-hair-color\",\n )\n : 5;\n const f =\n opts.avatarExpression !== undefined\n ? lookupRequired(\n opts.avatarExpression,\n EXPRESSION_MAP,\n \"--avatar-expression\",\n )\n : 1;\n const i =\n opts.avatarIntensity !== undefined\n ? lookupRequired(\n opts.avatarIntensity,\n INTENSITY_MAP,\n \"--avatar-intensity\",\n )\n : \"m\";\n return `svg:r${r}s${s}h${h}c${c}f${f}${i}`;\n}\n\nexport interface AvatarOptions {\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n}\n\nexport function resolveAvatarUrl(opts: AvatarOptions): string | undefined {\n const hasPreset = opts.avatar !== undefined;\n const hasCustom =\n opts.avatarRotation !== undefined ||\n opts.avatarSkin !== undefined ||\n opts.avatarHairStyle !== undefined ||\n opts.avatarHairColor !== undefined ||\n opts.avatarExpression !== undefined ||\n opts.avatarIntensity !== undefined;\n\n if (!hasPreset && !hasCustom) return undefined;\n\n if (hasPreset && hasCustom) {\n throw new Error(\n \"--avatar cannot be combined with --avatar-* attribute options\",\n );\n }\n\n if (hasPreset) {\n if (!/^preset:[0-4]$/.test(opts.avatar!)) {\n throw new Error(\n `Invalid --avatar \"${opts.avatar}\". Use preset:0 through preset:4`,\n );\n }\n return opts.avatar;\n }\n\n return buildCustomSvgAvatar(opts);\n}\n\nconst REVERSE_SKIN_MAP: Record<number, string> = {\n 0: \"light\",\n 1: \"light-medium\",\n 2: \"medium\",\n 3: \"medium-dark\",\n 4: \"dark\",\n};\n\nconst REVERSE_HAIR_COLOR_MAP: Record<number, string> = {\n 1: \"blonde\",\n 2: \"teal\",\n 3: \"grey\",\n 4: \"pink\",\n 5: \"brown\",\n};\n\nconst REVERSE_EXPRESSION_MAP: Record<number, string> = {\n 1: \"calm\",\n 2: \"content\",\n 3: \"neutral\",\n 4: \"pleasant\",\n 5: \"excited\",\n};\n\nconst REVERSE_INTENSITY_MAP: Record<string, string> = {\n d: \"chill\",\n m: \"normal\",\n h: \"hyped\",\n};\n\nconst PRESET_DESCRIPTIONS: Record<string, string> = {\n \"preset:0\": \"light skin, brown hair, calm, hyped\",\n \"preset:1\": \"light-medium skin, grey hair, calm, normal\",\n \"preset:2\": \"medium skin, pink hair, neutral, chill\",\n \"preset:3\": \"medium-dark skin, blonde hair, pleasant, hyped\",\n \"preset:4\": \"dark skin, teal hair, excited, normal\",\n};\n\nfunction parseSvgAvatar(svg: string): string | undefined {\n const match = svg.match(/^svg:r(\\d)s(\\d)h(\\d)c(\\d)f(\\d)([dmh])$/);\n if (!match) return undefined;\n\n const [, r, s, h, c, f, i] = match as RegExpExecArray;\n const parts: string[] = [];\n\n const skin = REVERSE_SKIN_MAP[Number(s)];\n if (skin) parts.push(`${skin} skin`);\n\n const hairColor = REVERSE_HAIR_COLOR_MAP[Number(c)];\n if (hairColor) parts.push(`${hairColor} hair`);\n\n const expression = REVERSE_EXPRESSION_MAP[Number(f)];\n if (expression) parts.push(expression);\n\n const intensity = REVERSE_INTENSITY_MAP[i!];\n if (intensity) parts.push(intensity);\n\n if (parts.length === 0) return undefined;\n\n let desc = parts.join(\", \");\n if (r !== \"3\") {\n const rotationLabels: Record<string, string> = {\n \"1\": \"far-left\",\n \"2\": \"left\",\n \"4\": \"right\",\n \"5\": \"far-right\",\n };\n const rot = rotationLabels[r!];\n if (rot) desc += `, ${rot}`;\n }\n if (h !== \"1\") {\n desc += `, hair style ${h}`;\n }\n\n return desc;\n}\n\nexport function formatAvatar(\n avatarUrl: string | null | undefined,\n): string | undefined {\n if (!avatarUrl) return undefined;\n\n if (avatarUrl.startsWith(\"preset:\")) {\n const desc = PRESET_DESCRIPTIONS[avatarUrl];\n return desc ? `${avatarUrl} (${desc})` : avatarUrl;\n }\n\n if (avatarUrl.startsWith(\"svg:\")) {\n const desc = parseSvgAvatar(avatarUrl);\n return desc ? `custom (${desc})` : avatarUrl;\n }\n\n return avatarUrl;\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\nimport {\n getZeroAgent,\n updateZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\nimport { type AvatarOptions, resolveAvatarUrl } from \"./avatar\";\n\ninterface AgentEditOptions extends AvatarOptions {\n displayName?: string;\n description?: string;\n sound?: string;\n skills?: string;\n addSkill?: string;\n removeSkill?: string;\n instructionsFile?: string;\n modelProvider?: string;\n model?: string;\n}\n\nfunction hasAvatarUpdate(options: AvatarOptions): boolean {\n return (\n options.avatar !== undefined ||\n options.avatarRotation !== undefined ||\n options.avatarSkin !== undefined ||\n options.avatarHairStyle !== undefined ||\n options.avatarHairColor !== undefined ||\n options.avatarExpression !== undefined ||\n options.avatarIntensity !== undefined\n );\n}\n\nfunction hasAgentFieldUpdate(options: AgentEditOptions): boolean {\n return (\n options.displayName !== undefined ||\n options.description !== undefined ||\n options.sound !== undefined ||\n hasAvatarUpdate(options) ||\n options.skills !== undefined ||\n options.addSkill !== undefined ||\n options.removeSkill !== undefined ||\n options.modelProvider !== undefined ||\n options.model !== undefined\n );\n}\n\nasync function applyAgentUpdate(\n agentId: string,\n options: AgentEditOptions,\n): Promise<void> {\n const hasAvatar = hasAvatarUpdate(options);\n const resolvedAvatarUrl = hasAvatar ? resolveAvatarUrl(options) : undefined;\n\n const current = await getZeroAgent(agentId);\n const customSkills = resolveCustomSkills(options, current.customSkills ?? []);\n\n const modelProviderId =\n options.modelProvider !== undefined\n ? parseModelFlag(options.modelProvider)\n : current.modelProviderId;\n const selectedModel =\n options.model !== undefined\n ? parseModelFlag(options.model)\n : current.selectedModel;\n\n const avatarUrl = hasAvatar\n ? resolvedAvatarUrl\n : (current.avatarUrl ?? undefined);\n\n await updateZeroAgent(agentId, {\n displayName:\n options.displayName !== undefined\n ? options.displayName\n : (current.displayName ?? undefined),\n description:\n options.description !== undefined\n ? options.description\n : (current.description ?? undefined),\n sound:\n options.sound !== undefined\n ? options.sound\n : (current.sound ?? undefined),\n avatarUrl,\n customSkills,\n modelProviderId,\n selectedModel,\n });\n}\n\nfunction validateSkillName(name: string): void {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n}\n\nfunction resolveCustomSkills(\n options: { skills?: string; addSkill?: string; removeSkill?: string },\n existing: string[],\n): string[] | undefined {\n if (options.skills && (options.addSkill || options.removeSkill)) {\n throw new Error(\"Cannot use --skills with --add-skill or --remove-skill\");\n }\n\n if (options.skills) {\n const names = options.skills.split(\",\").map((s) => {\n return s.trim();\n });\n for (const name of names) {\n validateSkillName(name);\n }\n return names;\n }\n\n if (options.addSkill) {\n validateSkillName(options.addSkill);\n if (existing.includes(options.addSkill)) {\n throw new Error(\n `Skill \"${options.addSkill}\" is already attached to this agent`,\n );\n }\n return [...existing, options.addSkill];\n }\n\n if (options.removeSkill) {\n if (!existing.includes(options.removeSkill)) {\n throw new Error(\n `Skill \"${options.removeSkill}\" is not attached to this agent`,\n );\n }\n return existing.filter((s) => {\n return s !== options.removeSkill;\n });\n }\n\n return undefined;\n}\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Edit a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--display-name <name>\", \"New display name\")\n .option(\"--description <text>\", \"New description\")\n .option(\n \"--sound <tone>\",\n \"New tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (replaces existing)\",\n )\n .option(\"--add-skill <name>\", \"Add a custom skill to the agent\")\n .option(\"--remove-skill <name>\", \"Remove a custom skill from the agent\")\n .option(\"--instructions-file <path>\", \"Path to new instructions file\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit org default\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit provider default\",\n )\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, replace the entire avatar):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Update description: zero agent edit <agent-id> --description \"new role\"\n Update tone: zero agent edit <agent-id> --sound friendly\n Quick preset avatar: zero agent edit <agent-id> --avatar preset:2\n Custom avatar: zero agent edit <agent-id> --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n Replace all skills: zero agent edit <agent-id> --skills my-skill,other-skill\n Add a skill: zero agent edit <agent-id> --add-skill my-skill\n Remove a skill: zero agent edit <agent-id> --remove-skill my-skill\n Update instructions: zero agent edit <agent-id> --instructions-file ./instructions.md\n Set model: zero agent edit <agent-id> --model-provider <provider-id> --model MiniMax-M2.7\n Reset model: zero agent edit <agent-id> --model-provider default --model default\n Update yourself: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n\nNotes:\n - At least one option is required\n - Unspecified fields are preserved (not cleared)\n - --skills replaces the entire skill list; --add-skill/--remove-skill modify incrementally\n - --skills cannot be combined with --add-skill or --remove-skill\n - Use 'zero org model-provider list' to see available providers and models\n - To create or edit skill content, use: zero skill --help`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: AgentEditOptions) => {\n const hasAgentUpdate = hasAgentFieldUpdate(options);\n\n if (!hasAgentUpdate && !options.instructionsFile) {\n throw new Error(\n \"At least one option is required (--display-name, --description, --sound, --avatar, --avatar-*, --skills, --add-skill, --remove-skill, --model-provider, --model, --instructions-file)\",\n );\n }\n\n if (hasAgentUpdate) {\n await applyAgentUpdate(agentId, options);\n }\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agentId}\" updated`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n getZeroAgentInstructions,\n getZeroAgentUserConnectors,\n listZeroConnectors,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"@vm0/connectors/firewall-types\";\nimport type { ConnectorResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\n\ninterface ConnectorPermissionInfo {\n type: string;\n hasPermissions: boolean;\n permissions: Array<{ name: string; description?: string }>;\n policies: Record<string, FirewallPolicyValue> | null;\n unknownPolicy: FirewallPolicyValue;\n allowed: number;\n total: number;\n}\n\nfunction getConnectorPermissionInfo(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): ConnectorPermissionInfo {\n if (!isFirewallConnectorType(type)) {\n return {\n type,\n hasPermissions: false,\n permissions: [],\n policies: null,\n unknownPolicy: \"allow\",\n allowed: 0,\n total: 0,\n };\n }\n\n const refPolicy = resolvedPolicies?.[type];\n const policies =\n refPolicy && Object.keys(refPolicy.policies).length > 0\n ? refPolicy.policies\n : null;\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n const total = permissions.length;\n const allowed = policies\n ? permissions.filter((p) => {\n return policies[p.name] === \"allow\";\n }).length\n : 0;\n\n const unknownPolicy = refPolicy?.unknownPolicy ?? \"allow\";\n return {\n type,\n hasPermissions: true,\n permissions,\n policies,\n unknownPolicy,\n allowed,\n total,\n };\n}\n\nfunction printDetailedPermissions(info: ConnectorPermissionInfo): void {\n if (!info.policies) {\n const icon = policyIcon(info.unknownPolicy);\n console.log(` ${icon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...info.permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of info.permissions) {\n const policy = info.policies[perm.name] ?? \"deny\";\n const desc = perm.description ?? \"\";\n console.log(\n ` ${policyIcon(policy)} ${perm.name.padEnd(nameWidth)} ${desc}`,\n );\n }\n\n const unknownIcon = policyIcon(info.unknownPolicy);\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nfunction formatConnectorIdentity(\n connector: ConnectorResponse | undefined,\n): string {\n if (!connector) return \"\";\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"\";\n}\n\nfunction formatConnectorSummary(\n info: ConnectorPermissionInfo,\n identity?: ConnectorResponse,\n): string {\n const id = formatConnectorIdentity(identity);\n const idStr = id ? ` ${id}` : \"\";\n if (!info.hasPermissions) return `${info.type}${idStr}`;\n if (!info.policies) return `${info.type}${idStr} (full access)`;\n return `${info.type}${idStr} (${info.allowed}/${info.total} allowed)`;\n}\n\nfunction formatDetailIdentity(\n connector: ConnectorResponse | undefined,\n): string {\n if (!connector) return \"\";\n let identity = \"\";\n if (connector.externalUsername && connector.externalEmail) {\n identity = `@${connector.externalUsername} (${connector.externalEmail})`;\n } else if (connector.externalUsername) {\n identity = `@${connector.externalUsername}`;\n } else if (connector.externalEmail) {\n identity = connector.externalEmail;\n }\n if (!identity) return \"\";\n if (connector.needsReconnect) {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--instructions\", \"Also show instructions content\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n View basic info: zero agent view <agent-id>\n Include instructions: zero agent view <agent-id> --instructions\n Show permissions: zero agent view <agent-id> --permissions\n View yourself: zero agent view $ZERO_AGENT_ID --instructions`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n options: { instructions?: boolean; permissions?: boolean },\n ) => {\n const [agent, connectorTypes, connectorIdentities] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n listZeroConnectors().catch(() => {\n return { connectors: [] as ConnectorResponse[] };\n }),\n ]);\n\n const identityMap = new Map<string, ConnectorResponse>(\n connectorIdentities.connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n console.log(chalk.bold(agent.agentId));\n if (agent.displayName) console.log(chalk.dim(agent.displayName));\n console.log();\n console.log(`Agent ID: ${agent.agentId}`);\n\n const resolvedPolicies = resolveFirewallPolicies(\n agent.permissionPolicies,\n connectorTypes,\n );\n\n const connectorInfos = connectorTypes.map((type) => {\n return getConnectorPermissionInfo(type, resolvedPolicies);\n });\n\n if (connectorInfos.length > 0) {\n const summaries = connectorInfos.map((info) => {\n return formatConnectorSummary(info, identityMap.get(info.type));\n });\n console.log(`Connectors: ${summaries.join(\", \")}`);\n }\n\n if (agent.customSkills?.length > 0) {\n console.log(`Skills: ${agent.customSkills.join(\", \")}`);\n }\n if (agent.description)\n console.log(`Description: ${agent.description}`);\n if (agent.sound) console.log(`Sound: ${agent.sound}`);\n const avatar = formatAvatar(agent.avatarUrl);\n if (avatar) console.log(`Avatar: ${avatar}`);\n\n if (options.permissions && connectorInfos.length > 0) {\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const info of connectorInfos) {\n const identity = formatDetailIdentity(identityMap.get(info.type));\n console.log(` ${info.type.padEnd(14)}${identity}`);\n if (info.hasPermissions) {\n printDetailedPermissions(info);\n }\n }\n }\n\n if (options.instructions) {\n console.log();\n const result = await getZeroAgentInstructions(agentId);\n if (result.content) {\n console.log(chalk.dim(\"── Instructions ──\"));\n console.log(result.content);\n } else {\n console.log(chalk.dim(\"No instructions set\"));\n }\n }\n },\n ),\n );\n","import chalk from \"chalk\";\nimport type { FirewallPolicyValue } from \"@vm0/connectors/firewall-types\";\n\nexport function policyIcon(policy: FirewallPolicyValue): string {\n if (policy === \"allow\") return chalk.green(\"✓\");\n if (policy === \"ask\") return chalk.yellow(\"?\");\n return chalk.dim(\"✗\");\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroAgents } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero agents\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero agent list\n\nNotes:\n - Use this to discover teammate agent IDs before delegating with \"zero run\"`,\n )\n .action(\n withErrorHandler(async () => {\n const agents = await listZeroAgents();\n\n if (agents.length === 0) {\n console.log(chalk.dim(\"No zero agents found\"));\n console.log(\n chalk.dim(\n ' Create one with: zero agent create --display-name \"My Agent\"',\n ),\n );\n return;\n }\n\n const idWidth = Math.max(\n 8,\n ...agents.map((a) => {\n return a.agentId.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...agents.map((a) => {\n return (a.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"AGENT ID\".padEnd(idWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const agent of agents) {\n const row = [\n agent.agentId.padEnd(idWidth),\n (agent.displayName ?? \"-\").padEnd(displayWidth),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroAgent, deleteZeroAgent } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero agent delete <agent-id>\n zero agent delete <agent-id> -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: { yes?: boolean }) => {\n await getZeroAgent(agentId);\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete zero agent '${agentId}'?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroAgent(agentId);\n console.log(chalk.green(`✓ Agent \"${agentId}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Check third-party service connections (GitHub, Slack, etc.)\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all connectors and their status\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const allTypesRaw = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n const allTypes: ConnectorType[] = [];\n for (const type of allTypesRaw) {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n if (\n flag &&\n !isFeatureEnabled(flag, { orgId }) &&\n (!hasApiToken || config.strictFeatureFlag)\n ) {\n continue;\n }\n allTypes.push(type);\n }\n\n const typeWidth = Math.max(\n 4,\n ...allTypes.map((t) => {\n return t.length;\n }),\n );\n\n const connectedAsHeader = \"CONNECTED AS\";\n const connectedCells = allTypes.map((type) => {\n return renderConnectedAsCell(connectedMap.get(type));\n });\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const authorizedHeader = agentCtx\n ? `AUTHORIZED FOR ${agentCtx.displayName}`\n : null;\n\n // Print header\n const headerParts = [\n \"TYPE\".padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (authorizedHeader) headerParts.push(authorizedHeader);\n console.log(chalk.dim(headerParts.join(\" \")));\n\n // Print rows\n for (let i = 0; i < allTypes.length; i++) {\n const type = allTypes[i]!;\n const connectedCell = padEndAnsi(connectedCells[i]!, connectedAsWidth);\n const parts = [type.padEnd(typeWidth), connectedCell];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n }),\n );\n","import { getZeroAgent, getZeroAgentUserConnectors } from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedTypes: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledTypes] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedTypes: new Set(enabledTypes),\n };\n}\n","import chalk from \"chalk\";\nimport { hasRequiredScopes } from \"@vm0/connectors/connector-utils\";\nimport type { ConnectorListResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\n\ntype Connector = ConnectorListResponse[\"connectors\"][number];\n\nfunction renderIdentity(connector: Connector): string {\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: Connector | undefined,\n): string {\n if (!connector) return chalk.dim(\"(not connected)\");\n const identity = renderIdentity(connector);\n if (connector.needsReconnect) {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n const scopeMismatch =\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(connector.type, connector.oauthScopes);\n if (scopeMismatch) {\n return chalk.yellow(`${identity} (permissions update available)`);\n }\n return identity;\n}\n\nconst ESC = \"\\u001b\";\nconst ANSI_PATTERN = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_PATTERN, \"\");\n}\n\nexport function padEndAnsi(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + \" \".repeat(Math.max(0, width - visible));\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { searchConnectors } from \"@vm0/connectors/connector-utils\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction parseLimit(raw: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--limit must be a positive integer, got \"${raw}\".`);\n }\n return n;\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search connectors by type, label, env var, secret, or tag\")\n .argument(\"<keyword>\", \"Search keyword (case-insensitive)\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .option(\n \"--limit <n>\",\n `Maximum number of results to display (default ${DEFAULT_LIMIT})`,\n parseLimit,\n DEFAULT_LIMIT,\n )\n .action(\n withErrorHandler(\n async (keyword: string, options: { agent?: string; limit: number }) => {\n const trimmed = keyword.trim();\n if (!trimmed) {\n throw new Error(\"Keyword cannot be empty.\");\n }\n\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const isTypeAvailable = (type: ConnectorType): boolean => {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n return (\n !flag ||\n isFeatureEnabled(flag, { orgId }) ||\n (hasApiToken && !config.strictFeatureFlag)\n );\n };\n\n const { results, total } = searchConnectors(\n trimmed,\n options.limit,\n isTypeAvailable,\n );\n\n if (results.length === 0) {\n console.log(\"No matches found.\");\n return;\n }\n\n const topScore = results[0]!.score;\n if (topScore < EXACT_MATCH_THRESHOLD) {\n console.log(\"No exact match. Showing closest:\");\n }\n if (total > options.limit) {\n console.log(`Too many results (top ${options.limit} of ${total}):`);\n }\n\n const typeHeader = \"TYPE\";\n const connectedAsHeader = \"CONNECTED AS\";\n\n const connectedCells = results.map((r) => {\n return renderConnectedAsCell(connectedMap.get(r.type));\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.type.length;\n }),\n );\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const headerParts = [\n typeHeader.padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (agentCtx) {\n headerParts.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(headerParts.join(\" \")));\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n const parts = [\n result.type.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n connectorTypeSchema,\n} from \"@vm0/connectors/connectors\";\nimport {\n getScopeDiff,\n hasRequiredScopes,\n} from \"@vm0/connectors/connector-utils\";\nimport { getZeroConnector } from \"../../../lib/api\";\nimport { formatDateTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\n\nconst LABEL_WIDTH = 16;\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a connector\")\n .argument(\"<type>\", \"Connector type (e.g., github)\")\n .option(\"--agent <id>\", \"Show authorization state for the given agent\")\n .action(\n withErrorHandler(async (type: string, options: { agent?: string }) => {\n const parseResult = connectorTypeSchema.safeParse(type);\n if (!parseResult.success) {\n const available = Object.keys(CONNECTOR_TYPES).join(\", \");\n throw new Error(`Unknown connector type: ${type}`, {\n cause: new Error(`Available connectors: ${available}`),\n });\n }\n\n const [connector, agentCtx] = await Promise.all([\n getZeroConnector(parseResult.data),\n resolveAgentContext(options.agent),\n ]);\n\n console.log(`Connector: ${chalk.cyan(type)}`);\n console.log();\n\n if (connector) {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.green(\"connected\")}`,\n );\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`,\n );\n console.log(\n `${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.authMethod}`,\n );\n\n if (connector.oauthScopes && connector.oauthScopes.length > 0) {\n console.log(\n `${\"OAuth Scopes:\".padEnd(LABEL_WIDTH)}${connector.oauthScopes.join(\", \")}`,\n );\n }\n\n if (\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(parseResult.data, connector.oauthScopes)\n ) {\n const diff = getScopeDiff(parseResult.data, connector.oauthScopes);\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n if (diff.addedScopes.length > 0) {\n console.log(\n `${\" Added:\".padEnd(LABEL_WIDTH)}${diff.addedScopes.join(\", \")}`,\n );\n }\n if (diff.removedScopes.length > 0) {\n console.log(\n `${\" Removed:\".padEnd(LABEL_WIDTH)}${diff.removedScopes.join(\", \")}`,\n );\n }\n }\n\n console.log(\n `${\"Connected:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.createdAt)}`,\n );\n\n if (connector.updatedAt !== connector.createdAt) {\n console.log(\n `${\"Last Updated:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.updatedAt)}`,\n );\n }\n } else {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n }\n\n if (agentCtx) {\n const authorized = agentCtx.authorizedTypes.has(parseResult.data);\n const isConnected = connector !== null;\n const agentLabel =\n agentCtx.displayName === agentCtx.agentId\n ? agentCtx.agentId\n : `${agentCtx.displayName} (${agentCtx.agentId})`;\n\n console.log();\n if (authorized) {\n console.log(\n `The ${parseResult.data} connector is authorized for agent ${agentLabel}.`,\n );\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/connect?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(`Connect it at: [Connect ${parseResult.data}](${url})`);\n } else {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/authorize?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(\n `Authorize it at: [Authorize ${parseResult.data}](${url})`,\n );\n }\n }\n }),\n );\n","/**\n * Format a date string as relative time (e.g., \"in 2h\", \"3d ago\")\n */\nexport function formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffAbs = Math.abs(diffMs);\n\n const minutes = Math.floor(diffAbs / (1000 * 60));\n const hours = Math.floor(diffAbs / (1000 * 60 * 60));\n const days = Math.floor(diffAbs / (1000 * 60 * 60 * 24));\n\n const isPast = diffMs < 0;\n\n if (days > 0) {\n return isPast ? `${days}d ago` : `in ${days}d`;\n } else if (hours > 0) {\n return isPast ? `${hours}h ago` : `in ${hours}h`;\n } else if (minutes > 0) {\n return isPast ? `${minutes}m ago` : `in ${minutes}m`;\n } else {\n return isPast ? \"just now\" : \"soon\";\n }\n}\n\n/**\n * Format a date string with both absolute and relative time\n * e.g., \"2025-01-14 09:00 (in 2h)\"\n * Uses local timezone, but doesn't include timezone in output (shown separately)\n */\nexport function formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n\n // Format: YYYY-MM-DD HH:MM (no seconds, no timezone - shown separately)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n const formatted = `${year}-${month}-${day} ${hours}:${minutes}`;\n const relative = formatRelativeTime(dateStr);\n\n return `${formatted} (${relative})`;\n}\n\n/**\n * Frequency type for schedule wizard\n */\nexport type ScheduleFrequency =\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"once\"\n | \"loop\";\n\n/**\n * Generate cron expression from user-friendly inputs\n * @param frequency - Schedule frequency type\n * @param time - Time in HH:MM format (24-hour)\n * @param day - Day of week (0-6, Sun=0) for weekly, or day of month (1-31) for monthly\n * @returns Cron expression string\n */\nexport function generateCronExpression(\n frequency: Exclude<ScheduleFrequency, \"once\" | \"loop\">,\n time: string,\n day?: number,\n): string {\n const [hourStr, minuteStr] = time.split(\":\");\n const hour = parseInt(hourStr ?? \"0\", 10);\n const minute = parseInt(minuteStr ?? \"0\", 10);\n\n switch (frequency) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekly\":\n return `${minute} ${hour} * * ${day ?? 1}`;\n case \"monthly\":\n return `${minute} ${hour} ${day ?? 1} * *`;\n }\n}\n\n/**\n * Detect system timezone using Intl API\n * @returns IANA timezone identifier (e.g., \"America/New_York\")\n */\nexport function detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate time format (HH:MM, 24-hour)\n * @param time - Time string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateTimeFormat(time: string): boolean | string {\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use HH:MM (e.g., 09:00)\";\n }\n\n const hour = parseInt(match[1]!, 10);\n const minute = parseInt(match[2]!, 10);\n\n if (hour < 0 || hour > 23) {\n return \"Hour must be 0-23\";\n }\n if (minute < 0 || minute > 59) {\n return \"Minute must be 0-59\";\n }\n if (minute % 5 !== 0) {\n return \"Minute must be a multiple of 5 (0, 5, 10, ..., 55)\";\n }\n\n return true;\n}\n\n/**\n * Validate date format (YYYY-MM-DD)\n * @param date - Date string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateDateFormat(date: string): boolean | string {\n const match = date.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use YYYY-MM-DD (e.g., 2025-01-15)\";\n }\n\n const year = parseInt(match[1]!, 10);\n const month = parseInt(match[2]!, 10);\n const day = parseInt(match[3]!, 10);\n\n if (year < 2000 || year > 2100) {\n return \"Year must be between 2000 and 2100\";\n }\n if (month < 1 || month > 12) {\n return \"Month must be 1-12\";\n }\n if (day < 1 || day > 31) {\n return \"Day must be 1-31\";\n }\n\n // Validate the date is actually valid (e.g., not Feb 30)\n const testDate = new Date(year, month - 1, day);\n if (\n testDate.getFullYear() !== year ||\n testDate.getMonth() !== month - 1 ||\n testDate.getDate() !== day\n ) {\n return \"Invalid date\";\n }\n\n return true;\n}\n\n/**\n * Get tomorrow's date in local timezone as YYYY-MM-DD\n * @returns Date string in YYYY-MM-DD format\n */\nexport function getTomorrowDateLocal(): string {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n const year = tomorrow.getFullYear();\n const month = String(tomorrow.getMonth() + 1).padStart(2, \"0\");\n const day = String(tomorrow.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Get current time in local timezone as HH:MM\n * @returns Time string in HH:MM format\n */\nexport function getCurrentTimeLocal(): string {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\n/**\n * Convert a human-readable datetime string to ISO format\n * Supports formats: \"YYYY-MM-DD HH:MM\" or full ISO string\n * @param dateTimeStr - DateTime string (e.g., \"2025-01-15 14:30\")\n * @returns ISO format string (e.g., \"2025-01-15T14:30:00.000Z\")\n */\nexport function toISODateTime(dateTimeStr: string): string {\n // If already in ISO format, return as-is\n if (dateTimeStr.includes(\"T\") && dateTimeStr.endsWith(\"Z\")) {\n return dateTimeStr;\n }\n\n // Convert \"YYYY-MM-DD HH:MM\" to ISO\n const isoStr = dateTimeStr.replace(\" \", \"T\") + \":00\";\n const date = new Date(isoStr);\n return date.toISOString();\n}\n","import { getApiUrl } from \"../../../lib/api/config\";\n\n/**\n * Transform the API host to the platform (app) host.\n *\n * www.vm0.ai → app.vm0.ai\n * platform.vm0.ai → app.vm0.ai\n * tunnel-user-host-www.vm7.ai → tunnel-user-host-app.vm7.ai\n * custom.example.com → app.custom.example.com\n */\nexport function toPlatformUrl(apiUrl: string): URL {\n const parsed = new URL(apiUrl);\n const parts = parsed.hostname.split(\".\");\n if (parts[0]!.endsWith(\"-www\")) {\n parts[0] = parts[0]!.slice(0, -\"-www\".length) + \"-app\";\n } else if (parts[0] === \"www\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else if (parts[0] !== \"app\" && parts[0] !== \"localhost\") {\n parts.unshift(\"app\");\n }\n parsed.hostname = parts.join(\".\");\n return parsed;\n}\n\nexport async function getPlatformOrigin(): Promise<string> {\n const apiUrl = await getApiUrl();\n return toPlatformUrl(apiUrl).origin;\n}\n","import { Command } from \"commander\";\nimport { checkConnectorCommand } from \"./check-connector\";\nimport { permissionDenyCommand } from \"./permission-deny\";\nimport { permissionChangeCommand } from \"./permission-change\";\n\nexport const zeroDoctorCommand = new Command()\n .name(\"doctor\")\n .description(\"Diagnose runtime issues (connector health, permission denials)\")\n .addCommand(checkConnectorCommand)\n .addCommand(permissionDenyCommand)\n .addCommand(permissionChangeCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name GITHUB_TOKEN\n Check a URL? zero doctor check-connector --url https://api.github.com/repos/owner/repo\n Check with permission? zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n Permission denied? zero doctor permission-deny github --method GET --path /repos/owner/repo\n Change a permission? zero doctor permission-change github --permission contents:read --enable\n\nNotes:\n - Use this when your task fails due to a missing environment variable or permission denial\n - The doctor will identify the issue and give the user a link to resolve it`,\n );\n","import { Command, Option } from \"commander\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport {\n getConnectorEnvironmentMapping,\n getConnectorTypeForSecretName,\n} from \"@vm0/connectors/connector-utils\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport { extractSecretNamesFromApis } from \"@vm0/connectors/firewall-types\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallConfig,\n NetworkPolicies,\n} from \"@vm0/connectors/firewall-types\";\nimport type { RunContextResponse } from \"@vm0/api-contracts/contracts/zero-runs\";\nimport { getApiUrl } from \"../../../lib/api/config\";\nimport { getZeroConnector } from \"../../../lib/api/domains/zero-connectors\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { getZeroRunContext } from \"../../../lib/api/domains/zero-runs\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { toPlatformUrl } from \"./platform-url\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\n\ninterface CheckConnectorOptions {\n envName?: string;\n url?: string;\n method: string;\n checkPermission?: string;\n}\n\ninterface DiagContext {\n envName: string;\n connectorType: string;\n label: string;\n platformOrigin: string;\n agentId: string | undefined;\n}\n\ninterface UrlLookupResult {\n connectorType: string;\n envName: string;\n matchedBase: string;\n relativePath: string;\n}\n\n/**\n * Reverse-lookup a full URL to find which connector handles it.\n * Iterates all connector firewall configs and checks if the URL\n * starts with any registered base URL (scheme + host + optional path prefix).\n */\nfunction resolveConnectorFromUrl(url: string): UrlLookupResult | null {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n\n // Normalize: strip trailing slash for comparison\n const normalized = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\n let bestMatch: {\n connectorType: string;\n base: string;\n config: FirewallConfig;\n } | null = null;\n\n for (const type of allTypes) {\n if (!isFirewallConnectorType(type)) continue;\n const config = getConnectorFirewall(type);\n for (const api of config.apis) {\n const base = api.base.endsWith(\"/\") ? api.base.slice(0, -1) : api.base;\n // URL must match the base exactly or have the base as a prefix followed by /\n if (normalized === base || normalized.startsWith(base + \"/\")) {\n // Pick the longest (most specific) base URL match\n if (!bestMatch || base.length > bestMatch.base.length) {\n bestMatch = { connectorType: type, base, config };\n }\n }\n }\n }\n\n if (!bestMatch) return null;\n\n // Derive the env var name from the connector's environment mapping\n const mapping = getConnectorEnvironmentMapping(\n bestMatch.connectorType as ConnectorType,\n );\n const envName = Object.keys(mapping)[0];\n if (!envName) return null;\n\n const relativePath =\n normalized === bestMatch.base\n ? \"/\"\n : normalized.slice(bestMatch.base.length);\n\n return {\n connectorType: bestMatch.connectorType,\n envName,\n matchedBase: bestMatch.base,\n relativePath,\n };\n}\n\nfunction checkEnvVariable(ctx: DiagContext): boolean {\n console.log(\"## Step 1: Sandbox environment variable\");\n console.log(\"\");\n const envPresent = Boolean(process.env[ctx.envName]);\n console.log(\n `Checking process.env.${ctx.envName}: ${envPresent ? \"present\" : \"not present\"}`,\n );\n if (envPresent) {\n console.log(\n \"A placeholder value is present in the sandbox environment. This value is not the real credential — it is a stand-in that gets replaced at the network boundary when requests are sent to registered base URLs.\",\n );\n } else {\n console.log(\n \"No value found for this environment variable. Note: credential replacement at the network boundary is independent of this variable — the proxy injects auth headers based on the destination URL, not the presence of this env var.\",\n );\n }\n console.log(\"\");\n return envPresent;\n}\n\nasync function checkConnectorStatus(ctx: DiagContext): Promise<{\n isConnected: boolean;\n isExpired: boolean;\n hasPermission: boolean;\n}> {\n console.log(\"## Step 2: Connector configuration\");\n console.log(\"\");\n console.log(\n \"A Connector holds the real credentials (OAuth tokens or API keys) for an external service. These credentials are never injected into the sandbox. Instead, when the sandbox sends an HTTP request to a base URL registered by the Connector, the network boundary intercepts the request and replaces the auth headers with real credentials. For this to work, three conditions must be met:\",\n );\n console.log(\"\");\n\n const [connector, enabledTypes] = await Promise.all([\n getZeroConnector(ctx.connectorType as ConnectorType),\n ctx.agentId\n ? getZeroAgentUserConnectors(ctx.agentId)\n : Promise.resolve(null),\n ]);\n\n const isConnected = connector !== null;\n const isExpired = connector?.needsReconnect === true;\n const hasPermission =\n enabledTypes !== null && enabledTypes.includes(ctx.connectorType);\n\n // 2a: Connector status — user must have configured the connector (OAuth or API token)\n console.log(\n `### 2a: Connector status (user must configure via OAuth login or API key)`,\n );\n console.log(\"\");\n if (!isConnected) {\n console.log(`The ${ctx.label} connector is not connected.`);\n if (!ctx.agentId) {\n // No agentId: can't scope the authorize page, so fall back to a plain\n // connect link. With agentId, 2b's Authorize link performs the initial\n // OAuth connect before granting permission — one link covers both steps.\n const connectUrl = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/connect`;\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n }\n } else if (isExpired) {\n const url = `${ctx.platformOrigin}/connectors`;\n console.log(\n `The ${ctx.label} connector is connected but has expired and needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${ctx.label}](${url})`);\n } else {\n console.log(`The ${ctx.label} connector is connected and active.`);\n }\n console.log(\"\");\n\n // 2b: Agent authorization — user must authorize the agent to use this connector\n console.log(\n `### 2b: Agent authorization (user must authorize agent to use this connector)`,\n );\n console.log(\"\");\n if (!ctx.agentId) {\n console.log(\"ZERO_AGENT_ID is not set — cannot check agent authorization.\");\n } else if (isExpired) {\n // The /authorize page treats an expired connector as \"already connected\"\n // and won't re-trigger OAuth. Defer to 2a's Reconnect link in that case.\n console.log(\n `Skipped — agent authorization can only be checked once the ${ctx.label} connector is reconnected (see 2a).`,\n );\n } else if (hasPermission) {\n console.log(`The ${ctx.label} connector is authorized for this agent.`);\n } else {\n const url = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/authorize?agentId=${ctx.agentId}`;\n console.log(\n isConnected\n ? `The ${ctx.label} connector is not authorized for this agent (${ctx.agentId}).`\n : `The ${ctx.label} connector needs to be connected and authorized for this agent (${ctx.agentId}).`,\n );\n console.log(`Authorize it at: [Authorize ${ctx.label}](${url})`);\n }\n console.log(\"\");\n\n return { isConnected, isExpired, hasPermission };\n}\n\nasync function checkConnectorDomains(\n ctx: DiagContext,\n): Promise<NetworkPolicies | null> {\n // 2c: Registered base URLs — connector defines which URL prefixes get credential replacement\n console.log(\n `### 2c: Registered base URLs (credential replacement only applies to URLs matching these prefixes)`,\n );\n console.log(\"\");\n\n const payload = decodeZeroTokenPayload();\n const runId = payload?.runId;\n\n if (!runId) {\n console.log(\n \"Cannot determine run ID from ZERO_TOKEN — skipping base URL check.\",\n );\n console.log(\"\");\n return null;\n }\n\n const runContext = await getZeroRunContext(runId);\n\n printConnectorDomains(ctx, runContext);\n console.log(\"\");\n return runContext.networkPolicies;\n}\n\nfunction printConnectorDomains(\n ctx: DiagContext,\n runContext: RunContextResponse,\n): void {\n const matchingEntry = runContext.firewalls.find((fw) => {\n return fw.name === ctx.connectorType;\n });\n\n if (!matchingEntry) {\n console.log(\n `No configuration found for the ${ctx.label} connector in this run.`,\n );\n console.log(\n \"This means no base URLs are registered for credential replacement for this connector.\",\n );\n return;\n }\n\n console.log(\n `The ${ctx.label} connector is configured for this run with the following base URLs:`,\n );\n for (const api of matchingEntry.apis) {\n console.log(` - ${api.base}`);\n }\n console.log(\"\");\n console.log(\n \"When the sandbox sends an HTTP request matching one of these URL prefixes, the network boundary intercepts the request and injects real credentials into the auth headers.\",\n );\n\n if (isFirewallConnectorType(ctx.connectorType)) {\n const firewallConfig = getConnectorFirewall(ctx.connectorType);\n const secretNames = extractSecretNamesFromApis(firewallConfig.apis);\n if (secretNames.length > 0) {\n console.log(`Credentials resolved from: ${secretNames.join(\", \")}`);\n }\n }\n}\n\nfunction checkPermissionPolicy(\n connectorType: string,\n label: string,\n permissionName: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check\");\n console.log(\"\");\n console.log(\n `Checking permission: \"${permissionName}\" for the ${label} connector.`,\n );\n console.log(\n `Beyond credential replacement, the ${label} connector enforces permission policies on each API path. A request either matches a named permission or falls through to the unknown-endpoint policy.`,\n );\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check permission status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector in this run's network policies.`,\n );\n console.log(\n \"When a connector has no policy entry, all requests are fully permissive (allowed).\",\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n const isInAllow = connectorPolicies.allow.includes(permissionName);\n const isInDeny = connectorPolicies.deny.includes(permissionName);\n\n if (isInAllow) {\n console.log(\n `Result: \"${permissionName}\" is in the allow list. Requests matching this permission are allowed.`,\n );\n } else if (isInDeny) {\n console.log(\n `Result: \"${permissionName}\" is in the deny list. Requests matching this permission are denied.`,\n );\n } else {\n console.log(\n `Result: \"${permissionName}\" is not in any permission list. It will be handled by the unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n console.log(\"\");\n}\n\n/**\n * When --url is provided, auto-detect the matching permission by running\n * the URL's relative path against the connector's firewall rules.\n */\nfunction resolvePermissionFromUrl(\n connectorType: string,\n label: string,\n method: string,\n relativePath: string,\n matchedBase: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check (auto-detected from URL)\");\n console.log(\"\");\n console.log(\n `Matching ${method} ${relativePath} (relative to base URL ${matchedBase}) against the ${label} connector's permission rules.`,\n );\n console.log(\"\");\n\n if (!isFirewallConnectorType(connectorType)) {\n console.log(\n `The ${label} connector does not have permission rules defined.`,\n );\n console.log(\"\");\n return;\n }\n\n const config = getConnectorFirewall(connectorType);\n const matchedPermissions = findMatchingPermissions(\n method,\n relativePath,\n config,\n );\n\n if (matchedPermissions.length === 0) {\n console.log(\n `No named permission matches ${method} ${relativePath}. This request falls through to the unknown-endpoint policy.`,\n );\n } else {\n console.log(`Matched permissions: [${matchedPermissions.join(\", \")}]`);\n }\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check allow/deny status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector. All requests are fully permissive (allowed).`,\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n if (matchedPermissions.length === 0) {\n console.log(\n `Result: No permission matched. The unknown endpoint policy applies: ${connectorPolicies.unknownPolicy}.`,\n );\n } else {\n for (const perm of matchedPermissions) {\n const isInAllow = connectorPolicies.allow.includes(perm);\n const isInDeny = connectorPolicies.deny.includes(perm);\n if (isInAllow) {\n console.log(`Result: \"${perm}\" is in the allow list — allowed.`);\n } else if (isInDeny) {\n console.log(`Result: \"${perm}\" is in the deny list — denied.`);\n } else {\n console.log(\n `Result: \"${perm}\" is not in any list — falls through to unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n }\n }\n console.log(\"\");\n}\n\nexport const checkConnectorCommand = new Command()\n .name(\"check-connector\")\n .description(\n \"Diagnose connector health: environment variable, connector configuration, and permission policies\",\n )\n .addOption(\n new Option(\n \"--env-name <ENV_NAME>\",\n \"The environment variable name to check (e.g. GITHUB_TOKEN)\",\n ),\n )\n .addOption(\n new Option(\n \"--url <URL>\",\n \"A full URL to diagnose — auto-detects the connector, env var, and permission (e.g. https://api.github.com/repos/owner/repo)\",\n ),\n )\n .addOption(\n new Option(\n \"--method <METHOD>\",\n \"HTTP method to use when matching permissions with --url (default: GET)\",\n ).default(\"GET\"),\n )\n .addOption(\n new Option(\n \"--check-permission <name>\",\n \"Check whether a specific permission is allowed or denied (e.g. contents:read)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor check-connector --env-name GITHUB_TOKEN\n zero doctor check-connector --url https://api.github.com/repos/owner/repo\n zero doctor check-connector --url https://slack.com/api/chat.postMessage --method POST\n zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n\nHow connectors work:\n A Connector holds the real credentials for an external service. These credentials\n are never injected into the sandbox. Instead, when the sandbox sends an HTTP\n request to a base URL registered by the Connector, the network boundary intercepts\n the request and replaces the auth headers with real credentials.\n\n This command checks each part of that pipeline and reports what it finds.`,\n )\n .action(\n withErrorHandler(async (opts: CheckConnectorOptions) => {\n if (!opts.envName && !opts.url) {\n throw new Error(\n \"Either --env-name or --url is required. Use --help for usage.\",\n );\n }\n\n let envName: string;\n let connectorType: string;\n let urlLookup: UrlLookupResult | null = null;\n\n if (opts.url) {\n urlLookup = resolveConnectorFromUrl(opts.url);\n if (!urlLookup) {\n throw new Error(\n `No connector found for URL: ${opts.url} — no registered base URL matches this URL`,\n );\n }\n connectorType = urlLookup.connectorType;\n envName = opts.envName ?? urlLookup.envName;\n console.log(\n `URL ${opts.url} matches the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n console.log(` Matched base URL: ${urlLookup.matchedBase}`);\n console.log(` Relative path: ${urlLookup.relativePath}`);\n console.log(` Environment var: ${envName}`);\n } else {\n connectorType = getConnectorTypeForSecretName(\n (envName = opts.envName!),\n )!;\n if (!connectorType) {\n throw new Error(\n `Unknown environment variable: ${envName} — not managed by any connector`,\n );\n }\n console.log(\n `${envName} is managed by the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n }\n console.log(\"\");\n\n const { label } = CONNECTOR_TYPES[connectorType as ConnectorType];\n const apiUrl = await getApiUrl();\n const platformUrl = toPlatformUrl(apiUrl);\n\n const ctx: DiagContext = {\n envName,\n connectorType,\n label,\n platformOrigin: platformUrl.origin,\n agentId: process.env.ZERO_AGENT_ID || undefined,\n };\n\n checkEnvVariable(ctx);\n const { isConnected, isExpired, hasPermission } =\n await checkConnectorStatus(ctx);\n const networkPolicies = await checkConnectorDomains(ctx);\n\n // Summary for Step 2\n if (isConnected && !isExpired && hasPermission) {\n console.log(\n `Steps 1-2 summary: The ${label} connector is connected, active, and authorized. Outbound requests to the registered base URLs will have credentials injected at the network boundary.`,\n );\n }\n console.log(\"\");\n\n // Step 3: Permission policy check\n if (urlLookup) {\n // --url mode: auto-detect permission from URL path\n resolvePermissionFromUrl(\n connectorType,\n label,\n opts.method,\n urlLookup.relativePath,\n urlLookup.matchedBase,\n networkPolicies,\n );\n } else if (opts.checkPermission) {\n // --env-name mode with explicit --check-permission\n checkPermissionPolicy(\n connectorType,\n label,\n opts.checkPermission,\n networkPolicies,\n );\n }\n\n // Re-diagnose hint\n const args: string[] = [];\n if (opts.url) {\n args.push(`--url ${opts.url}`);\n if (opts.method !== \"GET\") {\n args.push(`--method ${opts.method}`);\n }\n } else {\n args.push(`--env-name ${envName}`);\n }\n if (opts.checkPermission) {\n args.push(`--check-permission ${opts.checkPermission}`);\n }\n console.log(\n `To re-diagnose after changes, run: zero doctor check-connector ${args.join(\" \")}`,\n );\n }),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const permissionDenyCommand = new Command()\n .name(\"permission-deny\")\n .description(\n \"Diagnose a permission denial and find the permission that covers it\",\n )\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--method <method>\",\n \"The denied HTTP method\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--path <path>\", \"The denied path\").makeOptionMandatory(),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-deny github --method GET --path /repos/owner/repo/pulls\n zero doctor permission-deny slack --method POST --path /chat.postMessage\n\nNotes:\n - Identifies which named permission covers a denied request\n - Use permission-change to request or enable the permission`,\n )\n .action(\n withErrorHandler(\n async (connectorRef: string, opts: { method: string; path: string }) => {\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n const { label } = CONNECTOR_TYPES[connectorRef];\n const config = getConnectorFirewall(connectorRef);\n const permissions = findMatchingPermissions(\n opts.method,\n opts.path,\n config,\n );\n\n console.log(\n `The ${label} permission filtered ${opts.method} ${opts.path}.`,\n );\n\n if (permissions.length === 0) {\n console.log(\"No named permission was found covering this request.\");\n return;\n }\n\n // Count total rules per permission name across all APIs\n const ruleCount = new Map<string, number>();\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const perm of api.permissions) {\n ruleCount.set(\n perm.name,\n (ruleCount.get(perm.name) ?? 0) + perm.rules.length,\n );\n }\n }\n\n // Pick the permission with the fewest rules (most specific)\n const permission = permissions.reduce((narrowest, current) => {\n return (ruleCount.get(current) ?? Infinity) <\n (ruleCount.get(narrowest) ?? Infinity)\n ? current\n : narrowest;\n });\n console.log(`This is covered by the \"${permission}\" permission.`);\n console.log(\n `To request this permission, run: zero doctor permission-change ${connectorRef} --permission ${permission} --enable --reason \"why this is needed\"`,\n );\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"./platform-url\";\nimport { resolveAgentRole } from \"./resolve-role\";\n\nfunction findPermissionInConfig(ref: string, permissionName: string): boolean {\n if (!isFirewallConnectorType(ref)) return false;\n const config = getConnectorFirewall(ref);\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const p of api.permissions) {\n if (p.name === permissionName) return true;\n }\n }\n return false;\n}\n\n/**\n * Core logic for outputting a permission change message.\n * Shared by both `permission-change` and `permission-deny` commands.\n */\nconst REASON_MAX_LENGTH = 500;\n\nasync function outputPermissionChangeMessage(\n connectorRef: string,\n permission: string,\n action: \"enable\" | \"disable\",\n reason?: string,\n): Promise<void> {\n const { label } =\n CONNECTOR_TYPES[connectorRef as keyof typeof CONNECTOR_TYPES];\n\n const platformOrigin = await getPlatformOrigin();\n const agentId = process.env.ZERO_AGENT_ID;\n const role = agentId ? await resolveAgentRole(agentId) : \"unknown\";\n\n const urlParams = new URLSearchParams({\n ref: connectorRef,\n permission,\n action: action === \"enable\" ? \"allow\" : \"deny\",\n });\n\n // Only include reason for member role (admin/owner can change directly)\n if (role === \"member\" && reason) {\n const truncated =\n reason.length > REASON_MAX_LENGTH\n ? reason.slice(0, REASON_MAX_LENGTH)\n : reason;\n urlParams.set(\"reason\", truncated);\n }\n\n const pagePath = agentId ? `/agents/${agentId}/permissions` : \"/agents\";\n const url = `${platformOrigin}${pagePath}?${urlParams.toString()}`;\n\n // Slack chat:write: strongly recommend bot-based messaging over user identity\n if (\n connectorRef === \"slack\" &&\n permission === \"chat:write\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting chat:write allows sending messages AS THE USER's identity, not as a bot.\",\n );\n console.log(\n \"Use `zero slack message send -c <channel> -t <text>` to send messages as the bot instead — this is the recommended approach for most use cases.\",\n );\n console.log(\n \"Only request user approval below if acting as the user is specifically required.\",\n );\n console.log(\"\");\n }\n\n // Gmail gmail.send: strongly recommend draft-based workflow over direct send\n if (\n connectorRef === \"gmail\" &&\n permission === \"gmail.send\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting gmail.send allows the agent to send emails directly as the user.\",\n );\n console.log(\n \"Consider keeping gmail.send disabled and using gmail.compose instead — the agent can create drafts for the user to review and send manually.\",\n );\n console.log(\n \"Only request user approval below if direct sending is specifically required.\",\n );\n console.log(\"\");\n }\n\n if (role === \"admin\" || role === \"owner\") {\n console.log(\n `You can ${action} the \"${permission}\" permission directly: [Manage ${label} permissions](${url})`,\n );\n } else if (role === \"member\") {\n if (!reason) {\n console.log(\n `IMPORTANT: Re-run with \\`--reason \"one sentence why this is needed\"\\` so the admin can review your request faster.`,\n );\n } else if (action === \"enable\") {\n console.log(\n `Permission changes require admin approval. Request access at: [Request ${label} access](${url})`,\n );\n } else {\n console.log(\n `Permission changes require admin approval. Contact an org admin to disable this permission: [View ${label} permissions](${url})`,\n );\n }\n } else {\n console.log(\n `To ${action} the \"${permission}\" permission for ${label}: [Manage ${label} permissions](${url})`,\n );\n }\n}\n\nexport const permissionChangeCommand = new Command()\n .name(\"permission-change\")\n .description(\"Request a permission change (enable or disable)\")\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--permission <name>\",\n \"The permission name to change\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--enable\", \"Request to enable the permission\").conflicts(\n \"disable\",\n ),\n )\n .addOption(\n new Option(\"--disable\", \"Request to disable the permission\").conflicts(\n \"enable\",\n ),\n )\n .addOption(\n new Option(\n \"--reason <text>\",\n \"Brief reason why the permission is needed (max 500 chars)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-change github --permission contents:read --enable\n zero doctor permission-change slack --permission chat:write --disable\n\nNotes:\n - Outputs a platform URL for the user to adjust the permission\n - Admins can change permissions directly; members must request approval`,\n )\n .action(\n withErrorHandler(\n async (\n connectorRef: string,\n opts: {\n permission: string;\n enable?: boolean;\n disable?: boolean;\n reason?: string;\n },\n ) => {\n if (!opts.enable && !opts.disable) {\n throw new Error(\"Either --enable or --disable is required\");\n }\n\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n if (!findPermissionInConfig(connectorRef, opts.permission)) {\n throw new Error(\n `Unknown permission \"${opts.permission}\" for ${connectorRef}`,\n );\n }\n\n const action = opts.enable ? \"enable\" : \"disable\";\n await outputPermissionChangeMessage(\n connectorRef,\n opts.permission,\n action,\n opts.reason,\n );\n },\n ),\n );\n","import { getZeroOrg } from \"../../../lib/api/domains/zero-orgs\";\nimport { getZeroAgent } from \"../../../lib/api/domains/zero-agents\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\nimport { decodeCliTokenPayload } from \"../../../lib/api/cli-token\";\nimport { getToken } from \"../../../lib/api/config\";\n\ntype AgentRole = \"admin\" | \"owner\" | \"member\" | \"unknown\";\n\n/**\n * Resolve the current user's userId from the available token.\n * Tries ZERO_TOKEN (sandbox) first, then CLI token.\n */\nasync function resolveUserId(): Promise<string | undefined> {\n const zeroPayload = decodeZeroTokenPayload();\n if (zeroPayload?.userId) return zeroPayload.userId;\n\n const token = await getToken();\n const cliPayload = decodeCliTokenPayload(token);\n return cliPayload?.userId;\n}\n\n/**\n * Best-effort role detection that also considers agent ownership.\n *\n * Returns \"admin\" if the user is an org admin (can manage any agent).\n * Returns \"owner\" if the user is a non-admin but owns the specified agent.\n * Returns \"member\" if the user is a non-admin, non-owner member.\n * Returns \"unknown\" on any API failure.\n */\nexport async function resolveAgentRole(agentId: string): Promise<AgentRole> {\n try {\n const org = await getZeroOrg();\n if (org.role === \"admin\") return \"admin\";\n\n if (org.role === \"member\") {\n // Check if the member owns this agent\n const userId = await resolveUserId();\n if (userId) {\n const agent = await getZeroAgent(agentId);\n if (agent.ownerId === userId) return \"owner\";\n }\n return \"member\";\n }\n\n return \"unknown\";\n } catch (error: unknown) {\n console.debug(\"resolveAgentRole failed, falling back to unknown:\", error);\n return \"unknown\";\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroUserPreferences,\n updateZeroUserPreferences,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isInteractive, promptText } from \"../../../lib/utils/prompt-utils\";\n\n/**\n * Detect system timezone using Intl API\n */\nfunction detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate timezone using Intl.DateTimeFormat\n */\nfunction isValidTimezone(timezone: string): boolean {\n try {\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Display current preferences\n */\nfunction displayPreferences(prefs: { timezone: string | null }): void {\n console.log(chalk.bold(\"Current preferences:\"));\n console.log(\n ` Timezone: ${prefs.timezone ? chalk.cyan(prefs.timezone) : chalk.dim(\"not set\")}`,\n );\n}\n\ninterface PreferenceOpts {\n timezone?: string;\n}\n\n/**\n * Build updates from CLI flags, exiting on invalid input\n */\nfunction buildUpdates(opts: PreferenceOpts): { timezone?: string } | null {\n if (opts.timezone === undefined) return null;\n\n if (!isValidTimezone(opts.timezone)) {\n throw new Error(`Invalid timezone: ${opts.timezone}`, {\n cause: new Error(\n \"Use an IANA timezone identifier (e.g., America/New_York, Asia/Shanghai)\",\n ),\n });\n }\n\n return { timezone: opts.timezone };\n}\n\n/**\n * Print confirmation after a successful update\n */\nfunction printUpdateResult(\n updates: { timezone?: string },\n result: { timezone: string | null },\n): void {\n if (updates.timezone !== undefined) {\n console.log(\n chalk.green(\n `Timezone set to ${chalk.cyan(result.timezone ?? updates.timezone)}`,\n ),\n );\n }\n}\n\n/**\n * Interactive prompts when no flags provided\n */\nasync function interactiveSetup(prefs: {\n timezone: string | null;\n}): Promise<void> {\n if (!prefs.timezone) {\n const detectedTz = detectTimezone();\n console.log(chalk.dim(`\\nSystem timezone detected: ${detectedTz}`));\n const tz = await promptText(\n \"Set timezone? (enter timezone or leave empty to skip)\",\n detectedTz,\n );\n if (tz?.trim()) {\n if (!isValidTimezone(tz.trim())) {\n throw new Error(`Invalid timezone: ${tz.trim()}`);\n }\n await updateZeroUserPreferences({ timezone: tz.trim() });\n console.log(chalk.green(`Timezone set to ${chalk.cyan(tz.trim())}`));\n }\n }\n}\n\n/**\n * zero preference\n *\n * View or update user preferences (timezone).\n */\nexport const zeroPreferenceCommand = new Command()\n .name(\"preference\")\n .description(\"View or update user preferences (timezone, notifications)\")\n .option(\"--timezone <timezone>\", \"IANA timezone (e.g., America/New_York)\")\n .action(\n withErrorHandler(async (opts: PreferenceOpts) => {\n const updates = buildUpdates(opts);\n\n if (updates) {\n const result = await updateZeroUserPreferences(updates);\n printUpdateResult(updates, result);\n return;\n }\n\n // No flags: display current preferences\n const prefs = await getZeroUserPreferences();\n displayPreferences(prefs);\n\n if (isInteractive()) {\n await interactiveSetup(prefs);\n } else if (!prefs.timezone) {\n console.log();\n console.log(\n `To set timezone: ${chalk.cyan(\"zero preference --timezone <timezone>\")}`,\n );\n console.log(\n chalk.dim(\"Example: zero preference --timezone America/New_York\"),\n );\n }\n }),\n );\n","import { mainRunCommand } from \"./run\";\nimport { continueCommand } from \"./continue\";\n\nmainRunCommand.addCommand(continueCommand);\n\nmainRunCommand.addHelpText(\n \"after\",\n `\nExamples:\n Discover teammates: zero agent list\n Delegate a task: zero run <agent-id> \"your task\"\n Continue delegation: zero run continue <session-id> \"follow up\"`,\n);\n\nexport const zeroRunCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Delegate a task to a teammate agent\")\n .argument(\"<agent-id>\", \"Agent UUID (from `zero agent list`)\")\n .argument(\"<prompt>\", \"Task prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .addHelpText(\n \"after\",\n `\nExamples:\n Delegate a task: zero run <agent-id> \"summarize the latest issues\"\n With verbose output: zero run <agent-id> \"fix the bug\" --verbose\n\nNotes:\n - Get agent IDs from \"zero agent list\"\n - The command streams events until the delegated run completes\n - On success, a session ID is printed for follow-up with \"zero run continue\"`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n ) => {\n // 1. Validate agent-id is a UUID\n if (!isUUID(agentId)) {\n throw new Error(`Invalid agent ID format: ${agentId}`, {\n cause: new Error(\n \"Agent ID must be a valid UUID. Use `zero agent list` to find agent IDs.\",\n ),\n });\n }\n\n // 2. Create zero run\n const response = await createZeroRun({\n agentId,\n prompt,\n modelProvider: options.modelProvider,\n debugNoMockClaude: options.debugNoMockClaude,\n debugNoMockCodex: options.debugNoMockCodex,\n });\n\n // 3. Check for immediate failure\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 // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import chalk from \"chalk\";\nimport { getZeroRunAgentEvents, getZeroRun } from \"../../../lib/api\";\nimport type { RunResult } from \"../../../lib/api\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport type { PollResult, EventRenderingOptions } from \"../../run/shared\";\n\ninterface SequencedEvent {\n sequenceNumber: number;\n}\n\ntype ZeroRunResponse = Awaited<ReturnType<typeof getZeroRun>>;\ntype TerminalRunStatus = \"completed\" | \"failed\" | \"timeout\" | \"cancelled\";\ntype TerminalRunResponse = ZeroRunResponse & { status: TerminalRunStatus };\n\nconst TERMINAL_RUN_STATUSES: readonly TerminalRunStatus[] = [\n \"completed\",\n \"failed\",\n \"timeout\",\n \"cancelled\",\n];\n\n/**\n * Safely narrow GetRunResponse.result to RunResult.\n * GetRunResponse.result has all fields optional (due to .passthrough()),\n * but RunResult requires checkpointId, agentSessionId, conversationId.\n * Extra fields (artifact, volumes) are preserved at runtime via passthrough.\n */\nfunction toRunResult(result: {\n output?: string;\n executionTimeMs?: number;\n agentSessionId?: string;\n checkpointId?: string;\n conversationId?: string;\n}): RunResult | undefined {\n const { checkpointId, agentSessionId, conversationId } = result;\n if (!checkpointId || !agentSessionId || !conversationId) {\n return undefined;\n }\n return { checkpointId, agentSessionId, conversationId };\n}\n\nfunction filterContiguousEvents<T extends SequencedEvent>(\n events: T[],\n lastSequence: number,\n): T[] {\n const contiguousEvents: T[] = [];\n let expectedSequence = lastSequence + 1;\n\n for (const event of events) {\n if (event.sequenceNumber < expectedSequence) {\n continue;\n }\n if (event.sequenceNumber !== expectedSequence) {\n break;\n }\n contiguousEvents.push(event);\n expectedSequence++;\n }\n\n return contiguousEvents;\n}\n\nconst POLL_INTERVAL_MS = 1000;\nconst TERMINAL_DRAIN_POLL_INTERVAL_MS = 500;\nconst TERMINAL_DRAIN_IDLE_MS = 1000;\nconst TERMINAL_DRAIN_MAX_MS = 3000;\n\nfunction isTerminalRunResponse(\n runResponse: ZeroRunResponse,\n): runResponse is TerminalRunResponse {\n return TERMINAL_RUN_STATUSES.includes(\n runResponse.status as TerminalRunStatus,\n );\n}\n\nfunction shouldDrainNextEventPage<T>(\n eventsResponse: { hasMore: boolean; events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.hasMore &&\n contiguousEvents.length > 0 &&\n contiguousEvents.length === eventsResponse.events.length\n );\n}\n\nfunction hasSequenceGap<T>(\n eventsResponse: { events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.events.length > 0 &&\n contiguousEvents.length < eventsResponse.events.length\n );\n}\n\nfunction shouldCompleteTerminalDrain(\n terminalSeenAt: number,\n lastTerminalProgressAt: number,\n blockedByGap: boolean,\n): boolean {\n const now = Date.now();\n const terminalElapsedMs = now - terminalSeenAt;\n const terminalIdleMs = now - lastTerminalProgressAt;\n return (\n terminalElapsedMs >= TERMINAL_DRAIN_MAX_MS ||\n (!blockedByGap && terminalIdleMs >= TERMINAL_DRAIN_IDLE_MS)\n );\n}\n\nfunction renderTerminalRunResult(\n runId: string,\n runResponse: TerminalRunResponse,\n): PollResult {\n if (runResponse.status === \"completed\") {\n EventRenderer.renderRunCompleted(\n runResponse.result ? toRunResult(runResponse.result) : undefined,\n );\n return {\n succeeded: true,\n runId,\n sessionId: runResponse.result?.agentSessionId,\n checkpointId: runResponse.result?.checkpointId,\n };\n }\n\n if (runResponse.status === \"failed\") {\n EventRenderer.renderRunFailed(runResponse.error, runId);\n return { succeeded: false, runId };\n }\n\n if (runResponse.status === \"timeout\") {\n console.error(chalk.red(\"\\n✗ Run timed out\"));\n return { succeeded: false, runId };\n }\n\n console.error(chalk.yellow(\"\\n✗ Run cancelled\"));\n return { succeeded: false, runId };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Poll for zero run events until run completes.\n * Uses dual-poll approach: telemetry endpoint for events, getById for status.\n */\nexport async function pollZeroEvents(\n runId: string,\n options?: EventRenderingOptions,\n): Promise<PollResult> {\n const renderer = new EventRenderer({ verbose: options?.verbose });\n\n let lastSequence = -1;\n let complete = false;\n let result: PollResult = { succeeded: true, runId };\n let terminalRunResponse: TerminalRunResponse | undefined;\n let terminalSeenAt = 0;\n let lastTerminalProgressAt = 0;\n\n while (!complete) {\n // 1. Fetch events from telemetry endpoint\n const eventsResponse = await getZeroRunAgentEvents(runId, {\n since: lastSequence,\n limit: 100,\n order: \"asc\",\n });\n\n const contiguousEvents = filterContiguousEvents(\n eventsResponse.events,\n lastSequence,\n );\n\n // 2. Parse and render each event\n for (const event of contiguousEvents) {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData, eventsResponse.framework);\n if (parsed) {\n renderer.render(parsed);\n }\n }\n\n // 3. Track last sequence number for pagination\n if (contiguousEvents.length > 0) {\n lastSequence =\n contiguousEvents[contiguousEvents.length - 1]!.sequenceNumber;\n if (terminalRunResponse) {\n lastTerminalProgressAt = Date.now();\n }\n }\n\n const blockedByGap = hasSequenceGap(eventsResponse, contiguousEvents);\n\n // If this page is fully contiguous and the server says more are already\n // queryable, drain the next page before checking terminal status. Otherwise\n // a completed run with >100 unseen events would render only the final page's\n // first batch and then exit.\n if (shouldDrainNextEventPage(eventsResponse, contiguousEvents)) {\n continue;\n }\n\n // 4. Fetch run status separately. During terminal drain, keep the latest\n // terminal state because timeout runs can still be upgraded to completed.\n const runResponse = await getZeroRun(runId);\n if (isTerminalRunResponse(runResponse)) {\n if (!terminalRunResponse) {\n terminalSeenAt = Date.now();\n lastTerminalProgressAt = terminalSeenAt;\n }\n terminalRunResponse = runResponse;\n }\n\n if (terminalRunResponse) {\n if (\n shouldCompleteTerminalDrain(\n terminalSeenAt,\n lastTerminalProgressAt,\n blockedByGap,\n )\n ) {\n result = renderTerminalRunResult(runId, terminalRunResponse);\n complete = true;\n }\n }\n\n if (!complete) {\n await sleep(\n terminalRunResponse\n ? TERMINAL_DRAIN_POLL_INTERVAL_MS\n : POLL_INTERVAL_MS,\n );\n }\n }\n\n return result;\n}\n\n/**\n * Display next steps after successful zero run\n */\nexport function showZeroNextSteps(result: PollResult): void {\n const { sessionId } = result;\n\n console.log();\n\n if (sessionId) {\n console.log(\" Continue delegation:\");\n console.log(\n chalk.cyan(` zero run continue ${sessionId} \"your next prompt\"`),\n );\n }\n}\n","import { Command } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\"Continue a previous delegation from a session\")\n .argument(\"<session-id>\", \"Session ID from a previous run\")\n .argument(\"<prompt>\", \"Follow-up prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero run continue <session-id> \"now deploy it\"\n zero run continue <session-id> \"add tests\" --verbose\n\nNotes:\n - The session ID is printed after a successful \"zero run\" delegation\n - Continues the same agent session with full prior context`,\n )\n .action(\n withErrorHandler(\n async (\n sessionId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n },\n ) => {\n // 1. Validate session-id is a UUID\n if (!isUUID(sessionId)) {\n throw new Error(`Invalid session ID format: ${sessionId}`, {\n cause: new Error(\"Session ID must be a valid UUID\"),\n });\n }\n\n // 2. Create zero run with sessionId (no agentId needed)\n const response = await createZeroRun({\n sessionId,\n prompt,\n modelProvider: options.modelProvider,\n });\n\n // 3. Check for immediate failure\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 // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { setupCommand } from \"./setup\";\nimport { listCommand } from \"./list\";\nimport { statusCommand } from \"./status\";\nimport { deleteCommand } from \"./delete\";\nimport { enableCommand } from \"./enable\";\nimport { disableCommand } from \"./disable\";\n\nexport const zeroScheduleCommand = new Command()\n .name(\"schedule\")\n .description(\"Create or manage recurring scheduled tasks\")\n .addCommand(setupCommand)\n .addCommand(listCommand)\n .addCommand(statusCommand)\n .addCommand(deleteCommand)\n .addCommand(enableCommand)\n .addCommand(disableCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create a schedule: zero schedule setup --help\n Check all schedules: zero schedule list\n Check schedule status: zero schedule status <agent-id>\n Pause a schedule: zero schedule disable <agent-id>\n Resume a schedule: zero schedule enable <agent-id>\n Delete a schedule: zero schedule delete <agent-id>`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n isInteractive,\n promptText,\n promptSelect,\n promptConfirm,\n} from \"../../../lib/utils/prompt-utils\";\nimport {\n generateCronExpression,\n detectTimezone,\n validateTimeFormat,\n validateDateFormat,\n getTomorrowDateLocal,\n getCurrentTimeLocal,\n toISODateTime,\n type ScheduleFrequency,\n} from \"../../../lib/domain/schedule-utils\";\nimport {\n resolveCompose,\n deployZeroSchedule,\n listZeroSchedules,\n enableZeroSchedule,\n getZeroUserPreferences,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\n\nconst FREQUENCY_CHOICES = [\n { title: \"Daily\", value: \"daily\" as const, description: \"Run every day\" },\n {\n title: \"Weekly\",\n value: \"weekly\" as const,\n description: \"Run once per week\",\n },\n {\n title: \"Monthly\",\n value: \"monthly\" as const,\n description: \"Run once per month\",\n },\n {\n title: \"One-time\",\n value: \"once\" as const,\n description: \"Run once at specific time\",\n },\n {\n title: \"Loop\",\n value: \"loop\" as const,\n description: \"Run repeatedly at fixed intervals\",\n },\n];\n\nconst DAY_OF_WEEK_CHOICES = [\n { title: \"Monday\", value: 1 },\n { title: \"Tuesday\", value: 2 },\n { title: \"Wednesday\", value: 3 },\n { title: \"Thursday\", value: 4 },\n { title: \"Friday\", value: 5 },\n { title: \"Saturday\", value: 6 },\n { title: \"Sunday\", value: 0 },\n];\n\nfunction parseDayOption(\n day: string,\n frequency: ScheduleFrequency,\n): number | undefined {\n if (frequency === \"weekly\") {\n const dayMap: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n };\n return dayMap[day.toLowerCase()];\n } else if (frequency === \"monthly\") {\n const num = parseInt(day, 10);\n if (num >= 1 && num <= 31) {\n return num;\n }\n }\n return undefined;\n}\n\nfunction formatInTimezone(isoDate: string, timezone: string): string {\n const date = new Date(isoDate);\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).formatToParts(date);\n\n const get = (type: string) => {\n return (\n parts.find((p) => {\n return p.type === type;\n })?.value ?? \"\"\n );\n };\n return `${get(\"year\")}-${get(\"month\")}-${get(\"day\")} ${get(\"hour\")}:${get(\"minute\")}`;\n}\n\nfunction parseFrequencyFromCron(\n cron: string,\n): { frequency: ScheduleFrequency; day?: number; time: string } | null {\n const parts = cron.split(\" \");\n if (parts.length !== 5) return null;\n\n const [minute, hour, dayOfMonth, , dayOfWeek] = parts;\n const time = `${hour!.padStart(2, \"0\")}:${minute!.padStart(2, \"0\")}`;\n\n if (dayOfMonth === \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"daily\", time };\n } else if (dayOfMonth === \"*\" && dayOfWeek !== \"*\") {\n return { frequency: \"weekly\", day: parseInt(dayOfWeek!, 10), time };\n } else if (dayOfMonth !== \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"monthly\", day: parseInt(dayOfMonth!, 10), time };\n }\n\n return null;\n}\n\ninterface SetupOptions {\n name?: string;\n frequency?: string;\n time?: string;\n day?: string;\n interval?: string;\n timezone?: string;\n prompt?: string;\n promptFile?: string;\n enable?: boolean;\n modelProvider?: string;\n model?: string;\n}\n\ninterface ExistingScheduleDefaults {\n frequency?: ScheduleFrequency;\n day?: number;\n time?: string;\n intervalSeconds?: number;\n}\n\ninterface ScheduleListItem {\n name: string;\n agentId: string;\n triggerType?: \"cron\" | \"once\" | \"loop\";\n cronExpression?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n timezone: string;\n prompt: string;\n enabled?: boolean;\n}\n\nfunction getExistingDefaults(\n existingSchedule: ScheduleListItem | undefined,\n): ExistingScheduleDefaults {\n const defaults: ExistingScheduleDefaults = {};\n\n if (existingSchedule?.triggerType === \"loop\") {\n defaults.frequency = \"loop\";\n defaults.intervalSeconds = existingSchedule.intervalSeconds ?? undefined;\n } else if (existingSchedule?.cronExpression) {\n const parsed = parseFrequencyFromCron(existingSchedule.cronExpression);\n if (parsed) {\n defaults.frequency = parsed.frequency;\n defaults.day = parsed.day;\n defaults.time = parsed.time;\n }\n } else if (existingSchedule?.atTime) {\n defaults.frequency = \"once\";\n }\n\n return defaults;\n}\n\nasync function gatherFrequency(\n optionFrequency: string | undefined,\n existingFrequency: ScheduleFrequency | undefined,\n): Promise<ScheduleFrequency | null> {\n let frequency = optionFrequency as ScheduleFrequency | undefined;\n\n if (\n frequency &&\n [\"daily\", \"weekly\", \"monthly\", \"once\", \"loop\"].includes(frequency)\n ) {\n return frequency;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--frequency is required (daily|weekly|monthly|once|loop)\");\n }\n\n const defaultIndex = existingFrequency\n ? FREQUENCY_CHOICES.findIndex((c) => {\n return c.value === existingFrequency;\n })\n : 0;\n\n frequency = await promptSelect<ScheduleFrequency>(\n \"Schedule frequency\",\n FREQUENCY_CHOICES,\n defaultIndex >= 0 ? defaultIndex : 0,\n );\n\n return frequency || null;\n}\n\nasync function gatherDay(\n frequency: ScheduleFrequency,\n optionDay: string | undefined,\n existingDay: number | undefined,\n): Promise<number | null> {\n if (frequency !== \"weekly\" && frequency !== \"monthly\") {\n return null;\n }\n\n if (optionDay) {\n const day = parseDayOption(optionDay, frequency);\n if (day === undefined) {\n throw new Error(\n `Invalid day: ${optionDay}. Use mon-sun for weekly or 1-31 for monthly.`,\n );\n }\n return day;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--day is required for weekly/monthly\");\n }\n\n if (frequency === \"weekly\") {\n const defaultDayIndex =\n existingDay !== undefined\n ? DAY_OF_WEEK_CHOICES.findIndex((c) => {\n return c.value === existingDay;\n })\n : 0;\n const day = await promptSelect(\n \"Day of week\",\n DAY_OF_WEEK_CHOICES,\n defaultDayIndex >= 0 ? defaultDayIndex : 0,\n );\n return day ?? null;\n }\n\n const dayStr = await promptText(\n \"Day of month (1-31)\",\n existingDay?.toString() || \"1\",\n );\n if (!dayStr) return null;\n\n const day = parseInt(dayStr, 10);\n if (isNaN(day) || day < 1 || day > 31) {\n throw new Error(\"Day must be between 1 and 31\");\n }\n return day;\n}\n\nasync function gatherRecurringTime(\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | undefined> {\n if (optionTime) {\n const validation = validateTimeFormat(optionTime);\n if (validation !== true) {\n throw new Error(`Invalid time: ${validation}`);\n }\n return optionTime;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--time is required (HH:MM format)\");\n }\n\n return await promptText(\n \"Time (HH:MM)\",\n existingTime || \"09:00\",\n validateTimeFormat,\n );\n}\n\nasync function gatherOneTimeSchedule(\n optionDay: string | undefined,\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | null> {\n if (optionDay && optionTime) {\n if (!validateDateFormat(optionDay)) {\n throw new Error(\n `Invalid date format: ${optionDay}. Use YYYY-MM-DD format.`,\n );\n }\n if (!validateTimeFormat(optionTime)) {\n throw new Error(`Invalid time format: ${optionTime}. Use HH:MM format.`);\n }\n return `${optionDay} ${optionTime}`;\n }\n\n if (!isInteractive()) {\n throw new Error(\"One-time schedules require interactive mode\", {\n cause: new Error(\n \"Or provide --day (YYYY-MM-DD) and --time (HH:MM) flags\",\n ),\n });\n }\n\n const tomorrowDate = getTomorrowDateLocal();\n const date = await promptText(\n \"Date (YYYY-MM-DD, default tomorrow)\",\n tomorrowDate,\n validateDateFormat,\n );\n if (!date) return null;\n\n const currentTime = getCurrentTimeLocal();\n const time = await promptText(\n \"Time (HH:MM)\",\n existingTime || currentTime,\n validateTimeFormat,\n );\n if (!time) return null;\n\n return `${date} ${time}`;\n}\n\nasync function gatherTimezone(\n optionTimezone: string | undefined,\n existingTimezone: string | undefined | null,\n): Promise<string | undefined> {\n if (optionTimezone) return optionTimezone;\n\n let userTimezone: string | null = null;\n try {\n const prefs = await getZeroUserPreferences();\n userTimezone = prefs.timezone;\n } catch {\n console.log(\n chalk.dim(\"Could not fetch timezone preference, using detected timezone\"),\n );\n }\n\n const defaultTimezone = userTimezone || detectTimezone();\n\n if (!isInteractive()) {\n return defaultTimezone;\n }\n\n return await promptText(\"Timezone\", existingTimezone || defaultTimezone);\n}\n\nasync function gatherPromptText(\n optionPrompt: string | undefined,\n optionPromptFile: string | undefined,\n existingPrompt: string | undefined | null,\n): Promise<string | undefined> {\n if (optionPrompt && optionPromptFile) {\n throw new Error(\"Cannot use --prompt and --prompt-file together\");\n }\n\n if (optionPromptFile) {\n return readFileSync(optionPromptFile, \"utf-8\");\n }\n\n if (optionPrompt) return optionPrompt;\n\n if (!isInteractive()) {\n throw new Error(\"--prompt or --prompt-file is required\");\n }\n\n return await promptText(\n \"Prompt to run\",\n existingPrompt || \"let's start working.\",\n );\n}\n\nasync function gatherInterval(\n optionInterval: string | undefined,\n existingInterval: number | undefined,\n): Promise<number | null> {\n if (optionInterval) {\n const val = parseInt(optionInterval, 10);\n if (isNaN(val) || val < 0) {\n throw new Error(\n \"Invalid interval. Must be a non-negative integer (seconds)\",\n );\n }\n return val;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--interval is required for loop schedules (seconds)\");\n }\n\n const defaultVal =\n existingInterval !== undefined ? String(existingInterval) : \"300\";\n const result = await promptText(\n \"Interval in seconds (time between runs)\",\n defaultVal,\n (v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 0) return \"Must be a non-negative integer\";\n return true;\n },\n );\n if (!result) return null;\n return parseInt(result, 10);\n}\n\nasync function gatherTiming(\n frequency: ScheduleFrequency,\n options: SetupOptions,\n defaults: ExistingScheduleDefaults,\n): Promise<{\n day: number | undefined;\n time: string | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n} | null> {\n if (frequency === \"loop\") {\n const intervalSeconds = await gatherInterval(\n options.interval,\n defaults.intervalSeconds,\n );\n if (intervalSeconds === null) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: undefined,\n intervalSeconds,\n };\n }\n\n if (frequency === \"once\") {\n const result = await gatherOneTimeSchedule(\n options.day,\n options.time,\n defaults.time,\n );\n if (!result) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: result,\n intervalSeconds: undefined,\n };\n }\n\n const day =\n (await gatherDay(frequency, options.day, defaults.day)) ?? undefined;\n if (day === null && (frequency === \"weekly\" || frequency === \"monthly\")) {\n return null;\n }\n\n const time = await gatherRecurringTime(options.time, defaults.time);\n if (!time) return null;\n\n return { day, time, atTime: undefined, intervalSeconds: undefined };\n}\n\nasync function findExistingSchedule(\n agentId: string,\n scheduleName: string,\n): Promise<ScheduleListItem | undefined> {\n const { schedules } = await listZeroSchedules();\n return schedules.find((s) => {\n return s.agentId === agentId && s.name === scheduleName;\n });\n}\n\ninterface DeployResult {\n created: boolean;\n schedule: {\n triggerType?: \"cron\" | \"once\" | \"loop\";\n timezone: string;\n cronExpression?: string | null;\n nextRunAt?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n };\n}\n\nasync function buildAndDeploy(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n frequency: ScheduleFrequency;\n time: string | undefined;\n day: number | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n timezone: string;\n prompt: string;\n existingEnabled: boolean | undefined;\n modelProviderId: string | null | undefined;\n selectedModel: string | null | undefined;\n}): Promise<DeployResult> {\n let cronExpression: string | undefined;\n let atTimeISO: string | undefined;\n\n if (params.frequency === \"loop\") {\n // Loop mode: intervalSeconds is passed directly\n } else if (params.atTime) {\n atTimeISO = toISODateTime(params.atTime);\n } else if (params.time && params.frequency !== \"once\") {\n cronExpression = generateCronExpression(\n params.frequency,\n params.time,\n params.day,\n );\n }\n\n console.log(\n `\\nDeploying schedule for agent ${chalk.cyan(params.agentName)}...`,\n );\n\n // Preserve enabled state on update so loop schedules don't lose nextRunAt.\n // On create, existingEnabled is undefined → omit the field so the server\n // applies its default (disabled; enable happens later via the enable flow).\n const deployResult = await deployZeroSchedule({\n name: params.scheduleName,\n agentId: params.agentId,\n cronExpression,\n atTime: atTimeISO,\n intervalSeconds: params.intervalSeconds,\n timezone: params.timezone,\n prompt: params.prompt,\n ...(params.existingEnabled !== undefined && {\n enabled: params.existingEnabled,\n }),\n ...(params.modelProviderId !== undefined && {\n modelProviderId: params.modelProviderId,\n }),\n ...(params.selectedModel !== undefined && {\n selectedModel: params.selectedModel,\n }),\n });\n\n return deployResult;\n}\n\nfunction displayDeployResult(\n scheduleName: string,\n deployResult: DeployResult,\n): void {\n if (deployResult.created) {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" created`));\n } else {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" updated`));\n }\n\n console.log(chalk.dim(` Timezone: ${deployResult.schedule.timezone}`));\n\n if (\n deployResult.schedule.triggerType === \"loop\" &&\n deployResult.schedule.intervalSeconds != null\n ) {\n console.log(\n chalk.dim(\n ` Mode: Loop (interval ${deployResult.schedule.intervalSeconds}s)`,\n ),\n );\n } else if (deployResult.schedule.cronExpression) {\n console.log(chalk.dim(` Cron: ${deployResult.schedule.cronExpression}`));\n if (deployResult.schedule.nextRunAt) {\n const nextRun = formatInTimezone(\n deployResult.schedule.nextRunAt,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` Next run: ${nextRun}`));\n }\n } else if (deployResult.schedule.atTime) {\n const atTimeFormatted = formatInTimezone(\n deployResult.schedule.atTime,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` At: ${atTimeFormatted}`));\n }\n}\n\nasync function tryEnableSchedule(\n scheduleName: string,\n agentId: string,\n agentName: string,\n): Promise<void> {\n try {\n await enableZeroSchedule({ name: scheduleName, agentId });\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" enabled`));\n } catch (error) {\n console.error(chalk.yellow(\"⚠ Failed to enable schedule\"));\n if (error instanceof ApiRequestError) {\n if (error.code === \"SCHEDULE_PAST\") {\n console.error(chalk.dim(\" Scheduled time has already passed\"));\n } else {\n console.error(chalk.dim(` ${error.message}`));\n }\n } else if (error instanceof Error) {\n console.error(chalk.dim(` ${error.message}`));\n }\n console.log(\n ` To enable manually: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n }\n}\n\nfunction showEnableHint(agentName: string): void {\n console.log();\n console.log(\n ` To enable: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n}\n\nasync function handleScheduleEnabling(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n enableFlag: boolean;\n shouldPromptEnable: boolean;\n}): Promise<void> {\n const { scheduleName, agentId, agentName, enableFlag, shouldPromptEnable } =\n params;\n\n if (enableFlag) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n return;\n }\n\n if (shouldPromptEnable && isInteractive()) {\n const enableNow = await promptConfirm(\"Enable this schedule?\", true);\n if (enableNow) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n } else {\n showEnableHint(agentName);\n }\n return;\n }\n\n if (shouldPromptEnable) {\n showEnableHint(agentName);\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Create or edit a schedule for a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-n, --name <schedule-name>\", 'Schedule name (default: \"default\")')\n .option(\"-f, --frequency <type>\", \"Frequency: daily|weekly|monthly|once|loop\")\n .option(\"-t, --time <HH:MM>\", \"Time to run (24-hour format)\")\n .option(\"-d, --day <day>\", \"Day of week (mon-sun) or day of month (1-31)\")\n .option(\"-i, --interval <seconds>\", \"Interval in seconds for loop mode\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone\")\n .option(\"-p, --prompt <text>\", \"Prompt to run\")\n .option(\n \"--prompt-file <path>\",\n \"Read prompt from file (cannot be used with --prompt)\",\n )\n .option(\"-e, --enable\", \"Enable schedule immediately after creation\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit from agent/org\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Daily at 9am: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\"\n Weekly on Monday: zero schedule setup <agent-id> -f weekly -d mon -t 10:00 -p \"weekly sync\"\n Monthly on the 1st: zero schedule setup <agent-id> -f monthly -d 1 -t 08:00 -p \"monthly review\"\n One-time: zero schedule setup <agent-id> -f once -d 2026-04-01 -t 14:00 -p \"one-off task\"\n Loop every 5 minutes: zero schedule setup <agent-id> -f loop -i 300 -p \"poll for updates\"\n Prompt from file: zero schedule setup <agent-id> -f daily -t 09:00 --prompt-file ./prompt.md\n Create and enable: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\" --enable\n Override model: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider <id> --model MiniMax-M2.7\n Reset model override: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider default --model default\n\nNotes:\n - Re-running setup with the same agent updates the existing \"default\" schedule\n - Use -n to manage multiple named schedules for the same agent\n - --model-provider and --model default to inheriting the agent's configuration\n - Use 'zero org model-provider list' to see available providers and models\n - All flags are required in non-interactive mode; interactive mode prompts for missing values\n - If the user wants to be notified when a schedule completes, ask them where they want to receive the notification: web chat or Slack, then include it in the prompt`,\n )\n .action(\n withErrorHandler(async (agentIdentifier: string, options: SetupOptions) => {\n // 1. Resolve agent identifier (UUID or name) to compose ID\n const compose = await resolveCompose(agentIdentifier);\n if (!compose) {\n throw new Error(`Agent not found: ${agentIdentifier}`);\n }\n const agentId = compose.id;\n const scheduleName = options.name || \"default\";\n\n // 2. Check for existing schedule\n const existingSchedule = await findExistingSchedule(\n agentId,\n scheduleName,\n );\n\n const agentName = compose.name;\n console.log(\n chalk.dim(\n existingSchedule\n ? `Editing existing schedule for agent ${agentName}`\n : `Creating new schedule for agent ${agentName}`,\n ),\n );\n\n const defaults = getExistingDefaults(existingSchedule);\n\n // 3. Gather frequency\n const frequency = await gatherFrequency(\n options.frequency,\n defaults.frequency,\n );\n if (!frequency) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 4. Gather day and time\n const timing = await gatherTiming(frequency, options, defaults);\n if (!timing) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n const { day, time, atTime, intervalSeconds } = timing;\n\n // 5. Gather timezone\n const timezone = await gatherTimezone(\n options.timezone,\n existingSchedule?.timezone,\n );\n if (!timezone) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 6. Gather prompt\n const promptText_ = await gatherPromptText(\n options.prompt,\n options.promptFile,\n existingSchedule?.prompt,\n );\n if (!promptText_) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 7. Build trigger and deploy\n const deployResult = await buildAndDeploy({\n scheduleName,\n agentId,\n agentName,\n frequency,\n time,\n day,\n atTime,\n intervalSeconds,\n timezone,\n prompt: promptText_,\n existingEnabled: existingSchedule?.enabled,\n modelProviderId: parseModelFlag(options.modelProvider),\n selectedModel: parseModelFlag(options.model),\n });\n\n // 8. Display deployment result\n displayDeployResult(scheduleName, deployResult);\n\n // 9. Handle schedule enabling\n const shouldPromptEnable =\n deployResult.created ||\n (existingSchedule !== undefined && !existingSchedule.enabled);\n\n await handleScheduleEnabling({\n scheduleName,\n agentId,\n agentName,\n enableFlag: options.enable ?? false,\n shouldPromptEnable,\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroSchedules } from \"../../../lib/api\";\nimport { formatRelativeTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero schedules\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule list`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSchedules();\n\n if (result.schedules.length === 0) {\n console.log(chalk.dim(\"No schedules found\"));\n console.log(\n chalk.dim(\" Create one with: zero schedule setup <agent-id>\"),\n );\n return;\n }\n\n const agentWidth = Math.max(\n 5,\n ...result.schedules.map((s) => {\n return s.agentId.length;\n }),\n );\n const scheduleWidth = Math.max(\n 8,\n ...result.schedules.map((s) => {\n return s.name.length;\n }),\n );\n const triggerWidth = Math.max(\n 7,\n ...result.schedules.map((s) => {\n return s.cronExpression\n ? s.cronExpression.length + s.timezone.length + 3\n : s.atTime?.length || 0;\n }),\n );\n\n const header = [\n \"AGENT\".padEnd(agentWidth),\n \"SCHEDULE\".padEnd(scheduleWidth),\n \"TRIGGER\".padEnd(triggerWidth),\n \"STATUS\".padEnd(8),\n \"NEXT RUN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const schedule of result.schedules) {\n const trigger = schedule.cronExpression\n ? `${schedule.cronExpression} (${schedule.timezone})`\n : schedule.atTime || \"-\";\n\n const status = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n\n const nextRun = schedule.enabled\n ? formatRelativeTime(schedule.nextRunAt)\n : \"-\";\n\n const row = [\n schedule.agentId.padEnd(agentWidth),\n schedule.name.padEnd(scheduleWidth),\n trigger.padEnd(triggerWidth),\n status.padEnd(8 + (schedule.enabled ? 0 : 2)),\n nextRun,\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolveZeroScheduleByAgent } from \"../../../lib/api\";\nimport {\n formatDateTime,\n detectTimezone,\n} from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport type { ScheduleResponse } from \"@vm0/api-contracts/contracts/zero-schedules\";\n\n/**\n * Format date with styled relative time (adds chalk formatting)\n */\nfunction formatDateTimeStyled(dateStr: string | null): string {\n if (!dateStr) return chalk.dim(\"-\");\n const formatted = formatDateTime(dateStr);\n return formatted.replace(/\\(([^)]+)\\)$/, chalk.dim(\"($1)\"));\n}\n\n/**\n * Format trigger (cron or at) - timezone shown separately\n */\nfunction formatTrigger(schedule: ScheduleResponse): string {\n if (schedule.triggerType === \"loop\" && schedule.intervalSeconds !== null) {\n return `interval ${schedule.intervalSeconds}s ${chalk.dim(\"(loop)\")}`;\n }\n if (schedule.cronExpression) {\n return schedule.cronExpression;\n }\n if (schedule.atTime) {\n return `${schedule.atTime} ${chalk.dim(\"(one-time)\")}`;\n }\n return chalk.dim(\"-\");\n}\n\n/**\n * Print run configuration section\n */\nfunction printRunConfiguration(\n schedule: ScheduleResponse,\n showFullPrompt: boolean,\n): void {\n const statusText = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(`${\"Status:\".padEnd(16)}${statusText}`);\n\n console.log(`${\"Agent:\".padEnd(16)}${schedule.agentId}`);\n\n if (showFullPrompt) {\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(schedule.prompt)}`);\n } else {\n const truncated = schedule.prompt.length > 60;\n const promptPreview = truncated\n ? schedule.prompt.slice(0, 57) + \"...\"\n : schedule.prompt;\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(promptPreview)}`);\n if (truncated) {\n console.log(\n chalk.dim(\" Run with --prompt (-p) to see full prompt\"),\n );\n }\n }\n\n if (schedule.vars && Object.keys(schedule.vars).length > 0) {\n console.log(\n `${\"Variables:\".padEnd(16)}${Object.keys(schedule.vars).join(\", \")}`,\n );\n }\n\n if (schedule.secretNames && schedule.secretNames.length > 0) {\n console.log(`${\"Secrets:\".padEnd(16)}${schedule.secretNames.join(\", \")}`);\n }\n\n if (\n schedule.volumeVersions &&\n Object.keys(schedule.volumeVersions).length > 0\n ) {\n console.log(\n `${\"Volumes:\".padEnd(16)}${Object.keys(schedule.volumeVersions).join(\", \")}`,\n );\n }\n}\n\n/**\n * Print time schedule section\n */\nfunction printTimeSchedule(schedule: ScheduleResponse): void {\n console.log();\n console.log(`${\"Trigger:\".padEnd(16)}${formatTrigger(schedule)}`);\n console.log(`${\"Timezone:\".padEnd(16)}${detectTimezone()}`);\n\n if (schedule.enabled) {\n console.log(\n `${\"Next Run:\".padEnd(16)}${formatDateTimeStyled(schedule.nextRunAt)}`,\n );\n }\n\n if (schedule.triggerType === \"loop\" || schedule.triggerType === \"cron\") {\n const failureText =\n schedule.consecutiveFailures > 0\n ? chalk.yellow(`${schedule.consecutiveFailures}/3`)\n : chalk.dim(\"0/3\");\n console.log(`${\"Failures:\".padEnd(16)}${failureText}`);\n }\n}\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-p, --prompt\", \"Show full prompt content without truncation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule status <agent-id>\n zero schedule status <agent-id> -n my-schedule\n zero schedule status <agent-id> --prompt`,\n )\n .action(\n withErrorHandler(\n async (\n agentName: string,\n options: { name?: string; prompt?: boolean },\n ) => {\n const schedule = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n console.log();\n console.log(`Schedule for agent: ${chalk.cyan(agentName)}`);\n console.log(chalk.dim(\"━\".repeat(50)));\n\n printRunConfiguration(schedule, options.prompt ?? false);\n printTimeSchedule(schedule);\n\n console.log();\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n deleteZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule delete <agent-id>\n zero schedule delete <agent-id> -n my-schedule -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(\n async (agentName: string, options: { name?: string; yes?: boolean }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete schedule for agent ${chalk.cyan(agentName)}?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" deleted`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n enableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule enable <agent-id>\n zero schedule enable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await enableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" enabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n disableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule disable <agent-id>\n zero schedule disable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await disableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" disabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Read or write secrets (API keys, tokens)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConnectorDerivedNames } from \"@vm0/connectors/connector-utils\";\nimport { listZeroSecrets } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No secrets found\"));\n console.log();\n console.log(\"To add a secret:\");\n console.log(chalk.cyan(\" zero secret set MY_API_KEY --body <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n let typeIndicator = \"\";\n let derivedLine: string | null = null;\n\n if (secret.type === \"model-provider\") {\n typeIndicator = chalk.dim(\" [model-provider]\");\n } else if (secret.type === \"connector\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n } else {\n typeIndicator = chalk.dim(\" [connector]\");\n }\n } else if (secret.type === \"user\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n }\n }\n\n console.log(` ${chalk.cyan(secret.name)}${typeIndicator}`);\n if (derivedLine) {\n console.log(` ${derivedLine}`);\n }\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptPassword } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a secret\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete a secret\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSecret(name);\n console.log(chalk.green(`✓ Secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroChatMessageCommand } from \"./message\";\n\nexport const zeroChatCommand = new Command()\n .name(\"chat\")\n .description(\"Send messages to web chat threads\")\n .addCommand(zeroChatMessageCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent: zero chat message send -a <agent-id> --text \"Hello!\"`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroChatMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage chat messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero chat message send -t <thread-id> --text \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendChatMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a web chat thread\")\n .option(\"-t, --thread <id>\", \"Existing chat thread ID\")\n .option(\"-a, --agent <agentId>\", \"Agent ID (creates a new thread)\")\n .option(\"--text <message>\", \"Message text\")\n .option(\"--title <title>\", \"Thread title (only with --agent)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to existing thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent (new thread): zero chat message send -a <agent-id> --text \"Hello!\"\n\nNotes:\n - Either --thread or --agent is required; they are mutually exclusive\n - --text is required (or pipe via stdin)`,\n )\n .action(\n withErrorHandler(\n async (options: {\n thread?: string;\n agent?: string;\n text?: string;\n title?: string;\n }) => {\n let text = options.text;\n const { thread, agent, title } = options;\n\n // Validate mutual exclusion: exactly one of --thread or --agent\n if (!thread && !agent) {\n throw new Error(\"Either --thread or --agent must be provided\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"\\n zero chat message send -a AGENT_ID --text \"your message\"',\n ),\n });\n }\n if (thread && agent) {\n throw new Error(\"--thread and --agent are mutually exclusive\", {\n cause: new Error(\n \"Provide either --thread to send to an existing thread or --agent to create a new thread, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"--text is required\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"',\n ),\n });\n }\n\n const result = await sendChatMessage({\n thread: thread || undefined,\n agent: agent || undefined,\n text,\n title: title || undefined,\n });\n\n console.log(\n chalk.green(\n `✓ Message sent (id: ${result.messageId}, thread: ${result.threadId})`,\n ),\n );\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { zeroSlackMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { downloadFileCommand } from \"./download-file\";\n\nexport const zeroSlackCommand = new Command()\n .name(\"slack\")\n .description(\n \"Send messages, upload files, and download files from Slack as the bot\",\n )\n .addCommand(zeroSlackMessageCommand)\n .addCommand(uploadFileCommand)\n .addCommand(downloadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero slack message send -c <channel-id> -t \"Hello!\"\n Reply in a thread: zero slack message send -c <channel-id> --thread <ts> -t \"reply\"\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c <channel-id>\n Download a file: zero slack download-file <file-id> -o /tmp/out.png`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroSlackMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Slack messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero slack message send -c <channel-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendSlackMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Slack channel or DM a user\")\n .option(\"-c, --channel <id>\", \"Channel ID\")\n .option(\"-u, --user <id>\", 'Slack user ID for DM (use \"me\" for yourself)')\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--thread <ts>\", \"Thread timestamp for replies\")\n .option(\"--blocks <json>\", \"Block Kit JSON string\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero slack message send -c C01234 -t \"Hello!\"\n DM a user: zero slack message send -u U0A8V9X98QJ -t \"Hello!\"\n DM yourself: zero slack message send -u me -t \"Hello!\"\n Reply in thread: zero slack message send -c C01234 --thread 1234567890.123456 -t \"reply\"\n Rich blocks: zero slack message send -c C01234 --blocks '[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Bold*\"}}]'\n\nNotes:\n - Either --channel or --user is required; they are mutually exclusive\n - Either --text or --blocks is required; both can be used together`,\n )\n .action(\n withErrorHandler(\n async (options: {\n channel?: string;\n user?: string;\n text?: string;\n thread?: string;\n blocks?: string;\n }) => {\n let text = options.text;\n const { channel, user, thread, blocks: blocksStr } = options;\n\n // Validate mutual exclusion: exactly one of --channel or --user\n if (!channel && !user) {\n throw new Error(\"Either --channel or --user must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"\\n zero slack message send -u USER_ID -t \"your message\"',\n ),\n });\n }\n if (channel && user) {\n throw new Error(\"--channel and --user are mutually exclusive\", {\n cause: new Error(\n \"Provide either --channel to send to a channel or --user to DM a user, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n // (isTTY is false when piped, undefined when no TTY context e.g. tests)\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n // Parse blocks JSON if provided\n let blocks: Array<{ type: string; [key: string]: unknown }> | undefined;\n if (blocksStr) {\n try {\n blocks = JSON.parse(blocksStr) as Array<{\n type: string;\n [key: string]: unknown;\n }>;\n } catch {\n throw new Error(\"Invalid JSON for --blocks flag\", {\n cause: new Error(\n \"Provide a valid JSON array of Block Kit blocks\",\n ),\n });\n }\n }\n\n // Validate at least one of text or blocks\n if (!text && !blocks) {\n throw new Error(\"Either --text or --blocks must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendSlackMessage({\n channel: channel || undefined,\n user: user || undefined,\n text: text || undefined,\n threadTs: thread,\n blocks,\n });\n\n const tsInfo = result.ts ? ` (ts: ${result.ts})` : \"\";\n console.log(chalk.green(`✓ Message sent${tsInfo}`));\n },\n ),\n );\n","import { statSync, readFileSync } from \"fs\";\nimport { basename } from \"path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { initSlackFileUpload, completeSlackFileUpload } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a file to a Slack channel as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-c, --channel <id>\", \"Slack channel ID\")\n .option(\"--thread <ts>\", \"Thread timestamp to post as a reply\")\n .option(\"--title <title>\", \"Display title for the file\")\n .option(\"--comment <text>\", \"Initial comment to accompany the file\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c C01234\n Upload to thread: zero slack upload-file -f /tmp/log.txt -c C01234 --thread 1234567890.123456\n With title and comment: zero slack upload-file -f /tmp/data.csv -c C01234 --title \"Daily Report\" --comment \"Here's the report\"\n\nNotes:\n - Uses the bot token (not user SLACK_TOKEN), so no files:write permission is needed\n - Returns file_id and permalink for reference`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n channel: string;\n thread?: string;\n title?: string;\n comment?: string;\n }) => {\n // Validate file exists and get size\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n fileSize = stat.size;\n } catch {\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n\n // Step 1: Get pre-signed upload URL from server\n const { uploadUrl, fileId } = await initSlackFileUpload({\n filename,\n length: fileSize,\n });\n\n // Step 2: Upload file directly to Slack's pre-signed URL\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(uploadUrl, {\n method: \"POST\",\n body: fileContent,\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n // Step 3: Complete the upload and share to channel/thread\n const result = await completeSlackFileUpload({\n fileId,\n channel: options.channel,\n threadTs: options.thread,\n title: options.title,\n initialComment: options.comment,\n });\n\n console.log(chalk.green(`✓ File uploaded (file_id: ${result.fileId})`));\n console.log(chalk.dim(` permalink: ${result.permalink}`));\n },\n ),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadSlackFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Slack file id.\n * Uses the system temp directory; extension is appended later once the\n * mimetype is known.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `slack-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Slack file by id using the bot token\")\n .argument(\"<file-id>\", \"Slack file id (e.g. F01234ABCD)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/slack-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero slack download-file F01234ABCD\n Download to explicit path: zero slack download-file F01234ABCD -o /tmp/image.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/slack-F01234ABCD\",\"mimetype\":\"image/png\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the bot token on the server side; no user Slack token is needed\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadSlackFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroTelegramBotCommand } from \"./bot\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { zeroTelegramMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroTelegramCommand = new Command()\n .name(\"telegram\")\n .description(\n \"Inspect bots, send messages, upload files, and download files from Telegram\",\n )\n .addCommand(zeroTelegramBotCommand)\n .addCommand(zeroTelegramMessageCommand)\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n List bots: zero telegram bot list\n Send a message: zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id <bot-id> -c <chat-id>\n Download a file: zero telegram download-file <file-id> --bot-id <bot-id> -o /tmp/out.jpg`,\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\n\nexport const zeroTelegramBotCommand = new Command()\n .name(\"bot\")\n .description(\"Inspect Telegram bots\")\n .addCommand(listCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listTelegramBots } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport type { TelegramBotListItem } from \"@vm0/api-contracts/contracts/integrations\";\n\nfunction usernameLabel(bot: TelegramBotListItem): string {\n if (!bot.username) return \"-\";\n return bot.username.startsWith(\"@\") ? bot.username : `@${bot.username}`;\n}\n\nfunction statusLabel(bot: TelegramBotListItem): string {\n if (bot.tokenStatus === \"valid\") return chalk.green(\"valid\");\n if (bot.tokenStatus === \"invalid\") return chalk.red(\"invalid\");\n return chalk.yellow(\"unknown\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Telegram bots available in the active organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list\n\nNotes:\n - Use this to find the --bot-id value before sending Telegram messages.`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listTelegramBots();\n const { bots } = result;\n\n if (bots.length === 0) {\n console.log(chalk.dim(\"No Telegram bots found\"));\n console.log(\n chalk.dim(\" Add one from Settings > Integrations > Telegram\"),\n );\n return;\n }\n\n const botIdWidth = Math.max(\n 6,\n ...bots.map((bot) => {\n return bot.id.length;\n }),\n );\n const usernameWidth = Math.max(\n 8,\n ...bots.map((bot) => {\n return usernameLabel(bot).length;\n }),\n );\n const agentWidth = Math.max(\n 5,\n ...bots.map((bot) => {\n return (bot.agent?.name ?? \"-\").length;\n }),\n );\n\n const header = [\n \"BOT ID\".padEnd(botIdWidth),\n \"USERNAME\".padEnd(usernameWidth),\n \"AGENT\".padEnd(agentWidth),\n \"CONNECTED\",\n \"TOKEN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const bot of bots) {\n const row = [\n bot.id.padEnd(botIdWidth),\n usernameLabel(bot).padEnd(usernameWidth),\n (bot.agent?.name ?? \"-\").padEnd(agentWidth),\n (bot.isConnected ? \"yes\" : \"no\").padEnd(9),\n statusLabel(bot),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadTelegramFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Telegram file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `telegram-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Telegram file by id using the bot token\")\n .argument(\"<file-id>\", \"Telegram file id from a [Telegram file] block\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/telegram-<file-id>)\",\n )\n .requiredOption(\n \"--bot-id <bot-id>\",\n \"Telegram bot id from the [Telegram file] block\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789\n Download to explicit path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789 -o /tmp/photo.jpg\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/telegram-AgACAgUAAxkBAA\",\"mimetype\":\"image/jpeg\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(\n async (fileId: string, options: { out?: string; botId: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadTelegramFile(\n fileId,\n options.botId,\n outPath,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroTelegramMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Telegram messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendTelegramMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nfunction parsePositiveInteger(value: string, flag: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Telegram chat as the bot\")\n .requiredOption(\"--bot-id <id>\", \"Telegram bot ID\")\n .requiredOption(\"-c, --chat-id <id>\", \"Telegram chat ID\")\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--reply-to-message-id <id>\", \"Message ID to reply to\")\n .option(\"--message-thread-id <id>\", \"Telegram forum topic thread ID\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero telegram message send --bot-id 123456789 -c -1001234567890 -t \"Hello!\"\n Reply to message: zero telegram message send --bot-id 123456789 -c -1001234567890 --reply-to-message-id 42 -t \"reply\"\n Forum topic message: zero telegram message send --bot-id 123456789 -c -1001234567890 --message-thread-id 7 -t \"topic update\"\n\nNotes:\n - Message text can be provided with --text or piped on stdin\n - Choose an explicit --bot-id. Run \"zero telegram bot list\" to inspect available bots.`,\n )\n .action(\n withErrorHandler(\n async (options: {\n botId: string;\n chatId: string;\n text?: string;\n replyToMessageId?: string;\n messageThreadId?: string;\n }) => {\n let text = options.text;\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"Either --text or piped stdin must be provided\", {\n cause: new Error(\n 'Usage: zero telegram message send --bot-id BOT_ID -c CHAT_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendTelegramMessage({\n botId: options.botId,\n chatId: options.chatId,\n text,\n replyToMessageId: options.replyToMessageId\n ? parsePositiveInteger(\n options.replyToMessageId,\n \"reply-to-message-id\",\n )\n : undefined,\n messageThreadId: options.messageThreadId\n ? parsePositiveInteger(options.messageThreadId, \"message-thread-id\")\n : undefined,\n });\n\n console.log(\n chalk.green(`✓ Message sent (message_id: ${result.messageId})`),\n );\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completeTelegramFileUpload,\n initTelegramFileUpload,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nfunction parseMessageThreadId(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(\"message-thread-id must be a positive integer\");\n }\n return parsed;\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to a Telegram chat as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"--bot-id <bot-id>\", \"Telegram bot id to send through\")\n .requiredOption(\"-c, --chat-id <chat-id>\", \"Telegram chat id or @channel\")\n .option(\"--caption <text>\", \"Caption to accompany the file\")\n .option(\"--message-thread-id <id>\", \"Forum topic message thread id\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id 123456789 -c -1001234567890\n Upload to a topic: zero telegram upload-file -f /tmp/log.txt --bot-id 123456789 -c -1001234567890 --message-thread-id 42\n With a caption: zero telegram upload-file -f /tmp/data.csv --bot-id 123456789 -c @channel --caption \"Daily report\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"messageId\":123,\"chatId\":\"-1001234567890\",\"fileId\":\"...\",\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Uploads through VM0 storage first, then asks Telegram to fetch the file URL\n - VM0 does not apply file type or size restrictions before calling Telegram`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n botId: string;\n chatId: string;\n caption?: string;\n messageThreadId?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n const messageThreadId = parseMessageThreadId(options.messageThreadId);\n\n const prepared = await initTelegramFileUpload({\n filename,\n contentType,\n length: fileSize,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": prepared.contentType },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeTelegramFileUpload({\n uploadId: prepared.uploadId,\n botId: options.botId,\n chatId: options.chatId,\n contentType: prepared.contentType,\n caption: options.caption,\n messageThreadId,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Read or write non-sensitive configuration values\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroVariables } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No variables found\"));\n console.log();\n console.log(\"To add a variable:\");\n console.log(chalk.cyan(\" zero variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroVariable } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a variable\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroVariable } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete a variable\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroVariable(name);\n console.log(chalk.green(`✓ Variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getApiUrl,\n getActiveOrg,\n getToken,\n decodeZeroTokenPayload,\n} from \"../../lib/api/config\";\nimport {\n listZeroConnectors,\n getZeroAgent,\n getZeroAgentUserConnectors,\n} from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type { FirewallPolicies } from \"@vm0/connectors/firewall-types\";\nimport { policyIcon } from \"../../lib/utils/format-utils\";\n\n/**\n * Detect if running inside a zero sandbox (agent runtime).\n * Uses ZERO_AGENT_ID (not VM0_RUN_ID) because the zero CLI operates in the\n * zero agent context where ZERO_AGENT_ID is the canonical sandbox indicator.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.ZERO_AGENT_ID;\n}\n\nfunction formatConnectorIdentity(connector: {\n externalUsername: string | null;\n externalEmail: string | null;\n needsReconnect: boolean;\n}): string {\n let identity = \"\";\n if (connector.externalUsername && connector.externalEmail) {\n identity = `@${connector.externalUsername} (${connector.externalEmail})`;\n } else if (connector.externalUsername) {\n identity = `@${connector.externalUsername}`;\n } else if (connector.externalEmail) {\n identity = connector.externalEmail;\n }\n if (connector.needsReconnect) {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nfunction printConnectorPermissions(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): void {\n if (!isFirewallConnectorType(type)) return;\n\n const refPolicy = resolvedPolicies?.[type];\n if (!refPolicy) {\n console.log(chalk.dim(\" full access — no permission rules configured\"));\n return;\n }\n\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n\n if (\n permissions.length === 0 &&\n Object.keys(refPolicy.policies).length === 0\n ) {\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(` ${unknownIcon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of permissions) {\n const policy = refPolicy.policies[perm.name] ?? \"deny\";\n const icon = policyIcon(policy);\n const desc = perm.description ?? \"\";\n console.log(` ${icon} ${perm.name.padEnd(nameWidth)} ${desc}`);\n }\n\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nasync function showSandboxInfo(showPermissions: boolean): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const payload = decodeZeroTokenPayload();\n\n console.log(`Agent ID: ${agentId}`);\n console.log(`Run ID: ${payload?.runId ?? chalk.dim(\"unavailable\")}`);\n console.log(`Org ID: ${payload?.orgId ?? chalk.dim(\"unavailable\")}`);\n\n // Capabilities section\n if (payload?.capabilities?.length) {\n console.log();\n console.log(chalk.bold(\"Capabilities:\"));\n console.log(` ${payload.capabilities.join(\", \")}`);\n }\n\n // Connected Services section\n try {\n if (showPermissions) {\n // Full mode: fetch all 3 APIs for permission details\n const [connectorsResult, agentResult, enabledResult] =\n await Promise.allSettled([\n listZeroConnectors(),\n getZeroAgent(agentId!),\n getZeroAgentUserConnectors(agentId!),\n ]);\n\n if (connectorsResult.status === \"rejected\") return;\n\n const identities = connectorsResult.value.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n let resolvedPolicies: FirewallPolicies | null = null;\n const permissionDataAvailable =\n agentResult.status === \"fulfilled\" &&\n enabledResult.status === \"fulfilled\";\n if (permissionDataAvailable) {\n resolvedPolicies = resolveFirewallPolicies(\n agentResult.value.permissionPolicies,\n enabledResult.value,\n );\n }\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n\n if (permissionDataAvailable) {\n printConnectorPermissions(connector.type, resolvedPolicies);\n }\n }\n } else {\n // Default mode: only fetch connector identities (1 API call)\n const connectors = await listZeroConnectors();\n const identities = connectors.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n }\n }\n } catch {\n // Silently skip — connector info is supplementary\n }\n}\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.ZERO_TOKEN\n ? \"ZERO_TOKEN env var\"\n : 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 zeroWhoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show agent identity, run ID, and capabilities\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero whoami\n zero whoami --permissions\n\nNotes:\n - Inside sandbox: shows agent ID, run ID, org ID, and granted capabilities\n - Use --permissions to see detailed permission breakdown per connector\n - Your agent ID is also available as $ZERO_AGENT_ID`,\n )\n .action(\n withErrorHandler(async (options: { permissions?: boolean }) => {\n if (isInsideSandbox()) {\n await showSandboxInfo(options.permissions ?? false);\n } else {\n await showLocalInfo();\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { editCommand } from \"./edit\";\nimport { viewCommand } from \"./view\";\nimport { listCommand } from \"./list\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSkillCommand = new Command(\"skill\")\n .description(\"Manage custom skills\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create from directory: zero skill create my-skill --dir ./skills/my-skill/\n List all skills: zero skill list\n View skill content: zero skill view my-skill\n Update skill content: zero skill edit my-skill --dir ./skills/my-skill/\n Delete a skill: zero skill delete my-skill -y\n\nSkill Binding:\n Bind to agent: zero agent edit <id> --add-skill my-skill\n Unbind from agent: zero agent edit <id> --remove-skill my-skill\n Replace all skills: zero agent edit <id> --skills a,b,c`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a custom skill in the organization\")\n .argument(\"<name>\", \"Skill name (lowercase alphanumeric with hyphens)\")\n .requiredOption(\"--dir <path>\", \"Path to directory containing SKILL.md\")\n .option(\"--display-name <name>\", \"Skill display name\")\n .option(\"--description <text>\", \"Skill description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill create my-skill --dir ./skills/my-skill/\n zero skill create my-skill --dir ./skills/my-skill/ --display-name \"My Skill\" --description \"Does things\"\n\nNotes:\n - The directory must contain a SKILL.md file\n - All files in the directory are uploaded (hidden files and node_modules excluded)\n - The skill is created in the organization but not bound to any agent\n - Use 'zero agent edit <id> --add-skill <name>' to bind a skill to an agent`,\n )\n .action(\n withErrorHandler(\n async (\n name: string,\n options: {\n dir: string;\n displayName?: string;\n description?: string;\n },\n ) => {\n const files = readSkillDirectory(options.dir);\n\n const skill = await createSkill({\n name,\n files,\n displayName: options.displayName,\n description: options.description,\n });\n\n console.log(chalk.green(`✓ Skill \"${skill.name}\" created`));\n console.log(` Name: ${skill.name}`);\n console.log(` Files: ${files.length} file(s)`);\n if (skill.displayName) {\n console.log(` Display Name: ${skill.displayName}`);\n }\n if (skill.description) {\n console.log(` Description: ${skill.description}`);\n }\n },\n ),\n );\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst IGNORED_NAMES = new Set([\"node_modules\", \".git\", \".DS_Store\"]);\n\n/**\n * Recursively read all files from a skill directory.\n *\n * Skips hidden files (starting with .), node_modules, and .git.\n * Throws if SKILL.md is not found at the root.\n */\nexport function readSkillDirectory(\n dirPath: string,\n): Array<{ path: string; content: string }> {\n const files: Array<{ path: string; content: string }> = [];\n\n function walk(dir: string, prefix: string) {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith(\".\") || IGNORED_NAMES.has(entry.name)) continue;\n\n const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n walk(join(dir, entry.name), relPath);\n } else {\n files.push({\n path: relPath,\n content: readFileSync(join(dir, entry.name), \"utf-8\"),\n });\n }\n }\n }\n\n walk(dirPath, \"\");\n\n if (\n !files.some((f) => {\n return f.path === \"SKILL.md\";\n })\n ) {\n throw new Error(`SKILL.md not found in ${dirPath}`);\n }\n\n return files;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { updateSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Update a custom skill's content\")\n .argument(\"<name>\", \"Skill name\")\n .requiredOption(\n \"--dir <path>\",\n \"Path to directory containing updated skill files\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill edit my-skill --dir ./skills/my-skill/`,\n )\n .action(\n withErrorHandler(async (name: string, options: { dir: string }) => {\n const files = readSkillDirectory(options.dir);\n await updateSkill(name, { files });\n\n console.log(\n chalk.green(`✓ Skill \"${name}\" updated (${files.length} file(s))`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a custom skill\")\n .argument(\"<name>\", \"Skill name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill view my-skill`,\n )\n .action(\n withErrorHandler(async (name: string) => {\n const skill = await getSkill(name);\n\n console.log(chalk.bold(skill.name));\n if (skill.displayName) console.log(chalk.dim(skill.displayName));\n console.log();\n console.log(`Name: ${skill.name}`);\n if (skill.displayName) console.log(`Display Name: ${skill.displayName}`);\n if (skill.description) console.log(`Description: ${skill.description}`);\n\n if (skill.files && skill.files.length > 0) {\n console.log();\n console.log(chalk.dim(\"── Files ──\"));\n for (const f of skill.files) {\n console.log(` ${f.path} (${f.size} bytes)`);\n }\n }\n\n console.log();\n if (skill.content) {\n console.log(chalk.dim(\"── SKILL.md ──\"));\n console.log(skill.content);\n } else {\n console.log(chalk.dim(\"No content\"));\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listSkills } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List custom skills in the organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill list`,\n )\n .action(\n withErrorHandler(async () => {\n const skills = await listSkills();\n\n if (skills.length === 0) {\n console.log(chalk.dim(\"No custom skills found\"));\n console.log(\n chalk.dim(\" Create one with: zero skill create <name> --dir <path>\"),\n );\n return;\n }\n\n const nameWidth = Math.max(\n 4,\n ...skills.map((s) => {\n return s.name.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...skills.map((s) => {\n return (s.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n \"DESCRIPTION\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const skill of skills) {\n const row = [\n skill.name.padEnd(nameWidth),\n (skill.displayName ?? \"-\").padEnd(displayWidth),\n skill.description ?? \"-\",\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill, deleteSkill } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a custom skill from the organization\")\n .argument(\"<name>\", \"Skill name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill delete my-skill\n zero skill delete my-skill -y\n\nNotes:\n - This removes the skill from the organization and unbinds it from all agents\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n await getSkill(name);\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete skill '${name}'? This will unbind it from all agents.`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteSkill(name);\n console.log(chalk.green(`✓ Skill \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { paginate } from \"../../../lib/utils/paginate\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\n\nconst PAGE_LIMIT = 100;\n\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n framework: string,\n): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData, framework);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\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 firstResponse = await getZeroRunAgentEvents(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n let allEvents: RunEvent[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.events.length >= options.targetCount)\n ) {\n allEvents =\n options.targetCount === \"all\"\n ? firstResponse.events\n : firstResponse.events.slice(0, options.targetCount);\n } else {\n const lastEvent = firstResponse.events[firstResponse.events.length - 1];\n const firstPageTimestamp = lastEvent\n ? new Date(lastEvent.createdAt).getTime()\n : undefined;\n\n const remainingEvents = await paginate<RunEvent>({\n fetchPage: async (since) => {\n const response = await getZeroRunAgentEvents(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.events, hasMore: response.hasMore };\n },\n getTimestamp: (event) => {\n return new Date(event.createdAt).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.events.length,\n initialSince: firstPageTimestamp,\n });\n\n allEvents = [...firstResponse.events, ...remainingEvents];\n\n if (\n options.targetCount !== \"all\" &&\n allEvents.length > options.targetCount\n ) {\n allEvents = allEvents.slice(0, options.targetCount);\n }\n }\n\n const events =\n options.order === \"desc\" ? [...allEvents].reverse() : allEvents;\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n const framework = firstResponse.framework;\n\n for (const event of events) {\n renderAgentEvent(event, renderer, framework);\n }\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) {\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 = Math.max(1, parseInt(options.head!, 10));\n } else if (isTail) {\n targetCount = Math.max(1, parseInt(options.tail!, 10));\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 { withErrorHandler } from \"../../../lib/command\";\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 new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <name>\", \"Filter by agent name\")\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 my-agent\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 = options.limit ? parseInt(options.limit, 10) : undefined;\n const since = options.since ? parseTime(options.since) : undefined;\n\n const result = await listZeroLogs({\n agent: 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","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchZeroLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface LogsSearchCliOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${runId} (${agentName}, ${time}) ──────────`;\n}\n\nfunction parseContextOptions(options: LogsSearchCliOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nfunction renderResults(response: LogsSearchResponse): void {\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log();\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport async function runLogsSearch(\n keyword: string,\n options: LogsSearchCliOptions,\n): Promise<void> {\n const { before, after } = parseContextOptions(options);\n\n if (options.run && !isUUID(options.run)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${options.run}\" — 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 since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchZeroLogs({\n keyword,\n agent: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs search \"error\"\n zero logs search \"timeout\" --agent my-agent -C 2\n zero logs search \"failed\" --since 30d --limit 50`,\n )\n .action(\n withErrorHandler(async (keyword: string, options: LogsSearchCliOptions) => {\n await runLogsSearch(keyword, options);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero doctor check-connector --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agent: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agent: options.agent,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(query, options);\n return;\n case \"chat\":\n await runChatSource(query, options);\n return;\n case \"slack\":\n await runSlackSource(query, options);\n return;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n requestDeveloperSupportConsent,\n submitDeveloperSupport,\n} from \"../../lib/api\";\n\nexport const zeroDeveloperSupportCommand = new Command()\n .name(\"developer-support\")\n .description(\"Submit a diagnostic report to the dev team\")\n .requiredOption(\"--title <text>\", \"Issue title\")\n .requiredOption(\"--description <text>\", \"Diagnostic description\")\n .option(\"--consent-code <code>\", \"User-provided verification code\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Step 1 — Get consent code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\"\n\n Step 2 — Submit with code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\" --consent-code A7X3\n\nNotes:\n - The consent code must be provided by the user to confirm sharing their conversation\n - The dev team will receive a diagnostic bundle with conversation, environment, and connector info`,\n )\n .action(\n withErrorHandler(\n async (options: {\n title: string;\n description: string;\n consentCode?: string;\n }) => {\n if (!options.consentCode) {\n const { consentCode } = await requestDeveloperSupportConsent({\n title: options.title,\n description: options.description,\n });\n console.log(\n \"Consent required to share chat history with developers.\",\n );\n console.log(`Code: ${consentCode}`);\n console.log(\"Ask the user to confirm by providing this code.\");\n } else {\n const { reference } = await submitDeveloperSupport({\n title: options.title,\n description: options.description,\n consentCode: options.consentCode,\n });\n console.log(\"Developer support request submitted successfully.\");\n console.log(`Reference: ${reference}`);\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { hostStartCommand, hostStopCommand } from \"./host\";\nimport {\n clientScreenshotCommand,\n clientZoomCommand,\n clientInfoCommand,\n clientLeftClickCommand,\n clientRightClickCommand,\n clientMiddleClickCommand,\n clientDoubleClickCommand,\n clientTripleClickCommand,\n clientLeftClickDragCommand,\n clientLeftMouseDownCommand,\n clientLeftMouseUpCommand,\n clientScrollCommand,\n clientReadClipboardCommand,\n clientWriteClipboardCommand,\n clientKeyCommand,\n clientHoldKeyCommand,\n clientTypeCommand,\n clientOpenAppCommand,\n clientMouseMoveCommand,\n clientCursorPositionCommand,\n} from \"./client\";\n\nconst hostCommand = new Command()\n .name(\"host\")\n .description(\"Manage computer-use host daemon\")\n .addCommand(hostStartCommand)\n .addCommand(hostStopCommand);\n\nconst clientCommand = new Command()\n .name(\"client\")\n .description(\"Interact with remote computer-use host\")\n .addCommand(clientScreenshotCommand)\n .addCommand(clientZoomCommand)\n .addCommand(clientInfoCommand)\n .addCommand(clientLeftClickCommand)\n .addCommand(clientRightClickCommand)\n .addCommand(clientMiddleClickCommand)\n .addCommand(clientDoubleClickCommand)\n .addCommand(clientTripleClickCommand)\n .addCommand(clientLeftClickDragCommand)\n .addCommand(clientLeftMouseDownCommand)\n .addCommand(clientLeftMouseUpCommand)\n .addCommand(clientScrollCommand)\n .addCommand(clientReadClipboardCommand)\n .addCommand(clientWriteClipboardCommand)\n .addCommand(clientKeyCommand)\n .addCommand(clientHoldKeyCommand)\n .addCommand(clientTypeCommand)\n .addCommand(clientOpenAppCommand)\n .addCommand(clientMouseMoveCommand)\n .addCommand(clientCursorPositionCommand);\n\nclientCommand.addHelpText(\n \"after\",\n `\nCoordinate System:\n All coordinates use macOS logical points, not physical pixels.\n On Retina displays, logical size = physical size / scaleFactor.\n Run \"info\" to check your screen's logical dimensions.\n\nExamples:\n zero computer-use client screenshot\n zero computer-use client zoom --x 0 --y 0 --width 500 --height 500\n zero computer-use client info\n zero computer-use client left-click 500 300\n zero computer-use client scroll 500 300 down 5\n zero computer-use client key \"cmd+c\"`,\n);\n\nexport const zeroComputerUseCommand = new Command()\n .name(\"computer-use\")\n .description(\"Remote desktop control for cloud agents\")\n .addCommand(hostCommand)\n .addCommand(clientCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport {\n registerComputerUseHost,\n unregisterComputerUseHost,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport {\n getRandomPort,\n startDesktopServer,\n} from \"../../../lib/computer-use/desktop-server\";\nimport { isCliclickInstalled } from \"../../../lib/computer-use/cliclick\";\nimport {\n startDesktopTunnel,\n stopDesktopTunnel,\n} from \"../../../lib/computer-use/ngrok\";\n\nexport const hostStartCommand = new Command()\n .name(\"start\")\n .description(\"Start the computer-use host daemon (macOS only)\")\n .action(\n withErrorHandler(async () => {\n if (process.platform !== \"darwin\") {\n throw new Error(\n \"Computer-use host requires macOS\\n\\n\" +\n \"The host daemon uses macOS-specific commands (screencapture, system_profiler).\",\n );\n }\n\n if (!(await isCliclickInstalled())) {\n console.log(\n chalk.yellow(\n \"⚠ cliclick not found. Mouse and keyboard operations will not be available.\\n\" +\n \" Install with: brew install cliclick\",\n ),\n );\n console.log();\n }\n\n console.log(chalk.cyan(\"Registering computer-use host...\"));\n const credentials = await registerComputerUseHost();\n\n const port = await getRandomPort();\n const server = await startDesktopServer(credentials.token, port);\n\n try {\n await startDesktopTunnel(\n credentials.ngrokToken,\n credentials.endpointPrefix,\n port,\n );\n\n console.log();\n console.log(chalk.green(\"✓ Computer-use host active\"));\n console.log(` Desktop: desktop.${credentials.domain}`);\n console.log();\n console.log(chalk.dim(\"Press ^C twice to disconnect\"));\n console.log();\n\n let sigintCount = 0;\n await new Promise<void>((resolve) => {\n const keepAlive = setInterval(() => {}, 60_000);\n const done = () => {\n clearInterval(keepAlive);\n process.removeListener(\"SIGINT\", onSigint);\n resolve();\n };\n const onSigint = () => {\n sigintCount++;\n if (sigintCount === 1) {\n console.log(\n chalk.dim(\"\\nPress ^C again to disconnect and exit...\"),\n );\n } else {\n done();\n }\n };\n process.on(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", done);\n });\n } finally {\n console.log();\n console.log(chalk.cyan(\"Stopping computer-use host...\"));\n server.close();\n await stopDesktopTunnel();\n await unregisterComputerUseHost().catch(() => {});\n console.log(chalk.green(\"✓ Host stopped\"));\n }\n }),\n );\n\nexport const hostStopCommand = new Command()\n .name(\"stop\")\n .description(\"Stop and unregister the computer-use host\")\n .action(\n withErrorHandler(async () => {\n console.log(chalk.cyan(\"Unregistering computer-use host...\"));\n try {\n await unregisterComputerUseHost();\n console.log(chalk.green(\"✓ Host unregistered\"));\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n console.log(chalk.yellow(\"No active host registration found\"));\n return;\n }\n throw error;\n }\n }),\n );\n","import {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"http\";\nimport { createServer as createNetServer } from \"net\";\nimport type { AddressInfo } from \"net\";\nimport {\n captureScreenshot,\n captureRegionScreenshot,\n getScreenInfo,\n} from \"./screencapture\";\nimport {\n leftClickDrag,\n leftMouseDown,\n leftMouseUp,\n executeMouseAction,\n getCursorPosition,\n VALID_ACTIONS,\n pressKey,\n holdKey,\n typeText,\n} from \"./cliclick\";\nimport type { MouseAction } from \"./cliclick\";\nimport { scroll, type ScrollDirection } from \"./scroll\";\nimport { readClipboard, writeClipboard } from \"./clipboard\";\nimport { openApplication } from \"./application\";\n\n/**\n * Read the full request body as a string.\n */\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString());\n });\n req.on(\"error\", reject);\n });\n}\n\ninterface MouseDragBody {\n action: \"left_click_drag\";\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\ninterface MouseDownBody {\n action: \"left_mouse_down\";\n x: number;\n y: number;\n}\n\ninterface MouseUpBody {\n action: \"left_mouse_up\";\n x: number;\n y: number;\n}\n\ninterface MouseScrollBody {\n action: \"scroll\";\n x: number;\n y: number;\n direction: ScrollDirection;\n amount?: number;\n}\n\ntype MouseRequestBody =\n | MouseDragBody\n | MouseDownBody\n | MouseUpBody\n | MouseScrollBody;\n\nasync function handleZoom(\n searchParams: URLSearchParams,\n res: ServerResponse,\n): Promise<void> {\n const x = Number(searchParams.get(\"x\"));\n const y = Number(searchParams.get(\"y\"));\n const width = Number(searchParams.get(\"width\"));\n const height = Number(searchParams.get(\"height\"));\n\n if (\n [x, y, width, height].some((v) => {\n return !Number.isFinite(v);\n })\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n \"Missing or invalid query parameters: x, y, width, height are required numbers\",\n );\n return;\n }\n if (width <= 0 || height <= 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"width and height must be positive\");\n return;\n }\n if (x < 0 || y < 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"x and y must be non-negative\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x + width > info.width || y + height > info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(`Region exceeds screen bounds (${info.width}x${info.height})`);\n return;\n }\n\n const result = await captureRegionScreenshot({ x, y, width, height });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n}\n\nfunction parseJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > 1024) {\n reject(new Error(\"Request body too large\"));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString()));\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nasync function handleMouseRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const body = await parseJsonBody(req);\n if (typeof body !== \"object\" || body === null || !(\"action\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { action } = body as { action: unknown };\n\n if (typeof action !== \"string\") {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Invalid action\");\n return;\n }\n\n // Click actions with validation\n if (VALID_ACTIONS.has(action)) {\n if (!(\"x\" in body) || !(\"y\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { x, y } = body as { x: unknown; y: unknown };\n\n if (\n typeof x !== \"number\" ||\n typeof y !== \"number\" ||\n !Number.isFinite(x) ||\n !Number.isFinite(y)\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Coordinates x and y must be finite numbers\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x < 0 || x >= info.width || y < 0 || y >= info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Coordinates out of bounds. Screen size: ${info.width}x${info.height} (points)`,\n );\n return;\n }\n\n await executeMouseAction(action as MouseAction, x, y);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // Drag, mouse-down, mouse-up, scroll actions\n const typedBody = body as MouseRequestBody;\n switch (typedBody.action) {\n case \"left_click_drag\":\n await leftClickDrag(\n typedBody.startX,\n typedBody.startY,\n typedBody.endX,\n typedBody.endY,\n );\n break;\n case \"left_mouse_down\":\n await leftMouseDown(typedBody.x, typedBody.y);\n break;\n case \"left_mouse_up\":\n await leftMouseUp(typedBody.x, typedBody.y);\n break;\n case \"scroll\":\n await scroll(\n typedBody.x,\n typedBody.y,\n typedBody.direction,\n typedBody.amount,\n );\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown mouse action: ${(body as unknown as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\ninterface KeyPressBody {\n action: \"key\";\n keys: string;\n}\n\ninterface HoldKeyBody {\n action: \"hold_key\";\n keys: string;\n durationMs: number;\n}\n\ninterface TypeTextBody {\n action: \"type\";\n text: string;\n}\n\ntype KeyboardRequestBody = KeyPressBody | HoldKeyBody | TypeTextBody;\n\nasync function handleKeyboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as KeyboardRequestBody;\n\n switch (body.action) {\n case \"key\":\n await pressKey(body.keys);\n break;\n case \"hold_key\":\n if (\n typeof body.durationMs !== \"number\" ||\n !Number.isFinite(body.durationMs) ||\n body.durationMs <= 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"durationMs must be a positive number\");\n return;\n }\n await holdKey(body.keys, body.durationMs);\n break;\n case \"type\":\n if (typeof body.text !== \"string\" || body.text.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"text must be a non-empty string\");\n return;\n }\n await typeText(body.text);\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown keyboard action: ${(body as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\nasync function handleClipboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.method === \"GET\") {\n const text = await readClipboard();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ text }));\n } else if (req.method === \"POST\") {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { text: string };\n await writeClipboard(body.text);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n}\n\nasync function handleOpenApplication(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { nameOrBundleId: unknown };\n\n if (\n typeof body.nameOrBundleId !== \"string\" ||\n body.nameOrBundleId.length === 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"nameOrBundleId must be a non-empty string\");\n return;\n }\n\n await openApplication(body.nameOrBundleId);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\n/**\n * Allocate a random available port on localhost.\n */\nexport async function getRandomPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createNetServer();\n server.listen(0, \"127.0.0.1\", () => {\n const { port } = server.address() as AddressInfo;\n server.close(() => {\n resolve(port);\n });\n });\n server.on(\"error\", reject);\n });\n}\n\nasync function handleCursorPosition(res: ServerResponse): Promise<void> {\n const position = await getCursorPosition();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(position));\n}\n\nfunction routeKey(method: string, pathname: string): string {\n return `${method} ${pathname}`;\n}\n\nasync function handleRequest(\n token: string,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.headers[\"x-vm0-token\"] !== token) {\n res.writeHead(403, { \"Content-Type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const { pathname, searchParams } = url;\n const key = routeKey(req.method ?? \"GET\", pathname);\n\n try {\n switch (key) {\n case \"GET /screenshot\": {\n const result = await captureScreenshot();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n break;\n }\n case \"GET /info\": {\n const info = await getScreenInfo();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(info));\n break;\n }\n case \"GET /zoom\":\n await handleZoom(searchParams, res);\n break;\n case \"POST /mouse\":\n await handleMouseRequest(req, res);\n break;\n case \"GET /clipboard\":\n case \"POST /clipboard\":\n await handleClipboard(req, res);\n break;\n case \"POST /keyboard\":\n await handleKeyboard(req, res);\n break;\n case \"POST /open-application\":\n await handleOpenApplication(req, res);\n break;\n case \"GET /cursor-position\":\n await handleCursorPosition(res);\n break;\n default:\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Internal server error\";\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(message);\n }\n}\n\n/**\n * Start the desktop HTTP server.\n * Validates x-vm0-token on every request and serves /screenshot and /info endpoints.\n */\nexport function startDesktopServer(\n token: string,\n port: number,\n): Promise<Server> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n handleRequest(token, req, res).catch(() => {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Internal server error\");\n }\n });\n });\n\n server.on(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n resolve(server);\n });\n });\n}\n","import { execFile } from \"child_process\";\nimport { readFile, unlink } from \"fs/promises\";\nimport { randomUUID } from \"crypto\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface ScreenInfo {\n width: number;\n height: number;\n scaleFactor: number;\n}\n\ninterface ScreenshotResult extends ScreenInfo {\n image: string;\n format: string;\n}\n\ninterface RegionParams {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Capture a screenshot on macOS using the screencapture command.\n * Returns the image as a base64 string at logical resolution along with screen metadata.\n */\nexport async function captureScreenshot(): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-screenshot-${randomUUID()}.jpg`);\n\n try {\n await execFileAsync(\"screencapture\", [\"-x\", \"-t\", \"jpg\", tmpPath]);\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(info.height),\n String(info.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: info.width,\n height: info.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\n/**\n * Capture a screenshot of a specific screen region on macOS.\n * Uses screencapture -R x,y,w,h to crop to the given rectangle (logical coordinates).\n * Returns the image at logical resolution to match the coordinate space.\n */\nexport async function captureRegionScreenshot(\n region: RegionParams,\n): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-zoom-${randomUUID()}.jpg`);\n\n try {\n const regionArg = `${region.x},${region.y},${region.width},${region.height}`;\n await execFileAsync(\"screencapture\", [\n \"-x\",\n \"-t\",\n \"jpg\",\n \"-R\",\n regionArg,\n tmpPath,\n ]);\n\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(region.height),\n String(region.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: region.width,\n height: region.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\ninterface DisplayResolution {\n _spdisplays_pixels?: string;\n _spdisplays_resolution?: string;\n spdisplays_resolution?: string;\n}\n\ninterface DisplayData {\n spdisplays_ndrvs?: DisplayResolution[];\n}\n\n/**\n * Get screen logical resolution and scale factor on macOS using system_profiler.\n * Returns logical (point) dimensions that match the coordinate space used by all operations.\n */\nexport async function getScreenInfo(): Promise<ScreenInfo> {\n const { stdout } = await execFileAsync(\"system_profiler\", [\n \"SPDisplaysDataType\",\n \"-json\",\n ]);\n\n const data = JSON.parse(stdout) as { SPDisplaysDataType?: DisplayData[] };\n const displays = data.SPDisplaysDataType ?? [];\n\n for (const gpu of displays) {\n const screens = gpu.spdisplays_ndrvs ?? [];\n for (const screen of screens) {\n const pixelStr = screen._spdisplays_pixels;\n if (pixelStr) {\n const pixelMatch = pixelStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n if (pixelMatch?.[1] && pixelMatch[2]) {\n const physicalWidth = parseInt(pixelMatch[1], 10);\n const physicalHeight = parseInt(pixelMatch[2], 10);\n\n const resStr =\n screen._spdisplays_resolution ?? screen.spdisplays_resolution ?? \"\";\n const resMatch = resStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n\n let scaleFactor: number;\n let logicalWidth: number;\n let logicalHeight: number;\n\n if (resMatch?.[1] && resMatch[2]) {\n logicalWidth = parseInt(resMatch[1], 10);\n logicalHeight = parseInt(resMatch[2], 10);\n scaleFactor = Math.round(physicalWidth / logicalWidth);\n } else {\n const isRetina = /retina/i.test(resStr);\n scaleFactor = isRetina ? 2 : 1;\n logicalWidth = Math.floor(physicalWidth / scaleFactor);\n logicalHeight = Math.floor(physicalHeight / scaleFactor);\n }\n\n return {\n width: logicalWidth,\n height: logicalHeight,\n scaleFactor,\n };\n }\n }\n }\n }\n\n return { width: 1920, height: 1080, scaleFactor: 1 };\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { setTimeout as sleep } from \"timers/promises\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Drag from (startX, startY) to (endX, endY) using cliclick.\n * Sends dd (drag down) at start, then du (drag up) at end.\n */\nexport async function leftClickDrag(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n): Promise<void> {\n await execFileAsync(\"cliclick\", [\n `dd:${startX},${startY}`,\n `du:${endX},${endY}`,\n ]);\n}\n\n/**\n * Press and hold the left mouse button at (x, y).\n */\nexport async function leftMouseDown(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`dd:${x},${y}`]);\n}\n\n/**\n * Release the left mouse button at (x, y).\n */\nexport async function leftMouseUp(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`du:${x},${y}`]);\n}\n\nexport type MouseAction =\n | \"left_click\"\n | \"right_click\"\n | \"middle_click\"\n | \"double_click\"\n | \"triple_click\"\n | \"move\";\n\nconst ACTION_COMMANDS: Record<MouseAction, string> = {\n left_click: \"c\",\n right_click: \"rc\",\n middle_click: \"mc\",\n double_click: \"dc\",\n triple_click: \"tc\",\n move: \"m\",\n};\n\nexport const VALID_ACTIONS = new Set<string>(Object.keys(ACTION_COMMANDS));\n\n/**\n * Check whether cliclick is available on the system.\n * Returns true if installed, false otherwise.\n */\nexport async function isCliclickInstalled(): Promise<boolean> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that cliclick is installed on the system.\n * Throws with install instructions if not found.\n */\nasync function checkCliclickInstalled(): Promise<void> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n } catch {\n throw new Error(\"cliclick not found. Install with: brew install cliclick\");\n }\n}\n\n/**\n * Execute a mouse action at the given coordinates using cliclick.\n */\nexport async function executeMouseAction(\n action: MouseAction,\n x: number,\n y: number,\n): Promise<void> {\n await checkCliclickInstalled();\n const prefix = ACTION_COMMANDS[action];\n await execFileAsync(\"cliclick\", [`${prefix}:${x},${y}`]);\n}\n\n/**\n * Get the current cursor position using cliclick.\n * Returns coordinates in points.\n */\nexport async function getCursorPosition(): Promise<{\n x: number;\n y: number;\n}> {\n await checkCliclickInstalled();\n const { stdout } = await execFileAsync(\"cliclick\", [\"p\"]);\n const parts = stdout.trim().split(\",\");\n const xStr = parts[0];\n const yStr = parts[1];\n if (parts.length !== 2 || xStr === undefined || yStr === undefined) {\n throw new Error(`Unexpected cliclick output: ${stdout.trim()}`);\n }\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(`Failed to parse cursor position: ${stdout.trim()}`);\n }\n return { x, y };\n}\n\nconst VALID_SPECIAL_KEYS = new Set([\n \"cmd\",\n \"ctrl\",\n \"alt\",\n \"shift\",\n \"fn\",\n \"arrow-up\",\n \"arrow-down\",\n \"arrow-left\",\n \"arrow-right\",\n \"tab\",\n \"esc\",\n \"space\",\n \"delete\",\n \"return\",\n \"enter\",\n \"home\",\n \"end\",\n \"page-up\",\n \"page-down\",\n ...Array.from({ length: 19 }, (_, i) => {\n return `f${i + 1}`;\n }),\n]);\n\nfunction isValidKeyName(key: string): boolean {\n return VALID_SPECIAL_KEYS.has(key) || key.length === 1;\n}\n\nfunction parseKeyCombo(keys: string): {\n modifiers: string[];\n mainKey: string;\n} {\n const parts = keys.split(\"+\");\n if (\n parts.length === 0 ||\n parts.some((p) => {\n return p === \"\";\n })\n ) {\n throw new Error(`Invalid key combo: \"${keys}\"`);\n }\n\n const mainKey = parts[parts.length - 1]!;\n const modifiers = parts.slice(0, -1);\n\n for (const key of parts) {\n if (!isValidKeyName(key)) {\n throw new Error(\n `Unknown key: \"${key}\". Valid keys: single characters, or special keys like cmd, ctrl, alt, shift, tab, esc, return, arrow-up, f1-f19, etc.`,\n );\n }\n }\n\n return { modifiers, mainKey };\n}\n\n/**\n * Build the cliclick command to press or type a key.\n * Special keys (return, tab, arrow-up, etc.) use `kp:`, regular characters use `t:`.\n */\nfunction keyAction(key: string): string {\n return VALID_SPECIAL_KEYS.has(key) ? `kp:${key}` : `t:${key}`;\n}\n\n/**\n * Press a key combination using cliclick.\n * Accepts combo strings like \"cmd+c\", \"ctrl+shift+s\", or single keys like \"return\".\n */\nexport async function pressKey(keys: string): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n\n if (modifiers.length === 0) {\n await execFileAsync(\"cliclick\", [keyAction(mainKey)]);\n return;\n }\n\n const args: string[] = [];\n for (const mod of modifiers) {\n args.push(`kd:${mod}`);\n }\n args.push(keyAction(mainKey));\n for (let i = modifiers.length - 1; i >= 0; i--) {\n args.push(`ku:${modifiers[i]}`);\n }\n await execFileAsync(\"cliclick\", args);\n}\n\n/**\n * Hold key(s) down for a specified duration then release.\n * Accepts combo strings like \"shift\" or \"cmd+shift\".\n */\nexport async function holdKey(keys: string, durationMs: number): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n const allKeys = [...modifiers, mainKey];\n\n const downArgs = allKeys.map((k) => {\n return `kd:${k}`;\n });\n const upArgs = [...allKeys].reverse().map((k) => {\n return `ku:${k}`;\n });\n\n await execFileAsync(\"cliclick\", downArgs);\n await sleep(durationMs);\n await execFileAsync(\"cliclick\", upArgs);\n}\n\n/**\n * Type text at the current cursor position using cliclick.\n */\nexport async function typeText(text: string): Promise<void> {\n await execFileAsync(\"cliclick\", [`t:${text}`]);\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nconst DEFAULT_SCROLL_AMOUNT = 3;\n\n/**\n * Scroll at the given screen position using cliclick (mouse move) + osascript (CGEvent scroll).\n *\n * cliclick handles cursor positioning; osascript with CoreGraphics CGEvent API\n * handles the scroll wheel event (cliclick has no native scroll support).\n */\nexport async function scroll(\n x: number,\n y: number,\n direction: ScrollDirection,\n amount: number = DEFAULT_SCROLL_AMOUNT,\n): Promise<void> {\n // Move cursor to target position\n await execFileAsync(\"cliclick\", [`m:${x},${y}`]);\n\n // CGEvent scroll: positive dy = scroll up, negative dy = scroll down\n // Second wheel axis: positive dx = scroll left, negative dx = scroll right\n let dy = 0;\n let dx = 0;\n switch (direction) {\n case \"up\":\n dy = amount;\n break;\n case \"down\":\n dy = -amount;\n break;\n case \"left\":\n dx = amount;\n break;\n case \"right\":\n dx = -amount;\n break;\n }\n\n const script = [\n \"ObjC.import('CoreGraphics');\",\n `var e = $.CGEventCreateScrollWheelEvent(null, 0, 2, ${dy}, ${dx});`,\n \"$.CGEventPost($.kCGHIDEventTap, e);\",\n ].join(\" \");\n\n await execFileAsync(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", script]);\n}\n","import { execFile, spawn } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Read text content from the macOS clipboard using pbpaste.\n */\nexport async function readClipboard(): Promise<string> {\n const { stdout } = await execFileAsync(\"pbpaste\");\n return stdout;\n}\n\n/**\n * Write text content to the macOS clipboard using pbcopy.\n */\nexport async function writeClipboard(text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(\"pbcopy\", { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`pbcopy exited with code ${code}`));\n }\n });\n proc.stdin.end(text);\n });\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Open or activate a macOS application by name or bundle ID.\n * Detects bundle IDs by the presence of dots (e.g., com.apple.Safari).\n */\nexport async function openApplication(nameOrBundleId: string): Promise<void> {\n const isBundleId = nameOrBundleId.includes(\".\");\n const flag = isBundleId ? \"-b\" : \"-a\";\n await execFileAsync(\"open\", [flag, nameOrBundleId]);\n}\n","// Dynamic import is intentional: @ngrok/ngrok contains native binaries that\n// crash on systems with GLIBC version mismatches. Lazy-loading ensures the\n// crash only affects the command that needs ngrok, not the entire CLI.\n// See: https://github.com/vm0-ai/vm0/issues/6825\nasync function loadNgrok(): Promise<typeof import(\"@ngrok/ngrok\")> {\n try {\n const mod = await import(\"@ngrok/ngrok\");\n return mod.default;\n } catch (cause) {\n throw new Error(\n \"Failed to load ngrok tunnel module. \" +\n \"This may be caused by a system library (GLIBC) incompatibility. \" +\n \"See: https://github.com/vm0-ai/vm0/issues/6825\",\n { cause },\n );\n }\n}\n\nexport async function startDesktopTunnel(\n ngrokToken: string,\n endpointPrefix: string,\n port: number,\n): Promise<void> {\n const ngrok = await loadNgrok();\n\n await ngrok.forward({\n addr: `localhost:${port}`,\n authtoken: ngrokToken,\n domain: `desktop.${endpointPrefix}.internal`,\n });\n}\n\nexport async function stopDesktopTunnel(): Promise<void> {\n const ngrok = await loadNgrok();\n await ngrok.kill();\n}\n","import { Command } from \"commander\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { callHost } from \"../../../lib/computer-use/client\";\n\nfunction mouseClickCommand(\n name: string,\n action: string,\n description: string,\n): Command {\n return new Command()\n .name(name)\n .description(description)\n .argument(\"<x>\", \"X coordinate (points)\")\n .argument(\"<y>\", \"Y coordinate (points)\")\n .action(\n withErrorHandler(async (xStr: string, yStr: string) => {\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(\"Coordinates must be integers\");\n }\n const response = await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action, x, y },\n });\n const data = await response.json();\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n}\n\nexport const clientScreenshotCommand = new Command()\n .name(\"screenshot\")\n .description(\"Capture a screenshot from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/screenshot\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `screenshot-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n // Path to stdout for programmatic consumption\n process.stdout.write(`${filePath}\\n`);\n\n // Metadata to stderr for human/debug consumption\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n }),\n );\n\nexport const clientZoomCommand = new Command()\n .name(\"zoom\")\n .description(\"Capture a region screenshot from the remote host\")\n .requiredOption(\"--x <number>\", \"X coordinate of the region\")\n .requiredOption(\"--y <number>\", \"Y coordinate of the region\")\n .requiredOption(\"--width <number>\", \"Width of the region\")\n .requiredOption(\"--height <number>\", \"Height of the region\")\n .action(\n withErrorHandler(\n async (opts: { x: string; y: string; width: string; height: string }) => {\n const params = new URLSearchParams({\n x: opts.x,\n y: opts.y,\n width: opts.width,\n height: opts.height,\n });\n const response = await callHost(`/zoom?${params.toString()}`);\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `zoom-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n process.stdout.write(`${filePath}\\n`);\n\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n },\n ),\n );\n\nexport const clientInfoCommand = new Command()\n .name(\"info\")\n .description(\"Get screen info from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/info\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n };\n\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n\nexport const clientLeftClickCommand = mouseClickCommand(\n \"left-click\",\n \"left_click\",\n \"Perform a left click at coordinates\",\n);\n\nexport const clientRightClickCommand = mouseClickCommand(\n \"right-click\",\n \"right_click\",\n \"Perform a right click at coordinates\",\n);\n\nexport const clientMiddleClickCommand = mouseClickCommand(\n \"middle-click\",\n \"middle_click\",\n \"Perform a middle click at coordinates\",\n);\n\nexport const clientDoubleClickCommand = mouseClickCommand(\n \"double-click\",\n \"double_click\",\n \"Perform a double click at coordinates\",\n);\n\nexport const clientTripleClickCommand = mouseClickCommand(\n \"triple-click\",\n \"triple_click\",\n \"Perform a triple click at coordinates\",\n);\n\nexport const clientLeftClickDragCommand = new Command()\n .name(\"left-click-drag\")\n .description(\"Drag from (startX, startY) to (endX, endY)\")\n .argument(\"<startX>\", \"Start X coordinate\")\n .argument(\"<startY>\", \"Start Y coordinate\")\n .argument(\"<endX>\", \"End X coordinate\")\n .argument(\"<endY>\", \"End Y coordinate\")\n .action(\n withErrorHandler(\n async (startX: string, startY: string, endX: string, endY: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"left_click_drag\",\n startX: Number(startX),\n startY: Number(startY),\n endX: Number(endX),\n endY: Number(endY),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientLeftMouseDownCommand = new Command()\n .name(\"left-mouse-down\")\n .description(\"Press and hold the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_down\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientLeftMouseUpCommand = new Command()\n .name(\"left-mouse-up\")\n .description(\"Release the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_up\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientScrollCommand = new Command()\n .name(\"scroll\")\n .description(\"Scroll at the given screen position\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .argument(\"<direction>\", \"Scroll direction: up, down, left, right\")\n .argument(\"[amount]\", \"Scroll amount in lines (default 3)\")\n .action(\n withErrorHandler(\n async (x: string, y: string, direction: string, amount?: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"scroll\",\n x: Number(x),\n y: Number(y),\n direction,\n ...(amount !== undefined && { amount: Number(amount) }),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientReadClipboardCommand = new Command()\n .name(\"read-clipboard\")\n .description(\"Read text content from the remote clipboard\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/clipboard\");\n const data = (await response.json()) as { text: string };\n process.stdout.write(data.text);\n }),\n );\n\nexport const clientWriteClipboardCommand = new Command()\n .name(\"write-clipboard\")\n .description(\"Write text content to the remote clipboard\")\n .argument(\"<text>\", \"Text to write to clipboard\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/clipboard\", {\n method: \"POST\",\n body: { text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientKeyCommand = new Command()\n .name(\"key\")\n .description(\"Press a key or key combination (e.g., cmd+c, return)\")\n .argument(\"<combo>\", \"Key combo string (e.g., cmd+c, ctrl+shift+s, return)\")\n .action(\n withErrorHandler(async (combo: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"key\", keys: combo },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientHoldKeyCommand = new Command()\n .name(\"hold-key\")\n .description(\"Hold a key or key combination for a duration\")\n .argument(\"<combo>\", \"Key combo string (e.g., shift, cmd+shift)\")\n .argument(\"<durationMs>\", \"Duration to hold in milliseconds\")\n .action(\n withErrorHandler(async (combo: string, durationStr: string) => {\n const durationMs = parseInt(durationStr, 10);\n if (Number.isNaN(durationMs) || durationMs <= 0) {\n throw new Error(\"durationMs must be a positive integer\");\n }\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"hold_key\", keys: combo, durationMs },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientTypeCommand = new Command()\n .name(\"type\")\n .description(\"Type text at the current cursor position\")\n .argument(\"<text>\", \"Text to type\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"type\", text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientOpenAppCommand = new Command()\n .name(\"open-app\")\n .description(\"Open or activate a macOS application by name or bundle ID\")\n .argument(\n \"<nameOrBundleId>\",\n \"App name (e.g., Safari) or bundle ID (e.g., com.apple.Safari)\",\n )\n .action(\n withErrorHandler(async (nameOrBundleId: string) => {\n await callHost(\"/open-application\", {\n method: \"POST\",\n body: { nameOrBundleId },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientMouseMoveCommand = mouseClickCommand(\n \"mouse-move\",\n \"move\",\n \"Move mouse pointer to coordinates\",\n);\n\nexport const clientCursorPositionCommand = new Command()\n .name(\"cursor-position\")\n .description(\"Get current cursor position from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/cursor-position\");\n const data = (await response.json()) as { x: number; y: number };\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n","import { getComputerUseHost } from \"../api\";\n\nlet cachedHost: { domain: string; token: string; cachedAt: number } | null =\n null;\nconst CACHE_TTL_MS = 30_000;\n\n/**\n * Discover the active computer-use host for the current org/user.\n * Results are cached for 30 seconds.\n */\nasync function discoverHost(): Promise<{\n domain: string;\n token: string;\n}> {\n if (cachedHost && Date.now() - cachedHost.cachedAt < CACHE_TTL_MS) {\n return { domain: cachedHost.domain, token: cachedHost.token };\n }\n\n const host = await getComputerUseHost();\n if (!host) {\n throw new Error(\n \"No active computer-use host found\\n\\n\" +\n \"Start a host with: zero computer-use host start\",\n );\n }\n\n cachedHost = { ...host, cachedAt: Date.now() };\n return host;\n}\n\n/**\n * Make an HTTP request to the computer-use host.\n */\nexport async function callHost(\n path: string,\n options?: { method?: string; body?: unknown },\n): Promise<Response> {\n const { domain, token } = await discoverHost();\n const url = `https://desktop.${domain}${path}`;\n\n const headers: Record<string, string> = { \"x-vm0-token\": token };\n const init: RequestInit = { headers };\n\n if (options?.method) {\n init.method = options.method;\n }\n if (options?.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const body = await response.text().catch(() => {\n return \"\";\n });\n throw new Error(\n `Host returned ${response.status}: ${body || response.statusText}`,\n );\n }\n\n return response;\n}\n","import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { voiceCommand } from \"./voice\";\n\nexport const zeroWebCommand = new Command()\n .name(\"web\")\n .description(\"Upload, download, and generate files via the web chat endpoint\")\n .addCommand(downloadFileCommand)\n .addCommand(voiceCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Download a file: zero web download-file <file-id> -o /tmp/out.pdf\n Generate speech: zero web voice --text \"Hello\"`,\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a web-uploaded file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `web-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a web-uploaded file by id\")\n .argument(\"<file-id>\", \"File id (UUID returned by the upload API)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/web-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero web download-file abc-123-def\n Download to explicit path: zero web download-file abc-123-def -o /tmp/report.pdf\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/web-abc-123-def\",\"mimetype\":\"application/pdf\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Authenticates via ZERO_TOKEN\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadWebFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { uploadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file and print a permanent URL\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Override content-type: zero web upload-file -f /tmp/data --content-type text/csv\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"id\":\"...\",\"filename\":\"...\",\"contentType\":\"...\",\"size\":N,\"url\":\"https://...\"}\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires file:write capability)\n - Returned URL is permanent (serves a short-lived signed redirect on access)\n - Safe to persist in chat messages or share over external channels\n - Max file size: 1 GB\n - Allowed image types: png / jpeg / gif / webp / avif / svg\n - Allowed video types: mp4 / webm / mov\n - Allowed audio types: aac / flac / m4a / mp3 / mp4 / mpga / ogg / opus / wav / webm\n - Allowed document/text types: pdf / txt / csv / md / html / json\n - Use --content-type for ambiguous extensions like .mp4 or .webm when needed`,\n )\n .action(\n withErrorHandler(\n async (options: { file: string; contentType?: string }) => {\n const result = await uploadWebFile(options.file, {\n contentType: options.contentType,\n });\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { generateWebVoice } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\ninterface VoiceOptions {\n text?: string;\n voice: string;\n instructions?: string;\n json?: boolean;\n}\n\nfunction readText(options: VoiceOptions): string {\n if (options.text?.trim()) {\n return options.text.trim();\n }\n\n if (process.stdin.isTTY === false) {\n const text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n if (text.length > 0) {\n return text;\n }\n }\n\n throw new Error(\"--text is required\", {\n cause: new Error('Usage: zero web voice --text \"Hello\"'),\n });\n}\n\nexport const voiceCommand = new Command()\n .name(\"voice\")\n .description(\"Generate a billed speech audio file from text\")\n .option(\"--text <text>\", \"Text to speak; can also be piped via stdin\")\n .option(\"--voice <voice>\", \"OpenAI voice to use\", \"marin\")\n .option(\"--instructions <text>\", \"Voice style instructions\")\n .option(\"--json\", \"Print metadata as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Generate speech: zero web voice --text \"Hello from vm0\"\n Pipe text: cat script.txt | zero web voice\n Pick a voice: zero web voice --text \"Ship it\" --voice cedar\n\nOutput:\n Prints the generated /f/ audio file URL and metadata\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires file:write capability)\n - Charges org credits after successful audio generation\n - Uses gpt-4o-mini-tts with WAV output`,\n )\n .action(\n withErrorHandler(async (options: VoiceOptions) => {\n const text = readText(options);\n const result = await generateWebVoice({\n text,\n voice: options.voice,\n instructions: options.instructions,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n return;\n }\n\n console.log(chalk.green(`✓ Voice generated: ${result.url}`));\n console.log(chalk.dim(` File: ${result.filename}`));\n console.log(chalk.dim(` Duration: ${result.durationSeconds}s`));\n console.log(chalk.dim(` Credits charged: ${result.creditsCharged}`));\n console.log(chalk.dim(` Model: ${result.model}`));\n console.log(chalk.dim(` Voice: ${result.voice}`));\n }),\n );\n"],"mappings":"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","names":["listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","import_prompts","prompts","type","config","prompts","selectedModel","provider","defaultNote","modelNote","removeCommand","listCommand","removeCommand","readFileSync","readFileSync","listCommand","deleteCommand","listCommand","deleteCommand","listCommand","statusCommand","listCommand","statusCommand","detectTimezone","readFileSync","day","readFileSync","setupCommand","listCommand","statusCommand","deleteCommand","setupCommand","listCommand","statusCommand","deleteCommand","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","readFileSync","readFileSync","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","readFileSync","listCommand","listCommand","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","statSync","basename","uploadFileCommand","statSync","basename","readFileSync","downloadFileCommand","uploadFileCommand","truncateValue","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","formatConnectorIdentity","unknownIcon","readFileSync","join","createCommand","editCommand","viewCommand","listCommand","deleteCommand","createCommand","editCommand","viewCommand","listCommand","deleteCommand","listCommand","parseLimit","searchCommand","listCommand","searchCommand","SEVEN_DAYS_MS","parseContextOptions","parseLimit","join","tmpdir","execFile","promisify","sleep","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","join","join","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","uploadFileCommand","readFileSync","readFileSync","downloadFileCommand","uploadFileCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/zero.ts","../src/commands/zero/org/index.ts","../src/commands/zero/org/status.ts","../src/commands/zero/org/set.ts","../src/commands/zero/org/list.ts","../src/commands/zero/org/use.ts","../src/commands/zero/org/members.ts","../src/commands/zero/org/invite.ts","../src/commands/zero/org/remove.ts","../src/commands/zero/org/leave.ts","../src/commands/zero/org/delete.ts","../src/commands/zero/org/secret/index.ts","../src/commands/zero/org/secret/list.ts","../src/commands/zero/org/secret/set.ts","../src/commands/zero/org/secret/remove.ts","../src/commands/zero/org/variable/index.ts","../src/commands/zero/org/variable/list.ts","../src/commands/zero/org/variable/set.ts","../src/commands/zero/org/variable/remove.ts","../src/commands/zero/org/model-provider/index.ts","../src/commands/zero/org/model-provider/list.ts","../src/commands/zero/org/model-provider/setup.ts","../src/lib/domain/model-provider/shared.ts","../src/commands/zero/org/model-provider/remove.ts","../src/commands/zero/org/model-provider/set-default.ts","../src/commands/zero/agent/index.ts","../src/commands/zero/agent/create.ts","../src/commands/zero/agent/avatar.ts","../src/commands/zero/agent/edit.ts","../src/commands/zero/agent/view.ts","../src/lib/utils/format-utils.ts","../src/commands/zero/agent/list.ts","../src/commands/zero/agent/delete.ts","../src/commands/zero/connector/index.ts","../src/commands/zero/connector/list.ts","../src/commands/zero/connector/agent-context.ts","../src/commands/zero/connector/connected-as.ts","../src/commands/zero/connector/search.ts","../src/commands/zero/connector/status.ts","../src/lib/domain/schedule-utils.ts","../src/commands/zero/doctor/platform-url.ts","../src/commands/zero/doctor/index.ts","../src/commands/zero/doctor/check-connector.ts","../src/commands/zero/doctor/generate.ts","../src/commands/zero/doctor/permission-deny.ts","../src/commands/zero/doctor/permission-change.ts","../src/commands/zero/doctor/resolve-role.ts","../src/commands/zero/preference/index.ts","../src/commands/zero/run/index.ts","../src/commands/zero/run/run.ts","../src/commands/zero/run/shared.ts","../src/commands/zero/run/continue.ts","../src/commands/zero/schedule/index.ts","../src/commands/zero/schedule/setup.ts","../src/commands/zero/schedule/list.ts","../src/commands/zero/schedule/status.ts","../src/commands/zero/schedule/delete.ts","../src/commands/zero/schedule/enable.ts","../src/commands/zero/schedule/disable.ts","../src/commands/zero/secret/index.ts","../src/commands/zero/secret/list.ts","../src/commands/zero/secret/set.ts","../src/commands/zero/secret/delete.ts","../src/commands/zero/chat/index.ts","../src/commands/zero/chat/message/index.ts","../src/commands/zero/chat/message/send.ts","../src/commands/zero/slack/index.ts","../src/commands/zero/slack/message/index.ts","../src/commands/zero/slack/message/send.ts","../src/commands/zero/slack/upload-file.ts","../src/commands/zero/slack/download-file.ts","../src/commands/zero/telegram/index.ts","../src/commands/zero/telegram/bot/index.ts","../src/commands/zero/telegram/bot/list.ts","../src/commands/zero/telegram/download-file.ts","../src/commands/zero/telegram/message/index.ts","../src/commands/zero/telegram/message/send.ts","../src/commands/zero/telegram/upload-file.ts","../src/commands/zero/variable/index.ts","../src/commands/zero/variable/list.ts","../src/commands/zero/variable/set.ts","../src/commands/zero/variable/delete.ts","../src/commands/zero/whoami.ts","../src/commands/zero/skill/index.ts","../src/commands/zero/skill/create.ts","../src/lib/skill-directory.ts","../src/commands/zero/skill/edit.ts","../src/commands/zero/skill/view.ts","../src/commands/zero/skill/list.ts","../src/commands/zero/skill/delete.ts","../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts","../src/commands/zero/logs/search.ts","../src/commands/zero/search/index.ts","../src/commands/zero/developer-support.ts","../src/commands/zero/computer-use/index.ts","../src/commands/zero/computer-use/host.ts","../src/lib/computer-use/desktop-server.ts","../src/lib/computer-use/screencapture.ts","../src/lib/computer-use/cliclick.ts","../src/lib/computer-use/scroll.ts","../src/lib/computer-use/clipboard.ts","../src/lib/computer-use/application.ts","../src/lib/computer-use/ngrok.ts","../src/commands/zero/computer-use/client.ts","../src/lib/computer-use/client.ts","../src/commands/zero/web/index.ts","../src/commands/zero/web/download-file.ts","../src/commands/zero/web/upload-file.ts","../src/commands/zero/web/voice.ts"],"sourcesContent":["// Zero CLI entry point - standalone binary for zero platform commands\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { zeroOrgCommand } from \"./commands/zero/org\";\nimport { zeroAgentCommand } from \"./commands/zero/agent\";\nimport { zeroConnectorCommand } from \"./commands/zero/connector\";\nimport { zeroDoctorCommand } from \"./commands/zero/doctor\";\nimport { zeroPreferenceCommand } from \"./commands/zero/preference\";\nimport { zeroRunCommand } from \"./commands/zero/run\";\nimport { zeroScheduleCommand } from \"./commands/zero/schedule\";\nimport { zeroSecretCommand } from \"./commands/zero/secret\";\nimport { zeroChatCommand } from \"./commands/zero/chat\";\nimport { zeroSlackCommand } from \"./commands/zero/slack\";\nimport { zeroTelegramCommand } from \"./commands/zero/telegram\";\nimport { zeroVariableCommand } from \"./commands/zero/variable\";\nimport { zeroWhoamiCommand } from \"./commands/zero/whoami\";\nimport { zeroSkillCommand } from \"./commands/zero/skill\";\nimport { zeroLogsCommand } from \"./commands/zero/logs\";\nimport { zeroSearchCommand } from \"./commands/zero/search\";\nimport { zeroDeveloperSupportCommand } from \"./commands/zero/developer-support\";\nimport { zeroComputerUseCommand } from \"./commands/zero/computer-use\";\nimport { zeroWebCommand } from \"./commands/zero/web\";\nimport {\n decodeZeroTokenPayload,\n type ZeroTokenPayload,\n} from \"./lib/api/zero-token.js\";\n\n/**\n * Map of command names to the capability required to see them.\n * Commands not in this map are hidden when ZERO_TOKEN is active.\n * Use an array when a top-level command has subcommands with different\n * capability gates and any one of them should make the command visible.\n * Use `null` for commands that should always be visible in sandbox.\n */\nconst COMMAND_CAPABILITY_MAP: Record<\n string,\n string | readonly string[] | null\n> = {\n agent: \"agent:read\",\n skill: \"agent:read\",\n connector: \"connector:read\",\n run: \"agent-run:write\",\n schedule: \"schedule:read\",\n doctor: null,\n logs: \"agent-run:read\",\n search: \"chat-message:read\",\n chat: \"chat-message:write\",\n slack: \"slack:write\",\n telegram: [\"telegram:read\", \"telegram:write\"],\n whoami: null,\n \"developer-support\": null,\n \"computer-use\": \"computer-use:write\",\n web: null,\n};\n\nconst DEFAULT_COMMANDS: Command[] = [\n zeroOrgCommand,\n zeroAgentCommand,\n zeroConnectorCommand,\n zeroDoctorCommand,\n zeroPreferenceCommand,\n zeroRunCommand,\n zeroScheduleCommand,\n zeroSecretCommand,\n zeroChatCommand,\n zeroSlackCommand,\n zeroTelegramCommand,\n zeroVariableCommand,\n zeroLogsCommand,\n zeroSearchCommand,\n zeroWhoamiCommand,\n zeroSkillCommand,\n zeroDeveloperSupportCommand,\n zeroComputerUseCommand,\n zeroWebCommand,\n];\n\nfunction shouldHideCommand(\n name: string,\n payload: ZeroTokenPayload | undefined,\n): boolean {\n if (!payload) return false;\n const requiredCap = COMMAND_CAPABILITY_MAP[name];\n if (requiredCap === undefined) return true;\n if (requiredCap === null) return false;\n if (typeof requiredCap !== \"string\") {\n return !requiredCap.some((capability) => {\n return payload.capabilities.includes(capability);\n });\n }\n return !payload.capabilities.includes(requiredCap);\n}\n\n/**\n * Register commands with visibility based on ZERO_TOKEN capabilities.\n * Commands not granted by the token are registered as hidden via\n * Commander's public `addCommand(cmd, { hidden: true })` API.\n * When no ZERO_TOKEN is present, all commands remain visible.\n *\n * @param commands - override default commands (used in tests)\n */\nexport function registerZeroCommands(\n prog: Command,\n commands?: Command[],\n): void {\n const token = process.env.ZERO_TOKEN;\n const payload = token ? decodeZeroTokenPayload(token) : undefined;\n\n for (const cmd of commands ?? DEFAULT_COMMANDS) {\n const hidden = shouldHideCommand(cmd.name(), payload);\n prog.addCommand(cmd, hidden ? { hidden: true } : {});\n }\n}\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"zero\")\n .description(\n \"Zero CLI — interact with the zero platform from inside the sandbox\",\n )\n .version(__CLI_VERSION__)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name <ENV_NAME>\n Send a Slack message? zero slack message send --help\n List Telegram bots? zero telegram bot list\n Send Telegram? zero telegram message send --help\n Upload Telegram? zero telegram upload-file --help\n Download Telegram? zero telegram download-file --help\n Set up a schedule? zero schedule setup --help\n Update yourself? zero agent --help\n Manage custom skills? zero skill --help\n Check your identity? zero whoami`,\n );\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"zero.js\") ||\n process.argv[1]?.endsWith(\"zero.ts\") ||\n process.argv[1]?.endsWith(\"zero\")\n) {\n configureGlobalProxyFromEnv();\n registerZeroCommands(program);\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { statusCommand } from \"./status\";\nimport { setCommand } from \"./set\";\nimport { listCommand } from \"./list\";\nimport { useCommand } from \"./use\";\nimport { membersCommand } from \"./members\";\nimport { inviteCommand } from \"./invite\";\nimport { removeCommand } from \"./remove\";\nimport { leaveCommand } from \"./leave\";\nimport { deleteCommand } from \"./delete\";\nimport { zeroOrgSecretCommand } from \"./secret\";\nimport { zeroOrgVariableCommand } from \"./variable\";\nimport { zeroOrgModelProviderCommand } from \"./model-provider\";\n\nexport const zeroOrgCommand = new Command()\n .name(\"org\")\n .description(\"Manage organization settings, members, and providers\")\n .addCommand(statusCommand)\n .addCommand(setCommand)\n .addCommand(listCommand)\n .addCommand(useCommand)\n .addCommand(membersCommand)\n .addCommand(inviteCommand)\n .addCommand(removeCommand)\n .addCommand(leaveCommand)\n .addCommand(deleteCommand)\n .addCommand(zeroOrgSecretCommand)\n .addCommand(zeroOrgVariableCommand)\n .addCommand(zeroOrgModelProviderCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg } from \"../../../lib/api\";\nimport { ApiRequestError } from \"../../../lib/api/core/client-factory\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"View current organization status\")\n .action(\n withErrorHandler(async () => {\n try {\n const org = await getZeroOrg();\n\n console.log(chalk.bold(\"Organization Information:\"));\n console.log(` Slug: ${chalk.green(org.slug)}`);\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"No organization configured\", {\n cause: new Error(\"Set your organization with: zero org set <slug>\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrg, updateZeroOrg, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Rename your organization slug\")\n .argument(\"<slug>\", \"The new organization slug\")\n .option(\n \"--force\",\n \"Force change existing organization (may break references)\",\n )\n .action(\n withErrorHandler(async (slug: string, options: { force?: boolean }) => {\n try {\n const existingOrg = await getZeroOrg();\n\n if (!options.force) {\n throw new Error(\n `You already have an organization: ${existingOrg.slug}`,\n {\n cause: new Error(`To change, use: zero org set ${slug} --force`),\n },\n );\n }\n\n const org = await updateZeroOrg({ slug, force: true });\n\n const result = await switchZeroOrg(org.slug);\n await saveConfig({\n token: result.access_token,\n });\n\n console.log(chalk.green(`✓ Organization updated to ${org.slug}`));\n console.log();\n console.log(\"Your agents will now be namespaced as:\");\n console.log(chalk.cyan(` ${org.slug}/<agent-name>`));\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"already exists\")\n ) {\n throw new Error(\n `Organization \"${slug}\" is already taken. Please choose a different slug.`,\n );\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .description(\"List all accessible organizations\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgs();\n const activeOrg = await getActiveOrg();\n\n console.log(chalk.bold(\"Available organizations:\"));\n for (const org of result.orgs) {\n const isCurrent = org.slug === activeOrg;\n const marker = isCurrent ? chalk.green(\"* \") : \" \";\n const roleLabel = org.role ? ` (${org.role})` : \"\";\n const currentLabel = isCurrent ? chalk.dim(\" ← current\") : \"\";\n console.log(`${marker}${org.slug}${roleLabel}${currentLabel}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const useCommand = new Command()\n .name(\"use\")\n .description(\"Switch to a different organization\")\n .argument(\"<slug>\", \"Organization slug to switch to\")\n .action(\n withErrorHandler(async (slug: string) => {\n const orgList = await listZeroOrgs();\n const target = orgList.orgs.find((s) => {\n return s.slug === slug;\n });\n if (!target) {\n throw new Error(`Organization '${slug}' not found or not accessible.`);\n }\n\n const result = await switchZeroOrg(slug);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Switched to organization: ${slug}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroOrgMembers } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const membersCommand = new Command()\n .name(\"members\")\n .description(\"View organization members\")\n .action(\n withErrorHandler(async () => {\n const status = await getZeroOrgMembers();\n\n console.log(chalk.bold(`Organization: ${status.slug}`));\n console.log(` Role: ${status.role}`);\n console.log(\n ` Created: ${new Date(status.createdAt).toLocaleDateString()}`,\n );\n console.log();\n console.log(chalk.bold(\"Members:\"));\n for (const member of status.members) {\n const roleTag =\n member.role === \"admin\"\n ? chalk.yellow(` (${member.role})`)\n : chalk.dim(` (${member.role})`);\n console.log(` ${member.email}${roleTag}`);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { inviteZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const inviteCommand = new Command()\n .name(\"invite\")\n .description(\"Invite a member to the current organization\")\n .requiredOption(\"--email <email>\", \"Email address of the member to invite\")\n .option(\n \"--role <role>\",\n \"Role for the invited member (member or admin)\",\n \"member\",\n )\n .action(\n withErrorHandler(async (options: { email: string; role: string }) => {\n if (options.role !== \"member\" && options.role !== \"admin\") {\n throw new Error(\n `Invalid role \"${options.role}\". Must be \"member\" or \"admin\".`,\n );\n }\n await inviteZeroOrgMember(options.email, options.role);\n console.log(\n chalk.green(`✓ Invitation sent to ${options.email} as ${options.role}`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { removeZeroOrgMember } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove a member from the current organization\")\n .argument(\"<email>\", \"Email address of the member to remove\")\n .action(\n withErrorHandler(async (email: string) => {\n await removeZeroOrgMember(email);\n console.log(chalk.green(`✓ Removed ${email} from organization`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { leaveZeroOrg, listZeroOrgs, switchZeroOrg } from \"../../../lib/api\";\nimport { saveConfig } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const leaveCommand = new Command()\n .name(\"leave\")\n .description(\"Leave the current organization\")\n .action(\n withErrorHandler(async () => {\n await leaveZeroOrg();\n\n const { orgs } = await listZeroOrgs();\n if (orgs.length === 0) {\n await saveConfig({ token: undefined });\n console.log(chalk.green(\"✓ Left organization.\"));\n console.log(\n chalk.yellow(\"No remaining organizations. Run: vm0 auth login\"),\n );\n return;\n }\n\n const nextOrg = orgs[0]!.slug;\n const result = await switchZeroOrg(nextOrg);\n await saveConfig({\n token: result.access_token,\n });\n console.log(chalk.green(`✓ Left organization. Switched to: ${nextOrg}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrg } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete the current organization (admin only)\")\n .argument(\"<slug>\", \"Organization slug to confirm deletion\")\n .action(\n withErrorHandler(async (slug: string) => {\n await deleteZeroOrg(slug);\n console.log(chalk.green(`✓ Organization '${slug}' has been deleted.`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Manage org-level secrets (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgSecrets } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No org secrets found\"));\n console.log();\n console.log(\"To add an org secret:\");\n console.log(\n chalk.cyan(\" zero org secret set MY_API_KEY --body <value>\"),\n );\n return;\n }\n\n console.log(chalk.bold(\"Org Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n console.log(` ${chalk.cyan(secret.name)}`);\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptPassword,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero org secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroOrgSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgSecret } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level secret (admin only)\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgSecret(name);\n console.log(chalk.green(`✓ Org secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { removeCommand } from \"./remove\";\n\nexport const zeroOrgVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Manage org-level variables (admin)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(removeCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroOrgVariables } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No org variables found\"));\n console.log();\n console.log(\"To add an org variable:\");\n console.log(chalk.cyan(\" zero org variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Org Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgVariable } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroOrgVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Org variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgVariable } from \"../../../../lib/api\";\nimport {\n isInteractive,\n promptConfirm,\n} from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Delete an org-level variable (admin only)\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete org variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroOrgVariable(name);\n console.log(chalk.green(`✓ Org variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setupCommand } from \"./setup\";\nimport { removeCommand } from \"./remove\";\nimport { setDefaultCommand } from \"./set-default\";\n\nexport const zeroOrgModelProviderCommand = new Command()\n .name(\"model-provider\")\n .description(\"Manage org-level model providers\")\n .addCommand(listCommand)\n .addCommand(setupCommand)\n .addCommand(removeCommand)\n .addCommand(setDefaultCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n MODEL_PROVIDER_TYPES,\n allowsCustomModel,\n getModels,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { listZeroOrgModelProviders } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all org-level model providers\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroOrgModelProviders();\n\n if (result.modelProviders.length === 0) {\n console.log(chalk.dim(\"No org-level model providers configured\"));\n console.log();\n console.log(\"To add an org-level model provider:\");\n console.log(chalk.cyan(\" zero org model-provider setup\"));\n return;\n }\n\n // Group by framework\n const byFramework = result.modelProviders.reduce(\n (acc, p) => {\n const fw = p.framework;\n if (!acc[fw]) {\n acc[fw] = [];\n }\n acc[fw].push(p);\n return acc;\n },\n {} as Record<string, typeof result.modelProviders>,\n );\n\n console.log(chalk.bold(\"Org Model Providers:\"));\n console.log();\n\n for (const [framework, providers] of Object.entries(byFramework)) {\n console.log(` ${chalk.cyan(framework)}:`);\n for (const provider of providers) {\n const defaultTag = provider.isDefault\n ? chalk.green(\" (default)\")\n : \"\";\n const modelTag = provider.selectedModel\n ? chalk.dim(` [${provider.selectedModel}]`)\n : \"\";\n console.log(` ${provider.type}${defaultTag}${modelTag}`);\n console.log(chalk.dim(` ID: ${provider.id}`));\n if (provider.type in MODEL_PROVIDER_TYPES) {\n const type = provider.type as ModelProviderType;\n const available = getModels(type) ?? [];\n if (available.length > 0) {\n console.log(\n chalk.dim(` Available models: ${available.join(\", \")}`),\n );\n } else if (allowsCustomModel(type)) {\n console.log(\n chalk.dim(\" Available models: (custom — any model name)\"),\n );\n }\n }\n console.log(\n chalk.dim(\n ` Updated: ${new Date(provider.updatedAt).toLocaleString()}`,\n ),\n );\n }\n console.log();\n }\n\n console.log(\n chalk.dim(`Total: ${result.modelProviders.length} provider(s)`),\n );\n console.log();\n console.log(\n chalk.dim(\n \"Use a provider ID with: zero agent edit <agent-id> --model-provider <id> --model <name>\",\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n listZeroOrgModelProviders,\n upsertZeroOrgModelProvider,\n updateZeroOrgModelProviderModel,\n setZeroOrgModelProviderDefault,\n} from \"../../../../lib/api\";\nimport {\n MODEL_PROVIDER_TYPES,\n hasModelSelection,\n hasAuthMethods,\n getSelectableProviderTypes,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\nimport { isInteractive } from \"../../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n type SetupInput,\n handleNonInteractiveMode,\n promptForModelSelection,\n promptForAuthMethod,\n promptForSecrets,\n collectSecrets,\n} from \"../../../../lib/domain/model-provider/shared\";\n\nasync function handleInteractiveMode(): Promise<SetupInput | null> {\n if (!isInteractive()) {\n throw new Error(\"Interactive mode requires a TTY\", {\n cause: new Error(\n 'Use non-interactive mode: zero org model-provider setup --type <type> --secret \"<value>\"',\n ),\n });\n }\n\n let cancelled = false;\n const onCancel = () => {\n cancelled = true;\n return false;\n };\n\n // Fetch configured org providers to annotate choices\n const { modelProviders: configuredProviders } =\n await listZeroOrgModelProviders();\n const configuredTypes = new Set(\n configuredProviders.map((p) => {\n return p.type;\n }),\n );\n\n // Build provider choices with configuration status (only selectable providers)\n const annotatedChoices = getSelectableProviderTypes().map((type) => {\n const config = MODEL_PROVIDER_TYPES[type];\n const isConfigured = configuredTypes.has(type);\n const isExperimental = hasAuthMethods(type);\n let title: string = config.label;\n if (isConfigured) {\n title = `${title} ✓`;\n }\n if (isExperimental) {\n title = `${title} ${chalk.dim(\"(experimental)\")}`;\n }\n return {\n title,\n value: type,\n };\n });\n\n const typeResponse = await prompts(\n {\n type: \"select\",\n name: \"type\",\n message: \"Select provider type:\",\n choices: annotatedChoices,\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const type = typeResponse.type as ModelProviderType;\n\n // Check if provider is already configured using the list we already fetched\n const existingProvider = configuredProviders.find((p) => {\n return p.type === type;\n });\n\n if (existingProvider) {\n console.log();\n console.log(`\"${type}\" is already configured`);\n console.log();\n\n const actionResponse = await prompts(\n {\n type: \"select\",\n name: \"action\",\n message: \"\",\n choices: [\n { title: \"Keep existing secret\", value: \"keep\" },\n { title: \"Update secret\", value: \"update\" },\n ],\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n if (actionResponse.action === \"keep\") {\n const selectedModel = await promptForModelSelection(type);\n return {\n type,\n keepExistingSecret: true,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n // Fall through to secret prompt for \"update\"\n }\n\n const config = MODEL_PROVIDER_TYPES[type];\n\n console.log();\n if (\"helpText\" in config) {\n console.log(chalk.dim(config.helpText));\n }\n console.log();\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n const authMethod = await promptForAuthMethod(type);\n const secrets = await promptForSecrets(type, authMethod);\n const selectedModel = await promptForModelSelection(type);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: true,\n };\n }\n\n // Single-secret provider (legacy)\n const secretLabel = \"secretLabel\" in config ? config.secretLabel : \"secret\";\n\n const secretResponse = await prompts(\n {\n type: \"password\",\n name: \"secret\",\n message: `Enter your ${secretLabel}:`,\n validate: (value: string) => {\n return value.length > 0 || `${secretLabel} is required`;\n },\n },\n { onCancel },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return null;\n }\n\n const secret = secretResponse.secret as string;\n const selectedModel = await promptForModelSelection(type);\n\n return { type, secret, selectedModel, isInteractiveMode: true };\n}\n\nasync function promptSetAsDefault(\n type: ModelProviderType,\n framework: string,\n isDefault: boolean,\n): Promise<void> {\n if (isDefault) return;\n\n let cancelled = false;\n const response = await prompts(\n {\n type: \"confirm\",\n name: \"setDefault\",\n message: \"Set this provider as default?\",\n initial: false,\n },\n {\n onCancel: () => {\n cancelled = true;\n return false;\n },\n },\n );\n\n if (cancelled) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n if (response.setDefault) {\n await setZeroOrgModelProviderDefault(type);\n console.log(chalk.green(`✓ Default for ${framework} set to \"${type}\"`));\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Configure an org-level model provider\")\n .option(\"-t, --type <type>\", \"Provider type (for non-interactive mode)\")\n .option(\n \"-s, --secret <value>\",\n \"Secret value (can be used multiple times, supports VALUE or KEY=VALUE format)\",\n collectSecrets,\n [],\n )\n .option(\n \"-a, --auth-method <method>\",\n \"Auth method (required for multi-auth providers like aws-bedrock)\",\n )\n .option(\"-m, --model <model>\", \"Model selection (for non-interactive mode)\")\n .action(\n withErrorHandler(\n async (options: {\n type?: string;\n secret?: string[];\n authMethod?: string;\n model?: string;\n }) => {\n let input: SetupInput;\n const secretArgs = options.secret ?? [];\n\n if (options.type && secretArgs.length > 0) {\n input = handleNonInteractiveMode({\n type: options.type,\n secret: secretArgs,\n authMethod: options.authMethod,\n model: options.model,\n commandPrefix: \"zero org model-provider setup\",\n });\n } else if (options.type || secretArgs.length > 0) {\n throw new Error(\"Both --type and --secret are required\");\n } else {\n const result = await handleInteractiveMode();\n if (result === null) {\n return;\n }\n input = result;\n }\n\n // Handle \"keep existing secret\" flow\n if (input.keepExistingSecret) {\n const provider = await updateZeroOrgModelProviderModel(\n input.type,\n input.selectedModel,\n );\n\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n\n if (!hasModelSelection(input.type)) {\n console.log(\n chalk.green(`✓ Org model provider \"${input.type}\" unchanged`),\n );\n } else {\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" updated${defaultNote}${modelNote}`,\n ),\n );\n }\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n return;\n }\n\n // Standard upsert flow with secret\n const { provider, created } = await upsertZeroOrgModelProvider({\n type: input.type,\n secret: input.secret,\n authMethod: input.authMethod,\n secrets: input.secrets,\n selectedModel: input.selectedModel,\n });\n\n const action = created ? \"created\" : \"updated\";\n const defaultNote = provider.isDefault\n ? ` (default for ${provider.framework})`\n : \"\";\n const modelNote = provider.selectedModel\n ? ` with model: ${provider.selectedModel}`\n : \"\";\n console.log(\n chalk.green(\n `✓ Org model provider \"${input.type}\" ${action}${defaultNote}${modelNote}`,\n ),\n );\n if (input.isInteractiveMode) {\n await promptSetAsDefault(\n input.type,\n provider.framework,\n provider.isDefault,\n );\n }\n },\n ),\n );\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n MODEL_PROVIDER_TYPES,\n getModels,\n getDefaultModel,\n hasModelSelection,\n allowsCustomModel,\n getCustomModelPlaceholder,\n hasAuthMethods,\n getAuthMethodsForType,\n getDefaultAuthMethod,\n getSecretsForAuthMethod,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport interface SetupInput {\n type: ModelProviderType;\n secret?: string;\n // Multi-auth support\n authMethod?: string;\n secrets?: Record<string, string>;\n selectedModel?: string;\n keepExistingSecret?: boolean;\n isInteractiveMode?: boolean;\n}\n\nfunction validateProviderType(typeStr: string): ModelProviderType {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(typeStr)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${typeStr}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n return typeStr as ModelProviderType;\n}\n\nfunction validateModel(\n type: ModelProviderType,\n modelStr: string,\n): string | never {\n const models = getModels(type);\n\n // Allow any model if provider supports custom models\n if (allowsCustomModel(type)) {\n return modelStr;\n }\n\n if (models && !models.includes(modelStr)) {\n throw new Error(`Invalid model \"${modelStr}\"`, {\n cause: new Error(`Valid models: ${models.join(\", \")}`),\n });\n }\n return modelStr;\n}\n\nfunction validateAuthMethod(\n type: ModelProviderType,\n authMethodStr: string,\n): string | never {\n const authMethods = getAuthMethodsForType(type);\n if (!authMethods || !(authMethodStr in authMethods)) {\n const validMethods = authMethods\n ? Object.keys(authMethods).join(\", \")\n : \"none\";\n throw new Error(`Invalid auth method \"${authMethodStr}\"`, {\n cause: new Error(`Valid auth methods: ${validMethods}`),\n });\n }\n return authMethodStr;\n}\n\n/**\n * Parse secret arguments into a secrets object.\n * Supports two formats:\n * - Single value (e.g., \"sk-xxx\") - auto-mapped to the provider's secret name\n * - KEY=VALUE format (e.g., \"AWS_REGION=us-east-1\") - explicit mapping\n */\nfunction parseSecrets(\n type: ModelProviderType,\n authMethod: string,\n secretArgs: string[],\n): Record<string, string> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secretNames = Object.keys(secretsConfig);\n\n // Single value without = sign: only allowed for single-secret auth methods\n const firstArg = secretArgs[0];\n if (secretArgs.length === 1 && firstArg && !firstArg.includes(\"=\")) {\n if (secretNames.length !== 1) {\n throw new Error(\n \"Must use KEY=VALUE format for multi-secret auth methods\",\n { cause: new Error(`Required secrets: ${secretNames.join(\", \")}`) },\n );\n }\n const firstSecretName = secretNames[0];\n if (!firstSecretName) {\n throw new Error(\"No secrets defined for this auth method\");\n }\n return { [firstSecretName]: firstArg };\n }\n\n // KEY=VALUE format\n const secrets: Record<string, string> = {};\n for (const arg of secretArgs) {\n const eqIndex = arg.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new Error(`Invalid secret format \"${arg}\"`, {\n cause: new Error(\"Use KEY=VALUE format (e.g., AWS_REGION=us-east-1)\"),\n });\n }\n const key = arg.slice(0, eqIndex);\n const value = arg.slice(eqIndex + 1);\n secrets[key] = value;\n }\n return secrets;\n}\n\n/**\n * Validate secrets against the auth method config.\n */\nfunction validateSecrets(\n type: ModelProviderType,\n authMethod: string,\n secrets: Record<string, string>,\n): void {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n // Check required fields\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.required && !secrets[name]) {\n const requiredNames = Object.entries(secretsConfig)\n .filter(([, fc]) => {\n return fc.required;\n })\n .map(([n]) => {\n return n;\n })\n .join(\", \");\n throw new Error(`Missing required secret: ${name}`, {\n cause: new Error(`Required secrets: ${requiredNames}`),\n });\n }\n }\n\n // Check for unknown fields\n for (const name of Object.keys(secrets)) {\n if (!(name in secretsConfig)) {\n const validNames = Object.keys(secretsConfig).join(\", \");\n throw new Error(`Unknown secret: ${name}`, {\n cause: new Error(`Valid secrets: ${validNames}`),\n });\n }\n }\n}\n\nexport function handleNonInteractiveMode(options: {\n type: string;\n secret: string[];\n authMethod?: string;\n model?: string;\n commandPrefix?: string;\n}): SetupInput {\n const type = validateProviderType(options.type);\n const cmdPrefix = options.commandPrefix ?? \"zero org model-provider setup\";\n\n let selectedModel: string | undefined;\n\n if (options.model) {\n selectedModel = validateModel(type, options.model);\n } else if (hasModelSelection(type)) {\n const defaultModel = getDefaultModel(type);\n // Empty defaultModel means \"auto\" mode - don't set selectedModel\n selectedModel = defaultModel || undefined;\n }\n\n // Handle multi-auth providers\n if (hasAuthMethods(type)) {\n // Determine auth method\n let authMethod: string;\n if (options.authMethod) {\n authMethod = validateAuthMethod(type, options.authMethod);\n } else {\n const defaultAuthMethod = getDefaultAuthMethod(type);\n const authMethods = getAuthMethodsForType(type);\n if (!defaultAuthMethod || !authMethods) {\n throw new Error(`Provider \"${type}\" requires --auth-method`);\n }\n // If there's only one auth method, use it; otherwise require explicit selection\n const authMethodNames = Object.keys(authMethods);\n if (authMethodNames.length === 1) {\n authMethod = authMethodNames[0]!;\n } else {\n const methods = authMethodNames.join(\", \");\n throw new Error(\n `--auth-method is required for \"${type}\" (multiple auth methods available)`,\n {\n cause: new Error(\n `Available: ${methods}. Example: ${cmdPrefix} --type ${type} --auth-method ${authMethodNames[0]} --secret KEY=VALUE`,\n ),\n },\n );\n }\n }\n\n // Parse and validate secrets\n const secrets = parseSecrets(type, authMethod, options.secret);\n validateSecrets(type, authMethod, secrets);\n\n return {\n type,\n authMethod,\n secrets,\n selectedModel,\n isInteractiveMode: false,\n };\n }\n\n // Single-secret provider (legacy)\n // Accept single value or KEY=VALUE format\n const secretArgs = options.secret;\n const firstArg = secretArgs[0];\n if (!firstArg) {\n throw new Error(\"Secret is required\");\n }\n\n // If KEY=VALUE format, extract the value\n let secret: string;\n if (firstArg.includes(\"=\")) {\n secret = firstArg.slice(firstArg.indexOf(\"=\") + 1);\n } else {\n secret = firstArg;\n }\n\n return {\n type,\n secret,\n selectedModel,\n isInteractiveMode: false,\n };\n}\n\nexport async function promptForModelSelection(\n type: ModelProviderType,\n): Promise<string | undefined> {\n if (!hasModelSelection(type)) {\n return undefined;\n }\n\n const models = getModels(type) ?? [];\n const defaultModel = getDefaultModel(type);\n const supportsCustomModel = allowsCustomModel(type);\n\n // Build choices\n const modelChoices: { title: string; value: string }[] = [];\n\n // Add auto option if defaultModel is empty string\n if (defaultModel === \"\") {\n modelChoices.push({ title: \"auto (Recommended)\", value: \"\" });\n }\n\n // Add predefined models\n for (const model of models) {\n modelChoices.push({\n title: model === defaultModel ? `${model} (Recommended)` : model,\n value: model,\n });\n }\n\n // Add custom model option if supported\n if (supportsCustomModel) {\n modelChoices.push({ title: \"Custom model ID\", value: \"__custom__\" });\n }\n\n const modelResponse = await prompts(\n {\n type: \"select\",\n name: \"model\",\n message: \"Select model:\",\n choices: modelChoices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n const selected = modelResponse.model as string;\n\n // Handle custom model input\n if (selected === \"__custom__\") {\n const placeholder = getCustomModelPlaceholder(type);\n if (placeholder) {\n console.log(chalk.dim(`Example: ${placeholder}`));\n }\n const customResponse = await prompts(\n {\n type: \"text\",\n name: \"customModel\",\n message: \"Enter model ID:\",\n validate: (value: string) => {\n return value.length > 0 || \"Model ID is required\";\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n return customResponse.customModel as string;\n }\n\n // Return undefined for auto mode (empty string)\n return selected === \"\" ? undefined : selected;\n}\n\n/**\n * Prompt for auth method selection (only for multi-auth providers)\n */\nexport async function promptForAuthMethod(\n type: ModelProviderType,\n): Promise<string> {\n const authMethods = getAuthMethodsForType(type);\n const defaultAuthMethod = getDefaultAuthMethod(type);\n\n if (!authMethods) {\n return \"default\";\n }\n\n const choices = Object.entries(authMethods).map(([method, config]) => {\n return {\n title:\n method === defaultAuthMethod\n ? `${config.label} (Recommended)`\n : config.label,\n value: method,\n };\n });\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"authMethod\",\n message: \"Select authentication method:\",\n choices,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n\n return response.authMethod as string;\n}\n\n/**\n * Determine if a secret should be masked (password type)\n * Non-secret values like region should be visible\n */\nfunction isSensitiveSecret(name: string): boolean {\n const nonSecretPatterns = [\"REGION\", \"ENDPOINT\", \"URL\"];\n return !nonSecretPatterns.some((pattern) => {\n return name.toUpperCase().includes(pattern);\n });\n}\n\nexport async function promptForSecrets(\n type: ModelProviderType,\n authMethod: string,\n): Promise<Record<string, string>> {\n const secretsConfig = getSecretsForAuthMethod(type, authMethod);\n\n if (!secretsConfig) {\n throw new Error(`Invalid auth method \"${authMethod}\"`);\n }\n\n const secrets: Record<string, string> = {};\n\n for (const [name, fieldConfig] of Object.entries(secretsConfig)) {\n if (fieldConfig.helpText) {\n console.log(chalk.dim(fieldConfig.helpText));\n }\n\n const isSensitive = isSensitiveSecret(name);\n const placeholder =\n \"placeholder\" in fieldConfig ? (fieldConfig.placeholder as string) : \"\";\n\n if (fieldConfig.required) {\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label}:`,\n initial: placeholder ? \"\" : undefined,\n validate: (value: string) => {\n return value.length > 0 || `${fieldConfig.label} is required`;\n },\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n secrets[name] = response.value as string;\n } else {\n // Optional field\n const response = await prompts(\n {\n type: isSensitive ? \"password\" : \"text\",\n name: \"value\",\n message: `${fieldConfig.label} (optional):`,\n },\n {\n onCancel: () => {\n return process.exit(0);\n },\n },\n );\n const value = response.value as string;\n if (value && value.trim()) {\n secrets[name] = value.trim();\n }\n }\n }\n\n return secrets;\n}\n\n/**\n * Collect secret values from repeatable --secret option\n */\nexport function collectSecrets(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Parse a CLI model/model-provider flag value.\n *\n * Returns:\n * - `undefined` when the flag was not provided (preserve existing value)\n * - `null` when the user passed \"default\" (clear the override, inherit from org)\n * - the string value otherwise (set the specific model/provider)\n */\nexport function parseModelFlag(\n value: string | undefined,\n): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === \"default\") return null;\n return value;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroOrgModelProvider } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const removeCommand = new Command()\n .name(\"remove\")\n .description(\"Remove an org-level model provider\")\n .argument(\"<type>\", \"Model provider type to remove\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n await deleteZeroOrgModelProvider(type as ModelProviderType);\n console.log(chalk.green(`✓ Org model provider \"${type}\" removed`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroOrgModelProviderDefault } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport {\n MODEL_PROVIDER_TYPES,\n type ModelProviderType,\n} from \"@vm0/api-contracts/contracts/model-providers\";\n\nexport const setDefaultCommand = new Command()\n .name(\"set-default\")\n .description(\"Set an org-level model provider as default for its framework\")\n .argument(\"<type>\", \"Model provider type to set as default\")\n .action(\n withErrorHandler(async (type: string) => {\n if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type)) {\n const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(\", \");\n throw new Error(`Invalid type \"${type}\"`, {\n cause: new Error(`Valid types: ${validTypes}`),\n });\n }\n\n const provider = await setZeroOrgModelProviderDefault(\n type as ModelProviderType,\n );\n console.log(\n chalk.green(\n `✓ Default for ${provider.framework} set to \"${provider.type}\"`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { editCommand } from \"./edit\";\nimport { viewCommand } from \"./view\";\nimport { listCommand } from \"./list\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroAgentCommand = new Command(\"agent\")\n .description(\"View or manage zero agents\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Your agent ID is in $ZERO_AGENT_ID (or run: zero whoami)\n View your config: zero agent view $ZERO_AGENT_ID --instructions\n Update description: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n Update tone: zero agent edit $ZERO_AGENT_ID --sound friendly\n Update instructions: zero agent edit $ZERO_AGENT_ID --instructions-file <path>\n Add a custom skill: zero agent edit $ZERO_AGENT_ID --add-skill my-skill\n Remove a skill: zero agent edit $ZERO_AGENT_ID --remove-skill my-skill\n\nNotes:\n Manage custom skills with 'zero skill --help'`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\nimport { createZeroAgent, updateZeroAgentInstructions } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAvatarUrl } from \"./avatar\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a new zero agent\")\n .option(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (e.g. my-skill,other-skill)\",\n )\n .option(\"--display-name <name>\", \"Agent display name\")\n .option(\"--description <text>\", \"Agent description\")\n .option(\n \"--sound <tone>\",\n \"Agent tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\"--instructions-file <path>\", \"Path to instructions file\")\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, omitted fields use defaults):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Minimal: zero agent create --display-name \"My Agent\"\n Quick preset: zero agent create --display-name \"My Agent\" --avatar preset:2\n Custom avatar: zero agent create --display-name \"My Agent\" --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n With skills: zero agent create --skills my-skill,other-skill --display-name \"My Agent\"\n With instructions: zero agent create --display-name \"My Agent\" --instructions-file ./instructions.md`,\n )\n .action(\n withErrorHandler(\n async (options: {\n skills?: string;\n displayName?: string;\n description?: string;\n sound?: string;\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n instructionsFile?: string;\n }) => {\n const customSkills = options.skills\n ? options.skills.split(\",\").map((s) => {\n return s.trim();\n })\n : undefined;\n\n if (customSkills) {\n for (const name of customSkills) {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n }\n }\n\n const avatarUrl = resolveAvatarUrl(options);\n\n const agent = await createZeroAgent({\n displayName: options.displayName,\n description: options.description,\n sound: options.sound,\n avatarUrl,\n customSkills,\n });\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agent.agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agent.agentId}\" created`));\n console.log(` Agent ID: ${agent.agentId}`);\n if (customSkills?.length) {\n console.log(` Skills: ${customSkills.join(\", \")}`);\n }\n if (agent.displayName) {\n console.log(` Display Name: ${agent.displayName}`);\n }\n\n console.log();\n console.log(\"Next steps to authorize connectors for this agent:\");\n console.log(\" - Search connectors this agent needs:\");\n console.log(\n ` zero connector search <keyword> --agent ${agent.agentId}`,\n );\n console.log(\n \" - Check authorization status (prints an authorize URL if not authorized):\",\n );\n console.log(\n ` zero connector status <type> --agent ${agent.agentId}`,\n );\n },\n ),\n );\n","const SKIN_MAP: Record<string, number> = {\n light: 0,\n \"light-medium\": 1,\n medium: 2,\n \"medium-dark\": 3,\n dark: 4,\n};\n\nconst HAIR_COLOR_MAP: Record<string, number> = {\n blonde: 1,\n teal: 2,\n grey: 3,\n pink: 4,\n brown: 5,\n};\n\nconst EXPRESSION_MAP: Record<string, number> = {\n calm: 1,\n content: 2,\n neutral: 3,\n pleasant: 4,\n excited: 5,\n};\n\nconst INTENSITY_MAP: Record<string, \"d\" | \"m\" | \"h\"> = {\n chill: \"d\",\n normal: \"m\",\n hyped: \"h\",\n};\n\nfunction lookupRequired<T>(\n value: string,\n map: Readonly<Record<string, T>>,\n flag: string,\n): T {\n if (!(value in map)) {\n throw new Error(\n `Invalid ${flag} \"${value}\". Must be one of: ${Object.keys(map).join(\", \")}`,\n );\n }\n return map[value]!;\n}\n\nfunction parseIntRange(\n value: string,\n flag: string,\n min: number,\n max: number,\n): number {\n const n = Number(value);\n if (!Number.isInteger(n) || n < min || n > max) {\n throw new Error(`Invalid ${flag} \"${value}\". Must be ${min}–${max}`);\n }\n return n;\n}\n\nfunction buildCustomSvgAvatar(opts: AvatarOptions): string {\n const r =\n opts.avatarRotation !== undefined\n ? parseIntRange(opts.avatarRotation, \"--avatar-rotation\", 1, 5)\n : 3;\n const h =\n opts.avatarHairStyle !== undefined\n ? parseIntRange(opts.avatarHairStyle, \"--avatar-hair-style\", 1, 5)\n : 1;\n const s =\n opts.avatarSkin !== undefined\n ? lookupRequired(opts.avatarSkin, SKIN_MAP, \"--avatar-skin\")\n : 2;\n const c =\n opts.avatarHairColor !== undefined\n ? lookupRequired(\n opts.avatarHairColor,\n HAIR_COLOR_MAP,\n \"--avatar-hair-color\",\n )\n : 5;\n const f =\n opts.avatarExpression !== undefined\n ? lookupRequired(\n opts.avatarExpression,\n EXPRESSION_MAP,\n \"--avatar-expression\",\n )\n : 1;\n const i =\n opts.avatarIntensity !== undefined\n ? lookupRequired(\n opts.avatarIntensity,\n INTENSITY_MAP,\n \"--avatar-intensity\",\n )\n : \"m\";\n return `svg:r${r}s${s}h${h}c${c}f${f}${i}`;\n}\n\nexport interface AvatarOptions {\n avatar?: string;\n avatarRotation?: string;\n avatarSkin?: string;\n avatarHairStyle?: string;\n avatarHairColor?: string;\n avatarExpression?: string;\n avatarIntensity?: string;\n}\n\nexport function resolveAvatarUrl(opts: AvatarOptions): string | undefined {\n const hasPreset = opts.avatar !== undefined;\n const hasCustom =\n opts.avatarRotation !== undefined ||\n opts.avatarSkin !== undefined ||\n opts.avatarHairStyle !== undefined ||\n opts.avatarHairColor !== undefined ||\n opts.avatarExpression !== undefined ||\n opts.avatarIntensity !== undefined;\n\n if (!hasPreset && !hasCustom) return undefined;\n\n if (hasPreset && hasCustom) {\n throw new Error(\n \"--avatar cannot be combined with --avatar-* attribute options\",\n );\n }\n\n if (hasPreset) {\n if (!/^preset:[0-4]$/.test(opts.avatar!)) {\n throw new Error(\n `Invalid --avatar \"${opts.avatar}\". Use preset:0 through preset:4`,\n );\n }\n return opts.avatar;\n }\n\n return buildCustomSvgAvatar(opts);\n}\n\nconst REVERSE_SKIN_MAP: Record<number, string> = {\n 0: \"light\",\n 1: \"light-medium\",\n 2: \"medium\",\n 3: \"medium-dark\",\n 4: \"dark\",\n};\n\nconst REVERSE_HAIR_COLOR_MAP: Record<number, string> = {\n 1: \"blonde\",\n 2: \"teal\",\n 3: \"grey\",\n 4: \"pink\",\n 5: \"brown\",\n};\n\nconst REVERSE_EXPRESSION_MAP: Record<number, string> = {\n 1: \"calm\",\n 2: \"content\",\n 3: \"neutral\",\n 4: \"pleasant\",\n 5: \"excited\",\n};\n\nconst REVERSE_INTENSITY_MAP: Record<string, string> = {\n d: \"chill\",\n m: \"normal\",\n h: \"hyped\",\n};\n\nconst PRESET_DESCRIPTIONS: Record<string, string> = {\n \"preset:0\": \"light skin, brown hair, calm, hyped\",\n \"preset:1\": \"light-medium skin, grey hair, calm, normal\",\n \"preset:2\": \"medium skin, pink hair, neutral, chill\",\n \"preset:3\": \"medium-dark skin, blonde hair, pleasant, hyped\",\n \"preset:4\": \"dark skin, teal hair, excited, normal\",\n};\n\nfunction parseSvgAvatar(svg: string): string | undefined {\n const match = svg.match(/^svg:r(\\d)s(\\d)h(\\d)c(\\d)f(\\d)([dmh])$/);\n if (!match) return undefined;\n\n const [, r, s, h, c, f, i] = match as RegExpExecArray;\n const parts: string[] = [];\n\n const skin = REVERSE_SKIN_MAP[Number(s)];\n if (skin) parts.push(`${skin} skin`);\n\n const hairColor = REVERSE_HAIR_COLOR_MAP[Number(c)];\n if (hairColor) parts.push(`${hairColor} hair`);\n\n const expression = REVERSE_EXPRESSION_MAP[Number(f)];\n if (expression) parts.push(expression);\n\n const intensity = REVERSE_INTENSITY_MAP[i!];\n if (intensity) parts.push(intensity);\n\n if (parts.length === 0) return undefined;\n\n let desc = parts.join(\", \");\n if (r !== \"3\") {\n const rotationLabels: Record<string, string> = {\n \"1\": \"far-left\",\n \"2\": \"left\",\n \"4\": \"right\",\n \"5\": \"far-right\",\n };\n const rot = rotationLabels[r!];\n if (rot) desc += `, ${rot}`;\n }\n if (h !== \"1\") {\n desc += `, hair style ${h}`;\n }\n\n return desc;\n}\n\nexport function formatAvatar(\n avatarUrl: string | null | undefined,\n): string | undefined {\n if (!avatarUrl) return undefined;\n\n if (avatarUrl.startsWith(\"preset:\")) {\n const desc = PRESET_DESCRIPTIONS[avatarUrl];\n return desc ? `${avatarUrl} (${desc})` : avatarUrl;\n }\n\n if (avatarUrl.startsWith(\"svg:\")) {\n const desc = parseSvgAvatar(avatarUrl);\n return desc ? `custom (${desc})` : avatarUrl;\n }\n\n return avatarUrl;\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { zeroAgentCustomSkillNameSchema } from \"@vm0/api-contracts/contracts/zero-agents\";\nimport {\n getZeroAgent,\n updateZeroAgent,\n updateZeroAgentInstructions,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\nimport { type AvatarOptions, resolveAvatarUrl } from \"./avatar\";\n\ninterface AgentEditOptions extends AvatarOptions {\n displayName?: string;\n description?: string;\n sound?: string;\n skills?: string;\n addSkill?: string;\n removeSkill?: string;\n instructionsFile?: string;\n modelProvider?: string;\n model?: string;\n}\n\nfunction hasAvatarUpdate(options: AvatarOptions): boolean {\n return (\n options.avatar !== undefined ||\n options.avatarRotation !== undefined ||\n options.avatarSkin !== undefined ||\n options.avatarHairStyle !== undefined ||\n options.avatarHairColor !== undefined ||\n options.avatarExpression !== undefined ||\n options.avatarIntensity !== undefined\n );\n}\n\nfunction hasAgentFieldUpdate(options: AgentEditOptions): boolean {\n return (\n options.displayName !== undefined ||\n options.description !== undefined ||\n options.sound !== undefined ||\n hasAvatarUpdate(options) ||\n options.skills !== undefined ||\n options.addSkill !== undefined ||\n options.removeSkill !== undefined ||\n options.modelProvider !== undefined ||\n options.model !== undefined\n );\n}\n\nasync function applyAgentUpdate(\n agentId: string,\n options: AgentEditOptions,\n): Promise<void> {\n const hasAvatar = hasAvatarUpdate(options);\n const resolvedAvatarUrl = hasAvatar ? resolveAvatarUrl(options) : undefined;\n\n const current = await getZeroAgent(agentId);\n const customSkills = resolveCustomSkills(options, current.customSkills ?? []);\n\n const modelProviderId =\n options.modelProvider !== undefined\n ? parseModelFlag(options.modelProvider)\n : current.modelProviderId;\n const selectedModel =\n options.model !== undefined\n ? parseModelFlag(options.model)\n : current.selectedModel;\n\n const avatarUrl = hasAvatar\n ? resolvedAvatarUrl\n : (current.avatarUrl ?? undefined);\n\n await updateZeroAgent(agentId, {\n displayName:\n options.displayName !== undefined\n ? options.displayName\n : (current.displayName ?? undefined),\n description:\n options.description !== undefined\n ? options.description\n : (current.description ?? undefined),\n sound:\n options.sound !== undefined\n ? options.sound\n : (current.sound ?? undefined),\n avatarUrl,\n customSkills,\n modelProviderId,\n selectedModel,\n });\n}\n\nfunction validateSkillName(name: string): void {\n const result = zeroAgentCustomSkillNameSchema.safeParse(name);\n if (!result.success) {\n throw new Error(\n `Invalid skill name \"${name}\": must be 2-64 characters, lowercase alphanumeric and hyphens only (e.g. my-skill)`,\n );\n }\n}\n\nfunction resolveCustomSkills(\n options: { skills?: string; addSkill?: string; removeSkill?: string },\n existing: string[],\n): string[] | undefined {\n if (options.skills && (options.addSkill || options.removeSkill)) {\n throw new Error(\"Cannot use --skills with --add-skill or --remove-skill\");\n }\n\n if (options.skills) {\n const names = options.skills.split(\",\").map((s) => {\n return s.trim();\n });\n for (const name of names) {\n validateSkillName(name);\n }\n return names;\n }\n\n if (options.addSkill) {\n validateSkillName(options.addSkill);\n if (existing.includes(options.addSkill)) {\n throw new Error(\n `Skill \"${options.addSkill}\" is already attached to this agent`,\n );\n }\n return [...existing, options.addSkill];\n }\n\n if (options.removeSkill) {\n if (!existing.includes(options.removeSkill)) {\n throw new Error(\n `Skill \"${options.removeSkill}\" is not attached to this agent`,\n );\n }\n return existing.filter((s) => {\n return s !== options.removeSkill;\n });\n }\n\n return undefined;\n}\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Edit a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--display-name <name>\", \"New display name\")\n .option(\"--description <text>\", \"New description\")\n .option(\n \"--sound <tone>\",\n \"New tone: professional, friendly, direct, supportive\",\n )\n .option(\"--avatar <preset>\", \"Avatar preset: preset:0 through preset:4\")\n .option(\n \"--avatar-rotation <1-5>\",\n \"Head angle: 1=far-left 3=center 5=far-right\",\n )\n .option(\n \"--avatar-skin <tone>\",\n \"Skin tone: light | light-medium | medium | medium-dark | dark\",\n )\n .option(\"--avatar-hair-style <1-5>\", \"Hair style: 1–5\")\n .option(\n \"--avatar-hair-color <color>\",\n \"Hair color: blonde | teal | grey | pink | brown\",\n )\n .option(\n \"--avatar-expression <expr>\",\n \"Expression: calm | content | neutral | pleasant | excited\",\n )\n .option(\"--avatar-intensity <level>\", \"Intensity: chill | normal | hyped\")\n .option(\n \"--skills <items>\",\n \"Comma-separated custom skill names to attach (replaces existing)\",\n )\n .option(\"--add-skill <name>\", \"Add a custom skill to the agent\")\n .option(\"--remove-skill <name>\", \"Remove a custom skill from the agent\")\n .option(\"--instructions-file <path>\", \"Path to new instructions file\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit org default\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit provider default\",\n )\n .addHelpText(\n \"after\",\n `\nAvatar:\n Quick presets (--avatar):\n preset:0 light skin, brown hair, calm, hyped\n preset:1 light-medium skin, grey hair, calm, normal\n preset:2 medium skin, pink hair, neutral, chill\n preset:3 medium-dark skin, blonde hair, pleasant, hyped\n preset:4 dark skin, teal hair, excited, normal\n\n Custom attributes (--avatar-* flags, replace the entire avatar):\n --avatar-rotation 1=far-left 3=center(default) 5=far-right\n --avatar-skin light / light-medium / medium(default) / medium-dark / dark\n --avatar-hair-style 1–5 (default: 1)\n --avatar-hair-color blonde / teal / grey / pink / brown(default)\n --avatar-expression calm(default) / content / neutral / pleasant / excited\n --avatar-intensity chill / normal(default) / hyped\n\n Note: --avatar and --avatar-* cannot be used together.\n\nExamples:\n Update description: zero agent edit <agent-id> --description \"new role\"\n Update tone: zero agent edit <agent-id> --sound friendly\n Quick preset avatar: zero agent edit <agent-id> --avatar preset:2\n Custom avatar: zero agent edit <agent-id> --avatar-skin dark --avatar-hair-color teal --avatar-intensity hyped\n Replace all skills: zero agent edit <agent-id> --skills my-skill,other-skill\n Add a skill: zero agent edit <agent-id> --add-skill my-skill\n Remove a skill: zero agent edit <agent-id> --remove-skill my-skill\n Update instructions: zero agent edit <agent-id> --instructions-file ./instructions.md\n Set model: zero agent edit <agent-id> --model-provider <provider-id> --model MiniMax-M2.7\n Reset model: zero agent edit <agent-id> --model-provider default --model default\n Update yourself: zero agent edit $ZERO_AGENT_ID --description \"new role\"\n\nNotes:\n - At least one option is required\n - Unspecified fields are preserved (not cleared)\n - --skills replaces the entire skill list; --add-skill/--remove-skill modify incrementally\n - --skills cannot be combined with --add-skill or --remove-skill\n - Use 'zero org model-provider list' to see available providers and models\n - To create or edit skill content, use: zero skill --help`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: AgentEditOptions) => {\n const hasAgentUpdate = hasAgentFieldUpdate(options);\n\n if (!hasAgentUpdate && !options.instructionsFile) {\n throw new Error(\n \"At least one option is required (--display-name, --description, --sound, --avatar, --avatar-*, --skills, --add-skill, --remove-skill, --model-provider, --model, --instructions-file)\",\n );\n }\n\n if (hasAgentUpdate) {\n await applyAgentUpdate(agentId, options);\n }\n\n if (options.instructionsFile) {\n const content = readFileSync(options.instructionsFile, \"utf-8\");\n await updateZeroAgentInstructions(agentId, content);\n }\n\n console.log(chalk.green(`✓ Agent \"${agentId}\" updated`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroAgent,\n getZeroAgentInstructions,\n getZeroAgentUserConnectors,\n listZeroConnectors,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"@vm0/connectors/firewall-types\";\nimport type { ConnectorResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { policyIcon } from \"../../../lib/utils/format-utils\";\nimport { formatAvatar } from \"./avatar\";\n\ninterface ConnectorPermissionInfo {\n type: string;\n hasPermissions: boolean;\n permissions: Array<{ name: string; description?: string }>;\n policies: Record<string, FirewallPolicyValue> | null;\n unknownPolicy: FirewallPolicyValue;\n allowed: number;\n total: number;\n}\n\nfunction getConnectorPermissionInfo(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): ConnectorPermissionInfo {\n if (!isFirewallConnectorType(type)) {\n return {\n type,\n hasPermissions: false,\n permissions: [],\n policies: null,\n unknownPolicy: \"allow\",\n allowed: 0,\n total: 0,\n };\n }\n\n const refPolicy = resolvedPolicies?.[type];\n const policies =\n refPolicy && Object.keys(refPolicy.policies).length > 0\n ? refPolicy.policies\n : null;\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n const total = permissions.length;\n const allowed = policies\n ? permissions.filter((p) => {\n return policies[p.name] === \"allow\";\n }).length\n : 0;\n\n const unknownPolicy = refPolicy?.unknownPolicy ?? \"allow\";\n return {\n type,\n hasPermissions: true,\n permissions,\n policies,\n unknownPolicy,\n allowed,\n total,\n };\n}\n\nfunction printDetailedPermissions(info: ConnectorPermissionInfo): void {\n if (!info.policies) {\n const icon = policyIcon(info.unknownPolicy);\n console.log(` ${icon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...info.permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of info.permissions) {\n const policy = info.policies[perm.name] ?? \"deny\";\n const desc = perm.description ?? \"\";\n console.log(\n ` ${policyIcon(policy)} ${perm.name.padEnd(nameWidth)} ${desc}`,\n );\n }\n\n const unknownIcon = policyIcon(info.unknownPolicy);\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nfunction formatConnectorIdentity(\n connector: ConnectorResponse | undefined,\n): string {\n if (!connector) return \"\";\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"\";\n}\n\nfunction formatConnectorSummary(\n info: ConnectorPermissionInfo,\n identity?: ConnectorResponse,\n): string {\n const id = formatConnectorIdentity(identity);\n const idStr = id ? ` ${id}` : \"\";\n if (!info.hasPermissions) return `${info.type}${idStr}`;\n if (!info.policies) return `${info.type}${idStr} (full access)`;\n return `${info.type}${idStr} (${info.allowed}/${info.total} allowed)`;\n}\n\nfunction formatDetailIdentity(\n connector: ConnectorResponse | undefined,\n): string {\n if (!connector) return \"\";\n let identity = \"\";\n if (connector.externalUsername && connector.externalEmail) {\n identity = `@${connector.externalUsername} (${connector.externalEmail})`;\n } else if (connector.externalUsername) {\n identity = `@${connector.externalUsername}`;\n } else if (connector.externalEmail) {\n identity = connector.externalEmail;\n }\n if (!identity) return \"\";\n if (connector.needsReconnect) {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"--instructions\", \"Also show instructions content\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n View basic info: zero agent view <agent-id>\n Include instructions: zero agent view <agent-id> --instructions\n Show permissions: zero agent view <agent-id> --permissions\n View yourself: zero agent view $ZERO_AGENT_ID --instructions`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n options: { instructions?: boolean; permissions?: boolean },\n ) => {\n const [agent, connectorTypes, connectorIdentities] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n listZeroConnectors().catch(() => {\n return { connectors: [] as ConnectorResponse[] };\n }),\n ]);\n\n const identityMap = new Map<string, ConnectorResponse>(\n connectorIdentities.connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n console.log(chalk.bold(agent.agentId));\n if (agent.displayName) console.log(chalk.dim(agent.displayName));\n console.log();\n console.log(`Agent ID: ${agent.agentId}`);\n\n const resolvedPolicies = resolveFirewallPolicies(\n agent.permissionPolicies,\n connectorTypes,\n );\n\n const connectorInfos = connectorTypes.map((type) => {\n return getConnectorPermissionInfo(type, resolvedPolicies);\n });\n\n if (connectorInfos.length > 0) {\n const summaries = connectorInfos.map((info) => {\n return formatConnectorSummary(info, identityMap.get(info.type));\n });\n console.log(`Connectors: ${summaries.join(\", \")}`);\n }\n\n if (agent.customSkills?.length > 0) {\n console.log(`Skills: ${agent.customSkills.join(\", \")}`);\n }\n if (agent.description)\n console.log(`Description: ${agent.description}`);\n if (agent.sound) console.log(`Sound: ${agent.sound}`);\n const avatar = formatAvatar(agent.avatarUrl);\n if (avatar) console.log(`Avatar: ${avatar}`);\n\n if (options.permissions && connectorInfos.length > 0) {\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const info of connectorInfos) {\n const identity = formatDetailIdentity(identityMap.get(info.type));\n console.log(` ${info.type.padEnd(14)}${identity}`);\n if (info.hasPermissions) {\n printDetailedPermissions(info);\n }\n }\n }\n\n if (options.instructions) {\n console.log();\n const result = await getZeroAgentInstructions(agentId);\n if (result.content) {\n console.log(chalk.dim(\"── Instructions ──\"));\n console.log(result.content);\n } else {\n console.log(chalk.dim(\"No instructions set\"));\n }\n }\n },\n ),\n );\n","import chalk from \"chalk\";\nimport type { FirewallPolicyValue } from \"@vm0/connectors/firewall-types\";\n\nexport function policyIcon(policy: FirewallPolicyValue): string {\n if (policy === \"allow\") return chalk.green(\"✓\");\n if (policy === \"ask\") return chalk.yellow(\"?\");\n return chalk.dim(\"✗\");\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroAgents } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero agents\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero agent list\n\nNotes:\n - Use this to discover teammate agent IDs before delegating with \"zero run\"`,\n )\n .action(\n withErrorHandler(async () => {\n const agents = await listZeroAgents();\n\n if (agents.length === 0) {\n console.log(chalk.dim(\"No zero agents found\"));\n console.log(\n chalk.dim(\n ' Create one with: zero agent create --display-name \"My Agent\"',\n ),\n );\n return;\n }\n\n const idWidth = Math.max(\n 8,\n ...agents.map((a) => {\n return a.agentId.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...agents.map((a) => {\n return (a.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"AGENT ID\".padEnd(idWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const agent of agents) {\n const row = [\n agent.agentId.padEnd(idWidth),\n (agent.displayName ?? \"-\").padEnd(displayWidth),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroAgent, deleteZeroAgent } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero agent delete <agent-id>\n zero agent delete <agent-id> -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (agentId: string, options: { yes?: boolean }) => {\n await getZeroAgent(agentId);\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete zero agent '${agentId}'?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroAgent(agentId);\n console.log(chalk.green(`✓ Agent \"${agentId}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { statusCommand } from \"./status\";\n\nexport const zeroConnectorCommand = new Command()\n .name(\"connector\")\n .description(\"Check third-party service connections (GitHub, Slack, etc.)\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .addCommand(statusCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all connectors and their status\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const allTypesRaw = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n const allTypes: ConnectorType[] = [];\n for (const type of allTypesRaw) {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n if (\n flag &&\n !isFeatureEnabled(flag, { orgId }) &&\n (!hasApiToken || config.strictFeatureFlag)\n ) {\n continue;\n }\n allTypes.push(type);\n }\n\n const typeWidth = Math.max(\n 4,\n ...allTypes.map((t) => {\n return t.length;\n }),\n );\n\n const connectedAsHeader = \"CONNECTED AS\";\n const connectedCells = allTypes.map((type) => {\n return renderConnectedAsCell(connectedMap.get(type));\n });\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const authorizedHeader = agentCtx\n ? `AUTHORIZED FOR ${agentCtx.displayName}`\n : null;\n\n // Print header\n const headerParts = [\n \"TYPE\".padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (authorizedHeader) headerParts.push(authorizedHeader);\n console.log(chalk.dim(headerParts.join(\" \")));\n\n // Print rows\n for (let i = 0; i < allTypes.length; i++) {\n const type = allTypes[i]!;\n const connectedCell = padEndAnsi(connectedCells[i]!, connectedAsWidth);\n const parts = [type.padEnd(typeWidth), connectedCell];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n }),\n );\n","import { getZeroAgent, getZeroAgentUserConnectors } from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedTypes: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledTypes] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedTypes: new Set(enabledTypes),\n };\n}\n","import chalk from \"chalk\";\nimport { hasRequiredScopes } from \"@vm0/connectors/connector-utils\";\nimport type { ConnectorListResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\n\ntype Connector = ConnectorListResponse[\"connectors\"][number];\n\nfunction renderIdentity(connector: Connector): string {\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n return \"-\";\n}\n\nexport function renderConnectedAsCell(\n connector: Connector | undefined,\n): string {\n if (!connector) return chalk.dim(\"(not connected)\");\n const identity = renderIdentity(connector);\n if (connector.needsReconnect) {\n return chalk.yellow(`${identity} (reconnect needed)`);\n }\n const scopeMismatch =\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(connector.type, connector.oauthScopes);\n if (scopeMismatch) {\n return chalk.yellow(`${identity} (permissions update available)`);\n }\n return identity;\n}\n\nconst ESC = \"\\u001b\";\nconst ANSI_PATTERN = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_PATTERN, \"\");\n}\n\nexport function padEndAnsi(s: string, width: number): string {\n const visible = stripAnsi(s).length;\n return s + \" \".repeat(Math.max(0, width - visible));\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport { searchConnectors } from \"@vm0/connectors/connector-utils\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport { listZeroConnectors } from \"../../../lib/api\";\nimport { getActiveOrg } from \"../../../lib/api/config\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { padEndAnsi, renderConnectedAsCell, stripAnsi } from \"./connected-as\";\n\nconst DEFAULT_LIMIT = 5;\nconst EXACT_MATCH_THRESHOLD = 80;\n\nfunction parseLimit(raw: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--limit must be a positive integer, got \"${raw}\".`);\n }\n return n;\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search connectors by type, label, env var, secret, or tag\")\n .argument(\"<keyword>\", \"Search keyword (case-insensitive)\")\n .option(\"--agent <id>\", \"Show per-agent authorization column\")\n .option(\n \"--limit <n>\",\n `Maximum number of results to display (default ${DEFAULT_LIMIT})`,\n parseLimit,\n DEFAULT_LIMIT,\n )\n .action(\n withErrorHandler(\n async (keyword: string, options: { agent?: string; limit: number }) => {\n const trimmed = keyword.trim();\n if (!trimmed) {\n throw new Error(\"Keyword cannot be empty.\");\n }\n\n const [{ connectors }, orgId, agentCtx] = await Promise.all([\n listZeroConnectors(),\n getActiveOrg(),\n resolveAgentContext(options.agent),\n ]);\n const connectedMap = new Map(\n connectors.map((c) => {\n return [c.type, c];\n }),\n );\n\n const isTypeAvailable = (type: ConnectorType): boolean => {\n const config = CONNECTOR_TYPES[type];\n const flag = config.featureFlag;\n const hasApiToken = \"api-token\" in config.authMethods;\n return (\n !flag ||\n isFeatureEnabled(flag, { orgId }) ||\n (hasApiToken && !config.strictFeatureFlag)\n );\n };\n\n const { results, total } = searchConnectors(\n trimmed,\n options.limit,\n isTypeAvailable,\n );\n\n if (results.length === 0) {\n console.log(\"No matches found.\");\n return;\n }\n\n const topScore = results[0]!.score;\n if (topScore < EXACT_MATCH_THRESHOLD) {\n console.log(\"No exact match. Showing closest:\");\n }\n if (total > options.limit) {\n console.log(`Too many results (top ${options.limit} of ${total}):`);\n }\n\n const typeHeader = \"TYPE\";\n const connectedAsHeader = \"CONNECTED AS\";\n\n const connectedCells = results.map((r) => {\n return renderConnectedAsCell(connectedMap.get(r.type));\n });\n\n const typeWidth = Math.max(\n typeHeader.length,\n ...results.map((r) => {\n return r.type.length;\n }),\n );\n const connectedAsWidth = Math.max(\n connectedAsHeader.length,\n ...connectedCells.map((c) => {\n return stripAnsi(c).length;\n }),\n );\n\n const headerParts = [\n typeHeader.padEnd(typeWidth),\n connectedAsHeader.padEnd(connectedAsWidth),\n ];\n if (agentCtx) {\n headerParts.push(`AUTHORIZED FOR ${agentCtx.displayName}`);\n }\n console.log(chalk.dim(headerParts.join(\" \")));\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n const parts = [\n result.type.padEnd(typeWidth),\n padEndAnsi(connectedCells[i]!, connectedAsWidth),\n ];\n if (agentCtx) {\n parts.push(\n agentCtx.authorizedTypes.has(result.type)\n ? chalk.green(\"✓\")\n : chalk.dim(\"-\"),\n );\n }\n console.log(parts.join(\" \"));\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n connectorTypeSchema,\n} from \"@vm0/connectors/connectors\";\nimport {\n getScopeDiff,\n hasRequiredScopes,\n} from \"@vm0/connectors/connector-utils\";\nimport { getZeroConnector } from \"../../../lib/api\";\nimport { formatDateTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"./agent-context\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\n\nconst LABEL_WIDTH = 16;\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a connector\")\n .argument(\"<type>\", \"Connector type (e.g., github)\")\n .option(\"--agent <id>\", \"Show authorization state for the given agent\")\n .action(\n withErrorHandler(async (type: string, options: { agent?: string }) => {\n const parseResult = connectorTypeSchema.safeParse(type);\n if (!parseResult.success) {\n const available = Object.keys(CONNECTOR_TYPES).join(\", \");\n throw new Error(`Unknown connector type: ${type}`, {\n cause: new Error(`Available connectors: ${available}`),\n });\n }\n\n const [connector, agentCtx] = await Promise.all([\n getZeroConnector(parseResult.data),\n resolveAgentContext(options.agent),\n ]);\n\n console.log(`Connector: ${chalk.cyan(type)}`);\n console.log();\n\n if (connector) {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.green(\"connected\")}`,\n );\n console.log(\n `${\"Account:\".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`,\n );\n console.log(\n `${\"Auth Method:\".padEnd(LABEL_WIDTH)}${connector.authMethod}`,\n );\n\n if (connector.oauthScopes && connector.oauthScopes.length > 0) {\n console.log(\n `${\"OAuth Scopes:\".padEnd(LABEL_WIDTH)}${connector.oauthScopes.join(\", \")}`,\n );\n }\n\n if (\n connector.authMethod === \"oauth\" &&\n !hasRequiredScopes(parseResult.data, connector.oauthScopes)\n ) {\n const diff = getScopeDiff(parseResult.data, connector.oauthScopes);\n console.log(\n `${\"Permissions:\".padEnd(LABEL_WIDTH)}${chalk.yellow(\"update available\")}`,\n );\n if (diff.addedScopes.length > 0) {\n console.log(\n `${\" Added:\".padEnd(LABEL_WIDTH)}${diff.addedScopes.join(\", \")}`,\n );\n }\n if (diff.removedScopes.length > 0) {\n console.log(\n `${\" Removed:\".padEnd(LABEL_WIDTH)}${diff.removedScopes.join(\", \")}`,\n );\n }\n }\n\n console.log(\n `${\"Connected:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.createdAt)}`,\n );\n\n if (connector.updatedAt !== connector.createdAt) {\n console.log(\n `${\"Last Updated:\".padEnd(LABEL_WIDTH)}${formatDateTime(connector.updatedAt)}`,\n );\n }\n } else {\n console.log(\n `${\"Status:\".padEnd(LABEL_WIDTH)}${chalk.dim(\"not connected\")}`,\n );\n }\n\n if (agentCtx) {\n const authorized = agentCtx.authorizedTypes.has(parseResult.data);\n const isConnected = connector !== null;\n const agentLabel =\n agentCtx.displayName === agentCtx.agentId\n ? agentCtx.agentId\n : `${agentCtx.displayName} (${agentCtx.agentId})`;\n\n console.log();\n if (authorized) {\n console.log(\n `The ${parseResult.data} connector is authorized for agent ${agentLabel}.`,\n );\n } else if (!isConnected) {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/connect?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not connected. Once connected, it will be authorized for agent ${agentLabel}.`,\n );\n console.log(`Connect it at: [Connect ${parseResult.data}](${url})`);\n } else {\n const origin = await getPlatformOrigin();\n const url = `${origin}/connectors/${parseResult.data}/authorize?agentId=${agentCtx.agentId}`;\n console.log(\n `The ${parseResult.data} connector is not authorized for agent ${agentLabel}.`,\n );\n console.log(\n `Authorize it at: [Authorize ${parseResult.data}](${url})`,\n );\n }\n }\n }),\n );\n","/**\n * Format a date string as relative time (e.g., \"in 2h\", \"3d ago\")\n */\nexport function formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffAbs = Math.abs(diffMs);\n\n const minutes = Math.floor(diffAbs / (1000 * 60));\n const hours = Math.floor(diffAbs / (1000 * 60 * 60));\n const days = Math.floor(diffAbs / (1000 * 60 * 60 * 24));\n\n const isPast = diffMs < 0;\n\n if (days > 0) {\n return isPast ? `${days}d ago` : `in ${days}d`;\n } else if (hours > 0) {\n return isPast ? `${hours}h ago` : `in ${hours}h`;\n } else if (minutes > 0) {\n return isPast ? `${minutes}m ago` : `in ${minutes}m`;\n } else {\n return isPast ? \"just now\" : \"soon\";\n }\n}\n\n/**\n * Format a date string with both absolute and relative time\n * e.g., \"2025-01-14 09:00 (in 2h)\"\n * Uses local timezone, but doesn't include timezone in output (shown separately)\n */\nexport function formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"-\";\n\n const date = new Date(dateStr);\n\n // Format: YYYY-MM-DD HH:MM (no seconds, no timezone - shown separately)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n const formatted = `${year}-${month}-${day} ${hours}:${minutes}`;\n const relative = formatRelativeTime(dateStr);\n\n return `${formatted} (${relative})`;\n}\n\n/**\n * Frequency type for schedule wizard\n */\nexport type ScheduleFrequency =\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"once\"\n | \"loop\";\n\n/**\n * Generate cron expression from user-friendly inputs\n * @param frequency - Schedule frequency type\n * @param time - Time in HH:MM format (24-hour)\n * @param day - Day of week (0-6, Sun=0) for weekly, or day of month (1-31) for monthly\n * @returns Cron expression string\n */\nexport function generateCronExpression(\n frequency: Exclude<ScheduleFrequency, \"once\" | \"loop\">,\n time: string,\n day?: number,\n): string {\n const [hourStr, minuteStr] = time.split(\":\");\n const hour = parseInt(hourStr ?? \"0\", 10);\n const minute = parseInt(minuteStr ?? \"0\", 10);\n\n switch (frequency) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekly\":\n return `${minute} ${hour} * * ${day ?? 1}`;\n case \"monthly\":\n return `${minute} ${hour} ${day ?? 1} * *`;\n }\n}\n\n/**\n * Detect system timezone using Intl API\n * @returns IANA timezone identifier (e.g., \"America/New_York\")\n */\nexport function detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate time format (HH:MM, 24-hour)\n * @param time - Time string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateTimeFormat(time: string): boolean | string {\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use HH:MM (e.g., 09:00)\";\n }\n\n const hour = parseInt(match[1]!, 10);\n const minute = parseInt(match[2]!, 10);\n\n if (hour < 0 || hour > 23) {\n return \"Hour must be 0-23\";\n }\n if (minute < 0 || minute > 59) {\n return \"Minute must be 0-59\";\n }\n if (minute % 5 !== 0) {\n return \"Minute must be a multiple of 5 (0, 5, 10, ..., 55)\";\n }\n\n return true;\n}\n\n/**\n * Validate date format (YYYY-MM-DD)\n * @param date - Date string to validate\n * @returns true if valid, error message if invalid\n */\nexport function validateDateFormat(date: string): boolean | string {\n const match = date.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) {\n return \"Invalid format. Use YYYY-MM-DD (e.g., 2025-01-15)\";\n }\n\n const year = parseInt(match[1]!, 10);\n const month = parseInt(match[2]!, 10);\n const day = parseInt(match[3]!, 10);\n\n if (year < 2000 || year > 2100) {\n return \"Year must be between 2000 and 2100\";\n }\n if (month < 1 || month > 12) {\n return \"Month must be 1-12\";\n }\n if (day < 1 || day > 31) {\n return \"Day must be 1-31\";\n }\n\n // Validate the date is actually valid (e.g., not Feb 30)\n const testDate = new Date(year, month - 1, day);\n if (\n testDate.getFullYear() !== year ||\n testDate.getMonth() !== month - 1 ||\n testDate.getDate() !== day\n ) {\n return \"Invalid date\";\n }\n\n return true;\n}\n\n/**\n * Get tomorrow's date in local timezone as YYYY-MM-DD\n * @returns Date string in YYYY-MM-DD format\n */\nexport function getTomorrowDateLocal(): string {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n const year = tomorrow.getFullYear();\n const month = String(tomorrow.getMonth() + 1).padStart(2, \"0\");\n const day = String(tomorrow.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Get current time in local timezone as HH:MM\n * @returns Time string in HH:MM format\n */\nexport function getCurrentTimeLocal(): string {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\n/**\n * Convert a human-readable datetime string to ISO format\n * Supports formats: \"YYYY-MM-DD HH:MM\" or full ISO string\n * @param dateTimeStr - DateTime string (e.g., \"2025-01-15 14:30\")\n * @returns ISO format string (e.g., \"2025-01-15T14:30:00.000Z\")\n */\nexport function toISODateTime(dateTimeStr: string): string {\n // If already in ISO format, return as-is\n if (dateTimeStr.includes(\"T\") && dateTimeStr.endsWith(\"Z\")) {\n return dateTimeStr;\n }\n\n // Convert \"YYYY-MM-DD HH:MM\" to ISO\n const isoStr = dateTimeStr.replace(\" \", \"T\") + \":00\";\n const date = new Date(isoStr);\n return date.toISOString();\n}\n","import { getApiUrl } from \"../../../lib/api/config\";\n\n/**\n * Transform the API host to the platform (app) host.\n *\n * www.vm0.ai → app.vm0.ai\n * platform.vm0.ai → app.vm0.ai\n * tunnel-user-host-www.vm7.ai → tunnel-user-host-app.vm7.ai\n * custom.example.com → app.custom.example.com\n */\nexport function toPlatformUrl(apiUrl: string): URL {\n const parsed = new URL(apiUrl);\n const parts = parsed.hostname.split(\".\");\n if (parts[0]!.endsWith(\"-www\")) {\n parts[0] = parts[0]!.slice(0, -\"-www\".length) + \"-app\";\n } else if (parts[0] === \"www\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else if (parts[0] !== \"app\" && parts[0] !== \"localhost\") {\n parts.unshift(\"app\");\n }\n parsed.hostname = parts.join(\".\");\n return parsed;\n}\n\nexport async function getPlatformOrigin(): Promise<string> {\n const apiUrl = await getApiUrl();\n return toPlatformUrl(apiUrl).origin;\n}\n","import { Command } from \"commander\";\nimport { checkConnectorCommand } from \"./check-connector\";\nimport { generateCommand } from \"./generate\";\nimport { permissionDenyCommand } from \"./permission-deny\";\nimport { permissionChangeCommand } from \"./permission-change\";\n\nexport const zeroDoctorCommand = new Command()\n .name(\"doctor\")\n .description(\"Diagnose runtime issues (connector health, permission denials)\")\n .addCommand(checkConnectorCommand)\n .addCommand(generateCommand)\n .addCommand(permissionDenyCommand)\n .addCommand(permissionChangeCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Check a connector? zero doctor check-connector --env-name GITHUB_TOKEN\n Check a URL? zero doctor check-connector --url https://api.github.com/repos/owner/repo\n Generate with image? zero doctor generate image\n Check with permission? zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n Permission denied? zero doctor permission-deny github --method GET --path /repos/owner/repo\n Change a permission? zero doctor permission-change github --permission contents:read --enable\n\nNotes:\n - Use this when your task fails due to a missing environment variable or permission denial\n - The doctor will identify the issue and give the user a link to resolve it`,\n );\n","import { Command, Option } from \"commander\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport {\n getConnectorEnvironmentMapping,\n getConnectorTypeForSecretName,\n} from \"@vm0/connectors/connector-utils\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport { extractSecretNamesFromApis } from \"@vm0/connectors/firewall-types\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport type {\n FirewallConfig,\n NetworkPolicies,\n} from \"@vm0/connectors/firewall-types\";\nimport type { RunContextResponse } from \"@vm0/api-contracts/contracts/zero-runs\";\nimport { getApiUrl } from \"../../../lib/api/config\";\nimport { getZeroConnector } from \"../../../lib/api/domains/zero-connectors\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { getZeroRunContext } from \"../../../lib/api/domains/zero-runs\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { toPlatformUrl } from \"./platform-url\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\n\ninterface CheckConnectorOptions {\n envName?: string;\n url?: string;\n method: string;\n checkPermission?: string;\n}\n\ninterface DiagContext {\n envName: string;\n connectorType: string;\n label: string;\n platformOrigin: string;\n agentId: string | undefined;\n}\n\ninterface UrlLookupResult {\n connectorType: string;\n envName: string;\n matchedBase: string;\n relativePath: string;\n}\n\n/**\n * Reverse-lookup a full URL to find which connector handles it.\n * Iterates all connector firewall configs and checks if the URL\n * starts with any registered base URL (scheme + host + optional path prefix).\n */\nfunction resolveConnectorFromUrl(url: string): UrlLookupResult | null {\n const allTypes = Object.keys(CONNECTOR_TYPES) as ConnectorType[];\n\n // Normalize: strip trailing slash for comparison\n const normalized = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\n let bestMatch: {\n connectorType: string;\n base: string;\n config: FirewallConfig;\n } | null = null;\n\n for (const type of allTypes) {\n if (!isFirewallConnectorType(type)) continue;\n const config = getConnectorFirewall(type);\n for (const api of config.apis) {\n const base = api.base.endsWith(\"/\") ? api.base.slice(0, -1) : api.base;\n // URL must match the base exactly or have the base as a prefix followed by /\n if (normalized === base || normalized.startsWith(base + \"/\")) {\n // Pick the longest (most specific) base URL match\n if (!bestMatch || base.length > bestMatch.base.length) {\n bestMatch = { connectorType: type, base, config };\n }\n }\n }\n }\n\n if (!bestMatch) return null;\n\n // Derive the env var name from the connector's environment mapping\n const mapping = getConnectorEnvironmentMapping(\n bestMatch.connectorType as ConnectorType,\n );\n const envName = Object.keys(mapping)[0];\n if (!envName) return null;\n\n const relativePath =\n normalized === bestMatch.base\n ? \"/\"\n : normalized.slice(bestMatch.base.length);\n\n return {\n connectorType: bestMatch.connectorType,\n envName,\n matchedBase: bestMatch.base,\n relativePath,\n };\n}\n\nfunction checkEnvVariable(ctx: DiagContext): boolean {\n console.log(\"## Step 1: Sandbox environment variable\");\n console.log(\"\");\n const envPresent = Boolean(process.env[ctx.envName]);\n console.log(\n `Checking process.env.${ctx.envName}: ${envPresent ? \"present\" : \"not present\"}`,\n );\n if (envPresent) {\n console.log(\n \"A placeholder value is present in the sandbox environment. This value is not the real credential — it is a stand-in that gets replaced at the network boundary when requests are sent to registered base URLs.\",\n );\n } else {\n console.log(\n \"No value found for this environment variable. Note: credential replacement at the network boundary is independent of this variable — the proxy injects auth headers based on the destination URL, not the presence of this env var.\",\n );\n }\n console.log(\"\");\n return envPresent;\n}\n\nasync function checkConnectorStatus(ctx: DiagContext): Promise<{\n isConnected: boolean;\n isExpired: boolean;\n hasPermission: boolean;\n}> {\n console.log(\"## Step 2: Connector configuration\");\n console.log(\"\");\n console.log(\n \"A Connector holds the real credentials (OAuth tokens or API keys) for an external service. These credentials are never injected into the sandbox. Instead, when the sandbox sends an HTTP request to a base URL registered by the Connector, the network boundary intercepts the request and replaces the auth headers with real credentials. For this to work, three conditions must be met:\",\n );\n console.log(\"\");\n\n const [connector, enabledTypes] = await Promise.all([\n getZeroConnector(ctx.connectorType as ConnectorType),\n ctx.agentId\n ? getZeroAgentUserConnectors(ctx.agentId)\n : Promise.resolve(null),\n ]);\n\n const isConnected = connector !== null;\n const isExpired = connector?.needsReconnect === true;\n const hasPermission =\n enabledTypes !== null && enabledTypes.includes(ctx.connectorType);\n\n // 2a: Connector status — user must have configured the connector (OAuth or API token)\n console.log(\n `### 2a: Connector status (user must configure via OAuth login or API key)`,\n );\n console.log(\"\");\n if (!isConnected) {\n console.log(`The ${ctx.label} connector is not connected.`);\n if (!ctx.agentId) {\n // No agentId: can't scope the authorize page, so fall back to a plain\n // connect link. With agentId, 2b's Authorize link performs the initial\n // OAuth connect before granting permission — one link covers both steps.\n const connectUrl = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/connect`;\n console.log(`Connect it at: [Connect ${ctx.label}](${connectUrl})`);\n }\n } else if (isExpired) {\n const url = `${ctx.platformOrigin}/connectors`;\n console.log(\n `The ${ctx.label} connector is connected but has expired and needs to be reconnected.`,\n );\n console.log(`Reconnect it at: [Reconnect ${ctx.label}](${url})`);\n } else {\n console.log(`The ${ctx.label} connector is connected and active.`);\n }\n console.log(\"\");\n\n // 2b: Agent authorization — user must authorize the agent to use this connector\n console.log(\n `### 2b: Agent authorization (user must authorize agent to use this connector)`,\n );\n console.log(\"\");\n if (!ctx.agentId) {\n console.log(\"ZERO_AGENT_ID is not set — cannot check agent authorization.\");\n } else if (isExpired) {\n // The /authorize page treats an expired connector as \"already connected\"\n // and won't re-trigger OAuth. Defer to 2a's Reconnect link in that case.\n console.log(\n `Skipped — agent authorization can only be checked once the ${ctx.label} connector is reconnected (see 2a).`,\n );\n } else if (hasPermission) {\n console.log(`The ${ctx.label} connector is authorized for this agent.`);\n } else {\n const url = `${ctx.platformOrigin}/connectors/${ctx.connectorType}/authorize?agentId=${ctx.agentId}`;\n console.log(\n isConnected\n ? `The ${ctx.label} connector is not authorized for this agent (${ctx.agentId}).`\n : `The ${ctx.label} connector needs to be connected and authorized for this agent (${ctx.agentId}).`,\n );\n console.log(`Authorize it at: [Authorize ${ctx.label}](${url})`);\n }\n console.log(\"\");\n\n return { isConnected, isExpired, hasPermission };\n}\n\nasync function checkConnectorDomains(\n ctx: DiagContext,\n): Promise<NetworkPolicies | null> {\n // 2c: Registered base URLs — connector defines which URL prefixes get credential replacement\n console.log(\n `### 2c: Registered base URLs (credential replacement only applies to URLs matching these prefixes)`,\n );\n console.log(\"\");\n\n const payload = decodeZeroTokenPayload();\n const runId = payload?.runId;\n\n if (!runId) {\n console.log(\n \"Cannot determine run ID from ZERO_TOKEN — skipping base URL check.\",\n );\n console.log(\"\");\n return null;\n }\n\n const runContext = await getZeroRunContext(runId);\n\n printConnectorDomains(ctx, runContext);\n console.log(\"\");\n return runContext.networkPolicies;\n}\n\nfunction printConnectorDomains(\n ctx: DiagContext,\n runContext: RunContextResponse,\n): void {\n const matchingEntry = runContext.firewalls.find((fw) => {\n return fw.name === ctx.connectorType;\n });\n\n if (!matchingEntry) {\n console.log(\n `No configuration found for the ${ctx.label} connector in this run.`,\n );\n console.log(\n \"This means no base URLs are registered for credential replacement for this connector.\",\n );\n return;\n }\n\n console.log(\n `The ${ctx.label} connector is configured for this run with the following base URLs:`,\n );\n for (const api of matchingEntry.apis) {\n console.log(` - ${api.base}`);\n }\n console.log(\"\");\n console.log(\n \"When the sandbox sends an HTTP request matching one of these URL prefixes, the network boundary intercepts the request and injects real credentials into the auth headers.\",\n );\n\n if (isFirewallConnectorType(ctx.connectorType)) {\n const firewallConfig = getConnectorFirewall(ctx.connectorType);\n const secretNames = extractSecretNamesFromApis(firewallConfig.apis);\n if (secretNames.length > 0) {\n console.log(`Credentials resolved from: ${secretNames.join(\", \")}`);\n }\n }\n}\n\nfunction checkPermissionPolicy(\n connectorType: string,\n label: string,\n permissionName: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check\");\n console.log(\"\");\n console.log(\n `Checking permission: \"${permissionName}\" for the ${label} connector.`,\n );\n console.log(\n `Beyond credential replacement, the ${label} connector enforces permission policies on each API path. A request either matches a named permission or falls through to the unknown-endpoint policy.`,\n );\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check permission status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector in this run's network policies.`,\n );\n console.log(\n \"When a connector has no policy entry, all requests are fully permissive (allowed).\",\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n const isInAllow = connectorPolicies.allow.includes(permissionName);\n const isInDeny = connectorPolicies.deny.includes(permissionName);\n\n if (isInAllow) {\n console.log(\n `Result: \"${permissionName}\" is in the allow list. Requests matching this permission are allowed.`,\n );\n } else if (isInDeny) {\n console.log(\n `Result: \"${permissionName}\" is in the deny list. Requests matching this permission are denied.`,\n );\n } else {\n console.log(\n `Result: \"${permissionName}\" is not in any permission list. It will be handled by the unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n console.log(\"\");\n}\n\n/**\n * When --url is provided, auto-detect the matching permission by running\n * the URL's relative path against the connector's firewall rules.\n */\nfunction resolvePermissionFromUrl(\n connectorType: string,\n label: string,\n method: string,\n relativePath: string,\n matchedBase: string,\n networkPolicies: NetworkPolicies | null,\n): void {\n console.log(\"## Step 3: Permission policy check (auto-detected from URL)\");\n console.log(\"\");\n console.log(\n `Matching ${method} ${relativePath} (relative to base URL ${matchedBase}) against the ${label} connector's permission rules.`,\n );\n console.log(\"\");\n\n if (!isFirewallConnectorType(connectorType)) {\n console.log(\n `The ${label} connector does not have permission rules defined.`,\n );\n console.log(\"\");\n return;\n }\n\n const config = getConnectorFirewall(connectorType);\n const matchedPermissions = findMatchingPermissions(\n method,\n relativePath,\n config,\n );\n\n if (matchedPermissions.length === 0) {\n console.log(\n `No named permission matches ${method} ${relativePath}. This request falls through to the unknown-endpoint policy.`,\n );\n } else {\n console.log(`Matched permissions: [${matchedPermissions.join(\", \")}]`);\n }\n console.log(\"\");\n\n if (!networkPolicies) {\n console.log(\n \"Network policies are not available for this run — cannot check allow/deny status.\",\n );\n console.log(\"\");\n return;\n }\n\n const connectorPolicies = networkPolicies[connectorType];\n\n if (!connectorPolicies) {\n console.log(\n `No policy entry found for the ${label} connector. All requests are fully permissive (allowed).`,\n );\n console.log(\"\");\n return;\n }\n\n console.log(`Permission policies for the ${label} connector:`);\n console.log(` allow list: [${connectorPolicies.allow.join(\", \")}]`);\n console.log(` deny list: [${connectorPolicies.deny.join(\", \")}]`);\n console.log(` unknown endpoint policy: ${connectorPolicies.unknownPolicy}`);\n console.log(\"\");\n\n if (matchedPermissions.length === 0) {\n console.log(\n `Result: No permission matched. The unknown endpoint policy applies: ${connectorPolicies.unknownPolicy}.`,\n );\n } else {\n for (const perm of matchedPermissions) {\n const isInAllow = connectorPolicies.allow.includes(perm);\n const isInDeny = connectorPolicies.deny.includes(perm);\n if (isInAllow) {\n console.log(`Result: \"${perm}\" is in the allow list — allowed.`);\n } else if (isInDeny) {\n console.log(`Result: \"${perm}\" is in the deny list — denied.`);\n } else {\n console.log(\n `Result: \"${perm}\" is not in any list — falls through to unknown endpoint policy: ${connectorPolicies.unknownPolicy}.`,\n );\n }\n }\n }\n console.log(\"\");\n}\n\nexport const checkConnectorCommand = new Command()\n .name(\"check-connector\")\n .description(\n \"Diagnose connector health: environment variable, connector configuration, and permission policies\",\n )\n .addOption(\n new Option(\n \"--env-name <ENV_NAME>\",\n \"The environment variable name to check (e.g. GITHUB_TOKEN)\",\n ),\n )\n .addOption(\n new Option(\n \"--url <URL>\",\n \"A full URL to diagnose — auto-detects the connector, env var, and permission (e.g. https://api.github.com/repos/owner/repo)\",\n ),\n )\n .addOption(\n new Option(\n \"--method <METHOD>\",\n \"HTTP method to use when matching permissions with --url (default: GET)\",\n ).default(\"GET\"),\n )\n .addOption(\n new Option(\n \"--check-permission <name>\",\n \"Check whether a specific permission is allowed or denied (e.g. contents:read)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor check-connector --env-name GITHUB_TOKEN\n zero doctor check-connector --url https://api.github.com/repos/owner/repo\n zero doctor check-connector --url https://slack.com/api/chat.postMessage --method POST\n zero doctor check-connector --env-name SLACK_TOKEN --check-permission chat:write\n\nHow connectors work:\n A Connector holds the real credentials for an external service. These credentials\n are never injected into the sandbox. Instead, when the sandbox sends an HTTP\n request to a base URL registered by the Connector, the network boundary intercepts\n the request and replaces the auth headers with real credentials.\n\n This command checks each part of that pipeline and reports what it finds.`,\n )\n .action(\n withErrorHandler(async (opts: CheckConnectorOptions) => {\n if (!opts.envName && !opts.url) {\n throw new Error(\n \"Either --env-name or --url is required. Use --help for usage.\",\n );\n }\n\n let envName: string;\n let connectorType: string;\n let urlLookup: UrlLookupResult | null = null;\n\n if (opts.url) {\n urlLookup = resolveConnectorFromUrl(opts.url);\n if (!urlLookup) {\n throw new Error(\n `No connector found for URL: ${opts.url} — no registered base URL matches this URL`,\n );\n }\n connectorType = urlLookup.connectorType;\n envName = opts.envName ?? urlLookup.envName;\n console.log(\n `URL ${opts.url} matches the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n console.log(` Matched base URL: ${urlLookup.matchedBase}`);\n console.log(` Relative path: ${urlLookup.relativePath}`);\n console.log(` Environment var: ${envName}`);\n } else {\n connectorType = getConnectorTypeForSecretName(\n (envName = opts.envName!),\n )!;\n if (!connectorType) {\n throw new Error(\n `Unknown environment variable: ${envName} — not managed by any connector`,\n );\n }\n console.log(\n `${envName} is managed by the ${CONNECTOR_TYPES[connectorType as ConnectorType].label} connector (type: ${connectorType}).`,\n );\n }\n console.log(\"\");\n\n const { label } = CONNECTOR_TYPES[connectorType as ConnectorType];\n const apiUrl = await getApiUrl();\n const platformUrl = toPlatformUrl(apiUrl);\n\n const ctx: DiagContext = {\n envName,\n connectorType,\n label,\n platformOrigin: platformUrl.origin,\n agentId: process.env.ZERO_AGENT_ID || undefined,\n };\n\n checkEnvVariable(ctx);\n const { isConnected, isExpired, hasPermission } =\n await checkConnectorStatus(ctx);\n const networkPolicies = await checkConnectorDomains(ctx);\n\n // Summary for Step 2\n if (isConnected && !isExpired && hasPermission) {\n console.log(\n `Steps 1-2 summary: The ${label} connector is connected, active, and authorized. Outbound requests to the registered base URLs will have credentials injected at the network boundary.`,\n );\n }\n console.log(\"\");\n\n // Step 3: Permission policy check\n if (urlLookup) {\n // --url mode: auto-detect permission from URL path\n resolvePermissionFromUrl(\n connectorType,\n label,\n opts.method,\n urlLookup.relativePath,\n urlLookup.matchedBase,\n networkPolicies,\n );\n } else if (opts.checkPermission) {\n // --env-name mode with explicit --check-permission\n checkPermissionPolicy(\n connectorType,\n label,\n opts.checkPermission,\n networkPolicies,\n );\n }\n\n // Re-diagnose hint\n const args: string[] = [];\n if (opts.url) {\n args.push(`--url ${opts.url}`);\n if (opts.method !== \"GET\") {\n args.push(`--method ${opts.method}`);\n }\n } else {\n args.push(`--env-name ${envName}`);\n }\n if (opts.checkPermission) {\n args.push(`--check-permission ${opts.checkPermission}`);\n }\n console.log(\n `To re-diagnose after changes, run: zero doctor check-connector ${args.join(\" \")}`,\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CONNECTOR_TYPES,\n type ConnectorConfig,\n type ConnectorGenerationType,\n type ConnectorType,\n} from \"@vm0/connectors/connectors\";\nimport type { ConnectorListResponse } from \"@vm0/api-contracts/contracts/connector-schemas\";\nimport { getZeroAgentUserConnectors } from \"../../../lib/api/domains/zero-agents\";\nimport { listZeroConnectors } from \"../../../lib/api/domains/zero-connectors\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"./platform-url\";\n\nconst GENERATION_TYPE_ORDER: readonly ConnectorGenerationType[] = [\n \"image\",\n \"video\",\n \"audio\",\n \"text\",\n \"code\",\n \"document\",\n \"presentation\",\n \"website\",\n];\n\nconst GENERATION_TYPE_LABELS: Record<ConnectorGenerationType, string> = {\n audio: \"Audio\",\n code: \"Code\",\n document: \"Document\",\n image: \"Image\",\n presentation: \"Presentation\",\n text: \"Text\",\n video: \"Video\",\n website: \"Website\",\n};\n\ntype ConnectedConnector = ConnectorListResponse[\"connectors\"][number];\n\ntype CandidateStatus =\n | \"ready\"\n | \"needs-reconnect\"\n | \"not-authorized\"\n | \"not-connected\"\n | \"not-available\";\n\ninterface GenerateOptions {\n all?: boolean;\n json?: boolean;\n}\n\ninterface GenerationCandidate {\n type: ConnectorType;\n label: string;\n status: CandidateStatus;\n reason: string;\n account?: string;\n authMethod?: string;\n actionLabel?: string;\n actionUrl?: string;\n}\n\nfunction getAvailableGenerationTypes(): ConnectorGenerationType[] {\n const available = new Set<ConnectorGenerationType>();\n for (const config of Object.values(CONNECTOR_TYPES)) {\n for (const generationType of config.generation ?? []) {\n available.add(generationType);\n }\n }\n\n return GENERATION_TYPE_ORDER.filter((type) => {\n return available.has(type);\n });\n}\n\nfunction parseGenerationType(value: string): ConnectorGenerationType {\n const availableTypes = getAvailableGenerationTypes();\n if (availableTypes.includes(value as ConnectorGenerationType)) {\n return value as ConnectorGenerationType;\n }\n\n throw new Error(`Unknown generation type: ${value}`, {\n cause: new Error(`Available types: ${availableTypes.join(\", \")}`),\n });\n}\n\nfunction getGenerationConnectors(\n generationType: ConnectorGenerationType,\n): Array<[ConnectorType, ConnectorConfig]> {\n return (\n Object.entries(CONNECTOR_TYPES) as Array<[ConnectorType, ConnectorConfig]>\n )\n .filter(([, config]) => {\n return config.generation?.includes(generationType) === true;\n })\n .sort(([a], [b]) => {\n return a.localeCompare(b);\n });\n}\n\nfunction formatAccount(connector: ConnectedConnector): string | undefined {\n if (connector.externalUsername) return `@${connector.externalUsername}`;\n if (connector.externalEmail) return connector.externalEmail;\n if (connector.externalId) return connector.externalId;\n return undefined;\n}\n\nfunction getAction(\n status: CandidateStatus,\n type: ConnectorType,\n label: string,\n agentId: string | undefined,\n platformOrigin: string,\n): { actionLabel?: string; actionUrl?: string } {\n if (status === \"needs-reconnect\") {\n return {\n actionLabel: `Reconnect ${label}`,\n actionUrl: `${platformOrigin}/connectors`,\n };\n }\n\n if (status === \"not-authorized\" && agentId) {\n return {\n actionLabel: `Authorize ${label}`,\n actionUrl: `${platformOrigin}/connectors/${type}/authorize?agentId=${agentId}`,\n };\n }\n\n if (status === \"not-connected\") {\n if (agentId) {\n return {\n actionLabel: `Connect and authorize ${label}`,\n actionUrl: `${platformOrigin}/connectors/${type}/authorize?agentId=${agentId}`,\n };\n }\n\n return {\n actionLabel: `Connect ${label}`,\n actionUrl: `${platformOrigin}/connectors/${type}/connect`,\n };\n }\n\n return {};\n}\n\nfunction toCandidate(params: {\n type: ConnectorType;\n config: ConnectorConfig;\n connector: ConnectedConnector | undefined;\n configuredTypes: Set<ConnectorType>;\n authorizedTypes: Set<string> | null;\n agentId: string | undefined;\n platformOrigin: string;\n}): GenerationCandidate {\n const {\n type,\n config,\n connector,\n configuredTypes,\n authorizedTypes,\n agentId,\n platformOrigin,\n } = params;\n\n let status: CandidateStatus;\n let reason: string;\n\n if (connector?.needsReconnect) {\n status = \"needs-reconnect\";\n reason = \"connected, reconnect required\";\n } else if (!connector) {\n status = configuredTypes.has(type) ? \"not-connected\" : \"not-available\";\n reason =\n status === \"not-connected\"\n ? agentId\n ? \"not connected or authorized for current agent\"\n : \"not connected\"\n : \"not available in this environment\";\n } else if (authorizedTypes && !authorizedTypes.has(type)) {\n status = \"not-authorized\";\n reason = \"connected, not authorized for current agent\";\n } else {\n status = \"ready\";\n reason = agentId\n ? \"connected and authorized for current agent\"\n : \"connected; agent authorization was not checked\";\n }\n\n return {\n type,\n label: config.label,\n status,\n reason,\n account: connector ? formatAccount(connector) : undefined,\n authMethod: connector?.authMethod,\n ...getAction(status, type, config.label, agentId, platformOrigin),\n };\n}\n\nfunction pad(value: string, width: number): string {\n return value.padEnd(width);\n}\n\nfunction renderRows(candidates: GenerationCandidate[]): void {\n const typeWidth = Math.max(\n 4,\n ...candidates.map((candidate) => {\n return candidate.type.length;\n }),\n );\n const labelWidth = Math.max(\n 5,\n ...candidates.map((candidate) => {\n return candidate.label.length;\n }),\n );\n\n for (const candidate of candidates) {\n const suffix =\n candidate.status === \"ready\"\n ? (candidate.account ?? candidate.authMethod ?? \"\")\n : candidate.reason;\n console.log(\n ` ${pad(candidate.type, typeWidth)} ${pad(candidate.label, labelWidth)} ${suffix}`,\n );\n }\n}\n\nfunction renderActions(candidates: GenerationCandidate[]): void {\n const actionable = candidates.filter((candidate) => {\n return candidate.actionLabel && candidate.actionUrl;\n });\n if (actionable.length === 0) return;\n\n console.log(\"\");\n console.log(\"Next actions:\");\n for (const candidate of actionable) {\n console.log(` [${candidate.actionLabel}](${candidate.actionUrl})`);\n }\n}\n\nfunction renderText(params: {\n generationType: ConnectorGenerationType;\n agentId: string | undefined;\n ready: GenerationCandidate[];\n other: GenerationCandidate[];\n showAll: boolean;\n}): void {\n const { generationType, agentId, ready, other, showAll } = params;\n const label = GENERATION_TYPE_LABELS[generationType];\n const scope = agentId ? \"for current agent\" : \"(connected connectors)\";\n\n console.log(`${label} generation choices ${scope}`);\n console.log(\"\");\n\n if (agentId) {\n console.log(`${\"Agent:\".padEnd(10)}${agentId}`);\n console.log(\"\");\n } else {\n console.log(\n \"ZERO_AGENT_ID is not set, so agent authorization could not be checked.\",\n );\n console.log(\"\");\n }\n\n if (ready.length > 0) {\n renderRows(ready);\n } else {\n console.log(`No ready ${generationType} generation connectors found.`);\n }\n\n if (showAll && other.length > 0) {\n console.log(\"\");\n console.log(`Other ${generationType} generation connectors`);\n console.log(\"\");\n renderRows(other);\n }\n\n if (ready.length === 0 || showAll) {\n renderActions(other);\n }\n}\n\nexport const generateCommand = new Command()\n .name(\"generate\")\n .description(\"Show generation connector choices for the current agent\")\n .argument(\n \"<type>\",\n `Generation type (${getAvailableGenerationTypes().join(\", \")})`,\n )\n .option(\"--all\", \"Also show unavailable or not-yet-authorized connectors\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .action(\n withErrorHandler(async (type: string, options: GenerateOptions) => {\n const generationType = parseGenerationType(type);\n const agentId = process.env.ZERO_AGENT_ID;\n const [connectorList, enabledTypes, platformOrigin] = await Promise.all([\n listZeroConnectors(),\n agentId ? getZeroAgentUserConnectors(agentId) : Promise.resolve(null),\n getPlatformOrigin(),\n ]);\n const connectedMap = new Map(\n connectorList.connectors.map((connector) => {\n return [connector.type, connector];\n }),\n );\n const configuredTypes = new Set(connectorList.configuredTypes);\n const authorizedTypes = enabledTypes ? new Set(enabledTypes) : null;\n const candidates = getGenerationConnectors(generationType).map(\n ([connectorType, config]) => {\n return toCandidate({\n type: connectorType,\n config,\n connector: connectedMap.get(connectorType),\n configuredTypes,\n authorizedTypes,\n agentId,\n platformOrigin,\n });\n },\n );\n const ready = candidates.filter((candidate) => {\n return candidate.status === \"ready\";\n });\n const other = candidates.filter((candidate) => {\n return candidate.status !== \"ready\";\n });\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n generationType,\n availableTypes: getAvailableGenerationTypes(),\n agentId: agentId ?? null,\n choices: ready,\n otherCandidates: other,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n renderText({\n generationType,\n agentId,\n ready,\n other,\n showAll: options.all === true,\n });\n\n if (!options.all && other.length > 0) {\n console.log(\"\");\n console.log(\n chalk.dim(\n `Use --all to see every ${generationType} generation candidate.`,\n ),\n );\n }\n }),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport { findMatchingPermissions } from \"@vm0/connectors/firewall-rule-matcher\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const permissionDenyCommand = new Command()\n .name(\"permission-deny\")\n .description(\n \"Diagnose a permission denial and find the permission that covers it\",\n )\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--method <method>\",\n \"The denied HTTP method\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--path <path>\", \"The denied path\").makeOptionMandatory(),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-deny github --method GET --path /repos/owner/repo/pulls\n zero doctor permission-deny slack --method POST --path /chat.postMessage\n\nNotes:\n - Identifies which named permission covers a denied request\n - Use permission-change to request or enable the permission`,\n )\n .action(\n withErrorHandler(\n async (connectorRef: string, opts: { method: string; path: string }) => {\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n const { label } = CONNECTOR_TYPES[connectorRef];\n const config = getConnectorFirewall(connectorRef);\n const permissions = findMatchingPermissions(\n opts.method,\n opts.path,\n config,\n );\n\n console.log(\n `The ${label} permission filtered ${opts.method} ${opts.path}.`,\n );\n\n if (permissions.length === 0) {\n console.log(\"No named permission was found covering this request.\");\n return;\n }\n\n // Count total rules per permission name across all APIs\n const ruleCount = new Map<string, number>();\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const perm of api.permissions) {\n ruleCount.set(\n perm.name,\n (ruleCount.get(perm.name) ?? 0) + perm.rules.length,\n );\n }\n }\n\n // Pick the permission with the fewest rules (most specific)\n const permission = permissions.reduce((narrowest, current) => {\n return (ruleCount.get(current) ?? Infinity) <\n (ruleCount.get(narrowest) ?? Infinity)\n ? current\n : narrowest;\n });\n console.log(`This is covered by the \"${permission}\" permission.`);\n console.log(\n `To request this permission, run: zero doctor permission-change ${connectorRef} --permission ${permission} --enable --reason \"why this is needed\"`,\n );\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { CONNECTOR_TYPES } from \"@vm0/connectors/connectors\";\nimport {\n getConnectorFirewall,\n isFirewallConnectorType,\n} from \"@vm0/connectors/firewalls\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { getPlatformOrigin } from \"./platform-url\";\nimport { resolveAgentRole } from \"./resolve-role\";\n\nfunction findPermissionInConfig(ref: string, permissionName: string): boolean {\n if (!isFirewallConnectorType(ref)) return false;\n const config = getConnectorFirewall(ref);\n for (const api of config.apis) {\n if (!api.permissions) continue;\n for (const p of api.permissions) {\n if (p.name === permissionName) return true;\n }\n }\n return false;\n}\n\n/**\n * Core logic for outputting a permission change message.\n * Shared by both `permission-change` and `permission-deny` commands.\n */\nconst REASON_MAX_LENGTH = 500;\n\nasync function outputPermissionChangeMessage(\n connectorRef: string,\n permission: string,\n action: \"enable\" | \"disable\",\n reason?: string,\n): Promise<void> {\n const { label } =\n CONNECTOR_TYPES[connectorRef as keyof typeof CONNECTOR_TYPES];\n\n const platformOrigin = await getPlatformOrigin();\n const agentId = process.env.ZERO_AGENT_ID;\n const role = agentId ? await resolveAgentRole(agentId) : \"unknown\";\n\n const urlParams = new URLSearchParams({\n ref: connectorRef,\n permission,\n action: action === \"enable\" ? \"allow\" : \"deny\",\n });\n\n // Only include reason for member role (admin/owner can change directly)\n if (role === \"member\" && reason) {\n const truncated =\n reason.length > REASON_MAX_LENGTH\n ? reason.slice(0, REASON_MAX_LENGTH)\n : reason;\n urlParams.set(\"reason\", truncated);\n }\n\n const pagePath = agentId ? `/agents/${agentId}/permissions` : \"/agents\";\n const url = `${platformOrigin}${pagePath}?${urlParams.toString()}`;\n\n // Slack chat:write: strongly recommend bot-based messaging over user identity\n if (\n connectorRef === \"slack\" &&\n permission === \"chat:write\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting chat:write allows sending messages AS THE USER's identity, not as a bot.\",\n );\n console.log(\n \"Use `zero slack message send -c <channel> -t <text>` to send messages as the bot instead — this is the recommended approach for most use cases.\",\n );\n console.log(\n \"Only request user approval below if acting as the user is specifically required.\",\n );\n console.log(\"\");\n }\n\n // Gmail gmail.send: strongly recommend draft-based workflow over direct send\n if (\n connectorRef === \"gmail\" &&\n permission === \"gmail.send\" &&\n action === \"enable\"\n ) {\n console.log(\"\");\n console.log(\n \"IMPORTANT: Granting gmail.send allows the agent to send emails directly as the user.\",\n );\n console.log(\n \"Consider keeping gmail.send disabled and using gmail.compose instead — the agent can create drafts for the user to review and send manually.\",\n );\n console.log(\n \"Only request user approval below if direct sending is specifically required.\",\n );\n console.log(\"\");\n }\n\n if (role === \"admin\" || role === \"owner\") {\n console.log(\n `You can ${action} the \"${permission}\" permission directly: [Manage ${label} permissions](${url})`,\n );\n } else if (role === \"member\") {\n if (!reason) {\n console.log(\n `IMPORTANT: Re-run with \\`--reason \"one sentence why this is needed\"\\` so the admin can review your request faster.`,\n );\n } else if (action === \"enable\") {\n console.log(\n `Permission changes require admin approval. Request access at: [Request ${label} access](${url})`,\n );\n } else {\n console.log(\n `Permission changes require admin approval. Contact an org admin to disable this permission: [View ${label} permissions](${url})`,\n );\n }\n } else {\n console.log(\n `To ${action} the \"${permission}\" permission for ${label}: [Manage ${label} permissions](${url})`,\n );\n }\n}\n\nexport const permissionChangeCommand = new Command()\n .name(\"permission-change\")\n .description(\"Request a permission change (enable or disable)\")\n .argument(\"<connector-ref>\", \"The connector type (e.g. github)\")\n .addOption(\n new Option(\n \"--permission <name>\",\n \"The permission name to change\",\n ).makeOptionMandatory(),\n )\n .addOption(\n new Option(\"--enable\", \"Request to enable the permission\").conflicts(\n \"disable\",\n ),\n )\n .addOption(\n new Option(\"--disable\", \"Request to disable the permission\").conflicts(\n \"enable\",\n ),\n )\n .addOption(\n new Option(\n \"--reason <text>\",\n \"Brief reason why the permission is needed (max 500 chars)\",\n ),\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero doctor permission-change github --permission contents:read --enable\n zero doctor permission-change slack --permission chat:write --disable\n\nNotes:\n - Outputs a platform URL for the user to adjust the permission\n - Admins can change permissions directly; members must request approval`,\n )\n .action(\n withErrorHandler(\n async (\n connectorRef: string,\n opts: {\n permission: string;\n enable?: boolean;\n disable?: boolean;\n reason?: string;\n },\n ) => {\n if (!opts.enable && !opts.disable) {\n throw new Error(\"Either --enable or --disable is required\");\n }\n\n if (!isFirewallConnectorType(connectorRef)) {\n throw new Error(`Unknown connector type: ${connectorRef}`);\n }\n\n if (!findPermissionInConfig(connectorRef, opts.permission)) {\n throw new Error(\n `Unknown permission \"${opts.permission}\" for ${connectorRef}`,\n );\n }\n\n const action = opts.enable ? \"enable\" : \"disable\";\n await outputPermissionChangeMessage(\n connectorRef,\n opts.permission,\n action,\n opts.reason,\n );\n },\n ),\n );\n","import { getZeroOrg } from \"../../../lib/api/domains/zero-orgs\";\nimport { getZeroAgent } from \"../../../lib/api/domains/zero-agents\";\nimport { decodeZeroTokenPayload } from \"../../../lib/api/zero-token\";\nimport { decodeCliTokenPayload } from \"../../../lib/api/cli-token\";\nimport { getToken } from \"../../../lib/api/config\";\n\ntype AgentRole = \"admin\" | \"owner\" | \"member\" | \"unknown\";\n\n/**\n * Resolve the current user's userId from the available token.\n * Tries ZERO_TOKEN (sandbox) first, then CLI token.\n */\nasync function resolveUserId(): Promise<string | undefined> {\n const zeroPayload = decodeZeroTokenPayload();\n if (zeroPayload?.userId) return zeroPayload.userId;\n\n const token = await getToken();\n const cliPayload = decodeCliTokenPayload(token);\n return cliPayload?.userId;\n}\n\n/**\n * Best-effort role detection that also considers agent ownership.\n *\n * Returns \"admin\" if the user is an org admin (can manage any agent).\n * Returns \"owner\" if the user is a non-admin but owns the specified agent.\n * Returns \"member\" if the user is a non-admin, non-owner member.\n * Returns \"unknown\" on any API failure.\n */\nexport async function resolveAgentRole(agentId: string): Promise<AgentRole> {\n try {\n const org = await getZeroOrg();\n if (org.role === \"admin\") return \"admin\";\n\n if (org.role === \"member\") {\n // Check if the member owns this agent\n const userId = await resolveUserId();\n if (userId) {\n const agent = await getZeroAgent(agentId);\n if (agent.ownerId === userId) return \"owner\";\n }\n return \"member\";\n }\n\n return \"unknown\";\n } catch (error: unknown) {\n console.debug(\"resolveAgentRole failed, falling back to unknown:\", error);\n return \"unknown\";\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getZeroUserPreferences,\n updateZeroUserPreferences,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isInteractive, promptText } from \"../../../lib/utils/prompt-utils\";\n\n/**\n * Detect system timezone using Intl API\n */\nfunction detectTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * Validate timezone using Intl.DateTimeFormat\n */\nfunction isValidTimezone(timezone: string): boolean {\n try {\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Display current preferences\n */\nfunction displayPreferences(prefs: { timezone: string | null }): void {\n console.log(chalk.bold(\"Current preferences:\"));\n console.log(\n ` Timezone: ${prefs.timezone ? chalk.cyan(prefs.timezone) : chalk.dim(\"not set\")}`,\n );\n}\n\ninterface PreferenceOpts {\n timezone?: string;\n}\n\n/**\n * Build updates from CLI flags, exiting on invalid input\n */\nfunction buildUpdates(opts: PreferenceOpts): { timezone?: string } | null {\n if (opts.timezone === undefined) return null;\n\n if (!isValidTimezone(opts.timezone)) {\n throw new Error(`Invalid timezone: ${opts.timezone}`, {\n cause: new Error(\n \"Use an IANA timezone identifier (e.g., America/New_York, Asia/Shanghai)\",\n ),\n });\n }\n\n return { timezone: opts.timezone };\n}\n\n/**\n * Print confirmation after a successful update\n */\nfunction printUpdateResult(\n updates: { timezone?: string },\n result: { timezone: string | null },\n): void {\n if (updates.timezone !== undefined) {\n console.log(\n chalk.green(\n `Timezone set to ${chalk.cyan(result.timezone ?? updates.timezone)}`,\n ),\n );\n }\n}\n\n/**\n * Interactive prompts when no flags provided\n */\nasync function interactiveSetup(prefs: {\n timezone: string | null;\n}): Promise<void> {\n if (!prefs.timezone) {\n const detectedTz = detectTimezone();\n console.log(chalk.dim(`\\nSystem timezone detected: ${detectedTz}`));\n const tz = await promptText(\n \"Set timezone? (enter timezone or leave empty to skip)\",\n detectedTz,\n );\n if (tz?.trim()) {\n if (!isValidTimezone(tz.trim())) {\n throw new Error(`Invalid timezone: ${tz.trim()}`);\n }\n await updateZeroUserPreferences({ timezone: tz.trim() });\n console.log(chalk.green(`Timezone set to ${chalk.cyan(tz.trim())}`));\n }\n }\n}\n\n/**\n * zero preference\n *\n * View or update user preferences (timezone).\n */\nexport const zeroPreferenceCommand = new Command()\n .name(\"preference\")\n .description(\"View or update user preferences (timezone, notifications)\")\n .option(\"--timezone <timezone>\", \"IANA timezone (e.g., America/New_York)\")\n .action(\n withErrorHandler(async (opts: PreferenceOpts) => {\n const updates = buildUpdates(opts);\n\n if (updates) {\n const result = await updateZeroUserPreferences(updates);\n printUpdateResult(updates, result);\n return;\n }\n\n // No flags: display current preferences\n const prefs = await getZeroUserPreferences();\n displayPreferences(prefs);\n\n if (isInteractive()) {\n await interactiveSetup(prefs);\n } else if (!prefs.timezone) {\n console.log();\n console.log(\n `To set timezone: ${chalk.cyan(\"zero preference --timezone <timezone>\")}`,\n );\n console.log(\n chalk.dim(\"Example: zero preference --timezone America/New_York\"),\n );\n }\n }),\n );\n","import { mainRunCommand } from \"./run\";\nimport { continueCommand } from \"./continue\";\n\nmainRunCommand.addCommand(continueCommand);\n\nmainRunCommand.addHelpText(\n \"after\",\n `\nExamples:\n Discover teammates: zero agent list\n Delegate a task: zero run <agent-id> \"your task\"\n Continue delegation: zero run continue <session-id> \"follow up\"`,\n);\n\nexport const zeroRunCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Delegate a task to a teammate agent\")\n .argument(\"<agent-id>\", \"Agent UUID (from `zero agent list`)\")\n .argument(\"<prompt>\", \"Task prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--debug-no-mock-codex\").hideHelp())\n .addHelpText(\n \"after\",\n `\nExamples:\n Delegate a task: zero run <agent-id> \"summarize the latest issues\"\n With verbose output: zero run <agent-id> \"fix the bug\" --verbose\n\nNotes:\n - Get agent IDs from \"zero agent list\"\n - The command streams events until the delegated run completes\n - On success, a session ID is printed for follow-up with \"zero run continue\"`,\n )\n .action(\n withErrorHandler(\n async (\n agentId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n debugNoMockCodex?: boolean;\n },\n ) => {\n // 1. Validate agent-id is a UUID\n if (!isUUID(agentId)) {\n throw new Error(`Invalid agent ID format: ${agentId}`, {\n cause: new Error(\n \"Agent ID must be a valid UUID. Use `zero agent list` to find agent IDs.\",\n ),\n });\n }\n\n // 2. Create zero run\n const response = await createZeroRun({\n agentId,\n prompt,\n modelProvider: options.modelProvider,\n debugNoMockClaude: options.debugNoMockClaude,\n debugNoMockCodex: options.debugNoMockCodex,\n });\n\n // 3. Check for immediate failure\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 // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import chalk from \"chalk\";\nimport { getZeroRunAgentEvents, getZeroRun } from \"../../../lib/api\";\nimport type { RunResult } from \"../../../lib/api\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport type { PollResult, EventRenderingOptions } from \"../../run/shared\";\n\ninterface SequencedEvent {\n sequenceNumber: number;\n}\n\ntype ZeroRunResponse = Awaited<ReturnType<typeof getZeroRun>>;\ntype TerminalRunStatus = \"completed\" | \"failed\" | \"timeout\" | \"cancelled\";\ntype TerminalRunResponse = ZeroRunResponse & { status: TerminalRunStatus };\n\nconst TERMINAL_RUN_STATUSES: readonly TerminalRunStatus[] = [\n \"completed\",\n \"failed\",\n \"timeout\",\n \"cancelled\",\n];\n\n/**\n * Safely narrow GetRunResponse.result to RunResult.\n * GetRunResponse.result has all fields optional (due to .passthrough()),\n * but RunResult requires checkpointId, agentSessionId, conversationId.\n * Extra fields (artifact, volumes) are preserved at runtime via passthrough.\n */\nfunction toRunResult(result: {\n output?: string;\n executionTimeMs?: number;\n agentSessionId?: string;\n checkpointId?: string;\n conversationId?: string;\n}): RunResult | undefined {\n const { checkpointId, agentSessionId, conversationId } = result;\n if (!checkpointId || !agentSessionId || !conversationId) {\n return undefined;\n }\n return { checkpointId, agentSessionId, conversationId };\n}\n\nfunction filterContiguousEvents<T extends SequencedEvent>(\n events: T[],\n lastSequence: number,\n): T[] {\n const contiguousEvents: T[] = [];\n let expectedSequence = lastSequence + 1;\n\n for (const event of events) {\n if (event.sequenceNumber < expectedSequence) {\n continue;\n }\n if (event.sequenceNumber !== expectedSequence) {\n break;\n }\n contiguousEvents.push(event);\n expectedSequence++;\n }\n\n return contiguousEvents;\n}\n\nconst POLL_INTERVAL_MS = 1000;\nconst TERMINAL_DRAIN_POLL_INTERVAL_MS = 500;\nconst TERMINAL_DRAIN_IDLE_MS = 1000;\nconst TERMINAL_DRAIN_MAX_MS = 3000;\n\nfunction isTerminalRunResponse(\n runResponse: ZeroRunResponse,\n): runResponse is TerminalRunResponse {\n return TERMINAL_RUN_STATUSES.includes(\n runResponse.status as TerminalRunStatus,\n );\n}\n\nfunction shouldDrainNextEventPage<T>(\n eventsResponse: { hasMore: boolean; events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.hasMore &&\n contiguousEvents.length > 0 &&\n contiguousEvents.length === eventsResponse.events.length\n );\n}\n\nfunction hasSequenceGap<T>(\n eventsResponse: { events: T[] },\n contiguousEvents: T[],\n): boolean {\n return (\n eventsResponse.events.length > 0 &&\n contiguousEvents.length < eventsResponse.events.length\n );\n}\n\nfunction shouldCompleteTerminalDrain(\n terminalSeenAt: number,\n lastTerminalProgressAt: number,\n blockedByGap: boolean,\n): boolean {\n const now = Date.now();\n const terminalElapsedMs = now - terminalSeenAt;\n const terminalIdleMs = now - lastTerminalProgressAt;\n return (\n terminalElapsedMs >= TERMINAL_DRAIN_MAX_MS ||\n (!blockedByGap && terminalIdleMs >= TERMINAL_DRAIN_IDLE_MS)\n );\n}\n\nfunction renderTerminalRunResult(\n runId: string,\n runResponse: TerminalRunResponse,\n): PollResult {\n if (runResponse.status === \"completed\") {\n EventRenderer.renderRunCompleted(\n runResponse.result ? toRunResult(runResponse.result) : undefined,\n );\n return {\n succeeded: true,\n runId,\n sessionId: runResponse.result?.agentSessionId,\n checkpointId: runResponse.result?.checkpointId,\n };\n }\n\n if (runResponse.status === \"failed\") {\n EventRenderer.renderRunFailed(runResponse.error, runId);\n return { succeeded: false, runId };\n }\n\n if (runResponse.status === \"timeout\") {\n console.error(chalk.red(\"\\n✗ Run timed out\"));\n return { succeeded: false, runId };\n }\n\n console.error(chalk.yellow(\"\\n✗ Run cancelled\"));\n return { succeeded: false, runId };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Poll for zero run events until run completes.\n * Uses dual-poll approach: telemetry endpoint for events, getById for status.\n */\nexport async function pollZeroEvents(\n runId: string,\n options?: EventRenderingOptions,\n): Promise<PollResult> {\n const renderer = new EventRenderer({ verbose: options?.verbose });\n\n let lastSequence = -1;\n let complete = false;\n let result: PollResult = { succeeded: true, runId };\n let terminalRunResponse: TerminalRunResponse | undefined;\n let terminalSeenAt = 0;\n let lastTerminalProgressAt = 0;\n\n while (!complete) {\n // 1. Fetch events from telemetry endpoint\n const eventsResponse = await getZeroRunAgentEvents(runId, {\n since: lastSequence,\n limit: 100,\n order: \"asc\",\n });\n\n const contiguousEvents = filterContiguousEvents(\n eventsResponse.events,\n lastSequence,\n );\n\n // 2. Parse and render each event\n for (const event of contiguousEvents) {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData, eventsResponse.framework);\n if (parsed) {\n renderer.render(parsed);\n }\n }\n\n // 3. Track last sequence number for pagination\n if (contiguousEvents.length > 0) {\n lastSequence =\n contiguousEvents[contiguousEvents.length - 1]!.sequenceNumber;\n if (terminalRunResponse) {\n lastTerminalProgressAt = Date.now();\n }\n }\n\n const blockedByGap = hasSequenceGap(eventsResponse, contiguousEvents);\n\n // If this page is fully contiguous and the server says more are already\n // queryable, drain the next page before checking terminal status. Otherwise\n // a completed run with >100 unseen events would render only the final page's\n // first batch and then exit.\n if (shouldDrainNextEventPage(eventsResponse, contiguousEvents)) {\n continue;\n }\n\n // 4. Fetch run status separately. During terminal drain, keep the latest\n // terminal state because timeout runs can still be upgraded to completed.\n const runResponse = await getZeroRun(runId);\n if (isTerminalRunResponse(runResponse)) {\n if (!terminalRunResponse) {\n terminalSeenAt = Date.now();\n lastTerminalProgressAt = terminalSeenAt;\n }\n terminalRunResponse = runResponse;\n }\n\n if (terminalRunResponse) {\n if (\n shouldCompleteTerminalDrain(\n terminalSeenAt,\n lastTerminalProgressAt,\n blockedByGap,\n )\n ) {\n result = renderTerminalRunResult(runId, terminalRunResponse);\n complete = true;\n }\n }\n\n if (!complete) {\n await sleep(\n terminalRunResponse\n ? TERMINAL_DRAIN_POLL_INTERVAL_MS\n : POLL_INTERVAL_MS,\n );\n }\n }\n\n return result;\n}\n\n/**\n * Display next steps after successful zero run\n */\nexport function showZeroNextSteps(result: PollResult): void {\n const { sessionId } = result;\n\n console.log();\n\n if (sessionId) {\n console.log(\" Continue delegation:\");\n console.log(\n chalk.cyan(` zero run continue ${sessionId} \"your next prompt\"`),\n );\n }\n}\n","import { Command } from \"commander\";\nimport { createZeroRun } from \"../../../lib/api\";\nimport { isUUID, renderRunCreated } from \"../../run/shared\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { pollZeroEvents, showZeroNextSteps } from \"./shared\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\"Continue a previous delegation from a session\")\n .argument(\"<session-id>\", \"Session ID from a previous run\")\n .argument(\"<prompt>\", \"Follow-up prompt for the agent\")\n .option(\n \"--model-provider <type>\",\n \"Override model provider (e.g., anthropic-api-key)\",\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero run continue <session-id> \"now deploy it\"\n zero run continue <session-id> \"add tests\" --verbose\n\nNotes:\n - The session ID is printed after a successful \"zero run\" delegation\n - Continues the same agent session with full prior context`,\n )\n .action(\n withErrorHandler(\n async (\n sessionId: string,\n prompt: string,\n options: {\n modelProvider?: string;\n verbose?: boolean;\n },\n ) => {\n // 1. Validate session-id is a UUID\n if (!isUUID(sessionId)) {\n throw new Error(`Invalid session ID format: ${sessionId}`, {\n cause: new Error(\"Session ID must be a valid UUID\"),\n });\n }\n\n // 2. Create zero run with sessionId (no agentId needed)\n const response = await createZeroRun({\n sessionId,\n prompt,\n modelProvider: options.modelProvider,\n });\n\n // 3. Check for immediate failure\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 // 4. Display run started/queued info\n renderRunCreated(response);\n\n // 5. Poll for events\n const result = await pollZeroEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n\n // 6. Show next steps\n showZeroNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { setupCommand } from \"./setup\";\nimport { listCommand } from \"./list\";\nimport { statusCommand } from \"./status\";\nimport { deleteCommand } from \"./delete\";\nimport { enableCommand } from \"./enable\";\nimport { disableCommand } from \"./disable\";\n\nexport const zeroScheduleCommand = new Command()\n .name(\"schedule\")\n .description(\"Create or manage recurring scheduled tasks\")\n .addCommand(setupCommand)\n .addCommand(listCommand)\n .addCommand(statusCommand)\n .addCommand(deleteCommand)\n .addCommand(enableCommand)\n .addCommand(disableCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create a schedule: zero schedule setup --help\n Check all schedules: zero schedule list\n Check schedule status: zero schedule status <agent-id>\n Pause a schedule: zero schedule disable <agent-id>\n Resume a schedule: zero schedule enable <agent-id>\n Delete a schedule: zero schedule delete <agent-id>`,\n );\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport {\n isInteractive,\n promptText,\n promptSelect,\n promptConfirm,\n} from \"../../../lib/utils/prompt-utils\";\nimport {\n generateCronExpression,\n detectTimezone,\n validateTimeFormat,\n validateDateFormat,\n getTomorrowDateLocal,\n getCurrentTimeLocal,\n toISODateTime,\n type ScheduleFrequency,\n} from \"../../../lib/domain/schedule-utils\";\nimport {\n resolveCompose,\n deployZeroSchedule,\n listZeroSchedules,\n enableZeroSchedule,\n getZeroUserPreferences,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { parseModelFlag } from \"../../../lib/domain/model-provider/shared\";\n\nconst FREQUENCY_CHOICES = [\n { title: \"Daily\", value: \"daily\" as const, description: \"Run every day\" },\n {\n title: \"Weekly\",\n value: \"weekly\" as const,\n description: \"Run once per week\",\n },\n {\n title: \"Monthly\",\n value: \"monthly\" as const,\n description: \"Run once per month\",\n },\n {\n title: \"One-time\",\n value: \"once\" as const,\n description: \"Run once at specific time\",\n },\n {\n title: \"Loop\",\n value: \"loop\" as const,\n description: \"Run repeatedly at fixed intervals\",\n },\n];\n\nconst DAY_OF_WEEK_CHOICES = [\n { title: \"Monday\", value: 1 },\n { title: \"Tuesday\", value: 2 },\n { title: \"Wednesday\", value: 3 },\n { title: \"Thursday\", value: 4 },\n { title: \"Friday\", value: 5 },\n { title: \"Saturday\", value: 6 },\n { title: \"Sunday\", value: 0 },\n];\n\nfunction parseDayOption(\n day: string,\n frequency: ScheduleFrequency,\n): number | undefined {\n if (frequency === \"weekly\") {\n const dayMap: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n };\n return dayMap[day.toLowerCase()];\n } else if (frequency === \"monthly\") {\n const num = parseInt(day, 10);\n if (num >= 1 && num <= 31) {\n return num;\n }\n }\n return undefined;\n}\n\nfunction formatInTimezone(isoDate: string, timezone: string): string {\n const date = new Date(isoDate);\n const parts = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).formatToParts(date);\n\n const get = (type: string) => {\n return (\n parts.find((p) => {\n return p.type === type;\n })?.value ?? \"\"\n );\n };\n return `${get(\"year\")}-${get(\"month\")}-${get(\"day\")} ${get(\"hour\")}:${get(\"minute\")}`;\n}\n\nfunction parseFrequencyFromCron(\n cron: string,\n): { frequency: ScheduleFrequency; day?: number; time: string } | null {\n const parts = cron.split(\" \");\n if (parts.length !== 5) return null;\n\n const [minute, hour, dayOfMonth, , dayOfWeek] = parts;\n const time = `${hour!.padStart(2, \"0\")}:${minute!.padStart(2, \"0\")}`;\n\n if (dayOfMonth === \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"daily\", time };\n } else if (dayOfMonth === \"*\" && dayOfWeek !== \"*\") {\n return { frequency: \"weekly\", day: parseInt(dayOfWeek!, 10), time };\n } else if (dayOfMonth !== \"*\" && dayOfWeek === \"*\") {\n return { frequency: \"monthly\", day: parseInt(dayOfMonth!, 10), time };\n }\n\n return null;\n}\n\ninterface SetupOptions {\n name?: string;\n frequency?: string;\n time?: string;\n day?: string;\n interval?: string;\n timezone?: string;\n prompt?: string;\n promptFile?: string;\n enable?: boolean;\n modelProvider?: string;\n model?: string;\n}\n\ninterface ExistingScheduleDefaults {\n frequency?: ScheduleFrequency;\n day?: number;\n time?: string;\n intervalSeconds?: number;\n}\n\ninterface ScheduleListItem {\n name: string;\n agentId: string;\n triggerType?: \"cron\" | \"once\" | \"loop\";\n cronExpression?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n timezone: string;\n prompt: string;\n enabled?: boolean;\n}\n\nfunction getExistingDefaults(\n existingSchedule: ScheduleListItem | undefined,\n): ExistingScheduleDefaults {\n const defaults: ExistingScheduleDefaults = {};\n\n if (existingSchedule?.triggerType === \"loop\") {\n defaults.frequency = \"loop\";\n defaults.intervalSeconds = existingSchedule.intervalSeconds ?? undefined;\n } else if (existingSchedule?.cronExpression) {\n const parsed = parseFrequencyFromCron(existingSchedule.cronExpression);\n if (parsed) {\n defaults.frequency = parsed.frequency;\n defaults.day = parsed.day;\n defaults.time = parsed.time;\n }\n } else if (existingSchedule?.atTime) {\n defaults.frequency = \"once\";\n }\n\n return defaults;\n}\n\nasync function gatherFrequency(\n optionFrequency: string | undefined,\n existingFrequency: ScheduleFrequency | undefined,\n): Promise<ScheduleFrequency | null> {\n let frequency = optionFrequency as ScheduleFrequency | undefined;\n\n if (\n frequency &&\n [\"daily\", \"weekly\", \"monthly\", \"once\", \"loop\"].includes(frequency)\n ) {\n return frequency;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--frequency is required (daily|weekly|monthly|once|loop)\");\n }\n\n const defaultIndex = existingFrequency\n ? FREQUENCY_CHOICES.findIndex((c) => {\n return c.value === existingFrequency;\n })\n : 0;\n\n frequency = await promptSelect<ScheduleFrequency>(\n \"Schedule frequency\",\n FREQUENCY_CHOICES,\n defaultIndex >= 0 ? defaultIndex : 0,\n );\n\n return frequency || null;\n}\n\nasync function gatherDay(\n frequency: ScheduleFrequency,\n optionDay: string | undefined,\n existingDay: number | undefined,\n): Promise<number | null> {\n if (frequency !== \"weekly\" && frequency !== \"monthly\") {\n return null;\n }\n\n if (optionDay) {\n const day = parseDayOption(optionDay, frequency);\n if (day === undefined) {\n throw new Error(\n `Invalid day: ${optionDay}. Use mon-sun for weekly or 1-31 for monthly.`,\n );\n }\n return day;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--day is required for weekly/monthly\");\n }\n\n if (frequency === \"weekly\") {\n const defaultDayIndex =\n existingDay !== undefined\n ? DAY_OF_WEEK_CHOICES.findIndex((c) => {\n return c.value === existingDay;\n })\n : 0;\n const day = await promptSelect(\n \"Day of week\",\n DAY_OF_WEEK_CHOICES,\n defaultDayIndex >= 0 ? defaultDayIndex : 0,\n );\n return day ?? null;\n }\n\n const dayStr = await promptText(\n \"Day of month (1-31)\",\n existingDay?.toString() || \"1\",\n );\n if (!dayStr) return null;\n\n const day = parseInt(dayStr, 10);\n if (isNaN(day) || day < 1 || day > 31) {\n throw new Error(\"Day must be between 1 and 31\");\n }\n return day;\n}\n\nasync function gatherRecurringTime(\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | undefined> {\n if (optionTime) {\n const validation = validateTimeFormat(optionTime);\n if (validation !== true) {\n throw new Error(`Invalid time: ${validation}`);\n }\n return optionTime;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--time is required (HH:MM format)\");\n }\n\n return await promptText(\n \"Time (HH:MM)\",\n existingTime || \"09:00\",\n validateTimeFormat,\n );\n}\n\nasync function gatherOneTimeSchedule(\n optionDay: string | undefined,\n optionTime: string | undefined,\n existingTime: string | undefined,\n): Promise<string | null> {\n if (optionDay && optionTime) {\n if (!validateDateFormat(optionDay)) {\n throw new Error(\n `Invalid date format: ${optionDay}. Use YYYY-MM-DD format.`,\n );\n }\n if (!validateTimeFormat(optionTime)) {\n throw new Error(`Invalid time format: ${optionTime}. Use HH:MM format.`);\n }\n return `${optionDay} ${optionTime}`;\n }\n\n if (!isInteractive()) {\n throw new Error(\"One-time schedules require interactive mode\", {\n cause: new Error(\n \"Or provide --day (YYYY-MM-DD) and --time (HH:MM) flags\",\n ),\n });\n }\n\n const tomorrowDate = getTomorrowDateLocal();\n const date = await promptText(\n \"Date (YYYY-MM-DD, default tomorrow)\",\n tomorrowDate,\n validateDateFormat,\n );\n if (!date) return null;\n\n const currentTime = getCurrentTimeLocal();\n const time = await promptText(\n \"Time (HH:MM)\",\n existingTime || currentTime,\n validateTimeFormat,\n );\n if (!time) return null;\n\n return `${date} ${time}`;\n}\n\nasync function gatherTimezone(\n optionTimezone: string | undefined,\n existingTimezone: string | undefined | null,\n): Promise<string | undefined> {\n if (optionTimezone) return optionTimezone;\n\n let userTimezone: string | null = null;\n try {\n const prefs = await getZeroUserPreferences();\n userTimezone = prefs.timezone;\n } catch {\n console.log(\n chalk.dim(\"Could not fetch timezone preference, using detected timezone\"),\n );\n }\n\n const defaultTimezone = userTimezone || detectTimezone();\n\n if (!isInteractive()) {\n return defaultTimezone;\n }\n\n return await promptText(\"Timezone\", existingTimezone || defaultTimezone);\n}\n\nasync function gatherPromptText(\n optionPrompt: string | undefined,\n optionPromptFile: string | undefined,\n existingPrompt: string | undefined | null,\n): Promise<string | undefined> {\n if (optionPrompt && optionPromptFile) {\n throw new Error(\"Cannot use --prompt and --prompt-file together\");\n }\n\n if (optionPromptFile) {\n return readFileSync(optionPromptFile, \"utf-8\");\n }\n\n if (optionPrompt) return optionPrompt;\n\n if (!isInteractive()) {\n throw new Error(\"--prompt or --prompt-file is required\");\n }\n\n return await promptText(\n \"Prompt to run\",\n existingPrompt || \"let's start working.\",\n );\n}\n\nasync function gatherInterval(\n optionInterval: string | undefined,\n existingInterval: number | undefined,\n): Promise<number | null> {\n if (optionInterval) {\n const val = parseInt(optionInterval, 10);\n if (isNaN(val) || val < 0) {\n throw new Error(\n \"Invalid interval. Must be a non-negative integer (seconds)\",\n );\n }\n return val;\n }\n\n if (!isInteractive()) {\n throw new Error(\"--interval is required for loop schedules (seconds)\");\n }\n\n const defaultVal =\n existingInterval !== undefined ? String(existingInterval) : \"300\";\n const result = await promptText(\n \"Interval in seconds (time between runs)\",\n defaultVal,\n (v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 0) return \"Must be a non-negative integer\";\n return true;\n },\n );\n if (!result) return null;\n return parseInt(result, 10);\n}\n\nasync function gatherTiming(\n frequency: ScheduleFrequency,\n options: SetupOptions,\n defaults: ExistingScheduleDefaults,\n): Promise<{\n day: number | undefined;\n time: string | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n} | null> {\n if (frequency === \"loop\") {\n const intervalSeconds = await gatherInterval(\n options.interval,\n defaults.intervalSeconds,\n );\n if (intervalSeconds === null) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: undefined,\n intervalSeconds,\n };\n }\n\n if (frequency === \"once\") {\n const result = await gatherOneTimeSchedule(\n options.day,\n options.time,\n defaults.time,\n );\n if (!result) return null;\n return {\n day: undefined,\n time: undefined,\n atTime: result,\n intervalSeconds: undefined,\n };\n }\n\n const day =\n (await gatherDay(frequency, options.day, defaults.day)) ?? undefined;\n if (day === null && (frequency === \"weekly\" || frequency === \"monthly\")) {\n return null;\n }\n\n const time = await gatherRecurringTime(options.time, defaults.time);\n if (!time) return null;\n\n return { day, time, atTime: undefined, intervalSeconds: undefined };\n}\n\nasync function findExistingSchedule(\n agentId: string,\n scheduleName: string,\n): Promise<ScheduleListItem | undefined> {\n const { schedules } = await listZeroSchedules();\n return schedules.find((s) => {\n return s.agentId === agentId && s.name === scheduleName;\n });\n}\n\ninterface DeployResult {\n created: boolean;\n schedule: {\n triggerType?: \"cron\" | \"once\" | \"loop\";\n timezone: string;\n cronExpression?: string | null;\n nextRunAt?: string | null;\n atTime?: string | null;\n intervalSeconds?: number | null;\n };\n}\n\nasync function buildAndDeploy(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n frequency: ScheduleFrequency;\n time: string | undefined;\n day: number | undefined;\n atTime: string | undefined;\n intervalSeconds: number | undefined;\n timezone: string;\n prompt: string;\n existingEnabled: boolean | undefined;\n modelProviderId: string | null | undefined;\n selectedModel: string | null | undefined;\n}): Promise<DeployResult> {\n let cronExpression: string | undefined;\n let atTimeISO: string | undefined;\n\n if (params.frequency === \"loop\") {\n // Loop mode: intervalSeconds is passed directly\n } else if (params.atTime) {\n atTimeISO = toISODateTime(params.atTime);\n } else if (params.time && params.frequency !== \"once\") {\n cronExpression = generateCronExpression(\n params.frequency,\n params.time,\n params.day,\n );\n }\n\n console.log(\n `\\nDeploying schedule for agent ${chalk.cyan(params.agentName)}...`,\n );\n\n // Preserve enabled state on update so loop schedules don't lose nextRunAt.\n // On create, existingEnabled is undefined → omit the field so the server\n // applies its default (disabled; enable happens later via the enable flow).\n const deployResult = await deployZeroSchedule({\n name: params.scheduleName,\n agentId: params.agentId,\n cronExpression,\n atTime: atTimeISO,\n intervalSeconds: params.intervalSeconds,\n timezone: params.timezone,\n prompt: params.prompt,\n ...(params.existingEnabled !== undefined && {\n enabled: params.existingEnabled,\n }),\n ...(params.modelProviderId !== undefined && {\n modelProviderId: params.modelProviderId,\n }),\n ...(params.selectedModel !== undefined && {\n selectedModel: params.selectedModel,\n }),\n });\n\n return deployResult;\n}\n\nfunction displayDeployResult(\n scheduleName: string,\n deployResult: DeployResult,\n): void {\n if (deployResult.created) {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" created`));\n } else {\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" updated`));\n }\n\n console.log(chalk.dim(` Timezone: ${deployResult.schedule.timezone}`));\n\n if (\n deployResult.schedule.triggerType === \"loop\" &&\n deployResult.schedule.intervalSeconds != null\n ) {\n console.log(\n chalk.dim(\n ` Mode: Loop (interval ${deployResult.schedule.intervalSeconds}s)`,\n ),\n );\n } else if (deployResult.schedule.cronExpression) {\n console.log(chalk.dim(` Cron: ${deployResult.schedule.cronExpression}`));\n if (deployResult.schedule.nextRunAt) {\n const nextRun = formatInTimezone(\n deployResult.schedule.nextRunAt,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` Next run: ${nextRun}`));\n }\n } else if (deployResult.schedule.atTime) {\n const atTimeFormatted = formatInTimezone(\n deployResult.schedule.atTime,\n deployResult.schedule.timezone,\n );\n console.log(chalk.dim(` At: ${atTimeFormatted}`));\n }\n}\n\nasync function tryEnableSchedule(\n scheduleName: string,\n agentId: string,\n agentName: string,\n): Promise<void> {\n try {\n await enableZeroSchedule({ name: scheduleName, agentId });\n console.log(chalk.green(`✓ Schedule \"${scheduleName}\" enabled`));\n } catch (error) {\n console.error(chalk.yellow(\"⚠ Failed to enable schedule\"));\n if (error instanceof ApiRequestError) {\n if (error.code === \"SCHEDULE_PAST\") {\n console.error(chalk.dim(\" Scheduled time has already passed\"));\n } else {\n console.error(chalk.dim(` ${error.message}`));\n }\n } else if (error instanceof Error) {\n console.error(chalk.dim(` ${error.message}`));\n }\n console.log(\n ` To enable manually: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n }\n}\n\nfunction showEnableHint(agentName: string): void {\n console.log();\n console.log(\n ` To enable: ${chalk.cyan(`zero schedule enable ${agentName}`)}`,\n );\n}\n\nasync function handleScheduleEnabling(params: {\n scheduleName: string;\n agentId: string;\n agentName: string;\n enableFlag: boolean;\n shouldPromptEnable: boolean;\n}): Promise<void> {\n const { scheduleName, agentId, agentName, enableFlag, shouldPromptEnable } =\n params;\n\n if (enableFlag) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n return;\n }\n\n if (shouldPromptEnable && isInteractive()) {\n const enableNow = await promptConfirm(\"Enable this schedule?\", true);\n if (enableNow) {\n await tryEnableSchedule(scheduleName, agentId, agentName);\n } else {\n showEnableHint(agentName);\n }\n return;\n }\n\n if (shouldPromptEnable) {\n showEnableHint(agentName);\n }\n}\n\nexport const setupCommand = new Command()\n .name(\"setup\")\n .description(\"Create or edit a schedule for a zero agent\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\"-n, --name <schedule-name>\", 'Schedule name (default: \"default\")')\n .option(\"-f, --frequency <type>\", \"Frequency: daily|weekly|monthly|once|loop\")\n .option(\"-t, --time <HH:MM>\", \"Time to run (24-hour format)\")\n .option(\"-d, --day <day>\", \"Day of week (mon-sun) or day of month (1-31)\")\n .option(\"-i, --interval <seconds>\", \"Interval in seconds for loop mode\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone\")\n .option(\"-p, --prompt <text>\", \"Prompt to run\")\n .option(\n \"--prompt-file <path>\",\n \"Read prompt from file (cannot be used with --prompt)\",\n )\n .option(\"-e, --enable\", \"Enable schedule immediately after creation\")\n .option(\n \"--model-provider <id>\",\n \"Model provider UUID, or 'default' to inherit from agent/org\",\n )\n .option(\n \"--model <name>\",\n \"Model name (e.g. claude-sonnet-4-6, MiniMax-M2.7), or 'default' to inherit\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Daily at 9am: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\"\n Weekly on Monday: zero schedule setup <agent-id> -f weekly -d mon -t 10:00 -p \"weekly sync\"\n Monthly on the 1st: zero schedule setup <agent-id> -f monthly -d 1 -t 08:00 -p \"monthly review\"\n One-time: zero schedule setup <agent-id> -f once -d 2026-04-01 -t 14:00 -p \"one-off task\"\n Loop every 5 minutes: zero schedule setup <agent-id> -f loop -i 300 -p \"poll for updates\"\n Prompt from file: zero schedule setup <agent-id> -f daily -t 09:00 --prompt-file ./prompt.md\n Create and enable: zero schedule setup <agent-id> -f daily -t 09:00 -p \"run report\" --enable\n Override model: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider <id> --model MiniMax-M2.7\n Reset model override: zero schedule setup <agent-id> -f daily -t 09:00 -p \"...\" --model-provider default --model default\n\nNotes:\n - Re-running setup with the same agent updates the existing \"default\" schedule\n - Use -n to manage multiple named schedules for the same agent\n - --model-provider and --model default to inheriting the agent's configuration\n - Use 'zero org model-provider list' to see available providers and models\n - All flags are required in non-interactive mode; interactive mode prompts for missing values\n - If the user wants to be notified when a schedule completes, ask them where they want to receive the notification: web chat or Slack, then include it in the prompt`,\n )\n .action(\n withErrorHandler(async (agentIdentifier: string, options: SetupOptions) => {\n // 1. Resolve agent identifier (UUID or name) to compose ID\n const compose = await resolveCompose(agentIdentifier);\n if (!compose) {\n throw new Error(`Agent not found: ${agentIdentifier}`);\n }\n const agentId = compose.id;\n const scheduleName = options.name || \"default\";\n\n // 2. Check for existing schedule\n const existingSchedule = await findExistingSchedule(\n agentId,\n scheduleName,\n );\n\n const agentName = compose.name;\n console.log(\n chalk.dim(\n existingSchedule\n ? `Editing existing schedule for agent ${agentName}`\n : `Creating new schedule for agent ${agentName}`,\n ),\n );\n\n const defaults = getExistingDefaults(existingSchedule);\n\n // 3. Gather frequency\n const frequency = await gatherFrequency(\n options.frequency,\n defaults.frequency,\n );\n if (!frequency) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 4. Gather day and time\n const timing = await gatherTiming(frequency, options, defaults);\n if (!timing) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n const { day, time, atTime, intervalSeconds } = timing;\n\n // 5. Gather timezone\n const timezone = await gatherTimezone(\n options.timezone,\n existingSchedule?.timezone,\n );\n if (!timezone) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 6. Gather prompt\n const promptText_ = await gatherPromptText(\n options.prompt,\n options.promptFile,\n existingSchedule?.prompt,\n );\n if (!promptText_) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n // 7. Build trigger and deploy\n const deployResult = await buildAndDeploy({\n scheduleName,\n agentId,\n agentName,\n frequency,\n time,\n day,\n atTime,\n intervalSeconds,\n timezone,\n prompt: promptText_,\n existingEnabled: existingSchedule?.enabled,\n modelProviderId: parseModelFlag(options.modelProvider),\n selectedModel: parseModelFlag(options.model),\n });\n\n // 8. Display deployment result\n displayDeployResult(scheduleName, deployResult);\n\n // 9. Handle schedule enabling\n const shouldPromptEnable =\n deployResult.created ||\n (existingSchedule !== undefined && !existingSchedule.enabled);\n\n await handleScheduleEnabling({\n scheduleName,\n agentId,\n agentName,\n enableFlag: options.enable ?? false,\n shouldPromptEnable,\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroSchedules } from \"../../../lib/api\";\nimport { formatRelativeTime } from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all zero schedules\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule list`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSchedules();\n\n if (result.schedules.length === 0) {\n console.log(chalk.dim(\"No schedules found\"));\n console.log(\n chalk.dim(\" Create one with: zero schedule setup <agent-id>\"),\n );\n return;\n }\n\n const agentWidth = Math.max(\n 5,\n ...result.schedules.map((s) => {\n return s.agentId.length;\n }),\n );\n const scheduleWidth = Math.max(\n 8,\n ...result.schedules.map((s) => {\n return s.name.length;\n }),\n );\n const triggerWidth = Math.max(\n 7,\n ...result.schedules.map((s) => {\n return s.cronExpression\n ? s.cronExpression.length + s.timezone.length + 3\n : s.atTime?.length || 0;\n }),\n );\n\n const header = [\n \"AGENT\".padEnd(agentWidth),\n \"SCHEDULE\".padEnd(scheduleWidth),\n \"TRIGGER\".padEnd(triggerWidth),\n \"STATUS\".padEnd(8),\n \"NEXT RUN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const schedule of result.schedules) {\n const trigger = schedule.cronExpression\n ? `${schedule.cronExpression} (${schedule.timezone})`\n : schedule.atTime || \"-\";\n\n const status = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n\n const nextRun = schedule.enabled\n ? formatRelativeTime(schedule.nextRunAt)\n : \"-\";\n\n const row = [\n schedule.agentId.padEnd(agentWidth),\n schedule.name.padEnd(scheduleWidth),\n trigger.padEnd(triggerWidth),\n status.padEnd(8 + (schedule.enabled ? 0 : 2)),\n nextRun,\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolveZeroScheduleByAgent } from \"../../../lib/api\";\nimport {\n formatDateTime,\n detectTimezone,\n} from \"../../../lib/domain/schedule-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport type { ScheduleResponse } from \"@vm0/api-contracts/contracts/zero-schedules\";\n\n/**\n * Format date with styled relative time (adds chalk formatting)\n */\nfunction formatDateTimeStyled(dateStr: string | null): string {\n if (!dateStr) return chalk.dim(\"-\");\n const formatted = formatDateTime(dateStr);\n return formatted.replace(/\\(([^)]+)\\)$/, chalk.dim(\"($1)\"));\n}\n\n/**\n * Format trigger (cron or at) - timezone shown separately\n */\nfunction formatTrigger(schedule: ScheduleResponse): string {\n if (schedule.triggerType === \"loop\" && schedule.intervalSeconds !== null) {\n return `interval ${schedule.intervalSeconds}s ${chalk.dim(\"(loop)\")}`;\n }\n if (schedule.cronExpression) {\n return schedule.cronExpression;\n }\n if (schedule.atTime) {\n return `${schedule.atTime} ${chalk.dim(\"(one-time)\")}`;\n }\n return chalk.dim(\"-\");\n}\n\n/**\n * Print run configuration section\n */\nfunction printRunConfiguration(\n schedule: ScheduleResponse,\n showFullPrompt: boolean,\n): void {\n const statusText = schedule.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(`${\"Status:\".padEnd(16)}${statusText}`);\n\n console.log(`${\"Agent:\".padEnd(16)}${schedule.agentId}`);\n\n if (showFullPrompt) {\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(schedule.prompt)}`);\n } else {\n const truncated = schedule.prompt.length > 60;\n const promptPreview = truncated\n ? schedule.prompt.slice(0, 57) + \"...\"\n : schedule.prompt;\n console.log(`${\"Prompt:\".padEnd(16)}${chalk.dim(promptPreview)}`);\n if (truncated) {\n console.log(\n chalk.dim(\" Run with --prompt (-p) to see full prompt\"),\n );\n }\n }\n\n if (schedule.vars && Object.keys(schedule.vars).length > 0) {\n console.log(\n `${\"Variables:\".padEnd(16)}${Object.keys(schedule.vars).join(\", \")}`,\n );\n }\n\n if (schedule.secretNames && schedule.secretNames.length > 0) {\n console.log(`${\"Secrets:\".padEnd(16)}${schedule.secretNames.join(\", \")}`);\n }\n\n if (\n schedule.volumeVersions &&\n Object.keys(schedule.volumeVersions).length > 0\n ) {\n console.log(\n `${\"Volumes:\".padEnd(16)}${Object.keys(schedule.volumeVersions).join(\", \")}`,\n );\n }\n}\n\n/**\n * Print time schedule section\n */\nfunction printTimeSchedule(schedule: ScheduleResponse): void {\n console.log();\n console.log(`${\"Trigger:\".padEnd(16)}${formatTrigger(schedule)}`);\n console.log(`${\"Timezone:\".padEnd(16)}${detectTimezone()}`);\n\n if (schedule.enabled) {\n console.log(\n `${\"Next Run:\".padEnd(16)}${formatDateTimeStyled(schedule.nextRunAt)}`,\n );\n }\n\n if (schedule.triggerType === \"loop\" || schedule.triggerType === \"cron\") {\n const failureText =\n schedule.consecutiveFailures > 0\n ? chalk.yellow(`${schedule.consecutiveFailures}/3`)\n : chalk.dim(\"0/3\");\n console.log(`${\"Failures:\".padEnd(16)}${failureText}`);\n }\n}\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show detailed status of a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-p, --prompt\", \"Show full prompt content without truncation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule status <agent-id>\n zero schedule status <agent-id> -n my-schedule\n zero schedule status <agent-id> --prompt`,\n )\n .action(\n withErrorHandler(\n async (\n agentName: string,\n options: { name?: string; prompt?: boolean },\n ) => {\n const schedule = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n console.log();\n console.log(`Schedule for agent: ${chalk.cyan(agentName)}`);\n console.log(chalk.dim(\"━\".repeat(50)));\n\n printRunConfiguration(schedule, options.prompt ?? false);\n printTimeSchedule(schedule);\n\n console.log();\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n deleteZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule delete <agent-id>\n zero schedule delete <agent-id> -n my-schedule -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(\n async (agentName: string, options: { name?: string; yes?: boolean }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete schedule for agent ${chalk.cyan(agentName)}?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" deleted`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n enableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule enable <agent-id>\n zero schedule enable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await enableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" enabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n disableZeroSchedule,\n resolveZeroScheduleByAgent,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable a zero schedule\")\n .argument(\"<agent-id>\", \"Agent ID\")\n .option(\n \"-n, --name <schedule-name>\",\n \"Schedule name (required when agent has multiple schedules)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero schedule disable <agent-id>\n zero schedule disable <agent-id> -n my-schedule`,\n )\n .action(\n withErrorHandler(async (agentName: string, options: { name?: string }) => {\n const resolved = await resolveZeroScheduleByAgent(\n agentName,\n options.name,\n );\n\n await disableZeroSchedule({\n name: resolved.name,\n agentId: resolved.agentId,\n });\n\n console.log(chalk.green(`✓ Schedule \"${resolved.name}\" disabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSecretCommand = new Command()\n .name(\"secret\")\n .description(\"Read or write secrets (API keys, tokens)\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConnectorDerivedNames } from \"@vm0/connectors/connector-utils\";\nimport { listZeroSecrets } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all secrets\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroSecrets();\n\n if (result.secrets.length === 0) {\n console.log(chalk.dim(\"No secrets found\"));\n console.log();\n console.log(\"To add a secret:\");\n console.log(chalk.cyan(\" zero secret set MY_API_KEY --body <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Secrets:\"));\n console.log();\n\n for (const secret of result.secrets) {\n let typeIndicator = \"\";\n let derivedLine: string | null = null;\n\n if (secret.type === \"model-provider\") {\n typeIndicator = chalk.dim(\" [model-provider]\");\n } else if (secret.type === \"connector\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n } else {\n typeIndicator = chalk.dim(\" [connector]\");\n }\n } else if (secret.type === \"user\") {\n const derived = getConnectorDerivedNames(secret.name);\n if (derived) {\n typeIndicator = chalk.dim(` [${derived.connectorLabel} connector]`);\n derivedLine = chalk.dim(\n `Available as: ${derived.envVarNames.join(\", \")}`,\n );\n }\n }\n\n console.log(` ${chalk.cyan(secret.name)}${typeIndicator}`);\n if (derivedLine) {\n console.log(` ${derivedLine}`);\n }\n if (secret.description) {\n console.log(` ${chalk.dim(secret.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.secrets.length} secret(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptPassword } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a secret\")\n .argument(\"<name>\", \"Secret name (uppercase, e.g., MY_API_KEY)\")\n .option(\n \"-b, --body <value>\",\n \"Secret value (required in non-interactive mode)\",\n )\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n options: { body?: string; description?: string },\n ) => {\n let value: string;\n\n if (options.body !== undefined) {\n value = options.body;\n } else if (isInteractive()) {\n const prompted = await promptPassword(\"Enter secret value:\");\n if (prompted === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n value = prompted;\n } else {\n throw new Error(\"--body is required in non-interactive mode\", {\n cause: new Error(\n `Usage: zero secret set ${name} --body \"your-secret-value\"`,\n ),\n });\n }\n\n let secret;\n try {\n secret = await setZeroSecret({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid secret names: MY_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Secret \"${secret.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroSecret } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete a secret\")\n .argument(\"<name>\", \"Secret name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete secret \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroSecret(name);\n console.log(chalk.green(`✓ Secret \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroChatMessageCommand } from \"./message\";\n\nexport const zeroChatCommand = new Command()\n .name(\"chat\")\n .description(\"Send messages to web chat threads\")\n .addCommand(zeroChatMessageCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent: zero chat message send -a <agent-id> --text \"Hello!\"`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroChatMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage chat messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero chat message send -t <thread-id> --text \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendChatMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a web chat thread\")\n .option(\"-t, --thread <id>\", \"Existing chat thread ID\")\n .option(\"-a, --agent <agentId>\", \"Agent ID (creates a new thread)\")\n .option(\"--text <message>\", \"Message text\")\n .option(\"--title <title>\", \"Thread title (only with --agent)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Send to existing thread: zero chat message send -t <thread-id> --text \"Hello!\"\n Send to agent (new thread): zero chat message send -a <agent-id> --text \"Hello!\"\n\nNotes:\n - Either --thread or --agent is required; they are mutually exclusive\n - --text is required (or pipe via stdin)`,\n )\n .action(\n withErrorHandler(\n async (options: {\n thread?: string;\n agent?: string;\n text?: string;\n title?: string;\n }) => {\n let text = options.text;\n const { thread, agent, title } = options;\n\n // Validate mutual exclusion: exactly one of --thread or --agent\n if (!thread && !agent) {\n throw new Error(\"Either --thread or --agent must be provided\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"\\n zero chat message send -a AGENT_ID --text \"your message\"',\n ),\n });\n }\n if (thread && agent) {\n throw new Error(\"--thread and --agent are mutually exclusive\", {\n cause: new Error(\n \"Provide either --thread to send to an existing thread or --agent to create a new thread, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"--text is required\", {\n cause: new Error(\n 'Usage: zero chat message send -t THREAD_ID --text \"your message\"',\n ),\n });\n }\n\n const result = await sendChatMessage({\n thread: thread || undefined,\n agent: agent || undefined,\n text,\n title: title || undefined,\n });\n\n console.log(\n chalk.green(\n `✓ Message sent (id: ${result.messageId}, thread: ${result.threadId})`,\n ),\n );\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { zeroSlackMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { downloadFileCommand } from \"./download-file\";\n\nexport const zeroSlackCommand = new Command()\n .name(\"slack\")\n .description(\n \"Send messages, upload files, and download files from Slack as the bot\",\n )\n .addCommand(zeroSlackMessageCommand)\n .addCommand(uploadFileCommand)\n .addCommand(downloadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Send a message: zero slack message send -c <channel-id> -t \"Hello!\"\n Reply in a thread: zero slack message send -c <channel-id> --thread <ts> -t \"reply\"\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c <channel-id>\n Download a file: zero slack download-file <file-id> -o /tmp/out.png`,\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroSlackMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Slack messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero slack message send -c <channel-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendSlackMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Slack channel or DM a user\")\n .option(\"-c, --channel <id>\", \"Channel ID\")\n .option(\"-u, --user <id>\", 'Slack user ID for DM (use \"me\" for yourself)')\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--thread <ts>\", \"Thread timestamp for replies\")\n .option(\"--blocks <json>\", \"Block Kit JSON string\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero slack message send -c C01234 -t \"Hello!\"\n DM a user: zero slack message send -u U0A8V9X98QJ -t \"Hello!\"\n DM yourself: zero slack message send -u me -t \"Hello!\"\n Reply in thread: zero slack message send -c C01234 --thread 1234567890.123456 -t \"reply\"\n Rich blocks: zero slack message send -c C01234 --blocks '[{\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Bold*\"}}]'\n\nNotes:\n - Either --channel or --user is required; they are mutually exclusive\n - Either --text or --blocks is required; both can be used together`,\n )\n .action(\n withErrorHandler(\n async (options: {\n channel?: string;\n user?: string;\n text?: string;\n thread?: string;\n blocks?: string;\n }) => {\n let text = options.text;\n const { channel, user, thread, blocks: blocksStr } = options;\n\n // Validate mutual exclusion: exactly one of --channel or --user\n if (!channel && !user) {\n throw new Error(\"Either --channel or --user must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"\\n zero slack message send -u USER_ID -t \"your message\"',\n ),\n });\n }\n if (channel && user) {\n throw new Error(\"--channel and --user are mutually exclusive\", {\n cause: new Error(\n \"Provide either --channel to send to a channel or --user to DM a user, not both\",\n ),\n });\n }\n\n // Read from stdin if text not provided and stdin is explicitly piped\n // (isTTY is false when piped, undefined when no TTY context e.g. tests)\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n // Parse blocks JSON if provided\n let blocks: Array<{ type: string; [key: string]: unknown }> | undefined;\n if (blocksStr) {\n try {\n blocks = JSON.parse(blocksStr) as Array<{\n type: string;\n [key: string]: unknown;\n }>;\n } catch {\n throw new Error(\"Invalid JSON for --blocks flag\", {\n cause: new Error(\n \"Provide a valid JSON array of Block Kit blocks\",\n ),\n });\n }\n }\n\n // Validate at least one of text or blocks\n if (!text && !blocks) {\n throw new Error(\"Either --text or --blocks must be provided\", {\n cause: new Error(\n 'Usage: zero slack message send -c CHANNEL_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendSlackMessage({\n channel: channel || undefined,\n user: user || undefined,\n text: text || undefined,\n threadTs: thread,\n blocks,\n });\n\n const tsInfo = result.ts ? ` (ts: ${result.ts})` : \"\";\n console.log(chalk.green(`✓ Message sent${tsInfo}`));\n },\n ),\n );\n","import { statSync, readFileSync } from \"fs\";\nimport { basename } from \"path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { initSlackFileUpload, completeSlackFileUpload } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a file to a Slack channel as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"-c, --channel <id>\", \"Slack channel ID\")\n .option(\"--thread <ts>\", \"Thread timestamp to post as a reply\")\n .option(\"--title <title>\", \"Display title for the file\")\n .option(\"--comment <text>\", \"Initial comment to accompany the file\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero slack upload-file -f /tmp/report.pdf -c C01234\n Upload to thread: zero slack upload-file -f /tmp/log.txt -c C01234 --thread 1234567890.123456\n With title and comment: zero slack upload-file -f /tmp/data.csv -c C01234 --title \"Daily Report\" --comment \"Here's the report\"\n\nNotes:\n - Uses the bot token (not user SLACK_TOKEN), so no files:write permission is needed\n - Returns file_id and permalink for reference`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n channel: string;\n thread?: string;\n title?: string;\n comment?: string;\n }) => {\n // Validate file exists and get size\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n fileSize = stat.size;\n } catch {\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n\n const filename = basename(options.file);\n\n // Step 1: Get pre-signed upload URL from server\n const { uploadUrl, fileId } = await initSlackFileUpload({\n filename,\n length: fileSize,\n });\n\n // Step 2: Upload file directly to Slack's pre-signed URL\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(uploadUrl, {\n method: \"POST\",\n body: fileContent,\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n // Step 3: Complete the upload and share to channel/thread\n const result = await completeSlackFileUpload({\n fileId,\n channel: options.channel,\n threadTs: options.thread,\n title: options.title,\n initialComment: options.comment,\n });\n\n console.log(chalk.green(`✓ File uploaded (file_id: ${result.fileId})`));\n console.log(chalk.dim(` permalink: ${result.permalink}`));\n },\n ),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadSlackFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Slack file id.\n * Uses the system temp directory; extension is appended later once the\n * mimetype is known.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `slack-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Slack file by id using the bot token\")\n .argument(\"<file-id>\", \"Slack file id (e.g. F01234ABCD)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/slack-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero slack download-file F01234ABCD\n Download to explicit path: zero slack download-file F01234ABCD -o /tmp/image.png\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/slack-F01234ABCD\",\"mimetype\":\"image/png\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the bot token on the server side; no user Slack token is needed\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadSlackFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { zeroTelegramBotCommand } from \"./bot\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { zeroTelegramMessageCommand } from \"./message\";\nimport { uploadFileCommand } from \"./upload-file\";\n\nexport const zeroTelegramCommand = new Command()\n .name(\"telegram\")\n .description(\n \"Inspect bots, send messages, upload files, and download files from Telegram\",\n )\n .addCommand(zeroTelegramBotCommand)\n .addCommand(zeroTelegramMessageCommand)\n .addCommand(downloadFileCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n List bots: zero telegram bot list\n Send a message: zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id <bot-id> -c <chat-id>\n Download a file: zero telegram download-file <file-id> --bot-id <bot-id> -o /tmp/out.jpg`,\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\n\nexport const zeroTelegramBotCommand = new Command()\n .name(\"bot\")\n .description(\"Inspect Telegram bots\")\n .addCommand(listCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listTelegramBots } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport type { TelegramBotListItem } from \"@vm0/api-contracts/contracts/integrations\";\n\nfunction usernameLabel(bot: TelegramBotListItem): string {\n if (!bot.username) return \"-\";\n return bot.username.startsWith(\"@\") ? bot.username : `@${bot.username}`;\n}\n\nfunction statusLabel(bot: TelegramBotListItem): string {\n if (bot.tokenStatus === \"valid\") return chalk.green(\"valid\");\n if (bot.tokenStatus === \"invalid\") return chalk.red(\"invalid\");\n return chalk.yellow(\"unknown\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Telegram bots available in the active organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram bot list\n\nNotes:\n - Use this to find the --bot-id value before sending Telegram messages.`,\n )\n .action(\n withErrorHandler(async () => {\n const result = await listTelegramBots();\n const { bots } = result;\n\n if (bots.length === 0) {\n console.log(chalk.dim(\"No Telegram bots found\"));\n console.log(\n chalk.dim(\" Add one from Settings > Integrations > Telegram\"),\n );\n return;\n }\n\n const botIdWidth = Math.max(\n 6,\n ...bots.map((bot) => {\n return bot.id.length;\n }),\n );\n const usernameWidth = Math.max(\n 8,\n ...bots.map((bot) => {\n return usernameLabel(bot).length;\n }),\n );\n const agentWidth = Math.max(\n 5,\n ...bots.map((bot) => {\n return (bot.agent?.name ?? \"-\").length;\n }),\n );\n\n const header = [\n \"BOT ID\".padEnd(botIdWidth),\n \"USERNAME\".padEnd(usernameWidth),\n \"AGENT\".padEnd(agentWidth),\n \"CONNECTED\",\n \"TOKEN\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const bot of bots) {\n const row = [\n bot.id.padEnd(botIdWidth),\n usernameLabel(bot).padEnd(usernameWidth),\n (bot.agent?.name ?? \"-\").padEnd(agentWidth),\n (bot.isConnected ? \"yes\" : \"no\").padEnd(9),\n statusLabel(bot),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadTelegramFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a Telegram file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `telegram-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a Telegram file by id using the bot token\")\n .argument(\"<file-id>\", \"Telegram file id from a [Telegram file] block\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/telegram-<file-id>)\",\n )\n .requiredOption(\n \"--bot-id <bot-id>\",\n \"Telegram bot id from the [Telegram file] block\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789\n Download to explicit path: zero telegram download-file AgACAgUAAxkBAA --bot-id 123456789 -o /tmp/photo.jpg\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/telegram-AgACAgUAAxkBAA\",\"mimetype\":\"image/jpeg\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(\n async (fileId: string, options: { out?: string; botId: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadTelegramFile(\n fileId,\n options.botId,\n outPath,\n );\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { sendCommand } from \"./send\";\n\nexport const zeroTelegramMessageCommand = new Command()\n .name(\"message\")\n .description(\"Manage Telegram messages\")\n .addCommand(sendCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero telegram message send --bot-id <bot-id> -c <chat-id> -t \"Hello!\"`,\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { sendTelegramMessage } from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\n\nfunction parsePositiveInteger(value: string, flag: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nexport const sendCommand = new Command()\n .name(\"send\")\n .description(\"Send a message to a Telegram chat as the bot\")\n .requiredOption(\"--bot-id <id>\", \"Telegram bot ID\")\n .requiredOption(\"-c, --chat-id <id>\", \"Telegram chat ID\")\n .option(\"-t, --text <message>\", \"Message text\")\n .option(\"--reply-to-message-id <id>\", \"Message ID to reply to\")\n .option(\"--message-thread-id <id>\", \"Telegram forum topic thread ID\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Simple message: zero telegram message send --bot-id 123456789 -c -1001234567890 -t \"Hello!\"\n Reply to message: zero telegram message send --bot-id 123456789 -c -1001234567890 --reply-to-message-id 42 -t \"reply\"\n Forum topic message: zero telegram message send --bot-id 123456789 -c -1001234567890 --message-thread-id 7 -t \"topic update\"\n\nNotes:\n - Message text can be provided with --text or piped on stdin\n - Choose an explicit --bot-id. Run \"zero telegram bot list\" to inspect available bots.`,\n )\n .action(\n withErrorHandler(\n async (options: {\n botId: string;\n chatId: string;\n text?: string;\n replyToMessageId?: string;\n messageThreadId?: string;\n }) => {\n let text = options.text;\n if (!text && process.stdin.isTTY === false) {\n text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n }\n\n if (!text) {\n throw new Error(\"Either --text or piped stdin must be provided\", {\n cause: new Error(\n 'Usage: zero telegram message send --bot-id BOT_ID -c CHAT_ID -t \"your message\"',\n ),\n });\n }\n\n const result = await sendTelegramMessage({\n botId: options.botId,\n chatId: options.chatId,\n text,\n replyToMessageId: options.replyToMessageId\n ? parsePositiveInteger(\n options.replyToMessageId,\n \"reply-to-message-id\",\n )\n : undefined,\n messageThreadId: options.messageThreadId\n ? parsePositiveInteger(options.messageThreadId, \"message-thread-id\")\n : undefined,\n });\n\n console.log(\n chalk.green(`✓ Message sent (message_id: ${result.messageId})`),\n );\n },\n ),\n );\n","import { readFileSync, statSync } from \"fs\";\nimport { basename, extname } from \"path\";\nimport { Command } from \"commander\";\nimport {\n completeTelegramFileUpload,\n initTelegramFileUpload,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".json\": \"application/json\",\n};\n\nfunction inferContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\nfunction parseMessageThreadId(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(\"message-thread-id must be a positive integer\");\n }\n return parsed;\n}\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file to a Telegram chat as the bot\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .requiredOption(\"--bot-id <bot-id>\", \"Telegram bot id to send through\")\n .requiredOption(\"-c, --chat-id <chat-id>\", \"Telegram chat id or @channel\")\n .option(\"--caption <text>\", \"Caption to accompany the file\")\n .option(\"--message-thread-id <id>\", \"Forum topic message thread id\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero telegram upload-file -f /tmp/report.pdf --bot-id 123456789 -c -1001234567890\n Upload to a topic: zero telegram upload-file -f /tmp/log.txt --bot-id 123456789 -c -1001234567890 --message-thread-id 42\n With a caption: zero telegram upload-file -f /tmp/data.csv --bot-id 123456789 -c @channel --caption \"Daily report\"\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"messageId\":123,\"chatId\":\"-1001234567890\",\"fileId\":\"...\",\"filename\":\"report.pdf\",\"mimetype\":\"application/pdf\",\"size\":12345,\"url\":\"https://...\"}\n\nNotes:\n - Uses the Telegram bot token on the server side\n - Uploads through VM0 storage first, then asks Telegram to fetch the file URL\n - VM0 does not apply file type or size restrictions before calling Telegram`,\n )\n .action(\n withErrorHandler(\n async (options: {\n file: string;\n botId: string;\n chatId: string;\n caption?: string;\n messageThreadId?: string;\n contentType?: string;\n }) => {\n let fileSize: number;\n try {\n const stat = statSync(options.file);\n if (!stat.isFile()) {\n throw new Error(`Not a regular file: ${options.file}`);\n }\n fileSize = stat.size;\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Not \")) {\n throw error;\n }\n throw new Error(`File not found: ${options.file}`);\n }\n\n if (fileSize === 0) {\n throw new Error(\"File is empty\");\n }\n const filename = basename(options.file);\n const contentType =\n options.contentType ?? inferContentType(options.file);\n const messageThreadId = parseMessageThreadId(options.messageThreadId);\n\n const prepared = await initTelegramFileUpload({\n filename,\n contentType,\n length: fileSize,\n });\n\n const fileContent = readFileSync(options.file);\n const uploadResponse = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": prepared.contentType },\n body: new Uint8Array(fileContent),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n const result = await completeTelegramFileUpload({\n uploadId: prepared.uploadId,\n botId: options.botId,\n chatId: options.chatId,\n contentType: prepared.contentType,\n caption: options.caption,\n messageThreadId,\n });\n\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { listCommand } from \"./list\";\nimport { setCommand } from \"./set\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroVariableCommand = new Command()\n .name(\"variable\")\n .description(\"Read or write non-sensitive configuration values\")\n .addCommand(listCommand)\n .addCommand(setCommand)\n .addCommand(deleteCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroVariables } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Truncate value for display if too long\n */\nfunction truncateValue(value: string, maxLength: number = 60): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 15) + \"... [truncated]\";\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all variables\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroVariables();\n\n if (result.variables.length === 0) {\n console.log(chalk.dim(\"No variables found\"));\n console.log();\n console.log(\"To add a variable:\");\n console.log(chalk.cyan(\" zero variable set MY_VAR <value>\"));\n return;\n }\n\n console.log(chalk.bold(\"Variables:\"));\n console.log();\n\n for (const variable of result.variables) {\n const displayValue = truncateValue(variable.value);\n console.log(` ${chalk.cyan(variable.name)} = ${displayValue}`);\n if (variable.description) {\n console.log(` ${chalk.dim(variable.description)}`);\n }\n console.log(\n ` ${chalk.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`,\n );\n console.log();\n }\n\n console.log(chalk.dim(`Total: ${result.variables.length} variable(s)`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { setZeroVariable } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Create or update a variable\")\n .argument(\"<name>\", \"Variable name (uppercase, e.g., MY_VAR)\")\n .argument(\"<value>\", \"Variable value\")\n .option(\"-d, --description <description>\", \"Optional description\")\n .action(\n withErrorHandler(\n async (\n name: string,\n value: string,\n options: { description?: string },\n ) => {\n let variable;\n try {\n variable = await setZeroVariable({\n name,\n value,\n description: options.description,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"must contain only uppercase\")\n ) {\n throw new Error(error.message, {\n cause: new Error(\n \"Examples of valid variable names: MY_VAR, API_URL, DEBUG_MODE\",\n ),\n });\n }\n throw error;\n }\n\n console.log(chalk.green(`✓ Variable \"${variable.name}\" saved`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteZeroVariable } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .description(\"Delete a variable\")\n .argument(\"<name>\", \"Variable name to delete\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n\n const confirmed = await promptConfirm(\n `Are you sure you want to delete variable \"${name}\"?`,\n false,\n );\n\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteZeroVariable(name);\n console.log(chalk.green(`✓ Variable \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getApiUrl,\n getActiveOrg,\n getToken,\n decodeZeroTokenPayload,\n} from \"../../lib/api/config\";\nimport {\n listZeroConnectors,\n getZeroAgent,\n getZeroAgentUserConnectors,\n} from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n isFirewallConnectorType,\n getConnectorFirewall,\n resolveFirewallPolicies,\n} from \"@vm0/connectors/firewalls\";\nimport type { FirewallPolicies } from \"@vm0/connectors/firewall-types\";\nimport { policyIcon } from \"../../lib/utils/format-utils\";\n\n/**\n * Detect if running inside a zero sandbox (agent runtime).\n * Uses ZERO_AGENT_ID (not VM0_RUN_ID) because the zero CLI operates in the\n * zero agent context where ZERO_AGENT_ID is the canonical sandbox indicator.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.ZERO_AGENT_ID;\n}\n\nfunction formatConnectorIdentity(connector: {\n externalUsername: string | null;\n externalEmail: string | null;\n needsReconnect: boolean;\n}): string {\n let identity = \"\";\n if (connector.externalUsername && connector.externalEmail) {\n identity = `@${connector.externalUsername} (${connector.externalEmail})`;\n } else if (connector.externalUsername) {\n identity = `@${connector.externalUsername}`;\n } else if (connector.externalEmail) {\n identity = connector.externalEmail;\n }\n if (connector.needsReconnect) {\n identity += ` ${chalk.yellow(\"(needs reconnect)\")}`;\n }\n return identity;\n}\n\nfunction printConnectorPermissions(\n type: string,\n resolvedPolicies: FirewallPolicies | null,\n): void {\n if (!isFirewallConnectorType(type)) return;\n\n const refPolicy = resolvedPolicies?.[type];\n if (!refPolicy) {\n console.log(chalk.dim(\" full access — no permission rules configured\"));\n return;\n }\n\n const config = getConnectorFirewall(type);\n const permissions = config.apis.flatMap((a) => {\n return a.permissions ?? [];\n });\n\n if (\n permissions.length === 0 &&\n Object.keys(refPolicy.policies).length === 0\n ) {\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(` ${unknownIcon} unknown endpoints`);\n return;\n }\n\n const nameWidth = Math.max(\n \"unknown endpoints\".length,\n ...permissions.map((p) => {\n return p.name.length;\n }),\n );\n\n for (const perm of permissions) {\n const policy = refPolicy.policies[perm.name] ?? \"deny\";\n const icon = policyIcon(policy);\n const desc = perm.description ?? \"\";\n console.log(` ${icon} ${perm.name.padEnd(nameWidth)} ${desc}`);\n }\n\n const unknownIcon = policyIcon(refPolicy.unknownPolicy ?? \"allow\");\n console.log(\n ` ${unknownIcon} ${\"unknown endpoints\".padEnd(nameWidth)} Endpoints not matching any rule`,\n );\n}\n\nasync function showSandboxInfo(showPermissions: boolean): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const payload = decodeZeroTokenPayload();\n\n console.log(`Agent ID: ${agentId}`);\n console.log(`Run ID: ${payload?.runId ?? chalk.dim(\"unavailable\")}`);\n console.log(`Org ID: ${payload?.orgId ?? chalk.dim(\"unavailable\")}`);\n\n // Capabilities section\n if (payload?.capabilities?.length) {\n console.log();\n console.log(chalk.bold(\"Capabilities:\"));\n console.log(` ${payload.capabilities.join(\", \")}`);\n }\n\n // Connected Services section\n try {\n if (showPermissions) {\n // Full mode: fetch all 3 APIs for permission details\n const [connectorsResult, agentResult, enabledResult] =\n await Promise.allSettled([\n listZeroConnectors(),\n getZeroAgent(agentId!),\n getZeroAgentUserConnectors(agentId!),\n ]);\n\n if (connectorsResult.status === \"rejected\") return;\n\n const identities = connectorsResult.value.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n let resolvedPolicies: FirewallPolicies | null = null;\n const permissionDataAvailable =\n agentResult.status === \"fulfilled\" &&\n enabledResult.status === \"fulfilled\";\n if (permissionDataAvailable) {\n resolvedPolicies = resolveFirewallPolicies(\n agentResult.value.permissionPolicies,\n enabledResult.value,\n );\n }\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n\n if (permissionDataAvailable) {\n printConnectorPermissions(connector.type, resolvedPolicies);\n }\n }\n } else {\n // Default mode: only fetch connector identities (1 API call)\n const connectors = await listZeroConnectors();\n const identities = connectors.connectors.filter((c) => {\n return c.externalUsername !== null || c.externalEmail !== null;\n });\n\n if (identities.length === 0) return;\n\n console.log();\n console.log(chalk.bold(\"Connectors:\"));\n for (const connector of identities) {\n const identity = formatConnectorIdentity(connector);\n console.log(` ${connector.type.padEnd(14)}${identity}`);\n }\n }\n } catch {\n // Silently skip — connector info is supplementary\n }\n}\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.ZERO_TOKEN\n ? \"ZERO_TOKEN env var\"\n : 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 zeroWhoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show agent identity, run ID, and capabilities\")\n .option(\"--permissions\", \"Show full permission details for each connector\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero whoami\n zero whoami --permissions\n\nNotes:\n - Inside sandbox: shows agent ID, run ID, org ID, and granted capabilities\n - Use --permissions to see detailed permission breakdown per connector\n - Your agent ID is also available as $ZERO_AGENT_ID`,\n )\n .action(\n withErrorHandler(async (options: { permissions?: boolean }) => {\n if (isInsideSandbox()) {\n await showSandboxInfo(options.permissions ?? false);\n } else {\n await showLocalInfo();\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { editCommand } from \"./edit\";\nimport { viewCommand } from \"./view\";\nimport { listCommand } from \"./list\";\nimport { deleteCommand } from \"./delete\";\n\nexport const zeroSkillCommand = new Command(\"skill\")\n .description(\"Manage custom skills\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create from directory: zero skill create my-skill --dir ./skills/my-skill/\n List all skills: zero skill list\n View skill content: zero skill view my-skill\n Update skill content: zero skill edit my-skill --dir ./skills/my-skill/\n Delete a skill: zero skill delete my-skill -y\n\nSkill Binding:\n Bind to agent: zero agent edit <id> --add-skill my-skill\n Unbind from agent: zero agent edit <id> --remove-skill my-skill\n Replace all skills: zero agent edit <id> --skills a,b,c`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a custom skill in the organization\")\n .argument(\"<name>\", \"Skill name (lowercase alphanumeric with hyphens)\")\n .requiredOption(\"--dir <path>\", \"Path to directory containing SKILL.md\")\n .option(\"--display-name <name>\", \"Skill display name\")\n .option(\"--description <text>\", \"Skill description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill create my-skill --dir ./skills/my-skill/\n zero skill create my-skill --dir ./skills/my-skill/ --display-name \"My Skill\" --description \"Does things\"\n\nNotes:\n - The directory must contain a SKILL.md file\n - All files in the directory are uploaded (hidden files and node_modules excluded)\n - The skill is created in the organization but not bound to any agent\n - Use 'zero agent edit <id> --add-skill <name>' to bind a skill to an agent`,\n )\n .action(\n withErrorHandler(\n async (\n name: string,\n options: {\n dir: string;\n displayName?: string;\n description?: string;\n },\n ) => {\n const files = readSkillDirectory(options.dir);\n\n const skill = await createSkill({\n name,\n files,\n displayName: options.displayName,\n description: options.description,\n });\n\n console.log(chalk.green(`✓ Skill \"${skill.name}\" created`));\n console.log(` Name: ${skill.name}`);\n console.log(` Files: ${files.length} file(s)`);\n if (skill.displayName) {\n console.log(` Display Name: ${skill.displayName}`);\n }\n if (skill.description) {\n console.log(` Description: ${skill.description}`);\n }\n },\n ),\n );\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst IGNORED_NAMES = new Set([\"node_modules\", \".git\", \".DS_Store\"]);\n\n/**\n * Recursively read all files from a skill directory.\n *\n * Skips hidden files (starting with .), node_modules, and .git.\n * Throws if SKILL.md is not found at the root.\n */\nexport function readSkillDirectory(\n dirPath: string,\n): Array<{ path: string; content: string }> {\n const files: Array<{ path: string; content: string }> = [];\n\n function walk(dir: string, prefix: string) {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith(\".\") || IGNORED_NAMES.has(entry.name)) continue;\n\n const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n walk(join(dir, entry.name), relPath);\n } else {\n files.push({\n path: relPath,\n content: readFileSync(join(dir, entry.name), \"utf-8\"),\n });\n }\n }\n }\n\n walk(dirPath, \"\");\n\n if (\n !files.some((f) => {\n return f.path === \"SKILL.md\";\n })\n ) {\n throw new Error(`SKILL.md not found in ${dirPath}`);\n }\n\n return files;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { updateSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSkillDirectory } from \"../../../lib/skill-directory\";\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Update a custom skill's content\")\n .argument(\"<name>\", \"Skill name\")\n .requiredOption(\n \"--dir <path>\",\n \"Path to directory containing updated skill files\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill edit my-skill --dir ./skills/my-skill/`,\n )\n .action(\n withErrorHandler(async (name: string, options: { dir: string }) => {\n const files = readSkillDirectory(options.dir);\n await updateSkill(name, { files });\n\n console.log(\n chalk.green(`✓ Skill \"${name}\" updated (${files.length} file(s))`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a custom skill\")\n .argument(\"<name>\", \"Skill name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill view my-skill`,\n )\n .action(\n withErrorHandler(async (name: string) => {\n const skill = await getSkill(name);\n\n console.log(chalk.bold(skill.name));\n if (skill.displayName) console.log(chalk.dim(skill.displayName));\n console.log();\n console.log(`Name: ${skill.name}`);\n if (skill.displayName) console.log(`Display Name: ${skill.displayName}`);\n if (skill.description) console.log(`Description: ${skill.description}`);\n\n if (skill.files && skill.files.length > 0) {\n console.log();\n console.log(chalk.dim(\"── Files ──\"));\n for (const f of skill.files) {\n console.log(` ${f.path} (${f.size} bytes)`);\n }\n }\n\n console.log();\n if (skill.content) {\n console.log(chalk.dim(\"── SKILL.md ──\"));\n console.log(skill.content);\n } else {\n console.log(chalk.dim(\"No content\"));\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listSkills } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List custom skills in the organization\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill list`,\n )\n .action(\n withErrorHandler(async () => {\n const skills = await listSkills();\n\n if (skills.length === 0) {\n console.log(chalk.dim(\"No custom skills found\"));\n console.log(\n chalk.dim(\" Create one with: zero skill create <name> --dir <path>\"),\n );\n return;\n }\n\n const nameWidth = Math.max(\n 4,\n ...skills.map((s) => {\n return s.name.length;\n }),\n );\n const displayWidth = Math.max(\n 12,\n ...skills.map((s) => {\n return (s.displayName ?? \"\").length;\n }),\n );\n\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"DISPLAY NAME\".padEnd(displayWidth),\n \"DESCRIPTION\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const skill of skills) {\n const row = [\n skill.name.padEnd(nameWidth),\n (skill.displayName ?? \"-\").padEnd(displayWidth),\n skill.description ?? \"-\",\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSkill, deleteSkill } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a custom skill from the organization\")\n .argument(\"<name>\", \"Skill name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero skill delete my-skill\n zero skill delete my-skill -y\n\nNotes:\n - This removes the skill from the organization and unbinds it from all agents\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (name: string, options: { yes?: boolean }) => {\n await getSkill(name);\n\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete skill '${name}'? This will unbind it from all agents.`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteSkill(name);\n console.log(chalk.green(`✓ Skill \"${name}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { paginate } from \"../../../lib/utils/paginate\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\n\nconst PAGE_LIMIT = 100;\n\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n framework: string,\n): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData, framework);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\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 firstResponse = await getZeroRunAgentEvents(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n let allEvents: RunEvent[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.events.length >= options.targetCount)\n ) {\n allEvents =\n options.targetCount === \"all\"\n ? firstResponse.events\n : firstResponse.events.slice(0, options.targetCount);\n } else {\n const lastEvent = firstResponse.events[firstResponse.events.length - 1];\n const firstPageTimestamp = lastEvent\n ? new Date(lastEvent.createdAt).getTime()\n : undefined;\n\n const remainingEvents = await paginate<RunEvent>({\n fetchPage: async (since) => {\n const response = await getZeroRunAgentEvents(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.events, hasMore: response.hasMore };\n },\n getTimestamp: (event) => {\n return new Date(event.createdAt).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.events.length,\n initialSince: firstPageTimestamp,\n });\n\n allEvents = [...firstResponse.events, ...remainingEvents];\n\n if (\n options.targetCount !== \"all\" &&\n allEvents.length > options.targetCount\n ) {\n allEvents = allEvents.slice(0, options.targetCount);\n }\n }\n\n const events =\n options.order === \"desc\" ? [...allEvents].reverse() : allEvents;\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n const framework = firstResponse.framework;\n\n for (const event of events) {\n renderAgentEvent(event, renderer, framework);\n }\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) {\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 = Math.max(1, parseInt(options.head!, 10));\n } else if (isTail) {\n targetCount = Math.max(1, parseInt(options.tail!, 10));\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 { withErrorHandler } from \"../../../lib/command\";\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 new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <name>\", \"Filter by agent name\")\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 my-agent\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 = options.limit ? parseInt(options.limit, 10) : undefined;\n const since = options.since ? parseTime(options.since) : undefined;\n\n const result = await listZeroLogs({\n agent: 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","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchZeroLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { parseEvent } from \"../../../lib/events/event-parser-factory\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface LogsSearchCliOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = parseEvent(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${runId} (${agentName}, ${time}) ──────────`;\n}\n\nfunction parseContextOptions(options: LogsSearchCliOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nfunction renderResults(response: LogsSearchResponse): void {\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log();\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport async function runLogsSearch(\n keyword: string,\n options: LogsSearchCliOptions,\n): Promise<void> {\n const { before, after } = parseContextOptions(options);\n\n if (options.run && !isUUID(options.run)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${options.run}\" — 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 since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchZeroLogs({\n keyword,\n agent: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs search \"error\"\n zero logs search \"timeout\" --agent my-agent -C 2\n zero logs search \"failed\" --since 30d --limit 50`,\n )\n .action(\n withErrorHandler(async (keyword: string, options: LogsSearchCliOptions) => {\n await runLogsSearch(keyword, options);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero doctor check-connector --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agent: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return new Date(iso).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agent: options.agent,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(query, options);\n return;\n case \"chat\":\n await runChatSource(query, options);\n return;\n case \"slack\":\n await runSlackSource(query, options);\n return;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n requestDeveloperSupportConsent,\n submitDeveloperSupport,\n} from \"../../lib/api\";\n\nexport const zeroDeveloperSupportCommand = new Command()\n .name(\"developer-support\")\n .description(\"Submit a diagnostic report to the dev team\")\n .requiredOption(\"--title <text>\", \"Issue title\")\n .requiredOption(\"--description <text>\", \"Diagnostic description\")\n .option(\"--consent-code <code>\", \"User-provided verification code\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Step 1 — Get consent code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\"\n\n Step 2 — Submit with code:\n zero developer-support --title \"GitHub 403 error\" --description \"Connector connected but API returns 403\" --consent-code A7X3\n\nNotes:\n - The consent code must be provided by the user to confirm sharing their conversation\n - The dev team will receive a diagnostic bundle with conversation, environment, and connector info`,\n )\n .action(\n withErrorHandler(\n async (options: {\n title: string;\n description: string;\n consentCode?: string;\n }) => {\n if (!options.consentCode) {\n const { consentCode } = await requestDeveloperSupportConsent({\n title: options.title,\n description: options.description,\n });\n console.log(\n \"Consent required to share chat history with developers.\",\n );\n console.log(`Code: ${consentCode}`);\n console.log(\"Ask the user to confirm by providing this code.\");\n } else {\n const { reference } = await submitDeveloperSupport({\n title: options.title,\n description: options.description,\n consentCode: options.consentCode,\n });\n console.log(\"Developer support request submitted successfully.\");\n console.log(`Reference: ${reference}`);\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport { hostStartCommand, hostStopCommand } from \"./host\";\nimport {\n clientScreenshotCommand,\n clientZoomCommand,\n clientInfoCommand,\n clientLeftClickCommand,\n clientRightClickCommand,\n clientMiddleClickCommand,\n clientDoubleClickCommand,\n clientTripleClickCommand,\n clientLeftClickDragCommand,\n clientLeftMouseDownCommand,\n clientLeftMouseUpCommand,\n clientScrollCommand,\n clientReadClipboardCommand,\n clientWriteClipboardCommand,\n clientKeyCommand,\n clientHoldKeyCommand,\n clientTypeCommand,\n clientOpenAppCommand,\n clientMouseMoveCommand,\n clientCursorPositionCommand,\n} from \"./client\";\n\nconst hostCommand = new Command()\n .name(\"host\")\n .description(\"Manage computer-use host daemon\")\n .addCommand(hostStartCommand)\n .addCommand(hostStopCommand);\n\nconst clientCommand = new Command()\n .name(\"client\")\n .description(\"Interact with remote computer-use host\")\n .addCommand(clientScreenshotCommand)\n .addCommand(clientZoomCommand)\n .addCommand(clientInfoCommand)\n .addCommand(clientLeftClickCommand)\n .addCommand(clientRightClickCommand)\n .addCommand(clientMiddleClickCommand)\n .addCommand(clientDoubleClickCommand)\n .addCommand(clientTripleClickCommand)\n .addCommand(clientLeftClickDragCommand)\n .addCommand(clientLeftMouseDownCommand)\n .addCommand(clientLeftMouseUpCommand)\n .addCommand(clientScrollCommand)\n .addCommand(clientReadClipboardCommand)\n .addCommand(clientWriteClipboardCommand)\n .addCommand(clientKeyCommand)\n .addCommand(clientHoldKeyCommand)\n .addCommand(clientTypeCommand)\n .addCommand(clientOpenAppCommand)\n .addCommand(clientMouseMoveCommand)\n .addCommand(clientCursorPositionCommand);\n\nclientCommand.addHelpText(\n \"after\",\n `\nCoordinate System:\n All coordinates use macOS logical points, not physical pixels.\n On Retina displays, logical size = physical size / scaleFactor.\n Run \"info\" to check your screen's logical dimensions.\n\nExamples:\n zero computer-use client screenshot\n zero computer-use client zoom --x 0 --y 0 --width 500 --height 500\n zero computer-use client info\n zero computer-use client left-click 500 300\n zero computer-use client scroll 500 300 down 5\n zero computer-use client key \"cmd+c\"`,\n);\n\nexport const zeroComputerUseCommand = new Command()\n .name(\"computer-use\")\n .description(\"Remote desktop control for cloud agents\")\n .addCommand(hostCommand)\n .addCommand(clientCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport {\n registerComputerUseHost,\n unregisterComputerUseHost,\n ApiRequestError,\n} from \"../../../lib/api\";\nimport {\n getRandomPort,\n startDesktopServer,\n} from \"../../../lib/computer-use/desktop-server\";\nimport { isCliclickInstalled } from \"../../../lib/computer-use/cliclick\";\nimport {\n startDesktopTunnel,\n stopDesktopTunnel,\n} from \"../../../lib/computer-use/ngrok\";\n\nexport const hostStartCommand = new Command()\n .name(\"start\")\n .description(\"Start the computer-use host daemon (macOS only)\")\n .action(\n withErrorHandler(async () => {\n if (process.platform !== \"darwin\") {\n throw new Error(\n \"Computer-use host requires macOS\\n\\n\" +\n \"The host daemon uses macOS-specific commands (screencapture, system_profiler).\",\n );\n }\n\n if (!(await isCliclickInstalled())) {\n console.log(\n chalk.yellow(\n \"⚠ cliclick not found. Mouse and keyboard operations will not be available.\\n\" +\n \" Install with: brew install cliclick\",\n ),\n );\n console.log();\n }\n\n console.log(chalk.cyan(\"Registering computer-use host...\"));\n const credentials = await registerComputerUseHost();\n\n const port = await getRandomPort();\n const server = await startDesktopServer(credentials.token, port);\n\n try {\n await startDesktopTunnel(\n credentials.ngrokToken,\n credentials.endpointPrefix,\n port,\n );\n\n console.log();\n console.log(chalk.green(\"✓ Computer-use host active\"));\n console.log(` Desktop: desktop.${credentials.domain}`);\n console.log();\n console.log(chalk.dim(\"Press ^C twice to disconnect\"));\n console.log();\n\n let sigintCount = 0;\n await new Promise<void>((resolve) => {\n const keepAlive = setInterval(() => {}, 60_000);\n const done = () => {\n clearInterval(keepAlive);\n process.removeListener(\"SIGINT\", onSigint);\n resolve();\n };\n const onSigint = () => {\n sigintCount++;\n if (sigintCount === 1) {\n console.log(\n chalk.dim(\"\\nPress ^C again to disconnect and exit...\"),\n );\n } else {\n done();\n }\n };\n process.on(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", done);\n });\n } finally {\n console.log();\n console.log(chalk.cyan(\"Stopping computer-use host...\"));\n server.close();\n await stopDesktopTunnel();\n await unregisterComputerUseHost().catch(() => {});\n console.log(chalk.green(\"✓ Host stopped\"));\n }\n }),\n );\n\nexport const hostStopCommand = new Command()\n .name(\"stop\")\n .description(\"Stop and unregister the computer-use host\")\n .action(\n withErrorHandler(async () => {\n console.log(chalk.cyan(\"Unregistering computer-use host...\"));\n try {\n await unregisterComputerUseHost();\n console.log(chalk.green(\"✓ Host unregistered\"));\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n console.log(chalk.yellow(\"No active host registration found\"));\n return;\n }\n throw error;\n }\n }),\n );\n","import {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"http\";\nimport { createServer as createNetServer } from \"net\";\nimport type { AddressInfo } from \"net\";\nimport {\n captureScreenshot,\n captureRegionScreenshot,\n getScreenInfo,\n} from \"./screencapture\";\nimport {\n leftClickDrag,\n leftMouseDown,\n leftMouseUp,\n executeMouseAction,\n getCursorPosition,\n VALID_ACTIONS,\n pressKey,\n holdKey,\n typeText,\n} from \"./cliclick\";\nimport type { MouseAction } from \"./cliclick\";\nimport { scroll, type ScrollDirection } from \"./scroll\";\nimport { readClipboard, writeClipboard } from \"./clipboard\";\nimport { openApplication } from \"./application\";\n\n/**\n * Read the full request body as a string.\n */\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString());\n });\n req.on(\"error\", reject);\n });\n}\n\ninterface MouseDragBody {\n action: \"left_click_drag\";\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\ninterface MouseDownBody {\n action: \"left_mouse_down\";\n x: number;\n y: number;\n}\n\ninterface MouseUpBody {\n action: \"left_mouse_up\";\n x: number;\n y: number;\n}\n\ninterface MouseScrollBody {\n action: \"scroll\";\n x: number;\n y: number;\n direction: ScrollDirection;\n amount?: number;\n}\n\ntype MouseRequestBody =\n | MouseDragBody\n | MouseDownBody\n | MouseUpBody\n | MouseScrollBody;\n\nasync function handleZoom(\n searchParams: URLSearchParams,\n res: ServerResponse,\n): Promise<void> {\n const x = Number(searchParams.get(\"x\"));\n const y = Number(searchParams.get(\"y\"));\n const width = Number(searchParams.get(\"width\"));\n const height = Number(searchParams.get(\"height\"));\n\n if (\n [x, y, width, height].some((v) => {\n return !Number.isFinite(v);\n })\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n \"Missing or invalid query parameters: x, y, width, height are required numbers\",\n );\n return;\n }\n if (width <= 0 || height <= 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"width and height must be positive\");\n return;\n }\n if (x < 0 || y < 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"x and y must be non-negative\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x + width > info.width || y + height > info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(`Region exceeds screen bounds (${info.width}x${info.height})`);\n return;\n }\n\n const result = await captureRegionScreenshot({ x, y, width, height });\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n}\n\nfunction parseJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > 1024) {\n reject(new Error(\"Request body too large\"));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString()));\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nasync function handleMouseRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const body = await parseJsonBody(req);\n if (typeof body !== \"object\" || body === null || !(\"action\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { action } = body as { action: unknown };\n\n if (typeof action !== \"string\") {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Invalid action\");\n return;\n }\n\n // Click actions with validation\n if (VALID_ACTIONS.has(action)) {\n if (!(\"x\" in body) || !(\"y\" in body)) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing required fields: action, x, y\");\n return;\n }\n\n const { x, y } = body as { x: unknown; y: unknown };\n\n if (\n typeof x !== \"number\" ||\n typeof y !== \"number\" ||\n !Number.isFinite(x) ||\n !Number.isFinite(y)\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Coordinates x and y must be finite numbers\");\n return;\n }\n\n const info = await getScreenInfo();\n if (x < 0 || x >= info.width || y < 0 || y >= info.height) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Coordinates out of bounds. Screen size: ${info.width}x${info.height} (points)`,\n );\n return;\n }\n\n await executeMouseAction(action as MouseAction, x, y);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // Drag, mouse-down, mouse-up, scroll actions\n const typedBody = body as MouseRequestBody;\n switch (typedBody.action) {\n case \"left_click_drag\":\n await leftClickDrag(\n typedBody.startX,\n typedBody.startY,\n typedBody.endX,\n typedBody.endY,\n );\n break;\n case \"left_mouse_down\":\n await leftMouseDown(typedBody.x, typedBody.y);\n break;\n case \"left_mouse_up\":\n await leftMouseUp(typedBody.x, typedBody.y);\n break;\n case \"scroll\":\n await scroll(\n typedBody.x,\n typedBody.y,\n typedBody.direction,\n typedBody.amount,\n );\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown mouse action: ${(body as unknown as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\ninterface KeyPressBody {\n action: \"key\";\n keys: string;\n}\n\ninterface HoldKeyBody {\n action: \"hold_key\";\n keys: string;\n durationMs: number;\n}\n\ninterface TypeTextBody {\n action: \"type\";\n text: string;\n}\n\ntype KeyboardRequestBody = KeyPressBody | HoldKeyBody | TypeTextBody;\n\nasync function handleKeyboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as KeyboardRequestBody;\n\n switch (body.action) {\n case \"key\":\n await pressKey(body.keys);\n break;\n case \"hold_key\":\n if (\n typeof body.durationMs !== \"number\" ||\n !Number.isFinite(body.durationMs) ||\n body.durationMs <= 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"durationMs must be a positive number\");\n return;\n }\n await holdKey(body.keys, body.durationMs);\n break;\n case \"type\":\n if (typeof body.text !== \"string\" || body.text.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"text must be a non-empty string\");\n return;\n }\n await typeText(body.text);\n break;\n default:\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\n `Unknown keyboard action: ${(body as Record<string, unknown>).action}`,\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\nasync function handleClipboard(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.method === \"GET\") {\n const text = await readClipboard();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ text }));\n } else if (req.method === \"POST\") {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { text: string };\n await writeClipboard(body.text);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n}\n\nasync function handleOpenApplication(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const raw = await readBody(req);\n const body = JSON.parse(raw) as { nameOrBundleId: unknown };\n\n if (\n typeof body.nameOrBundleId !== \"string\" ||\n body.nameOrBundleId.length === 0\n ) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"nameOrBundleId must be a non-empty string\");\n return;\n }\n\n await openApplication(body.nameOrBundleId);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n}\n\n/**\n * Allocate a random available port on localhost.\n */\nexport async function getRandomPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createNetServer();\n server.listen(0, \"127.0.0.1\", () => {\n const { port } = server.address() as AddressInfo;\n server.close(() => {\n resolve(port);\n });\n });\n server.on(\"error\", reject);\n });\n}\n\nasync function handleCursorPosition(res: ServerResponse): Promise<void> {\n const position = await getCursorPosition();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(position));\n}\n\nfunction routeKey(method: string, pathname: string): string {\n return `${method} ${pathname}`;\n}\n\nasync function handleRequest(\n token: string,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (req.headers[\"x-vm0-token\"] !== token) {\n res.writeHead(403, { \"Content-Type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const { pathname, searchParams } = url;\n const key = routeKey(req.method ?? \"GET\", pathname);\n\n try {\n switch (key) {\n case \"GET /screenshot\": {\n const result = await captureScreenshot();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n break;\n }\n case \"GET /info\": {\n const info = await getScreenInfo();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(info));\n break;\n }\n case \"GET /zoom\":\n await handleZoom(searchParams, res);\n break;\n case \"POST /mouse\":\n await handleMouseRequest(req, res);\n break;\n case \"GET /clipboard\":\n case \"POST /clipboard\":\n await handleClipboard(req, res);\n break;\n case \"POST /keyboard\":\n await handleKeyboard(req, res);\n break;\n case \"POST /open-application\":\n await handleOpenApplication(req, res);\n break;\n case \"GET /cursor-position\":\n await handleCursorPosition(res);\n break;\n default:\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Internal server error\";\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(message);\n }\n}\n\n/**\n * Start the desktop HTTP server.\n * Validates x-vm0-token on every request and serves /screenshot and /info endpoints.\n */\nexport function startDesktopServer(\n token: string,\n port: number,\n): Promise<Server> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n handleRequest(token, req, res).catch(() => {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Internal server error\");\n }\n });\n });\n\n server.on(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n resolve(server);\n });\n });\n}\n","import { execFile } from \"child_process\";\nimport { readFile, unlink } from \"fs/promises\";\nimport { randomUUID } from \"crypto\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface ScreenInfo {\n width: number;\n height: number;\n scaleFactor: number;\n}\n\ninterface ScreenshotResult extends ScreenInfo {\n image: string;\n format: string;\n}\n\ninterface RegionParams {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Capture a screenshot on macOS using the screencapture command.\n * Returns the image as a base64 string at logical resolution along with screen metadata.\n */\nexport async function captureScreenshot(): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-screenshot-${randomUUID()}.jpg`);\n\n try {\n await execFileAsync(\"screencapture\", [\"-x\", \"-t\", \"jpg\", tmpPath]);\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(info.height),\n String(info.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: info.width,\n height: info.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\n/**\n * Capture a screenshot of a specific screen region on macOS.\n * Uses screencapture -R x,y,w,h to crop to the given rectangle (logical coordinates).\n * Returns the image at logical resolution to match the coordinate space.\n */\nexport async function captureRegionScreenshot(\n region: RegionParams,\n): Promise<ScreenshotResult> {\n const tmpPath = join(tmpdir(), `vm0-zoom-${randomUUID()}.jpg`);\n\n try {\n const regionArg = `${region.x},${region.y},${region.width},${region.height}`;\n await execFileAsync(\"screencapture\", [\n \"-x\",\n \"-t\",\n \"jpg\",\n \"-R\",\n regionArg,\n tmpPath,\n ]);\n\n const info = await getScreenInfo();\n\n if (info.scaleFactor > 1) {\n await execFileAsync(\"sips\", [\n \"-z\",\n String(region.height),\n String(region.width),\n \"-s\",\n \"formatOptions\",\n \"80\",\n tmpPath,\n ]);\n }\n\n const buffer = await readFile(tmpPath);\n\n return {\n image: buffer.toString(\"base64\"),\n width: region.width,\n height: region.height,\n scaleFactor: info.scaleFactor,\n format: \"jpg\",\n };\n } finally {\n await unlink(tmpPath).catch(() => {});\n }\n}\n\ninterface DisplayResolution {\n _spdisplays_pixels?: string;\n _spdisplays_resolution?: string;\n spdisplays_resolution?: string;\n}\n\ninterface DisplayData {\n spdisplays_ndrvs?: DisplayResolution[];\n}\n\n/**\n * Get screen logical resolution and scale factor on macOS using system_profiler.\n * Returns logical (point) dimensions that match the coordinate space used by all operations.\n */\nexport async function getScreenInfo(): Promise<ScreenInfo> {\n const { stdout } = await execFileAsync(\"system_profiler\", [\n \"SPDisplaysDataType\",\n \"-json\",\n ]);\n\n const data = JSON.parse(stdout) as { SPDisplaysDataType?: DisplayData[] };\n const displays = data.SPDisplaysDataType ?? [];\n\n for (const gpu of displays) {\n const screens = gpu.spdisplays_ndrvs ?? [];\n for (const screen of screens) {\n const pixelStr = screen._spdisplays_pixels;\n if (pixelStr) {\n const pixelMatch = pixelStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n if (pixelMatch?.[1] && pixelMatch[2]) {\n const physicalWidth = parseInt(pixelMatch[1], 10);\n const physicalHeight = parseInt(pixelMatch[2], 10);\n\n const resStr =\n screen._spdisplays_resolution ?? screen.spdisplays_resolution ?? \"\";\n const resMatch = resStr.match(/(\\d+)\\s*x\\s*(\\d+)/);\n\n let scaleFactor: number;\n let logicalWidth: number;\n let logicalHeight: number;\n\n if (resMatch?.[1] && resMatch[2]) {\n logicalWidth = parseInt(resMatch[1], 10);\n logicalHeight = parseInt(resMatch[2], 10);\n scaleFactor = Math.round(physicalWidth / logicalWidth);\n } else {\n const isRetina = /retina/i.test(resStr);\n scaleFactor = isRetina ? 2 : 1;\n logicalWidth = Math.floor(physicalWidth / scaleFactor);\n logicalHeight = Math.floor(physicalHeight / scaleFactor);\n }\n\n return {\n width: logicalWidth,\n height: logicalHeight,\n scaleFactor,\n };\n }\n }\n }\n }\n\n return { width: 1920, height: 1080, scaleFactor: 1 };\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { setTimeout as sleep } from \"timers/promises\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Drag from (startX, startY) to (endX, endY) using cliclick.\n * Sends dd (drag down) at start, then du (drag up) at end.\n */\nexport async function leftClickDrag(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n): Promise<void> {\n await execFileAsync(\"cliclick\", [\n `dd:${startX},${startY}`,\n `du:${endX},${endY}`,\n ]);\n}\n\n/**\n * Press and hold the left mouse button at (x, y).\n */\nexport async function leftMouseDown(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`dd:${x},${y}`]);\n}\n\n/**\n * Release the left mouse button at (x, y).\n */\nexport async function leftMouseUp(x: number, y: number): Promise<void> {\n await execFileAsync(\"cliclick\", [`du:${x},${y}`]);\n}\n\nexport type MouseAction =\n | \"left_click\"\n | \"right_click\"\n | \"middle_click\"\n | \"double_click\"\n | \"triple_click\"\n | \"move\";\n\nconst ACTION_COMMANDS: Record<MouseAction, string> = {\n left_click: \"c\",\n right_click: \"rc\",\n middle_click: \"mc\",\n double_click: \"dc\",\n triple_click: \"tc\",\n move: \"m\",\n};\n\nexport const VALID_ACTIONS = new Set<string>(Object.keys(ACTION_COMMANDS));\n\n/**\n * Check whether cliclick is available on the system.\n * Returns true if installed, false otherwise.\n */\nexport async function isCliclickInstalled(): Promise<boolean> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that cliclick is installed on the system.\n * Throws with install instructions if not found.\n */\nasync function checkCliclickInstalled(): Promise<void> {\n try {\n await execFileAsync(\"which\", [\"cliclick\"]);\n } catch {\n throw new Error(\"cliclick not found. Install with: brew install cliclick\");\n }\n}\n\n/**\n * Execute a mouse action at the given coordinates using cliclick.\n */\nexport async function executeMouseAction(\n action: MouseAction,\n x: number,\n y: number,\n): Promise<void> {\n await checkCliclickInstalled();\n const prefix = ACTION_COMMANDS[action];\n await execFileAsync(\"cliclick\", [`${prefix}:${x},${y}`]);\n}\n\n/**\n * Get the current cursor position using cliclick.\n * Returns coordinates in points.\n */\nexport async function getCursorPosition(): Promise<{\n x: number;\n y: number;\n}> {\n await checkCliclickInstalled();\n const { stdout } = await execFileAsync(\"cliclick\", [\"p\"]);\n const parts = stdout.trim().split(\",\");\n const xStr = parts[0];\n const yStr = parts[1];\n if (parts.length !== 2 || xStr === undefined || yStr === undefined) {\n throw new Error(`Unexpected cliclick output: ${stdout.trim()}`);\n }\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(`Failed to parse cursor position: ${stdout.trim()}`);\n }\n return { x, y };\n}\n\nconst VALID_SPECIAL_KEYS = new Set([\n \"cmd\",\n \"ctrl\",\n \"alt\",\n \"shift\",\n \"fn\",\n \"arrow-up\",\n \"arrow-down\",\n \"arrow-left\",\n \"arrow-right\",\n \"tab\",\n \"esc\",\n \"space\",\n \"delete\",\n \"return\",\n \"enter\",\n \"home\",\n \"end\",\n \"page-up\",\n \"page-down\",\n ...Array.from({ length: 19 }, (_, i) => {\n return `f${i + 1}`;\n }),\n]);\n\nfunction isValidKeyName(key: string): boolean {\n return VALID_SPECIAL_KEYS.has(key) || key.length === 1;\n}\n\nfunction parseKeyCombo(keys: string): {\n modifiers: string[];\n mainKey: string;\n} {\n const parts = keys.split(\"+\");\n if (\n parts.length === 0 ||\n parts.some((p) => {\n return p === \"\";\n })\n ) {\n throw new Error(`Invalid key combo: \"${keys}\"`);\n }\n\n const mainKey = parts[parts.length - 1]!;\n const modifiers = parts.slice(0, -1);\n\n for (const key of parts) {\n if (!isValidKeyName(key)) {\n throw new Error(\n `Unknown key: \"${key}\". Valid keys: single characters, or special keys like cmd, ctrl, alt, shift, tab, esc, return, arrow-up, f1-f19, etc.`,\n );\n }\n }\n\n return { modifiers, mainKey };\n}\n\n/**\n * Build the cliclick command to press or type a key.\n * Special keys (return, tab, arrow-up, etc.) use `kp:`, regular characters use `t:`.\n */\nfunction keyAction(key: string): string {\n return VALID_SPECIAL_KEYS.has(key) ? `kp:${key}` : `t:${key}`;\n}\n\n/**\n * Press a key combination using cliclick.\n * Accepts combo strings like \"cmd+c\", \"ctrl+shift+s\", or single keys like \"return\".\n */\nexport async function pressKey(keys: string): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n\n if (modifiers.length === 0) {\n await execFileAsync(\"cliclick\", [keyAction(mainKey)]);\n return;\n }\n\n const args: string[] = [];\n for (const mod of modifiers) {\n args.push(`kd:${mod}`);\n }\n args.push(keyAction(mainKey));\n for (let i = modifiers.length - 1; i >= 0; i--) {\n args.push(`ku:${modifiers[i]}`);\n }\n await execFileAsync(\"cliclick\", args);\n}\n\n/**\n * Hold key(s) down for a specified duration then release.\n * Accepts combo strings like \"shift\" or \"cmd+shift\".\n */\nexport async function holdKey(keys: string, durationMs: number): Promise<void> {\n const { modifiers, mainKey } = parseKeyCombo(keys);\n const allKeys = [...modifiers, mainKey];\n\n const downArgs = allKeys.map((k) => {\n return `kd:${k}`;\n });\n const upArgs = [...allKeys].reverse().map((k) => {\n return `ku:${k}`;\n });\n\n await execFileAsync(\"cliclick\", downArgs);\n await sleep(durationMs);\n await execFileAsync(\"cliclick\", upArgs);\n}\n\n/**\n * Type text at the current cursor position using cliclick.\n */\nexport async function typeText(text: string): Promise<void> {\n await execFileAsync(\"cliclick\", [`t:${text}`]);\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\nconst DEFAULT_SCROLL_AMOUNT = 3;\n\n/**\n * Scroll at the given screen position using cliclick (mouse move) + osascript (CGEvent scroll).\n *\n * cliclick handles cursor positioning; osascript with CoreGraphics CGEvent API\n * handles the scroll wheel event (cliclick has no native scroll support).\n */\nexport async function scroll(\n x: number,\n y: number,\n direction: ScrollDirection,\n amount: number = DEFAULT_SCROLL_AMOUNT,\n): Promise<void> {\n // Move cursor to target position\n await execFileAsync(\"cliclick\", [`m:${x},${y}`]);\n\n // CGEvent scroll: positive dy = scroll up, negative dy = scroll down\n // Second wheel axis: positive dx = scroll left, negative dx = scroll right\n let dy = 0;\n let dx = 0;\n switch (direction) {\n case \"up\":\n dy = amount;\n break;\n case \"down\":\n dy = -amount;\n break;\n case \"left\":\n dx = amount;\n break;\n case \"right\":\n dx = -amount;\n break;\n }\n\n const script = [\n \"ObjC.import('CoreGraphics');\",\n `var e = $.CGEventCreateScrollWheelEvent(null, 0, 2, ${dy}, ${dx});`,\n \"$.CGEventPost($.kCGHIDEventTap, e);\",\n ].join(\" \");\n\n await execFileAsync(\"osascript\", [\"-l\", \"JavaScript\", \"-e\", script]);\n}\n","import { execFile, spawn } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Read text content from the macOS clipboard using pbpaste.\n */\nexport async function readClipboard(): Promise<string> {\n const { stdout } = await execFileAsync(\"pbpaste\");\n return stdout;\n}\n\n/**\n * Write text content to the macOS clipboard using pbcopy.\n */\nexport async function writeClipboard(text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(\"pbcopy\", { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`pbcopy exited with code ${code}`));\n }\n });\n proc.stdin.end(text);\n });\n}\n","import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Open or activate a macOS application by name or bundle ID.\n * Detects bundle IDs by the presence of dots (e.g., com.apple.Safari).\n */\nexport async function openApplication(nameOrBundleId: string): Promise<void> {\n const isBundleId = nameOrBundleId.includes(\".\");\n const flag = isBundleId ? \"-b\" : \"-a\";\n await execFileAsync(\"open\", [flag, nameOrBundleId]);\n}\n","// Dynamic import is intentional: @ngrok/ngrok contains native binaries that\n// crash on systems with GLIBC version mismatches. Lazy-loading ensures the\n// crash only affects the command that needs ngrok, not the entire CLI.\n// See: https://github.com/vm0-ai/vm0/issues/6825\nasync function loadNgrok(): Promise<typeof import(\"@ngrok/ngrok\")> {\n try {\n const mod = await import(\"@ngrok/ngrok\");\n return mod.default;\n } catch (cause) {\n throw new Error(\n \"Failed to load ngrok tunnel module. \" +\n \"This may be caused by a system library (GLIBC) incompatibility. \" +\n \"See: https://github.com/vm0-ai/vm0/issues/6825\",\n { cause },\n );\n }\n}\n\nexport async function startDesktopTunnel(\n ngrokToken: string,\n endpointPrefix: string,\n port: number,\n): Promise<void> {\n const ngrok = await loadNgrok();\n\n await ngrok.forward({\n addr: `localhost:${port}`,\n authtoken: ngrokToken,\n domain: `desktop.${endpointPrefix}.internal`,\n });\n}\n\nexport async function stopDesktopTunnel(): Promise<void> {\n const ngrok = await loadNgrok();\n await ngrok.kill();\n}\n","import { Command } from \"commander\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { withErrorHandler } from \"../../../lib/command/with-error-handler\";\nimport { callHost } from \"../../../lib/computer-use/client\";\n\nfunction mouseClickCommand(\n name: string,\n action: string,\n description: string,\n): Command {\n return new Command()\n .name(name)\n .description(description)\n .argument(\"<x>\", \"X coordinate (points)\")\n .argument(\"<y>\", \"Y coordinate (points)\")\n .action(\n withErrorHandler(async (xStr: string, yStr: string) => {\n const x = parseInt(xStr, 10);\n const y = parseInt(yStr, 10);\n if (Number.isNaN(x) || Number.isNaN(y)) {\n throw new Error(\"Coordinates must be integers\");\n }\n const response = await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action, x, y },\n });\n const data = await response.json();\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n}\n\nexport const clientScreenshotCommand = new Command()\n .name(\"screenshot\")\n .description(\"Capture a screenshot from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/screenshot\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `screenshot-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n // Path to stdout for programmatic consumption\n process.stdout.write(`${filePath}\\n`);\n\n // Metadata to stderr for human/debug consumption\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n }),\n );\n\nexport const clientZoomCommand = new Command()\n .name(\"zoom\")\n .description(\"Capture a region screenshot from the remote host\")\n .requiredOption(\"--x <number>\", \"X coordinate of the region\")\n .requiredOption(\"--y <number>\", \"Y coordinate of the region\")\n .requiredOption(\"--width <number>\", \"Width of the region\")\n .requiredOption(\"--height <number>\", \"Height of the region\")\n .action(\n withErrorHandler(\n async (opts: { x: string; y: string; width: string; height: string }) => {\n const params = new URLSearchParams({\n x: opts.x,\n y: opts.y,\n width: opts.width,\n height: opts.height,\n });\n const response = await callHost(`/zoom?${params.toString()}`);\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n format: string;\n image: string;\n };\n\n const dir = \"/tmp/computer-use\";\n await mkdir(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filePath = join(dir, `zoom-${timestamp}.${data.format}`);\n const buffer = Buffer.from(data.image, \"base64\");\n await writeFile(filePath, buffer);\n\n process.stdout.write(`${filePath}\\n`);\n\n process.stderr.write(\n JSON.stringify({\n width: data.width,\n height: data.height,\n scaleFactor: data.scaleFactor,\n }) + \"\\n\",\n );\n },\n ),\n );\n\nexport const clientInfoCommand = new Command()\n .name(\"info\")\n .description(\"Get screen info from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/info\");\n const data = (await response.json()) as {\n width: number;\n height: number;\n scaleFactor: number;\n };\n\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n\nexport const clientLeftClickCommand = mouseClickCommand(\n \"left-click\",\n \"left_click\",\n \"Perform a left click at coordinates\",\n);\n\nexport const clientRightClickCommand = mouseClickCommand(\n \"right-click\",\n \"right_click\",\n \"Perform a right click at coordinates\",\n);\n\nexport const clientMiddleClickCommand = mouseClickCommand(\n \"middle-click\",\n \"middle_click\",\n \"Perform a middle click at coordinates\",\n);\n\nexport const clientDoubleClickCommand = mouseClickCommand(\n \"double-click\",\n \"double_click\",\n \"Perform a double click at coordinates\",\n);\n\nexport const clientTripleClickCommand = mouseClickCommand(\n \"triple-click\",\n \"triple_click\",\n \"Perform a triple click at coordinates\",\n);\n\nexport const clientLeftClickDragCommand = new Command()\n .name(\"left-click-drag\")\n .description(\"Drag from (startX, startY) to (endX, endY)\")\n .argument(\"<startX>\", \"Start X coordinate\")\n .argument(\"<startY>\", \"Start Y coordinate\")\n .argument(\"<endX>\", \"End X coordinate\")\n .argument(\"<endY>\", \"End Y coordinate\")\n .action(\n withErrorHandler(\n async (startX: string, startY: string, endX: string, endY: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"left_click_drag\",\n startX: Number(startX),\n startY: Number(startY),\n endX: Number(endX),\n endY: Number(endY),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientLeftMouseDownCommand = new Command()\n .name(\"left-mouse-down\")\n .description(\"Press and hold the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_down\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientLeftMouseUpCommand = new Command()\n .name(\"left-mouse-up\")\n .description(\"Release the left mouse button at (x, y)\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .action(\n withErrorHandler(async (x: string, y: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: { action: \"left_mouse_up\", x: Number(x), y: Number(y) },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientScrollCommand = new Command()\n .name(\"scroll\")\n .description(\"Scroll at the given screen position\")\n .argument(\"<x>\", \"X coordinate\")\n .argument(\"<y>\", \"Y coordinate\")\n .argument(\"<direction>\", \"Scroll direction: up, down, left, right\")\n .argument(\"[amount]\", \"Scroll amount in lines (default 3)\")\n .action(\n withErrorHandler(\n async (x: string, y: string, direction: string, amount?: string) => {\n await callHost(\"/mouse\", {\n method: \"POST\",\n body: {\n action: \"scroll\",\n x: Number(x),\n y: Number(y),\n direction,\n ...(amount !== undefined && { amount: Number(amount) }),\n },\n });\n process.stdout.write(\"ok\\n\");\n },\n ),\n );\n\nexport const clientReadClipboardCommand = new Command()\n .name(\"read-clipboard\")\n .description(\"Read text content from the remote clipboard\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/clipboard\");\n const data = (await response.json()) as { text: string };\n process.stdout.write(data.text);\n }),\n );\n\nexport const clientWriteClipboardCommand = new Command()\n .name(\"write-clipboard\")\n .description(\"Write text content to the remote clipboard\")\n .argument(\"<text>\", \"Text to write to clipboard\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/clipboard\", {\n method: \"POST\",\n body: { text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientKeyCommand = new Command()\n .name(\"key\")\n .description(\"Press a key or key combination (e.g., cmd+c, return)\")\n .argument(\"<combo>\", \"Key combo string (e.g., cmd+c, ctrl+shift+s, return)\")\n .action(\n withErrorHandler(async (combo: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"key\", keys: combo },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientHoldKeyCommand = new Command()\n .name(\"hold-key\")\n .description(\"Hold a key or key combination for a duration\")\n .argument(\"<combo>\", \"Key combo string (e.g., shift, cmd+shift)\")\n .argument(\"<durationMs>\", \"Duration to hold in milliseconds\")\n .action(\n withErrorHandler(async (combo: string, durationStr: string) => {\n const durationMs = parseInt(durationStr, 10);\n if (Number.isNaN(durationMs) || durationMs <= 0) {\n throw new Error(\"durationMs must be a positive integer\");\n }\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"hold_key\", keys: combo, durationMs },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientTypeCommand = new Command()\n .name(\"type\")\n .description(\"Type text at the current cursor position\")\n .argument(\"<text>\", \"Text to type\")\n .action(\n withErrorHandler(async (text: string) => {\n await callHost(\"/keyboard\", {\n method: \"POST\",\n body: { action: \"type\", text },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientOpenAppCommand = new Command()\n .name(\"open-app\")\n .description(\"Open or activate a macOS application by name or bundle ID\")\n .argument(\n \"<nameOrBundleId>\",\n \"App name (e.g., Safari) or bundle ID (e.g., com.apple.Safari)\",\n )\n .action(\n withErrorHandler(async (nameOrBundleId: string) => {\n await callHost(\"/open-application\", {\n method: \"POST\",\n body: { nameOrBundleId },\n });\n process.stdout.write(\"ok\\n\");\n }),\n );\n\nexport const clientMouseMoveCommand = mouseClickCommand(\n \"mouse-move\",\n \"move\",\n \"Move mouse pointer to coordinates\",\n);\n\nexport const clientCursorPositionCommand = new Command()\n .name(\"cursor-position\")\n .description(\"Get current cursor position from the remote host\")\n .action(\n withErrorHandler(async () => {\n const response = await callHost(\"/cursor-position\");\n const data = (await response.json()) as { x: number; y: number };\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n }),\n );\n","import { getComputerUseHost } from \"../api\";\n\nlet cachedHost: { domain: string; token: string; cachedAt: number } | null =\n null;\nconst CACHE_TTL_MS = 30_000;\n\n/**\n * Discover the active computer-use host for the current org/user.\n * Results are cached for 30 seconds.\n */\nasync function discoverHost(): Promise<{\n domain: string;\n token: string;\n}> {\n if (cachedHost && Date.now() - cachedHost.cachedAt < CACHE_TTL_MS) {\n return { domain: cachedHost.domain, token: cachedHost.token };\n }\n\n const host = await getComputerUseHost();\n if (!host) {\n throw new Error(\n \"No active computer-use host found\\n\\n\" +\n \"Start a host with: zero computer-use host start\",\n );\n }\n\n cachedHost = { ...host, cachedAt: Date.now() };\n return host;\n}\n\n/**\n * Make an HTTP request to the computer-use host.\n */\nexport async function callHost(\n path: string,\n options?: { method?: string; body?: unknown },\n): Promise<Response> {\n const { domain, token } = await discoverHost();\n const url = `https://desktop.${domain}${path}`;\n\n const headers: Record<string, string> = { \"x-vm0-token\": token };\n const init: RequestInit = { headers };\n\n if (options?.method) {\n init.method = options.method;\n }\n if (options?.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const body = await response.text().catch(() => {\n return \"\";\n });\n throw new Error(\n `Host returned ${response.status}: ${body || response.statusText}`,\n );\n }\n\n return response;\n}\n","import { Command } from \"commander\";\nimport { downloadFileCommand } from \"./download-file\";\nimport { uploadFileCommand } from \"./upload-file\";\nimport { voiceCommand } from \"./voice\";\n\nexport const zeroWebCommand = new Command()\n .name(\"web\")\n .description(\"Upload, download, and generate files via the web chat endpoint\")\n .addCommand(downloadFileCommand)\n .addCommand(voiceCommand)\n .addCommand(uploadFileCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Download a file: zero web download-file <file-id> -o /tmp/out.pdf\n Generate speech: zero web voice --text \"Hello\"`,\n );\n","import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { Command } from \"commander\";\nimport { downloadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\n/**\n * Derive a local output path for a web-uploaded file id.\n * Uses the system temp directory.\n */\nfunction defaultOutPath(fileId: string): string {\n return join(tmpdir(), `web-${fileId}`);\n}\n\nexport const downloadFileCommand = new Command()\n .name(\"download-file\")\n .description(\"Download a web-uploaded file by id\")\n .argument(\"<file-id>\", \"File id (UUID returned by the upload API)\")\n .option(\n \"-o, --out <path>\",\n \"Output path for the downloaded file (default: /tmp/web-<file-id>)\",\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n Download to default temp path: zero web download-file abc-123-def\n Download to explicit path: zero web download-file abc-123-def -o /tmp/report.pdf\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"path\":\"/tmp/web-abc-123-def\",\"mimetype\":\"application/pdf\",\"size\":12345}\n\nHow to read the downloaded file:\n - Images (png/jpg/gif/webp/svg): open the file path with your image viewing tool\n - Videos (mp4/mov/webm): extract frames first with\n ffmpeg -i <path> -vf \"fps=1\" -q:v 2 /tmp/<file-id>_frame_%03d.jpg\n then view the extracted frames\n - PDF/text/csv/json/markdown: read the file directly\n\nNotes:\n - Authenticates via ZERO_TOKEN\n - Streams the file bytes directly to disk`,\n )\n .action(\n withErrorHandler(async (fileId: string, options: { out?: string }) => {\n const outPath = options.out ?? defaultOutPath(fileId);\n const result = await downloadWebFile(fileId, outPath);\n console.log(JSON.stringify(result));\n }),\n );\n","import { Command } from \"commander\";\nimport { uploadWebFile } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const uploadFileCommand = new Command()\n .name(\"upload-file\")\n .description(\"Upload a local file and print a permanent URL\")\n .requiredOption(\"-f, --file <path>\", \"Local file path to upload\")\n .option(\"--content-type <mime>\", \"Override inferred content type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Upload a file: zero web upload-file -f /tmp/report.pdf\n Override content-type: zero web upload-file -f /tmp/data --content-type text/csv\n\nOutput:\n Prints a JSON object to stdout on success:\n {\"id\":\"...\",\"filename\":\"...\",\"contentType\":\"...\",\"size\":N,\"url\":\"https://...\"}\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires file:write capability)\n - Returned URL is permanent (serves a short-lived signed redirect on access)\n - Safe to persist in chat messages or share over external channels\n - Max file size: 1 GB\n - Allowed image types: png / jpeg / gif / webp / avif / svg\n - Allowed video types: mp4 / webm / mov\n - Allowed audio types: aac / flac / m4a / mp3 / mp4 / mpga / ogg / opus / wav / webm\n - Allowed document/text types: pdf / txt / csv / md / html / json\n - Use --content-type for ambiguous extensions like .mp4 or .webm when needed`,\n )\n .action(\n withErrorHandler(\n async (options: { file: string; contentType?: string }) => {\n const result = await uploadWebFile(options.file, {\n contentType: options.contentType,\n });\n console.log(JSON.stringify(result));\n },\n ),\n );\n","import { readFileSync } from \"fs\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { generateWebVoice } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\ninterface VoiceOptions {\n text?: string;\n voice: string;\n instructions?: string;\n json?: boolean;\n}\n\nfunction readText(options: VoiceOptions): string {\n if (options.text?.trim()) {\n return options.text.trim();\n }\n\n if (process.stdin.isTTY === false) {\n const text = readFileSync(\"/dev/stdin\", \"utf8\").trim();\n if (text.length > 0) {\n return text;\n }\n }\n\n throw new Error(\"--text is required\", {\n cause: new Error('Usage: zero web voice --text \"Hello\"'),\n });\n}\n\nexport const voiceCommand = new Command()\n .name(\"voice\")\n .description(\"Generate a billed speech audio file from text\")\n .option(\"--text <text>\", \"Text to speak; can also be piped via stdin\")\n .option(\"--voice <voice>\", \"OpenAI voice to use\", \"marin\")\n .option(\"--instructions <text>\", \"Voice style instructions\")\n .option(\"--json\", \"Print metadata as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Generate speech: zero web voice --text \"Hello from vm0\"\n Pipe text: cat script.txt | zero web voice\n Pick a voice: zero web voice --text \"Ship it\" --voice cedar\n\nOutput:\n Prints the generated /f/ audio file URL and metadata\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires file:write capability)\n - Charges org credits after successful audio generation\n - Uses gpt-4o-mini-tts with WAV output`,\n )\n .action(\n withErrorHandler(async (options: VoiceOptions) => {\n const text = readText(options);\n const result = await generateWebVoice({\n text,\n voice: options.voice,\n instructions: options.instructions,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n return;\n }\n\n console.log(chalk.green(`✓ Voice generated: ${result.url}`));\n console.log(chalk.dim(` File: ${result.filename}`));\n console.log(chalk.dim(` Duration: ${result.durationSeconds}s`));\n console.log(chalk.dim(` Credits charged: ${result.creditsCharged}`));\n console.log(chalk.dim(` Model: ${result.model}`));\n console.log(chalk.dim(` Voice: ${result.voice}`));\n }),\n );\n"],"mappings":"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","names":["listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","setCommand","removeCommand","listCommand","import_prompts","prompts","type","config","prompts","selectedModel","provider","defaultNote","modelNote","removeCommand","listCommand","removeCommand","readFileSync","readFileSync","listCommand","deleteCommand","listCommand","deleteCommand","listCommand","statusCommand","listCommand","statusCommand","detectTimezone","readFileSync","day","readFileSync","setupCommand","listCommand","statusCommand","deleteCommand","setupCommand","listCommand","statusCommand","deleteCommand","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","readFileSync","readFileSync","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","readFileSync","listCommand","listCommand","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","readFileSync","sendCommand","readFileSync","sendCommand","readFileSync","statSync","basename","uploadFileCommand","statSync","basename","readFileSync","downloadFileCommand","uploadFileCommand","truncateValue","listCommand","setCommand","deleteCommand","listCommand","setCommand","deleteCommand","formatConnectorIdentity","unknownIcon","readFileSync","join","createCommand","editCommand","viewCommand","listCommand","deleteCommand","createCommand","editCommand","viewCommand","listCommand","deleteCommand","listCommand","parseLimit","searchCommand","listCommand","searchCommand","SEVEN_DAYS_MS","parseContextOptions","parseLimit","join","tmpdir","execFile","promisify","sleep","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","execFile","promisify","execFileAsync","join","join","join","tmpdir","defaultOutPath","join","tmpdir","downloadFileCommand","uploadFileCommand","readFileSync","readFileSync","downloadFileCommand","uploadFileCommand"]}
|