@vm0/cli 9.227.0 → 9.229.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.
Files changed (88) hide show
  1. package/{agent-DGSPWQNY.js → agent-6I3S3EIU.js} +4 -4
  2. package/{banking-JHYVOWF5.js → banking-JTEDNDFU.js} +2 -2
  3. package/chat-SWX5TFN3.js +251 -0
  4. package/chat-SWX5TFN3.js.map +1 -0
  5. package/{chunk-EY2VZRB2.js → chunk-2P5AKBPK.js} +2 -2
  6. package/{chunk-NC6FCDKK.js → chunk-6RKTJJPZ.js} +8 -15
  7. package/{chunk-NC6FCDKK.js.map → chunk-6RKTJJPZ.js.map} +1 -1
  8. package/{chunk-WSV35YDZ.js → chunk-AIJGP7GE.js} +3 -3
  9. package/{chunk-YYR5LIJY.js → chunk-DKOCDBW4.js} +29 -9
  10. package/chunk-DKOCDBW4.js.map +1 -0
  11. package/{chunk-OEAI3Q7W.js → chunk-F7BBBLJC.js} +3 -3
  12. package/{chunk-5ERR7HTW.js → chunk-GWQOCHOY.js} +2 -2
  13. package/{chunk-4VMDT4EL.js → chunk-NHJID5Y2.js} +129 -4
  14. package/chunk-NHJID5Y2.js.map +1 -0
  15. package/{chunk-LBGX3XPM.js → chunk-OCRWY5Y7.js} +2 -2
  16. package/{chunk-MZSBZSJO.js → chunk-PGU3RHGG.js} +2 -2
  17. package/{chunk-GYQBZT25.js → chunk-Q63UMEJ6.js} +2 -2
  18. package/{chunk-GYQBZT25.js.map → chunk-Q63UMEJ6.js.map} +1 -1
  19. package/{computer-use-ZDALRU7D.js → computer-use-GEEWNJQM.js} +2 -2
  20. package/{connector-5I66WCBC.js → connector-EYTI2AQV.js} +2 -2
  21. package/{credit-HGNKEVFZ.js → credit-NZB5JP5V.js} +2 -2
  22. package/{developer-support-U65KGI6M.js → developer-support-PAMZ2XRA.js} +2 -2
  23. package/{doctor-WTQ7VC4T.js → doctor-W6XZPNI5.js} +5 -5
  24. package/{generate-DHDE5EAR.js → generate-HVVD6EYP.js} +144 -115
  25. package/generate-HVVD6EYP.js.map +1 -0
  26. package/{github-QDXMHTJZ.js → github-4UD5X5HJ.js} +2 -2
  27. package/{goal-JRXI5QXW.js → goal-EBSAUAFF.js} +2 -2
  28. package/{host-RRYXBDTU.js → host-XMGMUEIS.js} +2 -2
  29. package/index.js +14 -14
  30. package/{logs-NDOKTRB6.js → logs-ZVA3RX7T.js} +7 -7
  31. package/{maps-IQBIONR2.js → maps-KA77OBM7.js} +2 -2
  32. package/{model-JO3G5KZI.js → model-LXH7APW3.js} +3 -3
  33. package/{model-provider-FEVH3VPX.js → model-provider-LPWRU53L.js} +3 -3
  34. package/{org-FQMXNSIY.js → org-YAIXNWYJ.js} +2 -2
  35. package/package.json +1 -1
  36. package/{phone-SQDE53ZF.js → phone-LJZKV6SV.js} +2 -2
  37. package/{preference-S5VFYYXB.js → preference-CZ3I4HFF.js} +2 -2
  38. package/{relationship-HCBN4USZ.js → relationship-QKUXP77B.js} +2 -2
  39. package/{resource-RSKJLS3T.js → resource-BKPC6E53.js} +3 -3
  40. package/{search-EMQSXATT.js → search-MTEX6GJA.js} +7 -7
  41. package/{secret-GKBBHURS.js → secret-ZIEZBGZG.js} +3 -3
  42. package/{slack-MPYGJ244.js → slack-TVVSMYRW.js} +2 -2
  43. package/{telegram-QPPLW7F4.js → telegram-ACBXXCBM.js} +2 -2
  44. package/{variable-Y4HRWCTO.js → variable-JJJKVBNK.js} +2 -2
  45. package/{web-AME2COQN.js → web-LFI6P5BX.js} +2 -2
  46. package/{whoami-V3SX3JTG.js → whoami-PU2MNPCP.js} +4 -4
  47. package/{workflow-DWK4QY3W.js → workflow-3ZFUOHIE.js} +71 -9
  48. package/workflow-3ZFUOHIE.js.map +1 -0
  49. package/zero.js +32 -32
  50. package/zero.js.map +1 -1
  51. package/chat-5PALCJD4.js +0 -123
  52. package/chat-5PALCJD4.js.map +0 -1
  53. package/chunk-4VMDT4EL.js.map +0 -1
  54. package/chunk-YYR5LIJY.js.map +0 -1
  55. package/generate-DHDE5EAR.js.map +0 -1
  56. package/workflow-DWK4QY3W.js.map +0 -1
  57. /package/{agent-DGSPWQNY.js.map → agent-6I3S3EIU.js.map} +0 -0
  58. /package/{banking-JHYVOWF5.js.map → banking-JTEDNDFU.js.map} +0 -0
  59. /package/{chunk-EY2VZRB2.js.map → chunk-2P5AKBPK.js.map} +0 -0
  60. /package/{chunk-WSV35YDZ.js.map → chunk-AIJGP7GE.js.map} +0 -0
  61. /package/{chunk-OEAI3Q7W.js.map → chunk-F7BBBLJC.js.map} +0 -0
  62. /package/{chunk-5ERR7HTW.js.map → chunk-GWQOCHOY.js.map} +0 -0
  63. /package/{chunk-LBGX3XPM.js.map → chunk-OCRWY5Y7.js.map} +0 -0
  64. /package/{chunk-MZSBZSJO.js.map → chunk-PGU3RHGG.js.map} +0 -0
  65. /package/{computer-use-ZDALRU7D.js.map → computer-use-GEEWNJQM.js.map} +0 -0
  66. /package/{connector-5I66WCBC.js.map → connector-EYTI2AQV.js.map} +0 -0
  67. /package/{credit-HGNKEVFZ.js.map → credit-NZB5JP5V.js.map} +0 -0
  68. /package/{developer-support-U65KGI6M.js.map → developer-support-PAMZ2XRA.js.map} +0 -0
  69. /package/{doctor-WTQ7VC4T.js.map → doctor-W6XZPNI5.js.map} +0 -0
  70. /package/{github-QDXMHTJZ.js.map → github-4UD5X5HJ.js.map} +0 -0
  71. /package/{goal-JRXI5QXW.js.map → goal-EBSAUAFF.js.map} +0 -0
  72. /package/{host-RRYXBDTU.js.map → host-XMGMUEIS.js.map} +0 -0
  73. /package/{logs-NDOKTRB6.js.map → logs-ZVA3RX7T.js.map} +0 -0
  74. /package/{maps-IQBIONR2.js.map → maps-KA77OBM7.js.map} +0 -0
  75. /package/{model-JO3G5KZI.js.map → model-LXH7APW3.js.map} +0 -0
  76. /package/{model-provider-FEVH3VPX.js.map → model-provider-LPWRU53L.js.map} +0 -0
  77. /package/{org-FQMXNSIY.js.map → org-YAIXNWYJ.js.map} +0 -0
  78. /package/{phone-SQDE53ZF.js.map → phone-LJZKV6SV.js.map} +0 -0
  79. /package/{preference-S5VFYYXB.js.map → preference-CZ3I4HFF.js.map} +0 -0
  80. /package/{relationship-HCBN4USZ.js.map → relationship-QKUXP77B.js.map} +0 -0
  81. /package/{resource-RSKJLS3T.js.map → resource-BKPC6E53.js.map} +0 -0
  82. /package/{search-EMQSXATT.js.map → search-MTEX6GJA.js.map} +0 -0
  83. /package/{secret-GKBBHURS.js.map → secret-ZIEZBGZG.js.map} +0 -0
  84. /package/{slack-MPYGJ244.js.map → slack-TVVSMYRW.js.map} +0 -0
  85. /package/{telegram-QPPLW7F4.js.map → telegram-ACBXXCBM.js.map} +0 -0
  86. /package/{variable-Y4HRWCTO.js.map → variable-JJJKVBNK.js.map} +0 -0
  87. /package/{web-AME2COQN.js.map → web-LFI6P5BX.js.map} +0 -0
  88. /package/{whoami-V3SX3JTG.js.map → whoami-PU2MNPCP.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/workflow/index.ts","../src/commands/zero/workflow/create.ts","../src/lib/skill-directory.ts","../src/commands/zero/workflow/format.ts","../src/commands/zero/workflow/edit.ts","../src/commands/zero/workflow/resolve-workflow-ref.ts","../src/commands/zero/workflow/view.ts","../src/commands/zero/workflow/list.ts","../src/commands/zero/workflow/delete.ts","../src/commands/zero/workflow/copy.ts","../src/commands/zero/workflow/trigger/index.ts","../src/commands/zero/shared/duration.ts","../src/commands/zero/workflow/trigger/display.ts","../src/lib/domain/schedule-utils.ts","../src/commands/zero/workflow/trigger/gmail-config.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { editCommand } from \"./edit\";\nimport { viewCommand } from \"./view\";\nimport { listCommand } from \"./list\";\nimport { deleteCommand } from \"./delete\";\nimport { copyCommand } from \"./copy\";\nimport { triggerCommand } from \"./trigger\";\n\nexport const zeroWorkflowCommand = new Command(\"workflow\")\n .description(\"Manage workflows\")\n .addCommand(createCommand)\n .addCommand(editCommand)\n .addCommand(viewCommand)\n .addCommand(listCommand)\n .addCommand(deleteCommand)\n .addCommand(copyCommand)\n .addCommand(triggerCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Create under an agent: zero workflow create my-workflow --agent <agent-id> --instruction \"Do things\"\n List workflows: zero workflow list\n View workflow content: zero workflow view <workflow> --agent <agent-id>\n Update workflow content: zero workflow edit <workflow> --agent <agent-id> --instruction \"New steps\"\n Copy onto another agent: zero workflow copy <workflow> --agent <source-agent-id> --to-agent <target-agent-id>\n Manage triggers: zero workflow trigger --help\n Delete a workflow: zero workflow delete <workflow> --agent <agent-id> -y`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFileSync } from \"node:fs\";\nimport { createWorkflow } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSupplementaryFiles } from \"../../../lib/skill-directory\";\nimport { formatWorkflowAgentName } from \"./format\";\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create a workflow under an agent\")\n .argument(\"<name>\", \"Workflow name (lowercase alphanumeric with hyphens)\")\n .option(\n \"--agent <id>\",\n \"Agent ID to host the workflow (defaults to ZERO_AGENT_ID)\",\n )\n .option(\"--instruction <text>\", \"Workflow instruction text\")\n .option(\n \"--instruction-file <path>\",\n \"Path to a file containing the instruction\",\n )\n .option(\n \"--dir <path>\",\n \"Path to a directory of supplementary files (SKILL.md is not allowed)\",\n )\n .option(\"--display-name <name>\", \"Workflow display name\")\n .option(\"--description <text>\", \"Workflow description\")\n .option(\"--public\", \"Create as an org-public workflow\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow create my-workflow --agent <agent-id> --instruction \"Summarize the inbox\"\n zero workflow create my-workflow --instruction-file ./instruction.md\n zero workflow create my-workflow --instruction \"Do things\" --dir ./workflows/my-workflow/files/\n zero workflow create shared-workflow --instruction \"Shared logic\" --public\n\nNotes:\n - A workflow belongs to exactly one agent; provide --agent or set ZERO_AGENT_ID\n - SKILL.md is synthesized from (name, description, instruction); do not include it\n - --dir uploads supplementary files only; any SKILL.md is rejected\n - New workflows are private by default\n - Copy a workflow onto another agent: zero workflow copy <workflow-id> --to-agent <agent-id>`,\n )\n .action(\n withErrorHandler(\n async (\n name: string,\n options: {\n agent?: string;\n instruction?: string;\n instructionFile?: string;\n dir?: string;\n displayName?: string;\n description?: string;\n public?: boolean;\n },\n ) => {\n const agentId = options.agent ?? process.env.ZERO_AGENT_ID;\n if (!agentId) {\n console.error(chalk.red(\"✗ --agent is required\"));\n console.error(\n chalk.dim(\n \" Provide --agent <agent-id> or run inside an agent sandbox (ZERO_AGENT_ID)\",\n ),\n );\n process.exit(1);\n }\n\n if (options.instruction && options.instructionFile) {\n console.error(\n chalk.red(\"✗ Use either --instruction or --instruction-file\"),\n );\n console.error(chalk.dim(\" Provide only one instruction source\"));\n process.exit(1);\n }\n\n const instruction = options.instructionFile\n ? readFileSync(options.instructionFile, \"utf-8\")\n : options.instruction;\n\n const files = options.dir\n ? readSupplementaryFiles(options.dir)\n : undefined;\n\n const workflow = await createWorkflow({\n agentId,\n chatThreadId: process.env.ZERO_CHAT_THREAD_ID || undefined,\n name,\n instruction,\n files,\n displayName: options.displayName,\n description: options.description,\n visibility: options.public ? \"public\" : undefined,\n });\n\n console.log(chalk.green(`✓ Workflow \"${workflow.name}\" created`));\n console.log(` ID: ${workflow.id}`);\n console.log(` Name: ${workflow.name}`);\n console.log(` Agent Name: ${formatWorkflowAgentName(workflow)}`);\n console.log(` Agent ID: ${workflow.agentId}`);\n console.log(` Visibility: ${workflow.visibility}`);\n if (files) {\n console.log(` Files: ${files.length} file(s)`);\n }\n if (workflow.displayName) {\n console.log(` Display Name: ${workflow.displayName}`);\n }\n if (workflow.description) {\n console.log(` Description: ${workflow.description}`);\n }\n console.log();\n console.log(\n `Copy onto another agent: zero workflow copy ${workflow.id} --to-agent <agent-id>`,\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 supplementary files from a directory.\n *\n * Skips hidden files (starting with .), node_modules, and .git.\n * Rejects SKILL.md: it is synthesized server-side from the workflow's\n * (name, description, instruction) and must not be uploaded.\n */\nexport function readSupplementaryFiles(\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 if (relPath === \"SKILL.md\") {\n throw new Error(\n \"SKILL.md is reserved and generated automatically; remove it from the directory\",\n );\n }\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 return files;\n}\n","import type { ZeroWorkflowSummary } from \"@vm0/api-contracts/contracts/zero-workflows\";\n\ntype WorkflowAgentFields = Pick<\n ZeroWorkflowSummary,\n \"agentDisplayName\" | \"agentName\" | \"agentId\"\n>;\n\nexport function formatWorkflowAgentName(workflow: WorkflowAgentFields): string {\n return workflow.agentDisplayName ?? workflow.agentName ?? \"-\";\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFileSync } from \"node:fs\";\nimport { updateWorkflow } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { readSupplementaryFiles } from \"../../../lib/skill-directory\";\nimport {\n resolveWorkflowRef,\n type WorkflowRefOptions,\n} from \"./resolve-workflow-ref\";\n\nexport const editCommand = new Command()\n .name(\"edit\")\n .description(\"Update a workflow's instruction, files, or metadata\")\n .argument(\"<workflow>\", \"Workflow ID or name\")\n .option(\"--agent <id>\", \"Agent ID for resolving workflow names\")\n .option(\"--instruction <text>\", \"New instruction text\")\n .option(\n \"--instruction-file <path>\",\n \"Path to a file containing the instruction\",\n )\n .option(\n \"--dir <path>\",\n \"Path to a directory of supplementary files (SKILL.md is not allowed)\",\n )\n .option(\"--display-name <name>\", \"New display name\")\n .option(\"--description <text>\", \"New description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow edit tell-a-joke --agent <agent-id> --instruction \"New steps\"\n zero workflow edit <workflow-id> --instruction \"New steps\"\n zero workflow edit <workflow-id> --instruction-file ./instruction.md\n zero workflow edit <workflow-id> --dir ./workflows/my-workflow/files/\n zero workflow edit <workflow-id> --display-name \"My Workflow\" --description \"Does things\"\n\nNotes:\n - SKILL.md is synthesized automatically; --dir uploads supplementary files only\n - At least one of --instruction, --instruction-file, --dir, --display-name, or --description is required`,\n )\n .action(\n withErrorHandler(\n async (\n workflowRef: string,\n options: {\n instruction?: string;\n instructionFile?: string;\n dir?: string;\n displayName?: string;\n description?: string;\n } & WorkflowRefOptions,\n ) => {\n if (options.instruction && options.instructionFile) {\n console.error(\n chalk.red(\"✗ Use either --instruction or --instruction-file\"),\n );\n console.error(chalk.dim(\" Provide only one instruction source\"));\n process.exit(1);\n }\n\n const instruction = options.instructionFile\n ? readFileSync(options.instructionFile, \"utf-8\")\n : options.instruction;\n\n const files = options.dir\n ? readSupplementaryFiles(options.dir)\n : undefined;\n\n if (\n instruction === undefined &&\n files === undefined &&\n options.displayName === undefined &&\n options.description === undefined\n ) {\n console.error(chalk.red(\"✗ Nothing to update\"));\n console.error(\n chalk.dim(\n \" Provide --instruction, --instruction-file, --dir, --display-name, or --description\",\n ),\n );\n process.exit(1);\n }\n\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const workflow = await updateWorkflow(workflowId, {\n instruction,\n files,\n displayName: options.displayName,\n description: options.description,\n });\n\n console.log(chalk.green(`✓ Workflow \"${workflow.name}\" updated`));\n if (instruction !== undefined) {\n console.log(` Instruction: updated`);\n }\n if (files) {\n console.log(` Files: ${files.length} file(s)`);\n }\n if (options.displayName !== undefined) {\n console.log(` Display Name: ${workflow.displayName ?? \"-\"}`);\n }\n if (options.description !== undefined) {\n console.log(` Description: ${workflow.description ?? \"-\"}`);\n }\n },\n ),\n );\n","import { listWorkflows } from \"../../../lib/api\";\n\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst WORKFLOW_NAME_RE = /^[a-z0-9][a-z0-9-]*[a-z0-9]$/;\n\nexport interface WorkflowRefOptions {\n readonly agent?: string;\n}\n\nfunction isWorkflowName(ref: string): boolean {\n return ref.length >= 2 && ref.length <= 64 && WORKFLOW_NAME_RE.test(ref);\n}\n\nexport async function resolveWorkflowRef(\n ref: string,\n options: WorkflowRefOptions,\n): Promise<string> {\n if (UUID_RE.test(ref)) {\n return ref;\n }\n\n if (!isWorkflowName(ref)) {\n throw new Error(\n `Invalid workflow ref: \"${ref}\". Use a workflow ID or a slug name like \"tell-a-joke\"`,\n );\n }\n\n const agentId = options.agent ?? process.env.ZERO_AGENT_ID;\n if (!agentId) {\n throw new Error(\n \"Workflow name refs require an agent scope. Pass --agent <agent-id>, set ZERO_AGENT_ID, or use a workflow ID\",\n );\n }\n if (!UUID_RE.test(agentId)) {\n throw new Error(\n `Invalid agent ID: \"${agentId}\". Pass an agent UUID for --agent or use a workflow ID`,\n );\n }\n\n const workflows = await listWorkflows({ agentId });\n const matches = workflows.filter((workflow) => {\n return workflow.name === ref;\n });\n if (matches.length === 0) {\n throw new Error(\n `Workflow not found: \"${ref}\" under agent \"${agentId}\". Check the name and agent, or use the workflow ID`,\n );\n }\n\n const winners = matches.filter((workflow) => {\n return workflow.shadowedBy == null;\n });\n if (winners.length !== 1) {\n throw new Error(\n `Workflow name \"${ref}\" did not resolve to exactly one runtime winner under agent \"${agentId}\". Use the workflow ID`,\n );\n }\n return winners[0]!.id;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getWorkflow } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { formatWorkflowAgentName } from \"./format\";\nimport {\n resolveWorkflowRef,\n type WorkflowRefOptions,\n} from \"./resolve-workflow-ref\";\n\nexport const viewCommand = new Command()\n .name(\"view\")\n .description(\"View a workflow\")\n .argument(\"<workflow>\", \"Workflow ID or name\")\n .option(\"--agent <id>\", \"Agent ID for resolving workflow names\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow view tell-a-joke --agent <agent-id>\n zero workflow view <workflow-id>`,\n )\n .action(\n withErrorHandler(\n async (workflowRef: string, options: WorkflowRefOptions) => {\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const workflow = await getWorkflow(workflowId);\n\n console.log(chalk.bold(workflow.name));\n if (workflow.displayName) console.log(chalk.dim(workflow.displayName));\n console.log();\n console.log(`ID: ${workflow.id}`);\n console.log(`Name: ${workflow.name}`);\n console.log(`Visibility: ${workflow.visibility}`);\n console.log(`Agent Name: ${formatWorkflowAgentName(workflow)}`);\n console.log(`Agent ID: ${workflow.agentId}`);\n if (workflow.displayName)\n console.log(`Display Name: ${workflow.displayName}`);\n if (workflow.description)\n console.log(`Description: ${workflow.description}`);\n\n if (workflow.files && workflow.files.length > 0) {\n console.log();\n console.log(chalk.dim(\"── Files ──\"));\n for (const f of workflow.files) {\n console.log(` ${f.path} (${f.size} bytes)`);\n }\n }\n\n console.log();\n if (workflow.instruction) {\n console.log(chalk.dim(\"── Instruction ──\"));\n console.log(workflow.instruction);\n } else {\n console.log(chalk.dim(\"No instruction\"));\n }\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listWorkflows } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { formatWorkflowAgentName } from \"./format\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List visible workflows, optionally scoped to one agent\")\n .option(\"--agent <id>\", \"Only list workflows hosted by this agent\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow list\n zero workflow list --agent <agent-id>`,\n )\n .action(\n withErrorHandler(async (options: { agent?: string }) => {\n const workflows = await listWorkflows({ agentId: options.agent });\n\n if (workflows.length === 0) {\n console.log(chalk.dim(\"No workflows found\"));\n console.log(\n chalk.dim(\n \" Create one with: zero workflow create <name> --agent <agent-id> --instruction <text>\",\n ),\n );\n return;\n }\n\n const idWidth = Math.max(\n 2,\n ...workflows.map((s) => {\n return s.id.length;\n }),\n );\n const nameWidth = Math.max(\n 4,\n ...workflows.map((s) => {\n return s.name.length;\n }),\n );\n const agentWidth = Math.max(\n 10,\n ...workflows.map((s) => {\n return formatWorkflowAgentName(s).length;\n }),\n );\n const agentIdWidth = Math.max(\n 8,\n ...workflows.map((s) => {\n return s.agentId.length;\n }),\n );\n\n const header = [\n \"ID\".padEnd(idWidth),\n \"NAME\".padEnd(nameWidth),\n \"VISIBILITY\".padEnd(10),\n \"AGENT NAME\".padEnd(agentWidth),\n \"AGENT ID\".padEnd(agentIdWidth),\n \"DESCRIPTION\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const workflow of workflows) {\n const row = [\n workflow.id.padEnd(idWidth),\n workflow.name.padEnd(nameWidth),\n workflow.visibility.padEnd(10),\n formatWorkflowAgentName(workflow).padEnd(agentWidth),\n workflow.agentId.padEnd(agentIdWidth),\n workflow.description ?? \"-\",\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteWorkflow, getWorkflow } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n resolveWorkflowRef,\n type WorkflowRefOptions,\n} from \"./resolve-workflow-ref\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete a workflow\")\n .argument(\"<workflow>\", \"Workflow ID or name\")\n .option(\"--agent <id>\", \"Agent ID for resolving workflow names\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow delete tell-a-joke --agent <agent-id> -y\n zero workflow delete <workflow-id>\n zero workflow delete <workflow-id> -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(\n async (\n workflowRef: string,\n options: { yes?: boolean } & WorkflowRefOptions,\n ) => {\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const workflow = await getWorkflow(workflowId);\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 workflow '${workflow.name}'?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteWorkflow(workflowId);\n console.log(chalk.green(`✓ Workflow \"${workflow.name}\" deleted`));\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { copyWorkflow } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { formatWorkflowAgentName } from \"./format\";\nimport {\n resolveWorkflowRef,\n type WorkflowRefOptions,\n} from \"./resolve-workflow-ref\";\n\nexport const copyCommand = new Command()\n .name(\"copy\")\n .description(\"Copy (fork) a workflow onto another agent\")\n .argument(\"<workflow>\", \"Workflow ID or name to copy\")\n .option(\"--agent <id>\", \"Agent ID for resolving workflow names\")\n .requiredOption(\"--to-agent <agent-id>\", \"Target agent ID\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow copy tell-a-joke --agent <source-agent-id> --to-agent <target-agent-id>\n zero workflow copy <workflow-id> --to-agent <target-agent-id>`,\n )\n .action(\n withErrorHandler(\n async (\n workflowRef: string,\n options: { toAgent: string } & WorkflowRefOptions,\n ) => {\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const workflow = await copyWorkflow(workflowId, options.toAgent);\n\n console.log(chalk.green(`✓ Workflow \"${workflow.name}\" copied`));\n console.log(` ID: ${workflow.id}`);\n console.log(` Agent Name: ${formatWorkflowAgentName(workflow)}`);\n console.log(` Agent ID: ${workflow.agentId}`);\n console.log();\n console.log(`View it: zero workflow view ${workflow.id}`);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type {\n GithubLabelAppliedSubjectFilter,\n ZeroWorkflowSchedule,\n ZeroWorkflowTriggerCreateRequest,\n ZeroWorkflowTriggerSummary,\n ZeroWorkflowTriggerUpdateRequest,\n} from \"@vm0/api-contracts/contracts/zero-workflows\";\nimport {\n createWorkflowTrigger,\n deleteWorkflowTrigger,\n disableWorkflowTrigger,\n enableWorkflowTrigger,\n getWorkflowTrigger,\n listWorkflowTriggers,\n updateWorkflowTrigger,\n} from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport { parseDurationSeconds } from \"../../shared/duration\";\nimport {\n resolveWorkflowRef,\n type WorkflowRefOptions,\n} from \"../resolve-workflow-ref\";\nimport {\n printWorkflowTriggerDetails,\n printWorkflowTriggersTable,\n} from \"./display\";\nimport {\n buildGmailLabelAppliedEventConfig,\n buildGmailNewMessageEventConfig,\n hasGmailLabelOption,\n hasGmailTriggerOptions,\n type GmailTriggerOptions,\n} from \"./gmail-config\";\n\ninterface AddOptions extends GmailTriggerOptions {\n readonly expr?: string;\n readonly at?: string;\n readonly every?: string;\n readonly timezone?: string;\n readonly agent?: string;\n readonly subject?: string;\n readonly actor?: string;\n readonly calendarId?: string;\n readonly pageUrl?: string;\n readonly parentPageUrl?: string;\n readonly databaseUrl?: string;\n}\n\ninterface UpdateOptions extends GmailTriggerOptions {\n readonly expr?: string;\n readonly at?: string;\n readonly every?: string;\n readonly timezone?: string;\n readonly subject?: string;\n readonly actor?: string;\n}\n\nconst SCHEDULE_KINDS = [\"cron\", \"once\", \"loop\"] as const;\nconst EVENT_KINDS = [\n \"gmail-new-message\",\n \"gmail-label-applied\",\n \"github-label-applied\",\n \"google-calendar-event-created\",\n \"google-calendar-event-updated\",\n \"google-calendar-event-cancelled\",\n \"notion-child-page-created\",\n \"notion-database-item-created\",\n \"notion-page-content-updated\",\n \"webhook\",\n] as const;\nconst TRIGGER_KINDS = [...SCHEDULE_KINDS, ...EVENT_KINDS] as const;\nconst EXACTLY_ONE_FLAG_MESSAGE =\n \"Provide exactly one of --expr (cron), --at (once), --every (loop), Gmail match options, --label, --subject, --actor, --calendar-id, --page-url, --parent-page-url, or --database-url\";\n\nfunction addGmailTriggerOptions(command: Command): Command {\n return command\n .option(\n \"--config <path>\",\n \"Path to a Gmail new message trigger config JSON\",\n )\n .option(\"--label <name>\", \"Label name for label-applied triggers\")\n .option(\"--from-contains <text>\", \"Require the From header to contain text\")\n .option(\n \"--from-not-contains <text>\",\n \"Require the From header not to contain text\",\n )\n .option(\n \"--subject-contains <text>\",\n \"Require the Subject header to contain text\",\n )\n .option(\n \"--subject-not-contains <text>\",\n \"Require the Subject header not to contain text\",\n )\n .option(\n \"--body-contains <text>\",\n \"Require the message body to contain text\",\n )\n .option(\n \"--body-not-contains <text>\",\n \"Require the message body not to contain text\",\n )\n .option(\"--to-contains <text>\", \"Require the To header to contain text\")\n .option(\n \"--to-not-contains <text>\",\n \"Require the To header not to contain text\",\n )\n .option(\"--cc-contains <text>\", \"Require the Cc header to contain text\")\n .option(\n \"--cc-not-contains <text>\",\n \"Require the Cc header not to contain text\",\n );\n}\n\nfunction addGithubTriggerOptions(command: Command): Command {\n return command\n .option(\n \"--subject <subject>\",\n \"GitHub subject filter for github-label-applied: both | issues | pull-requests\",\n )\n .option(\n \"--actor <actor>\",\n \"GitHub actor filter for github-label-applied: me | anyone\",\n );\n}\n\nfunction timezoneOrUtc(timezone: string | undefined): string {\n return timezone ?? \"UTC\";\n}\n\nfunction assertValidTimezone(timezone: string): void {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone });\n}\n\nfunction hasExplicitOffset(value: string): boolean {\n return /(?:Z|[+-]\\d{2}:?\\d{2})$/i.test(value);\n}\n\nfunction parseLocalDateTime(value: string): {\n readonly year: number;\n readonly month: number;\n readonly day: number;\n readonly hour: number;\n readonly minute: number;\n readonly second: number;\n readonly millisecond: number;\n} {\n const match = value.match(\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?$/,\n );\n if (!match) {\n throw new Error(\n `Invalid at time: \"${value}\". Use ISO datetime, e.g. 2026-06-10T09:00 or 2026-06-10T09:00:00Z`,\n );\n }\n return {\n year: Number(match[1]),\n month: Number(match[2]),\n day: Number(match[3]),\n hour: Number(match[4]),\n minute: Number(match[5]),\n second: match[6] ? Number(match[6]) : 0,\n millisecond: match[7] ? Number(match[7].padEnd(3, \"0\")) : 0,\n };\n}\n\nfunction zonedParts(instant: Date, timezone: string) {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).formatToParts(instant);\n const values = new Map<string, string>();\n for (const part of parts) {\n if (part.type !== \"literal\") {\n values.set(part.type, part.value);\n }\n }\n return {\n year: Number(values.get(\"year\")),\n month: Number(values.get(\"month\")),\n day: Number(values.get(\"day\")),\n hour: Number(values.get(\"hour\")),\n minute: Number(values.get(\"minute\")),\n second: Number(values.get(\"second\")),\n };\n}\n\nfunction wallTimeToUtcIso(value: string, timezone: string): string {\n assertValidTimezone(timezone);\n if (hasExplicitOffset(value)) {\n const instant = new Date(value);\n if (Number.isNaN(instant.getTime())) {\n throw new Error(`Invalid at time: \"${value}\"`);\n }\n return instant.toISOString();\n }\n\n const target = parseLocalDateTime(value);\n const targetUtc = Date.UTC(\n target.year,\n target.month - 1,\n target.day,\n target.hour,\n target.minute,\n target.second,\n target.millisecond,\n );\n let guess = targetUtc;\n for (let i = 0; i < 3; i++) {\n const parts = zonedParts(new Date(guess), timezone);\n const renderedUtc = Date.UTC(\n parts.year,\n parts.month - 1,\n parts.day,\n parts.hour,\n parts.minute,\n parts.second,\n target.millisecond,\n );\n guess += targetUtc - renderedUtc;\n }\n\n const result = new Date(guess);\n const rendered = zonedParts(result, timezone);\n if (\n rendered.year !== target.year ||\n rendered.month !== target.month ||\n rendered.day !== target.day ||\n rendered.hour !== target.hour ||\n rendered.minute !== target.minute ||\n rendered.second !== target.second\n ) {\n throw new Error(\n `Invalid at time for ${timezone}: \"${value}\". The local time does not exist`,\n );\n }\n return result.toISOString();\n}\n\nfunction buildSchedule(\n kind: string,\n options: UpdateOptions,\n): ZeroWorkflowSchedule {\n switch (kind) {\n case \"cron\":\n if (!options.expr) {\n throw new Error(\n 'cron triggers require --expr (e.g. --expr \"0 9 * * *\")',\n );\n }\n return {\n type: \"cron\",\n cronExpression: options.expr,\n timezone: timezoneOrUtc(options.timezone),\n };\n case \"once\": {\n if (!options.at) {\n throw new Error(\n 'once triggers require --at (e.g. --at \"2026-06-10T09:00\")',\n );\n }\n const timezone = timezoneOrUtc(options.timezone);\n return {\n type: \"once\",\n atTime: wallTimeToUtcIso(options.at, timezone),\n timezone,\n };\n }\n case \"loop\":\n if (!options.every) {\n throw new Error(\"loop triggers require --every (e.g. --every 15m)\");\n }\n return {\n type: \"loop\",\n intervalSeconds: parseDurationSeconds(options.every),\n };\n default:\n throw new Error(\n `Unknown trigger kind: \"${kind}\". Use one of: ${TRIGGER_KINDS.join(\", \")}`,\n );\n }\n}\n\nfunction hasScheduleAddOptions(options: AddOptions): boolean {\n return (\n options.expr !== undefined ||\n options.at !== undefined ||\n options.every !== undefined ||\n options.timezone !== undefined\n );\n}\n\nfunction hasGithubTriggerOptions(options: AddOptions | UpdateOptions): boolean {\n return options.subject !== undefined || options.actor !== undefined;\n}\n\nfunction hasCalendarTriggerOptions(options: AddOptions): boolean {\n return options.calendarId !== undefined;\n}\n\nfunction hasNotionTriggerOptions(options: AddOptions): boolean {\n return (\n options.pageUrl !== undefined ||\n options.parentPageUrl !== undefined ||\n options.databaseUrl !== undefined\n );\n}\n\nfunction hasEventAddOptions(options: AddOptions): boolean {\n return (\n hasGmailTriggerOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubTriggerOptions(options) ||\n hasCalendarTriggerOptions(options) ||\n hasNotionTriggerOptions(options)\n );\n}\n\nfunction assertNoScheduleAddOptions(options: AddOptions): void {\n if (hasScheduleAddOptions(options)) {\n throw new Error(\n \"--expr, --at, --every, and --timezone only apply to schedule triggers\",\n );\n }\n}\n\nfunction assertNoGithubTriggerOptions(\n options: AddOptions,\n message = \"GitHub trigger flags only apply to GitHub event triggers\",\n): void {\n if (hasGithubTriggerOptions(options)) {\n throw new Error(message);\n }\n}\n\nfunction assertNoCalendarTriggerOptions(options: AddOptions): void {\n if (hasCalendarTriggerOptions(options)) {\n throw new Error(\n \"Google Calendar trigger flags only apply to Google Calendar event triggers\",\n );\n }\n}\n\nfunction assertNoNotionTriggerOptions(options: AddOptions): void {\n if (hasNotionTriggerOptions(options)) {\n throw new Error(\"Notion trigger flags only apply to Notion event triggers\");\n }\n}\n\nfunction scheduleUpdateFlagCount(options: UpdateOptions): number {\n return [options.expr, options.at, options.every].filter((value) => {\n return value !== undefined;\n }).length;\n}\n\nfunction hasScheduleUpdateOptions(options: UpdateOptions): boolean {\n return scheduleUpdateFlagCount(options) > 0 || options.timezone !== undefined;\n}\n\nfunction parseGithubSubject(\n value: string | undefined,\n fallback: GithubLabelAppliedSubjectFilter = \"both\",\n): GithubLabelAppliedSubjectFilter {\n if (value === undefined) {\n return fallback;\n }\n switch (value) {\n case \"both\":\n case \"issues\":\n return value;\n case \"pull-requests\":\n return \"pull_requests\";\n default:\n throw new Error(\n `Invalid --subject \"${value}\". Use one of: both, issues, pull-requests`,\n );\n }\n}\n\nfunction parseGithubActor(\n value: string | undefined,\n fallback: \"me\" | \"anyone\" = \"me\",\n): \"me\" | \"anyone\" {\n if (value === undefined) {\n return fallback;\n }\n if (value === \"me\" || value === \"anyone\") {\n return value;\n }\n throw new Error(`Invalid --actor \"${value}\". Use one of: me, anyone`);\n}\n\nfunction buildGithubLabelAppliedEventConfig(\n options: AddOptions | UpdateOptions,\n existing?: Extract<\n ZeroWorkflowTriggerSummary,\n { readonly kind: \"event\"; readonly eventType: \"github-label-applied\" }\n >,\n) {\n const labelName = options.label?.trim() ?? existing?.eventConfig.labelName;\n if (!labelName) {\n throw new Error(\n 'github-label-applied triggers require --label \"Label name\"',\n );\n }\n\n return {\n provider: \"github\" as const,\n event: \"label_applied\" as const,\n labelName,\n filters: {\n subject: parseGithubSubject(\n options.subject,\n existing?.eventConfig.filters.subject ?? \"both\",\n ),\n actor: {\n type: parseGithubActor(\n options.actor,\n existing?.eventConfig.filters.actor.type ?? \"me\",\n ),\n },\n },\n };\n}\n\nfunction buildGmailNewMessageCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailLabelOption(options)) {\n throw new Error(\"--label only applies to label-applied event triggers\");\n }\n assertNoGithubTriggerOptions(options);\n assertNoCalendarTriggerOptions(options);\n assertNoNotionTriggerOptions(options);\n return {\n kind: \"event\",\n eventType: \"gmail-new-message\",\n eventConfig: buildGmailNewMessageEventConfig(options),\n };\n}\n\nfunction buildGmailLabelAppliedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailTriggerOptions(options)) {\n throw new Error(\n \"Gmail match flags and --config only apply to gmail-new-message triggers\",\n );\n }\n assertNoGithubTriggerOptions(options);\n assertNoCalendarTriggerOptions(options);\n assertNoNotionTriggerOptions(options);\n return {\n kind: \"event\",\n eventType: \"gmail-label-applied\",\n eventConfig: buildGmailLabelAppliedEventConfig(options),\n };\n}\n\nfunction buildGithubLabelAppliedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailTriggerOptions(options)) {\n throw new Error(\n \"Gmail match flags and --config only apply to Gmail event triggers\",\n );\n }\n assertNoCalendarTriggerOptions(options);\n assertNoNotionTriggerOptions(options);\n return {\n kind: \"event\",\n eventType: \"github-label-applied\",\n eventConfig: buildGithubLabelAppliedEventConfig(options),\n };\n}\n\nfunction buildGoogleCalendarEventCreateRequest(\n eventType:\n | \"google-calendar-event-created\"\n | \"google-calendar-event-updated\"\n | \"google-calendar-event-cancelled\",\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailTriggerOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubTriggerOptions(options) ||\n hasNotionTriggerOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Notion trigger flags only apply to their event triggers\",\n );\n }\n const calendarId = options.calendarId?.trim() || \"primary\";\n if (eventType === \"google-calendar-event-created\") {\n return {\n kind: \"event\",\n eventType: \"google-calendar-event-created\",\n eventConfig: {\n provider: \"google-calendar\",\n event: \"event_created\",\n calendarId,\n },\n };\n }\n if (eventType === \"google-calendar-event-updated\") {\n return {\n kind: \"event\",\n eventType: \"google-calendar-event-updated\",\n eventConfig: {\n provider: \"google-calendar\",\n event: \"event_updated\",\n calendarId,\n },\n };\n }\n return {\n kind: \"event\",\n eventType: \"google-calendar-event-cancelled\",\n eventConfig: {\n provider: \"google-calendar\",\n event: \"event_cancelled\",\n calendarId,\n },\n };\n}\n\nfunction buildNotionChildPageCreatedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailTriggerOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubTriggerOptions(options) ||\n hasCalendarTriggerOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Google Calendar trigger flags only apply to their event triggers\",\n );\n }\n\n const parentPageUrl = options.parentPageUrl?.trim();\n if (options.pageUrl !== undefined || options.databaseUrl !== undefined) {\n throw new Error(\n \"--page-url and --database-url do not apply to notion-child-page-created triggers\",\n );\n }\n if (!parentPageUrl) {\n throw new Error(\n 'notion-child-page-created triggers require --parent-page-url \"https://www.notion.so/...\"',\n );\n }\n\n return {\n kind: \"event\",\n eventType: \"notion-child-page-created\",\n eventConfig: {\n provider: \"notion\",\n event: \"child_page_created\",\n parentPageUrl,\n },\n };\n}\n\nfunction buildNotionDatabaseItemCreatedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailTriggerOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubTriggerOptions(options) ||\n hasCalendarTriggerOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Google Calendar trigger flags only apply to their event triggers\",\n );\n }\n\n if (options.pageUrl !== undefined || options.parentPageUrl !== undefined) {\n throw new Error(\n \"--page-url and --parent-page-url do not apply to notion-database-item-created triggers\",\n );\n }\n const databaseUrl = options.databaseUrl?.trim();\n if (!databaseUrl) {\n throw new Error(\n 'notion-database-item-created triggers require --database-url \"https://www.notion.so/...\"',\n );\n }\n\n return {\n kind: \"event\",\n eventType: \"notion-database-item-created\",\n eventConfig: {\n provider: \"notion\",\n event: \"database_item_created\",\n databaseUrl,\n },\n };\n}\n\nfunction buildNotionPageContentUpdatedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailTriggerOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubTriggerOptions(options) ||\n hasCalendarTriggerOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Google Calendar trigger flags only apply to their event triggers\",\n );\n }\n\n if (options.parentPageUrl !== undefined) {\n throw new Error(\n \"--parent-page-url only applies to notion-child-page-created triggers\",\n );\n }\n const pageUrl = options.pageUrl?.trim();\n const databaseUrl = options.databaseUrl?.trim();\n if (\n (pageUrl !== undefined && pageUrl.length > 0) ===\n (databaseUrl !== undefined && databaseUrl.length > 0)\n ) {\n throw new Error(\n 'notion-page-content-updated triggers require exactly one of --page-url \"https://www.notion.so/...\" or --database-url \"https://www.notion.so/...\"',\n );\n }\n\n return {\n kind: \"event\",\n eventType: \"notion-page-content-updated\",\n eventConfig:\n pageUrl !== undefined && pageUrl.length > 0\n ? {\n provider: \"notion\",\n event: \"page_content_updated\",\n pageUrl,\n }\n : {\n provider: \"notion\",\n event: \"page_content_updated\",\n databaseUrl: databaseUrl ?? \"\",\n },\n };\n}\n\nfunction buildWebhookCreateRequest(\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasEventAddOptions(options)) {\n throw new Error(\"Event trigger flags only apply to event triggers\");\n }\n return {\n kind: \"event\",\n eventType: \"webhook-received\",\n eventConfig: {\n provider: \"webhook\",\n event: \"received\",\n auth: { mode: \"hmac-sha256\" },\n },\n };\n}\n\nfunction buildScheduleCreateRequest(\n kind: string,\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n if (hasEventAddOptions(options)) {\n throw new Error(\"Event trigger flags only apply to event triggers\");\n }\n return { schedule: buildSchedule(kind, options) };\n}\n\nfunction buildCreateRequest(\n kind: string,\n options: AddOptions,\n): ZeroWorkflowTriggerCreateRequest {\n switch (kind) {\n case \"gmail-new-message\":\n return buildGmailNewMessageCreateRequest(options);\n case \"gmail-label-applied\":\n return buildGmailLabelAppliedCreateRequest(options);\n case \"github-label-applied\":\n return buildGithubLabelAppliedCreateRequest(options);\n case \"google-calendar-event-created\":\n return buildGoogleCalendarEventCreateRequest(kind, options);\n case \"google-calendar-event-updated\":\n return buildGoogleCalendarEventCreateRequest(kind, options);\n case \"google-calendar-event-cancelled\":\n return buildGoogleCalendarEventCreateRequest(kind, options);\n case \"notion-child-page-created\":\n return buildNotionChildPageCreatedCreateRequest(options);\n case \"notion-database-item-created\":\n return buildNotionDatabaseItemCreatedCreateRequest(options);\n case \"notion-page-content-updated\":\n return buildNotionPageContentUpdatedCreateRequest(options);\n case \"webhook\":\n return buildWebhookCreateRequest(options);\n default:\n return buildScheduleCreateRequest(kind, options);\n }\n}\n\nfunction buildEventUpdate(\n options: UpdateOptions,\n existing: Extract<ZeroWorkflowTriggerSummary, { readonly kind: \"event\" }>,\n): ZeroWorkflowTriggerUpdateRequest {\n const hasGmailOptions = hasGmailTriggerOptions(options);\n const hasLabelOption = hasGmailLabelOption(options);\n const hasGithubOptions = hasGithubTriggerOptions(options);\n\n if (\n existing.eventType === \"google-calendar-event-created\" ||\n existing.eventType === \"google-calendar-event-updated\" ||\n existing.eventType === \"google-calendar-event-cancelled\"\n ) {\n throw new Error(\"Google Calendar event triggers cannot be updated\");\n }\n\n if (existing.eventType === \"github-label-applied\") {\n if (hasGmailOptions) {\n throw new Error(\"Gmail match flags only apply to Gmail event triggers\");\n }\n if (!hasLabelOption && !hasGithubOptions) {\n throw new Error(\n \"Provide --label, --subject, or --actor for github-label-applied triggers\",\n );\n }\n return {\n eventConfig: buildGithubLabelAppliedEventConfig(options, existing),\n };\n }\n\n if (hasGithubOptions) {\n throw new Error(\"GitHub trigger flags only apply to GitHub event triggers\");\n }\n\n if (existing.eventType === \"gmail-label-applied\") {\n if (!hasLabelOption || hasGmailOptions) {\n throw new Error(\"Use --label for gmail-label-applied triggers\");\n }\n return { eventConfig: buildGmailLabelAppliedEventConfig(options) };\n }\n\n if (!hasGmailOptions || hasLabelOption) {\n throw new Error(\"Use Gmail match options for gmail-new-message triggers\");\n }\n return { eventConfig: buildGmailNewMessageEventConfig(options) };\n}\n\nfunction buildScheduleUpdate(\n options: UpdateOptions,\n): ZeroWorkflowTriggerUpdateRequest {\n const hasGmailOptions = hasGmailTriggerOptions(options);\n const hasLabelOption = hasGmailLabelOption(options);\n if (hasGmailOptions || hasLabelOption) {\n throw new Error(\"Gmail trigger flags only apply to Gmail event triggers\");\n }\n const flagCount = scheduleUpdateFlagCount(options);\n if (flagCount !== 1) {\n throw new Error(EXACTLY_ONE_FLAG_MESSAGE);\n }\n if (options.timezone && !options.expr && !options.at) {\n throw new Error(\"--timezone only applies to --expr and --at\");\n }\n if (options.expr) {\n return { schedule: buildSchedule(\"cron\", options) };\n }\n if (options.at) {\n return { schedule: buildSchedule(\"once\", options) };\n }\n return { schedule: buildSchedule(\"loop\", options) };\n}\n\nfunction buildUpdate(\n options: UpdateOptions,\n existing: ZeroWorkflowTriggerSummary,\n): ZeroWorkflowTriggerUpdateRequest {\n const hasEventOptions =\n hasGmailTriggerOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubTriggerOptions(options);\n if (hasScheduleUpdateOptions(options) && hasEventOptions) {\n throw new Error(\"Use either schedule flags or event trigger options\");\n }\n if (hasGmailTriggerOptions(options) && hasGmailLabelOption(options)) {\n throw new Error(\"Use either Gmail match options or --label\");\n }\n\n if (existing.kind === \"event\") {\n if (hasScheduleUpdateOptions(options)) {\n throw new Error(\"Schedule flags only apply to schedule triggers\");\n }\n return buildEventUpdate(options, existing);\n }\n\n if (hasGithubTriggerOptions(options)) {\n throw new Error(\"GitHub trigger flags only apply to GitHub event triggers\");\n }\n return buildScheduleUpdate(options);\n}\n\nconst addCommand = addGithubTriggerOptions(\n addGmailTriggerOptions(\n new Command()\n .name(\"add\")\n .description(\"Add a trigger to a workflow\")\n .argument(\"<workflow>\", \"Workflow ID or name\")\n .argument(\"<kind>\", `Trigger type: ${TRIGGER_KINDS.join(\" | \")}`)\n .option(\"--expr <expression>\", 'Cron expression for kind \"cron\"')\n .option(\"--at <iso-time>\", 'Fire time for kind \"once\"')\n .option(\n \"--every <duration>\",\n 'Interval for kind \"loop\" (e.g. 15m, 1h, 90s)',\n )\n .option(\n \"-z, --timezone <tz>\",\n \"IANA timezone for cron/once (default: UTC)\",\n ),\n ),\n)\n .option(\n \"--calendar-id <id>\",\n \"Google Calendar ID for Google Calendar event triggers (default: primary)\",\n )\n .option(\n \"--page-url <url>\",\n \"Notion page URL for notion-page-content-updated triggers\",\n )\n .option(\n \"--parent-page-url <url>\",\n \"Parent Notion page URL for notion-child-page-created triggers\",\n )\n .option(\n \"--database-url <url>\",\n \"Notion database URL for notion-database-item-created or notion-page-content-updated triggers\",\n )\n .option(\"--agent <id>\", \"Agent ID for resolving a workflow name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow trigger add tell-a-joke --agent <agent-id> cron --expr \"0 9 * * *\" -z Asia/Shanghai\n zero workflow trigger add tell-a-joke --agent <agent-id> once --at \"2026-06-10T09:00\" -z Asia/Shanghai\n zero workflow trigger add tell-a-joke --agent <agent-id> loop --every 15m\n zero workflow trigger add triage --agent <agent-id> gmail-new-message --from-contains \"@example.com\"\n zero workflow trigger add triage --agent <agent-id> gmail-new-message --config ./gmail-trigger.json\n zero workflow trigger add triage --agent <agent-id> gmail-label-applied --label \"Support\"\n zero workflow trigger add triage --agent <agent-id> github-label-applied --label \"triage\" --subject both --actor me\n zero workflow trigger add triage --agent <agent-id> google-calendar-event-created\n zero workflow trigger add triage --agent <agent-id> google-calendar-event-updated\n zero workflow trigger add triage --agent <agent-id> google-calendar-event-cancelled\n zero workflow trigger add research-notes --agent <agent-id> notion-child-page-created --parent-page-url \"https://www.notion.so/workspace/Page-title-1234567890abcdef1234567890abcdef\"\n zero workflow trigger add research-notes --agent <agent-id> notion-database-item-created --database-url \"https://www.notion.so/1234567890abcdef1234567890abcdef?v=abcdef1234567890abcdef1234567890\"\n zero workflow trigger add research-notes --agent <agent-id> notion-page-content-updated --page-url \"https://www.notion.so/workspace/Page-title-1234567890abcdef1234567890abcdef\"\n zero workflow trigger add research-notes --agent <agent-id> notion-page-content-updated --database-url \"https://www.notion.so/1234567890abcdef1234567890abcdef?v=abcdef1234567890abcdef1234567890\"\n zero workflow trigger add triage --agent <agent-id> webhook\n\nNotes:\n - Workflow names resolve under --agent, then ZERO_AGENT_ID\n - Gmail triggers match all inbound messages when no text match rules are provided\n - GitHub label triggers require the GitHub App installation in the workspace\n - Webhook triggers print the signing secret only once after creation\n - Use the workflow ID when a name is ambiguous`,\n )\n .action(\n withErrorHandler(\n async (workflowRef: string, kind: string, options: AddOptions) => {\n if (\n options.timezone &&\n kind !== \"cron\" &&\n kind !== \"once\" &&\n kind !== \"gmail-new-message\"\n ) {\n throw new Error(\"--timezone only applies to cron and once triggers\");\n }\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const body = buildCreateRequest(kind, options);\n const trigger = await createWorkflowTrigger(workflowId, body);\n\n console.log(\n chalk.green(`✓ Trigger added to workflow \"${workflowRef}\"`),\n );\n printWorkflowTriggerDetails(trigger, { workflowRef });\n },\n ),\n );\n\nconst updateCommand = addGithubTriggerOptions(\n addGmailTriggerOptions(\n new Command()\n .name(\"update\")\n .description(\n \"Replace a workflow trigger's schedule or Gmail match config\",\n )\n .argument(\"<trigger>\", \"Workflow trigger ID\")\n .option(\"--expr <expression>\", 'New cron schedule (e.g. \"0 9 * * *\")')\n .option(\"--at <iso-time>\", 'New one-time fire (e.g. \"2026-06-10T09:00\")')\n .option(\"--every <duration>\", \"New loop interval (e.g. 15m, 1h, 90s)\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone for --expr / --at\"),\n ),\n)\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --expr \"0 9 * * *\" -z Asia/Shanghai\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --at \"2026-06-10T09:00\" -z UTC\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --every 10m\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --from-contains \"@example.com\"\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --config ./gmail-trigger.json\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --label \"Support\"\n zero workflow trigger update 22222222-2222-4222-8222-222222222222 --actor anyone`,\n )\n .action(\n withErrorHandler(async (id: string, options: UpdateOptions) => {\n const existing = await getWorkflowTrigger(id);\n const trigger = await updateWorkflowTrigger(\n id,\n buildUpdate(options, existing),\n );\n\n console.log(chalk.green(`✓ Trigger ${trigger.id} updated`));\n printWorkflowTriggerDetails(trigger);\n }),\n );\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List a workflow's triggers\")\n .argument(\"<workflow>\", \"Workflow ID or name\")\n .option(\"--agent <id>\", \"Agent ID for resolving a workflow name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow trigger list tell-a-joke --agent <agent-id>\n zero workflow trigger list <workflow-id>`,\n )\n .action(\n withErrorHandler(\n async (workflowRef: string, options: WorkflowRefOptions) => {\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const triggers = await listWorkflowTriggers(workflowId);\n\n if (triggers.length === 0) {\n console.log(chalk.dim(\"No triggers\"));\n console.log(\n chalk.dim(\n ` Add one with: zero workflow trigger add ${workflowRef} cron --expr \"0 9 * * *\"`,\n ),\n );\n return;\n }\n\n printWorkflowTriggersTable(triggers);\n },\n ),\n );\n\nconst showCommand = new Command()\n .name(\"show\")\n .description(\"Show a workflow trigger\")\n .argument(\"<trigger>\", \"Workflow trigger ID\")\n .action(\n withErrorHandler(async (id: string) => {\n const trigger = await getWorkflowTrigger(id);\n printWorkflowTriggerDetails(trigger);\n }),\n );\n\nconst rmCommand = new Command()\n .name(\"rm\")\n .alias(\"remove\")\n .description(\"Remove a workflow trigger\")\n .argument(\"<trigger>\", \"Workflow trigger ID\")\n .action(\n withErrorHandler(async (id: string) => {\n await deleteWorkflowTrigger(id);\n console.log(chalk.green(`✓ Trigger ${id} removed`));\n }),\n );\n\nconst enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable a workflow trigger\")\n .argument(\"<trigger>\", \"Workflow trigger ID\")\n .action(\n withErrorHandler(async (id: string) => {\n const trigger = await enableWorkflowTrigger(id);\n console.log(chalk.green(`✓ Trigger ${trigger.id} enabled`));\n }),\n );\n\nconst disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable a workflow trigger\")\n .argument(\"<trigger>\", \"Workflow trigger ID\")\n .action(\n withErrorHandler(async (id: string) => {\n const trigger = await disableWorkflowTrigger(id);\n console.log(chalk.green(`✓ Trigger ${trigger.id} disabled`));\n }),\n );\n\nexport const triggerCommand = new Command()\n .name(\"trigger\")\n .description(\"Manage a workflow's triggers\")\n .addCommand(addCommand)\n .addCommand(updateCommand)\n .addCommand(listCommand)\n .addCommand(showCommand)\n .addCommand(rmCommand)\n .addCommand(enableCommand)\n .addCommand(disableCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Add a trigger: zero workflow trigger add <workflow-id> cron --expr \"0 9 * * *\"\n Add a Notion page: zero workflow trigger add <workflow-id> notion-child-page-created --parent-page-url \"https://www.notion.so/...\"\n Add a webhook: zero workflow trigger add <workflow-id> webhook\n Update a schedule: zero workflow trigger update <trigger-id> --every 10m\n List triggers: zero workflow trigger list <workflow-id>\n Inspect a trigger: zero workflow trigger show <trigger-id>\n Pause one trigger: zero workflow trigger disable <trigger-id>`,\n );\n","/**\n * Human-friendly duration handling for loop triggers (`--every` / `--loop`).\n */\n\nconst DURATION_PATTERN = /^(\\d+)([smhd])$/;\n\nconst UNIT_SECONDS: Record<string, number> = {\n s: 1,\n m: 60,\n h: 60 * 60,\n d: 24 * 60 * 60,\n};\n\n/**\n * Parse a human duration like \"90s\", \"15m\", \"1h\", \"2d\" into seconds.\n * @throws Error when the input is not a positive integer + unit\n */\nexport function parseDurationSeconds(input: string): number {\n const match = input.match(DURATION_PATTERN);\n if (!match) {\n throw new Error(\n `Invalid duration: \"${input}\". Use <number><unit> with unit s, m, h, or d (e.g. 90s, 15m, 1h)`,\n );\n }\n\n const value = parseInt(match[1]!, 10);\n if (value <= 0) {\n throw new Error(`Invalid duration: \"${input}\". Must be greater than zero`);\n }\n\n return value * UNIT_SECONDS[match[2]!]!;\n}\n\n/**\n * Format seconds back into the largest exact unit (900 → \"15m\", 90 → \"90s\")\n */\nexport function formatDurationSeconds(seconds: number): string {\n for (const [unit, size] of [\n [\"d\", UNIT_SECONDS.d!],\n [\"h\", UNIT_SECONDS.h!],\n [\"m\", UNIT_SECONDS.m!],\n ] as const) {\n if (seconds % size === 0 && seconds >= size) {\n return `${seconds / size}${unit}`;\n }\n }\n return `${seconds}s`;\n}\n","import chalk from \"chalk\";\nimport type {\n GmailNewMessageEventConfig,\n ZeroWorkflowTriggerSummary,\n} from \"@vm0/api-contracts/contracts/zero-workflows\";\nimport { formatRelativeTime } from \"../../../../lib/domain/schedule-utils\";\nimport { formatDurationSeconds } from \"../../shared/duration\";\n\ntype GmailMatchRules = NonNullable<GmailNewMessageEventConfig[\"match\"]>;\ntype GmailTextMatcher = NonNullable<GmailMatchRules[\"from\"]>;\ntype GmailTextField = \"from\" | \"subject\" | \"body\" | \"to\" | \"cc\";\n\nconst GMAIL_TEXT_FIELDS: readonly GmailTextField[] = [\n \"from\",\n \"subject\",\n \"body\",\n \"to\",\n \"cc\",\n];\n\ntype WorkflowWebhookTriggerSummary = Extract<\n ZeroWorkflowTriggerSummary,\n { readonly kind: \"event\"; readonly eventType: \"webhook-received\" }\n>;\ntype WorkflowNotionChildPageTriggerSummary = Extract<\n ZeroWorkflowTriggerSummary,\n { readonly kind: \"event\"; readonly eventType: \"notion-child-page-created\" }\n>;\ntype WorkflowNotionDatabaseItemTriggerSummary = Extract<\n ZeroWorkflowTriggerSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"notion-database-item-created\";\n }\n>;\ntype WorkflowNotionPageContentUpdatedTriggerSummary = Extract<\n ZeroWorkflowTriggerSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"notion-page-content-updated\";\n }\n>;\n\nfunction isWebhookTrigger(\n trigger: ZeroWorkflowTriggerSummary,\n): trigger is WorkflowWebhookTriggerSummary {\n return trigger.kind === \"event\" && trigger.eventType === \"webhook-received\";\n}\n\nfunction isNotionChildPageTrigger(\n trigger: ZeroWorkflowTriggerSummary,\n): trigger is WorkflowNotionChildPageTriggerSummary {\n return (\n trigger.kind === \"event\" &&\n trigger.eventType === \"notion-child-page-created\"\n );\n}\n\nfunction isNotionDatabaseItemTrigger(\n trigger: ZeroWorkflowTriggerSummary,\n): trigger is WorkflowNotionDatabaseItemTriggerSummary {\n return (\n trigger.kind === \"event\" &&\n trigger.eventType === \"notion-database-item-created\"\n );\n}\n\nfunction isNotionPageContentUpdatedTrigger(\n trigger: ZeroWorkflowTriggerSummary,\n): trigger is WorkflowNotionPageContentUpdatedTriggerSummary {\n return (\n trigger.kind === \"event\" &&\n trigger.eventType === \"notion-page-content-updated\"\n );\n}\n\nfunction isGoogleCalendarTrigger(\n trigger: ZeroWorkflowTriggerSummary,\n): trigger is Extract<\n ZeroWorkflowTriggerSummary,\n {\n readonly kind: \"event\";\n readonly eventType:\n | \"google-calendar-event-created\"\n | \"google-calendar-event-updated\"\n | \"google-calendar-event-cancelled\";\n }\n> {\n return (\n trigger.kind === \"event\" &&\n (trigger.eventType === \"google-calendar-event-created\" ||\n trigger.eventType === \"google-calendar-event-updated\" ||\n trigger.eventType === \"google-calendar-event-cancelled\")\n );\n}\n\nfunction quote(value: string): string {\n return `\"${value}\"`;\n}\n\nfunction quoteList(values: readonly string[]): string {\n return values.map(quote).join(\", \");\n}\n\nfunction textMatcherParts(\n field: GmailTextField,\n matcher: GmailTextMatcher,\n): string[] {\n const parts: string[] = [];\n if (matcher.contains) {\n parts.push(`${field} contains ${quote(matcher.contains)}`);\n }\n if (matcher.containsAny) {\n parts.push(`${field} contains any of ${quoteList(matcher.containsAny)}`);\n }\n if (matcher.doesNotContain) {\n parts.push(`${field} does not contain ${quote(matcher.doesNotContain)}`);\n }\n if (matcher.doesNotContainAny) {\n parts.push(\n `${field} does not contain any of ${quoteList(matcher.doesNotContainAny)}`,\n );\n }\n return parts;\n}\n\nfunction formatGmailMatchSummary(config: GmailNewMessageEventConfig): string {\n const match = config.match;\n if (!match) {\n return \"all inbound messages\";\n }\n\n const parts: string[] = [];\n for (const field of GMAIL_TEXT_FIELDS) {\n const matcher = match[field];\n if (matcher) {\n parts.push(...textMatcherParts(field, matcher));\n }\n }\n return parts.length > 0 ? parts.join(\"; \") : \"all inbound messages\";\n}\n\nfunction formatGithubSubject(subject: string): string {\n if (subject === \"pull_requests\") {\n return \"pull requests\";\n }\n return subject;\n}\n\nfunction formatWebhookTriggerEntry(\n trigger: WorkflowWebhookTriggerSummary,\n): string {\n return `Webhook: ${trigger.webhookUrl ?? \"hidden\"}`;\n}\n\nfunction formatNotionParentPage(\n trigger: WorkflowNotionChildPageTriggerSummary,\n): string {\n return (\n trigger.eventConfig.parentPage.title ?? trigger.eventConfig.parentPage.url\n );\n}\n\nfunction formatNotionDatabase(\n trigger: WorkflowNotionDatabaseItemTriggerSummary,\n): string {\n return (\n trigger.eventConfig.dataSource.title ?? trigger.eventConfig.dataSource.url\n );\n}\n\nfunction formatNotionContentUpdatedScope(\n trigger: WorkflowNotionPageContentUpdatedTriggerSummary,\n): string {\n return trigger.eventConfig.scope.type === \"page\"\n ? (trigger.eventConfig.scope.page.title ??\n trigger.eventConfig.scope.page.url)\n : (trigger.eventConfig.scope.dataSource.title ??\n trigger.eventConfig.scope.dataSource.url);\n}\n\nfunction formatNotionContentUpdatedScopeUrl(\n trigger: WorkflowNotionPageContentUpdatedTriggerSummary,\n): string {\n return trigger.eventConfig.scope.type === \"page\"\n ? trigger.eventConfig.scope.page.url\n : trigger.eventConfig.scope.dataSource.url;\n}\n\nfunction formatWorkflowTriggerEntry(\n trigger: ZeroWorkflowTriggerSummary,\n): string {\n if (trigger.kind === \"event\" && trigger.eventType === \"gmail-new-message\") {\n return `Gmail new message: ${formatGmailMatchSummary(trigger.eventConfig)}`;\n }\n if (trigger.kind === \"event\" && trigger.eventType === \"gmail-label-applied\") {\n return `Gmail label applied: ${quote(trigger.eventConfig.labelName)}`;\n }\n if (\n trigger.kind === \"event\" &&\n trigger.eventType === \"github-label-applied\"\n ) {\n return `GitHub label applied: ${quote(trigger.eventConfig.labelName)} (${formatGithubSubject(\n trigger.eventConfig.filters.subject,\n )}, actor ${trigger.eventConfig.filters.actor.type})`;\n }\n if (\n trigger.kind === \"event\" &&\n trigger.eventType === \"google-calendar-event-created\"\n ) {\n return `Google Calendar event created: ${trigger.eventConfig.calendarId}`;\n }\n if (\n trigger.kind === \"event\" &&\n trigger.eventType === \"google-calendar-event-updated\"\n ) {\n return `Google Calendar event updated: ${trigger.eventConfig.calendarId}`;\n }\n if (\n trigger.kind === \"event\" &&\n trigger.eventType === \"google-calendar-event-cancelled\"\n ) {\n return `Google Calendar event cancelled: ${trigger.eventConfig.calendarId}`;\n }\n if (\n trigger.kind === \"event\" &&\n trigger.eventType === \"google-meet-transcript-generated\"\n ) {\n return \"Google Meet transcript ready: meetings you organize\";\n }\n if (isWebhookTrigger(trigger)) {\n return formatWebhookTriggerEntry(trigger);\n }\n\n if (trigger.kind !== \"schedule\") {\n return workflowTriggerKindLabel(trigger);\n }\n\n const { schedule } = trigger;\n switch (schedule.type) {\n case \"cron\":\n return `${schedule.cronExpression} (${schedule.timezone})`;\n case \"once\":\n return `at ${schedule.atTime} (${schedule.timezone})`;\n case \"loop\":\n return `every ${formatDurationSeconds(schedule.intervalSeconds)}`;\n }\n}\n\nfunction formatRunTime(value: string | null): string {\n return value ? formatRelativeTime(value) : chalk.dim(\"-\");\n}\n\nfunction workflowTriggerKindLabel(trigger: ZeroWorkflowTriggerSummary): string {\n if (trigger.kind !== \"event\") {\n return formatWorkflowTriggerEntry(trigger);\n }\n switch (trigger.eventType) {\n case \"gmail-new-message\":\n return \"Gmail new message\";\n case \"gmail-label-applied\":\n return \"Gmail label applied\";\n case \"github-label-applied\":\n return \"GitHub label applied\";\n case \"google-calendar-event-created\":\n return \"Google Calendar event created\";\n case \"google-calendar-event-updated\":\n return \"Google Calendar event updated\";\n case \"google-calendar-event-cancelled\":\n return \"Google Calendar event cancelled\";\n case \"google-meet-transcript-generated\":\n return \"Google Meet transcript ready\";\n case \"notion-child-page-created\":\n return `New Notion child page: ${formatNotionParentPage(trigger)}`;\n case \"notion-database-item-created\":\n return `New Notion database item: ${formatNotionDatabase(trigger)}`;\n case \"notion-page-content-updated\":\n return `Notion page content updated: ${formatNotionContentUpdatedScope(trigger)}`;\n case \"webhook-received\":\n return \"Webhook\";\n }\n}\n\nfunction signedCurlExample(trigger: WorkflowWebhookTriggerSummary): string {\n const secret = trigger.webhookSecret ?? \"<signing-secret>\";\n const webhookUrl = trigger.webhookUrl ?? \"<webhook-url>\";\n return [\n `BODY='{\"hello\":\"world\"}'`,\n \"TIMESTAMP=$(date +%s)\",\n `SIGNATURE=$(printf \"%s.%s\" \"$TIMESTAMP\" \"$BODY\" | openssl dgst -sha256 -hmac \"${secret}\" -hex | awk '{print $2}')`,\n `curl -X POST \"${webhookUrl}\" \\\\`,\n ' -H \"Content-Type: application/json\" \\\\',\n ' -H \"X-VM0-Timestamp: $TIMESTAMP\" \\\\',\n ' -H \"X-VM0-Signature: $SIGNATURE\" \\\\',\n ' --data \"$BODY\"',\n ].join(\"\\n\");\n}\n\nexport function printWorkflowTriggersTable(\n triggers: readonly ZeroWorkflowTriggerSummary[],\n): void {\n const idWidth = Math.max(\n 2,\n ...triggers.map((trigger) => {\n return trigger.id.length;\n }),\n );\n const scheduleWidth = Math.max(\n 7,\n ...triggers.map((trigger) => {\n return formatWorkflowTriggerEntry(trigger).length;\n }),\n );\n\n console.log(\n chalk.dim(\n [\n \"ID\".padEnd(idWidth),\n \"STATUS\".padEnd(8),\n \"TRIGGER\".padEnd(scheduleWidth),\n \"NEXT RUN\",\n ].join(\" \"),\n ),\n );\n\n for (const trigger of triggers) {\n const status = trigger.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(\n [\n trigger.id.padEnd(idWidth),\n status.padEnd(8 + (trigger.enabled ? 0 : 2)),\n formatWorkflowTriggerEntry(trigger).padEnd(scheduleWidth),\n formatRunTime(trigger.nextRunAt),\n ].join(\" \"),\n );\n }\n}\n\nexport function printWorkflowTriggerDetails(\n trigger: ZeroWorkflowTriggerSummary,\n options?: { readonly workflowRef?: string },\n): void {\n const status = trigger.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n\n console.log(`${\"Kind:\".padEnd(14)}${trigger.kind}`);\n console.log(`${\"ID:\".padEnd(14)}${trigger.id}`);\n if (options?.workflowRef) {\n console.log(`${\"Workflow:\".padEnd(14)}${options.workflowRef}`);\n }\n console.log(`${\"Status:\".padEnd(14)}${status}`);\n console.log(`${\"Trigger:\".padEnd(14)}${workflowTriggerKindLabel(trigger)}`);\n if (trigger.kind === \"event\" && trigger.eventType === \"gmail-new-message\") {\n console.log(\n `${\"Match:\".padEnd(14)}${formatGmailMatchSummary(trigger.eventConfig)}`,\n );\n }\n if (trigger.kind === \"event\" && trigger.eventType === \"gmail-label-applied\") {\n console.log(`${\"Label:\".padEnd(14)}${trigger.eventConfig.labelName}`);\n }\n if (\n trigger.kind === \"event\" &&\n trigger.eventType === \"github-label-applied\"\n ) {\n console.log(`${\"Label:\".padEnd(14)}${trigger.eventConfig.labelName}`);\n console.log(\n `${\"Subject:\".padEnd(14)}${formatGithubSubject(\n trigger.eventConfig.filters.subject,\n )}`,\n );\n console.log(\n `${\"Actor:\".padEnd(14)}${trigger.eventConfig.filters.actor.type}`,\n );\n }\n if (isGoogleCalendarTrigger(trigger)) {\n console.log(`${\"Calendar:\".padEnd(14)}${trigger.eventConfig.calendarId}`);\n }\n if (isNotionChildPageTrigger(trigger)) {\n console.log(\n `${\"Parent page:\".padEnd(14)}${formatNotionParentPage(trigger)}`,\n );\n console.log(\n `${\"Parent URL:\".padEnd(14)}${trigger.eventConfig.parentPage.url}`,\n );\n }\n if (isNotionDatabaseItemTrigger(trigger)) {\n console.log(`${\"Database:\".padEnd(14)}${formatNotionDatabase(trigger)}`);\n console.log(\n `${\"Database URL:\".padEnd(14)}${trigger.eventConfig.dataSource.url}`,\n );\n }\n if (isNotionPageContentUpdatedTrigger(trigger)) {\n const scopeLabel =\n trigger.eventConfig.scope.type === \"page\" ? \"Page\" : \"Database\";\n console.log(`${\"Scope:\".padEnd(14)}${scopeLabel}`);\n console.log(\n `${`${scopeLabel}:`.padEnd(14)}${formatNotionContentUpdatedScope(trigger)}`,\n );\n console.log(\n `${`${scopeLabel} URL:`.padEnd(14)}${formatNotionContentUpdatedScopeUrl(trigger)}`,\n );\n }\n if (isWebhookTrigger(trigger)) {\n console.log(\n `${\"Webhook URL:\".padEnd(14)}${trigger.webhookUrl ?? \"hidden\"}`,\n );\n console.log(\n `${\"Secret:\".padEnd(14)}${chalk.dim(`ends with ${trigger.secretLastFour}`)}`,\n );\n console.log(\n `${\"Last received:\".padEnd(14)}${formatRunTime(trigger.lastReceivedAt)}`,\n );\n if (trigger.webhookSecret) {\n console.log(\n `${\"Signing key:\".padEnd(14)}${trigger.webhookSecret} ${chalk.dim(\n \"(shown only once)\",\n )}`,\n );\n console.log(\"\");\n console.log(chalk.bold(\"Signed curl example:\"));\n console.log(signedCurlExample(trigger));\n }\n }\n console.log(`${\"Owner:\".padEnd(14)}${trigger.ownerUserId}`);\n console.log(\n `${\"Chat thread:\".padEnd(14)}${trigger.chatThreadId ?? chalk.dim(\"-\")}`,\n );\n console.log(`${\"Next run:\".padEnd(14)}${formatRunTime(trigger.nextRunAt)}`);\n console.log(`${\"Last run:\".padEnd(14)}${formatRunTime(trigger.lastRunAt)}`);\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","import { readFileSync } from \"node:fs\";\nimport type {\n GmailLabelAppliedEventConfig,\n GmailNewMessageEventConfig,\n} from \"@vm0/api-contracts/contracts/zero-workflows\";\n\ntype GmailMatchRules = NonNullable<GmailNewMessageEventConfig[\"match\"]>;\ntype GmailTextMatcher = NonNullable<GmailMatchRules[\"from\"]>;\ntype GmailTextField = \"from\" | \"subject\" | \"body\" | \"to\" | \"cc\";\n\nexport interface GmailTriggerOptions {\n readonly config?: string;\n readonly label?: string;\n readonly fromContains?: string;\n readonly fromNotContains?: string;\n readonly subjectContains?: string;\n readonly subjectNotContains?: string;\n readonly bodyContains?: string;\n readonly bodyNotContains?: string;\n readonly toContains?: string;\n readonly toNotContains?: string;\n readonly ccContains?: string;\n readonly ccNotContains?: string;\n}\n\ninterface TextFlagSpec {\n readonly field: GmailTextField;\n readonly contains?: string;\n readonly doesNotContain?: string;\n}\n\nconst TEXT_FIELD_LABELS: Record<GmailTextField, string> = {\n from: \"from\",\n subject: \"subject\",\n body: \"body\",\n to: \"to\",\n cc: \"cc\",\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction textFieldFromKey(key: string): GmailTextField | null {\n switch (key) {\n case \"from\":\n case \"subject\":\n case \"body\":\n case \"to\":\n case \"cc\":\n return key;\n default:\n return null;\n }\n}\n\nfunction formatFieldName(field: GmailTextField): string {\n return TEXT_FIELD_LABELS[field];\n}\n\nfunction parseNonEmptyString(value: unknown, path: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`);\n }\n return value;\n}\n\nfunction parseNonEmptyStringArray(value: unknown, path: string): string[] {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`${path} must be a non-empty string array`);\n }\n return value.map((item, index) => {\n return parseNonEmptyString(item, `${path}[${index}]`);\n });\n}\n\nfunction parseTextMatcher(\n field: GmailTextField,\n value: unknown,\n): GmailTextMatcher {\n if (!isRecord(value)) {\n throw new Error(`${formatFieldName(field)} must be an object`);\n }\n\n const matcher: {\n contains?: string;\n containsAny?: string[];\n doesNotContain?: string;\n doesNotContainAny?: string[];\n } = {};\n\n for (const key of Object.keys(value)) {\n switch (key) {\n case \"contains\":\n matcher.contains = parseNonEmptyString(\n value[key],\n `${formatFieldName(field)}.contains`,\n );\n break;\n case \"containsAny\":\n matcher.containsAny = parseNonEmptyStringArray(\n value[key],\n `${formatFieldName(field)}.containsAny`,\n );\n break;\n case \"doesNotContain\":\n matcher.doesNotContain = parseNonEmptyString(\n value[key],\n `${formatFieldName(field)}.doesNotContain`,\n );\n break;\n case \"doesNotContainAny\":\n matcher.doesNotContainAny = parseNonEmptyStringArray(\n value[key],\n `${formatFieldName(field)}.doesNotContainAny`,\n );\n break;\n default:\n throw new Error(\n `Unsupported Gmail trigger text matcher \"${key}\" for ${formatFieldName(field)}`,\n );\n }\n }\n\n if (\n matcher.contains === undefined &&\n matcher.containsAny === undefined &&\n matcher.doesNotContain === undefined &&\n matcher.doesNotContainAny === undefined\n ) {\n throw new Error(\n `${formatFieldName(field)} must include at least one text matcher`,\n );\n }\n\n return matcher;\n}\n\nfunction parseMatch(value: unknown): GmailMatchRules | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isRecord(value)) {\n throw new Error(\"match must be an object\");\n }\n\n const match: GmailMatchRules = {};\n for (const key of Object.keys(value)) {\n const field = textFieldFromKey(key);\n if (field === null) {\n throw new Error(\n `Unsupported Gmail trigger match field \"${key}\". Supported fields: from, subject, body, to, cc`,\n );\n }\n match[field] = parseTextMatcher(field, value[key]);\n }\n\n return Object.keys(match).length > 0 ? match : undefined;\n}\n\nfunction readConfigMatch(path: string): GmailMatchRules | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to read Gmail trigger config \"${path}\": ${message}`,\n );\n }\n\n if (!isRecord(parsed)) {\n throw new Error(\"Gmail trigger config must be a JSON object\");\n }\n\n for (const key of Object.keys(parsed)) {\n if (key !== \"match\") {\n throw new Error(\n `Unsupported Gmail trigger config field \"${key}\". Use a top-level match object`,\n );\n }\n }\n\n return parseMatch(parsed.match);\n}\n\nfunction textFlagSpecs(options: GmailTriggerOptions): readonly TextFlagSpec[] {\n return [\n {\n field: \"from\",\n contains: options.fromContains,\n doesNotContain: options.fromNotContains,\n },\n {\n field: \"subject\",\n contains: options.subjectContains,\n doesNotContain: options.subjectNotContains,\n },\n {\n field: \"body\",\n contains: options.bodyContains,\n doesNotContain: options.bodyNotContains,\n },\n {\n field: \"to\",\n contains: options.toContains,\n doesNotContain: options.toNotContains,\n },\n {\n field: \"cc\",\n contains: options.ccContains,\n doesNotContain: options.ccNotContains,\n },\n ];\n}\n\nexport function hasGmailTriggerOptions(options: GmailTriggerOptions): boolean {\n return (\n options.config !== undefined ||\n textFlagSpecs(options).some((spec) => {\n return spec.contains !== undefined || spec.doesNotContain !== undefined;\n })\n );\n}\n\nexport function hasGmailLabelOption(options: GmailTriggerOptions): boolean {\n return options.label !== undefined;\n}\n\nfunction buildMatchFromFlags(\n options: GmailTriggerOptions,\n): GmailMatchRules | undefined {\n const match: GmailMatchRules = {};\n for (const spec of textFlagSpecs(options)) {\n const matcher: { contains?: string; doesNotContain?: string } = {};\n if (spec.contains !== undefined) {\n if (spec.contains.length === 0) {\n throw new Error(\n `${formatFieldName(spec.field)} contains must be non-empty`,\n );\n }\n matcher.contains = spec.contains;\n }\n if (spec.doesNotContain !== undefined) {\n if (spec.doesNotContain.length === 0) {\n throw new Error(\n `${formatFieldName(spec.field)} doesNotContain must be non-empty`,\n );\n }\n matcher.doesNotContain = spec.doesNotContain;\n }\n if (\n matcher.contains !== undefined ||\n matcher.doesNotContain !== undefined\n ) {\n match[spec.field] = matcher;\n }\n }\n return Object.keys(match).length > 0 ? match : undefined;\n}\n\nexport function buildGmailNewMessageEventConfig(\n options: GmailTriggerOptions,\n): GmailNewMessageEventConfig {\n if (\n options.config !== undefined &&\n textFlagSpecs(options).some((spec) => {\n return spec.contains !== undefined || spec.doesNotContain !== undefined;\n })\n ) {\n throw new Error(\"Use either --config or Gmail text match flags, not both\");\n }\n\n const match =\n options.config !== undefined\n ? readConfigMatch(options.config)\n : buildMatchFromFlags(options);\n\n return match\n ? { provider: \"gmail\", event: \"new_message\", match }\n : { provider: \"gmail\", event: \"new_message\" };\n}\n\nexport function buildGmailLabelAppliedEventConfig(\n options: GmailTriggerOptions,\n): GmailLabelAppliedEventConfig {\n const labelName = options.label?.trim();\n if (!labelName) {\n throw new Error(\n 'gmail-label-applied triggers require --label \"Label name\"',\n );\n }\n return { provider: \"gmail\", event: \"label_applied\", labelName };\n}\n"],"mappings":"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","names":["readFileSync","readFileSync","readFileSync","readFileSync","readFileSync","listCommand"]}
