@runcofactor/cli 0.15.2 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{account-62I7FG5G.js → account-ZMV7NEFM.js} +4 -4
- package/dist/account-ZMV7NEFM.js.map +1 -0
- package/dist/{api-catalog-CAJUASVC.js → api-catalog-6HNOGVPA.js} +3 -3
- package/dist/{attachment-RL4AZUJE.js → attachment-QAHR54HQ.js} +3 -3
- package/dist/{augmentor-GAF3MFY6.js → augmentor-7T3L6ZR4.js} +3 -3
- package/dist/{chunk-26U3DGUM.js → chunk-7YJTQCPX.js} +3 -5
- package/dist/chunk-7YJTQCPX.js.map +1 -0
- package/dist/{chunk-PXFDH6YL.js → chunk-A4ISG3VX.js} +55 -15
- package/dist/{chunk-PXFDH6YL.js.map → chunk-A4ISG3VX.js.map} +1 -1
- package/dist/{chunk-5R4HMSNX.js → chunk-AI3Y3AZH.js} +24834 -24813
- package/dist/chunk-AI3Y3AZH.js.map +1 -0
- package/dist/{chunk-HKQ5XQAQ.js → chunk-CEXV3MOC.js} +3 -3
- package/dist/{chunk-VKBTI5EF.js → chunk-D6AVOPOS.js} +2 -2
- package/dist/{chunk-ZXRVFFCY.js → chunk-DT2CEH2V.js} +2 -2
- package/dist/{chunk-IWKJQZJQ.js → chunk-GZVCNYR4.js} +55 -55
- package/dist/chunk-GZVCNYR4.js.map +1 -0
- package/dist/{chunk-CJEKEW7R.js → chunk-LFFWD5JZ.js} +2 -2
- package/dist/{chunk-UZ2ZA5A6.js → chunk-RGDIVW3O.js} +2 -2
- package/dist/{chunk-CFJXYPTF.js → chunk-UAJUZLDE.js} +11 -3
- package/dist/chunk-UAJUZLDE.js.map +1 -0
- package/dist/{credential-JGVSEGVH.js → credential-X6QKX473.js} +3 -3
- package/dist/{credential-template-CWWMOKB2.js → credential-template-GD3D4MBI.js} +3 -3
- package/dist/{debug-workflow-BXRU72YZ.js → debug-workflow-AAEOAME2.js} +6 -6
- package/dist/{src-CV57ZD6I.js → dist-QLTVBUMD.js} +7 -9
- package/dist/{docs-PVBXPTGR.js → docs-BVUEXBY3.js} +3 -3
- package/dist/{environment-WZKIO3R3.js → environment-WE7VVE6I.js} +3 -3
- package/dist/{feature-flag-K5REGGDY.js → feature-flag-VJO2TJFT.js} +9 -8
- package/dist/feature-flag-VJO2TJFT.js.map +1 -0
- package/dist/index.js +129 -44
- package/dist/index.js.map +1 -1
- package/dist/{init-FFUZO5D7.js → init-RQHHKJJD.js} +8 -8
- package/dist/{install-XRKEQAFZ.js → install-CQLHNZ6U.js} +3 -3
- package/dist/{issues-I3V6GEXU.js → issues-HK2JA5JS.js} +3 -3
- package/dist/{knobs-6WLJMB44.js → knobs-ETJAV6YM.js} +3 -3
- package/dist/{list-PHC7VYNS.js → list-F6DGGW3Z.js} +3 -3
- package/dist/{local-VGYRSW22.js → local-CMAY54I5.js} +5 -5
- package/dist/{login-QPU2BKG2.js → login-6CKG664C.js} +8 -8
- package/dist/{mcp-LA452TOA.js → mcp-GC2WOOZO.js} +5 -6
- package/dist/{mcp-LA452TOA.js.map → mcp-GC2WOOZO.js.map} +1 -1
- package/dist/metrics-IXICURAA.js +367 -0
- package/dist/metrics-IXICURAA.js.map +1 -0
- package/dist/{product-RSZV5HMB.js → product-BUJWPYKB.js} +4 -3
- package/dist/product-BUJWPYKB.js.map +1 -0
- package/dist/{property-YP4GHQAR.js → property-4EXPWRNT.js} +3 -3
- package/dist/{record-KWKHP2ZY.js → record-HL4QA7OX.js} +4 -4
- package/dist/{record-KWKHP2ZY.js.map → record-HL4QA7OX.js.map} +1 -1
- package/dist/{release-NDRHPW6V.js → release-2SMK5Y3V.js} +3 -3
- package/dist/{sandbox-OOCANWOG.js → sandbox-ORAPKOH3.js} +3 -3
- package/dist/{scenarios-2HRLCGFY.js → scenarios-DM5FDCAF.js} +3 -3
- package/dist/{session-M4ULYDYP.js → session-X6IYGWYG.js} +14 -16
- package/dist/{session-M4ULYDYP.js.map → session-X6IYGWYG.js.map} +1 -1
- package/dist/{skill-4DGPRDUC.js → skill-ZU5V2EE5.js} +24 -14
- package/dist/skill-ZU5V2EE5.js.map +1 -0
- package/dist/{spec-XZ2TKUFZ.js → spec-KO5QD6AY.js} +3 -3
- package/dist/{src-HL7HEJIW.js → src-DSD34JIX.js} +2 -2
- package/dist/{src-7LAXXTVG.js → src-HTGNKBUF.js} +5 -7
- package/dist/{src-7LAXXTVG.js.map → src-HTGNKBUF.js.map} +1 -1
- package/dist/{src-OU7544PM.js → src-PDYXACRP.js} +2 -2
- package/dist/{start-IYKF3C3X.js → start-2ECN4LX5.js} +6 -6
- package/dist/{tag-T45MMSCH.js → tag-R5I72HJ6.js} +4 -4
- package/dist/{task-MCUHAVTD.js → task-V3JMSJIM.js} +3 -3
- package/dist/{test-suite-BICBRSBP.js → test-suite-NOYVK6YX.js} +5 -5
- package/dist/{trace-2BAPMYAS.js → trace-NOYEKNO4.js} +4 -5
- package/dist/{triage-M3RZ2ASB.js → triage-4RFATHBE.js} +4 -4
- package/dist/utilities-3WMXE743.js +441 -0
- package/dist/utilities-3WMXE743.js.map +1 -0
- package/dist/{workflow-ZGJU4QCV.js → workflow-DC7WOTTW.js} +13 -17
- package/dist/workflow-DC7WOTTW.js.map +1 -0
- package/dist/{workflow-cache-M4N325UT.js → workflow-cache-SDSI6SMF.js} +6 -6
- package/dist/{workflow-cache-M4N325UT.js.map → workflow-cache-SDSI6SMF.js.map} +1 -1
- package/dist/{workflow-debug-W4USZH35.js → workflow-debug-6UQYP67Q.js} +6 -7
- package/dist/{workflow-debug-W4USZH35.js.map → workflow-debug-6UQYP67Q.js.map} +1 -1
- package/dist/{workflow-proposals-5E3DTYZB.js → workflow-proposals-67AVGMHX.js} +6 -6
- package/package.json +1 -1
- package/dist/account-62I7FG5G.js.map +0 -1
- package/dist/chunk-26U3DGUM.js.map +0 -1
- package/dist/chunk-5R4HMSNX.js.map +0 -1
- package/dist/chunk-CFJXYPTF.js.map +0 -1
- package/dist/chunk-IWKJQZJQ.js.map +0 -1
- package/dist/chunk-KRWRUU6R.js +0 -114
- package/dist/chunk-KRWRUU6R.js.map +0 -1
- package/dist/feature-flag-K5REGGDY.js.map +0 -1
- package/dist/pdf-extract-YHE54XU4.js +0 -13
- package/dist/product-RSZV5HMB.js.map +0 -1
- package/dist/skill-4DGPRDUC.js.map +0 -1
- package/dist/triage-M3RZ2ASB.js.map +0 -1
- package/dist/workflow-ZGJU4QCV.js.map +0 -1
- /package/dist/{api-catalog-CAJUASVC.js.map → api-catalog-6HNOGVPA.js.map} +0 -0
- /package/dist/{attachment-RL4AZUJE.js.map → attachment-QAHR54HQ.js.map} +0 -0
- /package/dist/{augmentor-GAF3MFY6.js.map → augmentor-7T3L6ZR4.js.map} +0 -0
- /package/dist/{chunk-HKQ5XQAQ.js.map → chunk-CEXV3MOC.js.map} +0 -0
- /package/dist/{chunk-VKBTI5EF.js.map → chunk-D6AVOPOS.js.map} +0 -0
- /package/dist/{chunk-ZXRVFFCY.js.map → chunk-DT2CEH2V.js.map} +0 -0
- /package/dist/{chunk-CJEKEW7R.js.map → chunk-LFFWD5JZ.js.map} +0 -0
- /package/dist/{chunk-UZ2ZA5A6.js.map → chunk-RGDIVW3O.js.map} +0 -0
- /package/dist/{credential-JGVSEGVH.js.map → credential-X6QKX473.js.map} +0 -0
- /package/dist/{credential-template-CWWMOKB2.js.map → credential-template-GD3D4MBI.js.map} +0 -0
- /package/dist/{debug-workflow-BXRU72YZ.js.map → debug-workflow-AAEOAME2.js.map} +0 -0
- /package/dist/{pdf-extract-YHE54XU4.js.map → dist-QLTVBUMD.js.map} +0 -0
- /package/dist/{docs-PVBXPTGR.js.map → docs-BVUEXBY3.js.map} +0 -0
- /package/dist/{environment-WZKIO3R3.js.map → environment-WE7VVE6I.js.map} +0 -0
- /package/dist/{init-FFUZO5D7.js.map → init-RQHHKJJD.js.map} +0 -0
- /package/dist/{install-XRKEQAFZ.js.map → install-CQLHNZ6U.js.map} +0 -0
- /package/dist/{issues-I3V6GEXU.js.map → issues-HK2JA5JS.js.map} +0 -0
- /package/dist/{knobs-6WLJMB44.js.map → knobs-ETJAV6YM.js.map} +0 -0
- /package/dist/{list-PHC7VYNS.js.map → list-F6DGGW3Z.js.map} +0 -0
- /package/dist/{local-VGYRSW22.js.map → local-CMAY54I5.js.map} +0 -0
- /package/dist/{login-QPU2BKG2.js.map → login-6CKG664C.js.map} +0 -0
- /package/dist/{property-YP4GHQAR.js.map → property-4EXPWRNT.js.map} +0 -0
- /package/dist/{release-NDRHPW6V.js.map → release-2SMK5Y3V.js.map} +0 -0
- /package/dist/{sandbox-OOCANWOG.js.map → sandbox-ORAPKOH3.js.map} +0 -0
- /package/dist/{scenarios-2HRLCGFY.js.map → scenarios-DM5FDCAF.js.map} +0 -0
- /package/dist/{spec-XZ2TKUFZ.js.map → spec-KO5QD6AY.js.map} +0 -0
- /package/dist/{src-HL7HEJIW.js.map → src-DSD34JIX.js.map} +0 -0
- /package/dist/{src-CV57ZD6I.js.map → src-PDYXACRP.js.map} +0 -0
- /package/dist/{start-IYKF3C3X.js.map → start-2ECN4LX5.js.map} +0 -0
- /package/dist/{src-OU7544PM.js.map → tag-R5I72HJ6.js.map} +0 -0
- /package/dist/{task-MCUHAVTD.js.map → task-V3JMSJIM.js.map} +0 -0
- /package/dist/{test-suite-BICBRSBP.js.map → test-suite-NOYVK6YX.js.map} +0 -0
- /package/dist/{tag-T45MMSCH.js.map → trace-NOYEKNO4.js.map} +0 -0
- /package/dist/{trace-2BAPMYAS.js.map → triage-4RFATHBE.js.map} +0 -0
- /package/dist/{workflow-proposals-5E3DTYZB.js.map → workflow-proposals-67AVGMHX.js.map} +0 -0
|
@@ -2,14 +2,14 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
|
|
|
2
2
|
import {
|
|
3
3
|
apiRequest,
|
|
4
4
|
promptInput
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-UAJUZLDE.js";
|
|
6
6
|
import "./chunk-3CZU7XCS.js";
|
|
7
7
|
import {
|
|
8
8
|
hasFlag
|
|
9
9
|
} from "./chunk-IGHDIWZU.js";
|
|
10
10
|
import "./chunk-32P26BZT.js";
|
|
11
11
|
import "./chunk-JWHYXEA2.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-GZVCNYR4.js";
|
|
13
13
|
import "./chunk-VKVL7WBN.js";
|
|
14
14
|
|
|
15
15
|
// src/workflow-cache.ts
|
|
@@ -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-
|
|
273
|
+
const { SubstrateMaterializer } = await import("./src-HTGNKBUF.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-
|
|
310
|
-
const { parseSnapshot } = await import("./
|
|
309
|
+
const { HeadlessDomSession, SubstrateMaterializer, LocatorVerifier, buildLocator } = await import("./src-HTGNKBUF.js");
|
|
310
|
+
const { parseSnapshot } = await import("./dist-QLTVBUMD.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-
|
|
399
|
+
//# sourceMappingURL=workflow-cache-SDSI6SMF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/workflow-cache.ts"],"sourcesContent":["/**\n * CLI handlers for `canary workflow cache {status,clear,optimize,substrate,locator,commit}`.\n *\n * @module WorkflowCacheCLI\n */\n\nimport process from 'node:process';\nimport { hasFlag } from './auth.js';\nimport { apiRequest, promptInput } from './cli-helpers.js';\n\ntype CacheStatusResponse = {\n ok: boolean;\n error?: string;\n workflowId?: string;\n nodes?: Array<{\n nodeId: string;\n cacheId: string;\n compilerVersion: number | null;\n playbookHealth: string | null;\n stepFailureCounts: Record<string, number> | null;\n cachedAt: string | null;\n lastUsedAt: string | null;\n useCount: number;\n gapCount: number;\n }>;\n};\n\ntype CacheClearResponse = {\n ok: boolean;\n error?: string;\n invalidated?: number;\n mode?: string;\n};\n\ntype WorkflowResetResponse = {\n ok: boolean;\n error?: string;\n nodesReset?: number;\n};\n\ntype OptimizeResponse = {\n ok: boolean;\n error?: string;\n jobId?: string;\n runId?: string;\n};\n\ntype CacheRecipeResponse = {\n ok: boolean;\n error?: string;\n /** Server-side failure message with the full guard/validation context. */\n detail?: string;\n /** Actionable validation issues from the recipe builder. */\n issues?: string[];\n cacheId?: string;\n nodeHash?: string;\n cachedStepCount?: number;\n gapStepCount?: number;\n dryRun?: boolean;\n};\n\nfunction flagValue(argv: string[], name: string): string | undefined {\n const i = argv.indexOf(name);\n if (i === -1 || i === argv.length - 1) return undefined;\n return argv[i + 1];\n}\n\n/**\n * Pure helper: build the `cache-clear` request body from parsed argv flags.\n * Returns a discriminated result so callers can surface parse errors without\n * the helper itself writing to stderr or calling `process.exit`.\n *\n * Exported for unit testing.\n */\nexport function buildCacheClearBody(opts: {\n nodeId?: string;\n belowVersionRaw?: string;\n staleOnly?: boolean;\n mode?: string;\n}):\n | { ok: true; body: Record<string, unknown> }\n | { ok: false; error: string } {\n const body: Record<string, unknown> = {};\n if (opts.nodeId) body.nodeId = opts.nodeId;\n if (opts.belowVersionRaw !== undefined) {\n const n = Number(opts.belowVersionRaw);\n if (!Number.isInteger(n) || n <= 0) {\n return {\n ok: false,\n error: `--below-version must be a positive integer, got \"${opts.belowVersionRaw}\"`,\n };\n }\n body.belowVersion = n;\n }\n if (opts.staleOnly) body.staleOnly = true;\n if (opts.mode) {\n if (opts.mode !== 'all' && opts.mode !== 'hard') {\n return {\n ok: false,\n error: `--mode must be \"all\" or \"hard\", got \"${opts.mode}\"`,\n };\n }\n body.mode = opts.mode;\n }\n\n const modeCount =\n (body.nodeId !== undefined ? 1 : 0) +\n (body.belowVersion !== undefined ? 1 : 0) +\n (body.staleOnly !== undefined ? 1 : 0) +\n (body.mode !== undefined ? 1 : 0);\n if (modeCount === 0) {\n return {\n ok: false,\n error:\n 'cache clear requires one of: --node <id>, --below-version <n>, --stale-only, --mode all, or --mode hard',\n };\n }\n if (modeCount > 1) {\n return {\n ok: false,\n error: 'cache clear accepts exactly one of --node / --below-version / --stale-only / --mode',\n };\n }\n return { ok: true, body };\n}\n\nfunction printUsage(): void {\n console.error(\n [\n 'Usage:',\n ' canary workflow cache status <workflowId> [--json]',\n ' canary workflow cache clear <workflowId> <mode> [--json]',\n ' canary workflow cache optimize <workflowId> [--run <runId>] [--json]',\n ' canary workflow cache substrate --workspace <dir> --action <idx> [--phase before|after]',\n ' canary workflow cache locator --workspace <dir> --action <idx> --ref <ref> [--var k=v ...]',\n ' canary workflow cache commit <workflowId> --node <nodeId> --recipe <file.json> [--json]',\n '',\n 'Cache clear modes (pick exactly one):',\n ' --node <nodeId> Invalidate one node\\'s cache row',\n ' --below-version <n> Invalidate caches with compilerVersion < n',\n ' --stale-only Invalidate caches whose playbookHealth = \"stale\"',\n ' --mode all Invalidate every cache row (rows kept, isValid=false)',\n ' --mode hard DESTRUCTIVE: delete cache rows, strip playbookSteps',\n ' from node configs, and null lastRunId. Equivalent to',\n ' the UI \"Reset flow\" button. Requires --yes.',\n '',\n 'Options:',\n ' --yes Skip the interactive confirmation for --mode hard',\n ' --json Output raw JSON',\n ].join('\\n')\n );\n}\n\nexport async function handleWorkflowCache(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [sub, ...rest] = argv;\n if (!sub || hasFlag(argv, '--help', '-h')) {\n printUsage();\n return;\n }\n\n switch (sub) {\n case 'status':\n await handleStatus(rest, apiUrl, token);\n return;\n case 'clear':\n await handleClear(rest, apiUrl, token);\n return;\n case 'optimize':\n await handleOptimize(rest, apiUrl, token);\n return;\n case 'substrate':\n await handleSubstrate(rest);\n return;\n case 'locator':\n await handleLocator(rest);\n return;\n case 'commit':\n await handleCommit(rest, apiUrl, token);\n return;\n default:\n console.error(`Unknown cache sub-command: ${sub}`);\n printUsage();\n process.exit(1);\n }\n}\n\nasync function handleStatus(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Missing workflowId.');\n printUsage();\n process.exit(1);\n }\n const json = hasFlag(argv, '--json');\n\n const result = await apiRequest<CacheStatusResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/cache-status`\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const nodes = result.nodes ?? [];\n console.log(`Cache status for workflow ${workflowId} (${nodes.length} valid cache rows)\\n`);\n if (nodes.length === 0) {\n console.log(' No valid caches.');\n return;\n }\n\n for (const n of nodes) {\n const health = n.playbookHealth ?? '—';\n const ver = n.compilerVersion ?? 'pre-v2';\n const gaps = n.gapCount;\n const age = n.cachedAt ? new Date(n.cachedAt).toISOString().slice(0, 10) : '—';\n console.log(\n ` node=${n.nodeId.slice(0, 8)} compilerVersion=${ver} health=${health} gaps=${gaps} cachedAt=${age} uses=${n.useCount}`\n );\n }\n}\n\nasync function handleClear(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Missing workflowId.');\n printUsage();\n process.exit(1);\n }\n const json = hasFlag(argv, '--json');\n\n const built = buildCacheClearBody({\n nodeId: flagValue(argv, '--node'),\n belowVersionRaw: flagValue(argv, '--below-version'),\n staleOnly: hasFlag(argv, '--stale-only'),\n mode: flagValue(argv, '--mode'),\n });\n if (!built.ok) {\n console.error(built.error);\n process.exit(1);\n }\n const body = built.body;\n\n if (body.mode === 'hard') {\n await handleHardReset(workflowId, hasFlag(argv, '--yes'), json, apiUrl, token);\n return;\n }\n\n const result = await apiRequest<CacheClearResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/cache-clear`,\n body\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Cleared (${result.mode}): ${result.invalidated ?? 0} cache row(s)`);\n}\n\nasync function handleHardReset(\n workflowId: string,\n yesFlag: boolean,\n json: boolean,\n apiUrl: string,\n token: string\n): Promise<void> {\n if (!yesFlag) {\n console.log(\n [\n '',\n `Hard reset on workflow ${workflowId} will:`,\n ' - DELETE all cached browser actions for this workflow',\n ' - REMOVE playbookSteps from every node config',\n ' - CLEAR the workflow lastRunId',\n '',\n 'This is equivalent to the UI \"Reset flow\" button and cannot be undone.',\n '',\n ].join('\\n')\n );\n const answer = await promptInput('Type \"yes\" to confirm');\n if (answer.toLowerCase() !== 'yes') {\n console.error('Aborted.');\n process.exit(1);\n }\n }\n\n const result = await apiRequest<WorkflowResetResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/reset`\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(\n `Reset workflow: ${result.nodesReset ?? 0} node(s) cleared (cache rows deleted, playbook steps removed, lastRunId cleared)`\n );\n}\n\nasync function handleOptimize(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Missing workflowId.');\n printUsage();\n process.exit(1);\n }\n const json = hasFlag(argv, '--json');\n const runId = flagValue(argv, '--run');\n\n const result = await apiRequest<OptimizeResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/optimize-cache`,\n runId ? { runId } : {}\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Cache optimizer job enqueued: ${result.jobId} (harvesting run ${result.runId})`);\n}\n\n/**\n * Reconstruct one trace action's page state and capture its substrate-v2,\n * entirely locally against a materialized run workspace\n * (`canary workflow debug materialize <runId> --out <dir>`).\n */\nasync function handleSubstrate(argv: string[]): Promise<void> {\n const workspace = flagValue(argv, '--workspace');\n const actionIndexRaw = flagValue(argv, '--action');\n const phase = (flagValue(argv, '--phase') ?? 'before') as 'before' | 'after';\n if (!workspace || actionIndexRaw === undefined) {\n console.error('Usage: canary workflow cache substrate --workspace <dir> --action <idx> [--phase before|after] (idx = position in browser/actions.jsonl / segments.json)');\n process.exit(1);\n }\n const actionIndex = Number(actionIndexRaw);\n const { SubstrateMaterializer } = await import('@chatsdet/workflow-cache');\n const path = await import('node:path');\n const materializer = new SubstrateMaterializer({\n traceZipPath: path.join(workspace, 'browser', 'trace.zip'),\n outDir: path.join(workspace, 'optimizer', 'substrates'),\n });\n try {\n const result = await materializer.materialize(actionIndex, phase);\n console.log(\n JSON.stringify(\n { substratePath: result.substratePath, domPath: result.domPath },\n null,\n 2\n )\n );\n } finally {\n await materializer.close();\n }\n}\n\n/**\n * Derive a deterministic locator for an element (by aria-ref) and verify it\n * offline against the trace-reconstructed DOM. Locally, no API.\n */\nasync function handleLocator(argv: string[]): Promise<void> {\n const workspace = flagValue(argv, '--workspace');\n const actionIndexRaw = flagValue(argv, '--action');\n const ref = flagValue(argv, '--ref');\n const phase = (flagValue(argv, '--phase') ?? 'before') as 'before' | 'after';\n if (!workspace || actionIndexRaw === undefined || !ref) {\n console.error('Usage: canary workflow cache locator --workspace <dir> --action <idx> --ref <ref> [--var name=value ...] (idx = position in browser/actions.jsonl / segments.json)');\n process.exit(1);\n }\n const variableValues: Record<string, string> = {};\n for (let i = 0; i < argv.length - 1; i++) {\n if (argv[i] === '--var') {\n const [name, ...valueParts] = (argv[i + 1] ?? '').split('=');\n if (name && valueParts.length > 0) variableValues[name] = valueParts.join('=');\n }\n }\n const actionIndex = Number(actionIndexRaw);\n const { HeadlessDomSession, SubstrateMaterializer, LocatorVerifier, buildLocator } = await import(\n '@chatsdet/workflow-cache'\n );\n const { parseSnapshot } = await import('@chatsdet/browser-core');\n const path = await import('node:path');\n // One Chromium for capture + verification — they must share a rendering\n // environment or the aria-ref table shifts between the two.\n const session = new HeadlessDomSession();\n const materializer = new SubstrateMaterializer({\n traceZipPath: path.join(workspace, 'browser', 'trace.zip'),\n outDir: path.join(workspace, 'optimizer', 'substrates'),\n session,\n });\n const verifier = new LocatorVerifier({ session });\n try {\n const substrate = await materializer.materialize(actionIndex, phase);\n const snapshot = parseSnapshot(substrate.substrateYaml);\n const built = buildLocator(snapshot, ref, variableValues);\n if (built.irreducible) {\n console.log(\n JSON.stringify(\n { verified: false, irreducible: true, reason: 'no unique predicate — mark as gap' },\n null,\n 2\n )\n );\n process.exit(2);\n }\n const verification = await verifier.verify({\n domPath: substrate.domPath,\n targetRef: ref,\n strategy: built.selectors,\n variableValues,\n });\n console.log(\n JSON.stringify(\n { verified: verification.verdict, predicate: built.predicate, selectors: built.selectors, verification },\n null,\n 2\n )\n );\n if (!verification.verdict) process.exit(2);\n } finally {\n await session.close();\n }\n}\n\n/** Commit an optimizer-authored recipe through the server-validated endpoint. */\nasync function handleCommit(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n const nodeId = flagValue(argv, '--node');\n const recipePath = flagValue(argv, '--recipe');\n const json = hasFlag(argv, '--json');\n const dryRun = hasFlag(argv, '--dry-run');\n if (!workflowId || !nodeId || !recipePath) {\n console.error(\n 'Usage: canary workflow cache commit <workflowId> --node <nodeId> --recipe <file.json> [--dry-run]'\n );\n process.exit(1);\n }\n const fs = await import('node:fs/promises');\n const recipe = JSON.parse(await fs.readFile(recipePath, 'utf-8')) as Record<string, unknown>;\n const result = await apiRequest<CacheRecipeResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/nodes/${nodeId}/cache-recipe`,\n dryRun ? { ...recipe, dryRun: true } : recipe\n );\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n if (result.detail && result.detail !== result.error) console.error(` ${result.detail}`);\n for (const issue of result.issues ?? []) console.error(` - ${issue}`);\n }\n process.exit(1);\n }\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n if (result.dryRun) {\n console.log(\n `Dry run OK: recipe validates and passes the commit guards ` +\n `(${result.cachedStepCount} cached, ${result.gapStepCount} gap steps; would mint under hash ${result.nodeHash})`\n );\n return;\n }\n console.log(\n `Recipe committed: cache ${result.cacheId} under hash ${result.nodeHash} ` +\n `(${result.cachedStepCount} cached, ${result.gapStepCount} gap steps)`\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/workflow-cache.ts"],"sourcesContent":["/**\n * CLI handlers for `canary workflow cache {status,clear,optimize,substrate,locator,commit}`.\n *\n * @module WorkflowCacheCLI\n */\n\nimport process from 'node:process';\nimport { hasFlag } from './auth.js';\nimport { apiRequest, promptInput } from './cli-helpers.js';\n\ntype CacheStatusResponse = {\n ok: boolean;\n error?: string;\n workflowId?: string;\n nodes?: Array<{\n nodeId: string;\n cacheId: string;\n compilerVersion: number | null;\n playbookHealth: string | null;\n stepFailureCounts: Record<string, number> | null;\n cachedAt: string | null;\n lastUsedAt: string | null;\n useCount: number;\n gapCount: number;\n }>;\n};\n\ntype CacheClearResponse = {\n ok: boolean;\n error?: string;\n invalidated?: number;\n mode?: string;\n};\n\ntype WorkflowResetResponse = {\n ok: boolean;\n error?: string;\n nodesReset?: number;\n};\n\ntype OptimizeResponse = {\n ok: boolean;\n error?: string;\n jobId?: string;\n runId?: string;\n};\n\ntype CacheRecipeResponse = {\n ok: boolean;\n error?: string;\n /** Server-side failure message with the full guard/validation context. */\n detail?: string;\n /** Actionable validation issues from the recipe builder. */\n issues?: string[];\n cacheId?: string;\n nodeHash?: string;\n cachedStepCount?: number;\n gapStepCount?: number;\n dryRun?: boolean;\n};\n\nfunction flagValue(argv: string[], name: string): string | undefined {\n const i = argv.indexOf(name);\n if (i === -1 || i === argv.length - 1) return undefined;\n return argv[i + 1];\n}\n\n/**\n * Pure helper: build the `cache-clear` request body from parsed argv flags.\n * Returns a discriminated result so callers can surface parse errors without\n * the helper itself writing to stderr or calling `process.exit`.\n *\n * Exported for unit testing.\n */\nexport function buildCacheClearBody(opts: {\n nodeId?: string;\n belowVersionRaw?: string;\n staleOnly?: boolean;\n mode?: string;\n}):\n | { ok: true; body: Record<string, unknown> }\n | { ok: false; error: string } {\n const body: Record<string, unknown> = {};\n if (opts.nodeId) body.nodeId = opts.nodeId;\n if (opts.belowVersionRaw !== undefined) {\n const n = Number(opts.belowVersionRaw);\n if (!Number.isInteger(n) || n <= 0) {\n return {\n ok: false,\n error: `--below-version must be a positive integer, got \"${opts.belowVersionRaw}\"`,\n };\n }\n body.belowVersion = n;\n }\n if (opts.staleOnly) body.staleOnly = true;\n if (opts.mode) {\n if (opts.mode !== 'all' && opts.mode !== 'hard') {\n return {\n ok: false,\n error: `--mode must be \"all\" or \"hard\", got \"${opts.mode}\"`,\n };\n }\n body.mode = opts.mode;\n }\n\n const modeCount =\n (body.nodeId !== undefined ? 1 : 0) +\n (body.belowVersion !== undefined ? 1 : 0) +\n (body.staleOnly !== undefined ? 1 : 0) +\n (body.mode !== undefined ? 1 : 0);\n if (modeCount === 0) {\n return {\n ok: false,\n error:\n 'cache clear requires one of: --node <id>, --below-version <n>, --stale-only, --mode all, or --mode hard',\n };\n }\n if (modeCount > 1) {\n return {\n ok: false,\n error: 'cache clear accepts exactly one of --node / --below-version / --stale-only / --mode',\n };\n }\n return { ok: true, body };\n}\n\nfunction printUsage(): void {\n console.error(\n [\n 'Usage:',\n ' canary workflow cache status <workflowId> [--json]',\n ' canary workflow cache clear <workflowId> <mode> [--json]',\n ' canary workflow cache optimize <workflowId> [--run <runId>] [--json]',\n ' canary workflow cache substrate --workspace <dir> --action <idx> [--phase before|after]',\n ' canary workflow cache locator --workspace <dir> --action <idx> --ref <ref> [--var k=v ...]',\n ' canary workflow cache commit <workflowId> --node <nodeId> --recipe <file.json> [--json]',\n '',\n 'Cache clear modes (pick exactly one):',\n ' --node <nodeId> Invalidate one node\\'s cache row',\n ' --below-version <n> Invalidate caches with compilerVersion < n',\n ' --stale-only Invalidate caches whose playbookHealth = \"stale\"',\n ' --mode all Invalidate every cache row (rows kept, isValid=false)',\n ' --mode hard DESTRUCTIVE: delete cache rows, strip playbookSteps',\n ' from node configs, and null lastRunId. Equivalent to',\n ' the UI \"Reset flow\" button. Requires --yes.',\n '',\n 'Options:',\n ' --yes Skip the interactive confirmation for --mode hard',\n ' --json Output raw JSON',\n ].join('\\n')\n );\n}\n\nexport async function handleWorkflowCache(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [sub, ...rest] = argv;\n if (!sub || hasFlag(argv, '--help', '-h')) {\n printUsage();\n return;\n }\n\n switch (sub) {\n case 'status':\n await handleStatus(rest, apiUrl, token);\n return;\n case 'clear':\n await handleClear(rest, apiUrl, token);\n return;\n case 'optimize':\n await handleOptimize(rest, apiUrl, token);\n return;\n case 'substrate':\n await handleSubstrate(rest);\n return;\n case 'locator':\n await handleLocator(rest);\n return;\n case 'commit':\n await handleCommit(rest, apiUrl, token);\n return;\n default:\n console.error(`Unknown cache sub-command: ${sub}`);\n printUsage();\n process.exit(1);\n }\n}\n\nasync function handleStatus(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Missing workflowId.');\n printUsage();\n process.exit(1);\n }\n const json = hasFlag(argv, '--json');\n\n const result = await apiRequest<CacheStatusResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/cache-status`\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const nodes = result.nodes ?? [];\n console.log(`Cache status for workflow ${workflowId} (${nodes.length} valid cache rows)\\n`);\n if (nodes.length === 0) {\n console.log(' No valid caches.');\n return;\n }\n\n for (const n of nodes) {\n const health = n.playbookHealth ?? '—';\n const ver = n.compilerVersion ?? 'pre-v2';\n const gaps = n.gapCount;\n const age = n.cachedAt ? new Date(n.cachedAt).toISOString().slice(0, 10) : '—';\n console.log(\n ` node=${n.nodeId.slice(0, 8)} compilerVersion=${ver} health=${health} gaps=${gaps} cachedAt=${age} uses=${n.useCount}`\n );\n }\n}\n\nasync function handleClear(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Missing workflowId.');\n printUsage();\n process.exit(1);\n }\n const json = hasFlag(argv, '--json');\n\n const built = buildCacheClearBody({\n nodeId: flagValue(argv, '--node'),\n belowVersionRaw: flagValue(argv, '--below-version'),\n staleOnly: hasFlag(argv, '--stale-only'),\n mode: flagValue(argv, '--mode'),\n });\n if (!built.ok) {\n console.error(built.error);\n process.exit(1);\n }\n const body = built.body;\n\n if (body.mode === 'hard') {\n await handleHardReset(workflowId, hasFlag(argv, '--yes'), json, apiUrl, token);\n return;\n }\n\n const result = await apiRequest<CacheClearResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/cache-clear`,\n body\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Cleared (${result.mode}): ${result.invalidated ?? 0} cache row(s)`);\n}\n\nasync function handleHardReset(\n workflowId: string,\n yesFlag: boolean,\n json: boolean,\n apiUrl: string,\n token: string\n): Promise<void> {\n if (!yesFlag) {\n console.log(\n [\n '',\n `Hard reset on workflow ${workflowId} will:`,\n ' - DELETE all cached browser actions for this workflow',\n ' - REMOVE playbookSteps from every node config',\n ' - CLEAR the workflow lastRunId',\n '',\n 'This is equivalent to the UI \"Reset flow\" button and cannot be undone.',\n '',\n ].join('\\n')\n );\n const answer = await promptInput('Type \"yes\" to confirm');\n if (answer.toLowerCase() !== 'yes') {\n console.error('Aborted.');\n process.exit(1);\n }\n }\n\n const result = await apiRequest<WorkflowResetResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/reset`\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(\n `Reset workflow: ${result.nodesReset ?? 0} node(s) cleared (cache rows deleted, playbook steps removed, lastRunId cleared)`\n );\n}\n\nasync function handleOptimize(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Missing workflowId.');\n printUsage();\n process.exit(1);\n }\n const json = hasFlag(argv, '--json');\n const runId = flagValue(argv, '--run');\n\n const result = await apiRequest<OptimizeResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/optimize-cache`,\n runId ? { runId } : {}\n );\n\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Cache optimizer job enqueued: ${result.jobId} (harvesting run ${result.runId})`);\n}\n\n/**\n * Reconstruct one trace action's page state and capture its substrate-v2,\n * entirely locally against a materialized run workspace\n * (`canary workflow debug materialize <runId> --out <dir>`).\n */\nasync function handleSubstrate(argv: string[]): Promise<void> {\n const workspace = flagValue(argv, '--workspace');\n const actionIndexRaw = flagValue(argv, '--action');\n const phase = (flagValue(argv, '--phase') ?? 'before') as 'before' | 'after';\n if (!workspace || actionIndexRaw === undefined) {\n console.error('Usage: canary workflow cache substrate --workspace <dir> --action <idx> [--phase before|after] (idx = position in browser/actions.jsonl / segments.json)');\n process.exit(1);\n }\n const actionIndex = Number(actionIndexRaw);\n const { SubstrateMaterializer } = await import('@chatsdet/workflow-cache');\n const path = await import('node:path');\n const materializer = new SubstrateMaterializer({\n traceZipPath: path.join(workspace, 'browser', 'trace.zip'),\n outDir: path.join(workspace, 'optimizer', 'substrates'),\n });\n try {\n const result = await materializer.materialize(actionIndex, phase);\n console.log(\n JSON.stringify(\n { substratePath: result.substratePath, domPath: result.domPath },\n null,\n 2\n )\n );\n } finally {\n await materializer.close();\n }\n}\n\n/**\n * Derive a deterministic locator for an element (by aria-ref) and verify it\n * offline against the trace-reconstructed DOM. Locally, no API.\n */\nasync function handleLocator(argv: string[]): Promise<void> {\n const workspace = flagValue(argv, '--workspace');\n const actionIndexRaw = flagValue(argv, '--action');\n const ref = flagValue(argv, '--ref');\n const phase = (flagValue(argv, '--phase') ?? 'before') as 'before' | 'after';\n if (!workspace || actionIndexRaw === undefined || !ref) {\n console.error('Usage: canary workflow cache locator --workspace <dir> --action <idx> --ref <ref> [--var name=value ...] (idx = position in browser/actions.jsonl / segments.json)');\n process.exit(1);\n }\n const variableValues: Record<string, string> = {};\n for (let i = 0; i < argv.length - 1; i++) {\n if (argv[i] === '--var') {\n const [name, ...valueParts] = (argv[i + 1] ?? '').split('=');\n if (name && valueParts.length > 0) variableValues[name] = valueParts.join('=');\n }\n }\n const actionIndex = Number(actionIndexRaw);\n const { HeadlessDomSession, SubstrateMaterializer, LocatorVerifier, buildLocator } = await import(\n '@chatsdet/workflow-cache'\n );\n const { parseSnapshot } = await import('@chatsdet/browser-core');\n const path = await import('node:path');\n // One Chromium for capture + verification — they must share a rendering\n // environment or the aria-ref table shifts between the two.\n const session = new HeadlessDomSession();\n const materializer = new SubstrateMaterializer({\n traceZipPath: path.join(workspace, 'browser', 'trace.zip'),\n outDir: path.join(workspace, 'optimizer', 'substrates'),\n session,\n });\n const verifier = new LocatorVerifier({ session });\n try {\n const substrate = await materializer.materialize(actionIndex, phase);\n const snapshot = parseSnapshot(substrate.substrateYaml);\n const built = buildLocator(snapshot, ref, variableValues);\n if (built.irreducible) {\n console.log(\n JSON.stringify(\n { verified: false, irreducible: true, reason: 'no unique predicate — mark as gap' },\n null,\n 2\n )\n );\n process.exit(2);\n }\n const verification = await verifier.verify({\n domPath: substrate.domPath,\n targetRef: ref,\n strategy: built.selectors,\n variableValues,\n });\n console.log(\n JSON.stringify(\n { verified: verification.verdict, predicate: built.predicate, selectors: built.selectors, verification },\n null,\n 2\n )\n );\n if (!verification.verdict) process.exit(2);\n } finally {\n await session.close();\n }\n}\n\n/** Commit an optimizer-authored recipe through the server-validated endpoint. */\nasync function handleCommit(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n const nodeId = flagValue(argv, '--node');\n const recipePath = flagValue(argv, '--recipe');\n const json = hasFlag(argv, '--json');\n const dryRun = hasFlag(argv, '--dry-run');\n if (!workflowId || !nodeId || !recipePath) {\n console.error(\n 'Usage: canary workflow cache commit <workflowId> --node <nodeId> --recipe <file.json> [--dry-run]'\n );\n process.exit(1);\n }\n const fs = await import('node:fs/promises');\n const recipe = JSON.parse(await fs.readFile(recipePath, 'utf-8')) as Record<string, unknown>;\n const result = await apiRequest<CacheRecipeResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/nodes/${nodeId}/cache-recipe`,\n dryRun ? { ...recipe, dryRun: true } : recipe\n );\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n if (result.detail && result.detail !== result.error) console.error(` ${result.detail}`);\n for (const issue of result.issues ?? []) console.error(` - ${issue}`);\n }\n process.exit(1);\n }\n if (json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n if (result.dryRun) {\n console.log(\n `Dry run OK: recipe validates and passes the commit guards ` +\n `(${result.cachedStepCount} cached, ${result.gapStepCount} gap steps; would mint under hash ${result.nodeHash})`\n );\n return;\n }\n console.log(\n `Recipe committed: cache ${result.cacheId} under hash ${result.nodeHash} ` +\n `(${result.cachedStepCount} cached, ${result.gapStepCount} gap steps)`\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
runTrace
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CEXV3MOC.js";
|
|
5
5
|
import {
|
|
6
6
|
apiRequest
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UAJUZLDE.js";
|
|
8
8
|
import "./chunk-3CZU7XCS.js";
|
|
9
9
|
import {
|
|
10
10
|
getArgValue,
|
|
11
11
|
hasFlag
|
|
12
12
|
} from "./chunk-IGHDIWZU.js";
|
|
13
13
|
import "./chunk-32P26BZT.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-AI3Y3AZH.js";
|
|
15
15
|
import "./chunk-JWHYXEA2.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-GZVCNYR4.js";
|
|
17
17
|
import "./chunk-6LEZCKKV.js";
|
|
18
|
-
import "./chunk-KRWRUU6R.js";
|
|
19
18
|
import "./chunk-VKVL7WBN.js";
|
|
20
19
|
|
|
21
20
|
// src/workflow-debug.ts
|
|
@@ -875,7 +874,7 @@ async function handleMaterialize(argv, apiUrl, token) {
|
|
|
875
874
|
const runId = requireRunId(argv);
|
|
876
875
|
const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);
|
|
877
876
|
const outDir = getArgValue(argv, "--out") ?? `./diag-${runId}`;
|
|
878
|
-
const { assembleWorkspace } = await import("./src-
|
|
877
|
+
const { assembleWorkspace } = await import("./src-DSD34JIX.js");
|
|
879
878
|
const dataUrl = `${apiUrl}/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/debug/materialize-data`;
|
|
880
879
|
const dataRes = await fetch(dataUrl, { headers: { Authorization: `Bearer ${token}` } });
|
|
881
880
|
if (!dataRes.ok) {
|
|
@@ -925,4 +924,4 @@ async function handleMaterialize(argv, apiUrl, token) {
|
|
|
925
924
|
export {
|
|
926
925
|
handleWorkflowDebug
|
|
927
926
|
};
|
|
928
|
-
//# sourceMappingURL=workflow-debug-
|
|
927
|
+
//# sourceMappingURL=workflow-debug-6UQYP67Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/workflow-debug.ts"],"sourcesContent":["/**\n * `canary workflow debug` — consolidated debug tool for a workflow run.\n *\n * Triangulates three signals so a human or AI agent can pinpoint what\n * happened in a run:\n *\n * 1. Visual — Playwright trace (screenshots, video)\n * 2. DOM — reconstructed snapshots of what the agent saw\n * 3. Telemetry — steps, cache, agent thoughts, Sentry logs/traces\n *\n * Subcommands are intentionally narrow so Claude/Codex can chain them:\n * overview, steps, cache, thoughts, logs, trace, playwright, trace-snapshot,\n * trace-fetch, snapshot, cache-debug, compare, bundle, variables\n *\n * Sentry-backed subcommands (`logs`, `trace`) need a `SENTRY_API_TOKEN`\n * configured on the API; without one they return an empty `partial: true`\n * payload with a reason rather than an error.\n */\n\nimport process from 'node:process';\nimport os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { apiRequest } from './cli-helpers.js';\nimport { hasFlag, getArgValue } from './auth.js';\nimport { runTrace } from './trace.js';\n\ntype RunDebugStep = {\n id: string;\n nodeId: string;\n name: string | null;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n durationMs: number | null;\n cacheHitSource: string | null;\n cacheOutcome: string | null;\n cacheProcessingStatus: string | null;\n errorMessage: string | null;\n};\n\ntype RunDebugPayload = {\n run: {\n id: string;\n workflowId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n durationMs: number | null;\n errorMessage: string | null;\n traceStorageKey: string | null;\n };\n steps: RunDebugStep[];\n cache: {\n hitRate: number;\n hitCount: number;\n missCount: number;\n bySource: Record<string, number>;\n misses: Array<{ stepId: string; reason: string }>;\n };\n thoughts: { count: number; byStepId: Record<string, number> };\n playwright: { viewerUrl: string | null; traceStorageKey: string | null };\n sentry: { logsAvailable: boolean; tracesAvailable: boolean };\n diagnosis: {\n slowestSteps: Array<{ stepId: string; name: string | null; durationMs: number }>;\n failedSteps: Array<{ stepId: string; name: string | null; errorMessage: string | null }>;\n cacheMissHotspots: Array<{ stepId: string; reason: string }>;\n };\n};\n\ntype OkEnvelope<T> = { ok: true; data: T };\ntype ErrEnvelope = { ok: false; error?: string };\ntype Envelope<T> = OkEnvelope<T> | ErrEnvelope;\n\nfunction printDebugHelp(): void {\n console.log(\n [\n 'Usage: canary workflow debug <sub-command> [options]',\n '',\n 'Triangulate three signals to debug a workflow run:',\n ' 1. Visual — what happened on screen? → debug playwright <runId>',\n ' 2. DOM — what did the agent see? → debug trace-snapshot <runId>',\n ' 3. Telemetry — what did we record? → debug steps | cache | thoughts | logs',\n '',\n 'Start with: canary workflow debug <runId> # diagnosis + pointers',\n 'Then drill in with the subcommand matching your question:',\n ' \"Where did we miss the cache?\" → debug cache --misses-only',\n ' \"What steps were slow?\" → debug steps --slow',\n ' \"Why did the agent click X?\" → debug thoughts --step <stepId>',\n ' \"What was on the page?\" → debug trace-snapshot <runId>',\n ' \"What errors did we log?\" → debug logs --level error',\n ' \"What variables did we have?\" → debug variables <runId>',\n ' \"What changed since it worked?\" → debug compare <oldRun> <newRun>',\n ' \"Give me everything for a run\" → debug bundle <runId> --out <dir>',\n '',\n 'Sub-commands:',\n ' overview <runId> Diagnosis summary (default when no sub given)',\n ' steps <runId> [--slow] [--json] Step timings + status',\n ' cache <runId> [--misses-only] [--json] Cache hit/miss breakdown',\n ' thoughts <runId> [--step <id>] [--grep <text>] [--json]',\n ' Agent reasoning for this run',\n ' navigation <runId> [--transitions-only] [--json]',\n ' Timestamped browser-URL history + cross-host transitions',\n ' logs <runId> [--step <id>] [--level info|warning|error] [--json]',\n ' Sentry logs for this run',\n ' trace <runId> [--step <id>] [--json] Sentry span tree',\n ' playwright <runId> [--open] [--json] Playwright trace viewer URL',\n ' trace-fetch <runId> [--out <path>] [--json]',\n ' Download trace.zip to disk',\n ' trace-snapshot <runId> [--action <index>] [--output-dir <path>] [--screenshots] [--html]',\n ' Download Playwright trace + reconstruct DOM snapshots',\n ' snapshot <runId> [--out <path>] [--json] Workflow definition that ran (published or draft)',\n ' cache-debug <runId> [--step <id>] [--json]',\n ' Per-step cache compilation + replay details',\n ' variables <runId> [--name <var>] [--json]',\n ' Run-input + captured variables with definition timestamps',\n ' compare <runIdA> <runIdB> [--out <dir>] [--json]',\n ' Diff two runs (steps, thoughts, cache, snapshot)',\n ' bundle <runId> --out <dir> Pull all debug artifacts into one directory',\n ' materialize <runId> [--out <dir>] [--json]',\n ' Materialize the canonical diagnostic workspace (same shape',\n ' the v2 failure-diagnostic agent uses). Start with `summary.md`.',\n '',\n 'Options:',\n ' --workflow <id> Workflow ID (auto-resolved from runId if omitted)',\n ' --json Raw JSON output',\n ' --env <env> Target environment (prod, dev, local)',\n ].join('\\n')\n );\n}\n\nexport async function handleWorkflowDebug(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [maybeSub, ...rest] = argv;\n\n if (!maybeSub || maybeSub === 'help' || hasFlag(argv, '--help', '-h')) {\n printDebugHelp();\n return;\n }\n\n // Bare form: `canary workflow debug <runId>` → overview\n if (looksLikeRunId(maybeSub)) {\n await handleOverview([maybeSub, ...rest], apiUrl, token);\n return;\n }\n\n switch (maybeSub) {\n case 'overview':\n await handleOverview(rest, apiUrl, token);\n return;\n case 'steps':\n await handleSteps(rest, apiUrl, token);\n return;\n case 'cache':\n await handleCache(rest, apiUrl, token);\n return;\n case 'thoughts':\n await handleThoughts(rest, apiUrl, token);\n return;\n case 'navigation':\n await handleNavigation(rest, apiUrl, token);\n return;\n case 'logs':\n await handleLogs(rest, apiUrl, token);\n return;\n case 'trace':\n await handleSentryTrace(rest, apiUrl, token);\n return;\n case 'playwright':\n await handlePlaywright(rest, apiUrl, token);\n return;\n case 'trace-snapshot':\n await handleTraceSnapshot(rest, apiUrl, token);\n return;\n case 'trace-fetch':\n await handleTraceFetch(rest, apiUrl, token);\n return;\n case 'snapshot':\n await handleSnapshot(rest, apiUrl, token);\n return;\n case 'cache-debug':\n await handleCacheDebug(rest, apiUrl, token);\n return;\n case 'variables':\n await handleVariables(rest, apiUrl, token);\n return;\n case 'compare':\n await handleCompare(rest, apiUrl, token);\n return;\n case 'bundle':\n await handleBundle(rest, apiUrl, token);\n return;\n case 'materialize':\n await handleMaterialize(rest, apiUrl, token);\n return;\n default:\n console.error(`Unknown debug sub-command: ${maybeSub}`);\n printDebugHelp();\n process.exit(1);\n }\n}\n\nfunction looksLikeRunId(s: string): boolean {\n // Uuid-ish or prefixed id. Just avoid matching bare sub-commands.\n return !!s && !s.startsWith('-') && s.length >= 8 && !/^[a-z-]+$/i.test(s.slice(0, 8));\n}\n\nfunction requireRunId(argv: string[]): string {\n const runId = argv.find((a) => !a.startsWith('-'));\n if (!runId) {\n console.error('Error: <runId> is required');\n process.exit(1);\n }\n return runId;\n}\n\nasync function resolveWorkflowId(\n argv: string[],\n runId: string,\n apiUrl: string,\n token: string\n): Promise<string> {\n const explicit = getArgValue(argv, '--workflow');\n if (explicit) return explicit;\n const res = await apiRequest<{\n ok: boolean;\n error?: string;\n data?: { runId: string; workflowId: string };\n }>(apiUrl, token, 'GET', `/workflows/runs/${encodeURIComponent(runId)}/lookup`);\n if (res.ok && res.data?.workflowId) return res.data.workflowId;\n console.error(\n `Error: could not resolve workflowId from runId (${res.error ?? 'unknown error'}).`\n );\n console.error(\n ` Pass --workflow <workflowId> explicitly, or run: canary workflow runs list <workflowId>`\n );\n process.exit(1);\n return '';\n}\n\nasync function fetchDebug(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string,\n subpath = ''\n): Promise<Envelope<unknown>> {\n return apiRequest<Envelope<unknown> & { ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/debug${subpath}`\n );\n}\n\nfunction fmtMs(ms: number | null): string {\n if (ms === null) return '—';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nasync function handleOverview(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<RunDebugPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n const d = res.data;\n console.log(`Run ${d.run.id.slice(0, 8)} · ${d.run.status} · ${fmtMs(d.run.durationMs)}`);\n if (d.run.errorMessage) console.log(` error: ${d.run.errorMessage}`);\n console.log(\n ` cache: ${Math.round(d.cache.hitRate * 100)}% hit (${d.cache.hitCount}/${d.cache.hitCount + d.cache.missCount})`\n );\n console.log(` thoughts: ${d.thoughts.count} recorded`);\n console.log(\n ` playwright trace: ${d.playwright.traceStorageKey ? 'available' : 'not captured'}`\n );\n\n if (d.diagnosis.failedSteps.length > 0) {\n console.log('\\nFailed steps:');\n for (const s of d.diagnosis.failedSteps) {\n console.log(` ✗ ${s.name ?? s.stepId.slice(0, 8)} ${s.errorMessage ?? ''}`);\n }\n }\n if (d.diagnosis.slowestSteps.length > 0) {\n console.log('\\nSlowest steps:');\n for (const s of d.diagnosis.slowestSteps) {\n console.log(` · ${s.name ?? s.stepId.slice(0, 8)} ${fmtMs(s.durationMs)}`);\n }\n }\n if (d.diagnosis.cacheMissHotspots.length > 0) {\n console.log('\\nCache miss hotspots:');\n for (const s of d.diagnosis.cacheMissHotspots) {\n console.log(` · ${s.stepId.slice(0, 8)} ${s.reason}`);\n }\n }\n\n console.log('\\nNext:');\n console.log(\n ` canary workflow debug steps ${runId} --slow # timings`\n );\n console.log(\n ` canary workflow debug cache ${runId} --misses-only # cache diagnosis`\n );\n console.log(\n ` canary workflow debug thoughts ${runId} --step <id> # agent reasoning`\n );\n console.log(\n ` canary workflow debug trace-snapshot ${runId} # DOM the agent saw`\n );\n}\n\nasync function handleSteps(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/steps')) as Envelope<{\n steps: RunDebugStep[];\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const steps = [...res.data.steps];\n if (hasFlag(argv, '--slow')) {\n steps.sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0));\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(steps, null, 2));\n return;\n }\n console.log('STEP STATUS DURATION CACHE');\n for (const s of steps) {\n const name = (s.name ?? s.id.slice(0, 8)).padEnd(28).slice(0, 28);\n const status = s.status.padEnd(10);\n const dur = fmtMs(s.durationMs).padEnd(10);\n const cache = s.cacheHitSource ?? (s.cacheOutcome ?? '—');\n console.log(`${name} ${status} ${dur} ${cache}`);\n if (s.errorMessage) console.log(` ↳ ${s.errorMessage}`);\n }\n}\n\ntype NavigationEntry = {\n timestampMs: number;\n isoTimestamp: string | null;\n url: string;\n hostname: string | null;\n success: boolean;\n};\n\ntype NavigationTransition = {\n fromIndex: number;\n toIndex: number;\n fromHostname: string | null;\n toHostname: string | null;\n fromUrl: string;\n toUrl: string;\n timestampMs: number;\n};\n\ntype NavigationPayload = {\n startTimestamp: string | null;\n entries: NavigationEntry[];\n transitions: NavigationTransition[];\n};\n\nasync function handleNavigation(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(\n apiUrl,\n token,\n workflowId,\n runId,\n '/navigation'\n )) as Envelope<NavigationPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n\n const transitionsOnly = hasFlag(argv, '--transitions-only');\n const payload = res.data;\n\n if (hasFlag(argv, '--json')) {\n console.log(\n JSON.stringify(\n transitionsOnly\n ? { startTimestamp: payload.startTimestamp, transitions: payload.transitions }\n : payload,\n null,\n 2\n )\n );\n return;\n }\n\n if (payload.entries.length === 0) {\n console.log('No navigation events recorded for this run.');\n return;\n }\n\n if (payload.transitions.length > 0) {\n console.log(\n `⚠ ${payload.transitions.length} cross-host transition${payload.transitions.length === 1 ? '' : 's'}:`\n );\n for (const t of payload.transitions) {\n console.log(\n ` ${formatRelMs(t.timestampMs)} ${t.fromHostname} → ${t.toHostname}`\n );\n }\n console.log('');\n }\n\n if (transitionsOnly) return;\n\n const transitionTo = new Set(payload.transitions.map((t) => t.toIndex));\n console.log('TIME HOSTNAME URL');\n payload.entries.forEach((e, idx) => {\n const time = formatRelMs(e.timestampMs).padEnd(12);\n const host = (e.hostname ?? '—').padEnd(25).slice(0, 25);\n const marker = transitionTo.has(idx) ? '→' : ' ';\n console.log(`${time} ${marker} ${host} ${e.url}`);\n });\n}\n\nfunction formatRelMs(ms: number): string {\n if (ms < 0) ms = 0;\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const millis = ms % 1000;\n return `${minutes}:${String(seconds).padStart(2, '0')}.${String(millis).padStart(3, '0')}`;\n}\n\nasync function handleCache(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<RunDebugPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const { cache, steps } = res.data;\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(cache, null, 2));\n return;\n }\n console.log(\n `Cache hit rate: ${Math.round(cache.hitRate * 100)}% (${cache.hitCount} hit, ${cache.missCount} miss)`\n );\n if (Object.keys(cache.bySource).length > 0) {\n console.log('By source:');\n for (const [src, n] of Object.entries(cache.bySource)) {\n console.log(` ${src.padEnd(16)} ${n}`);\n }\n }\n const stepById = new Map(steps.map((s) => [s.id, s]));\n if (!hasFlag(argv, '--misses-only')) {\n console.log('\\nHits:');\n for (const s of steps.filter((x) => x.cacheHitSource)) {\n console.log(` ✓ ${(s.name ?? s.id.slice(0, 8)).padEnd(28)} ${s.cacheHitSource}`);\n }\n }\n if (cache.misses.length > 0) {\n console.log('\\nMisses:');\n for (const m of cache.misses) {\n const s = stepById.get(m.stepId);\n console.log(` ✗ ${(s?.name ?? m.stepId.slice(0, 8)).padEnd(28)} ${m.reason}`);\n }\n }\n}\n\nasync function handleThoughts(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const stepId = getArgValue(argv, '--step');\n const grep = getArgValue(argv, '--grep');\n const qs = stepId ? `?step=${encodeURIComponent(stepId)}` : '';\n const res = (await fetchDebug(\n apiUrl,\n token,\n workflowId,\n runId,\n `/thoughts${qs}`\n )) as Envelope<{\n thoughts: Array<{\n id: string;\n stepId: string | null;\n toolName: string | null;\n content: string;\n orderIndex: number;\n createdAt: string;\n }>;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const totalThoughts = res.data.thoughts.length;\n let thoughts = res.data.thoughts;\n if (grep) {\n const needle = grep.toLowerCase();\n thoughts = thoughts.filter((t) => t.content.toLowerCase().includes(needle));\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(thoughts, null, 2));\n return;\n }\n for (const t of thoughts) {\n const tag = t.toolName ? `[${t.toolName}] ` : '';\n const step = t.stepId ? `step ${t.stepId.slice(0, 8)} ` : '';\n console.log(`${step}${tag}${t.content}`);\n console.log('');\n }\n if (thoughts.length === 0) {\n if (totalThoughts === 0) {\n const scope = stepId ? ` for step ${stepId.slice(0, 8)}` : '';\n console.log(`(no thoughts recorded${scope})`);\n } else if (grep) {\n console.log(\n `(no thoughts matched --grep \"${grep}\"; ${totalThoughts} total thought${totalThoughts === 1 ? '' : 's'} in scope)`\n );\n } else {\n console.log('(no thoughts to display)');\n }\n }\n}\n\nasync function handleLogs(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const level = getArgValue(argv, '--level');\n const stepId = getArgValue(argv, '--step');\n const params = new URLSearchParams();\n if (level) params.set('level', level);\n if (stepId) params.set('step', stepId);\n const qs = params.toString() ? `?${params.toString()}` : '';\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, `/logs${qs}`)) as Envelope<{\n rows: Array<{ timestamp: string; level: string; message: string }>;\n partial: boolean;\n reason: string | null;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n if (res.data.partial) {\n console.log(`(partial result: ${res.data.reason ?? 'unknown'})`);\n }\n for (const row of res.data.rows) {\n console.log(`${row.timestamp} ${row.level.padEnd(8)} ${row.message}`);\n }\n if (res.data.rows.length === 0 && !res.data.partial) {\n console.log('(no logs)');\n }\n}\n\nasync function handleSentryTrace(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const stepId = getArgValue(argv, '--step');\n const qs = stepId ? `?step=${encodeURIComponent(stepId)}` : '';\n const res = (await fetchDebug(\n apiUrl,\n token,\n workflowId,\n runId,\n `/sentry-trace${qs}`\n )) as Envelope<{\n traceId: string | null;\n spans: Array<{\n spanId: string;\n parentSpanId: string | null;\n op: string | null;\n description: string | null;\n durationMs: number | null;\n }>;\n partial: boolean;\n reason: string | null;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n if (res.data.partial) {\n console.log(`(partial result: ${res.data.reason ?? 'unknown'})`);\n }\n if (res.data.traceId) console.log(`trace ${res.data.traceId}`);\n for (const span of res.data.spans) {\n const op = (span.op ?? 'span').padEnd(22);\n const desc = (span.description ?? '').padEnd(40);\n const dur = span.durationMs !== null ? `${span.durationMs}ms` : '';\n console.log(` ${op} ${desc} ${dur}`);\n }\n if (res.data.spans.length === 0 && !res.data.partial) {\n console.log('(no spans)');\n }\n}\n\nasync function handlePlaywright(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n viewerUrl: string;\n signedUrl: string;\n storageKey: string;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n console.log(res.data.viewerUrl);\n if (hasFlag(argv, '--open')) {\n const opener =\n process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n const { spawn } = await import('node:child_process');\n spawn(opener, [res.data.viewerUrl], { detached: true, stdio: 'ignore' }).unref();\n }\n}\n\nasync function handleTraceSnapshot(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const runId = requireRunId(argv);\n if (getArgValue(argv, '--step')) {\n console.error(\n 'Error: trace-snapshot --step is not supported by the local trace reconstructor. Use --action <0-based trace action index> or omit filtering.'\n );\n process.exit(1);\n }\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n signedUrl: string;\n storageKey: string;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n\n // Download into a stable temp path so `canary trace snapshot` can open it.\n const tmp = await fs.mkdtemp(path.join(os.tmpdir(), `canary-trace-${runId}-`));\n const traceFile = path.join(tmp, 'trace.zip');\n const download = await fetch(res.data.signedUrl);\n if (!download.ok) {\n console.error(`Failed to download trace: HTTP ${download.status}`);\n process.exit(1);\n }\n const buf = Buffer.from(await download.arrayBuffer());\n await fs.writeFile(traceFile, buf);\n\n const forwarded: string[] = ['snapshot', traceFile];\n for (const flag of ['--output-dir', '--filter', '--action']) {\n const v = getArgValue(argv, flag);\n if (v !== undefined) forwarded.push(flag, v);\n }\n if (hasFlag(argv, '--screenshots')) forwarded.push('--screenshots');\n if (hasFlag(argv, '--html')) forwarded.push('--html');\n\n await runTrace(forwarded);\n}\n\n/**\n * `trace-fetch` — download the raw `trace.zip` to a chosen path.\n *\n * Distinct from `playwright` (prints/opens viewer URL) and `trace-snapshot`\n * (downloads to a tmp dir and pipes into `canary trace snapshot`). Use this\n * when you just want the file on disk for `unzip`, vendoring into a ticket,\n * or feeding to another tool.\n */\nasync function handleTraceFetch(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n signedUrl: string;\n storageKey: string;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const out = getArgValue(argv, '--out') ?? `./trace-${runId}.zip`;\n const download = await fetch(res.data.signedUrl);\n if (!download.ok) {\n console.error(`Failed to download trace: HTTP ${download.status}`);\n process.exit(1);\n }\n const buf = Buffer.from(await download.arrayBuffer());\n await fs.writeFile(out, buf);\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ path: out, storageKey: res.data.storageKey }, null, 2));\n return;\n }\n console.log(out);\n}\n\ntype RunDetailResponse = {\n ok?: boolean;\n error?: string;\n run?: {\n id: string;\n workflowId: string;\n snapshotVersion: number | null;\n draftSnapshot: { id: string; version: string; basePublishedVersion: number } | null;\n };\n};\n\nasync function fetchRunDetail(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string\n): Promise<RunDetailResponse['run']> {\n const res = await apiRequest<RunDetailResponse & { ok: boolean }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}`\n );\n if (!res.run) {\n console.error(`Failed to load run: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n return res.run;\n}\n\n/**\n * `snapshot` — fetch the workflow definition that ran for this runId.\n *\n * Resolves to either a published snapshot (`snapshotVersion`) or a draft\n * snapshot (`draftSnapshotId.version`) by looking at the run record, then\n * fetches the corresponding `snapshotJson`. Useful for \"what was the workflow\n * when this ran?\" and as the input to `diff` for two runs.\n */\nasync function handleSnapshot(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const run = await fetchRunDetail(apiUrl, token, workflowId, runId);\n if (!run) return;\n\n let snapshotPath: string;\n let kind: 'published' | 'draft';\n if (run.draftSnapshot) {\n snapshotPath = `/workflows/${encodeURIComponent(workflowId)}/draft-snapshots/${encodeURIComponent(run.draftSnapshot.version)}`;\n kind = 'draft';\n } else if (run.snapshotVersion !== null && run.snapshotVersion !== undefined) {\n snapshotPath = `/workflows/${encodeURIComponent(workflowId)}/snapshots/${run.snapshotVersion}`;\n kind = 'published';\n } else {\n console.error('Run has no snapshotVersion or draftSnapshotId — cannot resolve definition.');\n process.exit(1);\n }\n\n const snap = await apiRequest<{ ok: boolean; error?: string; snapshot?: { snapshotJson: unknown; version: number | string; name?: string | null } }>(\n apiUrl,\n token,\n 'GET',\n snapshotPath\n );\n if (!snap.snapshot) {\n console.error(`Failed to load snapshot: ${snap.error ?? 'unknown error'}`);\n process.exit(1);\n }\n\n const out = getArgValue(argv, '--out');\n const text = JSON.stringify(snap.snapshot.snapshotJson, null, 2);\n if (out) {\n await fs.writeFile(out, text);\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ path: out, kind, version: snap.snapshot.version }, null, 2));\n } else {\n console.log(`${kind} snapshot v${snap.snapshot.version} → ${out}`);\n }\n return;\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ kind, version: snap.snapshot.version, snapshotJson: snap.snapshot.snapshotJson }, null, 2));\n return;\n }\n console.log(text);\n}\n\ntype VariablesPayload = {\n inputs: Array<{\n name: string;\n value: string;\n definedAt: string;\n source: 'run-input';\n }>;\n captures: Array<{\n name: string;\n value: string;\n definedAt: string;\n source: 'capture';\n stepId: string;\n nodeId: string;\n nodeName: string | null;\n }>;\n};\n\n/**\n * `variables` — list run-time variables and where each one was defined.\n *\n * Two sections: workflow-level inputs (defined at run start) and per-step\n * captures (defined when the agent's saveAs directive fires). Use this to\n * answer \"what was {{var}} when this ran, and which step set it?\"\n */\nasync function handleVariables(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/variables')) as Envelope<VariablesPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const filter = getArgValue(argv, '--name');\n const data: VariablesPayload = filter\n ? {\n inputs: res.data.inputs.filter((v) => v.name === filter),\n captures: res.data.captures.filter((v) => v.name === filter),\n }\n : res.data;\n\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n const fmtValue = (v: string) => (v.length > 80 ? `${v.slice(0, 77)}...` : v);\n\n console.log(`Run inputs (${data.inputs.length})`);\n if (data.inputs.length === 0) {\n console.log(' (none)');\n } else {\n for (const v of data.inputs) {\n console.log(` ${v.name} = ${fmtValue(v.value)} [defined ${v.definedAt}]`);\n }\n }\n\n console.log('');\n console.log(`Captures (${data.captures.length})`);\n if (data.captures.length === 0) {\n console.log(' (none)');\n } else {\n for (const v of data.captures) {\n const where = v.nodeName ? `${v.nodeName} (${v.stepId})` : v.stepId;\n console.log(` ${v.name} = ${fmtValue(v.value)} [${v.definedAt} · ${where}]`);\n }\n }\n}\n\ntype CacheDebugResponse = {\n ok?: boolean;\n error?: string;\n cache?: unknown;\n steps?: Array<Record<string, unknown>>;\n debugSnapshots?: unknown[];\n};\ntype CacheDebugEnvelope = CacheDebugResponse & { ok: boolean; data?: CacheDebugResponse };\n\n/**\n * `cache-debug` — wrap the cache-debug endpoint.\n *\n * Exposes per-step cache compilation, attempted selectors, resolution results,\n * and a11y snapshots from `workflow_cache_debug_snapshots`. This is the data\n * that powers the cache outcomes tab in the web debug view.\n */\nasync function handleCacheDebug(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = await apiRequest<CacheDebugEnvelope>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/cache-debug`\n );\n if (res.ok === false) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const stepFilter = getArgValue(argv, '--step');\n const payload = res.data ?? res;\n const data: CacheDebugResponse = stepFilter\n ? {\n ...payload,\n steps: (payload.steps ?? []).filter(\n (s) => s['stepId'] === stepFilter || s['nodeId'] === stepFilter\n ),\n }\n : payload;\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n console.log(JSON.stringify(data, null, 2));\n}\n\ntype StepLite = { id: string; nodeId: string; name: string | null; status: string; durationMs: number | null; cacheHitSource: string | null; cacheOutcome: string | null; errorMessage: string | null };\ntype ThoughtLite = { id: string; stepId: string | null; content: string; toolName: string | null; orderIndex: number };\ntype RunBundle = {\n runId: string;\n overview: RunDebugPayload;\n steps: StepLite[];\n thoughts: ThoughtLite[];\n};\n\nasync function loadRunBundle(apiUrl: string, token: string, workflowId: string, runId: string): Promise<RunBundle> {\n const overview = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<RunDebugPayload>;\n if (!overview.ok) {\n console.error(`Failed to load run ${runId}: ${overview.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const stepsRes = (await fetchDebug(apiUrl, token, workflowId, runId, '/steps')) as Envelope<{ steps: StepLite[] }>;\n const thoughtsRes = (await fetchDebug(apiUrl, token, workflowId, runId, '/thoughts')) as Envelope<{ thoughts: ThoughtLite[] }>;\n return {\n runId,\n overview: overview.data,\n steps: stepsRes.ok ? stepsRes.data.steps : [],\n thoughts: thoughtsRes.ok ? thoughtsRes.data.thoughts : [],\n };\n}\n\n/**\n * `compare` — structural diff between two runs.\n *\n * Aligns steps by nodeId; reports status/duration/cacheHitSource flips and\n * thought additions at diverging steps. Output is a JSON document the skill\n * can read and reason over (no LLM summarization in the CLI itself). With\n * `--out`, also pulls `trace.zip` and the snapshot JSON for both runs into\n * `<dir>/runA/` and `<dir>/runB/` for offline visual inspection.\n */\nasync function handleCompare(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error('Usage: canary workflow debug compare <runIdA> <runIdB> [--workflow <id>] [--out <dir>] [--json]');\n process.exit(1);\n }\n const [runA, runB] = positional;\n const workflowId = await resolveWorkflowId(argv, runA, apiUrl, token);\n\n const [a, b] = await Promise.all([\n loadRunBundle(apiUrl, token, workflowId, runA),\n loadRunBundle(apiUrl, token, workflowId, runB),\n ]);\n\n const stepsByNode = (steps: StepLite[]) => {\n const m = new Map<string, StepLite>();\n for (const s of steps) m.set(s.nodeId, s);\n return m;\n };\n const aMap = stepsByNode(a.steps);\n const bMap = stepsByNode(b.steps);\n const allNodes = new Set([...aMap.keys(), ...bMap.keys()]);\n\n const stepDiffs: Array<{\n nodeId: string;\n name: string | null;\n statusA: string | null;\n statusB: string | null;\n durationA: number | null;\n durationB: number | null;\n durationDeltaPct: number | null;\n cacheA: string | null;\n cacheB: string | null;\n flipped: string[];\n }> = [];\n\n for (const nodeId of allNodes) {\n const sa = aMap.get(nodeId) ?? null;\n const sb = bMap.get(nodeId) ?? null;\n const flipped: string[] = [];\n if ((sa?.status ?? null) !== (sb?.status ?? null)) flipped.push('status');\n if ((sa?.cacheHitSource ?? null) !== (sb?.cacheHitSource ?? null)) flipped.push('cache');\n const durA = sa?.durationMs ?? null;\n const durB = sb?.durationMs ?? null;\n let durationDeltaPct: number | null = null;\n if (durA !== null && durB !== null && durA > 0) {\n durationDeltaPct = Math.round(((durB - durA) / durA) * 100);\n if (Math.abs(durationDeltaPct) >= 100) flipped.push('duration');\n }\n if (flipped.length > 0 || !sa || !sb) {\n stepDiffs.push({\n nodeId,\n name: sa?.name ?? sb?.name ?? null,\n statusA: sa?.status ?? null,\n statusB: sb?.status ?? null,\n durationA: durA,\n durationB: durB,\n durationDeltaPct,\n cacheA: sa?.cacheHitSource ?? null,\n cacheB: sb?.cacheHitSource ?? null,\n flipped: !sa ? ['only-in-B'] : !sb ? ['only-in-A'] : flipped,\n });\n }\n }\n\n // Thought delta at diverging nodes\n const thoughtsByStep = (bundle: RunBundle) => {\n const m = new Map<string, ThoughtLite[]>();\n for (const t of bundle.thoughts) {\n const key = t.stepId ?? '';\n const arr = m.get(key) ?? [];\n arr.push(t);\n m.set(key, arr);\n }\n return m;\n };\n const aThoughts = thoughtsByStep(a);\n const bThoughts = thoughtsByStep(b);\n const thoughtDeltas = stepDiffs.map((d) => {\n const sa = aMap.get(d.nodeId);\n const sb = bMap.get(d.nodeId);\n return {\n nodeId: d.nodeId,\n thoughtsA: sa ? (aThoughts.get(sa.id)?.map((t) => t.content) ?? []) : [],\n thoughtsB: sb ? (bThoughts.get(sb.id)?.map((t) => t.content) ?? []) : [],\n };\n });\n\n const result = {\n runA,\n runB,\n workflowId,\n cacheHitRateDelta: b.overview.cache.hitRate - a.overview.cache.hitRate,\n statusA: a.overview.run.status,\n statusB: b.overview.run.status,\n durationA: a.overview.run.durationMs,\n durationB: b.overview.run.durationMs,\n stepDiffs,\n thoughtDeltas,\n };\n\n const outDir = getArgValue(argv, '--out');\n if (outDir) {\n await fs.mkdir(outDir, { recursive: true });\n await fs.writeFile(path.join(outDir, 'compare.json'), JSON.stringify(result, null, 2));\n for (const [label, runId] of [['runA', runA], ['runB', runB]] as const) {\n const sub = path.join(outDir, label);\n await fs.mkdir(sub, { recursive: true });\n await tryWriteSnapshot(apiUrl, token, workflowId, runId, path.join(sub, 'snapshot.json'));\n await tryWriteTrace(apiUrl, token, workflowId, runId, path.join(sub, 'trace.zip'));\n }\n if (!hasFlag(argv, '--json')) console.log(`Wrote compare bundle to ${outDir}`);\n }\n\n if (hasFlag(argv, '--json') || !outDir) {\n console.log(JSON.stringify(result, null, 2));\n }\n}\n\nasync function tryWriteTrace(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string,\n outPath: string\n): Promise<void> {\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n signedUrl: string;\n }>;\n if (!res.ok) return;\n const dl = await fetch(res.data.signedUrl);\n if (!dl.ok) return;\n await fs.writeFile(outPath, Buffer.from(await dl.arrayBuffer()));\n}\n\nasync function tryWriteSnapshot(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string,\n outPath: string\n): Promise<void> {\n const run = await fetchRunDetail(apiUrl, token, workflowId, runId);\n if (!run) return;\n const snapPath = run.draftSnapshot\n ? `/workflows/${encodeURIComponent(workflowId)}/draft-snapshots/${encodeURIComponent(run.draftSnapshot.version)}`\n : run.snapshotVersion !== null && run.snapshotVersion !== undefined\n ? `/workflows/${encodeURIComponent(workflowId)}/snapshots/${run.snapshotVersion}`\n : null;\n if (!snapPath) return;\n const snap = await apiRequest<{ ok: boolean; snapshot?: { snapshotJson: unknown } }>(\n apiUrl,\n token,\n 'GET',\n snapPath\n );\n if (!snap.snapshot) return;\n await fs.writeFile(outPath, JSON.stringify(snap.snapshot.snapshotJson, null, 2));\n}\n\n/**\n * `bundle` — pull every artifact for a run into one directory.\n *\n * Writes overview/steps/cache/thoughts/variables JSON, snapshot JSON, and\n * trace.zip. Logs/sentry-trace are best-effort (skipped if SENTRY_API_TOKEN\n * is not configured on the API). Produces a `bundle.json` manifest. Designed\n * for offline triage and ticket attachments.\n */\nasync function handleBundle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const outDir = getArgValue(argv, '--out');\n if (!outDir) {\n console.error('Error: --out <dir> is required');\n process.exit(1);\n }\n await fs.mkdir(outDir, { recursive: true });\n\n const manifest: Array<{ file: string; source: string; ok: boolean; error?: string }> = [];\n\n const writeJson = async (file: string, source: string, fetcher: () => Promise<unknown>) => {\n try {\n const data = await fetcher();\n await fs.writeFile(path.join(outDir, file), JSON.stringify(data, null, 2));\n manifest.push({ file, source, ok: true });\n } catch (err) {\n manifest.push({ file, source, ok: false, error: String(err) });\n }\n };\n\n await writeJson('overview.json', `GET /workflows/${workflowId}/runs/${runId}/debug`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('steps.json', `/debug/steps`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/steps')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('thoughts.json', `/debug/thoughts`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/thoughts')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('cache-debug.json', `/cache-debug`, async () => {\n const r = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/cache-debug`\n );\n if (r.ok === false) throw new Error(r.error ?? 'failed');\n return r;\n });\n await writeJson('logs.json', `/debug/logs`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/logs')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('sentry-trace.json', `/debug/sentry-trace`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/sentry-trace')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('variables.json', `/debug/variables`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/variables')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n\n // Snapshot JSON\n try {\n await tryWriteSnapshot(apiUrl, token, workflowId, runId, path.join(outDir, 'snapshot.json'));\n manifest.push({ file: 'snapshot.json', source: 'snapshots/:version', ok: true });\n } catch (err) {\n manifest.push({ file: 'snapshot.json', source: 'snapshots/:version', ok: false, error: String(err) });\n }\n\n // trace.zip\n try {\n await tryWriteTrace(apiUrl, token, workflowId, runId, path.join(outDir, 'trace.zip'));\n manifest.push({ file: 'trace.zip', source: '/debug/trace', ok: true });\n } catch (err) {\n manifest.push({ file: 'trace.zip', source: '/debug/trace', ok: false, error: String(err) });\n }\n\n await fs.writeFile(path.join(outDir, 'bundle.json'), JSON.stringify({ runId, workflowId, manifest }, null, 2));\n console.log(`Wrote bundle to ${outDir}`);\n for (const m of manifest) {\n console.log(` ${m.ok ? '✓' : '✗'} ${m.file}${m.ok ? '' : ` (${m.error ?? 'failed'})`}`);\n }\n}\n\n/**\n * `materialize` — produce the canonical diagnostic workspace on disk.\n *\n * The same workspace shape powers the v2 failure-diagnostic agent and the\n * Claude Code `debug-run` skill. Pipeline:\n * 1. CLI hits `/debug/materialize-data` → receives `RunData` JSON + a signed\n * S3 URL for trace.zip.\n * 2. CLI downloads trace.zip via the signed URL.\n * 3. CLI runs `assembleWorkspace` from `@chatsdet/diagnostic-workspace` locally.\n * This is the same code the server runs in-process for the v2 agent —\n * no drift possible.\n *\n * Trace reconstruction (Playwright headless) runs on the customer's machine,\n * not the server. After this command completes, start with `summary.md`.\n */\nasync function handleMaterialize(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const outDir = getArgValue(argv, '--out') ?? `./diag-${runId}`;\n\n const { assembleWorkspace } = await import('@chatsdet/diagnostic-workspace');\n\n type MaterializeDataResponse = {\n ok: true;\n data: { runData: import('@chatsdet/diagnostic-workspace').RunData; signedTraceUrl: string | null };\n } | { ok: false; error?: string };\n\n const dataUrl = `${apiUrl}/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/debug/materialize-data`;\n const dataRes = await fetch(dataUrl, { headers: { Authorization: `Bearer ${token}` } });\n if (!dataRes.ok) {\n const errText = await dataRes.text().catch(() => '');\n console.error(`Failed to fetch run data: HTTP ${dataRes.status} ${errText}`);\n process.exit(1);\n }\n const envelope = (await dataRes.json()) as MaterializeDataResponse;\n if (!envelope.ok) {\n console.error(`Failed: ${envelope.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const { runData, signedTraceUrl } = envelope.data;\n\n await fs.mkdir(outDir, { recursive: true });\n\n // Download trace.zip locally so the assembler can copy + reconstruct it.\n // Stream the body to disk — trace.zip can be 200MB+ and customer CI runners\n // are commonly memory-constrained.\n let traceZipPath: string | null = null;\n if (signedTraceUrl) {\n traceZipPath = path.join(outDir, '.trace-source.zip');\n const traceRes = await fetch(signedTraceUrl);\n if (!traceRes.ok || !traceRes.body) {\n console.warn(`Trace download failed (HTTP ${traceRes.status}); workspace will be marked partial.`);\n traceZipPath = null;\n } else {\n const handle = await fs.open(traceZipPath, 'w');\n try {\n const reader = traceRes.body.getReader();\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n if (value) await handle.write(value);\n }\n } finally {\n await handle.close();\n }\n }\n }\n\n await assembleWorkspace({ runData, workspaceRoot: outDir, traceZipPath });\n\n if (traceZipPath) {\n await fs.rm(traceZipPath, { force: true }).catch(() => undefined);\n }\n\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ workspace: outDir, runId, workflowId }, null, 2));\n return;\n }\n console.log(`Materialized workspace at ${outDir}`);\n console.log(`Start with: cat ${path.join(outDir, 'summary.md')}`);\n}\n"],"mappings":"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","names":["a"]}
|
|
1
|
+
{"version":3,"sources":["../src/workflow-debug.ts"],"sourcesContent":["/**\n * `canary workflow debug` — consolidated debug tool for a workflow run.\n *\n * Triangulates three signals so a human or AI agent can pinpoint what\n * happened in a run:\n *\n * 1. Visual — Playwright trace (screenshots, video)\n * 2. DOM — reconstructed snapshots of what the agent saw\n * 3. Telemetry — steps, cache, agent thoughts, Sentry logs/traces\n *\n * Subcommands are intentionally narrow so Claude/Codex can chain them:\n * overview, steps, cache, thoughts, logs, trace, playwright, trace-snapshot,\n * trace-fetch, snapshot, cache-debug, compare, bundle, variables\n *\n * Sentry-backed subcommands (`logs`, `trace`) need a `SENTRY_API_TOKEN`\n * configured on the API; without one they return an empty `partial: true`\n * payload with a reason rather than an error.\n */\n\nimport process from 'node:process';\nimport os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { apiRequest } from './cli-helpers.js';\nimport { hasFlag, getArgValue } from './auth.js';\nimport { runTrace } from './trace.js';\n\ntype RunDebugStep = {\n id: string;\n nodeId: string;\n name: string | null;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n durationMs: number | null;\n cacheHitSource: string | null;\n cacheOutcome: string | null;\n cacheProcessingStatus: string | null;\n errorMessage: string | null;\n};\n\ntype RunDebugPayload = {\n run: {\n id: string;\n workflowId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n durationMs: number | null;\n errorMessage: string | null;\n traceStorageKey: string | null;\n };\n steps: RunDebugStep[];\n cache: {\n hitRate: number;\n hitCount: number;\n missCount: number;\n bySource: Record<string, number>;\n misses: Array<{ stepId: string; reason: string }>;\n };\n thoughts: { count: number; byStepId: Record<string, number> };\n playwright: { viewerUrl: string | null; traceStorageKey: string | null };\n sentry: { logsAvailable: boolean; tracesAvailable: boolean };\n diagnosis: {\n slowestSteps: Array<{ stepId: string; name: string | null; durationMs: number }>;\n failedSteps: Array<{ stepId: string; name: string | null; errorMessage: string | null }>;\n cacheMissHotspots: Array<{ stepId: string; reason: string }>;\n };\n};\n\ntype OkEnvelope<T> = { ok: true; data: T };\ntype ErrEnvelope = { ok: false; error?: string };\ntype Envelope<T> = OkEnvelope<T> | ErrEnvelope;\n\nfunction printDebugHelp(): void {\n console.log(\n [\n 'Usage: canary workflow debug <sub-command> [options]',\n '',\n 'Triangulate three signals to debug a workflow run:',\n ' 1. Visual — what happened on screen? → debug playwright <runId>',\n ' 2. DOM — what did the agent see? → debug trace-snapshot <runId>',\n ' 3. Telemetry — what did we record? → debug steps | cache | thoughts | logs',\n '',\n 'Start with: canary workflow debug <runId> # diagnosis + pointers',\n 'Then drill in with the subcommand matching your question:',\n ' \"Where did we miss the cache?\" → debug cache --misses-only',\n ' \"What steps were slow?\" → debug steps --slow',\n ' \"Why did the agent click X?\" → debug thoughts --step <stepId>',\n ' \"What was on the page?\" → debug trace-snapshot <runId>',\n ' \"What errors did we log?\" → debug logs --level error',\n ' \"What variables did we have?\" → debug variables <runId>',\n ' \"What changed since it worked?\" → debug compare <oldRun> <newRun>',\n ' \"Give me everything for a run\" → debug bundle <runId> --out <dir>',\n '',\n 'Sub-commands:',\n ' overview <runId> Diagnosis summary (default when no sub given)',\n ' steps <runId> [--slow] [--json] Step timings + status',\n ' cache <runId> [--misses-only] [--json] Cache hit/miss breakdown',\n ' thoughts <runId> [--step <id>] [--grep <text>] [--json]',\n ' Agent reasoning for this run',\n ' navigation <runId> [--transitions-only] [--json]',\n ' Timestamped browser-URL history + cross-host transitions',\n ' logs <runId> [--step <id>] [--level info|warning|error] [--json]',\n ' Sentry logs for this run',\n ' trace <runId> [--step <id>] [--json] Sentry span tree',\n ' playwright <runId> [--open] [--json] Playwright trace viewer URL',\n ' trace-fetch <runId> [--out <path>] [--json]',\n ' Download trace.zip to disk',\n ' trace-snapshot <runId> [--action <index>] [--output-dir <path>] [--screenshots] [--html]',\n ' Download Playwright trace + reconstruct DOM snapshots',\n ' snapshot <runId> [--out <path>] [--json] Workflow definition that ran (published or draft)',\n ' cache-debug <runId> [--step <id>] [--json]',\n ' Per-step cache compilation + replay details',\n ' variables <runId> [--name <var>] [--json]',\n ' Run-input + captured variables with definition timestamps',\n ' compare <runIdA> <runIdB> [--out <dir>] [--json]',\n ' Diff two runs (steps, thoughts, cache, snapshot)',\n ' bundle <runId> --out <dir> Pull all debug artifacts into one directory',\n ' materialize <runId> [--out <dir>] [--json]',\n ' Materialize the canonical diagnostic workspace (same shape',\n ' the v2 failure-diagnostic agent uses). Start with `summary.md`.',\n '',\n 'Options:',\n ' --workflow <id> Workflow ID (auto-resolved from runId if omitted)',\n ' --json Raw JSON output',\n ' --env <env> Target environment (prod, dev, local)',\n ].join('\\n')\n );\n}\n\nexport async function handleWorkflowDebug(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [maybeSub, ...rest] = argv;\n\n if (!maybeSub || maybeSub === 'help' || hasFlag(argv, '--help', '-h')) {\n printDebugHelp();\n return;\n }\n\n // Bare form: `canary workflow debug <runId>` → overview\n if (looksLikeRunId(maybeSub)) {\n await handleOverview([maybeSub, ...rest], apiUrl, token);\n return;\n }\n\n switch (maybeSub) {\n case 'overview':\n await handleOverview(rest, apiUrl, token);\n return;\n case 'steps':\n await handleSteps(rest, apiUrl, token);\n return;\n case 'cache':\n await handleCache(rest, apiUrl, token);\n return;\n case 'thoughts':\n await handleThoughts(rest, apiUrl, token);\n return;\n case 'navigation':\n await handleNavigation(rest, apiUrl, token);\n return;\n case 'logs':\n await handleLogs(rest, apiUrl, token);\n return;\n case 'trace':\n await handleSentryTrace(rest, apiUrl, token);\n return;\n case 'playwright':\n await handlePlaywright(rest, apiUrl, token);\n return;\n case 'trace-snapshot':\n await handleTraceSnapshot(rest, apiUrl, token);\n return;\n case 'trace-fetch':\n await handleTraceFetch(rest, apiUrl, token);\n return;\n case 'snapshot':\n await handleSnapshot(rest, apiUrl, token);\n return;\n case 'cache-debug':\n await handleCacheDebug(rest, apiUrl, token);\n return;\n case 'variables':\n await handleVariables(rest, apiUrl, token);\n return;\n case 'compare':\n await handleCompare(rest, apiUrl, token);\n return;\n case 'bundle':\n await handleBundle(rest, apiUrl, token);\n return;\n case 'materialize':\n await handleMaterialize(rest, apiUrl, token);\n return;\n default:\n console.error(`Unknown debug sub-command: ${maybeSub}`);\n printDebugHelp();\n process.exit(1);\n }\n}\n\nfunction looksLikeRunId(s: string): boolean {\n // Uuid-ish or prefixed id. Just avoid matching bare sub-commands.\n return !!s && !s.startsWith('-') && s.length >= 8 && !/^[a-z-]+$/i.test(s.slice(0, 8));\n}\n\nfunction requireRunId(argv: string[]): string {\n const runId = argv.find((a) => !a.startsWith('-'));\n if (!runId) {\n console.error('Error: <runId> is required');\n process.exit(1);\n }\n return runId;\n}\n\nasync function resolveWorkflowId(\n argv: string[],\n runId: string,\n apiUrl: string,\n token: string\n): Promise<string> {\n const explicit = getArgValue(argv, '--workflow');\n if (explicit) return explicit;\n const res = await apiRequest<{\n ok: boolean;\n error?: string;\n data?: { runId: string; workflowId: string };\n }>(apiUrl, token, 'GET', `/workflows/runs/${encodeURIComponent(runId)}/lookup`);\n if (res.ok && res.data?.workflowId) return res.data.workflowId;\n console.error(\n `Error: could not resolve workflowId from runId (${res.error ?? 'unknown error'}).`\n );\n console.error(\n ` Pass --workflow <workflowId> explicitly, or run: canary workflow runs list <workflowId>`\n );\n process.exit(1);\n return '';\n}\n\nasync function fetchDebug(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string,\n subpath = ''\n): Promise<Envelope<unknown>> {\n return apiRequest<Envelope<unknown> & { ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/debug${subpath}`\n );\n}\n\nfunction fmtMs(ms: number | null): string {\n if (ms === null) return '—';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nasync function handleOverview(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<RunDebugPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n const d = res.data;\n console.log(`Run ${d.run.id.slice(0, 8)} · ${d.run.status} · ${fmtMs(d.run.durationMs)}`);\n if (d.run.errorMessage) console.log(` error: ${d.run.errorMessage}`);\n console.log(\n ` cache: ${Math.round(d.cache.hitRate * 100)}% hit (${d.cache.hitCount}/${d.cache.hitCount + d.cache.missCount})`\n );\n console.log(` thoughts: ${d.thoughts.count} recorded`);\n console.log(\n ` playwright trace: ${d.playwright.traceStorageKey ? 'available' : 'not captured'}`\n );\n\n if (d.diagnosis.failedSteps.length > 0) {\n console.log('\\nFailed steps:');\n for (const s of d.diagnosis.failedSteps) {\n console.log(` ✗ ${s.name ?? s.stepId.slice(0, 8)} ${s.errorMessage ?? ''}`);\n }\n }\n if (d.diagnosis.slowestSteps.length > 0) {\n console.log('\\nSlowest steps:');\n for (const s of d.diagnosis.slowestSteps) {\n console.log(` · ${s.name ?? s.stepId.slice(0, 8)} ${fmtMs(s.durationMs)}`);\n }\n }\n if (d.diagnosis.cacheMissHotspots.length > 0) {\n console.log('\\nCache miss hotspots:');\n for (const s of d.diagnosis.cacheMissHotspots) {\n console.log(` · ${s.stepId.slice(0, 8)} ${s.reason}`);\n }\n }\n\n console.log('\\nNext:');\n console.log(\n ` canary workflow debug steps ${runId} --slow # timings`\n );\n console.log(\n ` canary workflow debug cache ${runId} --misses-only # cache diagnosis`\n );\n console.log(\n ` canary workflow debug thoughts ${runId} --step <id> # agent reasoning`\n );\n console.log(\n ` canary workflow debug trace-snapshot ${runId} # DOM the agent saw`\n );\n}\n\nasync function handleSteps(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/steps')) as Envelope<{\n steps: RunDebugStep[];\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const steps = [...res.data.steps];\n if (hasFlag(argv, '--slow')) {\n steps.sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0));\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(steps, null, 2));\n return;\n }\n console.log('STEP STATUS DURATION CACHE');\n for (const s of steps) {\n const name = (s.name ?? s.id.slice(0, 8)).padEnd(28).slice(0, 28);\n const status = s.status.padEnd(10);\n const dur = fmtMs(s.durationMs).padEnd(10);\n const cache = s.cacheHitSource ?? (s.cacheOutcome ?? '—');\n console.log(`${name} ${status} ${dur} ${cache}`);\n if (s.errorMessage) console.log(` ↳ ${s.errorMessage}`);\n }\n}\n\ntype NavigationEntry = {\n timestampMs: number;\n isoTimestamp: string | null;\n url: string;\n hostname: string | null;\n success: boolean;\n};\n\ntype NavigationTransition = {\n fromIndex: number;\n toIndex: number;\n fromHostname: string | null;\n toHostname: string | null;\n fromUrl: string;\n toUrl: string;\n timestampMs: number;\n};\n\ntype NavigationPayload = {\n startTimestamp: string | null;\n entries: NavigationEntry[];\n transitions: NavigationTransition[];\n};\n\nasync function handleNavigation(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(\n apiUrl,\n token,\n workflowId,\n runId,\n '/navigation'\n )) as Envelope<NavigationPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n\n const transitionsOnly = hasFlag(argv, '--transitions-only');\n const payload = res.data;\n\n if (hasFlag(argv, '--json')) {\n console.log(\n JSON.stringify(\n transitionsOnly\n ? { startTimestamp: payload.startTimestamp, transitions: payload.transitions }\n : payload,\n null,\n 2\n )\n );\n return;\n }\n\n if (payload.entries.length === 0) {\n console.log('No navigation events recorded for this run.');\n return;\n }\n\n if (payload.transitions.length > 0) {\n console.log(\n `⚠ ${payload.transitions.length} cross-host transition${payload.transitions.length === 1 ? '' : 's'}:`\n );\n for (const t of payload.transitions) {\n console.log(\n ` ${formatRelMs(t.timestampMs)} ${t.fromHostname} → ${t.toHostname}`\n );\n }\n console.log('');\n }\n\n if (transitionsOnly) return;\n\n const transitionTo = new Set(payload.transitions.map((t) => t.toIndex));\n console.log('TIME HOSTNAME URL');\n payload.entries.forEach((e, idx) => {\n const time = formatRelMs(e.timestampMs).padEnd(12);\n const host = (e.hostname ?? '—').padEnd(25).slice(0, 25);\n const marker = transitionTo.has(idx) ? '→' : ' ';\n console.log(`${time} ${marker} ${host} ${e.url}`);\n });\n}\n\nfunction formatRelMs(ms: number): string {\n if (ms < 0) ms = 0;\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const millis = ms % 1000;\n return `${minutes}:${String(seconds).padStart(2, '0')}.${String(millis).padStart(3, '0')}`;\n}\n\nasync function handleCache(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<RunDebugPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const { cache, steps } = res.data;\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(cache, null, 2));\n return;\n }\n console.log(\n `Cache hit rate: ${Math.round(cache.hitRate * 100)}% (${cache.hitCount} hit, ${cache.missCount} miss)`\n );\n if (Object.keys(cache.bySource).length > 0) {\n console.log('By source:');\n for (const [src, n] of Object.entries(cache.bySource)) {\n console.log(` ${src.padEnd(16)} ${n}`);\n }\n }\n const stepById = new Map(steps.map((s) => [s.id, s]));\n if (!hasFlag(argv, '--misses-only')) {\n console.log('\\nHits:');\n for (const s of steps.filter((x) => x.cacheHitSource)) {\n console.log(` ✓ ${(s.name ?? s.id.slice(0, 8)).padEnd(28)} ${s.cacheHitSource}`);\n }\n }\n if (cache.misses.length > 0) {\n console.log('\\nMisses:');\n for (const m of cache.misses) {\n const s = stepById.get(m.stepId);\n console.log(` ✗ ${(s?.name ?? m.stepId.slice(0, 8)).padEnd(28)} ${m.reason}`);\n }\n }\n}\n\nasync function handleThoughts(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const stepId = getArgValue(argv, '--step');\n const grep = getArgValue(argv, '--grep');\n const qs = stepId ? `?step=${encodeURIComponent(stepId)}` : '';\n const res = (await fetchDebug(\n apiUrl,\n token,\n workflowId,\n runId,\n `/thoughts${qs}`\n )) as Envelope<{\n thoughts: Array<{\n id: string;\n stepId: string | null;\n toolName: string | null;\n content: string;\n orderIndex: number;\n createdAt: string;\n }>;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const totalThoughts = res.data.thoughts.length;\n let thoughts = res.data.thoughts;\n if (grep) {\n const needle = grep.toLowerCase();\n thoughts = thoughts.filter((t) => t.content.toLowerCase().includes(needle));\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(thoughts, null, 2));\n return;\n }\n for (const t of thoughts) {\n const tag = t.toolName ? `[${t.toolName}] ` : '';\n const step = t.stepId ? `step ${t.stepId.slice(0, 8)} ` : '';\n console.log(`${step}${tag}${t.content}`);\n console.log('');\n }\n if (thoughts.length === 0) {\n if (totalThoughts === 0) {\n const scope = stepId ? ` for step ${stepId.slice(0, 8)}` : '';\n console.log(`(no thoughts recorded${scope})`);\n } else if (grep) {\n console.log(\n `(no thoughts matched --grep \"${grep}\"; ${totalThoughts} total thought${totalThoughts === 1 ? '' : 's'} in scope)`\n );\n } else {\n console.log('(no thoughts to display)');\n }\n }\n}\n\nasync function handleLogs(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const level = getArgValue(argv, '--level');\n const stepId = getArgValue(argv, '--step');\n const params = new URLSearchParams();\n if (level) params.set('level', level);\n if (stepId) params.set('step', stepId);\n const qs = params.toString() ? `?${params.toString()}` : '';\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, `/logs${qs}`)) as Envelope<{\n rows: Array<{ timestamp: string; level: string; message: string }>;\n partial: boolean;\n reason: string | null;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n if (res.data.partial) {\n console.log(`(partial result: ${res.data.reason ?? 'unknown'})`);\n }\n for (const row of res.data.rows) {\n console.log(`${row.timestamp} ${row.level.padEnd(8)} ${row.message}`);\n }\n if (res.data.rows.length === 0 && !res.data.partial) {\n console.log('(no logs)');\n }\n}\n\nasync function handleSentryTrace(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const stepId = getArgValue(argv, '--step');\n const qs = stepId ? `?step=${encodeURIComponent(stepId)}` : '';\n const res = (await fetchDebug(\n apiUrl,\n token,\n workflowId,\n runId,\n `/sentry-trace${qs}`\n )) as Envelope<{\n traceId: string | null;\n spans: Array<{\n spanId: string;\n parentSpanId: string | null;\n op: string | null;\n description: string | null;\n durationMs: number | null;\n }>;\n partial: boolean;\n reason: string | null;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n if (res.data.partial) {\n console.log(`(partial result: ${res.data.reason ?? 'unknown'})`);\n }\n if (res.data.traceId) console.log(`trace ${res.data.traceId}`);\n for (const span of res.data.spans) {\n const op = (span.op ?? 'span').padEnd(22);\n const desc = (span.description ?? '').padEnd(40);\n const dur = span.durationMs !== null ? `${span.durationMs}ms` : '';\n console.log(` ${op} ${desc} ${dur}`);\n }\n if (res.data.spans.length === 0 && !res.data.partial) {\n console.log('(no spans)');\n }\n}\n\nasync function handlePlaywright(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n viewerUrl: string;\n signedUrl: string;\n storageKey: string;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(res.data, null, 2));\n return;\n }\n console.log(res.data.viewerUrl);\n if (hasFlag(argv, '--open')) {\n const opener =\n process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n const { spawn } = await import('node:child_process');\n spawn(opener, [res.data.viewerUrl], { detached: true, stdio: 'ignore' }).unref();\n }\n}\n\nasync function handleTraceSnapshot(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const runId = requireRunId(argv);\n if (getArgValue(argv, '--step')) {\n console.error(\n 'Error: trace-snapshot --step is not supported by the local trace reconstructor. Use --action <0-based trace action index> or omit filtering.'\n );\n process.exit(1);\n }\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n signedUrl: string;\n storageKey: string;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n\n // Download into a stable temp path so `canary trace snapshot` can open it.\n const tmp = await fs.mkdtemp(path.join(os.tmpdir(), `canary-trace-${runId}-`));\n const traceFile = path.join(tmp, 'trace.zip');\n const download = await fetch(res.data.signedUrl);\n if (!download.ok) {\n console.error(`Failed to download trace: HTTP ${download.status}`);\n process.exit(1);\n }\n const buf = Buffer.from(await download.arrayBuffer());\n await fs.writeFile(traceFile, buf);\n\n const forwarded: string[] = ['snapshot', traceFile];\n for (const flag of ['--output-dir', '--filter', '--action']) {\n const v = getArgValue(argv, flag);\n if (v !== undefined) forwarded.push(flag, v);\n }\n if (hasFlag(argv, '--screenshots')) forwarded.push('--screenshots');\n if (hasFlag(argv, '--html')) forwarded.push('--html');\n\n await runTrace(forwarded);\n}\n\n/**\n * `trace-fetch` — download the raw `trace.zip` to a chosen path.\n *\n * Distinct from `playwright` (prints/opens viewer URL) and `trace-snapshot`\n * (downloads to a tmp dir and pipes into `canary trace snapshot`). Use this\n * when you just want the file on disk for `unzip`, vendoring into a ticket,\n * or feeding to another tool.\n */\nasync function handleTraceFetch(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n signedUrl: string;\n storageKey: string;\n }>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const out = getArgValue(argv, '--out') ?? `./trace-${runId}.zip`;\n const download = await fetch(res.data.signedUrl);\n if (!download.ok) {\n console.error(`Failed to download trace: HTTP ${download.status}`);\n process.exit(1);\n }\n const buf = Buffer.from(await download.arrayBuffer());\n await fs.writeFile(out, buf);\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ path: out, storageKey: res.data.storageKey }, null, 2));\n return;\n }\n console.log(out);\n}\n\ntype RunDetailResponse = {\n ok?: boolean;\n error?: string;\n run?: {\n id: string;\n workflowId: string;\n snapshotVersion: number | null;\n draftSnapshot: { id: string; version: string; basePublishedVersion: number } | null;\n };\n};\n\nasync function fetchRunDetail(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string\n): Promise<RunDetailResponse['run']> {\n const res = await apiRequest<RunDetailResponse & { ok: boolean }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}`\n );\n if (!res.run) {\n console.error(`Failed to load run: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n return res.run;\n}\n\n/**\n * `snapshot` — fetch the workflow definition that ran for this runId.\n *\n * Resolves to either a published snapshot (`snapshotVersion`) or a draft\n * snapshot (`draftSnapshotId.version`) by looking at the run record, then\n * fetches the corresponding `snapshotJson`. Useful for \"what was the workflow\n * when this ran?\" and as the input to `diff` for two runs.\n */\nasync function handleSnapshot(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const run = await fetchRunDetail(apiUrl, token, workflowId, runId);\n if (!run) return;\n\n let snapshotPath: string;\n let kind: 'published' | 'draft';\n if (run.draftSnapshot) {\n snapshotPath = `/workflows/${encodeURIComponent(workflowId)}/draft-snapshots/${encodeURIComponent(run.draftSnapshot.version)}`;\n kind = 'draft';\n } else if (run.snapshotVersion !== null && run.snapshotVersion !== undefined) {\n snapshotPath = `/workflows/${encodeURIComponent(workflowId)}/snapshots/${run.snapshotVersion}`;\n kind = 'published';\n } else {\n console.error('Run has no snapshotVersion or draftSnapshotId — cannot resolve definition.');\n process.exit(1);\n }\n\n const snap = await apiRequest<{ ok: boolean; error?: string; snapshot?: { snapshotJson: unknown; version: number | string; name?: string | null } }>(\n apiUrl,\n token,\n 'GET',\n snapshotPath\n );\n if (!snap.snapshot) {\n console.error(`Failed to load snapshot: ${snap.error ?? 'unknown error'}`);\n process.exit(1);\n }\n\n const out = getArgValue(argv, '--out');\n const text = JSON.stringify(snap.snapshot.snapshotJson, null, 2);\n if (out) {\n await fs.writeFile(out, text);\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ path: out, kind, version: snap.snapshot.version }, null, 2));\n } else {\n console.log(`${kind} snapshot v${snap.snapshot.version} → ${out}`);\n }\n return;\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ kind, version: snap.snapshot.version, snapshotJson: snap.snapshot.snapshotJson }, null, 2));\n return;\n }\n console.log(text);\n}\n\ntype VariablesPayload = {\n inputs: Array<{\n name: string;\n value: string;\n definedAt: string;\n source: 'run-input';\n }>;\n captures: Array<{\n name: string;\n value: string;\n definedAt: string;\n source: 'capture';\n stepId: string;\n nodeId: string;\n nodeName: string | null;\n }>;\n};\n\n/**\n * `variables` — list run-time variables and where each one was defined.\n *\n * Two sections: workflow-level inputs (defined at run start) and per-step\n * captures (defined when the agent's saveAs directive fires). Use this to\n * answer \"what was {{var}} when this ran, and which step set it?\"\n */\nasync function handleVariables(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/variables')) as Envelope<VariablesPayload>;\n if (!res.ok) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const filter = getArgValue(argv, '--name');\n const data: VariablesPayload = filter\n ? {\n inputs: res.data.inputs.filter((v) => v.name === filter),\n captures: res.data.captures.filter((v) => v.name === filter),\n }\n : res.data;\n\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n const fmtValue = (v: string) => (v.length > 80 ? `${v.slice(0, 77)}...` : v);\n\n console.log(`Run inputs (${data.inputs.length})`);\n if (data.inputs.length === 0) {\n console.log(' (none)');\n } else {\n for (const v of data.inputs) {\n console.log(` ${v.name} = ${fmtValue(v.value)} [defined ${v.definedAt}]`);\n }\n }\n\n console.log('');\n console.log(`Captures (${data.captures.length})`);\n if (data.captures.length === 0) {\n console.log(' (none)');\n } else {\n for (const v of data.captures) {\n const where = v.nodeName ? `${v.nodeName} (${v.stepId})` : v.stepId;\n console.log(` ${v.name} = ${fmtValue(v.value)} [${v.definedAt} · ${where}]`);\n }\n }\n}\n\ntype CacheDebugResponse = {\n ok?: boolean;\n error?: string;\n cache?: unknown;\n steps?: Array<Record<string, unknown>>;\n debugSnapshots?: unknown[];\n};\ntype CacheDebugEnvelope = CacheDebugResponse & { ok: boolean; data?: CacheDebugResponse };\n\n/**\n * `cache-debug` — wrap the cache-debug endpoint.\n *\n * Exposes per-step cache compilation, attempted selectors, resolution results,\n * and a11y snapshots from `workflow_cache_debug_snapshots`. This is the data\n * that powers the cache outcomes tab in the web debug view.\n */\nasync function handleCacheDebug(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const res = await apiRequest<CacheDebugEnvelope>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/cache-debug`\n );\n if (res.ok === false) {\n console.error(`Failed: ${res.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const stepFilter = getArgValue(argv, '--step');\n const payload = res.data ?? res;\n const data: CacheDebugResponse = stepFilter\n ? {\n ...payload,\n steps: (payload.steps ?? []).filter(\n (s) => s['stepId'] === stepFilter || s['nodeId'] === stepFilter\n ),\n }\n : payload;\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n console.log(JSON.stringify(data, null, 2));\n}\n\ntype StepLite = { id: string; nodeId: string; name: string | null; status: string; durationMs: number | null; cacheHitSource: string | null; cacheOutcome: string | null; errorMessage: string | null };\ntype ThoughtLite = { id: string; stepId: string | null; content: string; toolName: string | null; orderIndex: number };\ntype RunBundle = {\n runId: string;\n overview: RunDebugPayload;\n steps: StepLite[];\n thoughts: ThoughtLite[];\n};\n\nasync function loadRunBundle(apiUrl: string, token: string, workflowId: string, runId: string): Promise<RunBundle> {\n const overview = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<RunDebugPayload>;\n if (!overview.ok) {\n console.error(`Failed to load run ${runId}: ${overview.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const stepsRes = (await fetchDebug(apiUrl, token, workflowId, runId, '/steps')) as Envelope<{ steps: StepLite[] }>;\n const thoughtsRes = (await fetchDebug(apiUrl, token, workflowId, runId, '/thoughts')) as Envelope<{ thoughts: ThoughtLite[] }>;\n return {\n runId,\n overview: overview.data,\n steps: stepsRes.ok ? stepsRes.data.steps : [],\n thoughts: thoughtsRes.ok ? thoughtsRes.data.thoughts : [],\n };\n}\n\n/**\n * `compare` — structural diff between two runs.\n *\n * Aligns steps by nodeId; reports status/duration/cacheHitSource flips and\n * thought additions at diverging steps. Output is a JSON document the skill\n * can read and reason over (no LLM summarization in the CLI itself). With\n * `--out`, also pulls `trace.zip` and the snapshot JSON for both runs into\n * `<dir>/runA/` and `<dir>/runB/` for offline visual inspection.\n */\nasync function handleCompare(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error('Usage: canary workflow debug compare <runIdA> <runIdB> [--workflow <id>] [--out <dir>] [--json]');\n process.exit(1);\n }\n const [runA, runB] = positional;\n const workflowId = await resolveWorkflowId(argv, runA, apiUrl, token);\n\n const [a, b] = await Promise.all([\n loadRunBundle(apiUrl, token, workflowId, runA),\n loadRunBundle(apiUrl, token, workflowId, runB),\n ]);\n\n const stepsByNode = (steps: StepLite[]) => {\n const m = new Map<string, StepLite>();\n for (const s of steps) m.set(s.nodeId, s);\n return m;\n };\n const aMap = stepsByNode(a.steps);\n const bMap = stepsByNode(b.steps);\n const allNodes = new Set([...aMap.keys(), ...bMap.keys()]);\n\n const stepDiffs: Array<{\n nodeId: string;\n name: string | null;\n statusA: string | null;\n statusB: string | null;\n durationA: number | null;\n durationB: number | null;\n durationDeltaPct: number | null;\n cacheA: string | null;\n cacheB: string | null;\n flipped: string[];\n }> = [];\n\n for (const nodeId of allNodes) {\n const sa = aMap.get(nodeId) ?? null;\n const sb = bMap.get(nodeId) ?? null;\n const flipped: string[] = [];\n if ((sa?.status ?? null) !== (sb?.status ?? null)) flipped.push('status');\n if ((sa?.cacheHitSource ?? null) !== (sb?.cacheHitSource ?? null)) flipped.push('cache');\n const durA = sa?.durationMs ?? null;\n const durB = sb?.durationMs ?? null;\n let durationDeltaPct: number | null = null;\n if (durA !== null && durB !== null && durA > 0) {\n durationDeltaPct = Math.round(((durB - durA) / durA) * 100);\n if (Math.abs(durationDeltaPct) >= 100) flipped.push('duration');\n }\n if (flipped.length > 0 || !sa || !sb) {\n stepDiffs.push({\n nodeId,\n name: sa?.name ?? sb?.name ?? null,\n statusA: sa?.status ?? null,\n statusB: sb?.status ?? null,\n durationA: durA,\n durationB: durB,\n durationDeltaPct,\n cacheA: sa?.cacheHitSource ?? null,\n cacheB: sb?.cacheHitSource ?? null,\n flipped: !sa ? ['only-in-B'] : !sb ? ['only-in-A'] : flipped,\n });\n }\n }\n\n // Thought delta at diverging nodes\n const thoughtsByStep = (bundle: RunBundle) => {\n const m = new Map<string, ThoughtLite[]>();\n for (const t of bundle.thoughts) {\n const key = t.stepId ?? '';\n const arr = m.get(key) ?? [];\n arr.push(t);\n m.set(key, arr);\n }\n return m;\n };\n const aThoughts = thoughtsByStep(a);\n const bThoughts = thoughtsByStep(b);\n const thoughtDeltas = stepDiffs.map((d) => {\n const sa = aMap.get(d.nodeId);\n const sb = bMap.get(d.nodeId);\n return {\n nodeId: d.nodeId,\n thoughtsA: sa ? (aThoughts.get(sa.id)?.map((t) => t.content) ?? []) : [],\n thoughtsB: sb ? (bThoughts.get(sb.id)?.map((t) => t.content) ?? []) : [],\n };\n });\n\n const result = {\n runA,\n runB,\n workflowId,\n cacheHitRateDelta: b.overview.cache.hitRate - a.overview.cache.hitRate,\n statusA: a.overview.run.status,\n statusB: b.overview.run.status,\n durationA: a.overview.run.durationMs,\n durationB: b.overview.run.durationMs,\n stepDiffs,\n thoughtDeltas,\n };\n\n const outDir = getArgValue(argv, '--out');\n if (outDir) {\n await fs.mkdir(outDir, { recursive: true });\n await fs.writeFile(path.join(outDir, 'compare.json'), JSON.stringify(result, null, 2));\n for (const [label, runId] of [['runA', runA], ['runB', runB]] as const) {\n const sub = path.join(outDir, label);\n await fs.mkdir(sub, { recursive: true });\n await tryWriteSnapshot(apiUrl, token, workflowId, runId, path.join(sub, 'snapshot.json'));\n await tryWriteTrace(apiUrl, token, workflowId, runId, path.join(sub, 'trace.zip'));\n }\n if (!hasFlag(argv, '--json')) console.log(`Wrote compare bundle to ${outDir}`);\n }\n\n if (hasFlag(argv, '--json') || !outDir) {\n console.log(JSON.stringify(result, null, 2));\n }\n}\n\nasync function tryWriteTrace(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string,\n outPath: string\n): Promise<void> {\n const res = (await fetchDebug(apiUrl, token, workflowId, runId, '/trace')) as Envelope<{\n signedUrl: string;\n }>;\n if (!res.ok) return;\n const dl = await fetch(res.data.signedUrl);\n if (!dl.ok) return;\n await fs.writeFile(outPath, Buffer.from(await dl.arrayBuffer()));\n}\n\nasync function tryWriteSnapshot(\n apiUrl: string,\n token: string,\n workflowId: string,\n runId: string,\n outPath: string\n): Promise<void> {\n const run = await fetchRunDetail(apiUrl, token, workflowId, runId);\n if (!run) return;\n const snapPath = run.draftSnapshot\n ? `/workflows/${encodeURIComponent(workflowId)}/draft-snapshots/${encodeURIComponent(run.draftSnapshot.version)}`\n : run.snapshotVersion !== null && run.snapshotVersion !== undefined\n ? `/workflows/${encodeURIComponent(workflowId)}/snapshots/${run.snapshotVersion}`\n : null;\n if (!snapPath) return;\n const snap = await apiRequest<{ ok: boolean; snapshot?: { snapshotJson: unknown } }>(\n apiUrl,\n token,\n 'GET',\n snapPath\n );\n if (!snap.snapshot) return;\n await fs.writeFile(outPath, JSON.stringify(snap.snapshot.snapshotJson, null, 2));\n}\n\n/**\n * `bundle` — pull every artifact for a run into one directory.\n *\n * Writes overview/steps/cache/thoughts/variables JSON, snapshot JSON, and\n * trace.zip. Logs/sentry-trace are best-effort (skipped if SENTRY_API_TOKEN\n * is not configured on the API). Produces a `bundle.json` manifest. Designed\n * for offline triage and ticket attachments.\n */\nasync function handleBundle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const outDir = getArgValue(argv, '--out');\n if (!outDir) {\n console.error('Error: --out <dir> is required');\n process.exit(1);\n }\n await fs.mkdir(outDir, { recursive: true });\n\n const manifest: Array<{ file: string; source: string; ok: boolean; error?: string }> = [];\n\n const writeJson = async (file: string, source: string, fetcher: () => Promise<unknown>) => {\n try {\n const data = await fetcher();\n await fs.writeFile(path.join(outDir, file), JSON.stringify(data, null, 2));\n manifest.push({ file, source, ok: true });\n } catch (err) {\n manifest.push({ file, source, ok: false, error: String(err) });\n }\n };\n\n await writeJson('overview.json', `GET /workflows/${workflowId}/runs/${runId}/debug`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId)) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('steps.json', `/debug/steps`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/steps')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('thoughts.json', `/debug/thoughts`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/thoughts')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('cache-debug.json', `/cache-debug`, async () => {\n const r = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/cache-debug`\n );\n if (r.ok === false) throw new Error(r.error ?? 'failed');\n return r;\n });\n await writeJson('logs.json', `/debug/logs`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/logs')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('sentry-trace.json', `/debug/sentry-trace`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/sentry-trace')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n await writeJson('variables.json', `/debug/variables`, async () => {\n const r = (await fetchDebug(apiUrl, token, workflowId, runId, '/variables')) as Envelope<unknown>;\n if (!r.ok) throw new Error(r.error ?? 'failed');\n return r.data;\n });\n\n // Snapshot JSON\n try {\n await tryWriteSnapshot(apiUrl, token, workflowId, runId, path.join(outDir, 'snapshot.json'));\n manifest.push({ file: 'snapshot.json', source: 'snapshots/:version', ok: true });\n } catch (err) {\n manifest.push({ file: 'snapshot.json', source: 'snapshots/:version', ok: false, error: String(err) });\n }\n\n // trace.zip\n try {\n await tryWriteTrace(apiUrl, token, workflowId, runId, path.join(outDir, 'trace.zip'));\n manifest.push({ file: 'trace.zip', source: '/debug/trace', ok: true });\n } catch (err) {\n manifest.push({ file: 'trace.zip', source: '/debug/trace', ok: false, error: String(err) });\n }\n\n await fs.writeFile(path.join(outDir, 'bundle.json'), JSON.stringify({ runId, workflowId, manifest }, null, 2));\n console.log(`Wrote bundle to ${outDir}`);\n for (const m of manifest) {\n console.log(` ${m.ok ? '✓' : '✗'} ${m.file}${m.ok ? '' : ` (${m.error ?? 'failed'})`}`);\n }\n}\n\n/**\n * `materialize` — produce the canonical diagnostic workspace on disk.\n *\n * The same workspace shape powers the v2 failure-diagnostic agent and the\n * Claude Code `debug-run` skill. Pipeline:\n * 1. CLI hits `/debug/materialize-data` → receives `RunData` JSON + a signed\n * S3 URL for trace.zip.\n * 2. CLI downloads trace.zip via the signed URL.\n * 3. CLI runs `assembleWorkspace` from `@chatsdet/diagnostic-workspace` locally.\n * This is the same code the server runs in-process for the v2 agent —\n * no drift possible.\n *\n * Trace reconstruction (Playwright headless) runs on the customer's machine,\n * not the server. After this command completes, start with `summary.md`.\n */\nasync function handleMaterialize(argv: string[], apiUrl: string, token: string): Promise<void> {\n const runId = requireRunId(argv);\n const workflowId = await resolveWorkflowId(argv, runId, apiUrl, token);\n const outDir = getArgValue(argv, '--out') ?? `./diag-${runId}`;\n\n const { assembleWorkspace } = await import('@chatsdet/diagnostic-workspace');\n\n type MaterializeDataResponse = {\n ok: true;\n data: { runData: import('@chatsdet/diagnostic-workspace').RunData; signedTraceUrl: string | null };\n } | { ok: false; error?: string };\n\n const dataUrl = `${apiUrl}/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/debug/materialize-data`;\n const dataRes = await fetch(dataUrl, { headers: { Authorization: `Bearer ${token}` } });\n if (!dataRes.ok) {\n const errText = await dataRes.text().catch(() => '');\n console.error(`Failed to fetch run data: HTTP ${dataRes.status} ${errText}`);\n process.exit(1);\n }\n const envelope = (await dataRes.json()) as MaterializeDataResponse;\n if (!envelope.ok) {\n console.error(`Failed: ${envelope.error ?? 'unknown error'}`);\n process.exit(1);\n }\n const { runData, signedTraceUrl } = envelope.data;\n\n await fs.mkdir(outDir, { recursive: true });\n\n // Download trace.zip locally so the assembler can copy + reconstruct it.\n // Stream the body to disk — trace.zip can be 200MB+ and customer CI runners\n // are commonly memory-constrained.\n let traceZipPath: string | null = null;\n if (signedTraceUrl) {\n traceZipPath = path.join(outDir, '.trace-source.zip');\n const traceRes = await fetch(signedTraceUrl);\n if (!traceRes.ok || !traceRes.body) {\n console.warn(`Trace download failed (HTTP ${traceRes.status}); workspace will be marked partial.`);\n traceZipPath = null;\n } else {\n const handle = await fs.open(traceZipPath, 'w');\n try {\n const reader = traceRes.body.getReader();\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n if (value) await handle.write(value);\n }\n } finally {\n await handle.close();\n }\n }\n }\n\n await assembleWorkspace({ runData, workspaceRoot: outDir, traceZipPath });\n\n if (traceZipPath) {\n await fs.rm(traceZipPath, { force: true }).catch(() => undefined);\n }\n\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify({ workspace: outDir, runId, workflowId }, null, 2));\n return;\n }\n console.log(`Materialized workspace at ${outDir}`);\n console.log(`Start with: cat ${path.join(outDir, 'summary.md')}`);\n}\n"],"mappings":"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","names":["a"]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
apiRequest
|
|
4
|
+
} from "./chunk-UAJUZLDE.js";
|
|
5
|
+
import "./chunk-3CZU7XCS.js";
|
|
2
6
|
import {
|
|
3
7
|
diffSnapshots,
|
|
4
8
|
fromApiSnapshot,
|
|
5
9
|
getNodeDisplayTitle
|
|
6
10
|
} from "./chunk-JDBCZ3Z2.js";
|
|
7
|
-
import {
|
|
8
|
-
apiRequest
|
|
9
|
-
} from "./chunk-CFJXYPTF.js";
|
|
10
|
-
import "./chunk-3CZU7XCS.js";
|
|
11
11
|
import {
|
|
12
12
|
getArgValue,
|
|
13
13
|
hasFlag
|
|
14
14
|
} from "./chunk-IGHDIWZU.js";
|
|
15
15
|
import "./chunk-32P26BZT.js";
|
|
16
16
|
import "./chunk-JWHYXEA2.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-GZVCNYR4.js";
|
|
18
18
|
import "./chunk-VKVL7WBN.js";
|
|
19
19
|
|
|
20
20
|
// src/workflow-proposals.ts
|
|
@@ -378,4 +378,4 @@ export {
|
|
|
378
378
|
_internalsForTesting,
|
|
379
379
|
handleWorkflowProposals
|
|
380
380
|
};
|
|
381
|
-
//# sourceMappingURL=workflow-proposals-
|
|
381
|
+
//# sourceMappingURL=workflow-proposals-67AVGMHX.js.map
|