@runcofactor/cli 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/{account-22LMP5PX.js → account-62I7FG5G.js} +5 -5
  2. package/dist/{api-catalog-WTFQNLK6.js → api-catalog-CAJUASVC.js} +5 -5
  3. package/dist/{attachment-U3NKVPEY.js → attachment-RL4AZUJE.js} +5 -5
  4. package/dist/{augmentor-5GMNAX4M.js → augmentor-GAF3MFY6.js} +5 -5
  5. package/dist/{auth-VQG2CDUD.js → auth-DURHUZDW.js} +3 -3
  6. package/dist/{chunk-7VMO2WOZ.js → chunk-26U3DGUM.js} +2 -2
  7. package/dist/{chunk-JMJVGMXI.js → chunk-32P26BZT.js} +2 -2
  8. package/dist/chunk-32P26BZT.js.map +1 -0
  9. package/dist/{chunk-VGYN2KU2.js → chunk-5R4HMSNX.js} +69 -9
  10. package/dist/chunk-5R4HMSNX.js.map +1 -0
  11. package/dist/{chunk-46IUJXSD.js → chunk-AQPJQ5AE.js} +2 -2
  12. package/dist/{chunk-PRBRSIZP.js → chunk-CFJXYPTF.js} +3 -3
  13. package/dist/{chunk-UETBLPKM.js → chunk-CJEKEW7R.js} +3 -3
  14. package/dist/{chunk-CMGI7UZD.js → chunk-G5SXUXSU.js} +3 -3
  15. package/dist/{chunk-XJ5YYYGC.js → chunk-HKQ5XQAQ.js} +4 -4
  16. package/dist/{chunk-3X3NW7QA.js → chunk-IGHDIWZU.js} +2 -2
  17. package/dist/{chunk-JYGNMKZ5.js → chunk-IWKJQZJQ.js} +115 -92
  18. package/dist/chunk-IWKJQZJQ.js.map +1 -0
  19. package/dist/{chunk-KCHKFYVX.js → chunk-PXFDH6YL.js} +34 -1
  20. package/dist/{chunk-KCHKFYVX.js.map → chunk-PXFDH6YL.js.map} +1 -1
  21. package/dist/{chunk-HDFYUFBI.js → chunk-UZ2ZA5A6.js} +2 -2
  22. package/dist/{chunk-FNPMWDUQ.js → chunk-VKBTI5EF.js} +3 -3
  23. package/dist/{chunk-NHTEKEYE.js → chunk-ZXRVFFCY.js} +3 -3
  24. package/dist/{credential-E6KUHRGU.js → credential-JGVSEGVH.js} +5 -5
  25. package/dist/{credential-template-4GPOPBGD.js → credential-template-CWWMOKB2.js} +5 -5
  26. package/dist/{debug-workflow-XCLCY6S7.js → debug-workflow-BXRU72YZ.js} +5 -5
  27. package/dist/{docs-COCZYMW6.js → docs-PVBXPTGR.js} +5 -5
  28. package/dist/{doctor-ERIVTCQS.js → doctor-RHMKD4W5.js} +3 -3
  29. package/dist/{environment-7Y4BV6XY.js → environment-WZKIO3R3.js} +5 -5
  30. package/dist/{feature-flag-MHONEX6T.js → feature-flag-K5REGGDY.js} +5 -5
  31. package/dist/index.js +45 -45
  32. package/dist/{init-OROOM4HF.js → init-FFUZO5D7.js} +5 -5
  33. package/dist/{install-OJFXHY6U.js → install-XRKEQAFZ.js} +5 -5
  34. package/dist/{issues-32GONR6C.js → issues-I3V6GEXU.js} +5 -5
  35. package/dist/{knobs-UQGGY3CP.js → knobs-6WLJMB44.js} +5 -5
  36. package/dist/{list-ZMIKEC5P.js → list-PHC7VYNS.js} +5 -5
  37. package/dist/{local-PUD24GGQ.js → local-VGYRSW22.js} +7 -7
  38. package/dist/{login-BSO7YX2D.js → login-QPU2BKG2.js} +5 -5
  39. package/dist/{mcp-4LS7OJUT.js → mcp-LA452TOA.js} +8 -8
  40. package/dist/{product-3JKSJCBC.js → product-RSZV5HMB.js} +5 -5
  41. package/dist/{property-K5DBL4UE.js → property-YP4GHQAR.js} +5 -5
  42. package/dist/{psql-PQFUFTSE.js → psql-XGLBI6T7.js} +3 -3
  43. package/dist/{record-EIIYLFJ4.js → record-KWKHP2ZY.js} +6 -6
  44. package/dist/{redis-BU36EZZI.js → redis-VJGCUJPV.js} +3 -3
  45. package/dist/{release-LYC2P7DZ.js → release-NDRHPW6V.js} +5 -5
  46. package/dist/{sandbox-CKHXXZHU.js → sandbox-OOCANWOG.js} +5 -5
  47. package/dist/{scenarios-2XJ2G3KR.js → scenarios-2HRLCGFY.js} +5 -5
  48. package/dist/{session-UTOD5ZYH.js → session-M4ULYDYP.js} +7 -7
  49. package/dist/{skill-GMAERMQL.js → skill-4DGPRDUC.js} +2 -2
  50. package/dist/skills/optimize-cache/SKILL.md +26 -10
  51. package/dist/{spec-2NP36U3Y.js → spec-XZ2TKUFZ.js} +5 -5
  52. package/dist/{src-UEOOC425.js → src-7LAXXTVG.js} +34 -6
  53. package/dist/{src-UEOOC425.js.map → src-7LAXXTVG.js.map} +1 -1
  54. package/dist/{src-CG52HEE7.js → src-CV57ZD6I.js} +3 -3
  55. package/dist/{src-4T6GHXVO.js → src-HL7HEJIW.js} +2 -2
  56. package/dist/{src-PK5OZXCM.js → src-OU7544PM.js} +6 -4
  57. package/dist/{start-3C7EEFW2.js → start-IYKF3C3X.js} +5 -5
  58. package/dist/{tag-JSHOMLBR.js → tag-T45MMSCH.js} +6 -6
  59. package/dist/{task-YGWVYTBJ.js → task-MCUHAVTD.js} +5 -5
  60. package/dist/{test-suite-LI7ZH367.js → test-suite-BICBRSBP.js} +7 -7
  61. package/dist/{trace-UMLOSIIR.js → trace-2BAPMYAS.js} +6 -6
  62. package/dist/{triage-ZWJG4NBJ.js → triage-M3RZ2ASB.js} +6 -6
  63. package/dist/{upgrade-S7CGEK6H.js → upgrade-4QCRAUHP.js} +3 -3
  64. package/dist/{workflow-T4HSAOGW.js → workflow-ZGJU4QCV.js} +11 -11
  65. package/dist/{workflow-cache-XVEZ36KF.js → workflow-cache-M4N325UT.js} +26 -13
  66. package/dist/workflow-cache-M4N325UT.js.map +1 -0
  67. package/dist/{workflow-debug-T2BULXZ7.js → workflow-debug-W4USZH35.js} +8 -8
  68. package/dist/{workflow-proposals-XXEZICN2.js → workflow-proposals-5E3DTYZB.js} +5 -5
  69. package/package.json +5 -1
  70. package/dist/chunk-JMJVGMXI.js.map +0 -1
  71. package/dist/chunk-JYGNMKZ5.js.map +0 -1
  72. package/dist/chunk-VGYN2KU2.js.map +0 -1
  73. package/dist/workflow-cache-XVEZ36KF.js.map +0 -1
  74. /package/dist/{account-22LMP5PX.js.map → account-62I7FG5G.js.map} +0 -0
  75. /package/dist/{api-catalog-WTFQNLK6.js.map → api-catalog-CAJUASVC.js.map} +0 -0
  76. /package/dist/{attachment-U3NKVPEY.js.map → attachment-RL4AZUJE.js.map} +0 -0
  77. /package/dist/{augmentor-5GMNAX4M.js.map → augmentor-GAF3MFY6.js.map} +0 -0
  78. /package/dist/{auth-VQG2CDUD.js.map → auth-DURHUZDW.js.map} +0 -0
  79. /package/dist/{chunk-7VMO2WOZ.js.map → chunk-26U3DGUM.js.map} +0 -0
  80. /package/dist/{chunk-46IUJXSD.js.map → chunk-AQPJQ5AE.js.map} +0 -0
  81. /package/dist/{chunk-PRBRSIZP.js.map → chunk-CFJXYPTF.js.map} +0 -0
  82. /package/dist/{chunk-UETBLPKM.js.map → chunk-CJEKEW7R.js.map} +0 -0
  83. /package/dist/{chunk-CMGI7UZD.js.map → chunk-G5SXUXSU.js.map} +0 -0
  84. /package/dist/{chunk-XJ5YYYGC.js.map → chunk-HKQ5XQAQ.js.map} +0 -0
  85. /package/dist/{chunk-3X3NW7QA.js.map → chunk-IGHDIWZU.js.map} +0 -0
  86. /package/dist/{chunk-HDFYUFBI.js.map → chunk-UZ2ZA5A6.js.map} +0 -0
  87. /package/dist/{chunk-FNPMWDUQ.js.map → chunk-VKBTI5EF.js.map} +0 -0
  88. /package/dist/{chunk-NHTEKEYE.js.map → chunk-ZXRVFFCY.js.map} +0 -0
  89. /package/dist/{credential-E6KUHRGU.js.map → credential-JGVSEGVH.js.map} +0 -0
  90. /package/dist/{credential-template-4GPOPBGD.js.map → credential-template-CWWMOKB2.js.map} +0 -0
  91. /package/dist/{debug-workflow-XCLCY6S7.js.map → debug-workflow-BXRU72YZ.js.map} +0 -0
  92. /package/dist/{docs-COCZYMW6.js.map → docs-PVBXPTGR.js.map} +0 -0
  93. /package/dist/{doctor-ERIVTCQS.js.map → doctor-RHMKD4W5.js.map} +0 -0
  94. /package/dist/{environment-7Y4BV6XY.js.map → environment-WZKIO3R3.js.map} +0 -0
  95. /package/dist/{feature-flag-MHONEX6T.js.map → feature-flag-K5REGGDY.js.map} +0 -0
  96. /package/dist/{init-OROOM4HF.js.map → init-FFUZO5D7.js.map} +0 -0
  97. /package/dist/{install-OJFXHY6U.js.map → install-XRKEQAFZ.js.map} +0 -0
  98. /package/dist/{issues-32GONR6C.js.map → issues-I3V6GEXU.js.map} +0 -0
  99. /package/dist/{knobs-UQGGY3CP.js.map → knobs-6WLJMB44.js.map} +0 -0
  100. /package/dist/{list-ZMIKEC5P.js.map → list-PHC7VYNS.js.map} +0 -0
  101. /package/dist/{local-PUD24GGQ.js.map → local-VGYRSW22.js.map} +0 -0
  102. /package/dist/{login-BSO7YX2D.js.map → login-QPU2BKG2.js.map} +0 -0
  103. /package/dist/{mcp-4LS7OJUT.js.map → mcp-LA452TOA.js.map} +0 -0
  104. /package/dist/{product-3JKSJCBC.js.map → product-RSZV5HMB.js.map} +0 -0
  105. /package/dist/{property-K5DBL4UE.js.map → property-YP4GHQAR.js.map} +0 -0
  106. /package/dist/{psql-PQFUFTSE.js.map → psql-XGLBI6T7.js.map} +0 -0
  107. /package/dist/{record-EIIYLFJ4.js.map → record-KWKHP2ZY.js.map} +0 -0
  108. /package/dist/{redis-BU36EZZI.js.map → redis-VJGCUJPV.js.map} +0 -0
  109. /package/dist/{release-LYC2P7DZ.js.map → release-NDRHPW6V.js.map} +0 -0
  110. /package/dist/{sandbox-CKHXXZHU.js.map → sandbox-OOCANWOG.js.map} +0 -0
  111. /package/dist/{scenarios-2XJ2G3KR.js.map → scenarios-2HRLCGFY.js.map} +0 -0
  112. /package/dist/{session-UTOD5ZYH.js.map → session-M4ULYDYP.js.map} +0 -0
  113. /package/dist/{skill-GMAERMQL.js.map → skill-4DGPRDUC.js.map} +0 -0
  114. /package/dist/{spec-2NP36U3Y.js.map → spec-XZ2TKUFZ.js.map} +0 -0
  115. /package/dist/{src-CG52HEE7.js.map → src-CV57ZD6I.js.map} +0 -0
  116. /package/dist/{src-4T6GHXVO.js.map → src-HL7HEJIW.js.map} +0 -0
  117. /package/dist/{src-PK5OZXCM.js.map → src-OU7544PM.js.map} +0 -0
  118. /package/dist/{start-3C7EEFW2.js.map → start-IYKF3C3X.js.map} +0 -0
  119. /package/dist/{tag-JSHOMLBR.js.map → tag-T45MMSCH.js.map} +0 -0
  120. /package/dist/{task-YGWVYTBJ.js.map → task-MCUHAVTD.js.map} +0 -0
  121. /package/dist/{test-suite-LI7ZH367.js.map → test-suite-BICBRSBP.js.map} +0 -0
  122. /package/dist/{trace-UMLOSIIR.js.map → trace-2BAPMYAS.js.map} +0 -0
  123. /package/dist/{triage-ZWJG4NBJ.js.map → triage-M3RZ2ASB.js.map} +0 -0
  124. /package/dist/{upgrade-S7CGEK6H.js.map → upgrade-4QCRAUHP.js.map} +0 -0
  125. /package/dist/{workflow-T4HSAOGW.js.map → workflow-ZGJU4QCV.js.map} +0 -0
  126. /package/dist/{workflow-debug-T2BULXZ7.js.map → workflow-debug-W4USZH35.js.map} +0 -0
  127. /package/dist/{workflow-proposals-XXEZICN2.js.map → workflow-proposals-5E3DTYZB.js.map} +0 -0