package/zero.js CHANGED
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  configureGlobalProxyFromEnv
6
- } from "./chunk-WSV35YDZ.js";
6
+ } from "./chunk-AIJGP7GE.js";
7
7
  import {
8
8
  decodeZeroTokenPayload
9
9
  } from "./chunk-LRHXR7JT.js";
@@ -52,63 +52,63 @@ var ZERO_COMMAND_DEFINITIONS = [
52
52
  name: "org",
53
53
  description: "Manage organization settings, members, and providers",
54
54
  load: async () => {
55
- return (await import("./org-FQMXNSIY.js")).zeroOrgCommand;
55
+ return (await import("./org-YAIXNWYJ.js")).zeroOrgCommand;
56
56
  }
57
57
  },
58
58
  {
59
59
  name: "model",
60
60
  description: "List available models and model-switching guidance",
61
61
  load: async () => {
62
- return (await import("./model-JO3G5KZI.js")).zeroModelCommand;
62
+ return (await import("./model-LXH7APW3.js")).zeroModelCommand;
63
63
  }
64
64
  },
65
65
  {
66
66
  name: "model-provider",
67
67
  description: "Inspect model provider routing",
68
68
  load: async () => {
69
- return (await import("./model-provider-FEVH3VPX.js")).zeroModelProviderCommand;
69
+ return (await import("./model-provider-LPWRU53L.js")).zeroModelProviderCommand;
70
70
  }
71
71
  },
