@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/workflow.ts","../src/workflow-create.ts","../src/workflow-get.ts","../src/workflow-format.ts","../src/workflow-run.ts","../src/cli-format.ts","../src/workflow-runs.ts","../src/workflow-sync.ts","../src/workflow-api-sequence.ts","../src/workflow-api-sequence-cmds.ts","../src/workflow-seed-create.ts"],"sourcesContent":["/**\n * CLI Workflow Management\n *\n * Inspect workflow definitions and steps from the terminal.\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport {\n apiRequest,\n fetchWorkflowEnvironments,\n renderWorkflowUserError,\n resolveEnvironmentByNameOrId,\n} from './cli-helpers.js';\nimport { fetchOrExit } from './api-fetch.js';\nimport { applyWorkflowTagFlags } from './tag.js';\nimport { specExtension } from './brand.js';\nimport { handleWorkflowCreate } from './workflow-create.js';\nimport { handleWorkflowGet } from './workflow-get.js';\nimport { handleWorkflowRun } from './workflow-run.js';\nimport { runWorkflowRuns } from './workflow-runs.js';\nimport { handleWorkflowSync } from './workflow-sync.js';\nimport { handleWorkflowGenerateApiSequence } from './workflow-api-sequence.js';\nimport { handleWorkflowApiSequence } from './workflow-api-sequence-cmds.js';\nimport { handleWorkflowSeedCreate } from './workflow-seed-create.js';\nimport { WORKFLOW_GUIDE_SECTIONS } from '@chatsdet/content/workflow-guide';\nimport { topoOrderNodes } from '@chatsdet/workflow-diff';\nimport { printGuide } from '@chatsdet/content';\nimport { USER_SETTABLE_WORKFLOW_STATUSES } from '@chatsdet/types';\nimport type { PullWorkflow } from '@chatsdet/canary-spec';\nimport { getNodeTitle, truncate, type WorkflowDetailResponse } from './workflow-format.js';\n\nexport { shouldPrintWorkflowUrlTrailer } from './workflow-get.js';\n\nconst WORKFLOW_STATUS_DESCRIPTIONS: Record<\n (typeof USER_SETTABLE_WORKFLOW_STATUSES)[number],\n string\n> = {\n draft: 'not yet approved — no human has signed off on the spec',\n approved: 'a human verified the test checks the right thing',\n};\n\nconst formatWorkflowStatusList = (): string =>\n USER_SETTABLE_WORKFLOW_STATUSES.map(\n (s) => `${s} (${WORKFLOW_STATUS_DESCRIPTIONS[s]})`\n ).join(', ');\n\n/* ── Types ────────────────────────────────────────────────────────────── */\n\ntype Pagination = {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n};\n\ntype WorkflowListItem = {\n id: string;\n name: string;\n status: string;\n flowType: string;\n nodeCount?: number;\n};\n\ntype WorkflowListResponse = {\n ok: boolean;\n error?: string;\n data: WorkflowListItem[];\n pagination: Pagination;\n};\n\n/* ── Sub-command Handlers ─────────────────────────────────────────────── */\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n\n const params = new URLSearchParams();\n const search = getArgValue(argv, '--search');\n const flowType = getArgValue(argv, '--flow-type');\n const status = getArgValue(argv, '--status');\n const page = getArgValue(argv, '--page');\n const pageSize = getArgValue(argv, '--page-size');\n\n if (search) params.set('search', search);\n if (flowType) params.set('flowType', flowType);\n if (status) params.set('status', status);\n if (page) params.set('page', page);\n if (pageSize) params.set('pageSize', pageSize);\n\n const qs = params.toString();\n const path = `/workflows${qs ? `?${qs}` : ''}`;\n\n const result = await apiRequest<WorkflowListResponse>(apiUrl, token, 'GET', path);\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify({ data: result.data, pagination: result.pagination }, null, 2));\n return;\n }\n\n // Default table output\n const { data, pagination } = result;\n console.log(\n `Workflows: ${pagination.totalItems} total (page ${pagination.page}/${pagination.totalPages})\\n`\n );\n\n if (data.length === 0) {\n console.log('No workflows found.');\n return;\n }\n\n // Column widths\n const idW = 36;\n const nameW = 30;\n const statusW = 12;\n const typeW = 10;\n\n const header = [\n 'ID'.padEnd(idW),\n 'Name'.padEnd(nameW),\n 'Status'.padEnd(statusW),\n 'Type'.padEnd(typeW),\n ].join(' ');\n\n console.log(header);\n\n for (const w of data) {\n const row = [\n w.id.padEnd(idW),\n truncate(w.name, nameW).padEnd(nameW),\n w.status.padEnd(statusW),\n w.flowType.padEnd(typeW),\n ].join(' ');\n console.log(row);\n }\n}\n\n/* ── Patch Handler ───────────────────────────────────────────────────── */\n\ntype WorkflowUpdateResponse = {\n ok: boolean;\n error?: string;\n workflow?: { id: string; name: string; status: string; flowType: string };\n};\n\nasync function handlePatch(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow patch <workflowId> [--name ...] [--description ...] [--status ...] [--flow-type ...] [--default-environment <name|id>] [--clear-default-environment] [--any-environment] [--eligible-env-types permanent,sandbox] [--eligible-environments <names|ids>]');\n process.exit(1);\n }\n\n const name = getArgValue(argv, '--name');\n const description = getArgValue(argv, '--description');\n const status = getArgValue(argv, '--status');\n const flowType = getArgValue(argv, '--flow-type');\n const seedOutputsJsonRaw = getArgValue(argv, '--seed-outputs-json');\n const seedOutputsFile = getArgValue(argv, '--seed-outputs-file');\n const jsonOutput = hasFlag(argv, '--json');\n\n // Environment config flags (resolved name→id against the flow's property).\n const defaultEnvironment = getArgValue(argv, '--default-environment');\n const clearDefaultEnvironment = hasFlag(argv, '--clear-default-environment');\n const anyEnvironment = hasFlag(argv, '--any-environment');\n const eligibleEnvTypes = getArgValue(argv, '--eligible-env-types');\n const eligibleEnvironments = getArgValue(argv, '--eligible-environments');\n const hasEnvFlag =\n defaultEnvironment !== undefined ||\n clearDefaultEnvironment ||\n anyEnvironment ||\n eligibleEnvTypes !== undefined ||\n eligibleEnvironments !== undefined;\n\n const hasTagFlag =\n getArgValue(argv, '--tags') !== undefined ||\n getArgValue(argv, '--tags-add') !== undefined ||\n getArgValue(argv, '--tags-remove') !== undefined ||\n getArgValue(argv, '--tag-id') !== undefined;\n\n if (\n !name &&\n !description &&\n !status &&\n !flowType &&\n !seedOutputsJsonRaw &&\n !seedOutputsFile &&\n !hasTagFlag &&\n !hasEnvFlag\n ) {\n console.error(\n 'Error: No fields to update. Provide at least one of: --name, --description, --status, --flow-type, --seed-outputs-json, --seed-outputs-file, --tags, --tags-add, --tags-remove, --tag-id, --default-environment, --clear-default-environment, --any-environment, --eligible-env-types, --eligible-environments'\n );\n process.exit(1);\n }\n\n if (anyEnvironment && (eligibleEnvTypes !== undefined || eligibleEnvironments !== undefined)) {\n console.error(\n 'Error: --any-environment is mutually exclusive with --eligible-env-types / --eligible-environments.'\n );\n process.exit(1);\n }\n if (clearDefaultEnvironment && defaultEnvironment !== undefined) {\n console.error(\n 'Error: --clear-default-environment is mutually exclusive with --default-environment.'\n );\n process.exit(1);\n }\n\n if (\n status &&\n !(USER_SETTABLE_WORKFLOW_STATUSES as readonly string[]).includes(status)\n ) {\n console.error(`Error: Invalid status \"${status}\". Valid: ${formatWorkflowStatusList()}`);\n process.exit(1);\n }\n\n const validFlowTypes = ['standard', 'setup', 'seed', 'teardown'];\n if (flowType && !validFlowTypes.includes(flowType)) {\n console.error(`Error: Invalid flow type \"${flowType}\". Must be one of: ${validFlowTypes.join(', ')}`);\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (name) body.name = name;\n if (description) body.description = description;\n if (status) body.status = status;\n if (flowType) body.flowType = flowType;\n\n if (seedOutputsJsonRaw || seedOutputsFile) {\n let raw: string;\n if (seedOutputsFile) {\n try {\n raw = await fs.readFile(seedOutputsFile, 'utf-8');\n } catch (err) {\n console.error(\n `Error reading ${seedOutputsFile}: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n } else {\n raw = seedOutputsJsonRaw!;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n throw new Error('seedOutputsJson must be a JSON array');\n }\n body.seedOutputsJson = parsed;\n } catch (err) {\n console.error(\n `Error: Invalid --seed-outputs-json: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n }\n\n // Environment config: resolve named envs against the flow's property (the\n // GET payload already carries `environments` + eligibility), then build the\n // `defaultEnvironmentId` / `environmentConstraints` body fields.\n if (hasEnvFlag) {\n if (anyEnvironment) body.environmentConstraints = null;\n if (eligibleEnvTypes !== undefined) {\n const types = eligibleEnvTypes\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n const valid = ['permanent', 'ephemeral', 'local', 'sandbox'];\n const bad = types.filter((t) => !valid.includes(t));\n if (bad.length > 0) {\n console.error(`Error: invalid env type(s): ${bad.join(', ')}. Valid: ${valid.join(', ')}`);\n process.exit(1);\n }\n body.environmentConstraints = { mode: 'envTypes', types };\n }\n if (clearDefaultEnvironment) body.defaultEnvironmentId = null;\n\n const needsResolution =\n defaultEnvironment !== undefined || eligibleEnvironments !== undefined;\n if (needsResolution) {\n const envs = await fetchWorkflowEnvironments(apiUrl, token, workflowId);\n if (defaultEnvironment !== undefined) {\n body.defaultEnvironmentId = resolveEnvironmentByNameOrId(envs, defaultEnvironment);\n }\n if (eligibleEnvironments !== undefined) {\n const ids = eligibleEnvironments\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean)\n .map((nameOrId) => resolveEnvironmentByNameOrId(envs, nameOrId));\n body.environmentConstraints = { mode: 'only', environmentIds: ids };\n }\n }\n }\n\n let tagResult: Awaited<ReturnType<typeof applyWorkflowTagFlags>> = null;\n\n if (Object.keys(body).length > 0) {\n const result = await apiRequest<WorkflowUpdateResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${workflowId}`,\n body\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n }\n\n if (hasTagFlag) {\n try {\n tagResult = await applyWorkflowTagFlags({ apiUrl, token, argv, workflowId });\n } catch (err) {\n if (jsonOutput) {\n console.log(\n JSON.stringify(\n { ok: false, error: err instanceof Error ? err.message : String(err) },\n null,\n 2\n )\n );\n } else {\n console.error(`Error applying tags:\\n${err instanceof Error ? err.message : String(err)}`);\n }\n process.exit(1);\n }\n }\n\n if (jsonOutput) {\n console.log(\n JSON.stringify(\n { ok: true, workflowId, updated: body, tags: tagResult?.tagIds ?? null },\n null,\n 2\n )\n );\n return;\n }\n\n const updatedKeys = Object.keys(body);\n if (updatedKeys.length > 0) {\n console.log(`Workflow ${workflowId} updated (${updatedKeys.join(', ')}).`);\n }\n if (tagResult) {\n console.log(`Tags: ${tagResult.tagIds.length} assigned.`);\n }\n}\n\n/* ── Archive / Unarchive Handlers ────────────────────────────────────── */\n\nasync function handleArchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow archive <workflowId> [--yes] [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const skipConfirm = hasFlag(argv, '--yes', '-y');\n\n if (!skipConfirm) {\n if (!process.stdin.isTTY) {\n console.error(\n 'Error: Archiving requires confirmation. Pass --yes (or -y) for non-interactive use.'\n );\n process.exit(1);\n }\n process.stdout.write(\n `Archive workflow ${workflowId}? It will be hidden from lists and skipped by test suites. [y/N] `\n );\n const answer = await new Promise<string>((resolve) => {\n process.stdin.setEncoding('utf-8');\n process.stdin.once('data', (chunk) => resolve(String(chunk).trim().toLowerCase()));\n });\n if (answer !== 'y' && answer !== 'yes') {\n console.error('Aborted.');\n process.exit(1);\n }\n }\n\n type ArchiveResult = { ok: boolean; success?: boolean; archived?: boolean; error?: string };\n const result = await apiRequest<ArchiveResult>(\n apiUrl,\n token,\n 'DELETE',\n `/workflows/${workflowId}`\n );\n\n if (result.error) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n renderWorkflowUserError(result);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`Archived workflow ${workflowId}. Use 'canary workflow unarchive ${workflowId}' to restore.`);\n }\n}\n\nasync function handleUnarchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow unarchive <workflowId> [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n\n type UnarchiveResult = { ok: boolean; error?: string };\n const result = await apiRequest<UnarchiveResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/unarchive`,\n {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n renderWorkflowUserError(result);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`Restored workflow ${workflowId}.`);\n }\n}\n\n/* ── Approve / Promote / Pause Handlers ──────────────────────────────── */\n\nconst APPROVAL_GUIDANCE = [\n 'Approving a test asserts that a HUMAN has verified it tests the right thing.',\n '',\n 'If you are an agent running this command on behalf of a user:',\n ' - Describe to the user what this test does and what approval means.',\n ' - Confirm the user has personally verified the test is correct.',\n ' - Only re-run with --yes after the user explicitly confirms.',\n '',\n 'Approval does NOT put the test into suites — use `canary workflow promote` for that.',\n].join('\\n');\n\nasync function handleApprove(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow approve <workflowId> [--yes] [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n\n if (!hasFlag(argv, '--yes')) {\n console.error(APPROVAL_GUIDANCE);\n console.error(`\\nRe-run with --yes to approve: canary workflow approve ${workflowId} --yes`);\n process.exit(1);\n }\n\n type ApproveResult = {\n ok: boolean;\n error?: string;\n code?: string;\n workflow?: { id: string; name: string; status: string; approvedAt: string | null };\n };\n const result = await apiRequest<ApproveResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/approve`,\n {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(\n JSON.stringify({ ok: true, workflowId, workflow: result.workflow ?? null }, null, 2)\n );\n return;\n }\n console.log(`Workflow ${workflowId} approved.`);\n console.log(`Promote it into suites with: canary workflow promote ${workflowId}`);\n}\n\nasync function handlePromote(\n argv: string[],\n apiUrl: string,\n token: string,\n options?: { deprecatedAlias?: string }\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow promote <workflowId> [--force] [--json]');\n process.exit(1);\n }\n\n const force = hasFlag(argv, '--force');\n const jsonOutput = hasFlag(argv, '--json');\n\n if (options?.deprecatedAlias && !jsonOutput) {\n console.error(\n `Note: \\`canary workflow ${options.deprecatedAlias}\\` is deprecated — use \\`canary workflow promote\\`.`\n );\n }\n\n type PromoteResult = {\n ok: boolean;\n error?: string;\n code?: string;\n workflow?: { id: string; name: string; promotion: string | null };\n };\n const result = await apiRequest<PromoteResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/promote`,\n force ? { force: true } : {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const hint =\n result.code === 'FLOW_NOT_READY_TO_PROMOTE'\n ? '\\n Trigger a successful run first (canary workflow run <id>), or pass --force.'\n : result.code === 'PROMOTION_REQUIRES_APPROVAL'\n ? `\\n Approve the test first: canary workflow approve ${workflowId} --yes\\n (Approval asserts a human verified the test checks the right thing — it cannot be forced.)`\n : '';\n console.error(`Error: ${result.error}${hint}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(\n JSON.stringify({ ok: true, workflowId, workflow: result.workflow ?? null }, null, 2)\n );\n return;\n }\n console.log(`Workflow ${workflowId} promoted — it will run when test suites run.`);\n}\n\nasync function handlePause(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow pause <workflowId> [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n\n type PauseResult = {\n ok: boolean;\n error?: string;\n code?: string;\n workflow?: { id: string; name: string; promotion: string | null };\n };\n const result = await apiRequest<PauseResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/pause`,\n {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(\n JSON.stringify({ ok: true, workflowId, workflow: result.workflow ?? null }, null, 2)\n );\n return;\n }\n const promotion = result.workflow?.promotion ?? null;\n if (promotion === 'paused') {\n console.log(`Workflow ${workflowId} paused — excluded from suite runs until re-promoted.`);\n } else {\n console.log(`Workflow ${workflowId} was not promoted; nothing to pause.`);\n }\n}\n\n/* ── Node Patch Handler ──────────────────────────────────────────────── */\n\nfunction getAllArgValues(argv: string[], flag: string): string[] {\n const values: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === flag && i + 1 < argv.length) {\n values.push(argv[i + 1]!);\n i++;\n }\n }\n return values;\n}\n\nasync function handleNodePatch(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const workflowId = positional[0];\n const nodeId = positional[1];\n\n if (!workflowId || !nodeId) {\n console.error('Error: Missing workflow ID and/or node ID.');\n console.error(\n 'Usage: canary workflow node patch <workflowId> <nodeId> --set-input key=value [--config \\'{\"...\"}\\'] [--json]'\n );\n process.exit(1);\n }\n\n const configArg = getArgValue(argv, '--config');\n const setInputArgs = getAllArgValues(argv, '--set-input');\n const jsonOutput = hasFlag(argv, '--json');\n\n if (!configArg && setInputArgs.length === 0) {\n console.error('Error: No changes specified. Provide --set-input key=value and/or --config \\'{\"...\"}\\'');\n process.exit(1);\n }\n\n // Build configJson from flags\n let configJson: Record<string, unknown> = {};\n\n if (configArg) {\n try {\n configJson = JSON.parse(configArg) as Record<string, unknown>;\n } catch (e) {\n console.error(`Error: Invalid JSON in --config: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n }\n\n if (setInputArgs.length > 0) {\n const inputValues: Record<string, string> = (configJson.inputValues as Record<string, string>) ?? {};\n for (const arg of setInputArgs) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx === -1) {\n console.error(`Error: --set-input must be key=value, got: \"${arg}\"`);\n process.exit(1);\n }\n inputValues[arg.slice(0, eqIdx)] = arg.slice(eqIdx + 1);\n }\n configJson.inputValues = inputValues;\n }\n\n // Fetch current state for before/after diff\n const getRes = await fetchOrExit(`${apiUrl}/workflows/${workflowId}`, {\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n token,\n });\n const getResult = (await getRes.json()) as WorkflowDetailResponse;\n if (!getResult.workflow) {\n console.error(`Error: Workflow not found.`);\n process.exit(1);\n }\n\n const existingNode = getResult.workflow.nodes.find((n) => n.id === nodeId);\n if (!existingNode) {\n console.error(`Error: Node ${nodeId} not found in workflow ${workflowId}.`);\n console.error('\\nAvailable nodes:');\n for (const n of topoOrderNodes(getResult.workflow.nodes, getResult.workflow.edges ?? [])) {\n console.error(` ${n.id} [${n.nodeType}] ${getNodeTitle(n)}`);\n }\n process.exit(1);\n }\n\n // Apply the patch\n const patchRes = await fetchOrExit(`${apiUrl}/workflows/${workflowId}/nodes/${nodeId}`, {\n method: 'PUT',\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n token,\n body: JSON.stringify({ configJson }),\n });\n\n if (!patchRes.ok) {\n const errBody = await patchRes.text();\n if (jsonOutput) {\n console.log(errBody || JSON.stringify({ ok: false, status: patchRes.status }, null, 2));\n } else {\n let rendered: string | null = null;\n try {\n const parsed = JSON.parse(errBody) as Record<string, unknown>;\n rendered = renderWorkflowUserError(parsed);\n } catch {\n rendered = null;\n }\n console.error(rendered ?? `Error (${patchRes.status}): ${errBody.slice(0, 500)}`);\n }\n process.exit(1);\n }\n\n const patchResult = (await patchRes.json()) as { node: PullWorkflow['nodes'][number] };\n\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: true, node: patchResult.node }, null, 2));\n return;\n }\n\n // Show before/after diff\n const title = getNodeTitle(existingNode);\n console.log(`Updated node [${existingNode.nodeType}] \"${title}\" (${nodeId}):\\n`);\n\n const oldConfig = existingNode.configJson ?? {};\n for (const [key, newVal] of Object.entries(configJson)) {\n if (typeof newVal === 'object' && newVal !== null && typeof oldConfig[key] === 'object' && oldConfig[key] !== null) {\n // Diff nested objects (e.g. inputValues)\n const oldObj = oldConfig[key] as Record<string, unknown>;\n const newObj = newVal as Record<string, unknown>;\n for (const [subKey, subVal] of Object.entries(newObj)) {\n const oldVal = oldObj[subKey];\n if (oldVal !== subVal) {\n console.log(` ${key}.${subKey}: ${JSON.stringify(oldVal ?? null)} -> ${JSON.stringify(subVal)}`);\n }\n }\n } else {\n const oldVal = oldConfig[key];\n if (oldVal !== newVal) {\n console.log(` ${key}: ${JSON.stringify(oldVal ?? null)} -> ${JSON.stringify(newVal)}`);\n }\n }\n }\n}\n\n/* ── Help & Entry Point ───────────────────────────────────────────────── */\n\nfunction printWorkflowHelp(): void {\n console.log(\n [\n 'Usage: canary workflow <sub-command> [options]',\n '',\n ' Tip: Run \"canary workflow guide\" for the full authoring reference',\n ' (node types, playbooks, macros, seeds, assertions, best practices)',\n '',\n 'Sub-commands:',\n ' guide [section] [--json] Authoring guide (node-types, macros, etc.)',\n ' list [options] List workflows',\n ' get <workflowId> [options] Get workflow definition with steps',\n ' create [options] Create workflow from JSON',\n ' sync <workflowId> [options] Replace all nodes (same format as create)',\n ' patch <workflowId> [options] Update workflow properties',\n ' approve <workflowId> [--yes] [--json] Mark the test as human-verified (spec is right)',\n ' promote <workflowId> [--force] [--json] Include the test in suite runs (requires approval)',\n ' pause <workflowId> [--json] Exclude a promoted test from suite runs',\n ' archive <workflowId> [--yes] [--json] Soft-delete: hide from lists, skip in test suites (reversible)',\n ' unarchive <workflowId> [--json] Restore a previously archived workflow',\n ' run <workflowId> [options] Trigger a workflow execution',\n ' api-sequence <verb> <workflowId> Manage the API sequence attached to a workflow',\n ' generate-api-sequence <workflowId> [opts] (deprecated alias for `api-sequence generate`)',\n ' seed <sub-command> Create seed workflows',\n ' node <sub-command> Manage individual nodes',\n ' runs <sub-command> Query workflow run results',\n ' debug <runId|sub-command> Debug a run (overview/steps/cache/thoughts/logs/trace)',\n '',\n 'List options:',\n ' --search <query> Search by name',\n ' --flow-type <type> Filter: standard, setup, seed, teardown',\n ' --status <status> Filter: draft, approved',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 25)',\n ' --json Output raw JSON',\n '',\n 'Get options:',\n ' --format json|markdown|spec Output format (default: json)',\n ' --json Shorthand for --format json',\n ` --markdown Shorthand for editable ${specExtension} spec output`,\n ' --output <file> Write output to file',\n '',\n 'Create options:',\n ' --from-stdin Read workflow JSON from stdin (default)',\n ' --from-file <path> Read workflow JSON from file',\n ' --api-only Create an API-only workflow with a backing ApiSequence',\n ' Requires: --name <name>',\n ' Optional: --credential <id>, --guidance <text>,',\n ' --sequence-from-file <path> or --sequence-from-stdin',\n ' Input shape: { steps, description?, stopOnFailure?, exports? }',\n ' Returns: { workflowId, apiSequenceId, nodeId }',\n ' --tags <names> Comma-separated tag names to assign (names, not IDs)',\n ' --tag-id <ids> Comma-separated raw tag IDs (escape hatch)',\n '',\n ' Input: { name, nodes: [{ nodeType, configJson }] }',\n ' Run \"canary workflow guide node-types\" for available node types.',\n ' Run \"canary workflow guide macros\" for dynamic test data ($EMAIL, $RANDOM_STRING, etc.)',\n '',\n 'Sync options:',\n ' --from-file <path> Read nodes JSON from file',\n ' --from-stdin Read nodes JSON from stdin',\n ' --no-snapshot Skip creating a draft snapshot before sync',\n ' --propose Create a proposal instead of applying directly',\n ' --title <title> Proposal title (with --propose)',\n ' --description <desc> Proposal description (with --propose)',\n ' --json Output raw JSON',\n '',\n ' Sync accepts the same minimal node format as create.',\n ' Edges, IDs, positions, and ordering are auto-generated when omitted.',\n ' Input: { nodes: [{ nodeType, configJson }] }',\n '',\n ' When using --propose on an existing workflow, run `canary workflow get',\n ' <id>` first and reuse each node\\'s existing `id` for steps you intend',\n ' to keep. Only omit `id` for genuinely new steps. Without ID reuse the',\n ' proposal will diff as a full remove-everything/add-everything rewrite.',\n '',\n 'Patch options:',\n ' --name <name> Update workflow name',\n ' --description <desc> Update description',\n ' --status <status> Set status (approval axis). Valid:',\n ' draft — not yet approved',\n ' approved — a human verified the test checks the right thing',\n ' (suite inclusion is the separate promote/pause axis;',\n ' reliability is tracked automatically by health)',\n ' --flow-type <type> Set type: standard, setup, seed, teardown',\n ' --seed-outputs-json <json> Replace seedOutputsJson (array) — seed flows only',\n ' --seed-outputs-file <path> Replace seedOutputsJson from a JSON file',\n ' --tags <names> Replace tags with these names (comma-separated)',\n ' --tags-add <names> Add these tag names to the existing set',\n ' --tags-remove <names> Remove these tag names from the existing set',\n ' --tag-id <ids> Raw tag IDs (comma-separated)',\n ' --json Output raw JSON',\n '',\n 'Approve options:',\n ' --yes Confirm approval (required non-interactively)',\n ' --json Output raw JSON',\n '',\n ' Approval asserts a human verified the test checks the right thing.',\n ' Agents: describe the test to the user and confirm they personally',\n ' verified it before re-running with --yes.',\n '',\n 'Promote options:',\n ' --force Promote without requiring a successful run (skips the',\n ' run gate; the approval gate can never be forced)',\n ' --json Output raw JSON',\n '',\n ' Promote includes the test in suite runs. Suites always execute the',\n ' live definition — edits take effect immediately. Requires the test',\n ' to be approved, and (without --force) a passing run.',\n '',\n 'Run options:',\n ' --stream Follow execution until completion',\n ' --json Output raw JSON',\n '',\n 'API Sequence sub-commands:',\n ' api-sequence get <wf> Show config + steps',\n ' api-sequence update <wf> --from-file <f> Replace config',\n ' api-sequence execute <wf> Run the sequence',\n ' api-sequence delete <wf> Delete the sequence',\n ' api-sequence set-api-only <wf> [--off] Toggle workflow apiOnly flag',\n ' api-sequence generate <wf> [--prompt ...] AI-generate a config (streams)',\n '',\n ' Run \"canary workflow guide api-sequences\" for step shape and template syntax.',\n '',\n 'Seed sub-commands:',\n ' seed create [options] Create a seed workflow with outputs',\n '',\n 'Seed create options:',\n ' --name <name> Seed workflow name (required unless JSON input)',\n ' --description <desc> Description',\n ' --output <key:name[:desc]> Declare an output (repeatable)',\n ' --outputs-json <json> Full outputs array as inline JSON',\n ' --from-stdin Read full config from stdin',\n ' --from-file <path> Read full config from file',\n ' --no-teardown Skip creating paired teardown workflow',\n ' --status <status> Initial status (default: draft)',\n ' --json Output raw JSON',\n '',\n 'Node sub-commands:',\n ' node patch <workflowId> <nodeId> [options] Update a node\\'s config',\n '',\n 'Node patch options:',\n ' --set-input key=value Set an inputValue (repeatable)',\n ' --config \\'{\"...\"}\\' Merge arbitrary configJson (partial update)',\n ' --json Output raw JSON',\n '',\n 'Runs sub-commands:',\n ' runs list <workflowId> List runs for a workflow',\n ' runs get <workflowId> <runId> Get run detail with steps',\n ' runs diagnostics <workflowId> <runId> Get failure diagnostic',\n '',\n 'Cache sub-commands:',\n ' cache status <workflowId> Show per-node cache version, health, recent failures',\n ' cache clear <workflowId> [--node <id>] [--below-version <n>] [--stale-only] [--mode all]',\n ' Targeted cache invalidation (rows kept, isValid=false)',\n ' cache clear <workflowId> --mode hard --yes DESTRUCTIVE: delete cache rows, strip playbookSteps,',\n ' null lastRunId. Same as the UI \"Reset flow\" button',\n ' cache optimize <workflowId> [--run <runId>] Enqueue the async cache-optimizer job',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ].join('\\n')\n );\n}\n\nexport async function runWorkflow(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help') {\n printWorkflowHelp();\n return;\n }\n\n if (subCommand === 'debug' && hasFlag(rest, '--help', '-h')) {\n const { handleWorkflowDebug } = await import('./workflow-debug.js');\n await handleWorkflowDebug(rest, '', '');\n return;\n }\n\n if (hasFlag(argv, '--help', '-h')) {\n printWorkflowHelp();\n return;\n }\n\n if (subCommand === 'guide') {\n const sectionSlug = rest.find((a) => !a.startsWith('-'));\n const jsonOutput = hasFlag(rest, '--json');\n printGuide(WORKFLOW_GUIDE_SECTIONS, sectionSlug, jsonOutput);\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleWorkflowGet(rest, apiUrl, token);\n break;\n case 'create':\n await handleWorkflowCreate(rest, apiUrl, token);\n break;\n case 'patch':\n await handlePatch(rest, apiUrl, token);\n break;\n case 'approve':\n await handleApprove(rest, apiUrl, token);\n break;\n case 'promote':\n await handlePromote(rest, apiUrl, token);\n break;\n case 'pause':\n await handlePause(rest, apiUrl, token);\n break;\n case 'archive':\n await handleArchive(rest, apiUrl, token);\n break;\n case 'unarchive':\n await handleUnarchive(rest, apiUrl, token);\n break;\n case 'run':\n await handleWorkflowRun(rest, apiUrl, token);\n break;\n case 'runs':\n await runWorkflowRuns(rest, apiUrl, token);\n break;\n case 'node': {\n const [nodeSub, ...nodeRest] = rest;\n if (nodeSub === 'patch') {\n await handleNodePatch(nodeRest, apiUrl, token);\n } else {\n console.error(`Unknown node sub-command: ${nodeSub ?? '(none)'}`);\n printWorkflowHelp();\n process.exit(1);\n }\n break;\n }\n case 'seed': {\n const [seedSub, ...seedRest] = rest;\n if (seedSub === 'create') {\n await handleWorkflowSeedCreate(seedRest, apiUrl, token);\n } else {\n console.error(`Unknown seed sub-command: ${seedSub ?? '(none)'}`);\n printWorkflowHelp();\n process.exit(1);\n }\n break;\n }\n case 'sync':\n await handleWorkflowSync(rest, apiUrl, token);\n break;\n case 'proposals': {\n const { handleWorkflowProposals } = await import('./workflow-proposals.js');\n await handleWorkflowProposals(rest, apiUrl, token);\n break;\n }\n case 'generate-api-sequence':\n // Deprecated alias — forwards to `api-sequence generate`.\n await handleWorkflowGenerateApiSequence(rest, apiUrl, token);\n break;\n case 'api-sequence':\n await handleWorkflowApiSequence(rest, apiUrl, token);\n break;\n case 'cache': {\n const { handleWorkflowCache } = await import('./workflow-cache.js');\n await handleWorkflowCache(rest, apiUrl, token);\n break;\n }\n case 'debug': {\n const { handleWorkflowDebug } = await import('./workflow-debug.js');\n await handleWorkflowDebug(rest, apiUrl, token);\n break;\n }\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printWorkflowHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI Workflow Creation\n *\n * Creates a workflow with nodes and edges atomically via the API.\n * Supports reading workflow JSON from stdin or file.\n *\n * @module workflow-create\n */\n\nimport fs from \"node:fs/promises\";\nimport process from \"node:process\";\nimport { getArgValue, hasFlag, resolveAppUrl } from \"./auth.js\";\nimport { renderWorkflowUserError, type CredentialListItem } from \"./cli-helpers.js\";\nimport { fetchOrExit } from \"./api-fetch.js\";\nimport { applyWorkflowTagFlags } from \"./tag.js\";\nimport { normalizeNodeType, NODE_TYPE_LABEL } from \"@chatsdet/types\";\n\n/* ── Types ────────────────────────────────────────────────────────────── */\n\ntype WorkflowNodeInput = {\n nodeType: string;\n configJson?: Record<string, unknown>;\n};\n\ntype WorkflowCreateInput = {\n name: string;\n description?: string;\n status?: \"draft\" | \"approved\";\n flowType?: \"standard\" | \"setup\" | \"seed\" | \"teardown\";\n createdVia?: string;\n propertyId?: string;\n credentialId?: string;\n nodes: WorkflowNodeInput[];\n};\n\ntype CreateResponse = {\n ok: boolean;\n error?: string;\n /** Set on structured user errors (e.g. WORKFLOW_VALIDATION_FAILED). */\n code?: string;\n /** Per-node validation issues, surfaced via renderWorkflowUserError. */\n issues?: unknown[];\n warnings?: string[];\n workflow?: {\n id: string;\n name: string;\n status: string;\n flowType: string;\n createdVia: string | null;\n };\n nodes?: Array<{ id: string; nodeType: string; orderIndex: number }>;\n edges?: Array<{ id: string; sourceNodeId: string; targetNodeId: string }>;\n};\n\n/* ── Input Reading ───────────────────────────────────────────────────── */\n\nasync function readFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n const stdin = process.stdin;\n\n if (stdin.isTTY) {\n throw new Error(\"No input on stdin. Pipe workflow JSON or use --from-file.\");\n }\n\n return new Promise((resolve, reject) => {\n stdin.on(\"data\", (chunk) => {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n stdin.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n stdin.on(\"error\", reject);\n });\n}\n\nasync function readWorkflowInput(argv: string[]): Promise<WorkflowCreateInput> {\n let raw: string;\n\n const fromFile = getArgValue(argv, \"--from-file\");\n if (fromFile) {\n try {\n raw = await fs.readFile(fromFile, \"utf-8\");\n } catch (err) {\n throw new Error(`Failed to read file ${fromFile}: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n raw = await readFromStdin();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Invalid JSON input. Please provide valid workflow JSON.\");\n }\n\n const input = parsed as WorkflowCreateInput;\n\n if (!input.name || typeof input.name !== \"string\") {\n throw new Error('Workflow JSON must include a \"name\" string field.');\n }\n\n if (!Array.isArray(input.nodes) || input.nodes.length === 0) {\n throw new Error('Workflow JSON must include a non-empty \"nodes\" array.');\n }\n\n // Source the allowlist from the canonical node-type set so it never drifts\n // from the server enum (`workflowNodeTypeEnum`). NODE_TYPE_LABEL's keys are\n // that set — including sandbox_action, audio, and audio-assertion.\n const validNodeTypes = Object.keys(NODE_TYPE_LABEL);\n for (const node of input.nodes) {\n // Accept \"acting-as\" as an alias for \"login\" — keep persisted type canonical.\n if (typeof node.nodeType === \"string\") {\n node.nodeType = normalizeNodeType(node.nodeType);\n }\n if (!node.nodeType || !validNodeTypes.includes(node.nodeType)) {\n throw new Error(\n `Invalid nodeType \"${node.nodeType}\". Valid types: ${validNodeTypes.join(\", \")}`\n );\n }\n }\n\n return input;\n}\n\n/* ── Credential Resolution ──────────────────────────────────────────── */\n\nasync function fetchOrgCredentials(\n apiUrl: string,\n token: string\n): Promise<CredentialListItem[]> {\n const res = await fetch(`${apiUrl}/org/credentials`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { ok: boolean; items: CredentialListItem[] };\n return (data.items ?? []).filter((c) => !c.isEphemeral);\n}\n\n/**\n * Resolve a credential for login nodes that are missing credentialId.\n * Resolution order:\n * 1. Match by credentialName (if provided)\n * 2. Pick the default credential (isDefault: true)\n * 3. Pick the only non-local credential (if exactly one)\n * 4. Error with available credentials listed so the caller can retry\n */\nasync function resolveCredential(\n apiUrl: string,\n token: string,\n credentialName?: string\n): Promise<{ credentialId: string; credentialName: string; propertyId?: string }> {\n const credentials = await fetchOrgCredentials(apiUrl, token);\n\n if (credentials.length === 0) {\n throw new Error(\n \"No credentials found for this organization. Create one in the web app first.\"\n );\n }\n\n // 1. Match by name if provided\n if (credentialName) {\n const match = credentials.find(\n (c) => c.name.toLowerCase() === credentialName.toLowerCase()\n );\n if (match) {\n const isLocal = /\\blocal\\b/i.test(match.name);\n if (isLocal) {\n console.warn(\n `Warning: Credential \"${match.name}\" appears to be local-only. ` +\n `The workflow may fail in deployed environments. Consider using a non-local credential.`\n );\n }\n return { credentialId: match.id, credentialName: match.name, propertyId: match.propertyId };\n }\n // Name didn't match — fall through to other strategies\n console.warn(`Warning: No credential matching name \"${credentialName}\". Trying other resolution strategies.`);\n }\n\n // 2. Pick the default credential\n const defaults = credentials.filter((c) => c.isDefault);\n if (defaults.length === 1) {\n console.log(`Auto-selected default credential: ${defaults[0].name} (${defaults[0].id})`);\n return { credentialId: defaults[0].id, credentialName: defaults[0].name, propertyId: defaults[0].propertyId };\n }\n\n // 3. Pick the only non-local credential\n const nonLocal = credentials.filter((c) => !/\\blocal\\b/i.test(c.name));\n if (nonLocal.length === 1) {\n console.log(`Auto-selected credential: ${nonLocal[0].name} (${nonLocal[0].id})`);\n return { credentialId: nonLocal[0].id, credentialName: nonLocal[0].name, propertyId: nonLocal[0].propertyId };\n }\n\n // 4. Ambiguous — list credentials and error\n const lines = credentials.map(\n (c) => ` ${c.id} ${c.name}${c.isDefault ? \" (default)\" : \"\"}${c.propertyName ? ` — ${c.propertyName}` : \"\"}`\n );\n throw new Error(\n `Cannot auto-resolve credential. Specify credentialId in the login node configJson.\\n\\n` +\n `Available credentials:\\n${lines.join(\"\\n\")}`\n );\n}\n\n/* ── API-only workflow branch ────────────────────────────────────────── */\n\ntype ApiSequenceConfig = {\n steps: unknown[];\n description?: string;\n stopOnFailure?: boolean;\n exports?: unknown[];\n};\n\nasync function readApiSequenceConfig(argv: string[]): Promise<ApiSequenceConfig> {\n const fromFile = getArgValue(argv, \"--sequence-from-file\");\n const fromStdin = hasFlag(argv, \"--sequence-from-stdin\");\n\n if (!fromFile && !fromStdin) {\n return { steps: [] };\n }\n\n let raw: string;\n if (fromFile) {\n raw = await fs.readFile(fromFile, \"utf-8\");\n } else {\n raw = await readFromStdin();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Invalid JSON for sequence config.\");\n }\n\n const cfg = parsed as ApiSequenceConfig;\n if (!cfg || !Array.isArray(cfg.steps)) {\n throw new Error('Sequence config must be { \"steps\": [...] }.');\n }\n return cfg;\n}\n\nasync function handleApiOnlyCreate(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const name = getArgValue(argv, \"--name\");\n if (!name) {\n console.error('Error: --api-only requires --name <workflow name>.');\n process.exit(1);\n }\n\n const credentialId = getArgValue(argv, \"--credential\");\n const guidance = getArgValue(argv, \"--guidance\");\n\n let config: ApiSequenceConfig;\n try {\n config = await readApiSequenceConfig(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { name, config };\n if (credentialId) body.credentialId = credentialId;\n if (guidance) body.guidancePrompt = guidance;\n\n const res = await fetchOrExit(`${apiUrl}/api-sequences/create-with-workflow`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n token,\n body: JSON.stringify(body),\n });\n\n const raw = (await res.json().catch(() => ({}))) as {\n ok: boolean;\n error?: string;\n code?: string;\n issues?: Array<{ path: string; code: string; message: string; hint?: string }>;\n data?: { workflowId: string; apiSequenceId: string; nodeId?: string };\n };\n\n if (!res.ok || !raw.ok || !raw.data) {\n const jsonOutput = hasFlag(argv, \"--json\") || !process.stdout.isTTY;\n if (raw.code === 'API_SEQUENCE_INVALID' && Array.isArray(raw.issues)) {\n if (jsonOutput) {\n console.log(\n JSON.stringify(\n {\n ok: false,\n error: raw.error ?? 'API sequence configuration is invalid',\n code: 'API_SEQUENCE_INVALID',\n issueCount: raw.issues.length,\n issues: raw.issues,\n },\n null,\n 2,\n ),\n );\n } else {\n console.error(`Error: ${raw.error ?? 'API sequence configuration is invalid'}`);\n console.error(`Found ${raw.issues.length} issue${raw.issues.length === 1 ? '' : 's'}:`);\n console.error('');\n for (const issue of raw.issues) {\n console.error(` ${issue.path || '(root)'} [${issue.code}] :: ${issue.message}`);\n if (issue.hint) console.error(` hint: ${issue.hint}`);\n }\n }\n process.exit(1);\n }\n console.error(`Error: ${raw.error ?? `${res.status} ${res.statusText}`}`);\n process.exit(1);\n }\n\n if (hasFlag(argv, \"--json\") || !process.stdout.isTTY) {\n console.log(JSON.stringify({ ok: true, data: raw.data }, null, 2));\n return;\n }\n\n const appUrl = resolveAppUrl(apiUrl);\n console.log(`\\n\\u2713 API-only workflow created: ${name}`);\n console.log(` Workflow ID: ${raw.data.workflowId}`);\n console.log(` API Sequence ID: ${raw.data.apiSequenceId}`);\n if (raw.data.nodeId) console.log(` Node ID: ${raw.data.nodeId}`);\n console.log(` Steps: ${config.steps.length}`);\n console.log(` URL: ${appUrl}/flows/${raw.data.workflowId}`);\n console.log(`\\n Next:`);\n console.log(` canary workflow api-sequence get ${raw.data.workflowId}`);\n console.log(` canary workflow api-sequence update ${raw.data.workflowId} --from-file seq.json`);\n console.log(` canary workflow api-sequence execute ${raw.data.workflowId}`);\n}\n\n/* ── Main Handler ────────────────────────────────────────────────────── */\n\nexport async function handleWorkflowCreate(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n if (hasFlag(argv, \"--api-only\")) {\n await handleApiOnlyCreate(argv, apiUrl, token);\n return;\n }\n\n // Auto-publish was removed with the approval/promotion lifecycle split:\n // a human must approve, then promote, as explicit steps.\n if (hasFlag(argv, \"--run-and-publish\")) {\n console.error(\n \"Error: --run-and-publish was removed. Run the test (canary workflow run <id>), then\\n\" +\n \"approve it (canary workflow approve <id> --yes) and promote it (canary workflow promote <id>).\"\n );\n process.exit(1);\n }\n\n // 1. Read and validate input\n let input: WorkflowCreateInput;\n try {\n input = await readWorkflowInput(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // 2. Resolve credentials for login nodes missing credentialId\n const loginNodes = input.nodes.filter((n) => n.nodeType === \"login\");\n for (const loginNode of loginNodes) {\n const config = loginNode.configJson ?? {};\n if (!config.credentialId && !input.credentialId) {\n try {\n const resolved = await resolveCredential(\n apiUrl,\n token,\n config.credentialName as string | undefined\n );\n config.credentialId = resolved.credentialId;\n config.credentialName = resolved.credentialName;\n loginNode.configJson = config;\n if (resolved.propertyId && !input.propertyId) {\n input.propertyId = resolved.propertyId;\n }\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n }\n }\n\n // All flows start as drafts — approval and promotion are explicit follow-up\n // steps (canary workflow approve / promote). Reliability is tracked\n // separately by the workflow's `health` (starts at `unverified`).\n input.createdVia = \"cli\";\n\n // 4. Create workflow via API\n const res = await fetchOrExit(`${apiUrl}/workflows/create-with-nodes`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n token,\n body: JSON.stringify(input),\n });\n\n const result = (await res.json()) as CreateResponse;\n\n if (!result.ok || !result.workflow) {\n // Surface per-node validation detail (WORKFLOW_VALIDATION_FAILED carries an\n // `issues` array) instead of the bare catalog message. Same renderer the\n // `workflow run` path uses.\n const rendered = renderWorkflowUserError(result as unknown as Record<string, unknown>);\n console.error(rendered ?? `Error: ${result.error ?? \"Failed to create workflow\"}`);\n process.exit(1);\n }\n\n const { workflow, nodes, edges } = result;\n\n const { warnings } = result;\n\n console.log(`\\n\\u2713 Workflow created: ${workflow.name}`);\n console.log(` ID: ${workflow.id}`);\n console.log(` Status: ${workflow.status}`);\n console.log(` Nodes: ${nodes?.length ?? 0}`);\n console.log(` Edges: ${edges?.length ?? 0}`);\n\n if (warnings && warnings.length > 0) {\n console.log(`\\n Warnings:`);\n for (const w of warnings) {\n console.log(` \\u26A0 ${w}`);\n }\n }\n\n const appUrl = resolveAppUrl(apiUrl);\n console.log(` URL: ${appUrl}/flows/${workflow.id}`);\n\n // 5. Apply --tags / --tag-id if provided.\n try {\n const tagResult = await applyWorkflowTagFlags({\n apiUrl,\n token,\n argv,\n workflowId: workflow.id,\n });\n if (tagResult) {\n console.log(` Tags: ${tagResult.tagIds.length} assigned`);\n }\n } catch (err) {\n console.error(`\\nError applying tags:\\n${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n console.log(\n `\\n Next: run it (canary workflow run ${workflow.id}), approve it ` +\n `(canary workflow approve ${workflow.id} --yes), then promote it into suites ` +\n `(canary workflow promote ${workflow.id}).`\n );\n}\n","import fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { getArgValue, hasFlag, resolveAppUrl } from './auth.js';\nimport { apiFetch, exitOnFailure } from './api-fetch.js';\nimport {\n formatWorkflowJson,\n formatWorkflowMarkdown,\n type WorkflowDetailResponse,\n} from './workflow-format.js';\n\n/**\n * Whether `workflow get` should append the human-readable `URL: …` trailer.\n *\n * The trailer is a courtesy for a human at a terminal running the bare\n * `workflow get <id>` (which defaults to pretty JSON). It must NOT be emitted\n * for any explicitly requested machine/file format — `--json` / `--format json`\n * or the markdown/spec formats — because the trailing non-JSON line breaks\n * downstream parsers piping stdout.\n */\nexport function shouldPrintWorkflowUrlTrailer(argv: string[]): boolean {\n const jsonOutput = hasFlag(argv, '--json') || getArgValue(argv, '--format') === 'json';\n const markdownOutput =\n hasFlag(argv, '--markdown') ||\n getArgValue(argv, '--format') === 'markdown' ||\n getArgValue(argv, '--format') === 'spec';\n return !jsonOutput && !markdownOutput;\n}\n\nexport async function handleWorkflowGet(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const workflowId = argv[0];\n if (!workflowId || workflowId.startsWith('--')) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow get <workflowId>');\n process.exit(1);\n }\n\n const markdownOutput =\n hasFlag(argv, '--markdown') ||\n getArgValue(argv, '--format') === 'markdown' ||\n getArgValue(argv, '--format') === 'spec';\n const outputFile = getArgValue(argv, '--output');\n\n const apiRes = await apiFetch(`${apiUrl}/workflows/${workflowId}`, {\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n token,\n });\n if (!apiRes.ok) exitOnFailure(apiRes.failure);\n const result = (await apiRes.response.json()) as WorkflowDetailResponse;\n\n if (result.error === 'WORKFLOW_NOT_FOUND') {\n console.error('Error: Workflow not found.');\n process.exit(1);\n }\n if (result.error === 'WORKFLOW_WRONG_ORG') {\n console.error(\n `Error: Workflow belongs to another org: ${result.targetOrgName ?? result.targetOrgId}`\n );\n process.exit(1);\n }\n if (!result.workflow) {\n console.error(`Error: ${result.error ?? 'Unexpected response'}`);\n process.exit(1);\n }\n\n const workflow = result.workflow;\n let output: string;\n\n if (markdownOutput) {\n output = formatWorkflowMarkdown(workflow);\n } else {\n // Default to JSON for agent-friendly output\n output = JSON.stringify(formatWorkflowJson(workflow), null, 2);\n }\n\n if (outputFile) {\n try {\n await fs.writeFile(outputFile, output, 'utf-8');\n console.log(`Written to ${outputFile}`);\n } catch (err) {\n console.error(\n `Error writing to ${outputFile}: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n return;\n }\n\n console.log(output);\n\n if (shouldPrintWorkflowUrlTrailer(argv)) {\n const appUrl = resolveAppUrl(apiUrl);\n console.log(`\\nURL: ${appUrl}/flows/${workflowId}`);\n }\n}\n","import { NODE_TYPE_LABEL } from '@chatsdet/types';\nimport { workflowToSpec, type PullWorkflow } from '@chatsdet/canary-spec';\nimport { topoOrderNodes } from '@chatsdet/workflow-diff';\n\ntype SeedOutput = {\n dataKey: string;\n name: string;\n description?: string;\n displayLabel: string;\n propertyId: string;\n attributes?: Record<string, unknown>;\n credentialOutput?: Record<string, unknown>;\n};\n\nexport type WorkflowSummary = PullWorkflow & {\n seedOutputsJson?: SeedOutput[] | null;\n};\n\nexport type WorkflowDetailResponse = {\n ok?: boolean;\n error?: string;\n workflow?: WorkflowSummary;\n targetOrgId?: string;\n targetOrgName?: string;\n};\n\n/** Environment fields the workflow-detail payload carries for `workflow get`. */\ntype WorkflowEnvFields = {\n defaultEnvironmentId?: string | null;\n environments?: Array<{ id: string; name: string; type: string; isDefault: boolean }>;\n eligibleEnvironmentIds?: string[];\n passByEnvironment?: Array<{\n environmentId: string;\n environmentName: string;\n environmentType: string;\n everPassed: boolean;\n passed: number;\n total: number;\n health: string;\n }>;\n};\n\nexport function truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 1) + '…';\n}\n\nexport function getNodeTitle(node: PullWorkflow['nodes'][number]): string {\n const c = node.configJson ?? {};\n switch (node.nodeType) {\n case 'login':\n return (c.credentialName as string) || NODE_TYPE_LABEL.login;\n case 'navigate':\n return (c.pageTitle as string) || truncate((c.pageUrl as string) || 'Navigate', 40);\n case 'action':\n return (\n (c.customActionTitle as string) || truncate((c.actionDescription as string) || 'Action', 50)\n );\n case 'assertion':\n return truncate((c.condition as string) || 'Assertion', 50);\n case 'setup':\n return (c.setupFlowName as string) || 'Setup';\n case 'seed':\n return (c.seedWorkflowName as string) || 'Seed';\n case 'wait':\n return 'Wait';\n case 'condition':\n return truncate((c.conditionDescription as string) || 'Condition', 50);\n case 'end':\n return 'End';\n case 'api_sequence':\n return 'API Sequence';\n default:\n return node.nodeType;\n }\n}\n\nfunction getCleanConfig(node: PullWorkflow['nodes'][number]): Record<string, unknown> {\n const c = node.configJson ?? {};\n switch (node.nodeType) {\n case 'login':\n // Keep the credential wiring metadata, not secrets. Passwords/tokens live\n // on credential records, never in configJson.\n return pick(c, [\n 'credentialName',\n 'performLogin',\n 'credentialSource',\n 'credentialTemplateId',\n 'credentialTemplateName',\n 'credentialId',\n 'seedCredentialRef',\n ]);\n case 'navigate':\n return {\n ...pick(c, ['pageUrl', 'pageTitle']),\n ...(c.openInNewTab ? { openInNewTab: true } : {}),\n };\n case 'action':\n return pick(c, [\n 'actionDescription',\n 'playbookSteps',\n 'inputValues',\n 'declaredOutputs',\n 'capturedVariableKeys',\n 'dataRequirements',\n 'alwaysUseAgent',\n ]);\n case 'assertion':\n return pick(c, ['condition', 'expectedOutcome', 'strict', 'alwaysUseAgent']);\n case 'setup':\n return pick(c, ['setupFlowId', 'setupFlowName']);\n case 'seed':\n return pick(c, ['seedWorkflowId', 'seedWorkflowName', 'snapshotVersion']);\n case 'end':\n return pick(c, ['outcome']);\n case 'wait':\n case 'condition':\n case 'api_sequence':\n return c;\n default:\n return c;\n }\n}\n\nfunction pick(obj: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n if (obj[key] !== undefined && obj[key] !== null) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\nexport function formatWorkflowMarkdown(workflow: WorkflowSummary): string {\n const seedOutputs = workflow.seedOutputsJson ?? workflow.seedOutputs;\n return workflowToSpec({ ...workflow, seedOutputs });\n}\n\nexport function formatWorkflowJson(workflow: WorkflowSummary): object {\n const sorted = topoOrderNodes(workflow.nodes, workflow.edges ?? []);\n const seedOutputs = workflow.seedOutputsJson;\n const env = workflow as WorkflowSummary & WorkflowEnvFields;\n\n return {\n workflow: {\n id: workflow.id,\n name: workflow.name,\n description: workflow.description,\n status: workflow.status,\n flowType: workflow.flowType,\n ...(seedOutputs && seedOutputs.length > 0 ? { seedOutputs } : {}),\n ...(env.defaultEnvironmentId !== undefined\n ? { defaultEnvironmentId: env.defaultEnvironmentId }\n : {}),\n ...(env.eligibleEnvironmentIds ? { eligibleEnvironmentIds: env.eligibleEnvironmentIds } : {}),\n ...(env.passByEnvironment && env.passByEnvironment.length > 0\n ? {\n passByEnvironment: env.passByEnvironment.map((p) => ({\n environment: `${p.environmentName} (${p.environmentType})`,\n everPassed: p.everPassed,\n passed: p.passed,\n total: p.total,\n health: p.health,\n })),\n }\n : {}),\n },\n steps: sorted.map((node, i) => ({\n index: i + 1,\n nodeId: node.id,\n nodeType: node.nodeType,\n title: getNodeTitle(node),\n config: getCleanConfig(node),\n })),\n };\n}\n","/**\n * CLI handler for triggering a workflow execution.\n *\n * Usage:\n * canary workflow run <workflowId> [options]\n *\n * @module WorkflowRunCLI\n */\n\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport {\n apiRequest,\n fetchWorkflowEnvironments,\n renderWorkflowUserError,\n resolveEnvironmentByNameOrId,\n} from './cli-helpers.js';\nimport { statusIcon } from './cli-format.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ExecuteResponse = {\n ok: boolean;\n error?: string;\n runId: string;\n streamId: string;\n};\n\ntype RunStatusResponse = {\n ok: boolean;\n error?: string;\n data: {\n run: {\n id: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n };\n };\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleWorkflowRun(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n // `--environment` takes a value; exclude that token when picking the\n // positional workflow id so `run --environment staging <wf>` still works.\n const environmentArg = getArgValue(argv, '--environment');\n const flagValues = new Set([environmentArg].filter((v): v is string => Boolean(v)));\n const workflowId = argv.find((a) => !a.startsWith('-') && !flagValues.has(a));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error(\n 'Usage: canary workflow run <workflowId> [--environment <name|id>] [--stream] [--json] [--validation | --no-validation]'\n );\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const stream = hasFlag(argv, '--stream');\n // Validation mode opt-in/opt-out. Server auto-engages validation for tests\n // that have never passed when triggered directly; --validation forces it on,\n // --no-validation forces it off.\n const optInValidation = hasFlag(argv, '--validation');\n const optOutValidation = hasFlag(argv, '--no-validation');\n const validationMode = optInValidation ? true : optOutValidation ? false : undefined;\n\n const requestBody: Record<string, unknown> = {\n triggerSource: 'cli_direct',\n };\n if (validationMode !== undefined) {\n requestBody.validationMode = validationMode;\n }\n\n // Optional environment override. Resolve a name/id against the flow's\n // property and pass `environmentId` to the execute endpoint. When omitted the\n // server falls back to the workflow's configured `defaultEnvironmentId` (then\n // credential-bound / property-default env), so a plain run targets the\n // sandbox once the flow's default is set via `workflow patch`.\n let resolvedEnvironmentId: string | undefined;\n if (environmentArg) {\n const envs = await fetchWorkflowEnvironments(apiUrl, token, workflowId);\n resolvedEnvironmentId = resolveEnvironmentByNameOrId(envs, environmentArg);\n requestBody.environmentId = resolvedEnvironmentId;\n }\n\n // Trigger execution\n const result = await apiRequest<ExecuteResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/execute`,\n requestBody\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const rendered = renderWorkflowUserError(result as unknown as Record<string, unknown>);\n console.error(rendered ?? `Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n const { runId } = result;\n\n if (jsonOutput && !stream) {\n console.log(JSON.stringify({ ok: true, runId, streamId: result.streamId }, null, 2));\n return;\n }\n\n if (!stream) {\n console.log(`Run triggered successfully.`);\n console.log(` Run ID: ${runId}`);\n if (environmentArg) {\n console.log(` Environment: ${environmentArg} (${resolvedEnvironmentId})`);\n }\n console.log(`\\nCheck status: canary workflow runs get ${workflowId} ${runId}`);\n return;\n }\n\n // Stream mode: poll run status until completion\n console.log(`Run triggered (${runId}). Waiting for completion...\\n`);\n\n const terminalStatuses = new Set([\n 'completed',\n 'success',\n 'passed',\n 'failed',\n 'canceled',\n 'timeout',\n ]);\n let lastStatus = '';\n\n for (;;) {\n await sleep(3000);\n\n const status = await apiRequest<RunStatusResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}`\n );\n\n if (!status.ok) {\n console.error(`Error polling status: ${status.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n const run = status.data.run;\n\n if (run.status !== lastStatus) {\n console.log(` ${statusIcon(run.status)} ${run.status}`);\n lastStatus = run.status;\n }\n\n if (terminalStatuses.has(run.status)) {\n if (run.errorMessage) {\n console.log(`\\nError: ${run.errorMessage}`);\n }\n console.log(`\\nRun finished: ${run.status}`);\n console.log(`Details: canary workflow runs get ${workflowId} ${runId}`);\n\n if (run.status === 'failed' || run.status === 'timeout' || run.status === 'canceled') {\n process.exit(1);\n }\n return;\n }\n }\n}\n","/**\n * Shared CLI formatting utilities for status display, durations, and timestamps.\n *\n * @module CLIFormat\n */\n\nexport const STATUS_ICONS: Record<string, string> = {\n completed: '\\u2705',\n completed_with_errors: '\\u26A0\\uFE0F',\n success: '\\u2705',\n passed: '\\u2705',\n failed: '\\u274C',\n running: '\\uD83D\\uDD35',\n queued: '\\u23F3',\n canceled: '\\uD83D\\uDEAB',\n timeout: '\\u23F0',\n skipped: '\\u23ED\\uFE0F',\n flaky_success: '\\uD83D\\uDFE1',\n pending: '\\u23F3',\n};\n\nexport function statusIcon(status: string): string {\n return STATUS_ICONS[status] ?? '\\u2753';\n}\n\nexport function formatRelative(iso: string | null): string {\n if (!iso) return '\\u2014';\n const diffMs = Date.now() - new Date(iso).getTime();\n if (diffMs < 0) return 'just now';\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\nexport function computeDuration(startedAt: string | null, finishedAt: string | null): string {\n if (!startedAt || !finishedAt) return '\\u2014';\n const ms = new Date(finishedAt).getTime() - new Date(startedAt).getTime();\n if (ms < 0) return '\\u2014';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainMins = minutes % 60;\n return remainMins > 0 ? `${hours}h ${remainMins}m` : `${hours}h`;\n}\n\nexport function pad(str: string, len: number): string {\n return str.padEnd(len);\n}\n\nexport function readFromStdin(): Promise<string> {\n const stdin = process.stdin;\n\n if (stdin.isTTY) {\n return Promise.reject(\n new Error('No input on stdin. Pipe JSON or use --from-file.')\n );\n }\n\n const chunks: Buffer[] = [];\n return new Promise((resolve, reject) => {\n stdin.on('data', (chunk) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stdin.on('error', reject);\n });\n}\n","/**\n * CLI subcommand for querying workflow run results.\n *\n * Usage:\n * canary workflow runs list <workflowId> [options]\n * canary workflow runs get <workflowId> <runId> [options]\n * canary workflow runs diagnostics <workflowId> <runId> [options]\n *\n * @module WorkflowRunsCLI\n */\n\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { statusIcon, formatRelative, computeDuration, pad } from './cli-format.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Pagination = {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n};\n\ntype RunSummary = {\n id: string;\n status: string;\n createdAt: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n browserMode: string | null;\n stepTotals: { total: number; passed: number; failed: number } | null;\n snapshotVersion: number | null;\n};\n\ntype RunListResponse = {\n ok: boolean;\n error?: string;\n data: { runs: RunSummary[] };\n pagination: Pagination;\n};\n\ntype RunStep = {\n id: string;\n runId: string;\n nodeId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n orderIndex: number;\n metadataJson: Record<string, unknown> | null;\n createdAt: string;\n};\n\ntype RunDetail = {\n id: string;\n workflowId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n metadataJson: Record<string, unknown> | null;\n steps: RunStep[];\n draftSnapshot: { id: string; version: string; basePublishedVersion: number } | null;\n};\n\ntype RunDetailResponse = {\n ok: boolean;\n error?: string;\n data: { run: RunDetail };\n};\n\ntype DiagnosticJson = {\n category?: string;\n title?: string;\n analysis?: string;\n recommendation?: string;\n smokingGun?: { type: string; description: string; detail?: string } | null;\n};\n\ntype FailureDiagnosticResponse = {\n ok: boolean;\n error?: string;\n data: {\n id: string;\n status: string;\n diagnostic: DiagnosticJson | null;\n createdAt: string;\n updatedAt: string;\n } | null;\n};\n\ntype RawDiagnosticsResponse = {\n ok: boolean;\n error?: string;\n consoleLogs: Array<{ level: string; text: string; timestamp?: string }>;\n networkRequests: Array<{ method: string; url: string; status: number }>;\n};\n\n// ---------------------------------------------------------------------------\n// Handlers\n// ---------------------------------------------------------------------------\n\ntype AnnotatedRun = RunSummary & { side: 'browser' | 'api' };\n\ntype ApiSequenceRunRow = {\n id: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n createdAt?: string;\n};\n\ntype ApiSequenceByWorkflow = {\n ok: boolean;\n error?: string;\n data?: { id: string } | null;\n};\n\ntype ApiSequenceRunsResponse = {\n ok: boolean;\n error?: string;\n data: ApiSequenceRunRow[];\n pagination?: Pagination;\n};\n\nasync function fetchBrowserRuns(\n apiUrl: string,\n token: string,\n workflowId: string,\n page: string,\n pageSize: string\n): Promise<{ runs: RunSummary[]; pagination: Pagination } | { error: string }> {\n const params = new URLSearchParams({ page, pageSize });\n const result = await apiRequest<RunListResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs?${params}`\n );\n if (!result.ok) return { error: result.error ?? 'Unknown error' };\n return { runs: result.data.runs, pagination: result.pagination };\n}\n\nasync function fetchApiRuns(\n apiUrl: string,\n token: string,\n workflowId: string,\n page: string,\n pageSize: string\n): Promise<\n { runs: RunSummary[]; pagination: Pagination | null } | { error: string; code?: string }\n> {\n const seqRes = await apiRequest<ApiSequenceByWorkflow & { code?: string }>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/by-workflow/${workflowId}`\n );\n if (!seqRes.ok) {\n return {\n error: seqRes.error ?? 'Unknown error',\n ...(seqRes.code ? { code: seqRes.code } : {}),\n };\n }\n if (!seqRes.data) return { runs: [], pagination: null };\n const params = new URLSearchParams({ page, pageSize });\n const runsRes = await apiRequest<ApiSequenceRunsResponse>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/${seqRes.data.id}/runs?${params}`\n );\n if (!runsRes.ok) return { error: runsRes.error ?? 'Unknown error' };\n const runs: RunSummary[] = (runsRes.data ?? []).map((r) => ({\n id: r.id,\n status: r.status,\n createdAt: r.createdAt ?? r.startedAt ?? new Date(0).toISOString(),\n startedAt: r.startedAt,\n finishedAt: r.finishedAt,\n errorMessage: r.errorMessage,\n browserMode: null,\n stepTotals: null,\n snapshotVersion: null,\n }));\n return { runs, pagination: runsRes.pagination ?? null };\n}\n\nasync function handleRunsList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID. Usage: canary workflow runs list <workflowId>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const page = getArgValue(argv, '--page') ?? '1';\n const pageSize = getArgValue(argv, '--page-size') ?? '10';\n const explicitSide = getArgValue(argv, '--side') ?? getArgValue(argv, '--mode');\n const sideArg = (explicitSide ?? 'all').toLowerCase();\n\n if (!['all', 'api', 'browser'].includes(sideArg)) {\n console.error(`Error: --side must be one of: all, api, browser (got \"${sideArg}\")`);\n process.exit(1);\n }\n\n const annotated: AnnotatedRun[] = [];\n let browserPagination: Pagination | null = null;\n let apiPagination: Pagination | null = null;\n\n if (sideArg === 'browser' || sideArg === 'all') {\n const browser = await fetchBrowserRuns(apiUrl, token, workflowId, page, pageSize);\n if ('error' in browser) {\n console.error(`Error: ${browser.error}`);\n process.exit(1);\n }\n browserPagination = browser.pagination;\n for (const r of browser.runs) annotated.push({ ...r, side: 'browser' });\n }\n\n if (sideArg === 'api' || sideArg === 'all') {\n const api = await fetchApiRuns(apiUrl, token, workflowId, page, pageSize);\n if ('error' in api) {\n // When --side wasn't explicit and the workflow simply has no api-sequence,\n // don't hard-fail the whole listing — just skip the api leg.\n const isMissingSequence = api.code === 'API_SEQUENCE_NOT_FOUND';\n if (!explicitSide && isMissingSequence) {\n if (!jsonOutput) {\n console.error('Note: workflow has no api-sequence — showing browser runs only.');\n }\n } else {\n console.error(`Error: ${api.error}`);\n process.exit(1);\n }\n } else {\n apiPagination = api.pagination;\n for (const r of api.runs) annotated.push({ ...r, side: 'api' });\n }\n }\n\n annotated.sort((a, b) => {\n const ta = new Date(a.startedAt ?? a.createdAt).getTime();\n const tb = new Date(b.startedAt ?? b.createdAt).getTime();\n return tb - ta;\n });\n\n if (jsonOutput) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n data: { runs: annotated },\n pagination: { browser: browserPagination, api: apiPagination },\n },\n null,\n 2\n )\n );\n return;\n }\n\n if (annotated.length === 0) {\n console.log('No runs found.');\n return;\n }\n\n console.log(`Runs (${annotated.length} shown, side=${sideArg})\\n`);\n const idW = 36;\n const sideW = 8;\n const statusW = 12;\n const durationW = 10;\n console.log(\n [\n 'ID'.padEnd(idW),\n 'Side'.padEnd(sideW),\n 'Status'.padEnd(statusW),\n 'Duration'.padEnd(durationW),\n 'Started',\n ].join(' ')\n );\n\n for (const run of annotated) {\n const icon = statusIcon(run.status);\n const dur = computeDuration(run.startedAt, run.finishedAt);\n const time = formatRelative(run.startedAt ?? run.createdAt);\n console.log(\n [\n run.id.padEnd(idW),\n pad(run.side, sideW),\n `${icon} ${pad(run.status, statusW - 3)}`,\n pad(dur, durationW),\n time,\n ].join(' ')\n );\n }\n console.log('');\n}\n\nasync function handleRunsGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error(\n 'Error: Missing arguments. Usage: canary workflow runs get <workflowId> <runId>'\n );\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n\n const result = await apiRequest<RunDetailResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { run } = result.data;\n const duration = computeDuration(run.startedAt, run.finishedAt);\n\n console.log(`Run: ${run.id}`);\n console.log(`Status: ${statusIcon(run.status)} ${run.status}`);\n console.log(`Duration: ${duration}`);\n\n if (run.errorMessage) {\n console.log(`Error: ${run.errorMessage}`);\n }\n\n if (run.draftSnapshot) {\n console.log(`Snapshot: v${run.draftSnapshot.version} (base: v${run.draftSnapshot.basePublishedVersion})`);\n }\n\n const steps = (run.steps ?? []).sort((a, b) => a.orderIndex - b.orderIndex);\n\n if (steps.length === 0) {\n console.log('\\nNo steps recorded.');\n return;\n }\n\n console.log(`\\nSteps (${steps.length}):`);\n for (const step of steps) {\n const idx = String(step.orderIndex + 1).padStart(2);\n const icon = statusIcon(step.status);\n const nodeId = step.nodeId.slice(0, 8);\n const dur = computeDuration(step.startedAt, step.finishedAt);\n\n console.log(` ${idx}. ${icon} ${pad(nodeId, 10)} ${dur}`);\n\n if (step.errorMessage) {\n console.log(` Error: ${step.errorMessage}`);\n }\n }\n\n console.log('');\n}\n\nasync function handleRunsDiagnostics(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error(\n 'Error: Missing arguments. Usage: canary workflow runs diagnostics <workflowId> <runId>'\n );\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n\n // Try AI failure diagnostic first\n const result = await apiRequest<FailureDiagnosticResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}/failure-diagnostic`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput && result.data) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.data) {\n const { status, diagnostic } = result.data;\n\n if (status === 'pending' || status === 'running') {\n console.log(`Diagnostic is still in progress (status: ${status}).`);\n return;\n }\n\n if (status === 'failed') {\n console.log('Diagnostic analysis failed.');\n return;\n }\n\n if (diagnostic) {\n console.log('Failure Diagnostic');\n console.log(`Status: ${status}`);\n if (diagnostic.category) {\n console.log(`Category: ${diagnostic.category}`);\n }\n if (diagnostic.title) {\n console.log(`Title: ${diagnostic.title}`);\n }\n\n if (diagnostic.analysis) {\n console.log('');\n console.log('Analysis:');\n console.log(` ${diagnostic.analysis}`);\n }\n\n if (diagnostic.recommendation) {\n console.log('');\n console.log('Recommendation:');\n console.log(` ${diagnostic.recommendation}`);\n }\n\n if (diagnostic.smokingGun) {\n console.log('');\n console.log('Smoking Gun:');\n console.log(` > ${diagnostic.smokingGun.description}`);\n if (diagnostic.smokingGun.detail) {\n console.log(` ${diagnostic.smokingGun.detail}`);\n }\n }\n\n console.log('');\n return;\n }\n }\n\n // Fall back to raw console/network diagnostics\n const rawResult = await apiRequest<RawDiagnosticsResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}/diagnostics`\n );\n\n if (!rawResult.ok) {\n console.log('No diagnostic available for this run.');\n return;\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(rawResult, null, 2));\n return;\n }\n\n const hasConsole = rawResult.consoleLogs && rawResult.consoleLogs.length > 0;\n const hasNetwork = rawResult.networkRequests && rawResult.networkRequests.length > 0;\n\n if (!hasConsole && !hasNetwork) {\n console.log('No diagnostic data available for this run.');\n return;\n }\n\n if (hasConsole) {\n console.log(`Console Logs (${rawResult.consoleLogs.length}):`);\n for (const log of rawResult.consoleLogs.slice(0, 50)) {\n const level = log.level.toUpperCase().padEnd(7);\n console.log(` [${level}] ${log.text}`);\n }\n if (rawResult.consoleLogs.length > 50) {\n console.log(` ... and ${rawResult.consoleLogs.length - 50} more`);\n }\n console.log('');\n }\n\n if (hasNetwork) {\n console.log(`Network Requests (${rawResult.networkRequests.length}):`);\n for (const req of rawResult.networkRequests.slice(0, 30)) {\n const statusStr = req.status >= 400 ? `${req.status} !!!` : String(req.status);\n console.log(` ${req.method.padEnd(6)} ${statusStr.padEnd(8)} ${req.url}`);\n }\n if (rawResult.networkRequests.length > 30) {\n console.log(` ... and ${rawResult.networkRequests.length - 30} more`);\n }\n console.log('');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nfunction printRunsHelp(): void {\n console.log(\n [\n 'Usage: canary workflow runs <sub-command> [options]',\n '',\n 'Sub-commands:',\n ' list <workflowId> [options] List runs for a workflow',\n ' get <workflowId> <runId> [options] Get run detail with steps',\n ' diagnostics <workflowId> <runId> [options] Get failure diagnostic',\n '',\n 'List options:',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 10)',\n ' --side <side> Filter: browser, api, all (default: all). Alias: --mode',\n '',\n 'Output options:',\n ' --json Output raw JSON',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ].join('\\n')\n );\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nexport async function runWorkflowRuns(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printRunsHelp();\n return;\n }\n\n switch (subCommand) {\n case 'list':\n await handleRunsList(rest, apiUrl, token);\n break;\n case 'get':\n await handleRunsGet(rest, apiUrl, token);\n break;\n case 'diagnostics':\n await handleRunsDiagnostics(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printRunsHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI handler for syncing a workflow's DAG (nodes + edges) atomically.\n *\n * Reads the new state from a JSON file or stdin, creates a draft snapshot\n * of the current state for safety, then replaces all nodes and edges.\n *\n * Input is flexible — the CLI auto-fills missing fields:\n * - Node `id` and `orderIndex` are auto-generated\n * - `edges` array is optional — linear sequential edges are created\n * - Accepts the same minimal format as `canary workflow create`\n *\n * Usage:\n * canary workflow sync <workflowId> --from-file <path>\n * cat state.json | canary workflow sync <workflowId> --from-stdin\n *\n * Minimal input: { \"nodes\": [{ \"nodeType\": \"login\", \"configJson\": {} }, ...] }\n *\n * @module WorkflowSyncCLI\n */\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { alignSnapshotNodeIds, type AlignNode } from '@chatsdet/workflow-diff';\nimport { normalizeNodeType } from '@chatsdet/types';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { readFromStdin } from './cli-format.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SyncResponse = {\n ok: boolean;\n error?: string;\n snapshotVersion?: string;\n};\n\ntype ProposalResponse = {\n ok: boolean;\n error?: string;\n data?: {\n id: string;\n title: string;\n status: string;\n };\n};\n\n// ---------------------------------------------------------------------------\n// Auto-fill helpers\n// ---------------------------------------------------------------------------\n\ntype RawNode = Record<string, unknown>;\ntype RawEdge = Record<string, unknown>;\n\nfunction normalizeNodesAndEdges(\n rawNodes: RawNode[],\n rawEdges?: RawEdge[]\n): { nodes: RawNode[]; edges: RawEdge[] } {\n // Fill missing node fields with defaults\n const nodes = rawNodes.map((node, i) => ({\n ...node,\n id: (node.id as string) ?? crypto.randomUUID(),\n orderIndex: (node.orderIndex as number) ?? i,\n configJson: (node.configJson as Record<string, unknown>) ?? {},\n }));\n\n // If edges provided, just fill missing IDs\n if (rawEdges && rawEdges.length > 0) {\n const edges = rawEdges.map((edge) => ({\n ...edge,\n id: (edge.id as string) ?? crypto.randomUUID(),\n }));\n return { nodes, edges };\n }\n\n // Auto-generate linear sequential edges\n const edges: RawEdge[] = [];\n for (let i = 0; i < nodes.length - 1; i++) {\n edges.push({\n id: crypto.randomUUID(),\n sourceNodeId: nodes[i].id,\n targetNodeId: nodes[i + 1].id,\n edgeType: 'default',\n });\n }\n\n return { nodes, edges };\n}\n\n// ---------------------------------------------------------------------------\n// Input reading\n// ---------------------------------------------------------------------------\n\nasync function readSyncInput(argv: string[]): Promise<{ nodes: RawNode[]; edges?: RawEdge[] }> {\n const filePath = getArgValue(argv, '--from-file');\n const fromStdin = hasFlag(argv, '--from-stdin');\n\n let raw: string;\n if (filePath) {\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n console.error(`Error reading file: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n } else if (fromStdin) {\n try {\n raw = await readFromStdin();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n } else {\n console.error('Error: Must provide --from-file <path> or --from-stdin');\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n console.error('Error: Invalid JSON input');\n process.exit(1);\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // Normalize \"acting-as\" → \"login\" on user-supplied node entries so callers\n // can use the new spelling without breaking the canonical persisted type.\n const normalizeNodes = (raw: unknown[]): RawNode[] => {\n return raw.map((entry) => {\n if (entry && typeof entry === 'object' && 'nodeType' in entry) {\n const node = entry as RawNode;\n if (typeof node.nodeType === 'string') {\n node.nodeType = normalizeNodeType(node.nodeType);\n }\n }\n return entry as RawNode;\n });\n };\n\n // Direct format: { nodes: [...], edges?: [...] }\n if (Array.isArray(obj.nodes)) {\n return {\n nodes: normalizeNodes(obj.nodes),\n edges: Array.isArray(obj.edges) ? obj.edges : undefined,\n };\n }\n\n // Wrapped format from `canary workflow get`: { workflow: { nodes: [...], edges: [...] } }\n const workflow = obj.workflow as Record<string, unknown> | undefined;\n if (workflow && Array.isArray(workflow.nodes)) {\n return {\n nodes: normalizeNodes(workflow.nodes),\n edges: Array.isArray(workflow.edges) ? workflow.edges : undefined,\n };\n }\n\n console.error('Error: JSON must contain a \"nodes\" array.');\n console.error('Accepted formats:');\n console.error(' { \"nodes\": [{ \"nodeType\": \"login\", \"configJson\": {} }, ...] }');\n console.error(' { \"nodes\": [...], \"edges\": [...] }');\n console.error(' { \"workflow\": { \"nodes\": [...], \"edges\": [...] } }');\n console.error('');\n console.error('Edges, IDs, positions, and ordering are auto-generated when omitted.');\n process.exit(1);\n}\n\n// ---------------------------------------------------------------------------\n// Current-workflow ID alignment (for --propose)\n// ---------------------------------------------------------------------------\n\ntype WorkflowGetResponse = {\n ok: boolean;\n error?: string;\n workflow?: {\n id: string;\n nodes?: Array<{\n id: string;\n nodeType: string;\n orderIndex?: number;\n configJson?: Record<string, unknown> | null;\n }>;\n };\n};\n\nasync function alignWithCurrentWorkflow(\n apiUrl: string,\n token: string,\n workflowId: string,\n nodes: RawNode[],\n edges: RawEdge[],\n): Promise<{ nodes: RawNode[]; edges: RawEdge[] }> {\n // Best-effort: a failed fetch (network blip, 404, permissions) shouldn't\n // block the proposal — the server-side aligner will still run.\n let currentNodes: AlignNode[] = [];\n try {\n const current = await apiRequest<WorkflowGetResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}`,\n );\n if (current.ok && current.workflow?.nodes) {\n currentNodes = current.workflow.nodes.map((n) => ({\n id: n.id,\n nodeType: n.nodeType,\n orderIndex: n.orderIndex,\n configJson: n.configJson ?? {},\n }));\n }\n } catch {\n // Swallow — alignment is a best-effort optimization on the client.\n }\n\n if (currentNodes.length === 0) {\n return { nodes, edges };\n }\n\n const proposedSnapshot = {\n nodes: nodes.map((n) => ({\n id: String(n.id),\n nodeType: String(n.nodeType ?? ''),\n orderIndex: typeof n.orderIndex === 'number' ? n.orderIndex : undefined,\n configJson: (n.configJson as Record<string, unknown> | null | undefined) ?? {},\n })),\n edges: edges.map((e) => ({\n id: String(e.id),\n sourceNodeId: String(e.sourceNodeId),\n targetNodeId: String(e.targetNodeId),\n edgeType: (e.edgeType as string | null | undefined) ?? null,\n })),\n };\n\n const { snapshot } = alignSnapshotNodeIds(proposedSnapshot, currentNodes);\n\n // Splice aligned IDs back onto the original raw nodes/edges so any extra\n // fields callers passed through (canonicalPageId, etc.) are preserved.\n const alignedNodes: RawNode[] = nodes.map((n, i) => ({\n ...n,\n id: snapshot.nodes[i]!.id,\n }));\n const alignedEdges: RawEdge[] = edges.map((e, i) => ({\n ...e,\n sourceNodeId: snapshot.edges[i]!.sourceNodeId,\n targetNodeId: snapshot.edges[i]!.targetNodeId,\n }));\n\n return { nodes: alignedNodes, edges: alignedEdges };\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleWorkflowSync(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow sync <workflowId> --from-file <path>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const noSnapshot = hasFlag(argv, '--no-snapshot');\n const propose = hasFlag(argv, '--propose');\n const proposalTitle = getArgValue(argv, '--title');\n const proposalDescription = getArgValue(argv, '--description');\n\n const raw = await readSyncInput(argv);\n const { nodes, edges } = normalizeNodesAndEdges(raw.nodes, raw.edges);\n\n // --propose: create a proposal instead of applying directly\n if (propose) {\n const title = proposalTitle ?? `CLI sync proposal (${nodes.length} nodes)`;\n\n // Reuse existing workflow node IDs whenever a proposed step lines up with\n // a current step (same nodeType + orderIndex). Without this the diff\n // engine — which matches by node.id — sees the proposal as a wholesale\n // rewrite even when only a few configs changed. The server-side aligner\n // is the authoritative pass; doing it here too keeps CLI output sensible\n // and gives agents a clean diff even before they round-trip through the\n // API.\n const aligned = await alignWithCurrentWorkflow(apiUrl, token, workflowId, nodes, edges);\n\n const result = await apiRequest<ProposalResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/proposals`,\n {\n title,\n description: proposalDescription ?? null,\n snapshotJson: { nodes: aligned.nodes, edges: aligned.edges },\n source: 'api',\n }\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Proposal created for workflow ${workflowId} (${nodes.length} nodes, ${edges.length} edges).`);\n if (result.data?.id) {\n console.log(`Proposal ID: ${result.data.id}`);\n }\n return;\n }\n\n const result = await apiRequest<SyncResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${workflowId}/draft-state`,\n { nodes, edges, createSnapshot: !noSnapshot }\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Workflow ${workflowId} synced (${nodes.length} nodes, ${edges.length} edges).`);\n if (result.snapshotVersion) {\n console.log(`Draft snapshot created: ${result.snapshotVersion}`);\n }\n}\n","/**\n * CLI handler for generating an API sequence from a workflow.\n *\n * Generates from the latest successful run (default) or from a text prompt.\n * Streams progress events via SSE and outputs the resulting ApiSequenceConfig.\n *\n * Usage:\n * canary workflow generate-api-sequence <workflowId> [--guidance \"text\"] [--json]\n * canary workflow generate-api-sequence --prompt \"Create user\" [--property <id>] [--json]\n *\n * @module WorkflowApiSequenceCLI\n */\n\nimport process from 'node:process';\nimport { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { getArgValue, hasFlag } from './auth.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype GenerateResponse = {\n ok: boolean;\n error?: string;\n generationId?: string;\n};\n\ntype ApiSequenceEvent = {\n emittedAt: string;\n workflowId: string;\n} & (\n | { eventType: 'progress'; message: string }\n | { eventType: 'tool-call'; toolName: string; args: unknown }\n | { eventType: 'tool-result'; toolName: string; result: unknown; success: boolean }\n | { eventType: 'text'; delta: string }\n | {\n eventType: 'complete';\n config: unknown;\n summary: string;\n propertyId: string | null;\n credentialId: string | null;\n }\n | { eventType: 'error'; message: string }\n);\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleWorkflowGenerateApiSequence(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n const prompt = getArgValue(argv, '--prompt');\n const guidance = getArgValue(argv, '--guidance');\n const propertyId = getArgValue(argv, '--property');\n const jsonOutput = hasFlag(argv, '--json');\n const verbose = hasFlag(argv, '--verbose', '-v');\n\n if (!workflowId && !prompt) {\n console.error('Error: Provide a workflow ID or --prompt.');\n console.error('');\n console.error('Usage:');\n console.error(' canary workflow generate-api-sequence <workflowId> [--guidance \"text\"]');\n console.error(' canary workflow generate-api-sequence --prompt \"Create user\" [--property <id>]');\n process.exit(1);\n }\n\n // 1. Trigger generation\n let endpoint: string;\n let body: Record<string, unknown>;\n\n if (workflowId && !prompt) {\n // Generate from latest successful run\n endpoint = '/api-sequence-agent/generate-from-run';\n body = { workflowId };\n if (guidance) body.guidancePrompt = guidance;\n if (!jsonOutput) {\n console.error(`Generating API sequence from latest run of workflow ${workflowId}...`);\n }\n } else {\n // Generate from prompt\n endpoint = '/api-sequence-agent/generate';\n body = { prompt: prompt! };\n if (propertyId) body.propertyId = propertyId;\n if (workflowId) body.workflowId = workflowId;\n if (!jsonOutput) {\n console.error(`Generating API sequence from prompt...`);\n }\n }\n\n let triggerRes: Response;\n try {\n triggerRes = await fetch(`${apiUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n if (triggerRes.status === 403) {\n const data = (await triggerRes.json().catch(() => ({}))) as { error?: string };\n console.error(`Error: ${data.error ?? 'This feature is not enabled for your organization.'}`);\n process.exit(1);\n }\n\n if (!triggerRes.ok) {\n const data = (await triggerRes.json().catch(() => ({}))) as { error?: string };\n console.error(`Error: ${data.error ?? `${triggerRes.status} ${triggerRes.statusText}`}`);\n process.exit(1);\n }\n\n const triggerData = (await triggerRes.json()) as GenerateResponse;\n if (!triggerData.ok || !triggerData.generationId) {\n console.error(`Error: ${triggerData.error ?? 'Failed to start generation'}`);\n process.exit(1);\n }\n\n const { generationId } = triggerData;\n\n // 2. Subscribe to SSE stream\n const streamUrl = `${apiUrl}/api-sequence-agent/stream?generationId=${generationId}`;\n\n let streamRes: Response;\n try {\n streamRes = await fetch(streamUrl, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'text/event-stream',\n },\n });\n } catch (err) {\n console.error(`Failed to connect to event stream: ${err}`);\n process.exit(1);\n }\n\n if (!streamRes.ok || !streamRes.body) {\n console.error(`Failed to connect to event stream: ${streamRes.status}`);\n process.exit(1);\n }\n\n // 3. Parse SSE events\n let resultConfig: unknown = null;\n let resultSummary = '';\n let hasCompleted = false;\n let exitCode = 0;\n\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data || event.event !== 'api-sequence-generation') return;\n\n try {\n const data = JSON.parse(event.data) as ApiSequenceEvent;\n\n switch (data.eventType) {\n case 'progress':\n if (!jsonOutput) console.error(` ${data.message}`);\n break;\n\n case 'tool-call':\n if (verbose) console.error(` [tool] ${data.toolName}`);\n break;\n\n case 'tool-result':\n if (verbose) {\n const icon = data.success ? '\\u2713' : '\\u2717';\n console.error(` [tool] ${icon} ${data.toolName}`);\n }\n break;\n\n case 'text':\n // Accumulate but don't print deltas in non-verbose mode\n if (verbose) process.stderr.write(data.delta);\n break;\n\n case 'complete':\n resultConfig = data.config;\n resultSummary = data.summary;\n hasCompleted = true;\n break;\n\n case 'error':\n console.error(`\\nError: ${data.message}`);\n exitCode = 1;\n hasCompleted = true;\n break;\n }\n } catch {\n // Ignore parse errors for keepalive etc.\n }\n },\n });\n\n const reader = streamRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (!hasCompleted) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n // 4. Output result\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n\n if (!resultConfig) {\n console.error('Generation completed but no config was returned.');\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: true, config: resultConfig, summary: resultSummary }, null, 2));\n } else {\n if (resultSummary) {\n console.error('');\n console.error(resultSummary);\n }\n console.error('');\n console.log(JSON.stringify(resultConfig, null, 2));\n }\n}\n","/**\n * `canary workflow api-sequence <verb>` — manage the API sequence attached to an\n * api-only workflow.\n *\n * All verbs take a workflowId (not a raw apiSequenceId) to match the agent's\n * mental model: \"the sequence attached to this workflow\". The CLI resolves the\n * apiSequenceId via GET /api-sequences/by-workflow/:workflowId in one extra hop.\n *\n * Output auto-detects JSON (piped) vs text (TTY); --json/--text force either.\n *\n * @module WorkflowApiSequenceCmdsCLI\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { handleWorkflowGenerateApiSequence } from './workflow-api-sequence.js';\n\n/* ── Arg helpers ───────────────────────────────────────────────────────── */\n\nfunction getArg(argv: string[], key: string): string | undefined {\n const prefix = `${key}=`;\n const eq = argv.find((a) => a.startsWith(prefix));\n if (eq) return eq.slice(prefix.length);\n return getArgValue(argv, key);\n}\n\nfunction wantsJson(argv: string[]): boolean {\n if (hasFlag(argv, '--json')) return true;\n if (hasFlag(argv, '--text')) return false;\n return !process.stdout.isTTY;\n}\n\nfunction emit(argv: string[], textFallback: string, json: unknown): void {\n if (wantsJson(argv)) {\n console.log(JSON.stringify(json, null, 2));\n } else {\n console.log(textFallback);\n }\n}\n\nasync function readJsonInput(argv: string[]): Promise<unknown> {\n const fromFile = getArg(argv, '--from-file');\n let raw: string;\n if (fromFile) {\n raw = await fs.readFile(fromFile, 'utf-8');\n } else if (hasFlag(argv, '--from-stdin') || !process.stdin.isTTY) {\n raw = await readStdin();\n } else {\n throw new Error('Provide --from-file <path> or pipe JSON on stdin.');\n }\n try {\n return JSON.parse(raw);\n } catch {\n throw new Error('Invalid JSON input.');\n }\n}\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n process.stdin.on('error', reject);\n });\n}\n\n/* ── Types ─────────────────────────────────────────────────────────────── */\n\ninterface ApiSequenceStep {\n id?: string;\n endpointId?: string;\n method?: string;\n path?: string;\n [k: string]: unknown;\n}\n\ninterface ApiSequenceConfig {\n steps: ApiSequenceStep[];\n description?: string;\n stopOnFailure?: boolean;\n exports?: unknown[];\n}\n\ninterface ApiSequenceRecord {\n id: string;\n workflowId: string;\n orgId: string;\n credentialId: string | null;\n config: ApiSequenceConfig;\n status: string;\n guidancePrompt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface ByWorkflowResponse {\n ok: boolean;\n error?: string;\n data?: ApiSequenceRecord | null;\n}\n\ninterface ExecuteResponse {\n ok: boolean;\n error?: string;\n data?: { runId: string; status: string };\n}\n\ninterface ValidationIssue {\n path: string;\n code: string;\n message: string;\n hint?: string;\n}\n\ninterface GenericResponse {\n ok: boolean;\n error?: string;\n code?: string;\n issues?: ValidationIssue[];\n data?: unknown;\n}\n\n/**\n * Handle an error response from an api-sequence mutation. If the server\n * returned API_SEQUENCE_INVALID, emit a dense, machine-parseable report\n * so a coding agent can iterate: JSON mode emits `{ok:false, error, code,\n * issues}` to stdout; text mode writes `path [CODE] :: message` lines to\n * stderr. Always exits 1.\n *\n * Returns without exiting for non-validation errors so the caller can\n * fall back to its own error formatting.\n */\nfunction reportAndMaybeExit(\n argv: string[],\n result: { ok: boolean; error?: string; code?: string; issues?: ValidationIssue[] },\n): void {\n if (result.ok) return;\n\n if (result.code === 'API_SEQUENCE_INVALID' && Array.isArray(result.issues)) {\n if (wantsJson(argv)) {\n // stdout, so agents piping to jq get the full structured payload.\n console.log(\n JSON.stringify(\n {\n ok: false,\n error: result.error ?? 'API sequence configuration is invalid',\n code: 'API_SEQUENCE_INVALID',\n issueCount: result.issues.length,\n issues: result.issues,\n },\n null,\n 2,\n ),\n );\n } else {\n console.error(`Error: ${result.error ?? 'API sequence configuration is invalid'}`);\n console.error(\n `Found ${result.issues.length} issue${result.issues.length === 1 ? '' : 's'}:`,\n );\n console.error('');\n // Dense form: one issue per line, `path [CODE] :: message` — grep/jq-friendly.\n for (const issue of result.issues) {\n console.error(` ${issue.path || '(root)'} [${issue.code}] :: ${issue.message}`);\n if (issue.hint) console.error(` hint: ${issue.hint}`);\n }\n console.error('');\n console.error(\n 'Re-run with --json for machine-readable output, or fix the listed fields and retry.',\n );\n }\n process.exit(1);\n }\n\n // Non-validation error — caller-provided formatting.\n return;\n}\n\n/* ── Dispatcher ────────────────────────────────────────────────────────── */\n\nexport async function handleWorkflowApiSequence(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n const [verb, ...rest] = argv;\n switch (verb) {\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'update':\n await handleUpdate(rest, apiUrl, token);\n break;\n case 'execute':\n case 'run':\n await handleExecute(rest, apiUrl, token);\n break;\n case 'delete':\n await handleDelete(rest, apiUrl, token);\n break;\n case 'set-api-only':\n await handleSetApiOnly(rest, apiUrl, token);\n break;\n case 'generate':\n await handleWorkflowGenerateApiSequence(rest, apiUrl, token);\n break;\n default:\n printHelp();\n process.exit(verb ? 1 : 0);\n }\n}\n\nfunction printHelp() {\n console.error(\n [\n 'Usage: canary workflow api-sequence <verb> <workflowId> [options]',\n '',\n 'Verbs:',\n ' get <wf> fetch the sequence attached to the workflow',\n ' update <wf> --from-file <f> replace config (steps, description, exports...)',\n ' update <wf> --from-stdin replace config from piped JSON',\n ' execute <wf> run the sequence; returns { runId, status }',\n ' delete <wf> delete the api-sequence record (keeps workflow)',\n ' set-api-only <wf> [--off] toggle the workflow\\'s apiOnly flag',\n ' generate <wf> [--prompt ...] AI-generate a config (streams progress)',\n '',\n 'Global options:',\n ' --json force JSON output',\n ' --text force pretty-text output (default when stdout is a TTY)',\n '',\n 'Config shape (for update): { steps: [...], description?, stopOnFailure?, exports? }',\n 'Run \"canary workflow guide api-sequences\" for step shape and template syntax.',\n ].join('\\n'),\n );\n}\n\n/* ── Helpers ───────────────────────────────────────────────────────────── */\n\nasync function fetchSequenceByWorkflow(\n apiUrl: string,\n token: string,\n workflowId: string,\n): Promise<ApiSequenceRecord> {\n const res = await apiRequest<ByWorkflowResponse>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/by-workflow/${workflowId}`,\n );\n if (!res.ok) {\n console.error(`Error: ${res.error ?? 'Failed to fetch sequence'}`);\n process.exit(1);\n }\n if (!res.data) {\n console.error(`Error: Workflow ${workflowId} has no attached API sequence.`);\n console.error('Create one with: canary workflow create --api-only --name <n> --sequence-from-file seq.json');\n process.exit(1);\n }\n return res.data;\n}\n\n/* ── Handlers ──────────────────────────────────────────────────────────── */\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n emit(argv, renderSequence(seq), seq);\n}\n\nasync function handleUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = await readJsonInput(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n const config = parsed as ApiSequenceConfig;\n if (!config || !Array.isArray(config.steps)) {\n console.error('Error: Input must have a \"steps\" array. Got: ' + JSON.stringify(config));\n process.exit(1);\n }\n\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n\n const result = await apiRequest<GenericResponse>(\n apiUrl,\n token,\n 'PUT',\n `/api-sequences/${seq.id}/config`,\n { config },\n );\n\n reportAndMaybeExit(argv, result);\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Update failed'}`);\n process.exit(1);\n }\n\n emit(\n argv,\n `Updated api-sequence ${seq.id} (workflow ${workflowId}). Steps: ${config.steps.length}.`,\n result,\n );\n}\n\nasync function handleExecute(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n\n const result = await apiRequest<ExecuteResponse>(\n apiUrl,\n token,\n 'POST',\n `/api-sequences/${seq.id}/execute`,\n );\n\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'Execute failed'}`);\n process.exit(1);\n }\n\n emit(\n argv,\n `Run started: ${result.data.runId} (status: ${result.data.status})\\n` +\n `Inspect: canary workflow runs get ${workflowId} ${result.data.runId}`,\n result,\n );\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n\n const result = await apiRequest<GenericResponse>(\n apiUrl,\n token,\n 'DELETE',\n `/api-sequences/${seq.id}`,\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Delete failed'}`);\n process.exit(1);\n }\n\n emit(argv, `Deleted api-sequence ${seq.id} (workflow ${workflowId}).`, result);\n}\n\nasync function handleSetApiOnly(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n const apiOnly = !hasFlag(argv, '--off');\n\n const result = await apiRequest<GenericResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${workflowId}/api-only`,\n { apiOnly },\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Update failed'}`);\n process.exit(1);\n }\n\n emit(argv, `Workflow ${workflowId} apiOnly=${apiOnly}.`, result);\n}\n\n/* ── Rendering ─────────────────────────────────────────────────────────── */\n\nfunction renderSequence(seq: ApiSequenceRecord): string {\n const lines: string[] = [];\n lines.push(`API Sequence ${seq.id}`);\n lines.push(` Workflow: ${seq.workflowId}`);\n lines.push(` Status: ${seq.status}`);\n if (seq.credentialId) lines.push(` Credential: ${seq.credentialId}`);\n if (seq.config.description) lines.push(` Description: ${seq.config.description}`);\n lines.push(` stopOnFailure: ${seq.config.stopOnFailure ?? false}`);\n lines.push('');\n\n const steps = seq.config.steps ?? [];\n if (steps.length === 0) {\n lines.push(' (no steps — use `api-sequence update` to add)');\n } else {\n lines.push(` Steps (${steps.length}):`);\n steps.forEach((step, i) => {\n const method = String(step.method ?? '??').toUpperCase().padEnd(6);\n const path = step.path ?? '(no path)';\n const id = step.id ? ` [${step.id}]` : '';\n lines.push(` ${String(i + 1).padStart(2)}. ${method} ${path}${id}`);\n if (step.endpointId) lines.push(` endpointId: ${step.endpointId}`);\n });\n }\n\n const exports = seq.config.exports ?? [];\n if (exports.length > 0) {\n lines.push('');\n lines.push(` Exports: ${JSON.stringify(exports)}`);\n }\n\n return lines.join('\\n');\n}\n","/**\n * CLI Seed Workflow Creation\n *\n * Creates a seed workflow shell with outputs and an optional paired teardown.\n * Supports flag-based and JSON-based input.\n *\n * @module workflow-seed-create\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { getArgValue, hasFlag, resolveAppUrl } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\n\n/* ── Types ────────────────────────────────────────────────────────────── */\n\ntype SeedOutput = {\n dataKey: string;\n name: string;\n displayLabel: string;\n description?: string;\n credentialOutput?: Record<string, unknown>;\n};\n\ntype SeedCreateInput = {\n name: string;\n description?: string;\n status?: 'draft' | 'approved';\n outputs?: SeedOutput[];\n};\n\ntype WorkflowResponse = {\n ok: boolean;\n error?: string;\n workflow?: { id: string; name: string; status: string; flowType: string };\n};\n\ntype WorkflowUpdateResponse = {\n ok: boolean;\n error?: string;\n workflow?: { id: string };\n};\n\n/* ── Helpers ──────────────────────────────────────────────────────────── */\n\nfunction getAllArgValues(argv: string[], flag: string): string[] {\n const values: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === flag && i + 1 < argv.length) {\n values.push(argv[i + 1]!);\n i++;\n }\n }\n return values;\n}\n\n/**\n * Parse an --output flag value: \"dataKey:Name[:description]\"\n */\nfunction parseOutputFlag(value: string): SeedOutput {\n const parts = value.split(':');\n if (parts.length < 2) {\n throw new Error(\n `Invalid --output format: \"${value}\". Expected \"dataKey:Name\" or \"dataKey:Name:Description\".`\n );\n }\n const [dataKey, name, ...descParts] = parts;\n const description = descParts.length > 0 ? descParts.join(':') : undefined;\n return {\n dataKey: dataKey!.trim(),\n name: name!.trim(),\n displayLabel: name!.trim(),\n description: description?.trim() || undefined,\n };\n}\n\nasync function readFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n const stdin = process.stdin;\n\n if (stdin.isTTY) {\n throw new Error('No input on stdin. Pipe JSON or use --from-file.');\n }\n\n return new Promise((resolve, reject) => {\n stdin.on('data', (chunk) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stdin.on('error', reject);\n });\n}\n\nasync function readJsonInput(argv: string[]): Promise<SeedCreateInput> {\n let raw: string;\n\n const fromFile = getArgValue(argv, '--from-file');\n if (fromFile) {\n try {\n raw = await fs.readFile(fromFile, 'utf-8');\n } catch (err) {\n throw new Error(`Failed to read file ${fromFile}: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n raw = await readFromStdin();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error('Invalid JSON input.');\n }\n\n const input = parsed as SeedCreateInput;\n if (!input.name || typeof input.name !== 'string') {\n throw new Error('JSON input must include a \"name\" string field.');\n }\n\n // Normalize outputs: default displayLabel to name if missing\n if (Array.isArray(input.outputs)) {\n for (const out of input.outputs) {\n if (!out.dataKey || !out.name) {\n throw new Error('Each output must have \"dataKey\" and \"name\" fields.');\n }\n if (!out.displayLabel) {\n out.displayLabel = out.name;\n }\n }\n }\n\n return input;\n}\n\nfunction resolveInput(argv: string[]): Promise<SeedCreateInput> | SeedCreateInput {\n const fromFile = getArgValue(argv, '--from-file');\n const fromStdin = hasFlag(argv, '--from-stdin');\n\n // JSON input mode\n if (fromFile || fromStdin) {\n return readJsonInput(argv);\n }\n\n // Flag-based input mode\n const name = getArgValue(argv, '--name');\n if (!name) {\n console.error('Error: --name is required (or use --from-stdin / --from-file for JSON input).');\n console.error('Usage: canary workflow seed create --name <name> [--output key:name[:desc]] ...');\n process.exit(1);\n }\n\n const description = getArgValue(argv, '--description');\n const status = getArgValue(argv, '--status') as 'draft' | 'approved' | undefined;\n\n // Parse --output flags\n const outputFlags = getAllArgValues(argv, '--output');\n const outputs: SeedOutput[] = outputFlags.map(parseOutputFlag);\n\n // Parse --outputs-json for complex outputs (credential configs etc.)\n const outputsJsonRaw = getArgValue(argv, '--outputs-json');\n if (outputsJsonRaw) {\n try {\n const parsed = JSON.parse(outputsJsonRaw) as SeedOutput[];\n if (!Array.isArray(parsed)) throw new Error('not an array');\n for (const out of parsed) {\n if (!out.dataKey || !out.name) {\n throw new Error('Each output must have \"dataKey\" and \"name\" fields.');\n }\n if (!out.displayLabel) out.displayLabel = out.name;\n }\n outputs.push(...parsed);\n } catch (err) {\n console.error(`Error: Invalid --outputs-json: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n }\n\n return { name, description: description || undefined, status, outputs };\n}\n\n/* ── Main Handler ────────────────────────────────────────────────────── */\n\nexport async function handleWorkflowSeedCreate(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n if (hasFlag(argv, '--help', '-h')) {\n printSeedCreateHelp();\n return;\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const noTeardown = hasFlag(argv, '--no-teardown');\n\n let input: SeedCreateInput;\n try {\n input = await resolveInput(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // 1. Create seed workflow\n const seedResult = await apiRequest<WorkflowResponse>(\n apiUrl,\n token,\n 'POST',\n '/workflows',\n {\n name: input.name,\n description: input.description,\n status: input.status ?? 'draft',\n flowType: 'seed',\n createdVia: 'cli',\n }\n );\n\n // Success = a workflow row came back. `POST /workflows` historically omitted\n // `ok` from its envelope, so gating on `ok` alone reported false failures even\n // though the seed was created; presence of `workflow` is the reliable signal.\n if (!seedResult.workflow) {\n if (jsonOutput) {\n console.log(JSON.stringify({ ok: false, error: seedResult.error ?? 'Failed to create seed workflow' }, null, 2));\n } else {\n console.error(`Error: ${seedResult.error ?? 'Failed to create seed workflow'}`);\n }\n process.exit(1);\n }\n\n const seedId = seedResult.workflow.id;\n const appUrl = resolveAppUrl(apiUrl);\n\n // 2. Set seed outputs if provided\n let outputsSaved = false;\n if (input.outputs && input.outputs.length > 0) {\n const outputsResult = await apiRequest<WorkflowUpdateResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${seedId}`,\n { seedOutputsJson: input.outputs }\n );\n\n if (outputsResult.ok || outputsResult.workflow) {\n outputsSaved = true;\n } else {\n console.warn(`Warning: Seed created but failed to save outputs: ${outputsResult.error ?? 'Unknown error'}`);\n }\n }\n\n // 3. Create paired teardown (unless --no-teardown)\n let teardownId: string | undefined;\n let teardownName: string | undefined;\n if (!noTeardown) {\n const tdName = `Teardown: ${input.name}`;\n const tdResult = await apiRequest<WorkflowResponse>(\n apiUrl,\n token,\n 'POST',\n '/workflows',\n {\n name: tdName,\n description: `Cleans up seed data from \"${input.name}\"`,\n status: 'draft',\n flowType: 'teardown',\n createdVia: 'cli',\n }\n );\n\n if (tdResult.workflow) {\n teardownId = tdResult.workflow.id;\n teardownName = tdName;\n\n // 4. Link teardown to seed\n const linkResult = await apiRequest<WorkflowUpdateResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${seedId}`,\n { teardownWorkflowId: teardownId }\n );\n\n if (!linkResult.ok && !linkResult.workflow) {\n console.warn(`Warning: Teardown created but failed to link to seed: ${linkResult.error ?? 'Unknown error'}`);\n }\n } else {\n console.warn(`Warning: Failed to create paired teardown: ${tdResult.error ?? 'Unknown error'}`);\n }\n }\n\n // 5. Output results\n if (jsonOutput) {\n const result: Record<string, unknown> = {\n ok: true,\n seed: {\n id: seedId,\n name: input.name,\n status: input.status ?? 'draft',\n flowType: 'seed',\n outputs: outputsSaved ? input.outputs : [],\n url: `${appUrl}/flows/${seedId}`,\n },\n };\n if (teardownId) {\n result.teardown = {\n id: teardownId,\n name: teardownName,\n status: 'draft',\n flowType: 'teardown',\n url: `${appUrl}/flows/${teardownId}`,\n };\n }\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`\\n\\u2713 Seed workflow created: ${input.name}`);\n console.log(` ID: ${seedId}`);\n console.log(` Status: ${input.status ?? 'draft'}`);\n if (input.outputs && input.outputs.length > 0) {\n const keys = input.outputs.map((o) => o.dataKey).join(', ');\n console.log(` Outputs: ${keys}${!outputsSaved ? ' (save failed)' : ''}`);\n }\n console.log(` URL: ${appUrl}/flows/${seedId}`);\n\n if (teardownId) {\n console.log(`\\n\\u2713 Teardown workflow created: ${teardownName}`);\n console.log(` ID: ${teardownId}`);\n console.log(` URL: ${appUrl}/flows/${teardownId}`);\n }\n}\n\nfunction printSeedCreateHelp(): void {\n console.log(\n [\n 'Usage: canary workflow seed create [options]',\n '',\n 'Create a seed workflow with declared outputs and an optional paired teardown.',\n '',\n 'Flag-based input:',\n ' --name <name> Seed workflow name (required)',\n ' --description <desc> Description',\n ' --output <key:name[:desc]> Declare an output (repeatable)',\n ' --outputs-json <json> Full outputs array as inline JSON (for credential configs)',\n ' --no-teardown Skip creating paired teardown workflow',\n ' --status <status> Initial status (default: draft)',\n ' --json Output raw JSON',\n '',\n 'JSON input:',\n ' --from-stdin Read full config from stdin',\n ' --from-file <path> Read full config from file',\n '',\n 'Examples:',\n ' canary workflow seed create --name \"Create Project\" --output \"project_id:Project ID\"',\n '',\n ' canary workflow seed create --from-stdin <<\\'EOF\\'',\n ' {',\n ' \"name\": \"Create Test User\",',\n ' \"outputs\": [{',\n ' \"dataKey\": \"user_cred\",',\n ' \"name\": \"Test User Credential\",',\n ' \"credentialOutput\": {',\n ' \"fieldMapping\": { \"username\": \"$generate.email\", \"password\": \"Test123!\" },',\n ' \"emailPrefix\": \"testuser\",',\n ' \"createInboxRecipient\": true',\n ' }',\n ' }]',\n ' }',\n ' EOF',\n ].join('\\n')\n );\n}\n"],"mappings":"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","names":["fs","process","process","process","fs","process","process","fs","process","readFromStdin","process","process","process","fs","process","edges","fs","process","readFromStdin","raw","result","process","process","fs","process","process","fs","fs","process","readFromStdin","process","readJsonInput","fs","process","fs","getAllArgValues"]}
@@ -2,13 +2,13 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  apiRequest,
4
4
  promptInput