@@ -1 +0,0 @@
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 cacheId?: string;\n nodeHash?: string;\n cachedStepCount?: number;\n gapStepCount?: number;\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]');\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 ...]');\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 if (!workflowId || !nodeId || !recipePath) {\n console.error('Usage: canary workflow cache commit <workflowId> --node <nodeId> --recipe <file.json>');\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 recipe\n );\n if (!result.ok) {\n if (json) console.log(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n if (json) {\n console.log(JSON.stringify(result, null, 2));\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":";;;;;;;;;;;;;;;AAMA,OAAO,aAAa;AAkDpB,SAAS,UAAU,MAAgB,MAAkC;AACnE,QAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,MAAI,MAAM,MAAM,MAAM,KAAK,SAAS,EAAG,QAAO;AAC9C,SAAO,KAAK,IAAI,CAAC;AACnB;AASO,SAAS,oBAAoB,MAOH;AAC/B,QAAM,OAAgC,CAAC;AACvC,MAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,MAAI,KAAK,oBAAoB,QAAW;AACtC,UAAM,IAAI,OAAO,KAAK,eAAe;AACrC,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAClC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,oDAAoD,KAAK,eAAe;AAAA,MACjF;AAAA,IACF;AACA,SAAK,eAAe;AAAA,EACtB;AACA,MAAI,KAAK,UAAW,MAAK,YAAY;AACrC,MAAI,KAAK,MAAM;AACb,QAAI,KAAK,SAAS,SAAS,KAAK,SAAS,QAAQ;AAC/C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,wCAAwC,KAAK,IAAI;AAAA,MAC1D;AAAA,IACF;AACA,SAAK,OAAO,KAAK;AAAA,EACnB;AAEA,QAAM,aACH,KAAK,WAAW,SAAY,IAAI,MAChC,KAAK,iBAAiB,SAAY,IAAI,MACtC,KAAK,cAAc,SAAY,IAAI,MACnC,KAAK,SAAS,SAAY,IAAI;AACjC,MAAI,cAAc,GAAG;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,YAAY,GAAG;AACjB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,KAAK;AAC1B;AAEA,SAAS,aAAmB;AAC1B,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,eAAsB,oBACpB,MACA,QACA,OACe;AACf,QAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AACvB,MAAI,CAAC,OAAO,QAAQ,MAAM,UAAU,IAAI,GAAG;AACzC,eAAW;AACX;AAAA,EACF;AAEA,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,YAAM,aAAa,MAAM,QAAQ,KAAK;AACtC;AAAA,IACF,KAAK;AACH,YAAM,YAAY,MAAM,QAAQ,KAAK;AACrC;AAAA,IACF,KAAK;AACH,YAAM,eAAe,MAAM,QAAQ,KAAK;AACxC;AAAA,IACF,KAAK;AACH,YAAM,gBAAgB,IAAI;AAC1B;AAAA,IACF,KAAK;AACH,YAAM,cAAc,IAAI;AACxB;AAAA,IACF,KAAK;AACH,YAAM,aAAa,MAAM,QAAQ,KAAK;AACtC;AAAA,IACF;AACE,cAAQ,MAAM,8BAA8B,GAAG,EAAE;AACjD,iBAAW;AACX,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,eAAe,aAAa,MAAgB,QAAgB,OAA8B;AACxF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,qBAAqB;AACnC,eAAW;AACX,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,QAAQ,MAAM,QAAQ;AAEnC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,KAAM,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAChD,SAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,UAAQ,IAAI,6BAA6B,UAAU,KAAK,MAAM,MAAM;AAAA,CAAsB;AAC1F,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,oBAAoB;AAChC;AAAA,EACF;AAEA,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,EAAE,kBAAkB;AACnC,UAAM,MAAM,EAAE,mBAAmB;AACjC,UAAM,OAAO,EAAE;AACf,UAAM,MAAM,EAAE,WAAW,IAAI,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAC3E,YAAQ;AAAA,MACN,UAAU,EAAE,OAAO,MAAM,GAAG,CAAC,CAAC,qBAAqB,GAAG,YAAY,MAAM,UAAU,IAAI,cAAc,GAAG,UAAU,EAAE,QAAQ;AAAA,IAC7H;AAAA,EACF;AACF;AAEA,eAAe,YAAY,MAAgB,QAAgB,OAA8B;AACvF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,qBAAqB;AACnC,eAAW;AACX,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,QAAQ,MAAM,QAAQ;AAEnC,QAAM,QAAQ,oBAAoB;AAAA,IAChC,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAChC,iBAAiB,UAAU,MAAM,iBAAiB;AAAA,IAClD,WAAW,QAAQ,MAAM,cAAc;AAAA,IACvC,MAAM,UAAU,MAAM,QAAQ;AAAA,EAChC,CAAC;AACD,MAAI,CAAC,MAAM,IAAI;AACb,YAAQ,MAAM,MAAM,KAAK;AACzB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,MAAM;AAEnB,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,gBAAgB,YAAY,QAAQ,MAAM,OAAO,GAAG,MAAM,QAAQ,KAAK;AAC7E;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,KAAM,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAChD,SAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,UAAQ,IAAI,YAAY,OAAO,IAAI,MAAM,OAAO,eAAe,CAAC,eAAe;AACjF;AAEA,eAAe,gBACb,YACA,SACA,MACA,QACA,OACe;AACf,MAAI,CAAC,SAAS;AACZ,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA,0BAA0B,UAAU;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,UAAM,SAAS,MAAM,YAAY,uBAAuB;AACxD,QAAI,OAAO,YAAY,MAAM,OAAO;AAClC,cAAQ,MAAM,UAAU;AACxB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,KAAM,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAChD,SAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,mBAAmB,OAAO,cAAc,CAAC;AAAA,EAC3C;AACF;AAEA,eAAe,eAAe,MAAgB,QAAgB,OAA8B;AAC1F,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,qBAAqB;AACnC,eAAW;AACX,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,QAAM,QAAQ,UAAU,MAAM,OAAO;AAErC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EACvB;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,KAAM,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAChD,SAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,UAAQ,IAAI,iCAAiC,OAAO,KAAK,oBAAoB,OAAO,KAAK,GAAG;AAC9F;AAOA,eAAe,gBAAgB,MAA+B;AAC5D,QAAM,YAAY,UAAU,MAAM,aAAa;AAC/C,QAAM,iBAAiB,UAAU,MAAM,UAAU;AACjD,QAAM,QAAS,UAAU,MAAM,SAAS,KAAK;AAC7C,MAAI,CAAC,aAAa,mBAAmB,QAAW;AAC9C,YAAQ,MAAM,gGAAgG;AAC9G,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,cAAc,OAAO,cAAc;AACzC,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,mBAA0B;AACzE,QAAM,OAAO,MAAM,OAAO,MAAW;AACrC,QAAM,eAAe,IAAI,sBAAsB;AAAA,IAC7C,cAAc,KAAK,KAAK,WAAW,WAAW,WAAW;AAAA,IACzD,QAAQ,KAAK,KAAK,WAAW,aAAa,YAAY;AAAA,EACxD,CAAC;AACD,MAAI;AACF,UAAM,SAAS,MAAM,aAAa,YAAY,aAAa,KAAK;AAChE,YAAQ;AAAA,MACN,KAAK;AAAA,QACH,EAAE,eAAe,OAAO,eAAe,SAAS,OAAO,QAAQ;AAAA,QAC/D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAM,aAAa,MAAM;AAAA,EAC3B;AACF;AAMA,eAAe,cAAc,MAA+B;AAC1D,QAAM,YAAY,UAAU,MAAM,aAAa;AAC/C,QAAM,iBAAiB,UAAU,MAAM,UAAU;AACjD,QAAM,MAAM,UAAU,MAAM,OAAO;AACnC,QAAM,QAAS,UAAU,MAAM,SAAS,KAAK;AAC7C,MAAI,CAAC,aAAa,mBAAmB,UAAa,CAAC,KAAK;AACtD,YAAQ,MAAM,0GAA0G;AACxH,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,iBAAyC,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,QAAI,KAAK,CAAC,MAAM,SAAS;AACvB,YAAM,CAAC,MAAM,GAAG,UAAU,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,MAAM,GAAG;AAC3D,UAAI,QAAQ,WAAW,SAAS,EAAG,gBAAe,IAAI,IAAI,WAAW,KAAK,GAAG;AAAA,IAC/E;AAAA,EACF;AACA,QAAM,cAAc,OAAO,cAAc;AACzC,QAAM,EAAE,oBAAoB,uBAAuB,iBAAiB,aAAa,IAAI,MAAM,OACzF,mBACF;AACA,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,mBAAwB;AAC/D,QAAM,OAAO,MAAM,OAAO,MAAW;AAGrC,QAAM,UAAU,IAAI,mBAAmB;AACvC,QAAM,eAAe,IAAI,sBAAsB;AAAA,IAC7C,cAAc,KAAK,KAAK,WAAW,WAAW,WAAW;AAAA,IACzD,QAAQ,KAAK,KAAK,WAAW,aAAa,YAAY;AAAA,IACtD;AAAA,EACF,CAAC;AACD,QAAM,WAAW,IAAI,gBAAgB,EAAE,QAAQ,CAAC;AAChD,MAAI;AACF,UAAM,YAAY,MAAM,aAAa,YAAY,aAAa,KAAK;AACnE,UAAM,WAAW,cAAc,UAAU,aAAa;AACtD,UAAM,QAAQ,aAAa,UAAU,KAAK,cAAc;AACxD,QAAI,MAAM,aAAa;AACrB,cAAQ;AAAA,QACN,KAAK;AAAA,UACH,EAAE,UAAU,OAAO,aAAa,MAAM,QAAQ,yCAAoC;AAAA,UAClF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,eAAe,MAAM,SAAS,OAAO;AAAA,MACzC,SAAS,UAAU;AAAA,MACnB,WAAW;AAAA,MACX,UAAU,MAAM;AAAA,MAChB;AAAA,IACF,CAAC;AACD,YAAQ;AAAA,MACN,KAAK;AAAA,QACH,EAAE,UAAU,aAAa,SAAS,WAAW,MAAM,WAAW,WAAW,MAAM,WAAW,aAAa;AAAA,QACvG;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,aAAa,QAAS,SAAQ,KAAK,CAAC;AAAA,EAC3C,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AACF;AAGA,eAAe,aAAa,MAAgB,QAAgB,OAA8B;AACxF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,QAAM,SAAS,UAAU,MAAM,QAAQ;AACvC,QAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,QAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,MAAI,CAAC,cAAc,CAAC,UAAU,CAAC,YAAY;AACzC,YAAQ,MAAM,uFAAuF;AACrG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,QAAM,SAAS,KAAK,MAAM,MAAM,GAAG,SAAS,YAAY,OAAO,CAAC;AAChE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,UAAU,MAAM;AAAA,IACxC;AAAA,EACF;AACA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,KAAM,SAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAChD,SAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ;AAAA,IACN,2BAA2B,OAAO,OAAO,eAAe,OAAO,QAAQ,KACjE,OAAO,eAAe,YAAY,OAAO,YAAY;AAAA,EAC7D;AACF;","names":[]}