72
72
  {
73
73
  name: "agent",
74
74
  description: "View or manage zero agents",
75
75
  load: async () => {
76
- return (await import("./agent-DGSPWQNY.js")).zeroAgentCommand;
76
+ return (await import("./agent-6I3S3EIU.js")).zeroAgentCommand;
77
77
  }
78
78
  },
79
79
  {
80
80
  name: "connector",
81
81
  description: "Check third-party service connections (GitHub, Slack, etc.)",
82
82
  load: async () => {
83
- return (await import("./connector-5I66WCBC.js")).zeroConnectorCommand;
83
+ return (await import("./connector-EYTI2AQV.js")).zeroConnectorCommand;
84
84
  }
85
85
  },
86
86
  {
87
87
  name: "relationship",
88
88
  description: "Query relationship memory",
89
89
  load: async () => {
90
- return (await import("./relationship-HCBN4USZ.js")).zeroRelationshipCommand;
90
+ return (await import("./relationship-QKUXP77B.js")).zeroRelationshipCommand;
91
91
  }
92
92
  },
93
93
  {
94
94
  name: "credit",
95
95
  description: "Create a Stripe checkout link to buy credits",
96
96
  load: async () => {
97
- return (await import("./credit-HGNKEVFZ.js")).zeroCreditCommand;
97
+ return (await import("./credit-NZB5JP5V.js")).zeroCreditCommand;
98
98
  }
99
99
  },
