@runcofactor/cli 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +125 -0
  2. package/dist/api-catalog-GFGCLVS4.js +401 -0
  3. package/dist/api-catalog-GFGCLVS4.js.map +1 -0
  4. package/dist/attachment-SJC7D7FY.js +276 -0
  5. package/dist/attachment-SJC7D7FY.js.map +1 -0
  6. package/dist/auth-EN6NQCJY.js +31 -0
  7. package/dist/auth-EN6NQCJY.js.map +1 -0
  8. package/dist/bin.js +7 -0
  9. package/dist/bin.js.map +1 -0
  10. package/dist/chunk-3CZU7XCS.js +272 -0
  11. package/dist/chunk-3CZU7XCS.js.map +1 -0
  12. package/dist/chunk-4NRDONSC.js +1048 -0
  13. package/dist/chunk-4NRDONSC.js.map +1 -0
  14. package/dist/chunk-4PNOV7OV.js +51980 -0
  15. package/dist/chunk-4PNOV7OV.js.map +1 -0
  16. package/dist/chunk-52IO7ACJ.js +2941 -0
  17. package/dist/chunk-52IO7ACJ.js.map +1 -0
  18. package/dist/chunk-6LEZCKKV.js +663 -0
  19. package/dist/chunk-6LEZCKKV.js.map +1 -0
  20. package/dist/chunk-A4OFTUVV.js +170 -0
  21. package/dist/chunk-A4OFTUVV.js.map +1 -0
  22. package/dist/chunk-B2VISN2V.js +2459 -0
  23. package/dist/chunk-B2VISN2V.js.map +1 -0
  24. package/dist/chunk-CLAWT7BJ.js +271 -0
  25. package/dist/chunk-CLAWT7BJ.js.map +1 -0
  26. package/dist/chunk-GKY2KXO5.js +281 -0
  27. package/dist/chunk-GKY2KXO5.js.map +1 -0
  28. package/dist/chunk-I4QLI3JO.js +413 -0
  29. package/dist/chunk-I4QLI3JO.js.map +1 -0
  30. package/dist/chunk-IMPZAX6L.js +180 -0
  31. package/dist/chunk-IMPZAX6L.js.map +1 -0
  32. package/dist/chunk-J6SH7GQT.js +241 -0
  33. package/dist/chunk-J6SH7GQT.js.map +1 -0
  34. package/dist/chunk-JDBCZ3Z2.js +298 -0
  35. package/dist/chunk-JDBCZ3Z2.js.map +1 -0
  36. package/dist/chunk-JICSYFRJ.js +46 -0
  37. package/dist/chunk-JICSYFRJ.js.map +1 -0
  38. package/dist/chunk-JWHYXEA2.js +32 -0
  39. package/dist/chunk-JWHYXEA2.js.map +1 -0
  40. package/dist/chunk-N7HFALX3.js +88 -0
  41. package/dist/chunk-N7HFALX3.js.map +1 -0
  42. package/dist/chunk-Q4BO4Z5V.js +178 -0
  43. package/dist/chunk-Q4BO4Z5V.js.map +1 -0
  44. package/dist/chunk-QFDOWABX.js +195 -0
  45. package/dist/chunk-QFDOWABX.js.map +1 -0
  46. package/dist/chunk-SJJW77WN.js +605 -0
  47. package/dist/chunk-SJJW77WN.js.map +1 -0
  48. package/dist/chunk-VKVL7WBN.js +50 -0
  49. package/dist/chunk-VKVL7WBN.js.map +1 -0
  50. package/dist/chunk-WOHL4FTB.js +353 -0
  51. package/dist/chunk-WOHL4FTB.js.map +1 -0
  52. package/dist/chunk-XQXVG7RA.js +426 -0
  53. package/dist/chunk-XQXVG7RA.js.map +1 -0
  54. package/dist/chunk-ZD3KHESI.js +94 -0
  55. package/dist/chunk-ZD3KHESI.js.map +1 -0
  56. package/dist/credential-COLTBV6D.js +450 -0
  57. package/dist/credential-COLTBV6D.js.map +1 -0
  58. package/dist/credential-template-EEPYFG7R.js +291 -0
  59. package/dist/credential-template-EEPYFG7R.js.map +1 -0
  60. package/dist/debug-workflow-KOVH5GOP.js +259 -0
  61. package/dist/debug-workflow-KOVH5GOP.js.map +1 -0
  62. package/dist/dist-44PZR7BQ.js +423 -0
  63. package/dist/dist-44PZR7BQ.js.map +1 -0
  64. package/dist/docs-3SSORHB5.js +366 -0
  65. package/dist/docs-3SSORHB5.js.map +1 -0
  66. package/dist/doctor-OTSIWV6G.js +132 -0
  67. package/dist/doctor-OTSIWV6G.js.map +1 -0
  68. package/dist/feature-flag-T2LRZME3.js +283 -0
  69. package/dist/feature-flag-T2LRZME3.js.map +1 -0
  70. package/dist/file-type-S3UUBVCT.js +4205 -0
  71. package/dist/file-type-S3UUBVCT.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.js +982 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/init-TGWRECT2.js +208 -0
  76. package/dist/init-TGWRECT2.js.map +1 -0
  77. package/dist/install-DXSNWZKO.js +295 -0
  78. package/dist/install-DXSNWZKO.js.map +1 -0
  79. package/dist/issues-XIZOPX6T.js +564 -0
  80. package/dist/issues-XIZOPX6T.js.map +1 -0
  81. package/dist/knobs-NBINZIUB.js +295 -0
  82. package/dist/knobs-NBINZIUB.js.map +1 -0
  83. package/dist/list-3TDHK637.js +59 -0
  84. package/dist/list-3TDHK637.js.map +1 -0
  85. package/dist/local-HICVD6PU.js +100 -0
  86. package/dist/local-HICVD6PU.js.map +1 -0
  87. package/dist/login-UOIUXVUK.js +315 -0
  88. package/dist/login-UOIUXVUK.js.map +1 -0
  89. package/dist/mcp-54IJEOUA.js +1956 -0
  90. package/dist/mcp-54IJEOUA.js.map +1 -0
  91. package/dist/pdf-extract-ABWV3L5X.js +13 -0
  92. package/dist/pdf-extract-ABWV3L5X.js.map +1 -0
  93. package/dist/pdfjs-DQ2YA5S3.js +41561 -0
  94. package/dist/pdfjs-DQ2YA5S3.js.map +1 -0
  95. package/dist/property-UXLOLPTD.js +701 -0
  96. package/dist/property-UXLOLPTD.js.map +1 -0
  97. package/dist/property-skill-guide.md +189 -0
  98. package/dist/psql-BYUUNLGG.js +115 -0
  99. package/dist/psql-BYUUNLGG.js.map +1 -0
  100. package/dist/record-4TR2UIIS.js +233 -0
  101. package/dist/record-4TR2UIIS.js.map +1 -0
  102. package/dist/redis-35VBUYW7.js +116 -0
  103. package/dist/redis-35VBUYW7.js.map +1 -0
  104. package/dist/release-OOLTUBUT.js +354 -0
  105. package/dist/release-OOLTUBUT.js.map +1 -0
  106. package/dist/sandbox-XGSUU6G7.js +2046 -0
  107. package/dist/sandbox-XGSUU6G7.js.map +1 -0
  108. package/dist/scenarios-GWLJEGHA.js +280 -0
  109. package/dist/scenarios-GWLJEGHA.js.map +1 -0
  110. package/dist/session-MYFNZPRP.js +2414 -0
  111. package/dist/session-MYFNZPRP.js.map +1 -0
  112. package/dist/skill-KM34LDMO.js +1839 -0
  113. package/dist/skill-KM34LDMO.js.map +1 -0
  114. package/dist/skills/debug-run/SKILL.md +262 -0
  115. package/dist/skills/debug-run/history/1.0.0.md +244 -0
  116. package/dist/skills/debug-run/history/1.0.1.md +245 -0
  117. package/dist/skills/debug-run/history/1.0.2.md +254 -0
  118. package/dist/skills/debug-run/history/1.1.0.md +262 -0
  119. package/dist/skills/debug-run/version.json +3 -0
  120. package/dist/spec-RA3CFEKG.js +951 -0
  121. package/dist/spec-RA3CFEKG.js.map +1 -0
  122. package/dist/src-LB4HBTJQ.js +1516 -0
  123. package/dist/src-LB4HBTJQ.js.map +1 -0
  124. package/dist/src-N3TPKGTY.js +244 -0
  125. package/dist/src-N3TPKGTY.js.map +1 -0
  126. package/dist/src-UVDX5UP6.js +17 -0
  127. package/dist/src-UVDX5UP6.js.map +1 -0
  128. package/dist/start-PSEQSQA3.js +151 -0
  129. package/dist/start-PSEQSQA3.js.map +1 -0
  130. package/dist/tag-YY6YAABQ.js +22 -0
  131. package/dist/tag-YY6YAABQ.js.map +1 -0
  132. package/dist/task-IQC3YR5K.js +922 -0
  133. package/dist/task-IQC3YR5K.js.map +1 -0
  134. package/dist/test-suite-DZNJFXDW.js +394 -0
  135. package/dist/test-suite-DZNJFXDW.js.map +1 -0
  136. package/dist/trace-HXIW7U2D.js +14 -0
  137. package/dist/trace-HXIW7U2D.js.map +1 -0
  138. package/dist/triage-ORG45R5W.js +16 -0
  139. package/dist/triage-ORG45R5W.js.map +1 -0
  140. package/dist/upgrade-L2VYMP2V.js +61 -0
  141. package/dist/upgrade-L2VYMP2V.js.map +1 -0
  142. package/dist/workflow-XYFH5LTP.js +3708 -0
  143. package/dist/workflow-XYFH5LTP.js.map +1 -0
  144. package/dist/workflow-cache-NQJQFWMV.js +253 -0
  145. package/dist/workflow-cache-NQJQFWMV.js.map +1 -0
  146. package/dist/workflow-debug-BGD4UIXU.js +927 -0
  147. package/dist/workflow-debug-BGD4UIXU.js.map +1 -0
  148. package/dist/workflow-proposals-MTUDX46O.js +382 -0
  149. package/dist/workflow-proposals-MTUDX46O.js.map +1 -0
  150. package/package.json +61 -0