5
- } from "./chunk-LSL2M7O6.js";
5
+ } from "./chunk-WTMSRIDK.js";
6
6
  import "./chunk-H3LWYSKY.js";
7
7
  import {
8
8
  hasFlag
9
9
  } from "./chunk-YBYOOXMK.js";
10
10
  import "./chunk-S3Q7MDCS.js";
11
- import "./chunk-4ZNTGBJR.js";
11
+ import "./chunk-EHKHZ5UR.js";
12
12
  import "./chunk-ZSOAFMES.js";
13
13
  import "./chunk-ICKB3EOT.js";
14
14
 
@@ -270,7 +270,7 @@ async function handleSubstrate(argv) {
270
270
  process.exit(1);
271
271
  }
272
272
  const actionIndex = Number(actionIndexRaw);
273
- const { SubstrateMaterializer } = await import("./src-BH5O6Z3E.js");
273
+ const { SubstrateMaterializer } = await import("./src-YZGG5ZSL.js");
274
274
  const path = await import("path");
275
275
  const materializer = new SubstrateMaterializer({
276
276
  traceZipPath: path.join(workspace, "browser", "trace.zip"),
@@ -306,8 +306,8 @@ async function handleLocator(argv) {
306
306
  }
307
307
  }
308
308
  const actionIndex = Number(actionIndexRaw);
309
- const { HeadlessDomSession, SubstrateMaterializer, LocatorVerifier, buildLocator } = await import("./src-BH5O6Z3E.js");
310
- const { parseSnapshot } = await import("./dist-5PKCAL5N.js");
309
+ const { HeadlessDomSession, SubstrateMaterializer, LocatorVerifier, buildLocator } = await import("./src-YZGG5ZSL.js");
310
+ const { parseSnapshot } = await import("./dist-YPK2RMUK.js");
311
311
  const path = await import("path");
312
312
  const session = new HeadlessDomSession();
313
313
  const materializer = new SubstrateMaterializer({
@@ -396,4 +396,4 @@ export {
396
396
  buildCacheClearBody,
397
397
  handleWorkflowCache
398
398
  };
399
- //# sourceMappingURL=workflow-cache-XWTLXIHE.js.map
399
+ //# sourceMappingURL=workflow-cache-LRH5CAPS.js.map
@@ -1,18 +1,18 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  runTrace
4
- } from "./chunk-4SV3CGNM.js";
4
+ } from "./chunk-SFRUUIIC.js";
5
5
  import {
6
6
  apiRequest
7
- } from "./chunk-LSL2M7O6.js";
7
+ } from "./chunk-WTMSRIDK.js";
8
8
  import "./chunk-H3LWYSKY.js";