100
100
  {
101
101
  name: "doctor",
102
102
  description: "Diagnose runtime issues (connector health, permission denials)",
103
103
  load: async () => {
104
- return (await import("./doctor-WTQ7VC4T.js")).zeroDoctorCommand;
104
+ return (await import("./doctor-W6XZPNI5.js")).zeroDoctorCommand;
105
105
  }
106
106
  },
107
107
  {
108
108
  name: "preference",
109
109
  description: "View or update user preferences (timezone, notifications)",
110
110
  load: async () => {
111
- return (await import("./preference-S5VFYYXB.js")).zeroPreferenceCommand;
111
+ return (await import("./preference-CZ3I4HFF.js")).zeroPreferenceCommand;
112
112
  }
113
113
  },
114
114
  {
@@ -129,119 +129,119 @@ var ZERO_COMMAND_DEFINITIONS = [
129
129
  name: "secret",
130
130
  description: "Read or write secrets (API keys, tokens)",
131
131
  load: async () => {
132
- return (await import("./secret-GKBBHURS.js")).zeroSecretCommand;
132
+ return (await import("./secret-ZIEZBGZG.js")).zeroSecretCommand;
133
133
  }
134
134
  },
135
135
  {
136
136
  name: "github",
137
137
  description: "Upload and download GitHub files",
138
138
  load: async () => {
139
- return (await import("./github-QDXMHTJZ.js")).zeroGithubCommand;
139
+ return (await import("./github-4UD5X5HJ.js")).zeroGithubCommand;
140
140
  }
141
141
  },
142
142
  {
143
143
  name: "slack",
144
144
  description: "Send messages, upload files, and download files from Slack as the bot",
145
145
  load: async () => {
146
- return (await import("./slack-MPYGJ244.js")).zeroSlackCommand;
146
+ return (await import("./slack-TVVSMYRW.js")).zeroSlackCommand;
147
147
  }
148
148
  },
149
149
  {
150
150
  name: "telegram",
151
151
  description: "Inspect bots, send messages, upload files, and download files from Telegram",
152
152
  load: async () => {
153
- return (await import("./telegram-QPPLW7F4.js")).zeroTelegramCommand;
153
+ return (await import("./telegram-ACBXXCBM.js")).zeroTelegramCommand;
154
154
  }
155
155
  },
156
156
  {
157
157
  name: "phone",
158
158
  description: "Send AgentPhone messages, upload files, and download media",
159
159
  load: async () => {
160
- return (await import("./phone-SQDE53ZF.js")).zeroPhoneCommand;
160
+ return (await import("./phone-LJZKV6SV.js")).zeroPhoneCommand;
161
161
  }
162
162
  },
163
163
  {
164
164
  name: "variable",
165
165
  description: "Read or write non-sensitive configuration values",
166
166
  load: async () => {
167
- return (await import("./variable-Y4HRWCTO.js")).zeroVariableCommand;
167
+ return (await import("./variable-JJJKVBNK.js")).zeroVariableCommand;
168
168
  }
169
169
  },
170
170
  {
171
171
  name: "logs",
172
172
  description: "View and search agent run logs",
173
173
  load: async () => {
174
- return (await import("./logs-NDOKTRB6.js")).zeroLogsCommand;
174
+ return (await import("./logs-ZVA3RX7T.js")).zeroLogsCommand;
175
175
  }
176
176
  },
177
177
  {
178
178
  name: "search",
179
179
  description: "Search logs, chat, or get a recipe for external sources",
180
180
  load: async () => {
181
- return (await import("./search-EMQSXATT.js")).zeroSearchCommand;
181
+ return (await import("./search-MTEX6GJA.js")).zeroSearchCommand;
182
182
  }
183
183
  },
184
184
  {
185
185
  name: "chat",
186
186
  description: "Manage the current web chat thread",
187
187
  load: async () => {
188
- return (await import("./chat-5PALCJD4.js")).zeroChatCommand;
188
+ return (await import("./chat-SWX5TFN3.js")).zeroChatCommand;
189
189
  }
190
190
  },
191
191
  {
192
192
  name: "resource",
193
193
  description: "Pull registry resources from private R2-backed archives",
194
194
  load: async () => {
195
- return (await import("./resource-RSKJLS3T.js")).zeroResourceCommand;
195
+ return (await import("./resource-BKPC6E53.js")).zeroResourceCommand;
196
196
  }
197
197
  },
198
198
  {
199
199
  name: "whoami",
200
200
  description: "Show agent identity, run ID, and capabilities",
201
201
  load: async () => {
202
- return (await import("./whoami-V3SX3JTG.js")).zeroWhoamiCommand;
202
+ return (await import("./whoami-PU2MNPCP.js")).zeroWhoamiCommand;
203
203
  }
204
204
  },
205
205
  {
206
206
  name: "workflow",
207
207
  description: "Manage workflows",
208
208
  load: async () => {
209
- return (await import("./workflow-DWK4QY3W.js")).zeroWorkflowCommand;
209
+ return (await import("./workflow-3ZFUOHIE.js")).zeroWorkflowCommand;
210
210
  }
211
211
  },
212
212
  {
213
213
  name: "goal",
214
214
  description: "Manage the current thread goal",
215
215
  load: async () => {
216
- return (await import("./goal-JRXI5QXW.js")).zeroGoalCommand;
216
+ return (await import("./goal-EBSAUAFF.js")).zeroGoalCommand;
217
217
  }
218
218
  },
219
219
  {
220
220
  name: "developer-support",
221
221
  description: "Submit a diagnostic report to the dev team",
222
222
  load: async () => {
223
- return (await import("./developer-support-U65KGI6M.js")).zeroDeveloperSupportCommand;
223
+ return (await import("./developer-support-PAMZ2XRA.js")).zeroDeveloperSupportCommand;
224
224
  }
225
225
  },
226
226
  {
227
227
  name: "computer-use",
228
228
  description: "Desktop app computer use through Zero CLI",
229
229
  load: async () => {
230
- return (await import("./computer-use-ZDALRU7D.js")).zeroComputerUseCommand;
230
+ return (await import("./computer-use-GEEWNJQM.js")).zeroComputerUseCommand;
231
231
  }
232
232
  },
233
233
  {
234
234
  name: "generate",
235
235
  description: "Generate assets via vm0's built-in pipelines or get connector skill-invocation guidance",
236
236
  load: async () => {
237
- return (await import("./generate-DHDE5EAR.js")).generateCommand;
237
+ return (await import("./generate-HVVD6EYP.js")).generateCommand;
238
238
  }
239
239
  },
240
240
  {
241
241
  name: "web",
242
242
  description: "Upload and download files via the web chat endpoint",
243
243
  load: async () => {
244
- return (await import("./web-AME2COQN.js")).zeroWebCommand;
244
+ return (await import("./web-LFI6P5BX.js")).zeroWebCommand;
245
245
  }
246
246
  },
247
247
  {
@@ -255,21 +255,21 @@ var ZERO_COMMAND_DEFINITIONS = [
255
255
  name: "host",
256
256
  description: "Publish static sites and clone owned hosted site files",
257
257
  load: async () => {
258
- return (await import("./host-RRYXBDTU.js")).zeroHostCommand;
258
+ return (await import("./host-XMGMUEIS.js")).zeroHostCommand;
259
259
  }
260
260
  },
261
261
  {
262
262
  name: "maps",
263
263
  description: "Use managed zero maps services",
264
264
  load: async () => {
265
- return (await import("./maps-IQBIONR2.js")).zeroMapsCommand;
265
+ return (await import("./maps-KA77OBM7.js")).zeroMapsCommand;
266
266
  }
267
267
  },
268
268
  {
269
269
  name: "banking",
270
270
  description: "Use managed zero banking services",
271
271
  load: async () => {
272
- return (await import("./banking-JHYVOWF5.js")).zeroBankingCommand;
272
+ return (await import("./banking-JTEDNDFU.js")).zeroBankingCommand;
273
273
  }
274
274
  }
275
275
  ];
@@ -352,7 +352,7 @@ function buildZeroHelpText(payload = decodeZeroTokenPayload()) {
352
352
  " Manage workflows? zero workflow --help",
353
353
  ...shouldHideCommand("chat", payload) ? [] : [' Rename this chat? zero chat rename "New title"'],
354
354
  " List generators? zero generate --help",
355
- ' Generate image? zero generate image --prompt "..."',
355
+ ' Generate image? zero generate image --raw-prompt "..."',
356
356
  ' Generate website? zero generate website --prompt "..."',
357
357
  ' Generate voice? zero generate voice --prompt "..."',
358
358
  ...canWriteHost ? [" Host a static site? zero host ./dist --site my-site --spa"] : [],
@@ -377,7 +377,7 @@ function registerZeroCommands(prog, commands) {
377
377
  var program = new Command();
378
378
  program.name("zero").description(
379
379
  "Zero CLI \u2014 interact with the zero platform from inside the sandbox"
380
- ).version("9.227.0").addHelpText("after", () => {
380
+ ).version("9.229.0").addHelpText("after", () => {
381
381
  return buildZeroHelpText();
382
382
  });
383
383
  if (process.argv[1]?.endsWith("zero.js") || process.argv[1]?.endsWith("zero.ts") || process.argv[1]?.endsWith("zero")) {