@@ -0,0 +1,253 @@
1
+ import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
+ import {
3
+ apiRequest,
4
+ promptInput
5
+ } from "./chunk-WOHL4FTB.js";
6
+ import "./chunk-SJJW77WN.js";
7
+ import "./chunk-3CZU7XCS.js";
8
+ import {
9
+ hasFlag
10
+ } from "./chunk-A4OFTUVV.js";
11
+ import "./chunk-JWHYXEA2.js";
12
+ import "./chunk-VKVL7WBN.js";
13
+
14
+ // src/workflow-cache.ts
15
+ import process from "process";
16
+ function flagValue(argv, name) {
17
+ const i = argv.indexOf(name);
18
+ if (i === -1 || i === argv.length - 1) return void 0;
19
+ return argv[i + 1];
20
+ }
21
+ function buildCacheClearBody(opts) {
22
+ const body = {};
23
+ if (opts.nodeId) body.nodeId = opts.nodeId;
24
+ if (opts.belowVersionRaw !== void 0) {
25
+ const n = Number(opts.belowVersionRaw);
26
+ if (!Number.isInteger(n) || n <= 0) {
27
+ return {
28
+ ok: false,
29
+ error: `--below-version must be a positive integer, got "${opts.belowVersionRaw}"`
30
+ };
31
+ }
32
+ body.belowVersion = n;
33
+ }
34
+ if (opts.staleOnly) body.staleOnly = true;
35
+ if (opts.mode) {
36
+ if (opts.mode !== "all" && opts.mode !== "hard") {
37
+ return {
38
+ ok: false,
39
+ error: `--mode must be "all" or "hard", got "${opts.mode}"`
40
+ };
41
+ }
42
+ body.mode = opts.mode;
43
+ }
44
+ const modeCount = (body.nodeId !== void 0 ? 1 : 0) + (body.belowVersion !== void 0 ? 1 : 0) + (body.staleOnly !== void 0 ? 1 : 0) + (body.mode !== void 0 ? 1 : 0);
45
+ if (modeCount === 0) {
46
+ return {
47
+ ok: false,
48
+ error: "cache clear requires one of: --node <id>, --below-version <n>, --stale-only, --mode all, or --mode hard"
49
+ };
50
+ }
51
+ if (modeCount > 1) {
52
+ return {
53
+ ok: false,
54
+ error: "cache clear accepts exactly one of --node / --below-version / --stale-only / --mode"
55
+ };
56
+ }
57
+ return { ok: true, body };
58
+ }
59
+ function printUsage() {
60
+ console.error(
61
+ [
62
+ "Usage:",
63
+ " canary workflow cache status <workflowId> [--json]",
64
+ " canary workflow cache clear <workflowId> <mode> [--json]",
65
+ " canary workflow cache optimize <workflowId> [--json]",
66
+ "",
67
+ "Cache clear modes (pick exactly one):",
68
+ " --node <nodeId> Invalidate one node's cache row",
69
+ " --below-version <n> Invalidate caches with compilerVersion < n",
70
+ ' --stale-only Invalidate caches whose playbookHealth = "stale"',
71
+ " --mode all Invalidate every cache row (rows kept, isValid=false)",
72
+ " --mode hard DESTRUCTIVE: delete cache rows, strip playbookSteps",
73
+ " from node configs, and null lastRunId. Equivalent to",
74
+ ' the UI "Reset flow" button. Requires --yes.',
75
+ "",
76
+ "Options:",
77
+ " --yes Skip the interactive confirmation for --mode hard",
78
+ " --json Output raw JSON"
79
+ ].join("\n")
80
+ );
81
+ }
82
+ async function handleWorkflowCache(argv, apiUrl, token) {
83
+ const [sub, ...rest] = argv;
84
+ if (!sub || hasFlag(argv, "--help", "-h")) {
85
+ printUsage();
86
+ return;
87
+ }
88
+ switch (sub) {
89
+ case "status":
90
+ await handleStatus(rest, apiUrl, token);
91
+ return;
92
+ case "clear":
93
+ await handleClear(rest, apiUrl, token);
94
+ return;
95
+ case "optimize":
96
+ await handleOptimize(rest, apiUrl, token);
97
+ return;
98
+ default:
99
+ console.error(`Unknown cache sub-command: ${sub}`);
100
+ printUsage();
101
+ process.exit(1);
102
+ }
103
+ }
104
+ async function handleStatus(argv, apiUrl, token) {
105
+ const workflowId = argv.find((a) => !a.startsWith("-"));
106
+ if (!workflowId) {
107
+ console.error("Missing workflowId.");
108
+ printUsage();
109
+ process.exit(1);
110
+ }
111
+ const json = hasFlag(argv, "--json");
112
+ const result = await apiRequest(
113
+ apiUrl,
114
+ token,
115
+ "GET",
116
+ `/workflows/${workflowId}/cache-status`
117
+ );
118
+ if (!result.ok) {
119
+ if (json) console.log(JSON.stringify(result, null, 2));
120
+ else console.error(`Error: ${result.error ?? "Unknown error"}`);
121
+ process.exit(1);
122
+ }
123
+ if (json) {
124
+ console.log(JSON.stringify(result, null, 2));
125
+ return;
126
+ }
127
+ const nodes = result.nodes ?? [];
128
+ console.log(`Cache status for workflow ${workflowId} (${nodes.length} valid cache rows)
129
+ `);
130
+ if (nodes.length === 0) {
131
+ console.log(" No valid caches.");
132
+ return;
133
+ }
134
+ for (const n of nodes) {
135
+ const health = n.playbookHealth ?? "\u2014";
136
+ const ver = n.compilerVersion ?? "pre-v2";
137
+ const gaps = n.gapCount;
138
+ const age = n.cachedAt ? new Date(n.cachedAt).toISOString().slice(0, 10) : "\u2014";
139
+ console.log(
140
+ ` node=${n.nodeId.slice(0, 8)} compilerVersion=${ver} health=${health} gaps=${gaps} cachedAt=${age} uses=${n.useCount}`
141
+ );
142
+ }
143
+ }
144
+ async function handleClear(argv, apiUrl, token) {
145
+ const workflowId = argv.find((a) => !a.startsWith("-"));
146
+ if (!workflowId) {
147
+ console.error("Missing workflowId.");
148
+ printUsage();
149
+ process.exit(1);
150
+ }
151
+ const json = hasFlag(argv, "--json");
152
+ const built = buildCacheClearBody({
153
+ nodeId: flagValue(argv, "--node"),
154
+ belowVersionRaw: flagValue(argv, "--below-version"),
155
+ staleOnly: hasFlag(argv, "--stale-only"),
156
+ mode: flagValue(argv, "--mode")
157
+ });
158
+ if (!built.ok) {
159
+ console.error(built.error);
160
+ process.exit(1);
161
+ }
162
+ const body = built.body;
163
+ if (body.mode === "hard") {
164
+ await handleHardReset(workflowId, hasFlag(argv, "--yes"), json, apiUrl, token);
165
+ return;
166
+ }
167
+ const result = await apiRequest(
168
+ apiUrl,
169
+ token,
170
+ "POST",
171
+ `/workflows/${workflowId}/cache-clear`,
172
+ body
173
+ );
174
+ if (!result.ok) {
175
+ if (json) console.log(JSON.stringify(result, null, 2));
176
+ else console.error(`Error: ${result.error ?? "Unknown error"}`);
177
+ process.exit(1);
178
+ }
179
+ if (json) {
180
+ console.log(JSON.stringify(result, null, 2));
181
+ return;
182
+ }
183
+ console.log(`Cleared (${result.mode}): ${result.invalidated ?? 0} cache row(s)`);
184
+ }
185
+ async function handleHardReset(workflowId, yesFlag, json, apiUrl, token) {
186
+ if (!yesFlag) {
187
+ console.log(
188
+ [
189
+ "",
190
+ `Hard reset on workflow ${workflowId} will:`,
191
+ " - DELETE all cached browser actions for this workflow",
192
+ " - REMOVE playbookSteps from every node config",
193
+ " - CLEAR the workflow lastRunId",
194
+ "",
195
+ 'This is equivalent to the UI "Reset flow" button and cannot be undone.',
196
+ ""
197
+ ].join("\n")
198
+ );
199
+ const answer = await promptInput('Type "yes" to confirm');
200
+ if (answer.toLowerCase() !== "yes") {
201
+ console.error("Aborted.");
202
+ process.exit(1);
203
+ }
204
+ }
205
+ const result = await apiRequest(
206
+ apiUrl,
207
+ token,
208
+ "POST",
209
+ `/workflows/${workflowId}/reset`
210
+ );
211
+ if (!result.ok) {
212
+ if (json) console.log(JSON.stringify(result, null, 2));
213
+ else console.error(`Error: ${result.error ?? "Unknown error"}`);
214
+ process.exit(1);
215
+ }
216
+ if (json) {
217
+ console.log(JSON.stringify(result, null, 2));
218
+ return;
219
+ }
220
+ console.log(
221
+ `Reset workflow: ${result.nodesReset ?? 0} node(s) cleared (cache rows deleted, playbook steps removed, lastRunId cleared)`
222
+ );
223
+ }
224
+ async function handleOptimize(argv, apiUrl, token) {
225
+ const workflowId = argv.find((a) => !a.startsWith("-"));
226
+ if (!workflowId) {
227
+ console.error("Missing workflowId.");
228
+ printUsage();
229
+ process.exit(1);
230
+ }
231
+ const json = hasFlag(argv, "--json");
232
+ const result = await apiRequest(
233
+ apiUrl,
234
+ token,
235
+ "POST",
236
+ `/workflows/${workflowId}/optimize-cache`
237
+ );
238
+ if (!result.ok) {
239
+ if (json) console.log(JSON.stringify(result, null, 2));
240
+ else console.error(`Error: ${result.error ?? "Unknown error"}`);
241
+ process.exit(1);
242
+ }
243
+ if (json) {
244
+ console.log(JSON.stringify(result, null, 2));
245
+ return;
246
+ }
247
+ console.log(`Optimize-cache run enqueued: ${result.runId}`);
248
+ }
249
+ export {
250
+ buildCacheClearBody,
251
+ handleWorkflowCache
252
+ };
253
+ //# sourceMappingURL=workflow-cache-NQJQFWMV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/workflow-cache.ts"],"sourcesContent":["/**\n * CLI handlers for `canary workflow cache {status,clear,optimize}`.\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 runId?: string;\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> [--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 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\n const result = await apiRequest<OptimizeResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/optimize-cache`\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(`Optimize-cache run enqueued: ${result.runId}`);\n}\n"],"mappings":"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","names":[]}