9
9
  import {
10
10
  getArgValue,
11
11
  hasFlag
12
12
  } from "./chunk-YBYOOXMK.js";
13
- import "./chunk-IFZ72FZV.js";
13
+ import "./chunk-3X3TSH2B.js";
14
14
  import "./chunk-S3Q7MDCS.js";
15
- import "./chunk-4ZNTGBJR.js";
15
+ import "./chunk-EHKHZ5UR.js";
16
16
  import "./chunk-2EHYDUHX.js";
17
17
  import "./chunk-ZSOAFMES.js";
18
18
  import "./chunk-ICKB3EOT.js";
@@ -949,4 +949,4 @@ async function handleMaterialize(argv, apiUrl, token) {
949
949
  export {
950
950
  handleWorkflowDebug
951
951
  };
952
- //# sourceMappingURL=workflow-debug-XHR4552F.js.map
952
+ //# sourceMappingURL=workflow-debug-IWXZXSL2.js.map
@@ -6,14 +6,14 @@ import {
6
6
  } from "./chunk-HI2UUGRK.js";
7
7
  import {
8
8
  apiRequest
9
- } from "./chunk-LSL2M7O6.js";
9
+ } from "./chunk-WTMSRIDK.js";
10
10
  import "./chunk-H3LWYSKY.js";
11
11
  import {
12
12
  getArgValue,
13
13
  hasFlag
14
14
  } from "./chunk-YBYOOXMK.js";
15
15
  import "./chunk-S3Q7MDCS.js";
16
- import "./chunk-4ZNTGBJR.js";
16
+ import "./chunk-EHKHZ5UR.js";
17
17
  import "./chunk-ZSOAFMES.js";
18
18
  import "./chunk-ICKB3EOT.js";
19
19
 
@@ -378,4 +378,4 @@ export {
378
378
  _internalsForTesting,
379
379
  handleWorkflowProposals
380
380
  };
381
- //# sourceMappingURL=workflow-proposals-VWLKW352.js.map
381
+ //# sourceMappingURL=workflow-proposals-76D2MM6G.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runcofactor/cli",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",