@vm0/cli 9.252.1 → 9.253.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 (103) hide show
  1. package/{agent-6DLY56R2.js → agent-X6O3YR4M.js} +7 -7
  2. package/{banking-22B7QVCY.js → banking-NGZXYSVB.js} +5 -5
  3. package/{chat-2QVQ3MLT.js → chat-CRY62LOA.js} +6 -6
  4. package/{chunk-OAESJHRL.js → chunk-2E37DQSD.js} +2 -2
  5. package/{chunk-FBISVSTZ.js → chunk-2YJV4T5H.js} +175 -8
  6. package/{chunk-FBISVSTZ.js.map → chunk-2YJV4T5H.js.map} +1 -1
  7. package/{chunk-7DGYI4QB.js → chunk-7JNLGFRW.js} +3 -3
  8. package/chunk-7JNLGFRW.js.map +1 -0
  9. package/{chunk-7NPYHUEQ.js → chunk-7YTIE7KU.js} +3 -3
  10. package/{chunk-CUAL7MH6.js → chunk-FJFJLQQW.js} +2 -2
  11. package/{chunk-DK3C2ME6.js → chunk-KMRZUQHC.js} +8 -1
  12. package/chunk-KMRZUQHC.js.map +1 -0
  13. package/{chunk-Z6BXUYYX.js → chunk-LIT3JQQR.js} +2 -2
  14. package/{chunk-MFNEXCZL.js → chunk-LO2JYFNP.js} +2 -2
  15. package/{chunk-7QTOTACG.js → chunk-RANJI5FZ.js} +2 -2
  16. package/{chunk-CPJVE3HV.js → chunk-RMLNBK2X.js} +2 -2
  17. package/{chunk-KBUXPDDX.js → chunk-XM3WOXFE.js} +4 -4
  18. package/{computer-use-TWN6NBIN.js → computer-use-C3HZXTKZ.js} +5 -5
  19. package/{connector-DEKQFV2G.js → connector-DPZKQG4U.js} +8 -8
  20. package/{credit-SGN2CQ4F.js → credit-WY6P3D6B.js} +7 -7
  21. package/{developer-support-7DKJHHFR.js → developer-support-RYY76Y65.js} +5 -5
  22. package/{doctor-PINI2CXE.js → doctor-XZH52P7J.js} +7 -7
  23. package/{feishu-RVNSCNUY.js → feishu-HLSIBEHH.js} +5 -5
  24. package/{finance-IL3LEHYM.js → finance-IWVIYPXL.js} +5 -5
  25. package/{generate-DVB7CDWO.js → generate-IAA656VE.js} +7 -7
  26. package/{github-HECK3WC6.js → github-MJZJ2VLC.js} +5 -5
  27. package/{goal-RJ4KHBJZ.js → goal-7OCVIFTQ.js} +5 -5
  28. package/{host-UAVQ4BZY.js → host-KX7NPRZM.js} +5 -5
  29. package/{logs-PFZVJGHK.js → logs-AHOU7TJL.js} +6 -6
  30. package/{mail-SJOUFJDK.js → mail-D3YBSKA6.js} +7 -7
  31. package/{maps-JCB6I264.js → maps-AT7I4KK6.js} +5 -5
  32. package/{model-GI5HI3B5.js → model-7AEJV5QI.js} +6 -6
  33. package/{model-provider-YVF7DWLL.js → model-provider-CNTRAXGR.js} +6 -6
  34. package/{org-SPWQ25RJ.js → org-4EOIMAMU.js} +5 -5
  35. package/package.json +1 -1
  36. package/{people-search-24TMMWRS.js → people-search-YIPV2HRX.js} +5 -5
  37. package/{phone-3XXRREOH.js → phone-RGFGHH4G.js} +5 -5
  38. package/{preference-SSKGMIHI.js → preference-UIFDOWCE.js} +5 -5
  39. package/{resource-HJBJYOZW.js → resource-UCO5W2EM.js} +5 -5
  40. package/{scrape-LCD2CT5P.js → scrape-V6KXL77N.js} +5 -5
  41. package/{search-IU6AXAPL.js → search-FKCTV4PA.js} +6 -6
  42. package/{secret-4GZ5YF55.js → secret-ZOUQEPTX.js} +5 -5
  43. package/{slack-TLBZUY27.js → slack-4WKWNC54.js} +5 -5
  44. package/{teams-ZKQMACHI.js → teams-MRN5OZEA.js} +5 -5
  45. package/{telegram-J4ZWDUEB.js → telegram-DJ6DOWYM.js} +5 -5
  46. package/{upgrade-UBEBOHV6.js → upgrade-2VYHUARI.js} +4 -4
  47. package/{variable-4K5GUB4B.js → variable-6SNXAUY7.js} +5 -5
  48. package/{video-5LENA5YA.js → video-DF4MZ6J2.js} +4 -4
  49. package/{weather-UL4D4T3L.js → weather-PATAREUP.js} +5 -5
  50. package/{web-6452PFF7.js → web-GMBMMBHY.js} +5 -5
  51. package/{web-search-D5HGEWU5.js → web-search-SYJ7DI6M.js} +5 -5
  52. package/{whoami-HYDZ6YSH.js → whoami-KD3QSC6J.js} +7 -7
  53. package/{workflow-W2HNGAVJ.js → workflow-DATIF2MF.js} +577 -41
  54. package/workflow-DATIF2MF.js.map +1 -0
  55. package/zero.js +42 -42
  56. package/chunk-7DGYI4QB.js.map +0 -1
  57. package/chunk-DK3C2ME6.js.map +0 -1
  58. package/workflow-W2HNGAVJ.js.map +0 -1
  59. /package/{agent-6DLY56R2.js.map → agent-X6O3YR4M.js.map} +0 -0
  60. /package/{banking-22B7QVCY.js.map → banking-NGZXYSVB.js.map} +0 -0
  61. /package/{chat-2QVQ3MLT.js.map → chat-CRY62LOA.js.map} +0 -0
  62. /package/{chunk-OAESJHRL.js.map → chunk-2E37DQSD.js.map} +0 -0
  63. /package/{chunk-7NPYHUEQ.js.map → chunk-7YTIE7KU.js.map} +0 -0
  64. /package/{chunk-CUAL7MH6.js.map → chunk-FJFJLQQW.js.map} +0 -0
  65. /package/{chunk-Z6BXUYYX.js.map → chunk-LIT3JQQR.js.map} +0 -0
  66. /package/{chunk-MFNEXCZL.js.map → chunk-LO2JYFNP.js.map} +0 -0
  67. /package/{chunk-7QTOTACG.js.map → chunk-RANJI5FZ.js.map} +0 -0
  68. /package/{chunk-CPJVE3HV.js.map → chunk-RMLNBK2X.js.map} +0 -0
  69. /package/{chunk-KBUXPDDX.js.map → chunk-XM3WOXFE.js.map} +0 -0
  70. /package/{computer-use-TWN6NBIN.js.map → computer-use-C3HZXTKZ.js.map} +0 -0
  71. /package/{connector-DEKQFV2G.js.map → connector-DPZKQG4U.js.map} +0 -0
  72. /package/{credit-SGN2CQ4F.js.map → credit-WY6P3D6B.js.map} +0 -0
  73. /package/{developer-support-7DKJHHFR.js.map → developer-support-RYY76Y65.js.map} +0 -0
  74. /package/{doctor-PINI2CXE.js.map → doctor-XZH52P7J.js.map} +0 -0
  75. /package/{feishu-RVNSCNUY.js.map → feishu-HLSIBEHH.js.map} +0 -0
  76. /package/{finance-IL3LEHYM.js.map → finance-IWVIYPXL.js.map} +0 -0
  77. /package/{generate-DVB7CDWO.js.map → generate-IAA656VE.js.map} +0 -0
  78. /package/{github-HECK3WC6.js.map → github-MJZJ2VLC.js.map} +0 -0
  79. /package/{goal-RJ4KHBJZ.js.map → goal-7OCVIFTQ.js.map} +0 -0
  80. /package/{host-UAVQ4BZY.js.map → host-KX7NPRZM.js.map} +0 -0
  81. /package/{logs-PFZVJGHK.js.map → logs-AHOU7TJL.js.map} +0 -0
  82. /package/{mail-SJOUFJDK.js.map → mail-D3YBSKA6.js.map} +0 -0
  83. /package/{maps-JCB6I264.js.map → maps-AT7I4KK6.js.map} +0 -0
  84. /package/{model-GI5HI3B5.js.map → model-7AEJV5QI.js.map} +0 -0
  85. /package/{model-provider-YVF7DWLL.js.map → model-provider-CNTRAXGR.js.map} +0 -0
  86. /package/{org-SPWQ25RJ.js.map → org-4EOIMAMU.js.map} +0 -0
  87. /package/{people-search-24TMMWRS.js.map → people-search-YIPV2HRX.js.map} +0 -0
  88. /package/{phone-3XXRREOH.js.map → phone-RGFGHH4G.js.map} +0 -0
  89. /package/{preference-SSKGMIHI.js.map → preference-UIFDOWCE.js.map} +0 -0
  90. /package/{resource-HJBJYOZW.js.map → resource-UCO5W2EM.js.map} +0 -0
  91. /package/{scrape-LCD2CT5P.js.map → scrape-V6KXL77N.js.map} +0 -0
  92. /package/{search-IU6AXAPL.js.map → search-FKCTV4PA.js.map} +0 -0
  93. /package/{secret-4GZ5YF55.js.map → secret-ZOUQEPTX.js.map} +0 -0
  94. /package/{slack-TLBZUY27.js.map → slack-4WKWNC54.js.map} +0 -0
  95. /package/{teams-ZKQMACHI.js.map → teams-MRN5OZEA.js.map} +0 -0
  96. /package/{telegram-J4ZWDUEB.js.map → telegram-DJ6DOWYM.js.map} +0 -0
  97. /package/{upgrade-UBEBOHV6.js.map → upgrade-2VYHUARI.js.map} +0 -0
  98. /package/{variable-4K5GUB4B.js.map → variable-6SNXAUY7.js.map} +0 -0
  99. /package/{video-5LENA5YA.js.map → video-DF4MZ6J2.js.map} +0 -0
  100. /package/{weather-UL4D4T3L.js.map → weather-PATAREUP.js.map} +0 -0
  101. /package/{web-6452PFF7.js.map → web-GMBMMBHY.js.map} +0 -0
  102. /package/{web-search-D5HGEWU5.js.map → web-search-SYJ7DI6M.js.map} +0 -0
  103. /package/{whoami-HYDZ6YSH.js.map → whoami-KD3QSC6J.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/automation/display.ts","../src/lib/domain/relative-time.ts","../src/commands/zero/shared/duration.ts","../src/commands/zero/workflow/automation/index.ts","../src/commands/zero/workflow/automation/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 { automationCommand } from \"./automation\";\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(automationCommand)\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 automations: zero workflow automation --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, listWorkflowAutomations } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { printWorkflowAutomationsTable } from \"./automation/display\";\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();\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 const automations = await listWorkflowAutomations(workflow.id);\n\n console.log();\n console.log(\n chalk.dim(`── Copied automations (${automations.length}) ──`),\n );\n if (automations.length === 0) {\n console.log(chalk.dim(\"No automations copied\"));\n } else {\n printWorkflowAutomationsTable(automations);\n }\n console.log();\n console.log(`View it: zero workflow view ${workflow.id}`);\n },\n ),\n );\n","import chalk from \"chalk\";\nimport type { GmailNewMessageEventConfig } from \"@vm0/api-contracts/contracts/zero-workflows\";\nimport type { ZeroWorkflowAutomationSummary } from \"../../../../lib/api\";\nimport { formatRelativeTime } from \"../../../../lib/domain/relative-time\";\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 WorkflowWebhookAutomationSummary = Extract<\n ZeroWorkflowAutomationSummary,\n { readonly kind: \"event\"; readonly eventType: \"webhook-received\" }\n>;\ntype WorkflowNotionChildPageAutomationSummary = Extract<\n ZeroWorkflowAutomationSummary,\n { readonly kind: \"event\"; readonly eventType: \"notion-child-page-created\" }\n>;\ntype WorkflowNotionDatabaseItemAutomationSummary = Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"notion-database-item-created\";\n }\n>;\ntype WorkflowNotionPageContentUpdatedAutomationSummary = Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"notion-page-content-updated\";\n }\n>;\n\nfunction isWebhookAutomation(\n automation: ZeroWorkflowAutomationSummary,\n): automation is WorkflowWebhookAutomationSummary {\n return (\n automation.kind === \"event\" && automation.eventType === \"webhook-received\"\n );\n}\n\nfunction isNotionChildPageAutomation(\n automation: ZeroWorkflowAutomationSummary,\n): automation is WorkflowNotionChildPageAutomationSummary {\n return (\n automation.kind === \"event\" &&\n automation.eventType === \"notion-child-page-created\"\n );\n}\n\nfunction isNotionDatabaseItemAutomation(\n automation: ZeroWorkflowAutomationSummary,\n): automation is WorkflowNotionDatabaseItemAutomationSummary {\n return (\n automation.kind === \"event\" &&\n automation.eventType === \"notion-database-item-created\"\n );\n}\n\nfunction isNotionPageContentUpdatedAutomation(\n automation: ZeroWorkflowAutomationSummary,\n): automation is WorkflowNotionPageContentUpdatedAutomationSummary {\n return (\n automation.kind === \"event\" &&\n automation.eventType === \"notion-page-content-updated\"\n );\n}\n\nfunction isGoogleCalendarAutomation(\n automation: ZeroWorkflowAutomationSummary,\n): automation is Extract<\n ZeroWorkflowAutomationSummary,\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 automation.kind === \"event\" &&\n (automation.eventType === \"google-calendar-event-created\" ||\n automation.eventType === \"google-calendar-event-updated\" ||\n automation.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 formatWebhookAutomationEntry(\n automation: WorkflowWebhookAutomationSummary,\n): string {\n return `Webhook: ${automation.webhookUrl ?? \"hidden\"}`;\n}\n\nfunction formatNotionParentPage(\n automation: WorkflowNotionChildPageAutomationSummary,\n): string {\n return (\n automation.eventConfig.parentPage.title ??\n automation.eventConfig.parentPage.url\n );\n}\n\nfunction formatNotionDatabase(\n automation: WorkflowNotionDatabaseItemAutomationSummary,\n): string {\n return (\n automation.eventConfig.dataSource.title ??\n automation.eventConfig.dataSource.url\n );\n}\n\nfunction formatNotionContentUpdatedScope(\n automation: WorkflowNotionPageContentUpdatedAutomationSummary,\n): string {\n return automation.eventConfig.scope.type === \"page\"\n ? (automation.eventConfig.scope.page.title ??\n automation.eventConfig.scope.page.url)\n : (automation.eventConfig.scope.dataSource.title ??\n automation.eventConfig.scope.dataSource.url);\n}\n\nfunction formatNotionContentUpdatedScopeUrl(\n automation: WorkflowNotionPageContentUpdatedAutomationSummary,\n): string {\n return automation.eventConfig.scope.type === \"page\"\n ? automation.eventConfig.scope.page.url\n : automation.eventConfig.scope.dataSource.url;\n}\n\nfunction formatWorkflowAutomationEntry(\n automation: ZeroWorkflowAutomationSummary,\n): string {\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"gmail-new-message\"\n ) {\n return `Gmail new message: ${formatGmailMatchSummary(automation.eventConfig)}`;\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"gmail-label-applied\"\n ) {\n return `Gmail label applied: ${quote(automation.eventConfig.labelName)}`;\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"github-label-applied\"\n ) {\n return `GitHub label applied: ${quote(automation.eventConfig.labelName)} (${formatGithubSubject(\n automation.eventConfig.filters.subject,\n )}, actor ${automation.eventConfig.filters.actor.type})`;\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"google-calendar-event-created\"\n ) {\n return `Google Calendar event created: ${automation.eventConfig.calendarId}`;\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"google-calendar-event-updated\"\n ) {\n return `Google Calendar event updated: ${automation.eventConfig.calendarId}`;\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"google-calendar-event-cancelled\"\n ) {\n return `Google Calendar event cancelled: ${automation.eventConfig.calendarId}`;\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"google-meet-transcript-generated\"\n ) {\n return \"Google Meet transcript ready: meetings you organize\";\n }\n if (isWebhookAutomation(automation)) {\n return formatWebhookAutomationEntry(automation);\n }\n\n if (automation.kind !== \"schedule\") {\n return workflowAutomationKindLabel(automation);\n }\n\n const { schedule } = automation;\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 workflowAutomationKindLabel(\n automation: ZeroWorkflowAutomationSummary,\n): string {\n if (automation.kind !== \"event\") {\n return formatWorkflowAutomationEntry(automation);\n }\n switch (automation.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 \"github-deployment-status-created\":\n return \"GitHub deployment status created\";\n case \"github-issue-comment-created\":\n return \"GitHub issue comment created\";\n case \"github-pull-request-review-submitted\":\n return \"GitHub pull request review submitted\";\n case \"github-workflow-job-completed\":\n return \"GitHub workflow job completed\";\n case \"github-workflow-run-completed\":\n return \"GitHub workflow completed\";\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(automation)}`;\n case \"notion-database-item-created\":\n return `New Notion database item: ${formatNotionDatabase(automation)}`;\n case \"notion-page-content-updated\":\n return `Notion page content updated: ${formatNotionContentUpdatedScope(automation)}`;\n case \"webhook-received\":\n return \"Webhook\";\n }\n}\n\nfunction signedCurlExample(\n automation: WorkflowWebhookAutomationSummary,\n): string {\n const secret = automation.webhookSecret ?? \"<signing-secret>\";\n const webhookUrl = automation.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 printWorkflowAutomationsTable(\n automations: readonly ZeroWorkflowAutomationSummary[],\n): void {\n const idWidth = Math.max(\n 2,\n ...automations.map((automation) => {\n return automation.id.length;\n }),\n );\n const scheduleWidth = Math.max(\n 7,\n ...automations.map((automation) => {\n return formatWorkflowAutomationEntry(automation).length;\n }),\n );\n\n console.log(\n chalk.dim(\n [\n \"ID\".padEnd(idWidth),\n \"STATUS\".padEnd(8),\n \"AUTOMATION\".padEnd(scheduleWidth),\n \"NEXT RUN\",\n ].join(\" \"),\n ),\n );\n\n for (const automation of automations) {\n const status = automation.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(\n [\n automation.id.padEnd(idWidth),\n status.padEnd(8 + (automation.enabled ? 0 : 2)),\n formatWorkflowAutomationEntry(automation).padEnd(scheduleWidth),\n formatRunTime(automation.nextRunAt),\n ].join(\" \"),\n );\n }\n}\n\nfunction printGithubFilters(automation: ZeroWorkflowAutomationSummary): void {\n if (automation.kind !== \"event\") {\n return;\n }\n const printFilter = (\n label: string,\n values: readonly string[] | undefined,\n ) => {\n console.log(`${`${label}:`.padEnd(14)}${values?.join(\", \") ?? \"any\"}`);\n };\n switch (automation.eventType) {\n case \"github-workflow-run-completed\": {\n const { filters } = automation.eventConfig;\n printFilter(\"Repositories\", filters.repositories);\n printFilter(\"Workflows\", filters.workflows);\n printFilter(\"Conclusions\", filters.conclusions);\n printFilter(\"Branches\", filters.branches);\n printFilter(\"Events\", filters.events);\n printFilter(\"Actors\", filters.actors);\n return;\n }\n case \"github-workflow-job-completed\": {\n const { filters } = automation.eventConfig;\n printFilter(\"Repositories\", filters.repositories);\n printFilter(\"Workflows\", filters.workflows);\n printFilter(\"Jobs\", filters.jobs);\n printFilter(\"Conclusions\", filters.conclusions);\n printFilter(\"Branches\", filters.branches);\n printFilter(\"Runner labels\", filters.runnerLabels);\n printFilter(\"Runner groups\", filters.runnerGroups);\n return;\n }\n case \"github-pull-request-review-submitted\": {\n const { filters } = automation.eventConfig;\n printFilter(\"Repositories\", filters.repositories);\n printFilter(\"Review states\", filters.reviewStates);\n printFilter(\"Base branches\", filters.baseBranches);\n printFilter(\"Head branches\", filters.headBranches);\n printFilter(\"Authors\", filters.trustedAuthors);\n return;\n }\n case \"github-deployment-status-created\": {\n const { filters } = automation.eventConfig;\n printFilter(\"Repositories\", filters.repositories);\n printFilter(\"Environments\", filters.environments);\n printFilter(\"States\", filters.states);\n printFilter(\"Refs\", filters.refs);\n console.log(\n `${\"Production:\".padEnd(14)}${\n filters.productionEnvironment === undefined\n ? \"any\"\n : String(filters.productionEnvironment)\n }`,\n );\n printFilter(\"Creators\", filters.creators);\n printFilter(\"Apps\", filters.apps);\n return;\n }\n case \"github-issue-comment-created\": {\n const { filters } = automation.eventConfig;\n printFilter(\"Repositories\", filters.repositories);\n console.log(\n `${\"Subject:\".padEnd(14)}${formatGithubSubject(filters.subject)}`,\n );\n printFilter(\"Authors\", filters.trustedAuthors);\n printFilter(\"Prefixes\", filters.commentPrefixes);\n return;\n }\n default: {\n return;\n }\n }\n}\n\nexport function printWorkflowAutomationDetails(\n automation: ZeroWorkflowAutomationSummary,\n options?: { readonly workflowRef?: string },\n): void {\n const status = automation.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n\n console.log(`${\"Kind:\".padEnd(14)}${automation.kind}`);\n console.log(`${\"ID:\".padEnd(14)}${automation.id}`);\n if (options?.workflowRef) {\n console.log(`${\"Workflow:\".padEnd(14)}${options.workflowRef}`);\n }\n console.log(`${\"Status:\".padEnd(14)}${status}`);\n console.log(\n `${\"Automation:\".padEnd(14)}${workflowAutomationKindLabel(automation)}`,\n );\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"gmail-new-message\"\n ) {\n console.log(\n `${\"Match:\".padEnd(14)}${formatGmailMatchSummary(automation.eventConfig)}`,\n );\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"gmail-label-applied\"\n ) {\n console.log(`${\"Label:\".padEnd(14)}${automation.eventConfig.labelName}`);\n }\n if (\n automation.kind === \"event\" &&\n automation.eventType === \"github-label-applied\"\n ) {\n console.log(`${\"Label:\".padEnd(14)}${automation.eventConfig.labelName}`);\n console.log(\n `${\"Subject:\".padEnd(14)}${formatGithubSubject(\n automation.eventConfig.filters.subject,\n )}`,\n );\n console.log(\n `${\"Actor:\".padEnd(14)}${automation.eventConfig.filters.actor.type}`,\n );\n }\n printGithubFilters(automation);\n if (isGoogleCalendarAutomation(automation)) {\n console.log(\n `${\"Calendar:\".padEnd(14)}${automation.eventConfig.calendarId}`,\n );\n }\n if (isNotionChildPageAutomation(automation)) {\n console.log(\n `${\"Parent page:\".padEnd(14)}${formatNotionParentPage(automation)}`,\n );\n console.log(\n `${\"Parent URL:\".padEnd(14)}${automation.eventConfig.parentPage.url}`,\n );\n }\n if (isNotionDatabaseItemAutomation(automation)) {\n console.log(`${\"Database:\".padEnd(14)}${formatNotionDatabase(automation)}`);\n console.log(\n `${\"Database URL:\".padEnd(14)}${automation.eventConfig.dataSource.url}`,\n );\n }\n if (isNotionPageContentUpdatedAutomation(automation)) {\n const scopeLabel =\n automation.eventConfig.scope.type === \"page\" ? \"Page\" : \"Database\";\n console.log(`${\"Scope:\".padEnd(14)}${scopeLabel}`);\n console.log(\n `${`${scopeLabel}:`.padEnd(14)}${formatNotionContentUpdatedScope(automation)}`,\n );\n console.log(\n `${`${scopeLabel} URL:`.padEnd(14)}${formatNotionContentUpdatedScopeUrl(automation)}`,\n );\n }\n if (isWebhookAutomation(automation)) {\n console.log(\n `${\"Webhook URL:\".padEnd(14)}${automation.webhookUrl ?? \"hidden\"}`,\n );\n console.log(\n `${\"Secret:\".padEnd(14)}${chalk.dim(`ends with ${automation.secretLastFour}`)}`,\n );\n console.log(\n `${\"Last received:\".padEnd(14)}${formatRunTime(automation.lastReceivedAt)}`,\n );\n if (automation.webhookSecret) {\n console.log(\n `${\"Signing key:\".padEnd(14)}${automation.webhookSecret} ${chalk.dim(\n \"(shown only once)\",\n )}`,\n );\n console.log(\"\");\n console.log(chalk.bold(\"Signed curl example:\"));\n console.log(signedCurlExample(automation));\n }\n }\n console.log(`${\"Owner:\".padEnd(14)}${automation.ownerUserId}`);\n console.log(\n `${\"Chat thread:\".padEnd(14)}${automation.chatThreadId ?? chalk.dim(\"-\")}`,\n );\n console.log(\n `${\"Next run:\".padEnd(14)}${formatRunTime(automation.nextRunAt)}`,\n );\n console.log(\n `${\"Last run:\".padEnd(14)}${formatRunTime(automation.lastRunAt)}`,\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 * Human-friendly duration handling for loop automations (`--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 { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type {\n GithubDeploymentState,\n GithubLabelAppliedSubjectFilter,\n GithubPullRequestReviewState,\n GithubWorkflowRunConclusion,\n ZeroWorkflowSchedule,\n} from \"@vm0/api-contracts/contracts/zero-workflows\";\nimport { FeatureSwitchKey } from \"@vm0/connectors/feature-switch-key\";\nimport { isFeatureEnabled } from \"@vm0/core/feature-switch\";\nimport {\n type ZeroWorkflowAutomationCreateRequest,\n type ZeroWorkflowAutomationSummary,\n type ZeroWorkflowAutomationUpdateRequest,\n createWorkflowAutomation,\n deleteWorkflowAutomation,\n disableWorkflowAutomation,\n enableWorkflowAutomation,\n getWorkflowAutomation,\n listWorkflowAutomations,\n updateWorkflowAutomation,\n} from \"../../../../lib/api\";\nimport { withErrorHandler } from \"../../../../lib/command\";\nimport { decodeZeroTokenPayload } from \"../../../../lib/api/zero-token\";\nimport { parseDurationSeconds } from \"../../shared/duration\";\nimport {\n resolveWorkflowRef,\n type WorkflowRefOptions,\n} from \"../resolve-workflow-ref\";\nimport {\n printWorkflowAutomationDetails,\n printWorkflowAutomationsTable,\n} from \"./display\";\nimport {\n buildGmailLabelAppliedEventConfig,\n buildGmailNewMessageEventConfig,\n hasGmailLabelOption,\n hasGmailAutomationOptions,\n type GmailAutomationOptions,\n} from \"./gmail-config\";\n\ninterface AddOptions extends GmailAutomationOptions {\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 repository?: string;\n readonly workflow?: string;\n readonly job?: string;\n readonly conclusion?: string;\n readonly branch?: string;\n readonly triggeringEvent?: string;\n readonly runnerLabel?: string;\n readonly runnerGroup?: string;\n readonly reviewState?: string;\n readonly baseBranch?: string;\n readonly headBranch?: string;\n readonly trustedAuthor?: string;\n readonly environment?: string;\n readonly deploymentState?: string;\n readonly ref?: string;\n readonly productionEnvironment?: string;\n readonly creator?: string;\n readonly app?: string;\n readonly commentPrefix?: string;\n readonly calendarId?: string;\n readonly pageUrl?: string;\n readonly parentPageUrl?: string;\n readonly databaseUrl?: string;\n}\n\ninterface UpdateOptions extends GmailAutomationOptions {\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 readonly repository?: string;\n readonly workflow?: string;\n readonly job?: string;\n readonly conclusion?: string;\n readonly branch?: string;\n readonly triggeringEvent?: string;\n readonly runnerLabel?: string;\n readonly runnerGroup?: string;\n readonly reviewState?: string;\n readonly baseBranch?: string;\n readonly headBranch?: string;\n readonly trustedAuthor?: string;\n readonly environment?: string;\n readonly deploymentState?: string;\n readonly ref?: string;\n readonly productionEnvironment?: string;\n readonly creator?: string;\n readonly app?: string;\n readonly commentPrefix?: 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 \"github-workflow-run-completed\",\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 GITHUB_WEBHOOK_EVENT_KINDS = [\n \"github-workflow-job-completed\",\n \"github-pull-request-review-submitted\",\n \"github-deployment-status-created\",\n \"github-issue-comment-created\",\n] as const;\n\nfunction githubWebhookAutomationsEnabled(): boolean {\n const payload = decodeZeroTokenPayload();\n return isFeatureEnabled(FeatureSwitchKey.GithubWebhookAutomations, {\n userId: payload?.userId,\n orgId: payload?.orgId,\n });\n}\n\nfunction automationKinds(): readonly string[] {\n return [\n ...SCHEDULE_KINDS,\n ...EVENT_KINDS,\n ...(githubWebhookAutomationsEnabled() ? GITHUB_WEBHOOK_EVENT_KINDS : []),\n ];\n}\n\nfunction githubWebhookEventKind(\n kind: string,\n): kind is (typeof GITHUB_WEBHOOK_EVENT_KINDS)[number] {\n return GITHUB_WEBHOOK_EVENT_KINDS.some((eventKind) => {\n return eventKind === kind;\n });\n}\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 addGmailAutomationOptions(command: Command): Command {\n return command\n .option(\n \"--config <path>\",\n \"Path to a Gmail new message automation config JSON\",\n )\n .option(\"--label <name>\", \"Label name for label-applied automations\")\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 addGithubAutomationOptions(command: Command): Command {\n return command\n .option(\n \"--subject <subject>\",\n \"GitHub subject filter for label/comment automations: both | issues | pull-requests\",\n )\n .option(\n \"--actor <actor>\",\n \"GitHub actor filter: me | anyone for labels, or comma-separated logins for workflow runs\",\n )\n .option(\n \"--repository <repositories>\",\n \"GitHub repositories, comma-separated owner/name values\",\n )\n .option(\n \"--workflow <workflows>\",\n \"GitHub workflows, comma-separated IDs, names, or paths\",\n )\n .option(\n \"--conclusion <conclusions>\",\n \"Workflow run or job conclusions, comma-separated values\",\n )\n .option(\n \"--branch <branches>\",\n \"Workflow run or job branches, comma-separated\",\n )\n .option(\n \"--triggering-event <events>\",\n \"Workflow run triggering events, comma-separated\",\n )\n .option(\"--job <jobs>\", \"GitHub Actions job names or IDs, comma-separated\")\n .option(\"--runner-label <labels>\", \"Runner labels, comma-separated\")\n .option(\n \"--runner-group <groups>\",\n \"Runner group names or IDs, comma-separated\",\n )\n .option(\n \"--review-state <states>\",\n \"Review states: approved, changes_requested, commented, or any\",\n )\n .option(\n \"--base-branch <branches>\",\n \"Pull request base branches, comma-separated\",\n )\n .option(\n \"--head-branch <branches>\",\n \"Pull request head branches, comma-separated\",\n )\n .option(\n \"--trusted-author <logins>\",\n \"Trusted GitHub author logins, comma-separated; omit to allow anyone\",\n )\n .option(\"--environment <names>\", \"Deployment environments, comma-separated\")\n .option(\"--deployment-state <states>\", \"Deployment states, comma-separated\")\n .option(\"--ref <refs>\", \"Deployment refs, comma-separated\")\n .option(\n \"--production-environment <value>\",\n \"Deployment environment filter: true | false | any\",\n )\n .option(\n \"--creator <logins>\",\n \"Deployment creator logins or IDs, comma-separated\",\n )\n .option(\n \"--app <apps>\",\n \"Deployment GitHub App slugs, names, or IDs, comma-separated\",\n )\n .option(\n \"--comment-prefix <prefixes>\",\n \"Required trimmed comment prefixes, comma-separated\",\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 automations 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 automations 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 automations 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 automation kind: \"${kind}\". Use one of: ${automationKinds().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 hasGithubLabelAutomationOptions(\n options: AddOptions | UpdateOptions,\n): boolean {\n return options.subject !== undefined || options.actor !== undefined;\n}\n\nfunction hasGithubWorkflowRunSpecificOptions(\n options: AddOptions | UpdateOptions,\n): boolean {\n return (\n options.repository !== undefined ||\n options.workflow !== undefined ||\n options.conclusion !== undefined ||\n options.branch !== undefined ||\n options.triggeringEvent !== undefined\n );\n}\n\ntype GithubAutomationOptionKey =\n | \"subject\"\n | \"actor\"\n | \"repository\"\n | \"workflow\"\n | \"job\"\n | \"conclusion\"\n | \"branch\"\n | \"triggeringEvent\"\n | \"runnerLabel\"\n | \"runnerGroup\"\n | \"reviewState\"\n | \"baseBranch\"\n | \"headBranch\"\n | \"trustedAuthor\"\n | \"environment\"\n | \"deploymentState\"\n | \"ref\"\n | \"productionEnvironment\"\n | \"creator\"\n | \"app\"\n | \"commentPrefix\";\n\nconst GITHUB_AUTOMATION_OPTION_KEYS: readonly GithubAutomationOptionKey[] = [\n \"subject\",\n \"actor\",\n \"repository\",\n \"workflow\",\n \"job\",\n \"conclusion\",\n \"branch\",\n \"triggeringEvent\",\n \"runnerLabel\",\n \"runnerGroup\",\n \"reviewState\",\n \"baseBranch\",\n \"headBranch\",\n \"trustedAuthor\",\n \"environment\",\n \"deploymentState\",\n \"ref\",\n \"productionEnvironment\",\n \"creator\",\n \"app\",\n \"commentPrefix\",\n];\n\nfunction githubOptionValue(\n options: AddOptions | UpdateOptions,\n key: GithubAutomationOptionKey,\n): string | undefined {\n return options[key];\n}\n\nfunction hasGithubWebhookOptions(options: AddOptions | UpdateOptions): boolean {\n return GITHUB_AUTOMATION_OPTION_KEYS.some((key) => {\n return githubOptionValue(options, key) !== undefined;\n });\n}\n\nfunction hasGithubAutomationOptions(\n options: AddOptions | UpdateOptions,\n): boolean {\n return (\n hasGithubLabelAutomationOptions(options) ||\n hasGithubWorkflowRunSpecificOptions(options) ||\n hasGithubWebhookOptions(options)\n );\n}\n\nfunction assertOnlyGithubAutomationOptions(\n options: AddOptions | UpdateOptions,\n allowed: readonly GithubAutomationOptionKey[],\n): void {\n const invalid = GITHUB_AUTOMATION_OPTION_KEYS.find((key) => {\n return (\n githubOptionValue(options, key) !== undefined && !allowed.includes(key)\n );\n });\n if (invalid) {\n throw new Error(\n `--${invalid.replace(/[A-Z]/g, (match) => {\n return `-${match.toLowerCase()}`;\n })} does not apply to this GitHub automation`,\n );\n }\n}\n\nfunction hasAnyGithubAutomationOption(\n options: AddOptions | UpdateOptions,\n allowed: readonly GithubAutomationOptionKey[],\n): boolean {\n return allowed.some((key) => {\n return githubOptionValue(options, key) !== undefined;\n });\n}\n\nfunction hasCalendarAutomationOptions(options: AddOptions): boolean {\n return options.calendarId !== undefined;\n}\n\nfunction hasNotionAutomationOptions(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 hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubAutomationOptions(options) ||\n hasCalendarAutomationOptions(options) ||\n hasNotionAutomationOptions(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 automations\",\n );\n }\n}\n\nfunction assertNoGithubAutomationOptions(\n options: AddOptions,\n message = \"GitHub automation flags only apply to GitHub event automations\",\n): void {\n if (hasGithubAutomationOptions(options)) {\n throw new Error(message);\n }\n}\n\nfunction assertNoCalendarAutomationOptions(options: AddOptions): void {\n if (hasCalendarAutomationOptions(options)) {\n throw new Error(\n \"Google Calendar automation flags only apply to Google Calendar event automations\",\n );\n }\n}\n\nfunction assertNoNotionAutomationOptions(options: AddOptions): void {\n if (hasNotionAutomationOptions(options)) {\n throw new Error(\n \"Notion automation flags only apply to Notion event automations\",\n );\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 ZeroWorkflowAutomationSummary,\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 automations 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\nconst GITHUB_WORKFLOW_RUN_CONCLUSIONS: readonly GithubWorkflowRunConclusion[] =\n [\n \"action_required\",\n \"cancelled\",\n \"failure\",\n \"neutral\",\n \"skipped\",\n \"stale\",\n \"startup_failure\",\n \"success\",\n \"timed_out\",\n ];\n\nfunction parseGithubWorkflowRunFilter(\n value: string | undefined,\n fallback: readonly string[] | undefined,\n): string[] | undefined {\n if (value === undefined) {\n return fallback ? [...fallback] : undefined;\n }\n if (value.trim().toLowerCase() === \"any\") {\n return undefined;\n }\n const values = Array.from(\n new Set(\n value\n .split(\",\")\n .map((part) => {\n return part.trim();\n })\n .filter(Boolean),\n ),\n );\n if (values.length === 0) {\n throw new Error(\"GitHub filters cannot be empty; use any\");\n }\n return values;\n}\n\nfunction parseGithubWorkflowRunConclusions(\n value: string | undefined,\n fallback: readonly GithubWorkflowRunConclusion[] | undefined,\n): GithubWorkflowRunConclusion[] | undefined {\n const values = parseGithubWorkflowRunFilter(value, fallback);\n if (!values) {\n return undefined;\n }\n return values.map((conclusion) => {\n if (\n GITHUB_WORKFLOW_RUN_CONCLUSIONS.includes(\n conclusion as GithubWorkflowRunConclusion,\n )\n ) {\n return conclusion as GithubWorkflowRunConclusion;\n }\n throw new Error(\n `Invalid --conclusion \"${conclusion}\". Use one of: ${GITHUB_WORKFLOW_RUN_CONCLUSIONS.join(\", \")}, any`,\n );\n });\n}\n\nconst GITHUB_PULL_REQUEST_REVIEW_STATES: readonly GithubPullRequestReviewState[] =\n [\"approved\", \"changes_requested\", \"commented\"];\n\nconst GITHUB_DEPLOYMENT_STATES: readonly GithubDeploymentState[] = [\n \"error\",\n \"failure\",\n \"inactive\",\n \"in_progress\",\n \"pending\",\n \"queued\",\n \"success\",\n \"waiting\",\n];\n\nfunction parseGithubReviewStates(\n value: string | undefined,\n fallback: readonly GithubPullRequestReviewState[] | undefined,\n): GithubPullRequestReviewState[] | undefined {\n const values = parseGithubWorkflowRunFilter(value, fallback);\n if (!values) {\n return undefined;\n }\n return values.map((state) => {\n if (\n GITHUB_PULL_REQUEST_REVIEW_STATES.includes(\n state as GithubPullRequestReviewState,\n )\n ) {\n return state as GithubPullRequestReviewState;\n }\n throw new Error(\n `Invalid --review-state \"${state}\". Use one of: ${GITHUB_PULL_REQUEST_REVIEW_STATES.join(\", \")}, any`,\n );\n });\n}\n\nfunction parseGithubDeploymentStates(\n value: string | undefined,\n fallback: readonly GithubDeploymentState[] | undefined,\n): GithubDeploymentState[] | undefined {\n const values = parseGithubWorkflowRunFilter(value, fallback);\n if (!values) {\n return undefined;\n }\n return values.map((state) => {\n if (GITHUB_DEPLOYMENT_STATES.includes(state as GithubDeploymentState)) {\n return state as GithubDeploymentState;\n }\n throw new Error(\n `Invalid --deployment-state \"${state}\". Use one of: ${GITHUB_DEPLOYMENT_STATES.join(\", \")}, any`,\n );\n });\n}\n\nfunction parseProductionEnvironment(\n value: string | undefined,\n fallback: boolean | undefined,\n): boolean | undefined {\n if (value === undefined) {\n return fallback;\n }\n switch (value.trim().toLowerCase()) {\n case \"any\":\n return undefined;\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n throw new Error(\n `Invalid --production-environment \"${value}\". Use true, false, or any`,\n );\n }\n}\n\nfunction buildGithubWorkflowRunCompletedEventConfig(\n options: AddOptions | UpdateOptions,\n existing?: Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"github-workflow-run-completed\";\n }\n >,\n) {\n const filters = existing?.eventConfig.filters;\n return {\n provider: \"github\" as const,\n event: \"workflow_run_completed\" as const,\n filters: {\n repositories: parseGithubWorkflowRunFilter(\n options.repository,\n filters?.repositories,\n ),\n workflows: parseGithubWorkflowRunFilter(\n options.workflow,\n filters?.workflows,\n ),\n conclusions: parseGithubWorkflowRunConclusions(\n options.conclusion,\n filters?.conclusions,\n ),\n branches: parseGithubWorkflowRunFilter(options.branch, filters?.branches),\n events: parseGithubWorkflowRunFilter(\n options.triggeringEvent,\n filters?.events,\n ),\n actors: parseGithubWorkflowRunFilter(options.actor, filters?.actors),\n },\n };\n}\n\nfunction buildGithubWorkflowJobCompletedEventConfig(\n options: AddOptions | UpdateOptions,\n existing?: Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"github-workflow-job-completed\";\n }\n >,\n) {\n const filters = existing?.eventConfig.filters;\n return {\n provider: \"github\" as const,\n event: \"workflow_job_completed\" as const,\n filters: {\n repositories: parseGithubWorkflowRunFilter(\n options.repository,\n filters?.repositories,\n ),\n workflows: parseGithubWorkflowRunFilter(\n options.workflow,\n filters?.workflows,\n ),\n jobs: parseGithubWorkflowRunFilter(options.job, filters?.jobs),\n conclusions: parseGithubWorkflowRunConclusions(\n options.conclusion,\n filters?.conclusions,\n ),\n branches: parseGithubWorkflowRunFilter(options.branch, filters?.branches),\n runnerLabels: parseGithubWorkflowRunFilter(\n options.runnerLabel,\n filters?.runnerLabels,\n ),\n runnerGroups: parseGithubWorkflowRunFilter(\n options.runnerGroup,\n filters?.runnerGroups,\n ),\n },\n };\n}\n\nfunction buildGithubPullRequestReviewSubmittedEventConfig(\n options: AddOptions | UpdateOptions,\n existing?: Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"github-pull-request-review-submitted\";\n }\n >,\n) {\n const filters = existing?.eventConfig.filters;\n return {\n provider: \"github\" as const,\n event: \"pull_request_review_submitted\" as const,\n filters: {\n repositories: parseGithubWorkflowRunFilter(\n options.repository,\n filters?.repositories,\n ),\n reviewStates: parseGithubReviewStates(\n options.reviewState,\n filters?.reviewStates,\n ),\n baseBranches: parseGithubWorkflowRunFilter(\n options.baseBranch,\n filters?.baseBranches,\n ),\n headBranches: parseGithubWorkflowRunFilter(\n options.headBranch,\n filters?.headBranches,\n ),\n trustedAuthors: parseGithubWorkflowRunFilter(\n options.trustedAuthor,\n filters?.trustedAuthors,\n ),\n },\n };\n}\n\nfunction buildGithubDeploymentStatusCreatedEventConfig(\n options: AddOptions | UpdateOptions,\n existing?: Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"github-deployment-status-created\";\n }\n >,\n) {\n const filters = existing?.eventConfig.filters;\n return {\n provider: \"github\" as const,\n event: \"deployment_status_created\" as const,\n filters: {\n repositories: parseGithubWorkflowRunFilter(\n options.repository,\n filters?.repositories,\n ),\n environments: parseGithubWorkflowRunFilter(\n options.environment,\n filters?.environments,\n ),\n states: parseGithubDeploymentStates(\n options.deploymentState,\n filters?.states,\n ),\n refs: parseGithubWorkflowRunFilter(options.ref, filters?.refs),\n productionEnvironment: parseProductionEnvironment(\n options.productionEnvironment,\n filters?.productionEnvironment,\n ),\n creators: parseGithubWorkflowRunFilter(\n options.creator,\n filters?.creators,\n ),\n apps: parseGithubWorkflowRunFilter(options.app, filters?.apps),\n },\n };\n}\n\nfunction buildGithubIssueCommentCreatedEventConfig(\n options: AddOptions | UpdateOptions,\n existing?: Extract<\n ZeroWorkflowAutomationSummary,\n {\n readonly kind: \"event\";\n readonly eventType: \"github-issue-comment-created\";\n }\n >,\n) {\n const filters = existing?.eventConfig.filters;\n return {\n provider: \"github\" as const,\n event: \"issue_comment_created\" as const,\n filters: {\n repositories: parseGithubWorkflowRunFilter(\n options.repository,\n filters?.repositories,\n ),\n subject: parseGithubSubject(options.subject, filters?.subject ?? \"both\"),\n trustedAuthors: parseGithubWorkflowRunFilter(\n options.trustedAuthor,\n filters?.trustedAuthors,\n ),\n commentPrefixes: parseGithubWorkflowRunFilter(\n options.commentPrefix,\n filters?.commentPrefixes,\n ),\n },\n };\n}\n\nfunction buildGmailNewMessageCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailLabelOption(options)) {\n throw new Error(\"--label only applies to label-applied event automations\");\n }\n assertNoGithubAutomationOptions(options);\n assertNoCalendarAutomationOptions(options);\n assertNoNotionAutomationOptions(options);\n return {\n kind: \"event\",\n eventType: \"gmail-new-message\",\n eventConfig: buildGmailNewMessageEventConfig(options),\n };\n}\n\nfunction buildGmailLabelAppliedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailAutomationOptions(options)) {\n throw new Error(\n \"Gmail match flags and --config only apply to gmail-new-message automations\",\n );\n }\n assertNoGithubAutomationOptions(options);\n assertNoCalendarAutomationOptions(options);\n assertNoNotionAutomationOptions(options);\n return {\n kind: \"event\",\n eventType: \"gmail-label-applied\",\n eventConfig: buildGmailLabelAppliedEventConfig(options),\n };\n}\n\nfunction buildGithubLabelAppliedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailAutomationOptions(options)) {\n throw new Error(\n \"Gmail match flags and --config only apply to Gmail event automations\",\n );\n }\n assertNoCalendarAutomationOptions(options);\n assertNoNotionAutomationOptions(options);\n if (hasGithubWorkflowRunSpecificOptions(options)) {\n throw new Error(\n \"Workflow run filter flags only apply to github-workflow-run-completed automations\",\n );\n }\n assertOnlyGithubAutomationOptions(options, [\"subject\", \"actor\"]);\n return {\n kind: \"event\",\n eventType: \"github-label-applied\",\n eventConfig: buildGithubLabelAppliedEventConfig(options),\n };\n}\n\nfunction buildGithubWorkflowRunCompletedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasGmailAutomationOptions(options) || hasGmailLabelOption(options)) {\n throw new Error(\n \"Gmail automation flags only apply to Gmail event automations\",\n );\n }\n if (options.subject !== undefined) {\n throw new Error(\n \"--subject only applies to github-label-applied automations\",\n );\n }\n assertOnlyGithubAutomationOptions(options, [\n \"repository\",\n \"workflow\",\n \"conclusion\",\n \"branch\",\n \"triggeringEvent\",\n \"actor\",\n ]);\n assertNoCalendarAutomationOptions(options);\n assertNoNotionAutomationOptions(options);\n return {\n kind: \"event\",\n eventType: \"github-workflow-run-completed\",\n eventConfig: buildGithubWorkflowRunCompletedEventConfig(options),\n };\n}\n\nfunction assertGithubWebhookCreateOptions(\n options: AddOptions,\n allowed: readonly GithubAutomationOptionKey[],\n): void {\n assertNoScheduleAddOptions(options);\n if (hasGmailAutomationOptions(options) || hasGmailLabelOption(options)) {\n throw new Error(\n \"Gmail automation flags only apply to Gmail event automations\",\n );\n }\n assertNoCalendarAutomationOptions(options);\n assertNoNotionAutomationOptions(options);\n assertOnlyGithubAutomationOptions(options, allowed);\n}\n\nfunction buildGithubWorkflowJobCompletedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertGithubWebhookCreateOptions(options, [\n \"repository\",\n \"workflow\",\n \"job\",\n \"conclusion\",\n \"branch\",\n \"runnerLabel\",\n \"runnerGroup\",\n ]);\n return {\n kind: \"event\",\n eventType: \"github-workflow-job-completed\",\n eventConfig: buildGithubWorkflowJobCompletedEventConfig(options),\n };\n}\n\nfunction buildGithubPullRequestReviewSubmittedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertGithubWebhookCreateOptions(options, [\n \"repository\",\n \"reviewState\",\n \"baseBranch\",\n \"headBranch\",\n \"trustedAuthor\",\n ]);\n return {\n kind: \"event\",\n eventType: \"github-pull-request-review-submitted\",\n eventConfig: buildGithubPullRequestReviewSubmittedEventConfig(options),\n };\n}\n\nfunction buildGithubDeploymentStatusCreatedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertGithubWebhookCreateOptions(options, [\n \"repository\",\n \"environment\",\n \"deploymentState\",\n \"ref\",\n \"productionEnvironment\",\n \"creator\",\n \"app\",\n ]);\n return {\n kind: \"event\",\n eventType: \"github-deployment-status-created\",\n eventConfig: buildGithubDeploymentStatusCreatedEventConfig(options),\n };\n}\n\nfunction buildGithubIssueCommentCreatedCreateRequest(\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\n assertGithubWebhookCreateOptions(options, [\n \"repository\",\n \"subject\",\n \"trustedAuthor\",\n \"commentPrefix\",\n ]);\n return {\n kind: \"event\",\n eventType: \"github-issue-comment-created\",\n eventConfig: buildGithubIssueCommentCreatedEventConfig(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): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubAutomationOptions(options) ||\n hasNotionAutomationOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Notion automation flags only apply to their event automations\",\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): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubAutomationOptions(options) ||\n hasCalendarAutomationOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Google Calendar automation flags only apply to their event automations\",\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 automations\",\n );\n }\n if (!parentPageUrl) {\n throw new Error(\n 'notion-child-page-created automations 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): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubAutomationOptions(options) ||\n hasCalendarAutomationOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Google Calendar automation flags only apply to their event automations\",\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 automations\",\n );\n }\n const databaseUrl = options.databaseUrl?.trim();\n if (!databaseUrl) {\n throw new Error(\n 'notion-database-item-created automations 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): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (\n hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubAutomationOptions(options) ||\n hasCalendarAutomationOptions(options)\n ) {\n throw new Error(\n \"Gmail, GitHub, and Google Calendar automation flags only apply to their event automations\",\n );\n }\n\n if (options.parentPageUrl !== undefined) {\n throw new Error(\n \"--parent-page-url only applies to notion-child-page-created automations\",\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 automations 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): ZeroWorkflowAutomationCreateRequest {\n assertNoScheduleAddOptions(options);\n if (hasEventAddOptions(options)) {\n throw new Error(\"Event automation flags only apply to event automations\");\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): ZeroWorkflowAutomationCreateRequest {\n if (hasEventAddOptions(options)) {\n throw new Error(\"Event automation flags only apply to event automations\");\n }\n return { schedule: buildSchedule(kind, options) };\n}\n\nfunction buildCreateRequest(\n kind: string,\n options: AddOptions,\n): ZeroWorkflowAutomationCreateRequest {\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 \"github-workflow-run-completed\":\n return buildGithubWorkflowRunCompletedCreateRequest(options);\n case \"github-workflow-job-completed\":\n return buildGithubWorkflowJobCompletedCreateRequest(options);\n case \"github-pull-request-review-submitted\":\n return buildGithubPullRequestReviewSubmittedCreateRequest(options);\n case \"github-deployment-status-created\":\n return buildGithubDeploymentStatusCreatedCreateRequest(options);\n case \"github-issue-comment-created\":\n return buildGithubIssueCommentCreatedCreateRequest(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 buildGithubWorkflowEventUpdate(\n options: UpdateOptions,\n existing: Extract<ZeroWorkflowAutomationSummary, { readonly kind: \"event\" }>,\n): ZeroWorkflowAutomationUpdateRequest | undefined {\n switch (existing.eventType) {\n case \"github-workflow-run-completed\": {\n if (\n hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n options.subject !== undefined\n ) {\n throw new Error(\n \"Gmail, label, and subject flags do not apply to GitHub workflow run automations\",\n );\n }\n if (!hasGithubAutomationOptions(options)) {\n throw new Error(\n \"Provide a GitHub workflow run filter flag; use any to clear a filter\",\n );\n }\n assertOnlyGithubAutomationOptions(options, [\n \"repository\",\n \"workflow\",\n \"conclusion\",\n \"branch\",\n \"triggeringEvent\",\n \"actor\",\n ]);\n return {\n eventConfig: buildGithubWorkflowRunCompletedEventConfig(\n options,\n existing,\n ),\n };\n }\n case \"github-workflow-job-completed\": {\n const allowed = [\n \"repository\",\n \"workflow\",\n \"job\",\n \"conclusion\",\n \"branch\",\n \"runnerLabel\",\n \"runnerGroup\",\n ] as const;\n assertOnlyGithubAutomationOptions(options, allowed);\n if (!hasAnyGithubAutomationOption(options, allowed)) {\n throw new Error(\n \"Provide a GitHub workflow job filter flag; use any to clear a filter\",\n );\n }\n return {\n eventConfig: buildGithubWorkflowJobCompletedEventConfig(\n options,\n existing,\n ),\n };\n }\n case \"github-pull-request-review-submitted\": {\n const allowed = [\n \"repository\",\n \"reviewState\",\n \"baseBranch\",\n \"headBranch\",\n \"trustedAuthor\",\n ] as const;\n assertOnlyGithubAutomationOptions(options, allowed);\n if (!hasAnyGithubAutomationOption(options, allowed)) {\n throw new Error(\n \"Provide a GitHub pull request review filter flag; use any to clear a filter\",\n );\n }\n return {\n eventConfig: buildGithubPullRequestReviewSubmittedEventConfig(\n options,\n existing,\n ),\n };\n }\n case \"github-deployment-status-created\": {\n const allowed = [\n \"repository\",\n \"environment\",\n \"deploymentState\",\n \"ref\",\n \"productionEnvironment\",\n \"creator\",\n \"app\",\n ] as const;\n assertOnlyGithubAutomationOptions(options, allowed);\n if (!hasAnyGithubAutomationOption(options, allowed)) {\n throw new Error(\n \"Provide a GitHub deployment status filter flag; use any to clear a filter\",\n );\n }\n return {\n eventConfig: buildGithubDeploymentStatusCreatedEventConfig(\n options,\n existing,\n ),\n };\n }\n case \"github-issue-comment-created\": {\n const allowed = [\n \"repository\",\n \"subject\",\n \"trustedAuthor\",\n \"commentPrefix\",\n ] as const;\n assertOnlyGithubAutomationOptions(options, allowed);\n if (!hasAnyGithubAutomationOption(options, allowed)) {\n throw new Error(\n \"Provide a GitHub issue comment filter flag; use any to clear a filter\",\n );\n }\n return {\n eventConfig: buildGithubIssueCommentCreatedEventConfig(\n options,\n existing,\n ),\n };\n }\n default:\n return undefined;\n }\n}\n\nfunction buildEventUpdate(\n options: UpdateOptions,\n existing: Extract<ZeroWorkflowAutomationSummary, { readonly kind: \"event\" }>,\n): ZeroWorkflowAutomationUpdateRequest {\n const hasGmailOptions = hasGmailAutomationOptions(options);\n const hasLabelOption = hasGmailLabelOption(options);\n const hasGithubOptions = hasGithubAutomationOptions(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 automations cannot be updated\");\n }\n\n if (existing.eventType === \"github-label-applied\") {\n if (hasGmailOptions) {\n throw new Error(\n \"Gmail match flags only apply to Gmail event automations\",\n );\n }\n if (hasGithubWorkflowRunSpecificOptions(options)) {\n throw new Error(\n \"Workflow run filter flags only apply to github-workflow-run-completed automations\",\n );\n }\n assertOnlyGithubAutomationOptions(options, [\"subject\", \"actor\"]);\n if (!hasLabelOption && !hasGithubOptions) {\n throw new Error(\n \"Provide --label, --subject, or --actor for github-label-applied automations\",\n );\n }\n return {\n eventConfig: buildGithubLabelAppliedEventConfig(options, existing),\n };\n }\n\n const githubWorkflowUpdate = buildGithubWorkflowEventUpdate(\n options,\n existing,\n );\n if (githubWorkflowUpdate) {\n return githubWorkflowUpdate;\n }\n\n if (hasGithubOptions) {\n throw new Error(\n \"GitHub automation flags only apply to GitHub event automations\",\n );\n }\n\n if (existing.eventType === \"gmail-label-applied\") {\n if (!hasLabelOption || hasGmailOptions) {\n throw new Error(\"Use --label for gmail-label-applied automations\");\n }\n return { eventConfig: buildGmailLabelAppliedEventConfig(options) };\n }\n\n if (!hasGmailOptions || hasLabelOption) {\n throw new Error(\n \"Use Gmail match options for gmail-new-message automations\",\n );\n }\n return { eventConfig: buildGmailNewMessageEventConfig(options) };\n}\n\nfunction buildScheduleUpdate(\n options: UpdateOptions,\n): ZeroWorkflowAutomationUpdateRequest {\n const hasGmailOptions = hasGmailAutomationOptions(options);\n const hasLabelOption = hasGmailLabelOption(options);\n if (hasGmailOptions || hasLabelOption) {\n throw new Error(\n \"Gmail automation flags only apply to Gmail event automations\",\n );\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: ZeroWorkflowAutomationSummary,\n): ZeroWorkflowAutomationUpdateRequest {\n const hasEventOptions =\n hasGmailAutomationOptions(options) ||\n hasGmailLabelOption(options) ||\n hasGithubAutomationOptions(options);\n if (hasScheduleUpdateOptions(options) && hasEventOptions) {\n throw new Error(\"Use either schedule flags or event automation options\");\n }\n if (hasGmailAutomationOptions(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 automations\");\n }\n return buildEventUpdate(options, existing);\n }\n\n if (hasGithubAutomationOptions(options)) {\n throw new Error(\n \"GitHub automation flags only apply to GitHub event automations\",\n );\n }\n return buildScheduleUpdate(options);\n}\n\nconst addCommand = addGithubAutomationOptions(\n addGmailAutomationOptions(\n new Command()\n .name(\"add\")\n .description(\"Add an automation to a workflow\")\n .argument(\"<workflow>\", \"Workflow ID or name\")\n .argument(\"<kind>\", `Automation type: ${automationKinds().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 automations (default: primary)\",\n )\n .option(\n \"--page-url <url>\",\n \"Notion page URL for notion-page-content-updated automations\",\n )\n .option(\n \"--parent-page-url <url>\",\n \"Parent Notion page URL for notion-child-page-created automations\",\n )\n .option(\n \"--database-url <url>\",\n \"Notion database URL for notion-database-item-created or notion-page-content-updated automations\",\n )\n .option(\"--agent <id>\", \"Agent ID for resolving a workflow name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero workflow automation add tell-a-joke --agent <agent-id> cron --expr \"0 9 * * *\" -z Asia/Shanghai\n zero workflow automation add tell-a-joke --agent <agent-id> once --at \"2026-06-10T09:00\" -z Asia/Shanghai\n zero workflow automation add tell-a-joke --agent <agent-id> loop --every 15m\n zero workflow automation add triage --agent <agent-id> gmail-new-message --from-contains \"@example.com\"\n zero workflow automation add triage --agent <agent-id> gmail-new-message --config ./gmail-automation.json\n zero workflow automation add triage --agent <agent-id> gmail-label-applied --label \"Support\"\n zero workflow automation add triage --agent <agent-id> github-label-applied --label \"triage\" --subject both --actor me\n zero workflow automation add ci-triage --agent <agent-id> github-workflow-run-completed --repository vm0-ai/vm0 --workflow Turbo --conclusion failure,timed_out --branch main --triggering-event push --actor dependabot[bot]\n zero workflow automation add triage --agent <agent-id> google-calendar-event-created\n zero workflow automation add triage --agent <agent-id> google-calendar-event-updated\n zero workflow automation add triage --agent <agent-id> google-calendar-event-cancelled\n zero workflow automation add research-notes --agent <agent-id> notion-child-page-created --parent-page-url \"https://www.notion.so/workspace/Page-title-1234567890abcdef1234567890abcdef\"\n zero workflow automation add research-notes --agent <agent-id> notion-database-item-created --database-url \"https://www.notion.so/1234567890abcdef1234567890abcdef?v=abcdef1234567890abcdef1234567890\"\n zero workflow automation add research-notes --agent <agent-id> notion-page-content-updated --page-url \"https://www.notion.so/workspace/Page-title-1234567890abcdef1234567890abcdef\"\n zero workflow automation add research-notes --agent <agent-id> notion-page-content-updated --database-url \"https://www.notion.so/1234567890abcdef1234567890abcdef?v=abcdef1234567890abcdef1234567890\"\n zero workflow automation add triage --agent <agent-id> webhook\n\nNotes:\n - Workflow names resolve under --agent, then ZERO_AGENT_ID\n - Gmail automations match all inbound messages when no text match rules are provided\n - GitHub automations require the GitHub App installation in the workspace\n - GitHub workflow run filters accept comma-separated values; omit a filter to match any value\n - Webhook automations 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 githubWebhookEventKind(kind) &&\n !githubWebhookAutomationsEnabled()\n ) {\n throw new Error(\n \"GitHub webhook automations are not enabled for this workspace\",\n );\n }\n if (\n options.timezone &&\n kind !== \"cron\" &&\n kind !== \"once\" &&\n kind !== \"gmail-new-message\"\n ) {\n throw new Error(\n \"--timezone only applies to cron and once automations\",\n );\n }\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const body = buildCreateRequest(kind, options);\n const automation = await createWorkflowAutomation(workflowId, body);\n\n console.log(\n chalk.green(`✓ Automation added to workflow \"${workflowRef}\"`),\n );\n printWorkflowAutomationDetails(automation, { workflowRef });\n },\n ),\n );\n\nconst updateCommand = addGithubAutomationOptions(\n addGmailAutomationOptions(\n new Command()\n .name(\"update\")\n .description(\n \"Replace a workflow automation's schedule or event filter config\",\n )\n .argument(\"<automation>\", \"Workflow automation 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 automation update 22222222-2222-4222-8222-222222222222 --expr \"0 9 * * *\" -z Asia/Shanghai\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --at \"2026-06-10T09:00\" -z UTC\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --every 10m\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --from-contains \"@example.com\"\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --config ./gmail-automation.json\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --label \"Support\"\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --actor anyone\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --conclusion failure,timed_out --branch main\n zero workflow automation update 22222222-2222-4222-8222-222222222222 --actor any`,\n )\n .action(\n withErrorHandler(async (id: string, options: UpdateOptions) => {\n const existing = await getWorkflowAutomation(id);\n const automation = await updateWorkflowAutomation(\n id,\n buildUpdate(options, existing),\n );\n\n console.log(chalk.green(`✓ Automation ${automation.id} updated`));\n printWorkflowAutomationDetails(automation);\n }),\n );\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List a workflow's automations\")\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 automation list tell-a-joke --agent <agent-id>\n zero workflow automation list <workflow-id>`,\n )\n .action(\n withErrorHandler(\n async (workflowRef: string, options: WorkflowRefOptions) => {\n const workflowId = await resolveWorkflowRef(workflowRef, options);\n const automations = await listWorkflowAutomations(workflowId);\n\n if (automations.length === 0) {\n console.log(chalk.dim(\"No automations\"));\n console.log(\n chalk.dim(\n ` Add one with: zero workflow automation add ${workflowRef} cron --expr \"0 9 * * *\"`,\n ),\n );\n return;\n }\n\n printWorkflowAutomationsTable(automations);\n },\n ),\n );\n\nconst showCommand = new Command()\n .name(\"show\")\n .description(\"Show a workflow automation\")\n .argument(\"<automation>\", \"Workflow automation ID\")\n .action(\n withErrorHandler(async (id: string) => {\n const automation = await getWorkflowAutomation(id);\n printWorkflowAutomationDetails(automation);\n }),\n );\n\nconst rmCommand = new Command()\n .name(\"rm\")\n .alias(\"remove\")\n .description(\"Remove a workflow automation\")\n .argument(\"<automation>\", \"Workflow automation ID\")\n .action(\n withErrorHandler(async (id: string) => {\n await deleteWorkflowAutomation(id);\n console.log(chalk.green(`✓ Automation ${id} removed`));\n }),\n );\n\nconst enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable a workflow automation\")\n .argument(\"<automation>\", \"Workflow automation ID\")\n .action(\n withErrorHandler(async (id: string) => {\n const automation = await enableWorkflowAutomation(id);\n console.log(chalk.green(`✓ Automation ${automation.id} enabled`));\n }),\n );\n\nconst disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable a workflow automation\")\n .argument(\"<automation>\", \"Workflow automation ID\")\n .action(\n withErrorHandler(async (id: string) => {\n const automation = await disableWorkflowAutomation(id);\n console.log(chalk.green(`✓ Automation ${automation.id} disabled`));\n }),\n );\n\nexport const automationCommand = new Command()\n .name(\"automation\")\n .description(\"Manage a workflow's automations\")\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 an automation: zero workflow automation add <workflow-id> cron --expr \"0 9 * * *\"\n Add a Notion page: zero workflow automation add <workflow-id> notion-child-page-created --parent-page-url \"https://www.notion.so/...\"\n Add a webhook: zero workflow automation add <workflow-id> webhook\n Update a schedule: zero workflow automation update <automation-id> --every 10m\n List automations: zero workflow automation list <workflow-id>\n Inspect an automation: zero workflow automation show <automation-id>\n Pause one automation: zero workflow automation disable <automation-id>`,\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 GmailAutomationOptions {\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 automation 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 automation 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 automation config \"${path}\": ${message}`,\n );\n }\n\n if (!isRecord(parsed)) {\n throw new Error(\"Gmail automation 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 automation config field \"${key}\". Use a top-level match object`,\n );\n }\n }\n\n return parseMatch(parsed.match);\n}\n\nfunction textFlagSpecs(\n options: GmailAutomationOptions,\n): 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 hasGmailAutomationOptions(\n options: GmailAutomationOptions,\n): 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: GmailAutomationOptions): boolean {\n return options.label !== undefined;\n}\n\nfunction buildMatchFromFlags(\n options: GmailAutomationOptions,\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: GmailAutomationOptions,\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: GmailAutomationOptions,\n): GmailLabelAppliedEventConfig {\n const labelName = options.label?.trim();\n if (!labelName) {\n throw new Error(\n 'gmail-label-applied automations 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"]}