@runcofactor/cli 0.28.0 → 0.29.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 (115) hide show
  1. package/dist/{account-6FPITX2M.js → account-QWQP6YCY.js} +3 -3
  2. package/dist/{alert-PWERXHCP.js → alert-65FH7P74.js} +4 -4
  3. package/dist/{api-catalog-HCSSHOFY.js → api-catalog-WM6R37CA.js} +3 -3
  4. package/dist/{attachment-A7JAZWWH.js → attachment-FTQTZUTA.js} +3 -3
  5. package/dist/{augmentor-MIEBKJUK.js → augmentor-IQMT6NFX.js} +3 -3
  6. package/dist/{chunk-3VHY375S.js → chunk-3VIBXXNX.js} +2 -2
  7. package/dist/{chunk-IFZ72FZV.js → chunk-3X3TSH2B.js} +2 -2
  8. package/dist/{chunk-ZP3RP4IK.js → chunk-6AJLNMHB.js} +2 -2
  9. package/dist/{chunk-44NI5IDC.js → chunk-6QGUAITE.js} +15 -1
  10. package/dist/{chunk-44NI5IDC.js.map → chunk-6QGUAITE.js.map} +1 -1
  11. package/dist/{chunk-5N4OZPFQ.js → chunk-DECTGV4O.js} +2 -2
  12. package/dist/{chunk-6BAMC77N.js → chunk-E22PSTUP.js} +2 -2
  13. package/dist/{chunk-4ZNTGBJR.js → chunk-EHKHZ5UR.js} +23 -23
  14. package/dist/chunk-EHKHZ5UR.js.map +1 -0
  15. package/dist/{chunk-DHL4O7MG.js → chunk-MBMFYGKN.js} +2 -2
  16. package/dist/{chunk-YBX5BIKL.js → chunk-PK5UICGR.js} +2 -2
  17. package/dist/{chunk-4SV3CGNM.js → chunk-SFRUUIIC.js} +2 -2
  18. package/dist/{chunk-LSL2M7O6.js → chunk-WTMSRIDK.js} +2 -2
  19. package/dist/{credential-KSLGCJU7.js → credential-CKO4ZBMU.js} +3 -3
  20. package/dist/{credential-template-WECUNR4X.js → credential-template-XOZ2FJ6Z.js} +3 -3
  21. package/dist/{dist-5PKCAL5N.js → dist-YPK2RMUK.js} +3 -3
  22. package/dist/{docs-PRUI4LAD.js → docs-WZCQ6GP7.js} +3 -3
  23. package/dist/{environment-ATT4UQCY.js → environment-KO3JUX3V.js} +3 -3
  24. package/dist/{feature-flag-MWIHVJER.js → feature-flag-4YPPF27F.js} +63 -5
  25. package/dist/feature-flag-4YPPF27F.js.map +1 -0
  26. package/dist/index.js +38 -38
  27. package/dist/{init-QBMKWGHZ.js → init-RXWDJV5I.js} +3 -3
  28. package/dist/{install-BHYIXK6G.js → install-Z7EGAEEW.js} +3 -3
  29. package/dist/{issues-JO3OVOV7.js → issues-XOU54YKP.js} +3 -3
  30. package/dist/{knobs-4LLJ4LCU.js → knobs-7MB2O5SW.js} +3 -3
  31. package/dist/{list-JVJSIK52.js → list-5CJZY5BC.js} +3 -3
  32. package/dist/{local-VCZGHODB.js → local-XLBE4JIT.js} +5 -5
  33. package/dist/{login-UBNUPK2H.js → login-6GDATX4X.js} +3 -3
  34. package/dist/{mcp-2BBNDVZI.js → mcp-52UNMEF3.js} +4 -4
  35. package/dist/{metrics-4YOSDGIG.js → metrics-4Z5IJZ7U.js} +3 -3
  36. package/dist/{product-T2PVBVZ4.js → product-N2R3MWZS.js} +3 -3
  37. package/dist/{prompts-MI4QK2ZM.js → prompts-X6FNI6NZ.js} +3 -3
  38. package/dist/{property-EKASZCO7.js → property-VUKL5IFR.js} +3 -3
  39. package/dist/{record-Z4NY75FM.js → record-AVGKVJK7.js} +4 -4
  40. package/dist/{release-Z7WKFMBS.js → release-4QOZ4IP6.js} +3 -3
  41. package/dist/{sandbox-YOODBA5Q.js → sandbox-4ZR6XRIQ.js} +14 -3
  42. package/dist/sandbox-4ZR6XRIQ.js.map +1 -0
  43. package/dist/{scenarios-ABYCUJ4O.js → scenarios-UZBDO3XR.js} +3 -3
  44. package/dist/{schedule-ZRHOCT5Q.js → schedule-XCSZ6NLT.js} +4 -4
  45. package/dist/{session-T7BV73AC.js → session-QXHDS5GP.js} +5 -5
  46. package/dist/{skill-VLCWQJHG.js → skill-FXNE77RE.js} +166 -159
  47. package/dist/skill-FXNE77RE.js.map +1 -0
  48. package/dist/{spec-QPWXRPAG.js → spec-TOUOP4TC.js} +3 -3
  49. package/dist/{src-BH5O6Z3E.js → src-YZGG5ZSL.js} +3 -3
  50. package/dist/{start-5BADZ65B.js → start-JDLIIBPC.js} +3 -3
  51. package/dist/{tag-CIR6U5LL.js → tag-LSS3IOUA.js} +4 -4
  52. package/dist/{task-4YKONXJI.js → task-KCNDIT4A.js} +3 -3
  53. package/dist/{test-suite-PRJ2PGMN.js → test-suite-MOVN2XL5.js} +5 -5
  54. package/dist/{trace-XVB47RLY.js → trace-7OZNMAKV.js} +4 -4
  55. package/dist/{triage-L5WR65KW.js → triage-BRSUW4Z7.js} +4 -4
  56. package/dist/{utilities-LBKWREPU.js → utilities-TXQGGH37.js} +3 -3
  57. package/dist/{workflow-GCZCXPGA.js → workflow-2TVSFQXK.js} +310 -302
  58. package/dist/workflow-2TVSFQXK.js.map +1 -0
  59. package/dist/{workflow-cache-XWTLXIHE.js → workflow-cache-LRH5CAPS.js} +6 -6
  60. package/dist/{workflow-debug-XHR4552F.js → workflow-debug-IWXZXSL2.js} +5 -5
  61. package/dist/{workflow-proposals-VWLKW352.js → workflow-proposals-76D2MM6G.js} +3 -3
  62. package/package.json +1 -1
  63. package/dist/chunk-4ZNTGBJR.js.map +0 -1
  64. package/dist/feature-flag-MWIHVJER.js.map +0 -1
  65. package/dist/sandbox-YOODBA5Q.js.map +0 -1
  66. package/dist/skill-VLCWQJHG.js.map +0 -1
  67. package/dist/workflow-GCZCXPGA.js.map +0 -1
  68. /package/dist/{account-6FPITX2M.js.map → account-QWQP6YCY.js.map} +0 -0
  69. /package/dist/{alert-PWERXHCP.js.map → alert-65FH7P74.js.map} +0 -0
  70. /package/dist/{api-catalog-HCSSHOFY.js.map → api-catalog-WM6R37CA.js.map} +0 -0
  71. /package/dist/{attachment-A7JAZWWH.js.map → attachment-FTQTZUTA.js.map} +0 -0
  72. /package/dist/{augmentor-MIEBKJUK.js.map → augmentor-IQMT6NFX.js.map} +0 -0
  73. /package/dist/{chunk-3VHY375S.js.map → chunk-3VIBXXNX.js.map} +0 -0
  74. /package/dist/{chunk-IFZ72FZV.js.map → chunk-3X3TSH2B.js.map} +0 -0
  75. /package/dist/{chunk-ZP3RP4IK.js.map → chunk-6AJLNMHB.js.map} +0 -0
  76. /package/dist/{chunk-5N4OZPFQ.js.map → chunk-DECTGV4O.js.map} +0 -0
  77. /package/dist/{chunk-6BAMC77N.js.map → chunk-E22PSTUP.js.map} +0 -0
  78. /package/dist/{chunk-DHL4O7MG.js.map → chunk-MBMFYGKN.js.map} +0 -0
  79. /package/dist/{chunk-YBX5BIKL.js.map → chunk-PK5UICGR.js.map} +0 -0
  80. /package/dist/{chunk-4SV3CGNM.js.map → chunk-SFRUUIIC.js.map} +0 -0
  81. /package/dist/{chunk-LSL2M7O6.js.map → chunk-WTMSRIDK.js.map} +0 -0
  82. /package/dist/{credential-KSLGCJU7.js.map → credential-CKO4ZBMU.js.map} +0 -0
  83. /package/dist/{credential-template-WECUNR4X.js.map → credential-template-XOZ2FJ6Z.js.map} +0 -0
  84. /package/dist/{dist-5PKCAL5N.js.map → dist-YPK2RMUK.js.map} +0 -0
  85. /package/dist/{docs-PRUI4LAD.js.map → docs-WZCQ6GP7.js.map} +0 -0
  86. /package/dist/{environment-ATT4UQCY.js.map → environment-KO3JUX3V.js.map} +0 -0
  87. /package/dist/{init-QBMKWGHZ.js.map → init-RXWDJV5I.js.map} +0 -0
  88. /package/dist/{install-BHYIXK6G.js.map → install-Z7EGAEEW.js.map} +0 -0
  89. /package/dist/{issues-JO3OVOV7.js.map → issues-XOU54YKP.js.map} +0 -0
  90. /package/dist/{knobs-4LLJ4LCU.js.map → knobs-7MB2O5SW.js.map} +0 -0
  91. /package/dist/{list-JVJSIK52.js.map → list-5CJZY5BC.js.map} +0 -0
  92. /package/dist/{local-VCZGHODB.js.map → local-XLBE4JIT.js.map} +0 -0
  93. /package/dist/{login-UBNUPK2H.js.map → login-6GDATX4X.js.map} +0 -0
  94. /package/dist/{mcp-2BBNDVZI.js.map → mcp-52UNMEF3.js.map} +0 -0
  95. /package/dist/{metrics-4YOSDGIG.js.map → metrics-4Z5IJZ7U.js.map} +0 -0
  96. /package/dist/{product-T2PVBVZ4.js.map → product-N2R3MWZS.js.map} +0 -0
  97. /package/dist/{prompts-MI4QK2ZM.js.map → prompts-X6FNI6NZ.js.map} +0 -0
  98. /package/dist/{property-EKASZCO7.js.map → property-VUKL5IFR.js.map} +0 -0
  99. /package/dist/{record-Z4NY75FM.js.map → record-AVGKVJK7.js.map} +0 -0
  100. /package/dist/{release-Z7WKFMBS.js.map → release-4QOZ4IP6.js.map} +0 -0
  101. /package/dist/{scenarios-ABYCUJ4O.js.map → scenarios-UZBDO3XR.js.map} +0 -0
  102. /package/dist/{schedule-ZRHOCT5Q.js.map → schedule-XCSZ6NLT.js.map} +0 -0
  103. /package/dist/{session-T7BV73AC.js.map → session-QXHDS5GP.js.map} +0 -0
  104. /package/dist/{spec-QPWXRPAG.js.map → spec-TOUOP4TC.js.map} +0 -0
  105. /package/dist/{src-BH5O6Z3E.js.map → src-YZGG5ZSL.js.map} +0 -0
  106. /package/dist/{start-5BADZ65B.js.map → start-JDLIIBPC.js.map} +0 -0
  107. /package/dist/{tag-CIR6U5LL.js.map → tag-LSS3IOUA.js.map} +0 -0
  108. /package/dist/{task-4YKONXJI.js.map → task-KCNDIT4A.js.map} +0 -0
  109. /package/dist/{test-suite-PRJ2PGMN.js.map → test-suite-MOVN2XL5.js.map} +0 -0
  110. /package/dist/{trace-XVB47RLY.js.map → trace-7OZNMAKV.js.map} +0 -0
  111. /package/dist/{triage-L5WR65KW.js.map → triage-BRSUW4Z7.js.map} +0 -0
  112. /package/dist/{utilities-LBKWREPU.js.map → utilities-TXQGGH37.js.map} +0 -0
  113. /package/dist/{workflow-cache-XWTLXIHE.js.map → workflow-cache-LRH5CAPS.js.map} +0 -0
  114. /package/dist/{workflow-debug-XHR4552F.js.map → workflow-debug-IWXZXSL2.js.map} +0 -0
  115. /package/dist/{workflow-proposals-VWLKW352.js.map → workflow-proposals-76D2MM6G.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sandbox.ts","../../emulation/src/plugins/email/actions.ts","../../emulation/src/plugins/email/handlers.ts","../../emulation/src/plugins/email/capture.ts","../../emulation/src/plugins/email/parsing.ts","../../emulation/src/plugins/email/types.ts","../../emulation/src/plugins/email.ts","../../emulation/src/plugins/google-oauth.ts","../../emulation/src/plugins/jwt.ts","../../emulation/src/plugins/jira.ts","../../emulation/src/plugins/slack.ts","../../emulation/src/plugins/index.ts","../src/sandbox-emulation.ts"],"sourcesContent":["/**\n * CLI Sandbox Management\n *\n * Create, provision, and manage sandbox templates and instances.\n * Drive template authoring through artifact uploads, command execution,\n * and diagnostics — designed for Claude Code to iterate on sandbox setup.\n */\n\nimport process from 'node:process';\nimport { readFileSync } from 'node:fs';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest, selectProperty } from './cli-helpers.js';\nimport { apiFetch, isTerminalFailure, exitOnFailure } from './api-fetch.js';\nimport { SANDBOX_GUIDE_SECTIONS, printGuide } from '@chatsdet/content';\nimport { INSTANCE_SIZES, INSTANCE_SIZE_SPEC, parseInstanceSize, type InstanceSize } from '@chatsdet/types';\nimport { getPluginIds } from '@chatsdet/emulation/plugins';\nimport { handleEmulation } from './sandbox-emulation.js';\nexport {\n withEmulationMaster,\n withPluginConfig,\n withPluginEnabled,\n withoutPlugin,\n} from './sandbox-emulation.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Template = {\n id: string;\n name: string;\n propertyId: string | null;\n repositoryFullName: string;\n branch: string;\n subdirectory: string | null;\n status: string;\n checklistProfile: string | null;\n configSchema: Array<{ key: string; description?: string; required: boolean; sensitive: boolean }> | null;\n configDefaults: Record<string, string> | null;\n createdAt: string;\n updatedAt: string;\n};\n\ntype GitHubRepo = {\n id: string;\n repoFullName: string;\n repoName: string;\n defaultBranch: string;\n rootDir: string | null;\n agentHint: string | null;\n};\n\ntype Instance = {\n id: string;\n templateId: string;\n name: string;\n status: string;\n hostUrl: string | null;\n isPrivate: boolean;\n expiresAt: string | null;\n createdAt: string;\n /**\n * What the instance is for. `flow_authoring` is the org-shared instance the\n * Flow Designer auto-spins and that sandbox workflow runs reuse — surfaced in\n * `sandbox list` so agents can find/warm it.\n */\n purpose?: string | null;\n};\n\ntype Artifact = {\n id: string;\n taskId: string;\n artifactType: string;\n filename: string;\n content?: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype ChecklistItem = {\n id: string;\n label: string;\n description: string;\n dependsOn: string[];\n producesArtifacts: string[];\n agentAutomatable: boolean;\n itemStatus: { status: string; startedAt?: string; completedAt?: string; summary?: string; error?: string };\n actionable: boolean;\n artifacts: Array<{ artifactType: string; filename: string }>;\n};\n\ntype CommandOrError = { stdout: string; stderr: string; exitCode: number } | { error: string };\n\ntype DiagnosticsResult = {\n instance: Record<string, unknown>;\n docker: CommandOrError;\n git: CommandOrError;\n disk: CommandOrError;\n agentHealth: CommandOrError;\n appHealth: CommandOrError;\n provision?: {\n phase: string;\n jobStatus: string;\n startedAt?: string;\n elapsedSeconds: number | null;\n lastError?: string;\n };\n};\n\ntype ServiceRoute = { service: string; route: string; port: string };\n\nasync function fetchInstanceRoutes(apiUrl: string, token: string, instanceId: string): Promise<ServiceRoute[]> {\n const res = await apiRequest<{ ok: boolean; error?: string; data: { routes: ServiceRoute[] } }>(\n apiUrl, token, 'GET', `/org/environments/instances/${instanceId}/routes`,\n undefined,\n { timeoutMs: 30_000 }\n );\n return res.ok ? res.data.routes : [];\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICONS: Record<string, string> = {\n completed: '[done]',\n running: '[....]',\n pending: '[ ]',\n failed: '[FAIL]',\n skipped: '[skip]',\n};\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nfunction pad(s: string, n: number): string {\n return s.padEnd(n);\n}\n\nconst INSTANCE_SIZE_HELP_LINES = INSTANCE_SIZES.map((size) => {\n const spec = INSTANCE_SIZE_SPEC[size];\n return ` ${pad(size, 8)} ${spec.ec2InstanceType} · ${spec.vcpu} vCPU · ${spec.memoryMiB / 1024} GiB`;\n});\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nfunction printHelp(): void {\n console.log(\n [\n 'canary sandbox: Manage sandbox templates and instances',\n '',\n 'Sub-commands:',\n ' guide [section] Show sandbox authoring guide',\n ' list List templates and instances',\n ' template [id] Show template details',\n ' repo list --template <id> List repos linked to a template',\n ' repo add --template <id> --property-github-repo-id <uuid> [--role <r>] [--spec <r=owner/name@branch:subdir>]',\n ' repo update --template <id> --link-id <uuid> [--role <r>] [--branch <b>] [--subdirectory <s>] [--service-name <n>]',\n ' repo remove --template <id> --link-id <uuid>',\n ' checklist <template-id> Show checklist state',\n ' checklist skip <template-id> <item-id> Skip a checklist item',\n ' checklist complete <template-id> <item-id> [options] Mark item complete from CLI',\n ' artifacts <template-id> List artifacts',\n ' artifact get <template-id> <type> Get artifact content',\n ' artifact create <template-id> <type> <file> Upload artifact (use --path for file type)',\n ' create [property] [options] Create template from property (triggers provisioning)',\n ' provision <template-id> [options] Create a dedicated instance from a verified template',\n ' warm <template-id> [--wait] [--timeout <sec>] Warm the org-shared flow-authoring instance',\n ' (the one the flow designer auto-spins; sandbox runs reuse it)',\n ' verify <template-id> Verify an authoring template (provision + probe + flip to verified)',\n ' set-size <template-id> <size> Set EC2 size for next provision (see \"Instance sizes\" below)',\n ' ami list <template-id> List per-template AMI history',\n ' ami rebake <template-id> [opts] Trigger a fresh AMI bake (--force, --wait)',\n ' ami use <template-id> <ami-row-id> Switch the template to a specific AMI (rollback)',\n ' ami use-base <template-id> Reset the template to the base/standard AMI (fresh clone)',\n ' build <instance-id> Build and start app services on sandbox',\n ' run-command <instance-id> <command...> Execute shell command on sandbox',\n ' --service <name> Run inside a Docker container instead of on the host VM',\n ' diagnostics <instance-id> Show sandbox diagnostics',\n ' logs <instance-id> [options] Show container logs',\n ' terminate <instance-id> Terminate an instance',\n ' config list <template-id> Show config schema and defaults',\n ' config set <template-id> <key> <value> Set a config default value',\n ' emulation get <template-id> Show emulation config + available plugins',\n ' emulation enable/disable <template-id> [pluginId] Toggle master switch (or one plugin)',\n ' emulation set <template-id> <pluginId> [opts] Configure a plugin entry',\n ' emulation remove <template-id> <pluginId> Drop a plugin entry',\n ' action <list|get|create|delete|execute|executions> Manage template actions (see \"Action sub-commands\" below)',\n ' delete <template-id> Delete template and all instances',\n '',\n 'Create options:',\n ' --property <name|id> Property (prompted if omitted, auto-selected if only one)',\n ' --branch <branch> Branch (default: from linked repo)',\n ' --name <name> Template name (default: repo name)',\n ' --subdirectory <path> Subdirectory (default: from linked repo rootDir)',\n ' --size <size> EC2 size for first authoring sandbox (default: medium; see \"Instance sizes\" below)',\n '',\n 'Provision options:',\n ' --name <name> Instance name',\n ' --ttl <hours> Time to live in hours (default: 8)',\n ' --with-agent Start with sandbox agent',\n '',\n 'Artifact get options:',\n ' --output <file> Write to file instead of stdout',\n '',\n 'Logs options:',\n ' --service <name> Service name (default: all services)',\n ' --tail <n> Number of lines (default: 200)',\n '',\n 'Guide sections:',\n ' goal, research, artifacts, actions, verify, checklist',\n '',\n 'Instance sizes:',\n ...INSTANCE_SIZE_HELP_LINES,\n '',\n 'Action sub-commands:',\n ' action list <template-id> List actions for a template',\n ' action get <template-id> <slug> Show action definition + script',\n ' action create <template-id> <slug> [opts] Create or update an action',\n ' action delete <template-id> <slug> Delete an action',\n ' action execute <instance-id> <slug> [opts] Execute action on a running instance',\n ' action executions <instance-id> [opts] List execution history',\n '',\n 'Action create options:',\n ' --label <label> Display name (default: slug → Title Case)',\n ' --description <text> Description',\n ' --icon <icon> Phosphor icon name',\n ' --script <file> Path to script file (bash)',\n ' --input-schema <file> Path to JSON Schema file for input params',\n ' --output-schema <file> Path to JSON Schema file for output',\n ' --credential-output-config <file> JSON file with ActionCredentialOutputConfig (auto-creates a Canary credential from the action result).',\n ' Supports `variableMapping` (persona var name → $output.* token) to fill the persona\\'s declared variables ($var.USER.<NAME>)',\n ' --credential-template <id> Credential template this action provisions; login nodes using it auto-provision',\n ' --provisioning-mode <shared|unique> shared = provision once / reused (default); unique = one credential per run (script must accept a runId input param)',\n ' --run-on-provision Base seed: run automatically once per provisioned instance (not login-triggered). Its --output-schema keys are exposed to flows as $var.SEED.<key>',\n ' --provision-order <n> Order for multiple base seeds on a template (ascending; unset runs first)',\n ' --timeout <ms> Timeout in ms (default: 55000)',\n ' --encrypt-script Encrypt script content at rest',\n '',\n 'Action execute options:',\n ' --param <key>=<value> Set parameter (repeatable)',\n ' --params-file <file> JSON file with all params',\n '',\n 'Emulation sub-commands (third-party service emulation: Slack/Jira/Google-OAuth/email):',\n ' emulation get <template-id> Master switch, configured plugins, available catalog',\n ' emulation enable <template-id> [pluginId] Turn on emulation (or enable a single plugin)',\n ' emulation disable <template-id> [pluginId] Turn off emulation (or disable a single plugin)',\n ' emulation set <template-id> <pluginId> [opts] Create/update a plugin entry (does not flip master switch)',\n ' emulation remove <template-id> <pluginId> Remove a plugin entry',\n ` Available plugins: ${getPluginIds().join(', ')}`,\n '',\n 'Emulation set options:',\n ' --config <file> JSON file with plugin-specific config (e.g. { \"tenant\": \"acme\" })',\n ' --fixture <file> JSON file with seed/fixture data for the plugin',\n ' --env-mapping <file> JSON file mapping logical env-contract keys to the app env var(s)',\n '',\n 'Global options:',\n ' --json Output raw JSON',\n ' --env <env> Environment (prod, dev, local)',\n ' -h, --help Show help',\n ].join('\\n')\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sub-command handlers\n// ---------------------------------------------------------------------------\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n\n const [templatesRes, instancesRes] = await Promise.all([\n apiRequest<{ ok: boolean; error?: string; data: Template[] }>(\n apiUrl, token, 'GET', '/org/environments/templates'\n ),\n apiRequest<{ ok: boolean; error?: string; data: Instance[] }>(\n apiUrl, token, 'GET', '/org/environments/instances'\n ),\n ]);\n\n if (!templatesRes.ok) {\n console.error(`Error: ${templatesRes.error}`);\n process.exit(1);\n }\n if (!instancesRes.ok) {\n console.error(`Error loading instances: ${instancesRes.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify({ templates: templatesRes.data, instances: instancesRes.data }, null, 2));\n return;\n }\n\n const templates = templatesRes.data ?? [];\n const instances = instancesRes.data ?? [];\n\n console.log('Templates:');\n if (templates.length === 0) {\n console.log(' (none)');\n } else {\n console.log(` ${pad('ID', 38)} ${pad('Name', 24)} ${pad('Status', 14)} ${pad('Profile', 12)} Repository`);\n for (const t of templates) {\n console.log(` ${pad(t.id, 38)} ${pad(t.name, 24)} ${pad(t.status, 14)} ${pad(t.checklistProfile ?? '-', 12)} ${t.repositoryFullName}:${t.branch}`);\n }\n }\n\n console.log('');\n console.log('Instances:');\n if (instances.length === 0) {\n console.log(' (none)');\n } else {\n console.log(` ${pad('ID', 38)} ${pad('Status', 14)} ${pad('Purpose', 16)} ${pad('Access', 10)} ${pad('Template', 38)} Expires`);\n for (const i of instances) {\n const access = i.isPrivate ? 'private' : 'public';\n // The org-shared flow-authoring instance is the one workflow runs reuse —\n // flag it so it's easy to spot (and warm via `sandbox warm <template>`).\n const purpose =\n i.purpose === 'flow_authoring' ? 'flow_authoring*' : (i.purpose ?? '-');\n console.log(` ${pad(i.id, 38)} ${pad(i.status, 14)} ${pad(purpose, 16)} ${pad(access, 10)} ${pad(i.templateId, 38)} ${i.expiresAt ? formatDate(i.expiresAt) : '-'}`);\n }\n console.log('');\n console.log(' * flow_authoring = org-shared instance the flow designer auto-spins and');\n console.log(' sandbox workflow runs reuse. Warm it with: canary sandbox warm <template-id>');\n }\n}\n\nasync function handleTemplate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [id] = argv.filter((a) => !a.startsWith('-'));\n const json = hasFlag(argv, '--json');\n\n if (!id) {\n await handleList(argv, apiUrl, token);\n return;\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: Template }>(\n apiUrl, token, 'GET', `/org/environments/templates/${id}`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const t = res.data;\n console.log(`Template: ${t.name}`);\n console.log(` ID: ${t.id}`);\n console.log(` Repository: ${t.repositoryFullName}:${t.branch}`);\n if (t.subdirectory) console.log(` Subdir: ${t.subdirectory}`);\n console.log(` Status: ${t.status}`);\n console.log(` Profile: ${t.checklistProfile ?? 'full-stack (default)'}`);\n console.log(` Created: ${formatDate(t.createdAt)}`);\n console.log(` Updated: ${formatDate(t.updatedAt)}`);\n\n if (t.configSchema && t.configSchema.length > 0) {\n console.log('');\n console.log(' Config Schema:');\n for (const c of t.configSchema) {\n const flags = [c.required ? 'required' : 'optional', c.sensitive ? 'sensitive' : ''].filter(Boolean).join(', ');\n console.log(` ${c.key} (${flags})${c.description ? ` — ${c.description}` : ''}`);\n }\n }\n}\n\nasync function handleArtifacts(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [templateId] = argv.filter((a) => !a.startsWith('-'));\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox artifacts <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: Artifact[] }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}/artifacts`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const artifacts = res.data ?? [];\n if (artifacts.length === 0) {\n console.log('No artifacts found.');\n return;\n }\n\n console.log(`${pad('Type', 22)} ${pad('Filename', 30)} ${pad('Task', 24)} Created`);\n for (const a of artifacts) {\n console.log(`${pad(a.artifactType, 22)} ${pad(a.filename, 30)} ${pad(a.taskId, 24)} ${formatDate(a.createdAt)}`);\n }\n}\n\nasync function handleChecklist(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const json = hasFlag(argv, '--json');\n\n // Handle checklist sub-commands: skip, complete\n if (positional[0] === 'skip') {\n await handleChecklistSkip(argv.slice(1), apiUrl, token);\n return;\n }\n if (positional[0] === 'complete') {\n await handleChecklistComplete(argv.slice(1), apiUrl, token);\n return;\n }\n\n const templateId = positional[0];\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox checklist <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: ChecklistItem[] }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}/checklist`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const items = res.data ?? [];\n if (items.length === 0) {\n console.log('No checklist items.');\n return;\n }\n\n console.log('Checklist:');\n for (const item of items) {\n const icon = STATUS_ICONS[item.itemStatus.status] ?? '[????]';\n const actionable = item.actionable ? ' *' : '';\n console.log(` ${icon} ${item.label}${actionable}`);\n if (item.itemStatus.summary) {\n console.log(` ${item.itemStatus.summary}`);\n }\n if (item.itemStatus.error) {\n console.log(` ERROR: ${item.itemStatus.error}`);\n }\n if (item.artifacts.length > 0) {\n console.log(` Artifacts: ${item.artifacts.map((a) => a.artifactType).join(', ')}`);\n }\n }\n console.log('');\n console.log(' * = actionable (deps met, ready to run)');\n}\n\nasync function handleChecklistSkip(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const itemId = positional[1];\n\n if (!templateId || !itemId) {\n console.error('Error: both template ID and item ID required. Usage: canary sandbox checklist skip <template-id> <item-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl, token, 'POST', `/org/environments/templates/${templateId}/checklist/${itemId}/skip`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n console.log(`Skipped checklist item: ${itemId}`);\n}\n\nasync function handleChecklistComplete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const itemId = positional[1];\n\n const json = hasFlag(argv, '--json');\n\n if (!templateId || !itemId) {\n console.error('Error: both template ID and item ID required.');\n console.error('Usage: canary sandbox checklist complete <template-id> <item-id> [--status success|failed] [--summary \"...\"]');\n process.exit(1);\n }\n\n const status = getArgValue(argv, '--status') ?? 'success';\n const summary = getArgValue(argv, '--summary');\n const configSchemaArg = getArgValue(argv, '--config-schema');\n const healthCheckPath = getArgValue(argv, '--health-check-path');\n\n let configSchema: unknown;\n if (configSchemaArg) {\n // Accept inline JSON or a file path\n try {\n configSchema = JSON.parse(configSchemaArg);\n } catch {\n try {\n configSchema = JSON.parse(readFileSync(configSchemaArg, 'utf-8'));\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error reading config schema from \"${configSchemaArg}\": ${msg}`);\n process.exit(1);\n }\n }\n }\n\n const body: Record<string, unknown> = {\n status: status === 'failed' ? 'failed' : 'completed',\n ...(summary ? { summary } : {}),\n ...(configSchema ? { configSchema } : {}),\n ...(healthCheckPath ? { healthCheckPath } : {}),\n };\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: { itemId: string; status: string } }>(\n apiUrl, token, 'POST', `/org/environments/templates/${templateId}/checklist/${itemId}/complete`, body\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n console.log(`Completed checklist item: ${itemId} (${res.data?.status})`);\n}\n\nasync function handleConfigList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox config list <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: Template }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n const t = res.data;\n const schema = t.configSchema ?? [];\n const defaults = t.configDefaults ?? {};\n\n if (json) {\n console.log(JSON.stringify({ configSchema: schema, configDefaults: defaults }, null, 2));\n return;\n }\n\n if (schema.length === 0) {\n console.log('No config schema defined for this template.');\n return;\n }\n\n console.log('Config Schema:');\n for (const item of schema) {\n const value = defaults[item.key];\n const display = item.sensitive && value ? '••••••••' : (value ?? '(not set)');\n const required = item.required ? ' (required)' : '';\n const sensitive = item.sensitive ? ' [sensitive]' : '';\n console.log(` ${item.key}${required}${sensitive}`);\n if (item.description) console.log(` ${item.description}`);\n console.log(` Value: ${display}`);\n }\n}\n\nasync function handleConfigSet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const fromStdin = hasFlag(argv, '--value-stdin');\n const templateId = positional[0];\n const key = positional[1];\n let value = positional[2];\n\n if (!templateId || !key) {\n console.error('Error: template ID and key required.');\n console.error('Usage: canary sandbox config set <template-id> <key> <value>');\n console.error(' For sensitive values: echo \"sk-ant-...\" | canary sandbox config set <template-id> <key> --value-stdin');\n process.exit(1);\n }\n\n if (fromStdin) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n value = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (value === undefined) {\n console.error('Error: value required. Pass as argument or use --value-stdin');\n process.exit(1);\n }\n\n // First get current defaults to merge\n const getRes = await apiRequest<{ ok: boolean; error?: string; data: Template }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}`\n );\n if (!getRes.ok) {\n console.error(`Error: ${getRes.error}`);\n process.exit(1);\n }\n\n const currentDefaults = getRes.data?.configDefaults ?? {};\n const updatedDefaults = { ...currentDefaults, [key]: value };\n\n // The server may take longer than 30s to acknowledge config writes\n // (encrypted columns, audit log). Even when it does the write succeeds —\n // bump the CLI ceiling so the user sees the success rather than a\n // misleading timeout.\n const res = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl, token, 'PATCH', `/org/environments/templates/${templateId}/config`, {\n configDefaults: updatedDefaults,\n },\n { timeoutMs: 90_000 }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n console.log(`Config set: ${key}`);\n}\n\nasync function handleSetSize(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [templateId, sizeArg] = argv.filter((a) => !a.startsWith('-'));\n\n if (!templateId || !sizeArg) {\n console.error('Error: template ID and size required.');\n console.error(`Usage: canary sandbox set-size <template-id> <${INSTANCE_SIZES.join('|')}>`);\n process.exit(1);\n }\n\n const size = parseInstanceSize(sizeArg);\n if (!size) {\n console.error(`Error: invalid size '${sizeArg}'. Must be one of: ${INSTANCE_SIZES.join(', ')}`);\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; instanceSize?: InstanceSize }>(\n apiUrl,\n token,\n 'PATCH',\n `/org/environments/templates/${templateId}/instance-size`,\n { instanceSize: size }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n console.log(`Instance size set to ${size}`);\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const json = hasFlag(argv, '--json');\n\n // Resolve property — positional arg or --property flag, prompted if omitted\n const propertyHint = positional[0] ?? getArgValue(argv, '--property');\n const property = await selectProperty(apiUrl, token, propertyHint ?? undefined);\n if (!property) process.exit(1);\n\n // Fetch linked repos for the property\n const reposRes = await apiRequest<{ ok: boolean; error?: string; items: GitHubRepo[] }>(\n apiUrl, token, 'GET', `/org/properties/${property.id}/github-repos`\n );\n if (!reposRes.ok || !reposRes.items?.length) {\n console.error(`No GitHub repos linked to property \"${property.name}\". Link one first in the web app.`);\n process.exit(1);\n }\n\n const linkedRepo = reposRes.items[0];\n const branch = getArgValue(argv, '--branch') ?? linkedRepo.defaultBranch ?? 'main';\n const name = getArgValue(argv, '--name') ?? linkedRepo.repoName ?? linkedRepo.repoFullName.split('/').pop() ?? property.name;\n const subdirectory = getArgValue(argv, '--subdirectory') ?? linkedRepo.rootDir ?? undefined;\n\n const sizeArg = getArgValue(argv, '--size');\n const instanceSize = sizeArg ? parseInstanceSize(sizeArg) : undefined;\n if (sizeArg && !instanceSize) {\n console.error(`Error: invalid --size '${sizeArg}'. Must be one of: ${INSTANCE_SIZES.join(', ')}`);\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {\n name,\n propertyId: property.id,\n repositoryFullName: linkedRepo.repoFullName,\n branch,\n };\n if (subdirectory) body.subdirectory = subdirectory;\n if (linkedRepo.agentHint) body.hints = linkedRepo.agentHint;\n if (instanceSize) body.instanceSize = instanceSize;\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: Template }>(\n apiUrl, token, 'POST', '/org/environments/templates', body\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n console.log(`Template created: ${res.data.id}`);\n console.log(` Property: ${property.name}`);\n console.log(` Repository: ${res.data.repositoryFullName}:${res.data.branch}`);\n console.log(` Status: ${res.data.status}`);\n console.log('');\n console.log('Authoring job enqueued. Poll status with:');\n console.log(` canary sandbox template ${res.data.id}`);\n}\n\nasync function handleProvision(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox provision <template-id> [--ttl 8]');\n process.exit(1);\n }\n\n const name = getArgValue(argv, '--name') ?? `instance-${Date.now()}`;\n const ttl = parseInt(getArgValue(argv, '--ttl') ?? '8', 10);\n const withAgent = hasFlag(argv, '--with-agent');\n const isPrivate = hasFlag(argv, '--private');\n\n const body: Record<string, unknown> = {\n templateId,\n name,\n expiresInHours: ttl,\n userConfig: {},\n withAgent,\n isPrivate,\n };\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: Instance }>(\n apiUrl, token, 'POST', '/org/environments/instances', body\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n console.log(`Instance created: ${res.data.id}`);\n console.log(` Status: ${res.data.status}`);\n if (isPrivate) console.log(` Access: private (no public URL)`);\n console.log(` Expires: ${res.data.expiresAt ? formatDate(res.data.expiresAt) : '-'}`);\n}\n\ntype AuthoringInstance = {\n instanceId: string;\n status: string;\n url: string | null;\n expiresAt: string | null;\n createdAt: string | null;\n created: boolean;\n};\n\n/**\n * Warm (get-or-create) the org-shared flow-authoring instance for a template —\n * the same instance the Flow Designer auto-spins and that a sandbox workflow run\n * reuses. Pre-warming avoids the first run blocking on a cold provision.\n *\n * `--wait` polls the idempotent ensure endpoint (safe: it reuses the live\n * instance and just slides the TTL) until the instance is running, fails, or\n * the timeout elapses.\n */\nasync function handleWarm(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n const wait = hasFlag(argv, '--wait');\n const timeoutSec = parseInt(getArgValue(argv, '--timeout') ?? '600', 10);\n\n if (!templateId) {\n console.error(\n 'Error: template ID required. Usage: canary sandbox warm <template-id> [--wait] [--timeout <sec>]'\n );\n console.error('Find the template id with: canary sandbox list');\n process.exit(1);\n }\n\n const ensure = (): Promise<{ ok: boolean; error?: string; data?: AuthoringInstance }> =>\n apiRequest<{ ok: boolean; error?: string; data?: AuthoringInstance }>(\n apiUrl,\n token,\n 'POST',\n `/org/environments/templates/${templateId}/authoring-instance`\n );\n\n const first = await ensure();\n if (!first.ok || !first.data) {\n if (json) {\n console.log(JSON.stringify(first, null, 2));\n } else {\n console.error(`Error: ${first.error ?? 'Failed to warm sandbox'}`);\n }\n process.exit(1);\n }\n\n const terminalOk = new Set(['running']);\n const terminalFail = new Set(['failed', 'terminated', 'stopping']);\n\n let current = first.data;\n if (wait && !terminalOk.has(current.status) && !terminalFail.has(current.status)) {\n const deadline = Date.now() + timeoutSec * 1000;\n if (!json) console.log(`Warming flow-authoring sandbox (${current.status})...`);\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 5000));\n const poll = await ensure();\n if (!poll.ok || !poll.data) {\n console.error(`Error polling sandbox: ${poll.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n current = poll.data;\n if (terminalOk.has(current.status) || terminalFail.has(current.status)) break;\n }\n }\n\n if (json) {\n console.log(JSON.stringify({ ok: true, data: current }, null, 2));\n } else {\n console.log(`Sandbox ${current.created ? 'created' : 'reused'}: ${current.instanceId}`);\n console.log(` Status: ${current.status}`);\n if (current.url) console.log(` URL: ${current.url}`);\n if (current.expiresAt) console.log(` Expires: ${formatDate(current.expiresAt)}`);\n if (current.status === 'running') {\n console.log('\\nReady. Run a workflow against it with:');\n console.log(' canary workflow run <workflowId> [--environment <name|id>] --stream');\n } else if (wait && terminalFail.has(current.status)) {\n console.log('\\nSandbox did not reach a ready state.');\n } else if (wait) {\n console.log('\\nTimed out waiting for the sandbox to become ready. Re-run to keep waiting.');\n } else {\n console.log('\\nWarming in the background. Poll with: canary sandbox warm ' + templateId + ' --wait');\n }\n }\n\n if (terminalFail.has(current.status)) process.exit(1);\n if (wait && current.status !== 'running') process.exit(1);\n}\n\nexport interface ContainerLine {\n name: string;\n status: string;\n state: 'up-healthy' | 'up' | 'up-unhealthy' | 'restarting' | 'exited' | 'other';\n}\n\n/**\n * Parse `docker ps --format '{{.Names}}\\t{{.Status}}\\t{{.Ports}}'` output\n * into a structured list. State classification is coarse — the verify loop\n * only needs to know \"is this container healthy / exited / restart-looping\".\n */\nexport function parseDockerPs(stdout: string): ContainerLine[] {\n const lines = stdout.split('\\n').map((l) => l.trim()).filter(Boolean);\n return lines.map((line) => {\n const [name = '', status = ''] = line.split('\\t');\n const lower = status.toLowerCase();\n let state: ContainerLine['state'] = 'other';\n if (lower.startsWith('restarting')) state = 'restarting';\n else if (lower.startsWith('exited')) state = 'exited';\n else if (lower.startsWith('up') && lower.includes('unhealthy')) state = 'up-unhealthy';\n else if (lower.startsWith('up') && lower.includes('healthy')) state = 'up-healthy';\n else if (lower.startsWith('up')) state = 'up';\n return { name, status, state };\n });\n}\n\n/** Containers that aren't cleanly up. Used to decide what to dump logs for. */\nexport function isBrokenContainer(c: ContainerLine): boolean {\n return c.state === 'restarting' || c.state === 'exited' || c.state === 'up-unhealthy';\n}\n\n/**\n * Map a container name back to its compose service.\n *\n * docker-compose names containers `<project>-<service>-<replica>`. The\n * sandbox platform sets the project to `workspace` via\n * `--project-directory /workspace` (see `SANDBOX_COMPOSE_BASE` in\n * apps/api/.../sandbox-cli/service.ts), so the common case is\n * `workspace-<svc>-<n>`. Fall back to stripping the trailing replica\n * index only, so attribution still works if the project name ever\n * changes or someone uses an explicit `container_name:` override.\n */\nexport function containerNameToService(containerName: string): string {\n const withProject = containerName.match(/^workspace-(.+)-\\d+$/);\n if (withProject) return withProject[1]!;\n const withoutProject = containerName.match(/^(.+)-\\d+$/);\n if (withoutProject) return withoutProject[1]!;\n return containerName;\n}\n\nasync function fetchServiceLogs(\n apiUrl: string,\n token: string,\n instanceId: string,\n service: string,\n tail: number\n): Promise<string> {\n const res = await apiRequest<{ ok: boolean; error?: string; data: { logs: string } }>(\n apiUrl,\n token,\n 'POST',\n `/org/environments/instances/${instanceId}/docker/logs`,\n { service, tail }\n );\n if (!res.ok) return `(log fetch failed: ${res.error ?? 'unknown'})`;\n return res.data?.logs ?? '';\n}\n\nasync function handleVerify(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n // --keep-instance is kept as a success-path alias (existing behavior).\n // On failure the probe is now preserved by default so the user can debug;\n // pass --auto-terminate-on-failure for CI where you want cleanup anyway.\n const keepInstance = hasFlag(argv, '--keep-instance');\n const autoTerminateOnFailure = hasFlag(argv, '--auto-terminate-on-failure');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox verify <template-id>');\n process.exit(1);\n }\n\n console.log(`Verifying template ${templateId}...`);\n\n // Kick off a verification instance — server bypasses the \"verified\" gate\n // via verificationMode but otherwise runs the full provisioning flow.\n const verifyRes = await apiRequest<{ ok: boolean; error?: string; data: { instanceId: string; expiresAt: string } }>(\n apiUrl, token, 'POST', `/org/environments/templates/${templateId}/verify`, {}\n );\n if (!verifyRes.ok) {\n console.error(`Error: ${verifyRes.error}`);\n process.exit(1);\n }\n const instanceId = verifyRes.data.instanceId;\n console.log(` Verification instance: ${instanceId}`);\n\n // Poll diagnostics until instance reaches 'running' or a terminal state.\n const POLL_INTERVAL_MS = 10_000;\n const TIMEOUT_MS = 600_000; // 10 minutes\n const DETAIL_DUMP_INTERVAL_MS = 30_000; // rate-limit noisy dumps\n const LOG_TAIL_LINES = 40;\n const startTime = Date.now();\n let finalStatus = '';\n let publicUrl: string | undefined;\n let lastDetailDumpAt = 0;\n let routes: ServiceRoute[] = [];\n let routesFetched = false;\n\n while (Date.now() - startTime < TIMEOUT_MS) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const diag = await apiRequest<{ ok: boolean; error?: string; data: DiagnosticsResult }>(\n apiUrl, token, 'GET', `/org/environments/instances/${instanceId}/diagnostics`,\n undefined,\n { timeoutMs: 60_000 }\n );\n if (!diag.ok) continue;\n\n const now = Date.now();\n const elapsed = Math.round((now - startTime) / 1000);\n const remaining = Math.max(0, Math.round((TIMEOUT_MS - (now - startTime)) / 1000));\n const status = String((diag.data.instance as { status?: string; publicUrl?: string }).status ?? '');\n publicUrl = (diag.data.instance as { publicUrl?: string }).publicUrl;\n const appOutput = 'stdout' in diag.data.appHealth ? diag.data.appHealth.stdout : '';\n const appUp = appOutput.length > 0 && !appOutput.includes('UNREACHABLE');\n const dockerOutput = 'stdout' in diag.data.docker ? diag.data.docker.stdout : '';\n const containers = parseDockerPs(dockerOutput);\n const broken = containers.filter(isBrokenContainer);\n\n // Compact progress line (overwriting, like before) — adds remaining time.\n const ttl = remaining > 60 ? `${elapsed}s elapsed` : `${remaining}s remaining`;\n process.stdout.write(\n `\\r [${ttl}] status: ${status}, app: ${appUp ? 'up' : 'waiting'}, containers: ${containers.length}, unhealthy: ${broken.length} `\n );\n\n if (status === 'running' && appUp) {\n process.stdout.write('\\n');\n finalStatus = 'running';\n break;\n }\n if (status === 'failed' || status === 'terminated') {\n process.stdout.write('\\n');\n finalStatus = status;\n break;\n }\n\n // When the app is still down and at least one container is broken,\n // dump details + log tails once every DETAIL_DUMP_INTERVAL_MS so the\n // user actually sees what's failing instead of staring at a spinner.\n const shouldDump =\n !appUp &&\n broken.length > 0 &&\n now - lastDetailDumpAt >= DETAIL_DUMP_INTERVAL_MS;\n if (shouldDump) {\n lastDetailDumpAt = now;\n process.stdout.write('\\n');\n console.log('');\n console.log(` App unreachable after ${elapsed}s. Container state:`);\n for (const c of containers) {\n console.log(` ${c.name.padEnd(40)} ${c.status}`);\n }\n console.log('');\n // Per-broken-container log tails. Cap to MAX_LOG_CONTAINERS to avoid\n // SSM call amplification on pathological cases (a template with 6\n // restart-looping services would otherwise issue 6 sequential SSM\n // calls every 30s). Fetch in parallel — these are independent.\n const MAX_LOG_CONTAINERS = 3;\n const toFetch = broken.slice(0, MAX_LOG_CONTAINERS);\n const overflow = broken.length - toFetch.length;\n const fetched = await Promise.all(\n toFetch.map((c) =>\n fetchServiceLogs(apiUrl, token, instanceId, containerNameToService(c.name), LOG_TAIL_LINES)\n .then((logs) => ({ c, logs }))\n )\n );\n for (const { c, logs } of fetched) {\n const tail = logs.trim().split('\\n').slice(-LOG_TAIL_LINES).join('\\n ');\n console.log(` --- ${c.name} (${c.state}) ---`);\n console.log(` ${tail || '(no logs)'}`);\n console.log('');\n }\n if (overflow > 0) {\n console.log(\n ` (+${overflow} more broken container${overflow === 1 ? '' : 's'} — re-run with: canary sandbox logs ${instanceId} --service <name>)`\n );\n console.log('');\n }\n // Attribution: if nginx-proxy is looping because of a labeled upstream\n // that's exited, call that out so the user doesn't chase nginx's\n // \"host not found in upstream\" as the root cause.\n if (!routesFetched) {\n routes = await fetchInstanceRoutes(apiUrl, token, instanceId);\n routesFetched = true;\n }\n const nginxProxy = containers.find((c) => containerNameToService(c.name) === 'nginx-proxy');\n if (nginxProxy?.state === 'restarting' && routes.length > 0) {\n const failedUpstreams = routes\n .map((r) => ({\n route: r.route,\n service: r.service,\n container: broken.find((c) => containerNameToService(c.name) === r.service),\n }))\n .filter((x) => x.container);\n if (failedUpstreams.length > 0) {\n for (const fu of failedUpstreams) {\n console.log(\n ` >> nginx-proxy is restart-looping because upstream '${fu.service}' (route '${fu.route}') is ${fu.container!.state}. Read that service's logs above, not nginx's.`\n );\n }\n console.log('');\n }\n }\n }\n }\n\n if (finalStatus !== 'running') {\n console.error('');\n console.error(`Verification failed — instance ended in status '${finalStatus || 'timeout'}'.`);\n if (publicUrl) console.error(` Instance URL: ${publicUrl}`);\n console.error(` Instance ID: ${instanceId}`);\n console.error(` Debug with: canary sandbox diagnostics ${instanceId}`);\n console.error(` canary sandbox logs ${instanceId} --service <name>`);\n console.error(` canary sandbox run-command ${instanceId} 'docker ps -a'`);\n if (autoTerminateOnFailure) {\n await apiRequest(apiUrl, token, 'POST', `/org/environments/instances/${instanceId}/terminate`);\n console.error(` Terminated (--auto-terminate-on-failure).`);\n } else {\n // Default flip (was: auto-terminate). Call it out so CI users don't\n // silently accumulate orphan instances.\n console.error(` Instance preserved by default for debugging. Pass --auto-terminate-on-failure in CI.`);\n console.error(` Terminate manually with:`);\n console.error(` canary sandbox terminate ${instanceId}`);\n }\n process.exit(1);\n }\n\n // We just observed the instance reach status === 'running' && appUp.\n // That's the same observation that backs the server-running and\n // server-accessible checklist items, so flip them too — best-effort\n // (templates without those items in their checklist 404 silently).\n const evidenceSummary = `Verified via canary sandbox verify — fresh instance ${instanceId} came up healthy.`;\n for (const itemId of ['server-running', 'server-accessible']) {\n await apiRequest(\n apiUrl,\n token,\n 'POST',\n `/org/environments/templates/${templateId}/checklist/${itemId}/complete`,\n { status: 'completed', summary: evidenceSummary }\n ).catch(() => {\n // Item not present on this checklist profile — fine.\n });\n }\n\n // Mark the template-verified checklist item complete — this is what flips\n // template.status to 'verified' (via ChecklistService.completeChecklistItem).\n const completeRes = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/org/environments/templates/${templateId}/checklist/template-verified/complete`,\n {\n status: 'completed',\n summary: evidenceSummary,\n }\n );\n if (!completeRes.ok) {\n console.error(`Failed to record verification: ${completeRes.error}`);\n console.error(`Instance ${instanceId} left running for inspection.`);\n process.exit(1);\n }\n\n if (!keepInstance) {\n await apiRequest(apiUrl, token, 'POST', `/org/environments/instances/${instanceId}/terminate`);\n console.log(` Terminated verification instance.`);\n } else {\n console.log(` --keep-instance: instance ${instanceId} left running${publicUrl ? ` at ${publicUrl}` : ''}.`);\n }\n\n // Confirm the template actually flipped to verified. The status flip only\n // happens when every item in the checklist profile is terminal\n // (completed or skipped); if other items are still pending, the probe\n // succeeded but the template stays in its prior status.\n const templateAfter = await apiRequest<{ ok: boolean; data?: { status?: string } }>(\n apiUrl,\n token,\n 'GET',\n `/org/environments/templates/${templateId}`\n ).catch(() => ({ ok: false }) as { ok: boolean; data?: { status?: string } });\n const templateStatus = templateAfter.data?.status;\n const verified = templateStatus === 'verified';\n\n if (json) {\n console.log(JSON.stringify({ templateId, verified, status: templateStatus, instanceId, publicUrl }, null, 2));\n return;\n }\n\n if (verified) {\n console.log('Template verified.');\n return;\n }\n\n // Probe passed but status didn't flip — surface the pending items so the\n // user knows what to complete/skip before re-running verify.\n console.log(`Verification probe passed (instance ${instanceId} came up healthy),`);\n console.log(`but template status is still '${templateStatus ?? 'unknown'}'.`);\n type ChecklistItemSummary = { id: string; label: string; itemStatus?: { status?: string } };\n const checklistRes = await apiRequest<{ ok: boolean; data?: ChecklistItemSummary[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/environments/templates/${templateId}/checklist`\n ).catch(() => ({ ok: false }) as { ok: boolean; data?: ChecklistItemSummary[] });\n const pending = (checklistRes.data ?? []).filter((it) => {\n const s = it.itemStatus?.status ?? 'pending';\n return s !== 'completed' && s !== 'skipped';\n });\n if (pending.length > 0) {\n console.log('Pending checklist items must be completed or skipped:');\n for (const item of pending) {\n console.log(` - ${item.label} (${item.id})`);\n }\n console.log('');\n console.log('Complete: canary sandbox checklist complete <template-id> <item-id> --status success --summary \"...\"');\n console.log('Skip: canary sandbox checklist skip <template-id> <item-id>');\n }\n process.exit(1);\n}\n\nasync function handleArtifactGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const type = positional[1];\n const outputFile = getArgValue(argv, '--output');\n\n if (!templateId || !type) {\n console.error('Error: template ID and artifact type required. Usage: canary sandbox artifact get <template-id> <type>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: Artifact }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}/artifacts/${type}`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (outputFile) {\n const { writeFileSync } = await import('node:fs');\n writeFileSync(outputFile, res.data.content ?? '', 'utf-8');\n console.log(`Written to ${outputFile}`);\n } else {\n process.stdout.write(res.data.content ?? '');\n }\n}\n\nasync function handleArtifactCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const type = positional[1];\n const filePath = positional[2];\n const json = hasFlag(argv, '--json');\n\n if (!templateId || !type || !filePath) {\n console.error('Error: all args required. Usage: canary sandbox artifact create <template-id> <type> <file>');\n process.exit(1);\n }\n\n // Keep in sync with WellKnownArtifactType in packages/types/src/sandbox-tasks.ts + 'file' (custom with --path)\n const WELL_KNOWN_TYPES = ['docker-compose', 'dockerfile', 'startup-script', 'setup-script', 'seed-script', 'environment-config', 'file'];\n if (!WELL_KNOWN_TYPES.includes(type)) {\n console.error(`Error: invalid artifact type \"${type}\". Valid types: ${WELL_KNOWN_TYPES.join(', ')}`);\n process.exit(1);\n }\n\n // File artifacts require --path <destination>\n const destinationPath = getArgValue(argv, '--path');\n if (type === 'file' && !destinationPath) {\n console.error('Error: file artifacts require --path <destination>. Example: --path /workspace/.canary/vite.sandbox.config.ts');\n process.exit(1);\n }\n if (destinationPath && !destinationPath.startsWith('/workspace/.canary/')) {\n const suggestedName = destinationPath.split('/').filter(Boolean).pop() ?? 'yourfile';\n console.error(\n 'Error: --path must be under /workspace/.canary/ (the repo tree is user-owned — sandbox files live in .canary/).\\n' +\n ` try: --path /workspace/.canary/${suggestedName}`\n );\n process.exit(1);\n }\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch (err) {\n console.error(`Error reading file: ${err}`);\n process.exit(1);\n }\n\n // Derive filename from path\n const filename = filePath.split('/').pop() ?? filePath;\n\n // Artifact upload writes through to the live authoring instance, which on\n // first push (or a large file) can outlast 30s easily. 90s lines up with\n // the slowest legitimate upload we've observed.\n const res = await apiRequest<{\n ok: boolean;\n error?: string;\n data?: { kind: 'created' | 'replaced'; previousPath?: string };\n }>(\n apiUrl, token, 'PUT', `/org/environments/templates/${templateId}/artifacts`, {\n artifactType: type,\n filename,\n content,\n ...(destinationPath ? { destinationPath } : {}),\n },\n { timeoutMs: 90_000 }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const kind = res.data?.kind;\n const marker = kind === 'replaced' ? ' (replaced)' : kind === 'created' ? ' (created)' : '';\n console.log(`Artifact uploaded: ${type} (${filename}, ${content.length} bytes)${marker}`);\n if (kind === 'replaced' && res.data?.previousPath) {\n console.log(` previous destination removed: ${res.data.previousPath}`);\n }\n}\n\nasync function handleBuild(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const json = hasFlag(argv, '--json');\n const noWait = hasFlag(argv, '--no-wait');\n const instanceId = positional[0];\n\n if (!instanceId) {\n console.error('Error: instance ID required. Usage: canary sandbox build <instance-id>');\n process.exit(1);\n }\n\n console.log('Building sandbox (this takes a few minutes)...');\n\n // The build is async by design: a single HTTP connection cannot reliably\n // span a multi-minute build (ALB caps, our own client timeouts, flaky\n // networks). Kick the build off with a short timeout — the server has\n // already started the work by the time it would otherwise reply — then\n // move to polling diagnostics for the truth.\n const KICKOFF_TIMEOUT_MS = 8_000;\n\n let buildCompleted = false;\n let buildResult: { stdout: string; stderr: string; exitCode: number } | null = null;\n\n const result = await apiFetch(`${apiUrl}/org/environments/instances/${instanceId}/build`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n token,\n timeoutMs: KICKOFF_TIMEOUT_MS,\n });\n\n if (result.ok) {\n // Fast path: server responded within the kickoff window (cached/no-op build).\n const data = (await result.response.json().catch(() => null)) as\n | { ok: boolean; error?: string; data?: { stdout: string; stderr: string; exitCode: number } }\n | null;\n if (data?.ok && data.data) {\n buildCompleted = true;\n buildResult = data.data;\n } else if (data && !data.ok) {\n console.error(`Error: ${data.error ?? 'build failed'}`);\n process.exit(1);\n }\n } else {\n const { failure } = result;\n // network = our kickoff timeout firing; 502/504 = gateway giving up while\n // the build runs on. Both mean \"watch via polling, not an error\".\n const isExpectedAsync =\n failure.kind === 'network' ||\n (failure.kind === 'http-error' && (failure.status === 502 || failure.status === 504));\n if (!isExpectedAsync) {\n if (isTerminalFailure(failure)) exitOnFailure(failure);\n console.error(`Error: ${failure.message}`);\n process.exit(1);\n }\n }\n\n // If build completed synchronously, print results and exit\n if (buildCompleted && buildResult) {\n if (json) {\n console.log(JSON.stringify(buildResult, null, 2));\n return;\n }\n\n if (buildResult.stdout) {\n process.stdout.write(buildResult.stdout);\n if (!buildResult.stdout.endsWith('\\n')) process.stdout.write('\\n');\n }\n if (buildResult.stderr) {\n process.stderr.write(`STDERR: ${buildResult.stderr}`);\n if (!buildResult.stderr.endsWith('\\n')) process.stderr.write('\\n');\n }\n\n if (buildResult.exitCode === 0) {\n console.log('Build complete.');\n } else {\n console.error(`Build failed with exit code ${buildResult.exitCode}`);\n process.exit(1);\n }\n return;\n }\n\n // Build is async — poll diagnostics until the app is reachable or timeout\n if (noWait) {\n console.log('Build started. Use diagnostics to monitor progress:');\n console.log(` canary sandbox diagnostics ${instanceId}`);\n return;\n }\n\n console.log('Build started, watching for services...');\n\n const BUILD_POLL_TIMEOUT_MS = 300_000; // 5 minutes\n const POLL_INTERVAL_MS = 10_000;\n const startTime = Date.now();\n\n while (Date.now() - startTime < BUILD_POLL_TIMEOUT_MS) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const diag = await apiRequest<{ ok: boolean; error?: string; data: DiagnosticsResult }>(\n apiUrl, token, 'GET', `/org/environments/instances/${instanceId}/diagnostics`,\n undefined,\n { timeoutMs: 60_000 }\n );\n\n if (!diag.ok) continue;\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n const dockerOutput = 'stdout' in diag.data.docker ? diag.data.docker.stdout : '';\n const appOutput = 'stdout' in diag.data.appHealth ? diag.data.appHealth.stdout : '';\n const appUp = appOutput.length > 0 && !appOutput.includes('UNREACHABLE');\n\n // Show a compact progress line\n const containerCount = (dockerOutput.match(/\\n/g) || []).length + (dockerOutput ? 1 : 0);\n const healthyCount = (dockerOutput.match(/\\(healthy\\)/g) || []).length;\n process.stdout.write(`\\r [${elapsed}s] containers: ${containerCount}, healthy: ${healthyCount}, app: ${appUp ? 'up' : 'waiting'} `);\n\n // Trust the HTTP probe: if nginx is serving the app on :3000 or :8000, we're done.\n // Compose healthchecks are optional and most user services don't declare them.\n if (appUp) {\n process.stdout.write('\\n');\n console.log('Build complete.');\n return;\n }\n }\n\n process.stdout.write('\\n');\n console.error('Build timed out waiting for the app to respond. Check diagnostics and logs:');\n console.error(` canary sandbox diagnostics ${instanceId}`);\n console.error(` canary sandbox logs ${instanceId} --service <name>`);\n process.exit(1);\n}\n\nasync function handleRunCommand(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const service = getArgValue(argv, '--service');\n const timeoutFlag = getArgValue(argv, '--timeout');\n\n // Strip our flags (--json, --service <value>, --timeout <value>) so they\n // don't leak into the remote command.\n const filtered = argv.filter((a, i, arr) => {\n if (a === '--json') return false;\n if (a === '--service' || a === '--timeout') return false;\n if (i > 0 && (arr[i - 1] === '--service' || arr[i - 1] === '--timeout')) return false;\n return true;\n });\n\n // First non-flag arg is the instance ID; everything after it is the command\n // (including flags like -la that belong to the remote command, not to us)\n const firstNonFlag = filtered.findIndex((a) => !a.startsWith('-'));\n const instanceId = firstNonFlag >= 0 ? filtered[firstNonFlag] : undefined;\n const command = firstNonFlag >= 0 ? filtered.slice(firstNonFlag + 1).join(' ') : '';\n\n if (!instanceId || !command) {\n console.error('Error: instance ID and command required. Usage: canary sandbox run-command <instance-id> [--service <name>] [--timeout <ms>] <command...>');\n process.exit(1);\n }\n\n // Server-side run-command caps at 55s (SANDBOX_COMMAND_TIMEOUT). Default\n // the CLI just past that so we surface the server's typed timeout rather\n // than an opaque client-side cancel. For longer ops (test suites,\n // playwright), pass a higher value or use first-class actions.\n const timeoutMs = timeoutFlag ? Math.max(parseInt(timeoutFlag, 10), 1000) : 60_000;\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: { stdout: string; stderr: string; exitCode: number } }>(\n apiUrl, token, 'POST', `/org/environments/instances/${instanceId}/run-command`,\n { command, ...(service ? { service } : {}) },\n { timeoutMs }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n if (res.data.stdout) {\n process.stdout.write(res.data.stdout);\n if (!res.data.stdout.endsWith('\\n')) process.stdout.write('\\n');\n }\n if (res.data.stderr) {\n process.stderr.write(`STDERR: ${res.data.stderr}`);\n if (!res.data.stderr.endsWith('\\n')) process.stderr.write('\\n');\n }\n if (res.data.exitCode !== 0) {\n console.log(`Exit code: ${res.data.exitCode}`);\n }\n}\n\nasync function handleDiagnostics(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const instanceId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!instanceId) {\n console.error('Error: instance ID required. Usage: canary sandbox diagnostics <instance-id>');\n process.exit(1);\n }\n\n // Server-side DIAGNOSTICS_TIMEOUT_MS is 30s; the client needs a bit more\n // headroom than that or we race the server and report a misleading client\n // timeout for a server-side timeout.\n const res = await apiRequest<{ ok: boolean; error?: string; data: DiagnosticsResult }>(\n apiUrl, token, 'GET', `/org/environments/instances/${instanceId}/diagnostics`,\n undefined,\n { timeoutMs: 60_000 }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n const routes = await fetchInstanceRoutes(apiUrl, token, instanceId);\n const data = { ...res.data, routes };\n\n if (json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n const d = data;\n\n console.log('=== Instance ===');\n for (const [key, value] of Object.entries(d.instance)) {\n console.log(` ${key}: ${value}`);\n }\n\n if (d.provision) {\n console.log('');\n console.log('=== Provisioning ===');\n console.log(` phase: ${d.provision.phase}`);\n console.log(` jobStatus: ${d.provision.jobStatus}`);\n if (d.provision.startedAt) console.log(` startedAt: ${d.provision.startedAt}`);\n if (d.provision.elapsedSeconds !== null) console.log(` elapsed: ${d.provision.elapsedSeconds}s`);\n if (d.provision.lastError) console.log(` lastError: ${d.provision.lastError}`);\n }\n\n const sections: Array<[string, CommandOrError]> = [\n ['Docker Containers', d.docker],\n ['Git Status', d.git],\n ['Disk Usage', d.disk],\n ['Agent Health', d.agentHealth],\n ['App Health', d.appHealth],\n ];\n\n for (const [title, result] of sections) {\n console.log('');\n console.log(`=== ${title} ===`);\n if ('error' in result) {\n console.log(` Error: ${result.error}`);\n } else {\n if (result.stdout) console.log(result.stdout);\n if (result.stderr) console.log(` STDERR: ${result.stderr}`);\n }\n }\n}\n\nasync function handleLogs(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const instanceId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!instanceId) {\n console.error('Error: instance ID required. Usage: canary sandbox logs <instance-id>');\n process.exit(1);\n }\n\n const service = getArgValue(argv, '--service');\n const tail = getArgValue(argv, '--tail') ?? '200';\n\n // Don't send `service: ''` — the server's regex validator rejects empty\n // strings even though the field is optional, and the route then returns\n // 500 instead of an all-services tail. Omit the field when absent.\n const res = await apiRequest<{ ok: boolean; error?: string; data: { logs: string } }>(\n apiUrl, token, 'POST', `/org/environments/instances/${instanceId}/docker/logs`, {\n ...(service ? { service } : {}),\n tail: parseInt(tail, 10),\n }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n process.stdout.write(res.data.logs ?? '(no logs)');\n}\n\nasync function handleTerminate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const instanceId = positional[0];\n\n if (!instanceId) {\n console.error('Error: instance ID required. Usage: canary sandbox terminate <instance-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl, token, 'POST', `/org/environments/instances/${instanceId}/terminate`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n console.log(`Instance ${instanceId} termination initiated.`);\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox delete <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl, token, 'DELETE', `/org/environments/templates/${templateId}`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n console.log(`Template ${templateId} deleted.`);\n}\n\n// ---------------------------------------------------------------------------\n// Action handlers\n// ---------------------------------------------------------------------------\n\ntype ActionDef = {\n id: string;\n slug: string;\n label: string;\n description: string | null;\n icon: string | null;\n enabled: boolean;\n inputSchema: Record<string, unknown>;\n outputSchema: Record<string, unknown> | null;\n scriptContent: string;\n timeoutMs: number;\n createdAt: string;\n updatedAt: string;\n};\n\ntype ActionExecution = {\n id: string;\n actionId: string;\n instanceId: string;\n source: string;\n status: string;\n result: Record<string, unknown> | null;\n stdout: string | null;\n stderr: string | null;\n exitCode: number | null;\n durationMs: number | null;\n error: string | null;\n createdAt: string;\n};\n\nasync function handleActionList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox action list <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: ActionDef[] }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}/actions`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const actions = res.data ?? [];\n if (actions.length === 0) {\n console.log('No actions defined for this template.');\n return;\n }\n\n console.log(`Actions (${actions.length}):`);\n for (const a of actions) {\n const status = a.enabled ? '' : ' [disabled]';\n console.log(` ${pad(a.slug, 30)} ${pad(a.label, 25)}${status}`);\n }\n}\n\nasync function handleActionGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const slug = positional[1];\n const json = hasFlag(argv, '--json');\n\n if (!templateId || !slug) {\n console.error('Error: template ID and slug required. Usage: canary sandbox action get <template-id> <slug>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: ActionDef }>(\n apiUrl, token, 'GET', `/org/environments/templates/${templateId}/actions/${slug}`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const a = res.data;\n console.log(`Action: ${a.slug}`);\n console.log(` Label: ${a.label}`);\n console.log(` Description: ${a.description ?? '(none)'}`);\n console.log(` Icon: ${a.icon ?? '(none)'}`);\n console.log(` Enabled: ${a.enabled}`);\n console.log(` Timeout: ${a.timeoutMs}ms`);\n console.log(` Input Schema:`);\n console.log(` ${JSON.stringify(a.inputSchema, null, 2).split('\\n').join('\\n ')}`);\n if (a.outputSchema) {\n console.log(` Output Schema:`);\n console.log(` ${JSON.stringify(a.outputSchema, null, 2).split('\\n').join('\\n ')}`);\n }\n console.log(` Script:`);\n console.log(` ${a.scriptContent.split('\\n').join('\\n ')}`);\n}\n\nasync function handleActionCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const slug = positional[1];\n const json = hasFlag(argv, '--json');\n\n if (!templateId || !slug) {\n console.error('Error: template ID and slug required. Usage: canary sandbox action create <template-id> <slug> [options]');\n process.exit(1);\n }\n\n const scriptPath = getArgValue(argv, '--script');\n const inputSchemaPath = getArgValue(argv, '--input-schema');\n const outputSchemaPath = getArgValue(argv, '--output-schema');\n const credentialOutputConfigPath = getArgValue(argv, '--credential-output-config');\n const label = getArgValue(argv, '--label') ?? slug.replace(/-/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n const description = getArgValue(argv, '--description');\n const icon = getArgValue(argv, '--icon');\n const timeoutStr = getArgValue(argv, '--timeout');\n const encryptScript = hasFlag(argv, '--encrypt-script');\n const credentialTemplateId = getArgValue(argv, '--credential-template');\n const provisioningMode = getArgValue(argv, '--provisioning-mode');\n const runOnProvision = hasFlag(argv, '--run-on-provision');\n const provisionOrderStr = getArgValue(argv, '--provision-order');\n\n if (provisioningMode && provisioningMode !== 'shared' && provisioningMode !== 'unique') {\n console.error(\"Error: --provisioning-mode must be 'shared' or 'unique'\");\n process.exit(1);\n }\n\n if (provisionOrderStr && !/^-?\\d+$/.test(provisionOrderStr)) {\n console.error('Error: --provision-order must be an integer');\n process.exit(1);\n }\n\n if (!scriptPath) {\n console.error('Error: --script <file> is required');\n process.exit(1);\n }\n if (!inputSchemaPath) {\n console.error('Error: --input-schema <file> is required');\n process.exit(1);\n }\n\n let scriptContent: string;\n try {\n scriptContent = readFileSync(scriptPath, 'utf-8');\n } catch (err) {\n console.error(`Error reading script file: ${err}`);\n process.exit(1);\n }\n\n let inputSchema: Record<string, unknown>;\n try {\n inputSchema = JSON.parse(readFileSync(inputSchemaPath, 'utf-8'));\n } catch (err) {\n console.error(`Error reading input schema file: ${err}`);\n process.exit(1);\n }\n\n let outputSchema: Record<string, unknown> | undefined;\n if (outputSchemaPath) {\n try {\n outputSchema = JSON.parse(readFileSync(outputSchemaPath, 'utf-8'));\n } catch (err) {\n console.error(`Error reading output schema file: ${err}`);\n process.exit(1);\n }\n }\n\n let credentialOutputConfig: Record<string, unknown> | undefined;\n if (credentialOutputConfigPath) {\n try {\n credentialOutputConfig = JSON.parse(readFileSync(credentialOutputConfigPath, 'utf-8'));\n } catch (err) {\n console.error(`Error reading credential output config file: ${err}`);\n process.exit(1);\n }\n }\n\n const body: Record<string, unknown> = {\n label,\n scriptContent,\n inputSchema,\n ...(description ? { description } : {}),\n ...(icon ? { icon } : {}),\n ...(outputSchema ? { outputSchema } : {}),\n ...(credentialOutputConfig ? { credentialOutputConfig } : {}),\n ...(credentialTemplateId ? { credentialTemplateId } : {}),\n ...(provisioningMode ? { provisioningMode } : {}),\n ...(runOnProvision ? { runOnProvision: true } : {}),\n ...(provisionOrderStr ? { provisionOrder: parseInt(provisionOrderStr, 10) } : {}),\n ...(timeoutStr ? { timeoutMs: parseInt(timeoutStr, 10) } : {}),\n ...(encryptScript ? { scriptEncrypted: true } : {}),\n };\n\n const res = await apiRequest<{ ok: boolean; error?: string; data?: ActionDef }>(\n apiUrl, token, 'PUT', `/org/environments/templates/${templateId}/actions/${slug}`, body\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n console.log(`Action '${slug}' saved (${scriptContent.length} bytes script, label: \"${label}\")`);\n}\n\nasync function handleActionDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const slug = positional[1];\n\n if (!templateId || !slug) {\n console.error('Error: template ID and slug required. Usage: canary sandbox action delete <template-id> <slug>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl, token, 'DELETE', `/org/environments/templates/${templateId}/actions/${slug}`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n console.log(`Action '${slug}' deleted.`);\n}\n\nasync function handleActionExecute(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const instanceId = positional[0];\n const slug = positional[1];\n const json = hasFlag(argv, '--json');\n\n if (!instanceId || !slug) {\n console.error('Error: instance ID and slug required. Usage: canary sandbox action execute <instance-id> <slug> [options]');\n process.exit(1);\n }\n\n // Collect params from --param key=value flags\n let params: Record<string, unknown> = {};\n\n const paramsFile = getArgValue(argv, '--params-file');\n if (paramsFile) {\n try {\n params = JSON.parse(readFileSync(paramsFile, 'utf-8'));\n } catch (err) {\n console.error(`Error reading params file: ${err}`);\n process.exit(1);\n }\n }\n\n // --param flags override params-file\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--param' && argv[i + 1]) {\n const [key, ...valueParts] = argv[i + 1]!.split('=');\n if (key && valueParts.length > 0) {\n params[key] = valueParts.join('=');\n }\n i++; // skip value\n }\n }\n\n interface ActionExecuteResponse {\n executionId: string;\n status: string;\n result: unknown;\n stdout: string | null;\n stderr: string | null;\n exitCode: number | null;\n durationMs: number | null;\n error: string | null;\n credentialId?: string | null;\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data?: ActionExecuteResponse }>(\n apiUrl, token, 'POST', `/org/environments/instances/${instanceId}/actions/${slug}/execute`, {\n params,\n source: 'cli',\n }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const exec = res.data!;\n const statusIcon = exec.status === 'completed' ? '[done]' : exec.status === 'failed' ? '[FAIL]' : `[${exec.status}]`;\n console.log(`${statusIcon} Action '${slug}' ${exec.status} (${exec.durationMs ?? 0}ms, exit ${exec.exitCode ?? '?'})`);\n if (exec.result) {\n console.log(`Result: ${JSON.stringify(exec.result, null, 2)}`);\n }\n if (exec.credentialId) {\n console.log(`Credential: ${exec.credentialId} (linked in property vault)`);\n }\n if (exec.status === 'failed' && exec.stderr) {\n // Cap by bytes first so a single multi-MB line doesn't blow up the terminal,\n // then by line count for readability.\n const tail = exec.stderr.slice(-10_000).trim().split('\\n').slice(-20).join('\\n');\n console.log(`Stderr (last 20 lines):\\n${tail}`);\n }\n if (exec.error) {\n console.log(`Error: ${exec.error}`);\n }\n}\n\nasync function handleActionExecutions(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const instanceId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!instanceId) {\n console.error('Error: instance ID required. Usage: canary sandbox action executions <instance-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<{ ok: boolean; error?: string; data: ActionExecution[] }>(\n apiUrl, token, 'GET', `/org/environments/instances/${instanceId}/actions/executions`\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n\n const execs = res.data ?? [];\n if (execs.length === 0) {\n console.log('No executions yet.');\n return;\n }\n\n console.log('Executions:');\n for (const e of execs) {\n const icon = STATUS_ICONS[e.status] ?? `[${e.status}]`;\n const dur = e.durationMs !== null && e.durationMs !== undefined ? `${e.durationMs}ms` : '?ms';\n console.log(` ${icon} ${pad(e.id.slice(0, 8), 10)} ${pad(e.source, 6)} ${pad(e.status, 12)} ${pad(dur, 8)} ${formatDate(e.createdAt)}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Multi-repo: manage repos linked to a sandbox template\n// ---------------------------------------------------------------------------\n\ntype TemplateRepoLink = {\n id: string;\n templateId: string;\n propertyGithubRepoId: string;\n role: string | null;\n branch: string;\n subdirectory: string | null;\n serviceName: string;\n};\n\n/**\n * Parse `role=owner/name@branch:subdir` (branch and subdir optional) into the\n * pieces the API expects. Used by `canary sandbox repo add --spec ...`.\n */\nfunction parseRepoSpec(spec: string): {\n role?: string;\n repoFullName: string;\n branch?: string;\n subdirectory?: string;\n} {\n let rest = spec;\n let role: string | undefined;\n const eq = rest.indexOf('=');\n if (eq > -1 && !rest.slice(0, eq).includes('/')) {\n role = rest.slice(0, eq);\n rest = rest.slice(eq + 1);\n }\n let subdirectory: string | undefined;\n const colon = rest.indexOf(':');\n if (colon > -1) {\n subdirectory = rest.slice(colon + 1);\n rest = rest.slice(0, colon);\n }\n let branch: string | undefined;\n const at = rest.indexOf('@');\n if (at > -1) {\n branch = rest.slice(at + 1);\n rest = rest.slice(0, at);\n }\n return { role, repoFullName: rest, branch, subdirectory };\n}\n\nasync function handleRepoList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const templateId = getArgValue(argv, '--template');\n if (!templateId) {\n console.error('Error: --template is required.');\n process.exit(1);\n }\n\n const result = await apiRequest<{ ok: boolean; items?: TemplateRepoLink[]; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/org/environments/templates/${templateId}/repos`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result.items ?? [], null, 2));\n return;\n }\n\n const items = result.items ?? [];\n if (items.length === 0) {\n console.log('No repos linked to this template.');\n return;\n }\n for (const r of items) {\n const role = r.role ? ` [${r.role}]` : '';\n const subdir = r.subdirectory ? `:${r.subdirectory}` : '';\n console.log(` ${r.serviceName} → ${r.propertyGithubRepoId}@${r.branch}${subdir}${role} (link=${r.id})`);\n }\n}\n\nasync function handleRepoAdd(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const templateId = getArgValue(argv, '--template');\n const propertyGithubRepoId = getArgValue(argv, '--property-github-repo-id');\n const spec = getArgValue(argv, '--spec');\n const role = getArgValue(argv, '--role');\n const branch = getArgValue(argv, '--branch');\n const subdirectory = getArgValue(argv, '--subdirectory');\n const serviceName = getArgValue(argv, '--service-name');\n\n if (!templateId || !propertyGithubRepoId) {\n console.error('Error: --template and --property-github-repo-id are required.');\n console.error('Tip: link the repo to the property first via `canary property repo link`, then pass its id here.');\n process.exit(1);\n }\n\n const parsed: ReturnType<typeof parseRepoSpec> | { role?: undefined; branch?: undefined; subdirectory?: undefined } = spec ? parseRepoSpec(spec) : {};\n\n const body: Record<string, unknown> = { propertyGithubRepoId };\n const finalRole = role ?? parsed.role;\n const finalBranch = branch ?? parsed.branch;\n const finalSubdir = subdirectory ?? parsed.subdirectory;\n if (finalRole !== undefined) body.role = finalRole;\n if (finalBranch !== undefined) body.branch = finalBranch;\n if (finalSubdir !== undefined) body.subdirectory = finalSubdir;\n if (serviceName !== undefined) body.serviceName = serviceName;\n\n const result = await apiRequest<{ ok: boolean; data?: TemplateRepoLink; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/org/environments/templates/${templateId}/repos`,\n body\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n if (json) console.log(JSON.stringify(result.data, null, 2));\n else console.log(`Linked repo to template ${templateId} (link=${result.data?.id})`);\n}\n\nasync function handleRepoUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const templateId = getArgValue(argv, '--template');\n const linkId = getArgValue(argv, '--link-id');\n const role = getArgValue(argv, '--role');\n const branch = getArgValue(argv, '--branch');\n const subdirectory = getArgValue(argv, '--subdirectory');\n const serviceName = getArgValue(argv, '--service-name');\n\n if (!templateId || !linkId) {\n console.error('Error: --template and --link-id are required.');\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (role !== undefined) body.role = role;\n if (branch !== undefined) body.branch = branch;\n if (subdirectory !== undefined) body.subdirectory = subdirectory;\n if (serviceName !== undefined) body.serviceName = serviceName;\n\n const result = await apiRequest<{ ok: boolean; data?: TemplateRepoLink; error?: string }>(\n apiUrl,\n token,\n 'PATCH',\n `/org/environments/templates/${templateId}/repos/${linkId}`,\n body\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n if (json) console.log(JSON.stringify(result.data, null, 2));\n else console.log(`Updated repo link ${linkId}`);\n}\n\nasync function handleRepoRemove(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const templateId = getArgValue(argv, '--template');\n const linkId = getArgValue(argv, '--link-id');\n if (!templateId || !linkId) {\n console.error('Error: --template and --link-id are required.');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/environments/templates/${templateId}/repos/${linkId}`\n );\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.log(`Removed repo link ${linkId} from template ${templateId}`);\n}\n\nasync function handleRepo(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [action, ...rest] = argv;\n switch (action) {\n case 'list':\n await handleRepoList(rest, apiUrl, token);\n break;\n case 'add':\n await handleRepoAdd(rest, apiUrl, token);\n break;\n case 'update':\n await handleRepoUpdate(rest, apiUrl, token);\n break;\n case 'remove':\n case 'rm':\n await handleRepoRemove(rest, apiUrl, token);\n break;\n default:\n console.error(\n `Unknown repo action: ${action ?? '(none)'}. Use list/add/update/remove.\\n` +\n 'Examples:\\n' +\n ' canary sandbox repo list --template <template-id>\\n' +\n ' canary sandbox repo add --template <template-id> --property-github-repo-id <uuid> --role frontend\\n' +\n ' canary sandbox repo add --template <template-id> --property-github-repo-id <uuid> --spec frontend=owner/web@main:/apps/web'\n );\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// AMI lifecycle (per-template golden AMI). See\n// docs/api/services/sandbox-template-amis.md — Naming and tags + Operator UX.\n// ---------------------------------------------------------------------------\n\ninterface AmiRow {\n id: string;\n amiId: string | null;\n amiName: string | null;\n status: 'building' | 'ready' | 'failed' | 'superseded' | 'deregistered';\n artifactHash: string;\n instanceSize: string;\n baseAmiId: string;\n builtAt: string | null;\n supersededAt: string | null;\n deregisteredAt: string | null;\n buildError: string | null;\n buildJobId: string | null;\n createdAt: string;\n isCurrent: boolean;\n}\n\ninterface AmiListResponse {\n ok: boolean;\n error?: string;\n templateId?: string;\n currentAmiId?: string | null;\n pendingAmiBakeHash?: string | null;\n amis?: AmiRow[];\n}\n\nconst AMI_TERMINAL_STATUSES = new Set(['ready', 'failed', 'superseded', 'deregistered']);\n\nconst formatHashShort = (hash: string): string => hash.slice(0, 8);\n\n// Single source of truth for column widths so the header and row formatters\n// can't drift apart. The marker is a 1-char prefix sitting outside the\n// padded columns, with a single space gap.\nconst AMI_COL = {\n status: 12,\n hash: 8,\n built: 20,\n size: 8,\n amiId: 22,\n} as const;\n\nfunction printAmiTable(rows: AmiRow[], currentAmiId: string | null | undefined): void {\n if (rows.length === 0) {\n console.log('No AMI history yet — trigger one with `canary sandbox ami rebake <template-id>`.');\n return;\n }\n\n const header = ` ${'STATUS'.padEnd(AMI_COL.status)} ${'HASH'.padEnd(AMI_COL.hash)} ${'BUILT'.padEnd(AMI_COL.built)} ${'SIZE'.padEnd(AMI_COL.size)} ${'AMI-ID'.padEnd(AMI_COL.amiId)} ROW-ID`;\n const lines: string[] = [header];\n const markerFor = (row: AmiRow): string => {\n if (currentAmiId && row.id === currentAmiId) return '*';\n if (row.status === 'ready' || row.status === 'superseded') return 'R';\n return ' ';\n };\n for (const row of rows) {\n const marker = markerFor(row);\n const built = row.builtAt ? new Date(row.builtAt).toISOString().slice(0, 19) + 'Z' : '—';\n lines.push(\n `${marker} ${row.status.padEnd(AMI_COL.status)} ${formatHashShort(row.artifactHash).padEnd(AMI_COL.hash)} ${built.padEnd(AMI_COL.built)} ${row.instanceSize.padEnd(AMI_COL.size)} ${(row.amiId ?? '—').padEnd(AMI_COL.amiId)} ${row.id}`\n );\n }\n console.log(lines.join('\\n'));\n console.log('');\n console.log(\" '*' = current 'R' = ready/superseded (eligible for `canary sandbox ami use`)\");\n}\n\nasync function handleAmiList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox ami list <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<AmiListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/environments/templates/${templateId}/amis`\n );\n\n if (!res.ok) {\n if (json) console.log(JSON.stringify(res, null, 2));\n else console.error(`Error: ${res.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n console.log(`Template: ${res.templateId}`);\n console.log(`Current AMI row: ${res.currentAmiId ?? '— (using base AMI)'}`);\n if (res.pendingAmiBakeHash) {\n console.log(`Pending bake hash: ${formatHashShort(res.pendingAmiBakeHash)}`);\n }\n console.log('');\n printAmiTable(res.amis ?? [], res.currentAmiId);\n}\n\ninterface AmiRebakeResponse {\n ok: boolean;\n error?: string;\n reason?: 'enqueued' | 'already-baked' | 'coalesced';\n jobId?: string;\n amiRowId?: string;\n status?: AmiRow['status'];\n artifactHash?: string;\n}\n\n// Tolerate transient API errors during a long bake — a 502/504/ECONNRESET\n// shouldn't abort a 45-minute wait. Three consecutive failures still bails;\n// a single blip is logged and the next poll retries.\nconst POLL_TRANSIENT_FAILURE_LIMIT = 3;\n\nasync function pollAmiBuild(\n apiUrl: string,\n token: string,\n templateId: string,\n jobId: string,\n pollIntervalMs = 5000,\n timeoutMs = 45 * 60 * 1000\n): Promise<AmiRow | null> {\n const startedAt = Date.now();\n let lastSeenStatus: string | null = null;\n let consecutiveFailures = 0;\n while (Date.now() - startedAt < timeoutMs) {\n const res = await apiRequest<AmiListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/environments/templates/${templateId}/amis`\n );\n if (!res.ok) {\n consecutiveFailures += 1;\n if (consecutiveFailures >= POLL_TRANSIENT_FAILURE_LIMIT) {\n console.error(\n `Aborting wait after ${consecutiveFailures} consecutive poll failures: ${res.error ?? 'Unknown'}`\n );\n return null;\n }\n console.error(\n ` ↳ poll failure ${consecutiveFailures}/${POLL_TRANSIENT_FAILURE_LIMIT} — ${res.error ?? 'Unknown'}; retrying`\n );\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n continue;\n }\n consecutiveFailures = 0;\n // Match on build_job_id, not artifactHash — multiple historical rows can\n // share the same hash (prior failed bakes), so a hash-only match races\n // against the worker's `building` row insert and can latch onto a stale\n // terminal row before the new row appears.\n const matching = (res.amis ?? []).find((r) => r.buildJobId === jobId);\n if (matching && AMI_TERMINAL_STATUSES.has(matching.status)) {\n return matching;\n }\n if (matching && matching.status !== lastSeenStatus) {\n lastSeenStatus = matching.status;\n console.log(` ↳ ${new Date().toISOString()} — status: ${matching.status}`);\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n console.error(`Timed out after ${Math.round(timeoutMs / 1000)}s waiting for bake to finish.`);\n return null;\n}\n\nasync function handleAmiRebake(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n const force = hasFlag(argv, '--force');\n const wait = hasFlag(argv, '--wait');\n\n if (!templateId) {\n console.error('Error: template ID required.');\n console.error('Usage: canary sandbox ami rebake <template-id> [--force] [--wait]');\n process.exit(1);\n }\n\n const res = await apiRequest<AmiRebakeResponse>(\n apiUrl,\n token,\n 'POST',\n `/org/environments/templates/${templateId}/amis/rebake`,\n { force }\n );\n\n if (!res.ok) {\n if (json) console.log(JSON.stringify(res, null, 2));\n else console.error(`Error: ${res.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n if (res.reason === 'already-baked') {\n console.log(`AMI for hash ${formatHashShort(res.artifactHash ?? '')} already exists (${res.status}).`);\n console.log(` Row id: ${res.amiRowId}`);\n console.log(` Use \\`canary sandbox ami use ${templateId} ${res.amiRowId}\\` to switch to it,`);\n console.log(' or pass --force to bake a fresh copy anyway.');\n return;\n }\n\n if (res.reason === 'coalesced') {\n console.log('Another rebake was already queued for this template; nothing to do.');\n if (wait) {\n console.log(\n ' (--wait skipped: coalesced response has no job handle to follow. ' +\n 'Watch via `canary task list --status in_progress` or re-run rebake when the in-flight one finishes.)'\n );\n }\n return;\n }\n\n // res.reason === 'enqueued'\n console.log(`Bake job enqueued.`);\n console.log(` Job id: ${res.jobId}`);\n console.log(` Hash: ${formatHashShort(res.artifactHash ?? '')}`);\n\n if (wait) {\n if (!res.jobId) {\n console.error('Cannot --wait: API did not return a jobId for the enqueued bake.');\n process.exit(1);\n }\n console.log('');\n console.log('Polling for completion (Ctrl+C to detach; bake continues server-side)…');\n const final = await pollAmiBuild(apiUrl, token, templateId, res.jobId);\n if (final) {\n console.log('');\n if (final.status === 'ready') {\n console.log(`Bake complete: AMI ${final.amiId} (row ${final.id})`);\n } else {\n console.error(`Bake ended in status: ${final.status}`);\n if (final.buildError) console.error(` ${final.buildError}`);\n process.exit(1);\n }\n }\n }\n}\n\ninterface AmiUseResponse {\n ok: boolean;\n error?: string;\n templateId?: string;\n /** Row UUID (`environment_template_amis.id`) — what the request set as current. */\n currentAmiRowId?: string;\n /** AWS AMI handle (`ami-XXXXX`) of the row, when known. */\n currentAmiId?: string | null;\n alreadyCurrent?: boolean;\n promotedFromSuperseded?: boolean;\n demotedPriorAmiRowId?: string | null;\n priorDemoteSkipped?: boolean;\n}\n\ninterface AmiUseBaseResponse {\n ok: boolean;\n error?: string;\n templateId?: string;\n /** True when the template was already on the base AMI; nothing changed. */\n alreadyBase?: boolean;\n /** Row demoted from `ready` → `superseded`, when one was current. */\n demotedPriorAmiRowId?: string | null;\n /** True when the prior current row was not `ready`, so demote didn't fire. */\n priorDemoteSkipped?: boolean;\n}\n\nasync function handleAmiUse(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const amiRowId = positional[1];\n const json = hasFlag(argv, '--json');\n\n if (!templateId || !amiRowId) {\n console.error('Error: template ID and AMI row id required.');\n console.error('Usage: canary sandbox ami use <template-id> <ami-row-id>');\n console.error('Find row ids with `canary sandbox ami list <template-id>`.');\n process.exit(1);\n }\n\n const res = await apiRequest<AmiUseResponse>(\n apiUrl,\n token,\n 'PATCH',\n `/org/environments/templates/${templateId}/current-ami`,\n { amiRowId }\n );\n\n if (!res.ok) {\n if (json) console.log(JSON.stringify(res, null, 2));\n else console.error(`Error: ${res.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n if (res.alreadyCurrent) {\n console.log(`Row ${amiRowId} is already the current AMI for template ${templateId}.`);\n return;\n }\n\n console.log(`Current AMI updated.`);\n console.log(` Template: ${res.templateId}`);\n console.log(` Row: ${res.currentAmiRowId}`);\n if (res.currentAmiId) {\n console.log(` AMI: ${res.currentAmiId}`);\n }\n if (res.promotedFromSuperseded) {\n console.log(' Note: chosen row was superseded; promoted back to ready.');\n }\n if (res.demotedPriorAmiRowId) {\n console.log(` Demoted: ${res.demotedPriorAmiRowId} (prior current → superseded)`);\n }\n if (res.priorDemoteSkipped) {\n console.log(\n ' Warning: prior current row was not in `ready` status — demote skipped (see server logs).'\n );\n }\n}\n\nasync function handleAmiUseBase(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required.');\n console.error('Usage: canary sandbox ami use-base <template-id>');\n process.exit(1);\n }\n\n const res = await apiRequest<AmiUseBaseResponse>(\n apiUrl,\n token,\n 'DELETE',\n `/org/environments/templates/${templateId}/current-ami`\n );\n\n if (!res.ok) {\n if (json) console.log(JSON.stringify(res, null, 2));\n else console.error(`Error: ${res.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n if (res.alreadyBase) {\n console.log(`Template ${templateId} is already on the base AMI — nothing to do.`);\n return;\n }\n\n console.log('Reset to base AMI. Next provision clones fresh from the system base image.');\n console.log(` Template: ${res.templateId}`);\n if (res.demotedPriorAmiRowId) {\n console.log(` Demoted: ${res.demotedPriorAmiRowId} (prior current → superseded; rollback with \\`ami use\\`)`);\n }\n if (res.priorDemoteSkipped) {\n console.log(\n ' Warning: prior current row was not in `ready` status — demote skipped (see server logs).'\n );\n }\n}\n\nasync function handleAmi(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [action, ...rest] = argv;\n switch (action) {\n case 'list':\n await handleAmiList(rest, apiUrl, token);\n break;\n case 'rebake':\n await handleAmiRebake(rest, apiUrl, token);\n break;\n case 'use':\n await handleAmiUse(rest, apiUrl, token);\n break;\n case 'use-base':\n await handleAmiUseBase(rest, apiUrl, token);\n break;\n default:\n console.error(\n `Unknown ami action: ${action ?? '(none)'}. Use list/rebake/use/use-base.\\n` +\n 'Examples:\\n' +\n ' canary sandbox ami list <template-id>\\n' +\n ' canary sandbox ami rebake <template-id> [--force] [--wait]\\n' +\n ' canary sandbox ami use <template-id> <ami-row-id>\\n' +\n ' canary sandbox ami use-base <template-id>'\n );\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main dispatcher\n// ---------------------------------------------------------------------------\n\nexport async function runSandbox(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n // Guide is purely local — no auth needed\n if (subCommand === 'guide') {\n const section = rest.find((a) => !a.startsWith('-'));\n const json = hasFlag(rest, '--json');\n printGuide(SANDBOX_GUIDE_SECTIONS, section, json);\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n // Strip global flags consumed by resolveConfig so handlers don't see them as positional args\n const globalFlags = new Set(['--env', '--api-url', '--token', '--org']);\n const args = rest.filter((arg, i) => {\n if (globalFlags.has(arg)) return false;\n if (i > 0 && globalFlags.has(rest[i - 1])) return false;\n return true;\n });\n\n switch (subCommand) {\n case 'list':\n await handleList(args, apiUrl, token);\n break;\n case 'template':\n await handleTemplate(args, apiUrl, token);\n break;\n case 'repo':\n await handleRepo(args, apiUrl, token);\n break;\n case 'artifacts':\n await handleArtifacts(args, apiUrl, token);\n break;\n case 'checklist':\n await handleChecklist(args, apiUrl, token);\n break;\n case 'create':\n await handleCreate(args, apiUrl, token);\n break;\n case 'provision':\n await handleProvision(args, apiUrl, token);\n break;\n case 'warm':\n await handleWarm(args, apiUrl, token);\n break;\n case 'verify':\n await handleVerify(args, apiUrl, token);\n break;\n case 'set-size':\n await handleSetSize(args, apiUrl, token);\n break;\n case 'ami':\n await handleAmi(args, apiUrl, token);\n break;\n case 'artifact': {\n const [action, ...actionRest] = args;\n if (action === 'get') {\n await handleArtifactGet(actionRest, apiUrl, token);\n } else if (action === 'create') {\n await handleArtifactCreate(actionRest, apiUrl, token);\n } else {\n console.error(`Unknown artifact action: ${action}. Use \"get\" or \"create\".`);\n process.exit(1);\n }\n break;\n }\n case 'config': {\n const [configAction, ...configRest] = args;\n if (configAction === 'list') {\n await handleConfigList(configRest, apiUrl, token);\n } else if (configAction === 'set') {\n await handleConfigSet(configRest, apiUrl, token);\n } else {\n console.error(`Unknown config action: ${configAction}. Use \"list\" or \"set\".`);\n process.exit(1);\n }\n break;\n }\n case 'emulation':\n await handleEmulation(args, apiUrl, token);\n break;\n case 'action': {\n const [actionSub, ...actionRest] = args;\n switch (actionSub) {\n case 'list':\n await handleActionList(actionRest, apiUrl, token);\n break;\n case 'get':\n await handleActionGet(actionRest, apiUrl, token);\n break;\n case 'create':\n await handleActionCreate(actionRest, apiUrl, token);\n break;\n case 'delete':\n await handleActionDelete(actionRest, apiUrl, token);\n break;\n case 'execute':\n await handleActionExecute(actionRest, apiUrl, token);\n break;\n case 'executions':\n await handleActionExecutions(actionRest, apiUrl, token);\n break;\n default:\n console.error(`Unknown action sub-command: ${actionSub}. Use \"list\", \"get\", \"create\", \"delete\", \"execute\", or \"executions\".`);\n process.exit(1);\n }\n break;\n }\n case 'build':\n await handleBuild(args, apiUrl, token);\n break;\n case 'run-command':\n await handleRunCommand(args, apiUrl, token);\n break;\n case 'diagnostics':\n await handleDiagnostics(args, apiUrl, token);\n break;\n case 'logs':\n await handleLogs(args, apiUrl, token);\n break;\n case 'terminate':\n await handleTerminate(args, apiUrl, token);\n break;\n case 'delete':\n await handleDelete(args, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printHelp();\n process.exit(1);\n }\n}\n","/**\n * Email plugin action-interface declarations.\n *\n * @module\n */\n\nimport type { ActionInterfaceDef } from '../../plugin.js';\n\nexport const emailActionInterfaces: ActionInterfaceDef[] = [\n {\n slug: 'email-sent-messages',\n label: 'Read emails the app sent',\n description:\n 'Return the emails the app sent via any emulated provider since boot (or the last reset), for assertions.',\n inputSchema: { type: 'object', properties: {} },\n outputSchema: {\n type: 'object',\n properties: {\n emails: {\n type: 'array',\n description: 'Captured emails: { id, provider, from, to[], subject, text, html, ... }',\n },\n },\n },\n scaffoldScript: `# Read emails the app sent to the emulated providers.\ncurl -sf \"$EMULATION_BASE_URL/plugins/email/sent-emails\" \\\\\n -H \"Authorization: Bearer $EMULATION_CONTROL_TOKEN\"`,\n },\n {\n slug: 'email-reset',\n label: 'Clear captured emails',\n description: 'Reset the email emulator, discarding all captured emails.',\n inputSchema: { type: 'object', properties: {} },\n outputSchema: { type: 'object', properties: { ok: { type: 'boolean' } } },\n scaffoldScript: `# Discard all captured emails.\ncurl -sf -X POST \"$EMULATION_BASE_URL/plugins/email/reset\" \\\\\n -H \"Authorization: Bearer $EMULATION_CONTROL_TOKEN\"`,\n },\n];\n","/**\n * Provider-specific HTTP handlers for the email emulation plugin.\n *\n * @module\n */\n\nimport crypto from 'node:crypto';\nimport type { EmulationRequest, EmulationResponse } from '../../plugin.js';\nimport { record } from './capture.js';\nimport {\n decodeBase64,\n extractGenericAttachments,\n isRecord,\n parseAddress,\n parseAddressList,\n parseRawMime,\n safeParseJson,\n} from './parsing.js';\nimport type { EmailCtx } from './types.js';\n\n/** SendGrid v3 - POST /v3/mail/send (returns 202 with X-Message-Id). */\nexport function handleSendgrid(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return { status: 400, body: { errors: [{ message: 'Invalid JSON body' }] } };\n if (!isRecord(parsed.data))\n return { status: 400, body: { errors: [{ message: 'Invalid JSON body' }] } };\n const data = parsed.data;\n\n const personalizations: unknown[] = Array.isArray(data.personalizations)\n ? data.personalizations\n : [];\n const to: string[] = [];\n const cc: string[] = [];\n const bcc: string[] = [];\n let subject: string | null = typeof data.subject === 'string' ? data.subject : null;\n for (const p of personalizations) {\n const pers = isRecord(p) ? p : {};\n to.push(...parseAddressList(pers.to).emails);\n cc.push(...parseAddressList(pers.cc).emails);\n bcc.push(...parseAddressList(pers.bcc).emails);\n if (!subject && typeof pers.subject === 'string') subject = pers.subject;\n }\n\n const fromAddr = parseAddress(data.from);\n const content = Array.isArray(data.content) ? data.content.filter(isRecord) : [];\n const textValue = content.find((c) => c.type === 'text/plain')?.value;\n const htmlValue = content.find((c) => c.type === 'text/html')?.value;\n const text = typeof textValue === 'string' ? textValue : null;\n const html = typeof htmlValue === 'string' ? htmlValue : null;\n\n const captured = record(ctx, {\n provider: 'sendgrid',\n from: fromAddr?.email ?? '',\n ...(fromAddr?.name ? { fromName: fromAddr.name } : {}),\n to,\n cc,\n bcc,\n subject,\n text,\n html,\n headers: { 'x-provider': 'sendgrid' },\n attachments: extractGenericAttachments(data.attachments, 'filename', 'type'),\n });\n\n return { status: 202, headers: { 'x-message-id': captured.id }, body: '' };\n}\n\n/** Resend - POST /emails (returns 200 {id}). */\nexport function handleResend(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const parsed = safeParseJson(req.body);\n if (!parsed.ok)\n return { status: 400, body: { message: 'Invalid JSON body', name: 'validation_error' } };\n if (!isRecord(parsed.data))\n return { status: 400, body: { message: 'Invalid JSON body', name: 'validation_error' } };\n const data = parsed.data;\n\n const fromAddr = parseAddress(data.from);\n const captured = record(ctx, {\n provider: 'resend',\n from: fromAddr?.email ?? '',\n ...(fromAddr?.name ? { fromName: fromAddr.name } : {}),\n to: parseAddressList(data.to).emails,\n cc: parseAddressList(data.cc).emails,\n bcc: parseAddressList(data.bcc).emails,\n subject: typeof data.subject === 'string' ? data.subject : null,\n text: typeof data.text === 'string' ? data.text : null,\n html: typeof data.html === 'string' ? data.html : null,\n headers: { 'x-provider': 'resend' },\n attachments: extractGenericAttachments(data.attachments, 'filename', 'content_type'),\n });\n\n return { status: 200, body: { id: captured.id } };\n}\n\n/** Postmark - POST /email (returns 200 {MessageID, ErrorCode:0}). */\nexport function handlePostmarkSingle(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return { status: 422, body: { ErrorCode: 300, Message: 'Invalid JSON body' } };\n if (!isRecord(parsed.data))\n return { status: 422, body: { ErrorCode: 300, Message: 'Invalid JSON body' } };\n return { status: 200, body: postmarkRecord(ctx, parsed.data) };\n}\n\n/** Postmark - POST /email/batch (returns 200 [{MessageID}, ...]). */\nexport function handlePostmarkBatch(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const parsed = safeParseJson(req.body);\n if (!parsed.ok || !Array.isArray(parsed.data)) {\n return { status: 422, body: { ErrorCode: 300, Message: 'Invalid batch body' } };\n }\n return {\n status: 200,\n body: parsed.data.map((entry) => postmarkRecord(ctx, isRecord(entry) ? entry : {})),\n };\n}\n\nfunction postmarkRecord(ctx: EmailCtx, data: Record<string, unknown>) {\n const fromAddr = parseAddress(typeof data.From === 'string' ? data.From : null);\n const captured = record(ctx, {\n provider: 'postmark',\n from: fromAddr?.email ?? '',\n ...(fromAddr?.name ? { fromName: fromAddr.name } : {}),\n to: parseAddressList(data.To).emails,\n cc: parseAddressList(data.Cc).emails,\n bcc: parseAddressList(data.Bcc).emails,\n subject: typeof data.Subject === 'string' ? data.Subject : null,\n text: typeof data.TextBody === 'string' ? data.TextBody : null,\n html: typeof data.HtmlBody === 'string' ? data.HtmlBody : null,\n headers: { 'x-provider': 'postmark' },\n attachments: extractGenericAttachments(data.Attachments, 'Name', 'ContentType'),\n });\n return {\n To: parseAddressList(data.To).emails.join(', '),\n SubmittedAt: captured.receivedAt,\n MessageID: captured.id,\n ErrorCode: 0,\n Message: 'OK',\n };\n}\n\n/** Mailgun - POST /v3/:domain/messages (form-encoded, returns 200 {id, message}). */\nexport function handleMailgun(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const form = new URLSearchParams(req.body ?? '');\n const fromAddr = parseAddress(form.get('from'));\n const collect = (key: string) =>\n form.getAll(key).flatMap((value) => parseAddressList(value).emails);\n\n const captured = record(ctx, {\n provider: 'mailgun',\n from: fromAddr?.email ?? '',\n ...(fromAddr?.name ? { fromName: fromAddr.name } : {}),\n to: collect('to'),\n cc: collect('cc'),\n bcc: collect('bcc'),\n subject: form.get('subject'),\n text: form.get('text'),\n html: form.get('html'),\n headers: { 'x-provider': 'mailgun' },\n attachments: [],\n });\n\n return {\n status: 200,\n body: { id: `<${captured.id}@mailgun.emulated>`, message: 'Queued. Thank you.' },\n };\n}\n\n/** Amazon SES - POST / (SendEmail / SendRawEmail, query/form-encoded). */\nexport function handleSesV1(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const form = new URLSearchParams(req.body ?? '');\n const action = form.get('Action') ?? '';\n\n if (action === 'SendRawEmail') {\n const rawData = form.get('RawMessage.Data');\n const mime = rawData ? parseRawMime(decodeBase64(rawData)) : null;\n const captured = record(ctx, {\n provider: 'ses',\n from: mime?.from?.email ?? (form.get('Source') ?? '').toLowerCase(),\n ...(mime?.from?.name ? { fromName: mime.from.name } : {}),\n to: mime?.to ?? sesMemberList(form, 'Destinations.member'),\n cc: mime?.cc ?? [],\n bcc: mime?.bcc ?? [],\n subject: mime?.subject ?? null,\n text: mime?.text ?? null,\n html: mime?.html ?? null,\n headers: { 'x-provider': 'ses', 'x-ses-action': 'SendRawEmail' },\n attachments: [],\n });\n return sesXmlResponse('SendRawEmail', captured.id);\n }\n\n const captured = record(ctx, {\n provider: 'ses',\n from: (form.get('Source') ?? '').toLowerCase(),\n to: sesMemberList(form, 'Destination.ToAddresses.member'),\n cc: sesMemberList(form, 'Destination.CcAddresses.member'),\n bcc: sesMemberList(form, 'Destination.BccAddresses.member'),\n subject: form.get('Message.Subject.Data'),\n text: form.get('Message.Body.Text.Data'),\n html: form.get('Message.Body.Html.Data'),\n headers: { 'x-provider': 'ses', 'x-ses-action': action || 'SendEmail' },\n attachments: [],\n });\n return sesXmlResponse('SendEmail', captured.id);\n}\n\n/** Amazon SES v2 - POST /v2/email/outbound-emails (JSON). */\nexport function handleSesV2(req: EmulationRequest, ctx: EmailCtx): EmulationResponse {\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return { status: 400, body: { message: 'Invalid JSON body' } };\n if (!isRecord(parsed.data)) return { status: 400, body: { message: 'Invalid JSON body' } };\n const data = parsed.data;\n\n const dest = isRecord(data.Destination) ? data.Destination : {};\n const content = isRecord(data.Content) ? data.Content : {};\n const simple = isRecord(content.Simple) ? content.Simple : undefined;\n const raw = isRecord(content.Raw) ? content.Raw : undefined;\n\n let subject: string | null = null;\n let text: string | null = null;\n let html: string | null = null;\n let from = String(data.FromEmailAddress ?? '').toLowerCase();\n let to = parseAddressList(dest.ToAddresses).emails;\n let cc = parseAddressList(dest.CcAddresses).emails;\n let bcc = parseAddressList(dest.BccAddresses).emails;\n\n if (raw?.Data) {\n const mime = parseRawMime(decodeBase64(String(raw.Data)));\n if (mime.from) from = mime.from.email;\n if (mime.to.length) to = mime.to;\n if (mime.cc.length) cc = mime.cc;\n if (mime.bcc.length) bcc = mime.bcc;\n subject = mime.subject;\n text = mime.text;\n html = mime.html;\n } else if (simple) {\n const subjObj = isRecord(simple.Subject) ? simple.Subject : undefined;\n const bodyObj = isRecord(simple.Body) ? simple.Body : undefined;\n const textObj = bodyObj && isRecord(bodyObj.Text) ? bodyObj.Text : undefined;\n const htmlObj = bodyObj && isRecord(bodyObj.Html) ? bodyObj.Html : undefined;\n subject = subjObj?.Data ? String(subjObj.Data) : null;\n text = textObj?.Data ? String(textObj.Data) : null;\n html = htmlObj?.Data ? String(htmlObj.Data) : null;\n }\n\n const fromAddr = parseAddress(from);\n const captured = record(ctx, {\n provider: 'ses',\n from: fromAddr?.email ?? from,\n ...(fromAddr?.name ? { fromName: fromAddr.name } : {}),\n to,\n cc,\n bcc,\n subject,\n text,\n html,\n headers: { 'x-provider': 'ses', 'x-ses-action': 'SendEmailV2' },\n attachments: [],\n });\n\n return { status: 200, body: { MessageId: captured.id } };\n}\n\nfunction sesMemberList(form: URLSearchParams, prefix: string): string[] {\n const out: string[] = [];\n for (let i = 1; ; i++) {\n const value = form.get(`${prefix}.${i}`);\n if (value === null) break;\n const parsed = parseAddress(value);\n if (parsed) out.push(parsed.email);\n }\n return out;\n}\n\nfunction sesXmlResponse(\n action: 'SendEmail' | 'SendRawEmail',\n messageId: string\n): EmulationResponse {\n const requestId = crypto.randomUUID();\n const body = `<${action}Response xmlns=\"http://ses.amazonaws.com/doc/2010-12-01/\">\n <${action}Result>\n <MessageId>${messageId}</MessageId>\n </${action}Result>\n <ResponseMetadata>\n <RequestId>${requestId}</RequestId>\n </ResponseMetadata>\n</${action}Response>`;\n return { status: 200, headers: { 'content-type': 'application/xml' }, body };\n}\n","/**\n * Email capture state mutation helpers.\n *\n * @module\n */\n\nimport crypto from 'node:crypto';\nimport type { CapturedEmail, EmailCtx } from './types.js';\n\n/** Cap retained captures so a runaway send loop cannot grow state unbounded. */\nconst MAX_RETAINED_EMAILS = 500;\n\nexport function record(\n ctx: EmailCtx,\n email: Omit<CapturedEmail, 'id' | 'receivedAt'>\n): CapturedEmail {\n const captured: CapturedEmail = {\n id: crypto.randomUUID(),\n receivedAt: new Date().toISOString(),\n ...email,\n };\n ctx.state.sentEmails.push(captured);\n if (ctx.state.sentEmails.length > MAX_RETAINED_EMAILS) {\n ctx.state.sentEmails.splice(0, ctx.state.sentEmails.length - MAX_RETAINED_EMAILS);\n }\n\n const recipientCount = email.to.length + email.cc.length + email.bcc.length;\n ctx.log(\n 'info',\n `[${email.provider}] captured email ${captured.id} for ${recipientCount} recipient(s)`\n );\n return captured;\n}\n","/**\n * Email address, MIME, and provider payload parsing helpers.\n *\n * @module\n */\n\nimport type { CapturedEmail } from './types.js';\n\nexport interface ParsedAddress {\n email: string;\n name?: string;\n}\n\nexport interface ParsedRawMime {\n from: ParsedAddress | null;\n to: string[];\n cc: string[];\n bcc: string[];\n subject: string | null;\n text: string | null;\n html: string | null;\n}\n\ntype JsonObject = Record<string, unknown>;\n\n/**\n * Parse a single address from a string (\"Name <a@b.com>\" / \"a@b.com\") or an\n * object ({ email, name }, as SendGrid uses).\n */\nexport function parseAddress(input: unknown): ParsedAddress | null {\n if (input && typeof input === 'object' && 'email' in input) {\n const email = String((input as { email: unknown }).email ?? '')\n .trim()\n .toLowerCase();\n if (!email) return null;\n const name = (input as { name?: unknown }).name;\n return { email, ...(name ? { name: String(name) } : {}) };\n }\n if (typeof input !== 'string') return null;\n const trimmed = input.trim();\n if (!trimmed) return null;\n const angle = /^\\s*(?:\"?([^\"<]*?)\"?\\s*)?<([^>]+)>\\s*$/.exec(trimmed);\n if (angle) {\n const name = angle[1]?.trim();\n return { email: angle[2].trim().toLowerCase(), ...(name ? { name } : {}) };\n }\n return { email: trimmed.toLowerCase() };\n}\n\n/**\n * Parse an address list that may be a string, an array of strings, or an array\n * of `{email,name}` objects.\n */\nexport function parseAddressList(input: unknown): { emails: string[]; first?: ParsedAddress } {\n const out: ParsedAddress[] = [];\n\n const pushString = (value: string) => {\n // This intentionally supports the provider payloads we emulate, not full RFC parsing.\n for (const part of value.split(',')) {\n const parsed = parseAddress(part);\n if (parsed) out.push(parsed);\n }\n };\n\n if (typeof input === 'string') {\n pushString(input);\n } else if (Array.isArray(input)) {\n for (const entry of input) {\n if (typeof entry === 'string') {\n pushString(entry);\n } else if (entry && typeof entry === 'object' && 'email' in entry) {\n const email = String((entry as { email: unknown }).email ?? '')\n .trim()\n .toLowerCase();\n if (email) {\n const name = (entry as { name?: unknown }).name;\n out.push({ email, ...(name ? { name: String(name) } : {}) });\n }\n }\n }\n }\n\n return { emails: out.map((a) => a.email), ...(out[0] ? { first: out[0] } : {}) };\n}\n\n/** Decode a base64 payload to a UTF-8 string. */\nexport function decodeBase64(data: string): string {\n return Buffer.from(data, 'base64').toString('utf-8');\n}\n\n/** Decode quoted-printable: soft line breaks plus `=XX` hex escapes. */\nfunction decodeQuotedPrintable(input: string): string {\n return input\n .replace(/=\\r?\\n/g, '')\n .replace(/=([0-9A-Fa-f]{2})/g, (_m, hex) => String.fromCharCode(parseInt(hex, 16)));\n}\n\nfunction decodeMimeBody(body: string, contentTransferEncoding: string): string {\n const cte = contentTransferEncoding.trim().toLowerCase();\n if (cte === 'base64') {\n return Buffer.from(body.replace(/\\s+/g, ''), 'base64').toString('utf-8');\n }\n if (cte === 'quoted-printable') return decodeQuotedPrintable(body);\n return body;\n}\n\n/**\n * Best-effort raw-MIME parse: header block plus first body part. Enough to\n * surface OTP and magic-link mail without pulling in a full MIME parser.\n */\nexport function parseRawMime(raw: string): ParsedRawMime {\n const norm = raw.replace(/\\r\\n/g, '\\n');\n const splitAt = norm.indexOf('\\n\\n');\n const headerBlock = splitAt >= 0 ? norm.slice(0, splitAt) : norm;\n const body = splitAt >= 0 ? norm.slice(splitAt + 2) : '';\n\n const unfolded = headerBlock.replace(/\\n[ \\t]+/g, ' ');\n const headers = new Map<string, string>();\n for (const line of unfolded.split('\\n')) {\n const m = /^([^:]+):\\s*(.*)$/.exec(line);\n if (m) headers.set(m[1].trim().toLowerCase(), m[2].trim());\n }\n\n const contentType = headers.get('content-type') ?? '';\n const isHtml = /text\\/html/i.test(contentType);\n const isMultipart = /multipart\\//i.test(contentType);\n const decodedBody = isMultipart\n ? body\n : decodeMimeBody(body, headers.get('content-transfer-encoding') ?? '');\n\n return {\n from: parseAddress(headers.get('from')),\n to: parseAddressList(headers.get('to')).emails,\n cc: parseAddressList(headers.get('cc')).emails,\n bcc: parseAddressList(headers.get('bcc')).emails,\n subject: headers.get('subject') ?? null,\n text: isHtml ? null : decodedBody || null,\n html: isHtml ? decodedBody || null : null,\n };\n}\n\nexport function isRecord(value: unknown): value is JsonObject {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function safeParseJson(\n body: string | undefined\n): { ok: true; data: unknown } | { ok: false } {\n try {\n return { ok: true, data: JSON.parse(body ?? '{}') };\n } catch {\n return { ok: false };\n }\n}\n\nexport function extractGenericAttachments(\n input: unknown,\n nameKey: string,\n typeKey: string\n): CapturedEmail['attachments'] {\n if (!Array.isArray(input)) return [];\n return input.map((entry) => {\n const att = (entry ?? {}) as Record<string, unknown>;\n const filename = att[nameKey];\n const contentType = att[typeKey];\n return {\n ...(typeof filename === 'string' ? { filename } : {}),\n ...(typeof contentType === 'string' ? { contentType } : {}),\n };\n });\n}\n","/**\n * Shared email emulation types.\n *\n * @module\n */\n\nimport { z } from 'zod';\nimport type { PluginContext } from '../../plugin.js';\n\nexport type EmailProvider = 'ses' | 'sendgrid' | 'resend' | 'postmark' | 'mailgun';\n\nexport interface EmailEmuConfig {\n /** AWS SES regions whose API hosts to intercept (default ['us-east-1']). */\n sesRegions?: string[];\n /** Extra custom hosts to intercept (e.g. a self-hosted provider API). */\n extraDomains?: string[];\n}\n\n/** Normalized capture of one outbound email, provider-agnostic. */\nexport interface CapturedEmail {\n /** Stable per-send id, used as the inbox dedup key (messageId). */\n id: string;\n provider: EmailProvider;\n from: string;\n fromName?: string;\n to: string[];\n cc: string[];\n bcc: string[];\n subject: string | null;\n text: string | null;\n html: string | null;\n /** Selected provider headers, with sensitive values redacted. */\n headers: Record<string, string>;\n attachments: Array<{ filename?: string; contentType?: string; size?: number }>;\n /** ISO-8601 capture time. */\n receivedAt: string;\n}\n\n/** Fixture is intentionally empty; there is no seed data, only captured state. */\nexport const emailFixtureSchema = z.object({}).passthrough();\nexport type EmailFixture = z.infer<typeof emailFixtureSchema>;\n\nexport interface EmailState {\n /** Every email sent since boot or last reset, used as the assertion surface. */\n sentEmails: CapturedEmail[];\n}\n\nexport type EmailCtx = PluginContext<EmailFixture, EmailState>;\n","/**\n * Email Provider Emulation Plugin\n *\n * Emulates the HTTP send APIs of several email providers so a sandboxed app's\n * outbound mail is captured in-process instead of leaving the sandbox. One\n * plugin spans many providers; each send request normalizes into a shared\n * `CapturedEmail` shape for assertions and API-side inbox ingestion.\n *\n * Supported providers (HTTP APIs only):\n * - Amazon SES: `POST /` and SES v2 `POST /v2/email/outbound-emails`.\n * - SendGrid: `POST /v3/mail/send`.\n * - Resend: `POST /emails`.\n * - Postmark: `POST /email` and `POST /email/batch`.\n * - Mailgun: `POST /v3/:domain/messages`.\n *\n * Unknown paths on these hosts pass through to the real provider.\n *\n * @module\n */\n\nimport type { EmulationPlugin } from '../plugin.js';\nimport { emailActionInterfaces } from './email/actions.js';\nimport {\n handleMailgun,\n handlePostmarkBatch,\n handlePostmarkSingle,\n handleResend,\n handleSendgrid,\n handleSesV1,\n handleSesV2,\n} from './email/handlers.js';\nimport { emailFixtureSchema } from './email/types.js';\nimport type { EmailCtx, EmailEmuConfig, EmailFixture, EmailState } from './email/types.js';\n\nexport { emailFixtureSchema } from './email/types.js';\nexport type {\n CapturedEmail,\n EmailEmuConfig,\n EmailFixture,\n EmailProvider,\n EmailState,\n} from './email/types.js';\n\nconst DEFAULT_SES_REGIONS = ['us-east-1'];\n\nexport const emailPlugin: EmulationPlugin<EmailEmuConfig, EmailFixture, EmailState> = {\n id: 'email',\n name: 'Email (multi-provider)',\n version: '1.0.0',\n\n domains: (config) => {\n const sesRegions = config.sesRegions?.length ? config.sesRegions : DEFAULT_SES_REGIONS;\n return [\n 'api.sendgrid.com',\n 'api.resend.com',\n 'api.postmarkapp.com',\n 'api.mailgun.net',\n 'api.eu.mailgun.net',\n ...sesRegions.map((region) => `email.${region}.amazonaws.com`),\n ...(config.extraDomains ?? []),\n ];\n },\n\n needsBrowserIntercept: false,\n\n fixtureSchema: emailFixtureSchema,\n defaultFixture: {},\n\n actionInterfaces: emailActionInterfaces,\n\n controlReads: [\n {\n path: 'sent-emails',\n handler: (_req, ctx: EmailCtx) => ({\n status: 200,\n body: { emails: ctx.state.sentEmails },\n }),\n },\n ],\n\n routes: [\n { method: 'POST', path: '/v3/mail/send', handler: handleSendgrid },\n { method: 'POST', path: '/emails', handler: handleResend },\n { method: 'POST', path: '/email', handler: handlePostmarkSingle },\n { method: 'POST', path: '/email/batch', handler: handlePostmarkBatch },\n { method: 'POST', path: '/v3/:domain/messages', handler: handleMailgun },\n { method: 'POST', path: '/v2/email/outbound-emails', handler: handleSesV2 },\n { method: 'POST', path: '/', handler: handleSesV1 },\n ],\n\n initialize(_config, _fixture, _env): EmailState {\n return { sentEmails: [] };\n },\n};\n","/**\n * Google OAuth 2.0 / OpenID Connect Emulation Plugin\n *\n * Emulates Google's OAuth authorization server for sandboxed apps.\n *\n * Browser-side: Intercepts the redirect to accounts.google.com and redirects\n * the browser back to the app's callback URL with a synthetic auth code.\n *\n * Sandbox-side: Handles the token exchange (POST /token), userinfo endpoint,\n * OIDC discovery, and JWKS endpoint.\n *\n * @module\n */\n\nimport crypto from 'node:crypto';\nimport type {\n EmulationPlugin,\n EmulationRequest,\n PluginContext,\n EmulationResponse,\n} from '../plugin.js';\nimport { generateKeyPair, signIdToken, buildJwks, type EphemeralKeyPair } from './jwt.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface GoogleOAuthConfig {\n /** The app's OAuth client ID (used in aud/azp claims). Optional — extracted from requests if not set. */\n clientId?: string;\n}\n\nexport interface GoogleOAuthUser {\n /** Google user ID (sub claim) */\n sub: string;\n email: string;\n name: string;\n givenName?: string;\n familyName?: string;\n picture?: string;\n emailVerified?: boolean;\n /** Additional claims to include in id_token */\n extraClaims?: Record<string, unknown>;\n}\n\nexport interface GoogleOAuthFixture {\n user: GoogleOAuthUser;\n}\n\nexport interface GoogleOAuthState {\n keyPair: EphemeralKeyPair;\n user: GoogleOAuthUser;\n detectedClientId: string | null;\n /** Pre-computed JWKS response (key pair is stable for the container lifetime) */\n jwksResponse: object;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst EMULATED_CODE_PREFIX = 'emulated_code_';\nconst EMULATED_ACCESS_TOKEN_PREFIX = 'emulated_at_';\nconst EMULATED_REFRESH_TOKEN_PREFIX = 'emulated_rt_';\n\nexport const GOOGLE_OAUTH_DOMAINS = [\n 'accounts.google.com',\n 'oauth2.googleapis.com',\n 'www.googleapis.com',\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const googleOAuthPlugin: EmulationPlugin<\n GoogleOAuthConfig,\n GoogleOAuthFixture,\n GoogleOAuthState\n> = {\n id: 'google-oauth',\n name: 'Google OAuth 2.0',\n version: '1.0.0',\n domains: GOOGLE_OAUTH_DOMAINS,\n needsBrowserIntercept: true,\n\n // ── Sandbox-side routes ──────────────────────────────────────────────────\n\n routes: [\n // Token exchange\n {\n method: 'POST',\n path: '/token',\n handler: handleTokenExchange,\n },\n {\n method: 'POST',\n path: '/oauth2/v4/token',\n handler: handleTokenExchange,\n },\n\n // Userinfo\n {\n method: 'GET',\n path: '/oauth2/v3/userinfo',\n handler: handleUserinfo,\n },\n {\n method: 'GET',\n path: '/oauth2/v2/userinfo',\n handler: handleUserinfo,\n },\n {\n method: 'GET',\n path: '/userinfo/v2/me',\n handler: handleUserinfo,\n },\n\n // OIDC Discovery\n {\n method: 'GET',\n path: '/.well-known/openid-configuration',\n handler: handleOidcDiscovery,\n },\n\n // JWKS\n {\n method: 'GET',\n path: '/oauth2/v3/certs',\n handler: handleJwks,\n },\n ],\n\n // ── Browser-side routes ──────────────────────────────────────────────────\n\n getBrowserRoutes(_fixture) {\n return [\n {\n urlPattern: '**/accounts.google.com/o/oauth2/**',\n handler: async (route, _fix) => {\n const url = new URL(route.request().url());\n const redirectUri = url.searchParams.get('redirect_uri');\n const state = url.searchParams.get('state') || '';\n\n if (!redirectUri) {\n await route.continue();\n return;\n }\n\n const code = `${EMULATED_CODE_PREFIX}${crypto.randomUUID()}`;\n\n // Build callback URL — redirect_uri rewriting (production → sandbox)\n // is handled by the EmulationMiddleware using EnvironmentUrlContext,\n // not here. The middleware rewrites the redirect_uri before this handler\n // sees it, OR we pass the raw redirect_uri and the middleware wraps us.\n //\n // For now, use the redirect_uri as-is — the EmulationMiddleware\n // rewrites it before fulfilling.\n const callbackUrl = new URL(redirectUri);\n callbackUrl.searchParams.set('code', code);\n if (state) callbackUrl.searchParams.set('state', state);\n\n await route.fulfill({\n status: 302,\n headers: { location: callbackUrl.toString() },\n body: '',\n });\n },\n },\n ];\n },\n\n // ── Initialization ───────────────────────────────────────────────────────\n\n initialize(config, fixture) {\n const keyPair = generateKeyPair();\n return {\n keyPair,\n user: fixture.user,\n detectedClientId: config.clientId ?? null,\n jwksResponse: buildJwks(keyPair),\n };\n },\n\n defaultFixture: {\n user: {\n sub: '100000000000000000001',\n email: 'testuser@example.com',\n name: 'Test User',\n givenName: 'Test',\n familyName: 'User',\n emailVerified: true,\n },\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Route Handlers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction handleTokenExchange(\n req: EmulationRequest,\n ctx: PluginContext<GoogleOAuthFixture, GoogleOAuthState>\n): EmulationResponse | null {\n const params = new URLSearchParams(req.body ?? '');\n const grantType = params.get('grant_type');\n const code = params.get('code');\n const clientId = params.get('client_id') ?? ctx.state.detectedClientId ?? 'unknown';\n\n // Track client_id for future requests\n if (!ctx.state.detectedClientId && clientId !== 'unknown') {\n ctx.state.detectedClientId = clientId;\n }\n\n if (grantType === 'authorization_code') {\n if (!code?.startsWith(EMULATED_CODE_PREFIX)) {\n ctx.log('warn', `Token exchange with non-emulated code: ${code}`);\n return { status: 400, body: { error: 'invalid_grant', error_description: 'Invalid authorization code' } };\n }\n\n const accessToken = `${EMULATED_ACCESS_TOKEN_PREFIX}${crypto.randomUUID()}`;\n const refreshToken = `${EMULATED_REFRESH_TOKEN_PREFIX}${crypto.randomUUID()}`;\n\n const nonce = params.get('nonce') ?? undefined;\n const idToken = signIdToken(\n {\n iss: 'https://accounts.google.com',\n aud: clientId,\n azp: clientId,\n sub: ctx.state.user.sub,\n email: ctx.state.user.email,\n email_verified: ctx.state.user.emailVerified ?? true,\n name: ctx.state.user.name,\n given_name: ctx.state.user.givenName ?? '',\n family_name: ctx.state.user.familyName ?? '',\n picture: ctx.state.user.picture ?? '',\n nonce,\n ...ctx.state.user.extraClaims,\n },\n ctx.state.keyPair\n );\n\n ctx.log('info', `Issued tokens for ${ctx.state.user.email}`);\n\n return {\n status: 200,\n body: {\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: 3600,\n refresh_token: refreshToken,\n scope: 'openid email profile',\n id_token: idToken,\n },\n };\n }\n\n if (grantType === 'refresh_token') {\n const accessToken = `${EMULATED_ACCESS_TOKEN_PREFIX}${crypto.randomUUID()}`;\n\n ctx.log('info', `Refreshed token for ${ctx.state.user.email}`);\n\n return {\n status: 200,\n body: {\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: 3600,\n scope: 'openid email profile',\n },\n };\n }\n\n return { status: 400, body: { error: 'unsupported_grant_type' } };\n}\n\nfunction handleUserinfo(\n _req: EmulationRequest,\n ctx: PluginContext<GoogleOAuthFixture, GoogleOAuthState>\n): EmulationResponse {\n const u = ctx.state.user;\n return {\n status: 200,\n body: {\n sub: u.sub,\n email: u.email,\n email_verified: u.emailVerified ?? true,\n name: u.name,\n given_name: u.givenName ?? '',\n family_name: u.familyName ?? '',\n picture: u.picture ?? '',\n ...u.extraClaims,\n },\n };\n}\n\nfunction handleOidcDiscovery(\n _req: EmulationRequest,\n _ctx: PluginContext<GoogleOAuthFixture, GoogleOAuthState>\n): EmulationResponse {\n const issuer = 'https://accounts.google.com';\n return {\n status: 200,\n body: {\n issuer,\n authorization_endpoint: `${issuer}/o/oauth2/v2/auth`,\n token_endpoint: 'https://oauth2.googleapis.com/token',\n userinfo_endpoint: 'https://www.googleapis.com/oauth2/v3/userinfo',\n jwks_uri: `${issuer}/oauth2/v3/certs`,\n response_types_supported: ['code', 'token', 'id_token', 'code token', 'code id_token'],\n subject_types_supported: ['public'],\n id_token_signing_alg_values_supported: ['RS256'],\n scopes_supported: ['openid', 'email', 'profile'],\n token_endpoint_auth_methods_supported: ['client_secret_post', 'client_secret_basic'],\n claims_supported: [\n 'sub', 'iss', 'aud', 'iat', 'exp', 'name', 'given_name',\n 'family_name', 'picture', 'email', 'email_verified', 'nonce',\n ],\n },\n };\n}\n\nfunction handleJwks(\n _req: EmulationRequest,\n ctx: PluginContext<GoogleOAuthFixture, GoogleOAuthState>\n): EmulationResponse {\n return {\n status: 200,\n headers: { 'cache-control': 'public, max-age=3600' },\n body: ctx.state.jwksResponse,\n };\n}\n","/**\n * JWT Utilities for OAuth Emulation\n *\n * Generates ephemeral RSA key pairs and signs JWTs for OpenID Connect id_tokens.\n * The corresponding public key is served via JWKS endpoints so apps that verify\n * JWT signatures via OIDC discovery will succeed.\n *\n * @module\n */\n\nimport crypto from 'node:crypto';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Management\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface EphemeralKeyPair {\n privateKey: crypto.KeyObject;\n publicKey: crypto.KeyObject;\n kid: string;\n}\n\n/** Generate an RSA-2048 key pair for JWT signing. Called once on startup. */\nexport function generateKeyPair(): EphemeralKeyPair {\n const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n });\n const kid = crypto.randomUUID();\n return { privateKey, publicKey, kid };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// JWT Signing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IdTokenClaims {\n iss: string;\n aud: string;\n sub: string;\n email: string;\n email_verified?: boolean;\n name: string;\n given_name?: string;\n family_name?: string;\n picture?: string;\n nonce?: string;\n [key: string]: unknown;\n}\n\n/** Sign a JWT id_token with the ephemeral key pair. */\nexport function signIdToken(\n claims: IdTokenClaims,\n keyPair: EphemeralKeyPair\n): string {\n const now = Math.floor(Date.now() / 1000);\n\n const header = {\n alg: 'RS256',\n typ: 'JWT',\n kid: keyPair.kid,\n };\n\n const payload = {\n ...claims,\n iat: now,\n exp: now + 3600,\n };\n\n const headerB64 = base64url(JSON.stringify(header));\n const payloadB64 = base64url(JSON.stringify(payload));\n const signingInput = `${headerB64}.${payloadB64}`;\n\n const signature = crypto.sign('sha256', Buffer.from(signingInput), keyPair.privateKey);\n const signatureB64 = base64url(signature);\n\n return `${signingInput}.${signatureB64}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// JWKS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Build a JWKS response containing the public key. */\nexport function buildJwks(keyPair: EphemeralKeyPair): object {\n const jwk = keyPair.publicKey.export({ format: 'jwk' });\n return {\n keys: [\n {\n ...jwk,\n kid: keyPair.kid,\n alg: 'RS256',\n use: 'sig',\n },\n ],\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction base64url(input: string | Buffer): string {\n const buf = typeof input === 'string' ? Buffer.from(input) : input;\n return buf.toString('base64url');\n}\n","/**\n * Jira Cloud API Emulation Plugin\n *\n * Emulates Jira's REST API v3 for sandboxed apps. Sandbox-side only — no\n * browser interception needed since Jira is an API service.\n *\n * Supports mutable state: POST creates issues that subsequent GETs return.\n * State resets on container restart.\n *\n * @module\n */\n\nimport crypto from 'node:crypto';\nimport type {\n EmulationPlugin,\n EmulationRequest,\n EmulationResponse,\n PluginContext,\n} from '../plugin.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- parsing untrusted API input\nfunction safeParseJson(body: string | undefined): { ok: true; data: any } | { ok: false; error: EmulationResponse } {\n try {\n return { ok: true, data: JSON.parse(body ?? '{}') };\n } catch {\n return { ok: false, error: { status: 400, body: { errorMessages: ['Invalid JSON body'] } } };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface JiraConfig {\n /** Tenant subdomain (e.g., 'acme' for acme.atlassian.net) */\n tenant: string;\n}\n\nexport interface JiraUser {\n accountId: string;\n displayName: string;\n emailAddress: string;\n}\n\nexport interface JiraIssue {\n id: string;\n key: string;\n projectKey: string;\n summary: string;\n description?: string;\n status: { name: string };\n assignee?: JiraUser;\n reporter?: JiraUser;\n issuetype: { name: string };\n priority?: { name: string };\n created: string;\n updated: string;\n labels?: string[];\n}\n\nexport interface JiraProject {\n id: string;\n key: string;\n name: string;\n}\n\nexport interface JiraFixture {\n projects: JiraProject[];\n issues: JiraIssue[];\n users?: JiraUser[];\n}\n\nexport interface JiraState {\n projects: Map<string, JiraProject>;\n issues: Map<string, JiraIssue>;\n users: Map<string, JiraUser>;\n /** Per-project counter for auto-assigning issue keys */\n issueCounter: Record<string, number>;\n tenant: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const jiraPlugin: EmulationPlugin<JiraConfig, JiraFixture, JiraState> = {\n id: 'jira',\n name: 'Jira Cloud API',\n version: '1.0.0',\n\n domains: (config) => [`${config.tenant}.atlassian.net`],\n needsBrowserIntercept: false,\n\n routes: [\n // ── Projects ─────────────────────────────────────────────────────────\n {\n method: 'GET',\n path: '/rest/api/3/project',\n handler: (_req, ctx: PluginContext<JiraFixture, JiraState>) => ({\n status: 200,\n body: Array.from(ctx.state.projects.values()),\n }),\n },\n {\n method: 'GET',\n path: '/rest/api/3/project/:projectKey',\n handler: (req, ctx: PluginContext<JiraFixture, JiraState>) => {\n const project = ctx.state.projects.get(req.params.projectKey);\n if (!project) return { status: 404, body: { errorMessages: ['Project not found'] } };\n return { status: 200, body: project };\n },\n },\n\n // ── Issues ───────────────────────────────────────────────────────────\n {\n method: 'GET',\n path: '/rest/api/3/issue/:issueKey',\n handler: handleGetIssue,\n },\n {\n method: 'POST',\n path: '/rest/api/3/issue',\n handler: handleCreateIssue,\n },\n {\n method: 'PUT',\n path: '/rest/api/3/issue/:issueKey',\n handler: handleUpdateIssue,\n },\n\n // ── Transitions ──────────────────────────────────────────────────────\n {\n method: 'GET',\n path: '/rest/api/3/issue/:issueKey/transitions',\n handler: (_req, _ctx) => ({\n status: 200,\n body: {\n transitions: [\n { id: '11', name: 'To Do' },\n { id: '21', name: 'In Progress' },\n { id: '31', name: 'Done' },\n ],\n },\n }),\n },\n {\n method: 'POST',\n path: '/rest/api/3/issue/:issueKey/transitions',\n handler: handleTransition,\n },\n\n // ── Search ───────────────────────────────────────────────────────────\n {\n method: 'POST',\n path: '/rest/api/3/search',\n handler: handleSearch,\n },\n {\n method: 'GET',\n path: '/rest/api/3/search',\n handler: handleSearch,\n },\n\n // ── Users ────────────────────────────────────────────────────────────\n {\n method: 'GET',\n path: '/rest/api/3/myself',\n handler: (_req, ctx: PluginContext<JiraFixture, JiraState>) => {\n const firstUser = ctx.state.users.values().next().value;\n if (!firstUser) return { status: 200, body: { accountId: 'emulated', displayName: 'Emulated User', emailAddress: 'emulated@test.com' } };\n return { status: 200, body: firstUser };\n },\n },\n\n // ── Server Info ──────────────────────────────────────────────────────\n {\n method: 'GET',\n path: '/rest/api/3/serverInfo',\n handler: (_req, _ctx) => ({\n status: 200,\n body: {\n baseUrl: 'https://emulated.atlassian.net',\n version: '1001.0.0-SNAPSHOT',\n deploymentType: 'Cloud',\n scmInfo: 'emulated',\n },\n }),\n },\n ],\n\n initialize(config, fixture) {\n const projects = new Map(fixture.projects.map((p) => [p.key, p]));\n const issues = new Map(fixture.issues.map((i) => [i.key, i]));\n const users = new Map((fixture.users ?? []).map((u) => [u.accountId, u]));\n\n const issueCounter: Record<string, number> = {};\n for (const issue of fixture.issues) {\n const num = parseInt(issue.key.split('-')[1], 10);\n if (!isNaN(num)) {\n issueCounter[issue.projectKey] = Math.max(issueCounter[issue.projectKey] ?? 0, num);\n }\n }\n\n return { projects, issues, users, issueCounter, tenant: config.tenant };\n },\n\n defaultFixture: {\n projects: [\n { id: '10000', key: 'TEST', name: 'Test Project' },\n ],\n issues: [\n {\n id: '10001',\n key: 'TEST-1',\n projectKey: 'TEST',\n summary: 'Sample issue',\n description: 'This is a sample issue for testing.',\n status: { name: 'To Do' },\n issuetype: { name: 'Task' },\n priority: { name: 'Medium' },\n created: new Date().toISOString(),\n updated: new Date().toISOString(),\n },\n ],\n users: [\n { accountId: '100001', displayName: 'Test User', emailAddress: 'test@example.com' },\n ],\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Route Handlers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jiraBaseUrl(tenant: string): string {\n return `https://${tenant}.atlassian.net`;\n}\n\nfunction formatIssueResponse(issue: JiraIssue, baseUrl: string): object {\n return {\n id: issue.id,\n key: issue.key,\n self: `${baseUrl}/rest/api/3/issue/${issue.key}`,\n fields: {\n summary: issue.summary,\n description: issue.description ?? null,\n status: issue.status,\n assignee: issue.assignee ?? null,\n reporter: issue.reporter ?? null,\n issuetype: issue.issuetype,\n priority: issue.priority ?? { name: 'Medium' },\n created: issue.created,\n updated: issue.updated,\n labels: issue.labels ?? [],\n project: { key: issue.projectKey },\n },\n };\n}\n\nfunction handleGetIssue(\n req: EmulationRequest,\n ctx: PluginContext<JiraFixture, JiraState>\n): EmulationResponse {\n const issue = ctx.state.issues.get(req.params.issueKey);\n if (!issue) return { status: 404, body: { errorMessages: [`Issue ${req.params.issueKey} not found`] } };\n\n const baseUrl = jiraBaseUrl(ctx.state.tenant);\n return { status: 200, body: formatIssueResponse(issue, baseUrl) };\n}\n\nfunction handleCreateIssue(\n req: EmulationRequest,\n ctx: PluginContext<JiraFixture, JiraState>\n): EmulationResponse {\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return parsed.error;\n const fields = parsed.data.fields ?? {};\n const projectKey = fields.project?.key;\n\n if (!projectKey || !ctx.state.projects.has(projectKey)) {\n return { status: 400, body: { errorMessages: [`Project ${projectKey} not found`] } };\n }\n\n const counter = (ctx.state.issueCounter[projectKey] ?? 0) + 1;\n ctx.state.issueCounter[projectKey] = counter;\n const key = `${projectKey}-${counter}`;\n\n const issue: JiraIssue = {\n id: crypto.randomUUID(),\n key,\n projectKey,\n summary: fields.summary ?? '',\n description: fields.description ?? undefined,\n status: { name: 'To Do' },\n assignee: fields.assignee ?? undefined,\n reporter: fields.reporter ?? undefined,\n issuetype: fields.issuetype ?? { name: 'Task' },\n priority: fields.priority ?? { name: 'Medium' },\n labels: fields.labels ?? [],\n created: new Date().toISOString(),\n updated: new Date().toISOString(),\n };\n\n ctx.state.issues.set(key, issue);\n ctx.log('info', `Created issue ${key}: ${issue.summary}`);\n\n const baseUrl = jiraBaseUrl(ctx.state.tenant);\n return {\n status: 201,\n body: { id: issue.id, key, self: `${baseUrl}/rest/api/3/issue/${key}` },\n };\n}\n\nfunction handleUpdateIssue(\n req: EmulationRequest,\n ctx: PluginContext<JiraFixture, JiraState>\n): EmulationResponse {\n const issue = ctx.state.issues.get(req.params.issueKey);\n if (!issue) return { status: 404, body: { errorMessages: [`Issue ${req.params.issueKey} not found`] } };\n\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return parsed.error;\n const fields = parsed.data.fields ?? {};\n\n if (fields.summary !== undefined) issue.summary = fields.summary;\n if (fields.description !== undefined) issue.description = fields.description;\n if (fields.assignee !== undefined) issue.assignee = fields.assignee;\n if (fields.priority !== undefined) issue.priority = fields.priority;\n if (fields.labels !== undefined) issue.labels = fields.labels;\n issue.updated = new Date().toISOString();\n\n ctx.log('info', `Updated issue ${req.params.issueKey}`);\n return { status: 204 };\n}\n\nfunction handleTransition(\n req: EmulationRequest,\n ctx: PluginContext<JiraFixture, JiraState>\n): EmulationResponse {\n const issue = ctx.state.issues.get(req.params.issueKey);\n if (!issue) return { status: 404, body: { errorMessages: [`Issue ${req.params.issueKey} not found`] } };\n\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return parsed.error;\n const transitionId = parsed.data.transition?.id;\n\n const transitionNames: Record<string, string> = { '11': 'To Do', '21': 'In Progress', '31': 'Done' };\n const newStatus = transitionNames[transitionId];\n if (newStatus) {\n issue.status = { name: newStatus };\n issue.updated = new Date().toISOString();\n ctx.log('info', `Transitioned ${req.params.issueKey} to ${newStatus}`);\n }\n\n return { status: 204 };\n}\n\nfunction handleSearch(\n req: EmulationRequest,\n ctx: PluginContext<JiraFixture, JiraState>\n): EmulationResponse {\n const issues = Array.from(ctx.state.issues.values());\n const baseUrl = jiraBaseUrl(ctx.state.tenant);\n\n return {\n status: 200,\n body: {\n startAt: 0,\n maxResults: issues.length,\n total: issues.length,\n issues: issues.map((i) => formatIssueResponse(i, baseUrl)),\n },\n };\n}\n","/**\n * Slack API Emulation Plugin\n *\n * Emulates the Slack Web API for sandboxed apps so customers can test their\n * Slack integration end-to-end without a real workspace:\n *\n * - Sandbox-side: OAuth token exchange, auth.test, conversations, chat.postMessage\n * (recorded into state for assertions), users/team info.\n * - Browser-side: intercepts the slack.com/oauth/v2/authorize redirect so the\n * connect flow completes headlessly.\n * - Inbound events: builds signed `event_callback` webhooks (app_mention,\n * message, reaction_added) that the control plane fires INTO the app. The\n * HMAC scheme is byte-compatible with Slack's `v0=` signing, so the app's\n * production signature verification passes using the shared signing secret\n * from the env contract.\n *\n * Response shapes mirror the zod schemas in @chatsdet/slack (types.ts) —\n * conformance is asserted in slack.test.ts.\n *\n * @module\n */\n\nimport crypto from 'node:crypto';\nimport { z } from 'zod';\nimport type {\n ActionInterfaceDef,\n EmulationPlugin,\n EmulationRequest,\n EmulationResponse,\n InboundEventDef,\n PluginContext,\n} from '../plugin.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SlackEmuConfig {\n /** Override the app_id reported by oauth.v2.access */\n appId?: string;\n}\n\nconst SlackEmuChannelSchema = z.object({\n id: z.string(),\n name: z.string(),\n is_private: z.boolean().optional(),\n is_member: z.boolean().optional(),\n is_archived: z.boolean().optional(),\n});\n\nconst SlackEmuUserSchema = z.object({\n id: z.string(),\n name: z.string(),\n real_name: z.string().optional(),\n email: z.string().optional(),\n is_bot: z.boolean().optional(),\n});\n\nexport const slackFixtureSchema = z.object({\n team: z.object({\n id: z.string(),\n name: z.string(),\n domain: z.string().optional(),\n }),\n botUserId: z.string(),\n channels: z.array(SlackEmuChannelSchema),\n users: z.array(SlackEmuUserSchema),\n});\n\nexport type SlackEmuChannel = z.infer<typeof SlackEmuChannelSchema>;\nexport type SlackEmuUser = z.infer<typeof SlackEmuUserSchema>;\nexport type SlackFixture = z.infer<typeof slackFixtureSchema>;\n\nexport interface PostedMessage {\n channel: string;\n text: string;\n ts: string;\n thread_ts?: string;\n user: string;\n blocks?: unknown;\n attachments?: unknown;\n}\n\nexport interface SlackState {\n team: SlackFixture['team'];\n botUserId: string;\n appId: string;\n channels: Map<string, SlackEmuChannel>;\n users: Map<string, SlackEmuUser>;\n /** Messages the app posted via chat.postMessage — the assertion surface */\n postedMessages: PostedMessage[];\n botToken: string;\n tsCounter: number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst EMULATED_CODE_PREFIX = 'emulated_code_';\nconst DEFAULT_APP_ID = 'A_EMULATED';\n\n/** Mirrors SLACK_BOT_SCOPES in @chatsdet/slack (kept local — runtime dep is dev-only) */\nconst EMULATED_BOT_SCOPES =\n 'chat:write,channels:read,groups:read,team:read,app_mentions:read,channels:history,groups:history,reactions:read,users:read,users:read.email,files:write';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype SlackCtx = PluginContext<SlackFixture, SlackState>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- parsing untrusted API input\nfunction safeParseJson(body: string | undefined): { ok: true; data: any } | { ok: false; error: EmulationResponse } {\n try {\n return { ok: true, data: JSON.parse(body ?? '{}') };\n } catch {\n return { ok: false, error: slackError('invalid_json') };\n }\n}\n\n/** Slack returns HTTP 200 with `{ok:false, error}` for API-level failures. */\nfunction slackError(error: string): EmulationResponse {\n return { status: 200, body: { ok: false, error } };\n}\n\n/**\n * Enforce bot-token auth the way Slack does: bearer must match the token\n * minted at provision. Returns null when authorized.\n */\nfunction requireBot(req: EmulationRequest, ctx: SlackCtx): EmulationResponse | null {\n const auth = req.headers['authorization'] ?? '';\n const token = auth.startsWith('Bearer ') ? auth.slice('Bearer '.length).trim() : '';\n if (!token) return slackError('not_authed');\n if (token !== ctx.state.botToken) return slackError('invalid_auth');\n return null;\n}\n\n/** Mint a Slack-style message ts: unix seconds + monotonic counter suffix. */\nfunction mintTs(state: SlackState): string {\n const seconds = Math.floor(Date.now() / 1000);\n state.tsCounter += 1;\n return `${seconds}.${String(state.tsCounter).padStart(6, '0')}`;\n}\n\n/** Read a param from query string (GET) or JSON body (POST). */\nfunction readParam(req: EmulationRequest, key: string): string | undefined {\n const fromQuery = req.url.searchParams.get(key);\n if (fromQuery !== null) return fromQuery;\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return undefined;\n const value = parsed.data[key];\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction signSlackRequest(signingSecret: string, timestamp: string, body: string): string {\n const basestring = `v0:${timestamp}:${body}`;\n return `v0=${crypto.createHmac('sha256', signingSecret).update(basestring).digest('hex')}`;\n}\n\n/** Build a signed event_callback request aimed at the app's webhook path. */\nfunction buildSignedEvent(opts: {\n env: Record<string, string>;\n targetPath: string;\n teamId: string;\n event: Record<string, unknown>;\n}): ReturnType<InboundEventDef['build']> {\n const body = JSON.stringify({\n type: 'event_callback',\n token: 'emulated-verification-token',\n team_id: opts.teamId,\n event: opts.event,\n event_id: `Ev${crypto.randomUUID().replaceAll('-', '').slice(0, 16).toUpperCase()}`,\n });\n // Timestamp is minted at fire time so the app's 5-minute window holds.\n const timestamp = String(Math.floor(Date.now() / 1000));\n const signingSecret = opts.env.signingSecret ?? '';\n return {\n method: 'POST',\n path: opts.targetPath,\n headers: {\n 'content-type': 'application/json',\n 'x-slack-request-timestamp': timestamp,\n 'x-slack-signature': signSlackRequest(signingSecret, timestamp, body),\n },\n body,\n };\n}\n\nfunction teamIdFrom(fixture: unknown, override?: string): string {\n if (override) return override;\n const parsed = slackFixtureSchema.safeParse(fixture);\n return parsed.success ? parsed.data.team.id : 'T_EMULATED';\n}\n\nfunction nowEventTs(): string {\n return `${Math.floor(Date.now() / 1000)}.000001`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Inbound events\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst appMentionParamsSchema = z.object({\n channel: z.string(),\n user: z.string(),\n text: z.string(),\n ts: z.string().optional(),\n thread_ts: z.string().optional(),\n team_id: z.string().optional(),\n});\n\nconst messageParamsSchema = z.object({\n channel: z.string(),\n user: z.string(),\n text: z.string(),\n thread_ts: z.string().optional(),\n ts: z.string().optional(),\n channel_type: z.enum(['channel', 'group', 'im', 'mpim']).optional(),\n team_id: z.string().optional(),\n});\n\nconst reactionAddedParamsSchema = z.object({\n user: z.string(),\n reaction: z.string(),\n channel: z.string(),\n message_ts: z.string(),\n item_user: z.string().optional(),\n team_id: z.string().optional(),\n});\n\nconst inboundEvents: InboundEventDef[] = [\n {\n id: 'app-mention',\n description: 'A user @-mentions the app in a channel (signed app_mention event_callback)',\n paramsSchema: appMentionParamsSchema,\n build: ({ params, env, targetPath, fixture }) => {\n const p = appMentionParamsSchema.parse(params);\n return buildSignedEvent({\n env,\n targetPath,\n teamId: teamIdFrom(fixture, p.team_id),\n event: {\n type: 'app_mention',\n user: p.user,\n text: p.text,\n channel: p.channel,\n ts: p.ts ?? nowEventTs(),\n ...(p.thread_ts ? { thread_ts: p.thread_ts } : {}),\n },\n });\n },\n },\n {\n id: 'message',\n description: 'A user posts a (thread) message in a channel (signed message event_callback)',\n paramsSchema: messageParamsSchema,\n build: ({ params, env, targetPath, fixture }) => {\n const p = messageParamsSchema.parse(params);\n return buildSignedEvent({\n env,\n targetPath,\n teamId: teamIdFrom(fixture, p.team_id),\n event: {\n type: 'message',\n user: p.user,\n text: p.text,\n channel: p.channel,\n ts: p.ts ?? nowEventTs(),\n ...(p.thread_ts ? { thread_ts: p.thread_ts } : {}),\n ...(p.channel_type ? { channel_type: p.channel_type } : {}),\n },\n });\n },\n },\n {\n id: 'reaction-added',\n description: 'A user reacts to a message (signed reaction_added event_callback)',\n paramsSchema: reactionAddedParamsSchema,\n build: ({ params, env, targetPath, fixture }) => {\n const p = reactionAddedParamsSchema.parse(params);\n return buildSignedEvent({\n env,\n targetPath,\n teamId: teamIdFrom(fixture, p.team_id),\n event: {\n type: 'reaction_added',\n user: p.user,\n reaction: p.reaction,\n item: { type: 'message', channel: p.channel, ts: p.message_ts },\n ...(p.item_user ? { item_user: p.item_user } : {}),\n event_ts: nowEventTs(),\n },\n });\n },\n },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Action interfaces\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst actionInterfaces: ActionInterfaceDef[] = [\n {\n slug: 'slack-seed-data',\n label: 'Seed Slack data',\n description:\n 'Replace the emulated Slack workspace fixture (team, channels, users). Idempotent — re-running resets to exactly the given data.',\n inputSchema: {\n type: 'object',\n properties: {\n fixture: {\n type: 'string',\n description: 'JSON fixture: { team, botUserId, channels, users }',\n },\n },\n required: ['fixture'],\n },\n outputSchema: {\n type: 'object',\n properties: { ok: { type: 'boolean' } },\n },\n scaffoldScript: `# Replace the emulated Slack workspace data.\n# $INPUT_FIXTURE is the JSON fixture; the runner exports EMULATION_BASE_URL\n# and EMULATION_CONTROL_TOKEN automatically when emulation is enabled.\ncurl -sf -X POST \"$EMULATION_BASE_URL/plugins/slack/fixture\" \\\\\n -H \"Authorization: Bearer $EMULATION_CONTROL_TOKEN\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d \"{\\\\\"fixture\\\\\": $INPUT_FIXTURE}\"`,\n },\n {\n slug: 'slack-fire-event',\n label: 'Fire a Slack event into the app',\n description:\n \"Send a signed Slack webhook (app-mention | message | reaction-added) into the app's Slack events endpoint. Set the target path to YOUR app's webhook route.\",\n inputSchema: {\n type: 'object',\n properties: {\n event: {\n type: 'string',\n enum: ['app-mention', 'message', 'reaction-added'],\n description: 'Inbound event id',\n },\n params: { type: 'string', description: 'JSON params for the event (channel, user, text, …)' },\n },\n required: ['event', 'params'],\n },\n outputSchema: {\n type: 'object',\n properties: {\n ok: { type: 'boolean' },\n status: { type: 'number' },\n },\n },\n scaffoldScript: `# Fire a signed Slack event into the app.\n# EDIT the targetPath to your app's Slack webhook route before saving.\ncurl -sf -X POST \"$EMULATION_BASE_URL/fire\" \\\\\n -H \"Authorization: Bearer $EMULATION_CONTROL_TOKEN\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d \"{\\\\\"pluginId\\\\\": \\\\\"slack\\\\\", \\\\\"eventId\\\\\": \\\\\"$INPUT_EVENT\\\\\", \\\\\"params\\\\\": $INPUT_PARAMS, \\\\\"targetPath\\\\\": \\\\\"/integrations/slack/events\\\\\"}\"`,\n },\n {\n slug: 'slack-recorded-messages',\n label: 'Read messages the app posted to Slack',\n description:\n 'Return the messages the app sent via chat.postMessage since boot (or the last seed/reset) for assertions.',\n inputSchema: { type: 'object', properties: {} },\n outputSchema: {\n type: 'object',\n properties: {\n messages: { type: 'array', description: 'Posted messages: { channel, text, ts, thread_ts?, user }' },\n },\n },\n scaffoldScript: `# Read messages the app posted to the emulated Slack.\ncurl -sf \"$EMULATION_BASE_URL/plugins/slack/posted-messages\" \\\\\n -H \"Authorization: Bearer $EMULATION_CONTROL_TOKEN\"`,\n },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const slackPlugin: EmulationPlugin<SlackEmuConfig, SlackFixture, SlackState> = {\n id: 'slack',\n name: 'Slack API',\n version: '1.0.0',\n\n domains: ['slack.com'],\n needsBrowserIntercept: true,\n\n fixtureSchema: slackFixtureSchema,\n\n envContract: [\n {\n logicalKey: 'signingSecret',\n strategy: 'random-hex',\n bytes: 32,\n sensitive: true,\n description: \"Signs inbound webhooks — map to your app's Slack signing-secret env var\",\n },\n {\n logicalKey: 'botToken',\n strategy: 'random-hex',\n bytes: 16,\n prefix: 'xoxb-emulated-',\n sensitive: true,\n description: 'Bot token the emulator accepts — issued by oauth.v2.access, or map it directly',\n },\n {\n logicalKey: 'clientId',\n strategy: 'static',\n staticValue: '1234567890.0987654321',\n description: \"OAuth client id — map to your app's Slack client-id env var\",\n },\n {\n logicalKey: 'clientSecret',\n strategy: 'static',\n staticValue: 'emulated-client-secret',\n sensitive: true,\n description: \"OAuth client secret — map to your app's Slack client-secret env var\",\n },\n ],\n\n inboundEvents,\n actionInterfaces,\n\n controlReads: [\n {\n path: 'posted-messages',\n handler: (_req, ctx: SlackCtx) => ({\n status: 200,\n body: { messages: ctx.state.postedMessages },\n }),\n },\n {\n path: 'channels',\n handler: (_req, ctx: SlackCtx) => ({\n status: 200,\n body: { channels: Array.from(ctx.state.channels.values()) },\n }),\n },\n ],\n\n // ── Sandbox-side routes ──────────────────────────────────────────────────\n\n routes: [\n { method: 'POST', path: '/api/oauth.v2.access', handler: handleOAuthAccess },\n { method: 'POST', path: '/api/auth.test', handler: handleAuthTest },\n { method: 'GET', path: '/api/conversations.list', handler: handleConversationsList },\n { method: 'POST', path: '/api/conversations.list', handler: handleConversationsList },\n { method: 'POST', path: '/api/chat.postMessage', handler: handlePostMessage },\n { method: 'POST', path: '/api/conversations.join', handler: handleConversationsJoin },\n { method: 'GET', path: '/api/conversations.history', handler: handleConversationsHistory },\n { method: 'GET', path: '/api/conversations.replies', handler: handleConversationsReplies },\n { method: 'GET', path: '/api/users.info', handler: handleUsersInfo },\n { method: 'POST', path: '/api/users.info', handler: handleUsersInfo },\n { method: 'GET', path: '/api/team.info', handler: handleTeamInfo },\n { method: 'POST', path: '/api/team.info', handler: handleTeamInfo },\n // Best-effort Assistant status — emulate the missing-scope soft failure\n {\n method: 'POST',\n path: '/api/assistant.threads.setStatus',\n handler: (req, ctx: SlackCtx) => requireBot(req, ctx) ?? slackError('missing_scope'),\n },\n // File uploads are not emulated — fail closed so nothing leaks to real Slack\n {\n method: 'GET',\n path: '/api/files.getUploadURLExternal',\n handler: (req, ctx: SlackCtx) => requireBot(req, ctx) ?? slackError('not_emulated'),\n },\n {\n method: 'POST',\n path: '/api/files.completeUploadExternal',\n handler: (req, ctx: SlackCtx) => requireBot(req, ctx) ?? slackError('not_emulated'),\n },\n ],\n\n // ── Browser-side routes ──────────────────────────────────────────────────\n\n getBrowserRoutes(_fixture) {\n return [\n {\n urlPattern: '**/slack.com/oauth/v2/authorize**',\n handler: async (route, _fix) => {\n const url = new URL(route.request().url());\n const redirectUri = url.searchParams.get('redirect_uri');\n const state = url.searchParams.get('state') || '';\n\n if (!redirectUri) {\n await route.continue();\n return;\n }\n\n const callbackUrl = new URL(redirectUri);\n callbackUrl.searchParams.set('code', `${EMULATED_CODE_PREFIX}${crypto.randomUUID()}`);\n if (state) callbackUrl.searchParams.set('state', state);\n\n await route.fulfill({\n status: 302,\n headers: { location: callbackUrl.toString() },\n body: '',\n });\n },\n },\n ];\n },\n\n // ── Initialization ───────────────────────────────────────────────────────\n\n initialize(config, fixture, env) {\n return {\n team: fixture.team,\n botUserId: fixture.botUserId,\n appId: config.appId ?? DEFAULT_APP_ID,\n channels: new Map(fixture.channels.map((c) => [c.id, c])),\n users: new Map(fixture.users.map((u) => [u.id, u])),\n postedMessages: [],\n botToken: env?.botToken ?? 'xoxb-emulated-fallback',\n tsCounter: 0,\n };\n },\n\n defaultFixture: {\n team: { id: 'T_EMULATED', name: 'Emulated Workspace', domain: 'emulated' },\n botUserId: 'U_BOT',\n channels: [{ id: 'C_GENERAL', name: 'general', is_private: false, is_member: false, is_archived: false }],\n users: [\n { id: 'U_BOT', name: 'canary-bot', real_name: 'Canary Bot', is_bot: true },\n { id: 'U_HUMAN', name: 'testuser', real_name: 'Test User', email: 'testuser@example.com', is_bot: false },\n ],\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Route Handlers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction handleOAuthAccess(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const params = new URLSearchParams(req.body ?? '');\n const code = params.get('code') ?? '';\n const clientId = params.get('client_id') ?? '';\n const clientSecret = params.get('client_secret') ?? '';\n\n if (ctx.env.clientId && clientId !== ctx.env.clientId) return slackError('invalid_client_id');\n if (ctx.env.clientSecret && clientSecret !== ctx.env.clientSecret) return slackError('bad_client_secret');\n if (!code.startsWith(EMULATED_CODE_PREFIX)) {\n ctx.log('warn', `OAuth exchange with non-emulated code: ${code}`);\n return slackError('invalid_code');\n }\n\n const firstHuman = Array.from(ctx.state.users.values()).find((u) => !u.is_bot);\n ctx.log('info', `Issued bot token for team ${ctx.state.team.id}`);\n\n return {\n status: 200,\n body: {\n ok: true,\n access_token: ctx.state.botToken,\n token_type: 'bot',\n scope: EMULATED_BOT_SCOPES,\n bot_user_id: ctx.state.botUserId,\n app_id: ctx.state.appId,\n team: { id: ctx.state.team.id, name: ctx.state.team.name },\n authed_user: { id: firstHuman?.id ?? 'U_HUMAN' },\n },\n };\n}\n\nfunction handleAuthTest(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n return {\n status: 200,\n body: {\n ok: true,\n url: `https://${ctx.state.team.domain ?? 'emulated'}.slack.com/`,\n team: ctx.state.team.name,\n user: 'canary-bot',\n team_id: ctx.state.team.id,\n user_id: ctx.state.botUserId,\n bot_id: 'B_EMULATED',\n },\n };\n}\n\nfunction handleConversationsList(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n const excludeArchived = req.url.searchParams.get('exclude_archived') === 'true';\n const channels = Array.from(ctx.state.channels.values()).filter(\n (c) => !excludeArchived || !c.is_archived\n );\n\n return {\n status: 200,\n body: {\n ok: true,\n channels: channels.map((c) => ({\n id: c.id,\n name: c.name,\n is_channel: true,\n is_private: c.is_private ?? false,\n is_member: c.is_member ?? false,\n is_archived: c.is_archived ?? false,\n })),\n response_metadata: { next_cursor: '' },\n },\n };\n}\n\nfunction handlePostMessage(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return parsed.error;\n const { channel, text } = parsed.data;\n if (!channel) return slackError('channel_not_found');\n\n const ts = mintTs(ctx.state);\n const message: PostedMessage = {\n channel: String(channel),\n text: String(text ?? ''),\n ts,\n user: ctx.state.botUserId,\n ...(parsed.data.thread_ts ? { thread_ts: String(parsed.data.thread_ts) } : {}),\n ...(parsed.data.blocks ? { blocks: parsed.data.blocks } : {}),\n ...(parsed.data.attachments ? { attachments: parsed.data.attachments } : {}),\n };\n ctx.state.postedMessages.push(message);\n ctx.log('info', `chat.postMessage → ${message.channel}: ${message.text.slice(0, 80)}`);\n\n return {\n status: 200,\n body: {\n ok: true,\n channel: message.channel,\n ts,\n message: { type: 'message', text: message.text, user: ctx.state.botUserId, ts },\n },\n };\n}\n\nfunction handleConversationsJoin(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n const parsed = safeParseJson(req.body);\n if (!parsed.ok) return parsed.error;\n const channelId = String(parsed.data.channel ?? '');\n const channel = ctx.state.channels.get(channelId);\n if (!channel) return slackError('channel_not_found');\n\n channel.is_member = true;\n return {\n status: 200,\n body: { ok: true, channel: { id: channel.id, name: channel.name, is_member: true } },\n };\n}\n\n/** Serve message lookups from postedMessages (parents only). */\nfunction handleConversationsHistory(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n const channel = req.url.searchParams.get('channel') ?? '';\n const latest = req.url.searchParams.get('latest');\n let messages = ctx.state.postedMessages.filter((m) => m.channel === channel && !m.thread_ts);\n if (latest) messages = messages.filter((m) => m.ts === latest);\n\n return {\n status: 200,\n body: {\n ok: true,\n messages: messages.map((m) => ({ type: 'message', user: m.user, text: m.text, ts: m.ts })),\n has_more: false,\n },\n };\n}\n\nfunction handleConversationsReplies(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n const channel = req.url.searchParams.get('channel') ?? '';\n const ts = req.url.searchParams.get('ts') ?? '';\n const thread = ctx.state.postedMessages.filter(\n (m) => m.channel === channel && (m.ts === ts || m.thread_ts === ts)\n );\n\n return {\n status: 200,\n body: {\n ok: true,\n messages: thread.map((m) => ({\n type: 'message',\n user: m.user,\n text: m.text,\n ts: m.ts,\n ...(m.thread_ts ? { thread_ts: m.thread_ts } : {}),\n })),\n has_more: false,\n },\n };\n}\n\nfunction handleUsersInfo(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n const userId = readParam(req, 'user') ?? '';\n const user = ctx.state.users.get(userId);\n if (!user) return slackError('user_not_found');\n\n return {\n status: 200,\n body: {\n ok: true,\n user: {\n id: user.id,\n name: user.name,\n real_name: user.real_name ?? user.name,\n is_bot: user.is_bot ?? false,\n deleted: false,\n profile: {\n display_name: user.name,\n real_name: user.real_name ?? user.name,\n ...(user.email ? { email: user.email } : {}),\n },\n },\n },\n };\n}\n\nfunction handleTeamInfo(req: EmulationRequest, ctx: SlackCtx): EmulationResponse {\n const denied = requireBot(req, ctx);\n if (denied) return denied;\n\n return {\n status: 200,\n body: {\n ok: true,\n team: {\n id: ctx.state.team.id,\n name: ctx.state.team.name,\n domain: ctx.state.team.domain ?? 'emulated',\n },\n },\n };\n}\n","/**\n * Emulation Plugin Registry\n *\n * Central registry of all available emulation plugins. Add new plugins here\n * to make them available for sandbox configuration.\n *\n * @module\n */\n\nimport type { EmulationPlugin } from '../plugin.js';\nimport { emailPlugin } from './email.js';\nimport { googleOAuthPlugin } from './google-oauth.js';\nimport { jiraPlugin } from './jira.js';\nimport { slackPlugin } from './slack.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- type-erased registry for heterogeneous plugins\ntype AnyPlugin = EmulationPlugin<any, any, any>;\n\n/** All registered emulation plugins, keyed by ID. */\nconst pluginRegistry = new Map<string, AnyPlugin>([\n [emailPlugin.id, emailPlugin],\n [googleOAuthPlugin.id, googleOAuthPlugin],\n [jiraPlugin.id, jiraPlugin],\n [slackPlugin.id, slackPlugin],\n]);\n\n/** Look up a plugin by ID. Returns undefined if not found. */\nexport function getPlugin(pluginId: string): AnyPlugin | undefined {\n return pluginRegistry.get(pluginId);\n}\n\n/** Get all registered plugin IDs. */\nexport function getPluginIds(): string[] {\n return Array.from(pluginRegistry.keys());\n}\n\n/** Get all registered plugins. */\nexport function getAllPlugins(): AnyPlugin[] {\n return Array.from(pluginRegistry.values());\n}\n\n/** Register a new plugin at runtime (for custom/third-party plugins). */\nexport function registerPlugin(plugin: AnyPlugin): void {\n pluginRegistry.set(plugin.id, plugin);\n}\n\nexport { emailPlugin, emailFixtureSchema } from './email.js';\nexport type { CapturedEmail, EmailEmuConfig, EmailFixture, EmailState, EmailProvider } from './email.js';\nexport { googleOAuthPlugin } from './google-oauth.js';\nexport { jiraPlugin } from './jira.js';\nexport { slackPlugin, slackFixtureSchema } from './slack.js';\nexport type { SlackFixture, SlackState, PostedMessage } from './slack.js';\n","import process from 'node:process';\nimport { readFileSync } from 'node:fs';\nimport type { EmulationPluginEntry, EmulationTemplateConfig } from '@chatsdet/emulation';\nimport { getAllPlugins, getPluginIds } from '@chatsdet/emulation/plugins';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\n\n/** One configured plugin as enriched by GET .../emulation (descriptions only, never secret values). */\ntype EmulationCatalogEntry = {\n pluginId: string;\n name: string;\n version: string;\n enabled: boolean;\n envContract: Array<{\n logicalKey: string;\n strategy: string;\n sensitive: boolean;\n description?: string;\n }>;\n inboundEvents: Array<{ id: string; description?: string }>;\n actionInterfaces: Array<{ slug: string; implemented: boolean }>;\n};\n\nconst pad = (value: string, width: number): string => value.padEnd(width);\n\n/**\n * Read the template's stored emulation config + plugin catalog. The GET route\n * returns `{ ok, config, catalog }`, not a `data` wrapper. Falls back to the\n * empty default config when the template has none.\n */\nasync function fetchEmulation(\n apiUrl: string,\n token: string,\n templateId: string\n): Promise<{ config: EmulationTemplateConfig; catalog: EmulationCatalogEntry[] }> {\n const res = await apiRequest<{\n ok: boolean;\n error?: string;\n config?: EmulationTemplateConfig;\n catalog?: EmulationCatalogEntry[];\n }>(apiUrl, token, 'GET', `/org/environments/templates/${templateId}/emulation`);\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n\n // Fresh literal (not a shared module singleton) so callers/transforms can\n // never accidentally mutate a process-wide default.\n return { config: res.config ?? { enabled: false, plugins: [] }, catalog: res.catalog ?? [] };\n}\n\n/**\n * Write the full emulation config back. The PATCH route is a full replace of\n * `{ enabled, plugins[] }`, so every mutating command must read-modify-write\n * the whole object.\n */\nasync function patchEmulation(\n apiUrl: string,\n token: string,\n templateId: string,\n config: EmulationTemplateConfig\n): Promise<void> {\n const res = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'PATCH',\n `/org/environments/templates/${templateId}/emulation`,\n { enabled: config.enabled, plugins: config.plugins },\n { timeoutMs: 90_000 }\n );\n\n if (!res.ok) {\n console.error(`Error: ${res.error}`);\n process.exit(1);\n }\n}\n\n/** Reject a pluginId that is not a known emulation plugin, with the valid list. */\nfunction assertKnownPlugin(pluginId: string): void {\n const ids = getPluginIds();\n if (!ids.includes(pluginId)) {\n console.error(`Error: unknown plugin '${pluginId}'. Available: ${ids.join(', ')}`);\n process.exit(1);\n }\n}\n\nfunction readJsonFileOrExit(path: string, flag: string): unknown {\n let raw: string;\n try {\n raw = readFileSync(path, 'utf-8');\n } catch (err) {\n console.error(\n `Error reading ${flag} file '${path}': ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n try {\n return JSON.parse(raw);\n } catch (err) {\n console.error(\n `Error parsing ${flag} file '${path}' as JSON: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n process.exit(1);\n }\n}\n\n/**\n * Like `readJsonFileOrExit` but rejects anything that is not a plain JSON object\n * (arrays, strings, numbers, null all parse fine but would fail the server's\n * `z.record(...)` validation with a cryptic error). Used for `--config` and\n * `--env-mapping`; `--fixture` stays unrestricted since fixtures are arbitrary.\n */\nfunction readJsonObjectOrExit(path: string, flag: string): Record<string, unknown> {\n const parsed = readJsonFileOrExit(path, flag);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n console.error(\n `Error: ${flag} file '${path}' must contain a JSON object, not ${\n Array.isArray(parsed) ? 'an array' : typeof parsed\n }.`\n );\n process.exit(1);\n }\n return parsed as Record<string, unknown>;\n}\n\n// The PATCH route is a full replace, so each mutating command produces a fresh\n// EmulationTemplateConfig from the fetched one. These are pure so the\n// read-modify-write semantics can be tested without network/IO.\n\n/** Flip the master switch, leaving plugin entries untouched. */\nexport function withEmulationMaster(\n config: EmulationTemplateConfig,\n enabled: boolean\n): EmulationTemplateConfig {\n return { enabled, plugins: [...(config.plugins ?? [])] };\n}\n\n/**\n * Toggle one plugin entry's `enabled`. Enabling a not-yet-configured plugin\n * adds a bare entry; enabling any plugin also turns the master switch on.\n * Disabling assumes the entry exists (callers validate first for a friendly error).\n */\nexport function withPluginEnabled(\n config: EmulationTemplateConfig,\n pluginId: string,\n enabled: boolean\n): EmulationTemplateConfig {\n const plugins = [...(config.plugins ?? [])];\n const idx = plugins.findIndex((plugin) => plugin.pluginId === pluginId);\n if (idx === -1) {\n if (enabled) plugins.push({ pluginId, enabled: true, config: {} });\n } else {\n plugins[idx] = { ...plugins[idx], enabled };\n }\n return { enabled: enabled ? true : config.enabled, plugins };\n}\n\n/**\n * Upsert a plugin entry's config/fixture/envMapping, preserving any field not\n * provided in `patch` and the existing `enabled`. New entries default to\n * `enabled: false`: `set` only configures; activation is always explicit.\n */\nexport function withPluginConfig(\n config: EmulationTemplateConfig,\n pluginId: string,\n patch: {\n config?: Record<string, unknown>;\n fixture?: unknown;\n envMapping?: Record<string, string | string[]>;\n }\n): EmulationTemplateConfig {\n const plugins = [...(config.plugins ?? [])];\n const idx = plugins.findIndex((plugin) => plugin.pluginId === pluginId);\n const existing = idx === -1 ? undefined : plugins[idx];\n\n const merged: EmulationPluginEntry = {\n pluginId,\n enabled: existing?.enabled ?? false,\n config: patch.config !== undefined ? patch.config : (existing?.config ?? {}),\n };\n const fixture = patch.fixture !== undefined ? patch.fixture : existing?.fixture;\n if (fixture !== undefined) merged.fixture = fixture;\n const envMapping = patch.envMapping !== undefined ? patch.envMapping : existing?.envMapping;\n if (envMapping !== undefined) merged.envMapping = envMapping;\n\n if (idx === -1) plugins.push(merged);\n else plugins[idx] = merged;\n return { enabled: config.enabled, plugins };\n}\n\n/** Drop a plugin entry (callers validate existence first). */\nexport function withoutPlugin(\n config: EmulationTemplateConfig,\n pluginId: string\n): EmulationTemplateConfig {\n return {\n enabled: config.enabled,\n plugins: (config.plugins ?? []).filter((plugin) => plugin.pluginId !== pluginId),\n };\n}\n\nasync function handleEmulationGet(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const positional = argv.filter((arg) => !arg.startsWith('-'));\n const templateId = positional[0];\n const json = hasFlag(argv, '--json');\n\n if (!templateId) {\n console.error('Error: template ID required. Usage: canary sandbox emulation get <template-id>');\n process.exit(1);\n }\n\n const { config, catalog } = await fetchEmulation(apiUrl, token, templateId);\n const available = getAllPlugins().map((plugin) => ({ id: plugin.id, name: plugin.name }));\n\n if (json) {\n console.log(JSON.stringify({ config, catalog, availablePlugins: available }, null, 2));\n return;\n }\n\n console.log(`Emulation: ${config.enabled ? 'ENABLED' : 'disabled'} (master switch)`);\n const configured = config.plugins ?? [];\n if (configured.length === 0) {\n console.log(' No plugins configured.');\n } else {\n console.log(` Configured plugins (${configured.length}):`);\n for (const plugin of configured) {\n const status = plugin.enabled ? '' : ' [disabled]';\n console.log(` ${pad(plugin.pluginId, 16)}${status}`);\n const catalogEntry = catalog.find((entry) => entry.pluginId === plugin.pluginId);\n if (catalogEntry && catalogEntry.envContract.length > 0) {\n console.log(\n ` env contract: ${catalogEntry.envContract.map((entry) => entry.logicalKey).join(', ')}`\n );\n }\n if (catalogEntry && catalogEntry.actionInterfaces.length > 0) {\n const implemented = catalogEntry.actionInterfaces.filter((action) => action.implemented).length;\n console.log(\n ` action interfaces: ${implemented}/${catalogEntry.actionInterfaces.length} implemented`\n );\n }\n const keys = Object.keys(plugin.config ?? {});\n if (keys.length > 0) console.log(` config keys: ${keys.join(', ')}`);\n const extras = [\n plugin.fixture !== undefined ? 'fixture' : null,\n plugin.envMapping ? 'envMapping' : null,\n ].filter(Boolean);\n if (extras.length > 0) console.log(` set: ${extras.join(', ')}`);\n }\n }\n console.log(` Available plugins: ${available.map((plugin) => plugin.id).join(', ')}`);\n}\n\n/** Shared enable/disable for the master switch or a single plugin entry. */\nasync function setEmulationEnabled(\n argv: string[],\n apiUrl: string,\n token: string,\n enable: boolean\n): Promise<void> {\n const positional = argv.filter((arg) => !arg.startsWith('-'));\n const templateId = positional[0];\n const pluginId = positional[1];\n const verb = enable ? 'enable' : 'disable';\n\n if (!templateId) {\n console.error(\n `Error: template ID required. Usage: canary sandbox emulation ${verb} <template-id> [pluginId]`\n );\n process.exit(1);\n }\n\n const { config } = await fetchEmulation(apiUrl, token, templateId);\n let next: EmulationTemplateConfig;\n\n if (!pluginId) {\n next = withEmulationMaster(config, enable);\n } else {\n assertKnownPlugin(pluginId);\n const exists = (config.plugins ?? []).some((plugin) => plugin.pluginId === pluginId);\n if (!enable && !exists) {\n console.error(`Error: plugin '${pluginId}' is not configured on this template.`);\n process.exit(1);\n }\n next = withPluginEnabled(config, pluginId, enable);\n }\n\n await patchEmulation(apiUrl, token, templateId, next);\n console.log(pluginId ? `Plugin ${pluginId} ${verb}d` : `Emulation ${verb}d`);\n}\n\nasync function handleEmulationSet(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const positional = argv.filter((arg) => !arg.startsWith('-'));\n const templateId = positional[0];\n const pluginId = positional[1];\n\n if (!templateId || !pluginId) {\n console.error('Error: template ID and pluginId required.');\n console.error(\n 'Usage: canary sandbox emulation set <template-id> <pluginId> [--config <file>] [--fixture <file>] [--env-mapping <file>]'\n );\n process.exit(1);\n }\n assertKnownPlugin(pluginId);\n\n const configPath = getArgValue(argv, '--config');\n const fixturePath = getArgValue(argv, '--fixture');\n const envMappingPath = getArgValue(argv, '--env-mapping');\n\n if (!configPath && !fixturePath && !envMappingPath) {\n console.error('Error: provide at least one of --config, --fixture, --env-mapping');\n process.exit(1);\n }\n\n const pluginConfig = configPath ? readJsonObjectOrExit(configPath, '--config') : undefined;\n const fixture = fixturePath ? readJsonFileOrExit(fixturePath, '--fixture') : undefined;\n const envMapping = envMappingPath\n ? (readJsonObjectOrExit(envMappingPath, '--env-mapping') as Record<\n string,\n string | string[]\n >)\n : undefined;\n\n const { config } = await fetchEmulation(apiUrl, token, templateId);\n const next = withPluginConfig(config, pluginId, {\n ...(pluginConfig !== undefined ? { config: pluginConfig } : {}),\n ...(fixture !== undefined ? { fixture } : {}),\n ...(envMapping !== undefined ? { envMapping } : {}),\n });\n\n await patchEmulation(apiUrl, token, templateId, next);\n // A plugin only runs when BOTH the master switch and its own entry are on.\n // `set` never flips either, so point the user at `enable` unless it is already active.\n const entry = next.plugins.find((plugin) => plugin.pluginId === pluginId);\n const active = next.enabled && entry?.enabled;\n const hint = active ? '' : ` (inactive — run \"emulation enable ${templateId} ${pluginId}\" to activate)`;\n console.log(`Emulation plugin set: ${pluginId}${hint}`);\n}\n\nasync function handleEmulationRemove(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const positional = argv.filter((arg) => !arg.startsWith('-'));\n const templateId = positional[0];\n const pluginId = positional[1];\n\n if (!templateId || !pluginId) {\n console.error(\n 'Error: template ID and pluginId required. Usage: canary sandbox emulation remove <template-id> <pluginId>'\n );\n process.exit(1);\n }\n\n const { config } = await fetchEmulation(apiUrl, token, templateId);\n if (!(config.plugins ?? []).some((plugin) => plugin.pluginId === pluginId)) {\n console.error(`Error: plugin '${pluginId}' is not configured on this template.`);\n process.exit(1);\n }\n\n const next = withoutPlugin(config, pluginId);\n\n await patchEmulation(apiUrl, token, templateId, next);\n console.log(`Emulation plugin removed: ${pluginId}`);\n}\n\nexport async function handleEmulation(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [action, ...rest] = argv;\n switch (action) {\n case 'get':\n await handleEmulationGet(rest, apiUrl, token);\n break;\n case 'enable':\n await setEmulationEnabled(rest, apiUrl, token, true);\n break;\n case 'disable':\n await setEmulationEnabled(rest, apiUrl, token, false);\n break;\n case 'set':\n await handleEmulationSet(rest, apiUrl, token);\n break;\n case 'remove':\n case 'rm':\n await handleEmulationRemove(rest, apiUrl, token);\n break;\n default:\n console.error(\n `Unknown emulation action: ${action ?? '(none)'}. Use get/enable/disable/set/remove.`\n );\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["process","readFileSync","crypto","captured","crypto","crypto","crypto","crypto","crypto","safeParseJson","crypto","z","EMULATED_CODE_PREFIX","safeParseJson","pad","process","readFileSync","a"]}