@runcofactor/cli 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{account-6FPITX2M.js → account-QWQP6YCY.js} +3 -3
- package/dist/{alert-PWERXHCP.js → alert-65FH7P74.js} +4 -4
- package/dist/{api-catalog-HCSSHOFY.js → api-catalog-WM6R37CA.js} +3 -3
- package/dist/{attachment-A7JAZWWH.js → attachment-FTQTZUTA.js} +3 -3
- package/dist/{augmentor-MIEBKJUK.js → augmentor-IQMT6NFX.js} +3 -3
- package/dist/{chunk-3VHY375S.js → chunk-3VIBXXNX.js} +2 -2
- package/dist/{chunk-IFZ72FZV.js → chunk-3X3TSH2B.js} +2 -2
- package/dist/{chunk-ZP3RP4IK.js → chunk-6AJLNMHB.js} +2 -2
- package/dist/{chunk-44NI5IDC.js → chunk-6QGUAITE.js} +15 -1
- package/dist/{chunk-44NI5IDC.js.map → chunk-6QGUAITE.js.map} +1 -1
- package/dist/{chunk-5N4OZPFQ.js → chunk-DECTGV4O.js} +2 -2
- package/dist/{chunk-6BAMC77N.js → chunk-E22PSTUP.js} +2 -2
- package/dist/{chunk-4ZNTGBJR.js → chunk-EHKHZ5UR.js} +23 -23
- package/dist/chunk-EHKHZ5UR.js.map +1 -0
- package/dist/{chunk-DHL4O7MG.js → chunk-MBMFYGKN.js} +2 -2
- package/dist/{chunk-YBX5BIKL.js → chunk-PK5UICGR.js} +2 -2
- package/dist/{chunk-4SV3CGNM.js → chunk-SFRUUIIC.js} +2 -2
- package/dist/{chunk-LSL2M7O6.js → chunk-WTMSRIDK.js} +2 -2
- package/dist/{credential-KSLGCJU7.js → credential-CKO4ZBMU.js} +3 -3
- package/dist/{credential-template-WECUNR4X.js → credential-template-XOZ2FJ6Z.js} +3 -3
- package/dist/{dist-5PKCAL5N.js → dist-YPK2RMUK.js} +3 -3
- package/dist/{docs-PRUI4LAD.js → docs-WZCQ6GP7.js} +3 -3
- package/dist/{environment-ATT4UQCY.js → environment-KO3JUX3V.js} +3 -3
- package/dist/{feature-flag-MWIHVJER.js → feature-flag-4YPPF27F.js} +63 -5
- package/dist/feature-flag-4YPPF27F.js.map +1 -0
- package/dist/index.js +38 -38
- package/dist/{init-QBMKWGHZ.js → init-RXWDJV5I.js} +3 -3
- package/dist/{install-BHYIXK6G.js → install-Z7EGAEEW.js} +3 -3
- package/dist/{issues-JO3OVOV7.js → issues-XOU54YKP.js} +3 -3
- package/dist/{knobs-4LLJ4LCU.js → knobs-7MB2O5SW.js} +3 -3
- package/dist/{list-JVJSIK52.js → list-5CJZY5BC.js} +3 -3
- package/dist/{local-VCZGHODB.js → local-XLBE4JIT.js} +5 -5
- package/dist/{login-UBNUPK2H.js → login-6GDATX4X.js} +3 -3
- package/dist/{mcp-2BBNDVZI.js → mcp-52UNMEF3.js} +4 -4
- package/dist/{metrics-4YOSDGIG.js → metrics-4Z5IJZ7U.js} +3 -3
- package/dist/{product-T2PVBVZ4.js → product-N2R3MWZS.js} +3 -3
- package/dist/{prompts-MI4QK2ZM.js → prompts-X6FNI6NZ.js} +3 -3
- package/dist/{property-EKASZCO7.js → property-VUKL5IFR.js} +3 -3
- package/dist/{record-Z4NY75FM.js → record-AVGKVJK7.js} +4 -4
- package/dist/{release-Z7WKFMBS.js → release-4QOZ4IP6.js} +3 -3
- package/dist/{sandbox-YOODBA5Q.js → sandbox-4ZR6XRIQ.js} +14 -3
- package/dist/sandbox-4ZR6XRIQ.js.map +1 -0
- package/dist/{scenarios-ABYCUJ4O.js → scenarios-UZBDO3XR.js} +3 -3
- package/dist/{schedule-ZRHOCT5Q.js → schedule-XCSZ6NLT.js} +4 -4
- package/dist/{session-T7BV73AC.js → session-QXHDS5GP.js} +5 -5
- package/dist/{skill-VLCWQJHG.js → skill-FXNE77RE.js} +166 -159
- package/dist/skill-FXNE77RE.js.map +1 -0
- package/dist/{spec-QPWXRPAG.js → spec-TOUOP4TC.js} +3 -3
- package/dist/{src-BH5O6Z3E.js → src-YZGG5ZSL.js} +3 -3
- package/dist/{start-5BADZ65B.js → start-JDLIIBPC.js} +3 -3
- package/dist/{tag-CIR6U5LL.js → tag-LSS3IOUA.js} +4 -4
- package/dist/{task-4YKONXJI.js → task-KCNDIT4A.js} +3 -3
- package/dist/{test-suite-PRJ2PGMN.js → test-suite-MOVN2XL5.js} +5 -5
- package/dist/{trace-XVB47RLY.js → trace-7OZNMAKV.js} +4 -4
- package/dist/{triage-L5WR65KW.js → triage-BRSUW4Z7.js} +4 -4
- package/dist/{utilities-LBKWREPU.js → utilities-TXQGGH37.js} +3 -3
- package/dist/{workflow-GCZCXPGA.js → workflow-2TVSFQXK.js} +310 -302
- package/dist/workflow-2TVSFQXK.js.map +1 -0
- package/dist/{workflow-cache-XWTLXIHE.js → workflow-cache-LRH5CAPS.js} +6 -6
- package/dist/{workflow-debug-XHR4552F.js → workflow-debug-IWXZXSL2.js} +5 -5
- package/dist/{workflow-proposals-VWLKW352.js → workflow-proposals-76D2MM6G.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-4ZNTGBJR.js.map +0 -1
- package/dist/feature-flag-MWIHVJER.js.map +0 -1
- package/dist/sandbox-YOODBA5Q.js.map +0 -1
- package/dist/skill-VLCWQJHG.js.map +0 -1
- package/dist/workflow-GCZCXPGA.js.map +0 -1
- /package/dist/{account-6FPITX2M.js.map → account-QWQP6YCY.js.map} +0 -0
- /package/dist/{alert-PWERXHCP.js.map → alert-65FH7P74.js.map} +0 -0
- /package/dist/{api-catalog-HCSSHOFY.js.map → api-catalog-WM6R37CA.js.map} +0 -0
- /package/dist/{attachment-A7JAZWWH.js.map → attachment-FTQTZUTA.js.map} +0 -0
- /package/dist/{augmentor-MIEBKJUK.js.map → augmentor-IQMT6NFX.js.map} +0 -0
- /package/dist/{chunk-3VHY375S.js.map → chunk-3VIBXXNX.js.map} +0 -0
- /package/dist/{chunk-IFZ72FZV.js.map → chunk-3X3TSH2B.js.map} +0 -0
- /package/dist/{chunk-ZP3RP4IK.js.map → chunk-6AJLNMHB.js.map} +0 -0
- /package/dist/{chunk-5N4OZPFQ.js.map → chunk-DECTGV4O.js.map} +0 -0
- /package/dist/{chunk-6BAMC77N.js.map → chunk-E22PSTUP.js.map} +0 -0
- /package/dist/{chunk-DHL4O7MG.js.map → chunk-MBMFYGKN.js.map} +0 -0
- /package/dist/{chunk-YBX5BIKL.js.map → chunk-PK5UICGR.js.map} +0 -0
- /package/dist/{chunk-4SV3CGNM.js.map → chunk-SFRUUIIC.js.map} +0 -0
- /package/dist/{chunk-LSL2M7O6.js.map → chunk-WTMSRIDK.js.map} +0 -0
- /package/dist/{credential-KSLGCJU7.js.map → credential-CKO4ZBMU.js.map} +0 -0
- /package/dist/{credential-template-WECUNR4X.js.map → credential-template-XOZ2FJ6Z.js.map} +0 -0
- /package/dist/{dist-5PKCAL5N.js.map → dist-YPK2RMUK.js.map} +0 -0
- /package/dist/{docs-PRUI4LAD.js.map → docs-WZCQ6GP7.js.map} +0 -0
- /package/dist/{environment-ATT4UQCY.js.map → environment-KO3JUX3V.js.map} +0 -0
- /package/dist/{init-QBMKWGHZ.js.map → init-RXWDJV5I.js.map} +0 -0
- /package/dist/{install-BHYIXK6G.js.map → install-Z7EGAEEW.js.map} +0 -0
- /package/dist/{issues-JO3OVOV7.js.map → issues-XOU54YKP.js.map} +0 -0
- /package/dist/{knobs-4LLJ4LCU.js.map → knobs-7MB2O5SW.js.map} +0 -0
- /package/dist/{list-JVJSIK52.js.map → list-5CJZY5BC.js.map} +0 -0
- /package/dist/{local-VCZGHODB.js.map → local-XLBE4JIT.js.map} +0 -0
- /package/dist/{login-UBNUPK2H.js.map → login-6GDATX4X.js.map} +0 -0
- /package/dist/{mcp-2BBNDVZI.js.map → mcp-52UNMEF3.js.map} +0 -0
- /package/dist/{metrics-4YOSDGIG.js.map → metrics-4Z5IJZ7U.js.map} +0 -0
- /package/dist/{product-T2PVBVZ4.js.map → product-N2R3MWZS.js.map} +0 -0
- /package/dist/{prompts-MI4QK2ZM.js.map → prompts-X6FNI6NZ.js.map} +0 -0
- /package/dist/{property-EKASZCO7.js.map → property-VUKL5IFR.js.map} +0 -0
- /package/dist/{record-Z4NY75FM.js.map → record-AVGKVJK7.js.map} +0 -0
- /package/dist/{release-Z7WKFMBS.js.map → release-4QOZ4IP6.js.map} +0 -0
- /package/dist/{scenarios-ABYCUJ4O.js.map → scenarios-UZBDO3XR.js.map} +0 -0
- /package/dist/{schedule-ZRHOCT5Q.js.map → schedule-XCSZ6NLT.js.map} +0 -0
- /package/dist/{session-T7BV73AC.js.map → session-QXHDS5GP.js.map} +0 -0
- /package/dist/{spec-QPWXRPAG.js.map → spec-TOUOP4TC.js.map} +0 -0
- /package/dist/{src-BH5O6Z3E.js.map → src-YZGG5ZSL.js.map} +0 -0
- /package/dist/{start-5BADZ65B.js.map → start-JDLIIBPC.js.map} +0 -0
- /package/dist/{tag-CIR6U5LL.js.map → tag-LSS3IOUA.js.map} +0 -0
- /package/dist/{task-4YKONXJI.js.map → task-KCNDIT4A.js.map} +0 -0
- /package/dist/{test-suite-PRJ2PGMN.js.map → test-suite-MOVN2XL5.js.map} +0 -0
- /package/dist/{trace-XVB47RLY.js.map → trace-7OZNMAKV.js.map} +0 -0
- /package/dist/{triage-L5WR65KW.js.map → triage-BRSUW4Z7.js.map} +0 -0
- /package/dist/{utilities-LBKWREPU.js.map → utilities-TXQGGH37.js.map} +0 -0
- /package/dist/{workflow-cache-XWTLXIHE.js.map → workflow-cache-LRH5CAPS.js.map} +0 -0
- /package/dist/{workflow-debug-XHR4552F.js.map → workflow-debug-IWXZXSL2.js.map} +0 -0
- /package/dist/{workflow-proposals-VWLKW352.js.map → workflow-proposals-76D2MM6G.js.map} +0 -0
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
} from "./chunk-EGTH6R6R.js";
|
|
5
5
|
import {
|
|
6
6
|
WORKFLOW_GUIDE_SECTIONS
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6QGUAITE.js";
|
|
8
8
|
import {
|
|
9
9
|
applyWorkflowTagFlags
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-PK5UICGR.js";
|
|
11
11
|
import {
|
|
12
12
|
workflowToSpec
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-DECTGV4O.js";
|
|
14
14
|
import {
|
|
15
15
|
alignSnapshotNodeIds,
|
|
16
16
|
topoOrderNodes
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
fetchWorkflowEnvironments,
|
|
21
21
|
renderWorkflowUserError,
|
|
22
22
|
resolveEnvironmentByNameOrId
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-WTMSRIDK.js";
|
|
24
24
|
import {
|
|
25
25
|
apiFetch,
|
|
26
26
|
exitOnFailure,
|
|
@@ -37,15 +37,15 @@ import {
|
|
|
37
37
|
NODE_TYPE_LABEL,
|
|
38
38
|
USER_SETTABLE_WORKFLOW_STATUSES,
|
|
39
39
|
normalizeNodeType
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-EHKHZ5UR.js";
|
|
41
41
|
import {
|
|
42
42
|
specExtension
|
|
43
43
|
} from "./chunk-ZSOAFMES.js";
|
|
44
44
|
import "./chunk-ICKB3EOT.js";
|
|
45
45
|
|
|
46
46
|
// src/workflow.ts
|
|
47
|
-
import
|
|
48
|
-
import
|
|
47
|
+
import fs6 from "fs/promises";
|
|
48
|
+
import process10 from "process";
|
|
49
49
|
|
|
50
50
|
// src/workflow-create.ts
|
|
51
51
|
import fs from "fs/promises";
|
|
@@ -348,9 +348,198 @@ ${err instanceof Error ? err.message : String(err)}`);
|
|
|
348
348
|
);
|
|
349
349
|
}
|
|
350
350
|
|
|
351
|
-
// src/workflow-
|
|
351
|
+
// src/workflow-get.ts
|
|
352
|
+
import fs2 from "fs/promises";
|
|
352
353
|
import process3 from "process";
|
|
353
354
|
|
|
355
|
+
// src/workflow-format.ts
|
|
356
|
+
function truncate(text, max) {
|
|
357
|
+
if (text.length <= max) return text;
|
|
358
|
+
return text.slice(0, max - 1) + "\u2026";
|
|
359
|
+
}
|
|
360
|
+
function getNodeTitle(node) {
|
|
361
|
+
const c = node.configJson ?? {};
|
|
362
|
+
switch (node.nodeType) {
|
|
363
|
+
case "login":
|
|
364
|
+
return c.credentialName || NODE_TYPE_LABEL.login;
|
|
365
|
+
case "navigate":
|
|
366
|
+
return c.pageTitle || truncate(c.pageUrl || "Navigate", 40);
|
|
367
|
+
case "action":
|
|
368
|
+
return c.customActionTitle || truncate(c.actionDescription || "Action", 50);
|
|
369
|
+
case "assertion":
|
|
370
|
+
return truncate(c.condition || "Assertion", 50);
|
|
371
|
+
case "setup":
|
|
372
|
+
return c.setupFlowName || "Setup";
|
|
373
|
+
case "seed":
|
|
374
|
+
return c.seedWorkflowName || "Seed";
|
|
375
|
+
case "wait":
|
|
376
|
+
return "Wait";
|
|
377
|
+
case "condition":
|
|
378
|
+
return truncate(c.conditionDescription || "Condition", 50);
|
|
379
|
+
case "end":
|
|
380
|
+
return "End";
|
|
381
|
+
case "api_sequence":
|
|
382
|
+
return "API Sequence";
|
|
383
|
+
default:
|
|
384
|
+
return node.nodeType;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function getCleanConfig(node) {
|
|
388
|
+
const c = node.configJson ?? {};
|
|
389
|
+
switch (node.nodeType) {
|
|
390
|
+
case "login":
|
|
391
|
+
return pick(c, [
|
|
392
|
+
"credentialName",
|
|
393
|
+
"performLogin",
|
|
394
|
+
"credentialSource",
|
|
395
|
+
"credentialTemplateId",
|
|
396
|
+
"credentialTemplateName",
|
|
397
|
+
"credentialId",
|
|
398
|
+
"seedCredentialRef"
|
|
399
|
+
]);
|
|
400
|
+
case "navigate":
|
|
401
|
+
return {
|
|
402
|
+
...pick(c, ["pageUrl", "pageTitle"]),
|
|
403
|
+
...c.openInNewTab ? { openInNewTab: true } : {}
|
|
404
|
+
};
|
|
405
|
+
case "action":
|
|
406
|
+
return pick(c, [
|
|
407
|
+
"actionDescription",
|
|
408
|
+
"playbookSteps",
|
|
409
|
+
"inputValues",
|
|
410
|
+
"declaredOutputs",
|
|
411
|
+
"capturedVariableKeys",
|
|
412
|
+
"dataRequirements",
|
|
413
|
+
"alwaysUseAgent"
|
|
414
|
+
]);
|
|
415
|
+
case "assertion":
|
|
416
|
+
return pick(c, ["condition", "expectedOutcome", "strict", "alwaysUseAgent"]);
|
|
417
|
+
case "setup":
|
|
418
|
+
return pick(c, ["setupFlowId", "setupFlowName"]);
|
|
419
|
+
case "seed":
|
|
420
|
+
return pick(c, ["seedWorkflowId", "seedWorkflowName", "snapshotVersion"]);
|
|
421
|
+
case "end":
|
|
422
|
+
return pick(c, ["outcome"]);
|
|
423
|
+
case "wait":
|
|
424
|
+
case "condition":
|
|
425
|
+
case "api_sequence":
|
|
426
|
+
return c;
|
|
427
|
+
default:
|
|
428
|
+
return c;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function pick(obj, keys) {
|
|
432
|
+
const result = {};
|
|
433
|
+
for (const key of keys) {
|
|
434
|
+
if (obj[key] !== void 0 && obj[key] !== null) {
|
|
435
|
+
result[key] = obj[key];
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return result;
|
|
439
|
+
}
|
|
440
|
+
function formatWorkflowMarkdown(workflow) {
|
|
441
|
+
const seedOutputs = workflow.seedOutputsJson ?? workflow.seedOutputs;
|
|
442
|
+
return workflowToSpec({ ...workflow, seedOutputs });
|
|
443
|
+
}
|
|
444
|
+
function formatWorkflowJson(workflow) {
|
|
445
|
+
const sorted = topoOrderNodes(workflow.nodes, workflow.edges ?? []);
|
|
446
|
+
const seedOutputs = workflow.seedOutputsJson;
|
|
447
|
+
const env = workflow;
|
|
448
|
+
return {
|
|
449
|
+
workflow: {
|
|
450
|
+
id: workflow.id,
|
|
451
|
+
name: workflow.name,
|
|
452
|
+
description: workflow.description,
|
|
453
|
+
status: workflow.status,
|
|
454
|
+
flowType: workflow.flowType,
|
|
455
|
+
...seedOutputs && seedOutputs.length > 0 ? { seedOutputs } : {},
|
|
456
|
+
...env.defaultEnvironmentId !== void 0 ? { defaultEnvironmentId: env.defaultEnvironmentId } : {},
|
|
457
|
+
...env.eligibleEnvironmentIds ? { eligibleEnvironmentIds: env.eligibleEnvironmentIds } : {},
|
|
458
|
+
...env.passByEnvironment && env.passByEnvironment.length > 0 ? {
|
|
459
|
+
passByEnvironment: env.passByEnvironment.map((p) => ({
|
|
460
|
+
environment: `${p.environmentName} (${p.environmentType})`,
|
|
461
|
+
everPassed: p.everPassed,
|
|
462
|
+
passed: p.passed,
|
|
463
|
+
total: p.total,
|
|
464
|
+
health: p.health
|
|
465
|
+
}))
|
|
466
|
+
} : {}
|
|
467
|
+
},
|
|
468
|
+
steps: sorted.map((node, i) => ({
|
|
469
|
+
index: i + 1,
|
|
470
|
+
nodeId: node.id,
|
|
471
|
+
nodeType: node.nodeType,
|
|
472
|
+
title: getNodeTitle(node),
|
|
473
|
+
config: getCleanConfig(node)
|
|
474
|
+
}))
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// src/workflow-get.ts
|
|
479
|
+
function shouldPrintWorkflowUrlTrailer(argv) {
|
|
480
|
+
const jsonOutput = hasFlag(argv, "--json") || getArgValue(argv, "--format") === "json";
|
|
481
|
+
const markdownOutput = hasFlag(argv, "--markdown") || getArgValue(argv, "--format") === "markdown" || getArgValue(argv, "--format") === "spec";
|
|
482
|
+
return !jsonOutput && !markdownOutput;
|
|
483
|
+
}
|
|
484
|
+
async function handleWorkflowGet(argv, apiUrl, token) {
|
|
485
|
+
const workflowId = argv[0];
|
|
486
|
+
if (!workflowId || workflowId.startsWith("--")) {
|
|
487
|
+
console.error("Error: Missing workflow ID.");
|
|
488
|
+
console.error("Usage: canary workflow get <workflowId>");
|
|
489
|
+
process3.exit(1);
|
|
490
|
+
}
|
|
491
|
+
const markdownOutput = hasFlag(argv, "--markdown") || getArgValue(argv, "--format") === "markdown" || getArgValue(argv, "--format") === "spec";
|
|
492
|
+
const outputFile = getArgValue(argv, "--output");
|
|
493
|
+
const apiRes = await apiFetch(`${apiUrl}/workflows/${workflowId}`, {
|
|
494
|
+
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
|
|
495
|
+
token
|
|
496
|
+
});
|
|
497
|
+
if (!apiRes.ok) exitOnFailure(apiRes.failure);
|
|
498
|
+
const result = await apiRes.response.json();
|
|
499
|
+
if (result.error === "WORKFLOW_NOT_FOUND") {
|
|
500
|
+
console.error("Error: Workflow not found.");
|
|
501
|
+
process3.exit(1);
|
|
502
|
+
}
|
|
503
|
+
if (result.error === "WORKFLOW_WRONG_ORG") {
|
|
504
|
+
console.error(
|
|
505
|
+
`Error: Workflow belongs to another org: ${result.targetOrgName ?? result.targetOrgId}`
|
|
506
|
+
);
|
|
507
|
+
process3.exit(1);
|
|
508
|
+
}
|
|
509
|
+
if (!result.workflow) {
|
|
510
|
+
console.error(`Error: ${result.error ?? "Unexpected response"}`);
|
|
511
|
+
process3.exit(1);
|
|
512
|
+
}
|
|
513
|
+
const workflow = result.workflow;
|
|
514
|
+
let output;
|
|
515
|
+
if (markdownOutput) {
|
|
516
|
+
output = formatWorkflowMarkdown(workflow);
|
|
517
|
+
} else {
|
|
518
|
+
output = JSON.stringify(formatWorkflowJson(workflow), null, 2);
|
|
519
|
+
}
|
|
520
|
+
if (outputFile) {
|
|
521
|
+
try {
|
|
522
|
+
await fs2.writeFile(outputFile, output, "utf-8");
|
|
523
|
+
console.log(`Written to ${outputFile}`);
|
|
524
|
+
} catch (err) {
|
|
525
|
+
console.error(
|
|
526
|
+
`Error writing to ${outputFile}: ${err instanceof Error ? err.message : String(err)}`
|
|
527
|
+
);
|
|
528
|
+
process3.exit(1);
|
|
529
|
+
}
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
console.log(output);
|
|
533
|
+
if (shouldPrintWorkflowUrlTrailer(argv)) {
|
|
534
|
+
const appUrl = resolveAppUrl(apiUrl);
|
|
535
|
+
console.log(`
|
|
536
|
+
URL: ${appUrl}/flows/${workflowId}`);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// src/workflow-run.ts
|
|
541
|
+
import process4 from "process";
|
|
542
|
+
|
|
354
543
|
// src/cli-format.ts
|
|
355
544
|
var STATUS_ICONS = {
|
|
356
545
|
completed: "\u2705",
|
|
@@ -428,7 +617,7 @@ async function handleWorkflowRun(argv, apiUrl, token) {
|
|
|
428
617
|
console.error(
|
|
429
618
|
"Usage: canary workflow run <workflowId> [--environment <name|id>] [--stream] [--json] [--validation | --no-validation]"
|
|
430
619
|
);
|
|
431
|
-
|
|
620
|
+
process4.exit(1);
|
|
432
621
|
}
|
|
433
622
|
const jsonOutput = hasFlag(argv, "--json");
|
|
434
623
|
const stream = hasFlag(argv, "--stream");
|
|
@@ -461,7 +650,7 @@ async function handleWorkflowRun(argv, apiUrl, token) {
|
|
|
461
650
|
const rendered = renderWorkflowUserError(result);
|
|
462
651
|
console.error(rendered ?? `Error: ${result.error ?? "Unknown error"}`);
|
|
463
652
|
}
|
|
464
|
-
|
|
653
|
+
process4.exit(1);
|
|
465
654
|
}
|
|
466
655
|
const { runId } = result;
|
|
467
656
|
if (jsonOutput && !stream) {
|
|
@@ -499,7 +688,7 @@ Check status: canary workflow runs get ${workflowId} ${runId}`);
|
|
|
499
688
|
);
|
|
500
689
|
if (!status.ok) {
|
|
501
690
|
console.error(`Error polling status: ${status.error ?? "Unknown error"}`);
|
|
502
|
-
|
|
691
|
+
process4.exit(1);
|
|
503
692
|
}
|
|
504
693
|
const run = status.data.run;
|
|
505
694
|
if (run.status !== lastStatus) {
|
|
@@ -515,7 +704,7 @@ Error: ${run.errorMessage}`);
|
|
|
515
704
|
Run finished: ${run.status}`);
|
|
516
705
|
console.log(`Details: canary workflow runs get ${workflowId} ${runId}`);
|
|
517
706
|
if (run.status === "failed" || run.status === "timeout" || run.status === "canceled") {
|
|
518
|
-
|
|
707
|
+
process4.exit(1);
|
|
519
708
|
}
|
|
520
709
|
return;
|
|
521
710
|
}
|
|
@@ -523,7 +712,7 @@ Run finished: ${run.status}`);
|
|
|
523
712
|
}
|
|
524
713
|
|
|
525
714
|
// src/workflow-runs.ts
|
|
526
|
-
import
|
|
715
|
+
import process5 from "process";
|
|
527
716
|
async function fetchBrowserRuns(apiUrl, token, workflowId, page, pageSize) {
|
|
528
717
|
const params = new URLSearchParams({ page, pageSize });
|
|
529
718
|
const result = await apiRequest(
|
|
@@ -574,7 +763,7 @@ async function handleRunsList(argv, apiUrl, token) {
|
|
|
574
763
|
const workflowId = argv.find((a) => !a.startsWith("-"));
|
|
575
764
|
if (!workflowId) {
|
|
576
765
|
console.error("Error: Missing workflow ID. Usage: canary workflow runs list <workflowId>");
|
|
577
|
-
|
|
766
|
+
process5.exit(1);
|
|
578
767
|
}
|
|
579
768
|
const jsonOutput = hasFlag(argv, "--json");
|
|
580
769
|
const page = getArgValue(argv, "--page") ?? "1";
|
|
@@ -583,7 +772,7 @@ async function handleRunsList(argv, apiUrl, token) {
|
|
|
583
772
|
const sideArg = (explicitSide ?? "all").toLowerCase();
|
|
584
773
|
if (!["all", "api", "browser"].includes(sideArg)) {
|
|
585
774
|
console.error(`Error: --side must be one of: all, api, browser (got "${sideArg}")`);
|
|
586
|
-
|
|
775
|
+
process5.exit(1);
|
|
587
776
|
}
|
|
588
777
|
const annotated = [];
|
|
589
778
|
let browserPagination = null;
|
|
@@ -592,7 +781,7 @@ async function handleRunsList(argv, apiUrl, token) {
|
|
|
592
781
|
const browser = await fetchBrowserRuns(apiUrl, token, workflowId, page, pageSize);
|
|
593
782
|
if ("error" in browser) {
|
|
594
783
|
console.error(`Error: ${browser.error}`);
|
|
595
|
-
|
|
784
|
+
process5.exit(1);
|
|
596
785
|
}
|
|
597
786
|
browserPagination = browser.pagination;
|
|
598
787
|
for (const r of browser.runs) annotated.push({ ...r, side: "browser" });
|
|
@@ -607,7 +796,7 @@ async function handleRunsList(argv, apiUrl, token) {
|
|
|
607
796
|
}
|
|
608
797
|
} else {
|
|
609
798
|
console.error(`Error: ${api.error}`);
|
|
610
|
-
|
|
799
|
+
process5.exit(1);
|
|
611
800
|
}
|
|
612
801
|
} else {
|
|
613
802
|
apiPagination = api.pagination;
|
|
@@ -674,7 +863,7 @@ async function handleRunsGet(argv, apiUrl, token) {
|
|
|
674
863
|
console.error(
|
|
675
864
|
"Error: Missing arguments. Usage: canary workflow runs get <workflowId> <runId>"
|
|
676
865
|
);
|
|
677
|
-
|
|
866
|
+
process5.exit(1);
|
|
678
867
|
}
|
|
679
868
|
const [workflowId, runId] = positional;
|
|
680
869
|
const jsonOutput = hasFlag(argv, "--json");
|
|
@@ -686,7 +875,7 @@ async function handleRunsGet(argv, apiUrl, token) {
|
|
|
686
875
|
);
|
|
687
876
|
if (!result.ok) {
|
|
688
877
|
console.error(`Error: ${result.error ?? "Unknown error"}`);
|
|
689
|
-
|
|
878
|
+
process5.exit(1);
|
|
690
879
|
}
|
|
691
880
|
if (jsonOutput) {
|
|
692
881
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -728,7 +917,7 @@ async function handleRunsDiagnostics(argv, apiUrl, token) {
|
|
|
728
917
|
console.error(
|
|
729
918
|
"Error: Missing arguments. Usage: canary workflow runs diagnostics <workflowId> <runId>"
|
|
730
919
|
);
|
|
731
|
-
|
|
920
|
+
process5.exit(1);
|
|
732
921
|
}
|
|
733
922
|
const [workflowId, runId] = positional;
|
|
734
923
|
const jsonOutput = hasFlag(argv, "--json");
|
|
@@ -740,7 +929,7 @@ async function handleRunsDiagnostics(argv, apiUrl, token) {
|
|
|
740
929
|
);
|
|
741
930
|
if (!result.ok) {
|
|
742
931
|
console.error(`Error: ${result.error ?? "Unknown error"}`);
|
|
743
|
-
|
|
932
|
+
process5.exit(1);
|
|
744
933
|
}
|
|
745
934
|
if (jsonOutput && result.data) {
|
|
746
935
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -874,14 +1063,14 @@ async function runWorkflowRuns(argv, apiUrl, token) {
|
|
|
874
1063
|
default:
|
|
875
1064
|
console.error(`Unknown sub-command: ${subCommand}`);
|
|
876
1065
|
printRunsHelp();
|
|
877
|
-
|
|
1066
|
+
process5.exit(1);
|
|
878
1067
|
}
|
|
879
1068
|
}
|
|
880
1069
|
|
|
881
1070
|
// src/workflow-sync.ts
|
|
882
1071
|
import crypto from "crypto";
|
|
883
|
-
import
|
|
884
|
-
import
|
|
1072
|
+
import fs3 from "fs/promises";
|
|
1073
|
+
import process6 from "process";
|
|
885
1074
|
function normalizeNodesAndEdges(rawNodes, rawEdges) {
|
|
886
1075
|
const nodes = rawNodes.map((node, i) => ({
|
|
887
1076
|
...node,
|
|
@@ -913,28 +1102,28 @@ async function readSyncInput(argv) {
|
|
|
913
1102
|
let raw;
|
|
914
1103
|
if (filePath) {
|
|
915
1104
|
try {
|
|
916
|
-
raw = await
|
|
1105
|
+
raw = await fs3.readFile(filePath, "utf-8");
|
|
917
1106
|
} catch (err) {
|
|
918
1107
|
console.error(`Error reading file: ${err instanceof Error ? err.message : String(err)}`);
|
|
919
|
-
|
|
1108
|
+
process6.exit(1);
|
|
920
1109
|
}
|
|
921
1110
|
} else if (fromStdin) {
|
|
922
1111
|
try {
|
|
923
1112
|
raw = await readFromStdin2();
|
|
924
1113
|
} catch (err) {
|
|
925
1114
|
console.error(err instanceof Error ? err.message : String(err));
|
|
926
|
-
|
|
1115
|
+
process6.exit(1);
|
|
927
1116
|
}
|
|
928
1117
|
} else {
|
|
929
1118
|
console.error("Error: Must provide --from-file <path> or --from-stdin");
|
|
930
|
-
|
|
1119
|
+
process6.exit(1);
|
|
931
1120
|
}
|
|
932
1121
|
let parsed;
|
|
933
1122
|
try {
|
|
934
1123
|
parsed = JSON.parse(raw);
|
|
935
1124
|
} catch {
|
|
936
1125
|
console.error("Error: Invalid JSON input");
|
|
937
|
-
|
|
1126
|
+
process6.exit(1);
|
|
938
1127
|
}
|
|
939
1128
|
const obj = parsed;
|
|
940
1129
|
const normalizeNodes = (raw2) => {
|
|
@@ -968,7 +1157,7 @@ async function readSyncInput(argv) {
|
|
|
968
1157
|
console.error(' { "workflow": { "nodes": [...], "edges": [...] } }');
|
|
969
1158
|
console.error("");
|
|
970
1159
|
console.error("Edges, IDs, positions, and ordering are auto-generated when omitted.");
|
|
971
|
-
|
|
1160
|
+
process6.exit(1);
|
|
972
1161
|
}
|
|
973
1162
|
async function alignWithCurrentWorkflow(apiUrl, token, workflowId, nodes, edges) {
|
|
974
1163
|
let currentNodes = [];
|
|
@@ -1023,7 +1212,7 @@ async function handleWorkflowSync(argv, apiUrl, token) {
|
|
|
1023
1212
|
if (!workflowId) {
|
|
1024
1213
|
console.error("Error: Missing workflow ID.");
|
|
1025
1214
|
console.error("Usage: canary workflow sync <workflowId> --from-file <path>");
|
|
1026
|
-
|
|
1215
|
+
process6.exit(1);
|
|
1027
1216
|
}
|
|
1028
1217
|
const jsonOutput = hasFlag(argv, "--json");
|
|
1029
1218
|
const noSnapshot = hasFlag(argv, "--no-snapshot");
|
|
@@ -1053,7 +1242,7 @@ async function handleWorkflowSync(argv, apiUrl, token) {
|
|
|
1053
1242
|
} else {
|
|
1054
1243
|
console.error(`Error: ${result2.error ?? "Unknown error"}`);
|
|
1055
1244
|
}
|
|
1056
|
-
|
|
1245
|
+
process6.exit(1);
|
|
1057
1246
|
}
|
|
1058
1247
|
if (jsonOutput) {
|
|
1059
1248
|
console.log(JSON.stringify(result2, null, 2));
|
|
@@ -1078,7 +1267,7 @@ async function handleWorkflowSync(argv, apiUrl, token) {
|
|
|
1078
1267
|
} else {
|
|
1079
1268
|
console.error(`Error: ${result.error ?? "Unknown error"}`);
|
|
1080
1269
|
}
|
|
1081
|
-
|
|
1270
|
+
process6.exit(1);
|
|
1082
1271
|
}
|
|
1083
1272
|
if (jsonOutput) {
|
|
1084
1273
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -1091,7 +1280,7 @@ async function handleWorkflowSync(argv, apiUrl, token) {
|
|
|
1091
1280
|
}
|
|
1092
1281
|
|
|
1093
1282
|
// src/workflow-api-sequence.ts
|
|
1094
|
-
import
|
|
1283
|
+
import process7 from "process";
|
|
1095
1284
|
import { createParser } from "eventsource-parser";
|
|
1096
1285
|
async function handleWorkflowGenerateApiSequence(argv, apiUrl, token) {
|
|
1097
1286
|
const workflowId = argv.find((a) => !a.startsWith("-"));
|
|
@@ -1106,7 +1295,7 @@ async function handleWorkflowGenerateApiSequence(argv, apiUrl, token) {
|
|
|
1106
1295
|
console.error("Usage:");
|
|
1107
1296
|
console.error(' canary workflow generate-api-sequence <workflowId> [--guidance "text"]');
|
|
1108
1297
|
console.error(' canary workflow generate-api-sequence --prompt "Create user" [--property <id>]');
|
|
1109
|
-
|
|
1298
|
+
process7.exit(1);
|
|
1110
1299
|
}
|
|
1111
1300
|
let endpoint;
|
|
1112
1301
|
let body;
|
|
@@ -1138,22 +1327,22 @@ async function handleWorkflowGenerateApiSequence(argv, apiUrl, token) {
|
|
|
1138
1327
|
});
|
|
1139
1328
|
} catch (err) {
|
|
1140
1329
|
console.error(`Failed to connect to API: ${err}`);
|
|
1141
|
-
|
|
1330
|
+
process7.exit(1);
|
|
1142
1331
|
}
|
|
1143
1332
|
if (triggerRes.status === 403) {
|
|
1144
1333
|
const data = await triggerRes.json().catch(() => ({}));
|
|
1145
1334
|
console.error(`Error: ${data.error ?? "This feature is not enabled for your organization."}`);
|
|
1146
|
-
|
|
1335
|
+
process7.exit(1);
|
|
1147
1336
|
}
|
|
1148
1337
|
if (!triggerRes.ok) {
|
|
1149
1338
|
const data = await triggerRes.json().catch(() => ({}));
|
|
1150
1339
|
console.error(`Error: ${data.error ?? `${triggerRes.status} ${triggerRes.statusText}`}`);
|
|
1151
|
-
|
|
1340
|
+
process7.exit(1);
|
|
1152
1341
|
}
|
|
1153
1342
|
const triggerData = await triggerRes.json();
|
|
1154
1343
|
if (!triggerData.ok || !triggerData.generationId) {
|
|
1155
1344
|
console.error(`Error: ${triggerData.error ?? "Failed to start generation"}`);
|
|
1156
|
-
|
|
1345
|
+
process7.exit(1);
|
|
1157
1346
|
}
|
|
1158
1347
|
const { generationId } = triggerData;
|
|
1159
1348
|
const streamUrl = `${apiUrl}/api-sequence-agent/stream?generationId=${generationId}`;
|
|
@@ -1167,11 +1356,11 @@ async function handleWorkflowGenerateApiSequence(argv, apiUrl, token) {
|
|
|
1167
1356
|
});
|
|
1168
1357
|
} catch (err) {
|
|
1169
1358
|
console.error(`Failed to connect to event stream: ${err}`);
|
|
1170
|
-
|
|
1359
|
+
process7.exit(1);
|
|
1171
1360
|
}
|
|
1172
1361
|
if (!streamRes.ok || !streamRes.body) {
|
|
1173
1362
|
console.error(`Failed to connect to event stream: ${streamRes.status}`);
|
|
1174
|
-
|
|
1363
|
+
process7.exit(1);
|
|
1175
1364
|
}
|
|
1176
1365
|
let resultConfig = null;
|
|
1177
1366
|
let resultSummary = "";
|
|
@@ -1196,7 +1385,7 @@ async function handleWorkflowGenerateApiSequence(argv, apiUrl, token) {
|
|
|
1196
1385
|
}
|
|
1197
1386
|
break;
|
|
1198
1387
|
case "text":
|
|
1199
|
-
if (verbose)
|
|
1388
|
+
if (verbose) process7.stderr.write(data.delta);
|
|
1200
1389
|
break;
|
|
1201
1390
|
case "complete":
|
|
1202
1391
|
resultConfig = data.config;
|
|
@@ -1226,11 +1415,11 @@ Error: ${data.message}`);
|
|
|
1226
1415
|
reader.releaseLock();
|
|
1227
1416
|
}
|
|
1228
1417
|
if (exitCode !== 0) {
|
|
1229
|
-
|
|
1418
|
+
process7.exit(exitCode);
|
|
1230
1419
|
}
|
|
1231
1420
|
if (!resultConfig) {
|
|
1232
1421
|
console.error("Generation completed but no config was returned.");
|
|
1233
|
-
|
|
1422
|
+
process7.exit(1);
|
|
1234
1423
|
}
|
|
1235
1424
|
if (jsonOutput) {
|
|
1236
1425
|
console.log(JSON.stringify({ ok: true, config: resultConfig, summary: resultSummary }, null, 2));
|
|
@@ -1245,8 +1434,8 @@ Error: ${data.message}`);
|
|
|
1245
1434
|
}
|
|
1246
1435
|
|
|
1247
1436
|
// src/workflow-api-sequence-cmds.ts
|
|
1248
|
-
import
|
|
1249
|
-
import
|
|
1437
|
+
import fs4 from "fs/promises";
|
|
1438
|
+
import process8 from "process";
|
|
1250
1439
|
function getArg(argv, key) {
|
|
1251
1440
|
const prefix = `${key}=`;
|
|
1252
1441
|
const eq = argv.find((a) => a.startsWith(prefix));
|
|
@@ -1256,7 +1445,7 @@ function getArg(argv, key) {
|
|
|
1256
1445
|
function wantsJson(argv) {
|
|
1257
1446
|
if (hasFlag(argv, "--json")) return true;
|
|
1258
1447
|
if (hasFlag(argv, "--text")) return false;
|
|
1259
|
-
return !
|
|
1448
|
+
return !process8.stdout.isTTY;
|
|
1260
1449
|
}
|
|
1261
1450
|
function emit(argv, textFallback, json) {
|
|
1262
1451
|
if (wantsJson(argv)) {
|
|
@@ -1269,8 +1458,8 @@ async function readJsonInput(argv) {
|
|
|
1269
1458
|
const fromFile = getArg(argv, "--from-file");
|
|
1270
1459
|
let raw;
|
|
1271
1460
|
if (fromFile) {
|
|
1272
|
-
raw = await
|
|
1273
|
-
} else if (hasFlag(argv, "--from-stdin") || !
|
|
1461
|
+
raw = await fs4.readFile(fromFile, "utf-8");
|
|
1462
|
+
} else if (hasFlag(argv, "--from-stdin") || !process8.stdin.isTTY) {
|
|
1274
1463
|
raw = await readStdin();
|
|
1275
1464
|
} else {
|
|
1276
1465
|
throw new Error("Provide --from-file <path> or pipe JSON on stdin.");
|
|
@@ -1284,11 +1473,11 @@ async function readJsonInput(argv) {
|
|
|
1284
1473
|
function readStdin() {
|
|
1285
1474
|
return new Promise((resolve, reject) => {
|
|
1286
1475
|
const chunks = [];
|
|
1287
|
-
|
|
1476
|
+
process8.stdin.on("data", (chunk) => {
|
|
1288
1477
|
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
1289
1478
|
});
|
|
1290
|
-
|
|
1291
|
-
|
|
1479
|
+
process8.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
1480
|
+
process8.stdin.on("error", reject);
|
|
1292
1481
|
});
|
|
1293
1482
|
}
|
|
1294
1483
|
function reportAndMaybeExit(argv, result) {
|
|
@@ -1323,7 +1512,7 @@ function reportAndMaybeExit(argv, result) {
|
|
|
1323
1512
|
"Re-run with --json for machine-readable output, or fix the listed fields and retry."
|
|
1324
1513
|
);
|
|
1325
1514
|
}
|
|
1326
|
-
|
|
1515
|
+
process8.exit(1);
|
|
1327
1516
|
}
|
|
1328
1517
|
return;
|
|
1329
1518
|
}
|
|
@@ -1351,7 +1540,7 @@ async function handleWorkflowApiSequence(argv, apiUrl, token) {
|
|
|
1351
1540
|
break;
|
|
1352
1541
|
default:
|
|
1353
1542
|
printHelp();
|
|
1354
|
-
|
|
1543
|
+
process8.exit(verb ? 1 : 0);
|
|
1355
1544
|
}
|
|
1356
1545
|
}
|
|
1357
1546
|
function printHelp() {
|
|
@@ -1386,12 +1575,12 @@ async function fetchSequenceByWorkflow(apiUrl, token, workflowId) {
|
|
|
1386
1575
|
);
|
|
1387
1576
|
if (!res.ok) {
|
|
1388
1577
|
console.error(`Error: ${res.error ?? "Failed to fetch sequence"}`);
|
|
1389
|
-
|
|
1578
|
+
process8.exit(1);
|
|
1390
1579
|
}
|
|
1391
1580
|
if (!res.data) {
|
|
1392
1581
|
console.error(`Error: Workflow ${workflowId} has no attached API sequence.`);
|
|
1393
1582
|
console.error("Create one with: canary workflow create --api-only --name <n> --sequence-from-file seq.json");
|
|
1394
|
-
|
|
1583
|
+
process8.exit(1);
|
|
1395
1584
|
}
|
|
1396
1585
|
return res.data;
|
|
1397
1586
|
}
|
|
@@ -1400,7 +1589,7 @@ async function handleGet(argv, apiUrl, token) {
|
|
|
1400
1589
|
if (!workflowId) {
|
|
1401
1590
|
console.error("Error: Missing workflow ID.");
|
|
1402
1591
|
printHelp();
|
|
1403
|
-
|
|
1592
|
+
process8.exit(1);
|
|
1404
1593
|
}
|
|
1405
1594
|
const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);
|
|
1406
1595
|
emit(argv, renderSequence(seq), seq);
|
|
@@ -1410,19 +1599,19 @@ async function handleUpdate(argv, apiUrl, token) {
|
|
|
1410
1599
|
if (!workflowId) {
|
|
1411
1600
|
console.error("Error: Missing workflow ID.");
|
|
1412
1601
|
printHelp();
|
|
1413
|
-
|
|
1602
|
+
process8.exit(1);
|
|
1414
1603
|
}
|
|
1415
1604
|
let parsed;
|
|
1416
1605
|
try {
|
|
1417
1606
|
parsed = await readJsonInput(argv);
|
|
1418
1607
|
} catch (err) {
|
|
1419
1608
|
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
1420
|
-
|
|
1609
|
+
process8.exit(1);
|
|
1421
1610
|
}
|
|
1422
1611
|
const config = parsed;
|
|
1423
1612
|
if (!config || !Array.isArray(config.steps)) {
|
|
1424
1613
|
console.error('Error: Input must have a "steps" array. Got: ' + JSON.stringify(config));
|
|
1425
|
-
|
|
1614
|
+
process8.exit(1);
|
|
1426
1615
|
}
|
|
1427
1616
|
const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);
|
|
1428
1617
|
const result = await apiRequest(
|
|
@@ -1435,7 +1624,7 @@ async function handleUpdate(argv, apiUrl, token) {
|
|
|
1435
1624
|
reportAndMaybeExit(argv, result);
|
|
1436
1625
|
if (!result.ok) {
|
|
1437
1626
|
console.error(`Error: ${result.error ?? "Update failed"}`);
|
|
1438
|
-
|
|
1627
|
+
process8.exit(1);
|
|
1439
1628
|
}
|
|
1440
1629
|
emit(
|
|
1441
1630
|
argv,
|
|
@@ -1448,7 +1637,7 @@ async function handleExecute(argv, apiUrl, token) {
|
|
|
1448
1637
|
if (!workflowId) {
|
|
1449
1638
|
console.error("Error: Missing workflow ID.");
|
|
1450
1639
|
printHelp();
|
|
1451
|
-
|
|
1640
|
+
process8.exit(1);
|
|
1452
1641
|
}
|
|
1453
1642
|
const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);
|
|
1454
1643
|
const result = await apiRequest(
|
|
@@ -1459,7 +1648,7 @@ async function handleExecute(argv, apiUrl, token) {
|
|
|
1459
1648
|
);
|
|
1460
1649
|
if (!result.ok || !result.data) {
|
|
1461
1650
|
console.error(`Error: ${result.error ?? "Execute failed"}`);
|
|
1462
|
-
|
|
1651
|
+
process8.exit(1);
|
|
1463
1652
|
}
|
|
1464
1653
|
emit(
|
|
1465
1654
|
argv,
|
|
@@ -1473,7 +1662,7 @@ async function handleDelete(argv, apiUrl, token) {
|
|
|
1473
1662
|
if (!workflowId) {
|
|
1474
1663
|
console.error("Error: Missing workflow ID.");
|
|
1475
1664
|
printHelp();
|
|
1476
|
-
|
|
1665
|
+
process8.exit(1);
|
|
1477
1666
|
}
|
|
1478
1667
|
const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);
|
|
1479
1668
|
const result = await apiRequest(
|
|
@@ -1484,7 +1673,7 @@ async function handleDelete(argv, apiUrl, token) {
|
|
|
1484
1673
|
);
|
|
1485
1674
|
if (!result.ok) {
|
|
1486
1675
|
console.error(`Error: ${result.error ?? "Delete failed"}`);
|
|
1487
|
-
|
|
1676
|
+
process8.exit(1);
|
|
1488
1677
|
}
|
|
1489
1678
|
emit(argv, `Deleted api-sequence ${seq.id} (workflow ${workflowId}).`, result);
|
|
1490
1679
|
}
|
|
@@ -1493,7 +1682,7 @@ async function handleSetApiOnly(argv, apiUrl, token) {
|
|
|
1493
1682
|
if (!workflowId) {
|
|
1494
1683
|
console.error("Error: Missing workflow ID.");
|
|
1495
1684
|
printHelp();
|
|
1496
|
-
|
|
1685
|
+
process8.exit(1);
|
|
1497
1686
|
}
|
|
1498
1687
|
const apiOnly = !hasFlag(argv, "--off");
|
|
1499
1688
|
const result = await apiRequest(
|
|
@@ -1505,7 +1694,7 @@ async function handleSetApiOnly(argv, apiUrl, token) {
|
|
|
1505
1694
|
);
|
|
1506
1695
|
if (!result.ok) {
|
|
1507
1696
|
console.error(`Error: ${result.error ?? "Update failed"}`);
|
|
1508
|
-
|
|
1697
|
+
process8.exit(1);
|
|
1509
1698
|
}
|
|
1510
1699
|
emit(argv, `Workflow ${workflowId} apiOnly=${apiOnly}.`, result);
|
|
1511
1700
|
}
|
|
@@ -1540,8 +1729,8 @@ function renderSequence(seq) {
|
|
|
1540
1729
|
}
|
|
1541
1730
|
|
|
1542
1731
|
// src/workflow-seed-create.ts
|
|
1543
|
-
import
|
|
1544
|
-
import
|
|
1732
|
+
import fs5 from "fs/promises";
|
|
1733
|
+
import process9 from "process";
|
|
1545
1734
|
function getAllArgValues(argv, flag) {
|
|
1546
1735
|
const values = [];
|
|
1547
1736
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -1570,7 +1759,7 @@ function parseOutputFlag(value) {
|
|
|
1570
1759
|
}
|
|
1571
1760
|
async function readFromStdin3() {
|
|
1572
1761
|
const chunks = [];
|
|
1573
|
-
const stdin =
|
|
1762
|
+
const stdin = process9.stdin;
|
|
1574
1763
|
if (stdin.isTTY) {
|
|
1575
1764
|
throw new Error("No input on stdin. Pipe JSON or use --from-file.");
|
|
1576
1765
|
}
|
|
@@ -1587,7 +1776,7 @@ async function readJsonInput2(argv) {
|
|
|
1587
1776
|
const fromFile = getArgValue(argv, "--from-file");
|
|
1588
1777
|
if (fromFile) {
|
|
1589
1778
|
try {
|
|
1590
|
-
raw = await
|
|
1779
|
+
raw = await fs5.readFile(fromFile, "utf-8");
|
|
1591
1780
|
} catch (err) {
|
|
1592
1781
|
throw new Error(`Failed to read file ${fromFile}: ${err instanceof Error ? err.message : String(err)}`);
|
|
1593
1782
|
}
|
|
@@ -1626,7 +1815,7 @@ function resolveInput(argv) {
|
|
|
1626
1815
|
if (!name) {
|
|
1627
1816
|
console.error("Error: --name is required (or use --from-stdin / --from-file for JSON input).");
|
|
1628
1817
|
console.error("Usage: canary workflow seed create --name <name> [--output key:name[:desc]] ...");
|
|
1629
|
-
|
|
1818
|
+
process9.exit(1);
|
|
1630
1819
|
}
|
|
1631
1820
|
const description = getArgValue(argv, "--description");
|
|
1632
1821
|
const status = getArgValue(argv, "--status");
|
|
@@ -1646,7 +1835,7 @@ function resolveInput(argv) {
|
|
|
1646
1835
|
outputs.push(...parsed);
|
|
1647
1836
|
} catch (err) {
|
|
1648
1837
|
console.error(`Error: Invalid --outputs-json: ${err instanceof Error ? err.message : String(err)}`);
|
|
1649
|
-
|
|
1838
|
+
process9.exit(1);
|
|
1650
1839
|
}
|
|
1651
1840
|
}
|
|
1652
1841
|
return { name, description: description || void 0, status, outputs };
|
|
@@ -1663,7 +1852,7 @@ async function handleWorkflowSeedCreate(argv, apiUrl, token) {
|
|
|
1663
1852
|
input = await resolveInput(argv);
|
|
1664
1853
|
} catch (err) {
|
|
1665
1854
|
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
1666
|
-
|
|
1855
|
+
process9.exit(1);
|
|
1667
1856
|
}
|
|
1668
1857
|
const seedResult = await apiRequest(
|
|
1669
1858
|
apiUrl,
|
|
@@ -1684,7 +1873,7 @@ async function handleWorkflowSeedCreate(argv, apiUrl, token) {
|
|
|
1684
1873
|
} else {
|
|
1685
1874
|
console.error(`Error: ${seedResult.error ?? "Failed to create seed workflow"}`);
|
|
1686
1875
|
}
|
|
1687
|
-
|
|
1876
|
+
process9.exit(1);
|
|
1688
1877
|
}
|
|
1689
1878
|
const seedId = seedResult.workflow.id;
|
|
1690
1879
|
const appUrl = resolveAppUrl(apiUrl);
|
|
@@ -1826,127 +2015,6 @@ var WORKFLOW_STATUS_DESCRIPTIONS = {
|
|
|
1826
2015
|
var formatWorkflowStatusList = () => USER_SETTABLE_WORKFLOW_STATUSES.map(
|
|
1827
2016
|
(s) => `${s} (${WORKFLOW_STATUS_DESCRIPTIONS[s]})`
|
|
1828
2017
|
).join(", ");
|
|
1829
|
-
function truncate(text, max) {
|
|
1830
|
-
if (text.length <= max) return text;
|
|
1831
|
-
return text.slice(0, max - 1) + "\u2026";
|
|
1832
|
-
}
|
|
1833
|
-
function getNodeTitle(node) {
|
|
1834
|
-
const c = node.configJson ?? {};
|
|
1835
|
-
switch (node.nodeType) {
|
|
1836
|
-
case "login":
|
|
1837
|
-
return c.credentialName || NODE_TYPE_LABEL.login;
|
|
1838
|
-
case "navigate":
|
|
1839
|
-
return c.pageTitle || truncate(c.pageUrl || "Navigate", 40);
|
|
1840
|
-
case "action":
|
|
1841
|
-
return c.customActionTitle || truncate(c.actionDescription || "Action", 50);
|
|
1842
|
-
case "assertion":
|
|
1843
|
-
return truncate(c.condition || "Assertion", 50);
|
|
1844
|
-
case "setup":
|
|
1845
|
-
return c.setupFlowName || "Setup";
|
|
1846
|
-
case "seed":
|
|
1847
|
-
return c.seedWorkflowName || "Seed";
|
|
1848
|
-
case "wait":
|
|
1849
|
-
return "Wait";
|
|
1850
|
-
case "condition":
|
|
1851
|
-
return truncate(c.conditionDescription || "Condition", 50);
|
|
1852
|
-
case "end":
|
|
1853
|
-
return "End";
|
|
1854
|
-
case "api_sequence":
|
|
1855
|
-
return "API Sequence";
|
|
1856
|
-
default:
|
|
1857
|
-
return node.nodeType;
|
|
1858
|
-
}
|
|
1859
|
-
}
|
|
1860
|
-
function getCleanConfig(node) {
|
|
1861
|
-
const c = node.configJson ?? {};
|
|
1862
|
-
switch (node.nodeType) {
|
|
1863
|
-
case "login":
|
|
1864
|
-
return pick(c, [
|
|
1865
|
-
"credentialName",
|
|
1866
|
-
"performLogin",
|
|
1867
|
-
"credentialSource",
|
|
1868
|
-
"credentialTemplateId",
|
|
1869
|
-
"credentialTemplateName",
|
|
1870
|
-
"credentialId",
|
|
1871
|
-
"seedCredentialRef"
|
|
1872
|
-
]);
|
|
1873
|
-
case "navigate":
|
|
1874
|
-
return {
|
|
1875
|
-
...pick(c, ["pageUrl", "pageTitle"]),
|
|
1876
|
-
...c.openInNewTab ? { openInNewTab: true } : {}
|
|
1877
|
-
};
|
|
1878
|
-
case "action":
|
|
1879
|
-
return pick(c, [
|
|
1880
|
-
"actionDescription",
|
|
1881
|
-
"playbookSteps",
|
|
1882
|
-
"inputValues",
|
|
1883
|
-
"declaredOutputs",
|
|
1884
|
-
"capturedVariableKeys",
|
|
1885
|
-
"dataRequirements",
|
|
1886
|
-
"alwaysUseAgent"
|
|
1887
|
-
]);
|
|
1888
|
-
case "assertion":
|
|
1889
|
-
return pick(c, ["condition", "expectedOutcome", "strict", "alwaysUseAgent"]);
|
|
1890
|
-
case "setup":
|
|
1891
|
-
return pick(c, ["setupFlowId", "setupFlowName"]);
|
|
1892
|
-
case "seed":
|
|
1893
|
-
return pick(c, ["seedWorkflowId", "seedWorkflowName", "snapshotVersion"]);
|
|
1894
|
-
case "end":
|
|
1895
|
-
return pick(c, ["outcome"]);
|
|
1896
|
-
case "wait":
|
|
1897
|
-
case "condition":
|
|
1898
|
-
case "api_sequence":
|
|
1899
|
-
return c;
|
|
1900
|
-
default:
|
|
1901
|
-
return c;
|
|
1902
|
-
}
|
|
1903
|
-
}
|
|
1904
|
-
function pick(obj, keys) {
|
|
1905
|
-
const result = {};
|
|
1906
|
-
for (const key of keys) {
|
|
1907
|
-
if (obj[key] !== void 0 && obj[key] !== null) {
|
|
1908
|
-
result[key] = obj[key];
|
|
1909
|
-
}
|
|
1910
|
-
}
|
|
1911
|
-
return result;
|
|
1912
|
-
}
|
|
1913
|
-
function formatWorkflowMarkdown(workflow) {
|
|
1914
|
-
const seedOutputs = workflow.seedOutputsJson ?? workflow.seedOutputs;
|
|
1915
|
-
return workflowToSpec({ ...workflow, seedOutputs });
|
|
1916
|
-
}
|
|
1917
|
-
function formatWorkflowJson(workflow) {
|
|
1918
|
-
const sorted = topoOrderNodes(workflow.nodes, workflow.edges ?? []);
|
|
1919
|
-
const seedOutputs = workflow.seedOutputsJson;
|
|
1920
|
-
const env = workflow;
|
|
1921
|
-
return {
|
|
1922
|
-
workflow: {
|
|
1923
|
-
id: workflow.id,
|
|
1924
|
-
name: workflow.name,
|
|
1925
|
-
description: workflow.description,
|
|
1926
|
-
status: workflow.status,
|
|
1927
|
-
flowType: workflow.flowType,
|
|
1928
|
-
...seedOutputs && seedOutputs.length > 0 ? { seedOutputs } : {},
|
|
1929
|
-
...env.defaultEnvironmentId !== void 0 ? { defaultEnvironmentId: env.defaultEnvironmentId } : {},
|
|
1930
|
-
...env.eligibleEnvironmentIds ? { eligibleEnvironmentIds: env.eligibleEnvironmentIds } : {},
|
|
1931
|
-
...env.passByEnvironment && env.passByEnvironment.length > 0 ? {
|
|
1932
|
-
passByEnvironment: env.passByEnvironment.map((p) => ({
|
|
1933
|
-
environment: `${p.environmentName} (${p.environmentType})`,
|
|
1934
|
-
everPassed: p.everPassed,
|
|
1935
|
-
passed: p.passed,
|
|
1936
|
-
total: p.total,
|
|
1937
|
-
health: p.health
|
|
1938
|
-
}))
|
|
1939
|
-
} : {}
|
|
1940
|
-
},
|
|
1941
|
-
steps: sorted.map((node, i) => ({
|
|
1942
|
-
index: i + 1,
|
|
1943
|
-
nodeId: node.id,
|
|
1944
|
-
nodeType: node.nodeType,
|
|
1945
|
-
title: getNodeTitle(node),
|
|
1946
|
-
config: getCleanConfig(node)
|
|
1947
|
-
}))
|
|
1948
|
-
};
|
|
1949
|
-
}
|
|
1950
2018
|
async function handleList(argv, apiUrl, token) {
|
|
1951
2019
|
const jsonOutput = hasFlag(argv, "--json");
|
|
1952
2020
|
const params = new URLSearchParams();
|
|
@@ -1965,7 +2033,7 @@ async function handleList(argv, apiUrl, token) {
|
|
|
1965
2033
|
const result = await apiRequest(apiUrl, token, "GET", path);
|
|
1966
2034
|
if (!result.ok) {
|
|
1967
2035
|
console.error(`Error: ${result.error}`);
|
|
1968
|
-
|
|
2036
|
+
process10.exit(1);
|
|
1969
2037
|
}
|
|
1970
2038
|
if (jsonOutput) {
|
|
1971
2039
|
console.log(JSON.stringify({ data: result.data, pagination: result.pagination }, null, 2));
|
|
@@ -2001,72 +2069,12 @@ async function handleList(argv, apiUrl, token) {
|
|
|
2001
2069
|
console.log(row);
|
|
2002
2070
|
}
|
|
2003
2071
|
}
|
|
2004
|
-
function shouldPrintWorkflowUrlTrailer(argv) {
|
|
2005
|
-
const jsonOutput = hasFlag(argv, "--json") || getArgValue(argv, "--format") === "json";
|
|
2006
|
-
const markdownOutput = hasFlag(argv, "--markdown") || getArgValue(argv, "--format") === "markdown" || getArgValue(argv, "--format") === "spec";
|
|
2007
|
-
return !jsonOutput && !markdownOutput;
|
|
2008
|
-
}
|
|
2009
|
-
async function handleGet2(argv, apiUrl, token) {
|
|
2010
|
-
const workflowId = argv[0];
|
|
2011
|
-
if (!workflowId || workflowId.startsWith("--")) {
|
|
2012
|
-
console.error("Error: Missing workflow ID.");
|
|
2013
|
-
console.error("Usage: canary workflow get <workflowId>");
|
|
2014
|
-
process9.exit(1);
|
|
2015
|
-
}
|
|
2016
|
-
const markdownOutput = hasFlag(argv, "--markdown") || getArgValue(argv, "--format") === "markdown" || getArgValue(argv, "--format") === "spec";
|
|
2017
|
-
const outputFile = getArgValue(argv, "--output");
|
|
2018
|
-
const apiRes = await apiFetch(`${apiUrl}/workflows/${workflowId}`, {
|
|
2019
|
-
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
|
|
2020
|
-
token
|
|
2021
|
-
});
|
|
2022
|
-
if (!apiRes.ok) exitOnFailure(apiRes.failure);
|
|
2023
|
-
const result = await apiRes.response.json();
|
|
2024
|
-
if (result.error === "WORKFLOW_NOT_FOUND") {
|
|
2025
|
-
console.error("Error: Workflow not found.");
|
|
2026
|
-
process9.exit(1);
|
|
2027
|
-
}
|
|
2028
|
-
if (result.error === "WORKFLOW_WRONG_ORG") {
|
|
2029
|
-
console.error(
|
|
2030
|
-
`Error: Workflow belongs to another org: ${result.targetOrgName ?? result.targetOrgId}`
|
|
2031
|
-
);
|
|
2032
|
-
process9.exit(1);
|
|
2033
|
-
}
|
|
2034
|
-
if (!result.workflow) {
|
|
2035
|
-
console.error(`Error: ${result.error ?? "Unexpected response"}`);
|
|
2036
|
-
process9.exit(1);
|
|
2037
|
-
}
|
|
2038
|
-
const workflow = result.workflow;
|
|
2039
|
-
let output;
|
|
2040
|
-
if (markdownOutput) {
|
|
2041
|
-
output = formatWorkflowMarkdown(workflow);
|
|
2042
|
-
} else {
|
|
2043
|
-
output = JSON.stringify(formatWorkflowJson(workflow), null, 2);
|
|
2044
|
-
}
|
|
2045
|
-
if (outputFile) {
|
|
2046
|
-
try {
|
|
2047
|
-
await fs5.writeFile(outputFile, output, "utf-8");
|
|
2048
|
-
console.log(`Written to ${outputFile}`);
|
|
2049
|
-
} catch (err) {
|
|
2050
|
-
console.error(
|
|
2051
|
-
`Error writing to ${outputFile}: ${err instanceof Error ? err.message : String(err)}`
|
|
2052
|
-
);
|
|
2053
|
-
process9.exit(1);
|
|
2054
|
-
}
|
|
2055
|
-
return;
|
|
2056
|
-
}
|
|
2057
|
-
console.log(output);
|
|
2058
|
-
if (shouldPrintWorkflowUrlTrailer(argv)) {
|
|
2059
|
-
const appUrl = resolveAppUrl(apiUrl);
|
|
2060
|
-
console.log(`
|
|
2061
|
-
URL: ${appUrl}/flows/${workflowId}`);
|
|
2062
|
-
}
|
|
2063
|
-
}
|
|
2064
2072
|
async function handlePatch(argv, apiUrl, token) {
|
|
2065
2073
|
const workflowId = argv.find((a) => !a.startsWith("-"));
|
|
2066
2074
|
if (!workflowId) {
|
|
2067
2075
|
console.error("Error: Missing workflow ID.");
|
|
2068
2076
|
console.error("Usage: canary workflow patch <workflowId> [--name ...] [--description ...] [--status ...] [--flow-type ...] [--default-environment <name|id>] [--clear-default-environment] [--any-environment] [--eligible-env-types permanent,sandbox] [--eligible-environments <names|ids>]");
|
|
2069
|
-
|
|
2077
|
+
process10.exit(1);
|
|
2070
2078
|
}
|
|
2071
2079
|
const name = getArgValue(argv, "--name");
|
|
2072
2080
|
const description = getArgValue(argv, "--description");
|
|
@@ -2086,28 +2094,28 @@ async function handlePatch(argv, apiUrl, token) {
|
|
|
2086
2094
|
console.error(
|
|
2087
2095
|
"Error: No fields to update. Provide at least one of: --name, --description, --status, --flow-type, --seed-outputs-json, --seed-outputs-file, --tags, --tags-add, --tags-remove, --tag-id, --default-environment, --clear-default-environment, --any-environment, --eligible-env-types, --eligible-environments"
|
|
2088
2096
|
);
|
|
2089
|
-
|
|
2097
|
+
process10.exit(1);
|
|
2090
2098
|
}
|
|
2091
2099
|
if (anyEnvironment && (eligibleEnvTypes !== void 0 || eligibleEnvironments !== void 0)) {
|
|
2092
2100
|
console.error(
|
|
2093
2101
|
"Error: --any-environment is mutually exclusive with --eligible-env-types / --eligible-environments."
|
|
2094
2102
|
);
|
|
2095
|
-
|
|
2103
|
+
process10.exit(1);
|
|
2096
2104
|
}
|
|
2097
2105
|
if (clearDefaultEnvironment && defaultEnvironment !== void 0) {
|
|
2098
2106
|
console.error(
|
|
2099
2107
|
"Error: --clear-default-environment is mutually exclusive with --default-environment."
|
|
2100
2108
|
);
|
|
2101
|
-
|
|
2109
|
+
process10.exit(1);
|
|
2102
2110
|
}
|
|
2103
2111
|
if (status && !USER_SETTABLE_WORKFLOW_STATUSES.includes(status)) {
|
|
2104
2112
|
console.error(`Error: Invalid status "${status}". Valid: ${formatWorkflowStatusList()}`);
|
|
2105
|
-
|
|
2113
|
+
process10.exit(1);
|
|
2106
2114
|
}
|
|
2107
2115
|
const validFlowTypes = ["standard", "setup", "seed", "teardown"];
|
|
2108
2116
|
if (flowType && !validFlowTypes.includes(flowType)) {
|
|
2109
2117
|
console.error(`Error: Invalid flow type "${flowType}". Must be one of: ${validFlowTypes.join(", ")}`);
|
|
2110
|
-
|
|
2118
|
+
process10.exit(1);
|
|
2111
2119
|
}
|
|
2112
2120
|
const body = {};
|
|
2113
2121
|
if (name) body.name = name;
|
|
@@ -2118,12 +2126,12 @@ async function handlePatch(argv, apiUrl, token) {
|
|
|
2118
2126
|
let raw;
|
|
2119
2127
|
if (seedOutputsFile) {
|
|
2120
2128
|
try {
|
|
2121
|
-
raw = await
|
|
2129
|
+
raw = await fs6.readFile(seedOutputsFile, "utf-8");
|
|
2122
2130
|
} catch (err) {
|
|
2123
2131
|
console.error(
|
|
2124
2132
|
`Error reading ${seedOutputsFile}: ${err instanceof Error ? err.message : String(err)}`
|
|
2125
2133
|
);
|
|
2126
|
-
|
|
2134
|
+
process10.exit(1);
|
|
2127
2135
|
}
|
|
2128
2136
|
} else {
|
|
2129
2137
|
raw = seedOutputsJsonRaw;
|
|
@@ -2138,7 +2146,7 @@ async function handlePatch(argv, apiUrl, token) {
|
|
|
2138
2146
|
console.error(
|
|
2139
2147
|
`Error: Invalid --seed-outputs-json: ${err instanceof Error ? err.message : String(err)}`
|
|
2140
2148
|
);
|
|
2141
|
-
|
|
2149
|
+
process10.exit(1);
|
|
2142
2150
|
}
|
|
2143
2151
|
}
|
|
2144
2152
|
if (hasEnvFlag) {
|
|
@@ -2149,7 +2157,7 @@ async function handlePatch(argv, apiUrl, token) {
|
|
|
2149
2157
|
const bad = types.filter((t) => !valid.includes(t));
|
|
2150
2158
|
if (bad.length > 0) {
|
|
2151
2159
|
console.error(`Error: invalid env type(s): ${bad.join(", ")}. Valid: ${valid.join(", ")}`);
|
|
2152
|
-
|
|
2160
|
+
process10.exit(1);
|
|
2153
2161
|
}
|
|
2154
2162
|
body.environmentConstraints = { mode: "envTypes", types };
|
|
2155
2163
|
}
|
|
@@ -2181,7 +2189,7 @@ async function handlePatch(argv, apiUrl, token) {
|
|
|
2181
2189
|
} else {
|
|
2182
2190
|
console.error(`Error: ${result.error ?? "Unknown error"}`);
|
|
2183
2191
|
}
|
|
2184
|
-
|
|
2192
|
+
process10.exit(1);
|
|
2185
2193
|
}
|
|
2186
2194
|
}
|
|
2187
2195
|
if (hasTagFlag) {
|
|
@@ -2200,7 +2208,7 @@ async function handlePatch(argv, apiUrl, token) {
|
|
|
2200
2208
|
console.error(`Error applying tags:
|
|
2201
2209
|
${err instanceof Error ? err.message : String(err)}`);
|
|
2202
2210
|
}
|
|
2203
|
-
|
|
2211
|
+
process10.exit(1);
|
|
2204
2212
|
}
|
|
2205
2213
|
}
|
|
2206
2214
|
if (jsonOutput) {
|
|
@@ -2226,27 +2234,27 @@ async function handleArchive(argv, apiUrl, token) {
|
|
|
2226
2234
|
if (!workflowId) {
|
|
2227
2235
|
console.error("Error: Missing workflow ID.");
|
|
2228
2236
|
console.error("Usage: canary workflow archive <workflowId> [--yes] [--json]");
|
|
2229
|
-
|
|
2237
|
+
process10.exit(1);
|
|
2230
2238
|
}
|
|
2231
2239
|
const jsonOutput = hasFlag(argv, "--json");
|
|
2232
2240
|
const skipConfirm = hasFlag(argv, "--yes", "-y");
|
|
2233
2241
|
if (!skipConfirm) {
|
|
2234
|
-
if (!
|
|
2242
|
+
if (!process10.stdin.isTTY) {
|
|
2235
2243
|
console.error(
|
|
2236
2244
|
"Error: Archiving requires confirmation. Pass --yes (or -y) for non-interactive use."
|
|
2237
2245
|
);
|
|
2238
|
-
|
|
2246
|
+
process10.exit(1);
|
|
2239
2247
|
}
|
|
2240
|
-
|
|
2248
|
+
process10.stdout.write(
|
|
2241
2249
|
`Archive workflow ${workflowId}? It will be hidden from lists and skipped by test suites. [y/N] `
|
|
2242
2250
|
);
|
|
2243
2251
|
const answer = await new Promise((resolve) => {
|
|
2244
|
-
|
|
2245
|
-
|
|
2252
|
+
process10.stdin.setEncoding("utf-8");
|
|
2253
|
+
process10.stdin.once("data", (chunk) => resolve(String(chunk).trim().toLowerCase()));
|
|
2246
2254
|
});
|
|
2247
2255
|
if (answer !== "y" && answer !== "yes") {
|
|
2248
2256
|
console.error("Aborted.");
|
|
2249
|
-
|
|
2257
|
+
process10.exit(1);
|
|
2250
2258
|
}
|
|
2251
2259
|
}
|
|
2252
2260
|
const result = await apiRequest(
|
|
@@ -2261,7 +2269,7 @@ async function handleArchive(argv, apiUrl, token) {
|
|
|
2261
2269
|
} else {
|
|
2262
2270
|
renderWorkflowUserError(result);
|
|
2263
2271
|
}
|
|
2264
|
-
|
|
2272
|
+
process10.exit(1);
|
|
2265
2273
|
}
|
|
2266
2274
|
if (jsonOutput) {
|
|
2267
2275
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -2274,7 +2282,7 @@ async function handleUnarchive(argv, apiUrl, token) {
|
|
|
2274
2282
|
if (!workflowId) {
|
|
2275
2283
|
console.error("Error: Missing workflow ID.");
|
|
2276
2284
|
console.error("Usage: canary workflow unarchive <workflowId> [--json]");
|
|
2277
|
-
|
|
2285
|
+
process10.exit(1);
|
|
2278
2286
|
}
|
|
2279
2287
|
const jsonOutput = hasFlag(argv, "--json");
|
|
2280
2288
|
const result = await apiRequest(
|
|
@@ -2290,7 +2298,7 @@ async function handleUnarchive(argv, apiUrl, token) {
|
|
|
2290
2298
|
} else {
|
|
2291
2299
|
renderWorkflowUserError(result);
|
|
2292
2300
|
}
|
|
2293
|
-
|
|
2301
|
+
process10.exit(1);
|
|
2294
2302
|
}
|
|
2295
2303
|
if (jsonOutput) {
|
|
2296
2304
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -2313,14 +2321,14 @@ async function handleApprove(argv, apiUrl, token) {
|
|
|
2313
2321
|
if (!workflowId) {
|
|
2314
2322
|
console.error("Error: Missing workflow ID.");
|
|
2315
2323
|
console.error("Usage: canary workflow approve <workflowId> [--yes] [--json]");
|
|
2316
|
-
|
|
2324
|
+
process10.exit(1);
|
|
2317
2325
|
}
|
|
2318
2326
|
const jsonOutput = hasFlag(argv, "--json");
|
|
2319
2327
|
if (!hasFlag(argv, "--yes")) {
|
|
2320
2328
|
console.error(APPROVAL_GUIDANCE);
|
|
2321
2329
|
console.error(`
|
|
2322
2330
|
Re-run with --yes to approve: canary workflow approve ${workflowId} --yes`);
|
|
2323
|
-
|
|
2331
|
+
process10.exit(1);
|
|
2324
2332
|
}
|
|
2325
2333
|
const result = await apiRequest(
|
|
2326
2334
|
apiUrl,
|
|
@@ -2335,7 +2343,7 @@ Re-run with --yes to approve: canary workflow approve ${workflowId} --yes`);
|
|
|
2335
2343
|
} else {
|
|
2336
2344
|
console.error(`Error: ${result.error}`);
|
|
2337
2345
|
}
|
|
2338
|
-
|
|
2346
|
+
process10.exit(1);
|
|
2339
2347
|
}
|
|
2340
2348
|
if (jsonOutput) {
|
|
2341
2349
|
console.log(
|
|
@@ -2351,7 +2359,7 @@ async function handlePromote(argv, apiUrl, token, options) {
|
|
|
2351
2359
|
if (!workflowId) {
|
|
2352
2360
|
console.error("Error: Missing workflow ID.");
|
|
2353
2361
|
console.error("Usage: canary workflow promote <workflowId> [--force] [--json]");
|
|
2354
|
-
|
|
2362
|
+
process10.exit(1);
|
|
2355
2363
|
}
|
|
2356
2364
|
const force = hasFlag(argv, "--force");
|
|
2357
2365
|
const jsonOutput = hasFlag(argv, "--json");
|
|
@@ -2376,7 +2384,7 @@ async function handlePromote(argv, apiUrl, token, options) {
|
|
|
2376
2384
|
(Approval asserts a human verified the test checks the right thing \u2014 it cannot be forced.)` : "";
|
|
2377
2385
|
console.error(`Error: ${result.error}${hint}`);
|
|
2378
2386
|
}
|
|
2379
|
-
|
|
2387
|
+
process10.exit(1);
|
|
2380
2388
|
}
|
|
2381
2389
|
if (jsonOutput) {
|
|
2382
2390
|
console.log(
|
|
@@ -2391,7 +2399,7 @@ async function handlePause(argv, apiUrl, token) {
|
|
|
2391
2399
|
if (!workflowId) {
|
|
2392
2400
|
console.error("Error: Missing workflow ID.");
|
|
2393
2401
|
console.error("Usage: canary workflow pause <workflowId> [--json]");
|
|
2394
|
-
|
|
2402
|
+
process10.exit(1);
|
|
2395
2403
|
}
|
|
2396
2404
|
const jsonOutput = hasFlag(argv, "--json");
|
|
2397
2405
|
const result = await apiRequest(
|
|
@@ -2407,7 +2415,7 @@ async function handlePause(argv, apiUrl, token) {
|
|
|
2407
2415
|
} else {
|
|
2408
2416
|
console.error(`Error: ${result.error}`);
|
|
2409
2417
|
}
|
|
2410
|
-
|
|
2418
|
+
process10.exit(1);
|
|
2411
2419
|
}
|
|
2412
2420
|
if (jsonOutput) {
|
|
2413
2421
|
console.log(
|
|
@@ -2441,14 +2449,14 @@ async function handleNodePatch(argv, apiUrl, token) {
|
|
|
2441
2449
|
console.error(
|
|
2442
2450
|
`Usage: canary workflow node patch <workflowId> <nodeId> --set-input key=value [--config '{"..."}'] [--json]`
|
|
2443
2451
|
);
|
|
2444
|
-
|
|
2452
|
+
process10.exit(1);
|
|
2445
2453
|
}
|
|
2446
2454
|
const configArg = getArgValue(argv, "--config");
|
|
2447
2455
|
const setInputArgs = getAllArgValues2(argv, "--set-input");
|
|
2448
2456
|
const jsonOutput = hasFlag(argv, "--json");
|
|
2449
2457
|
if (!configArg && setInputArgs.length === 0) {
|
|
2450
2458
|
console.error(`Error: No changes specified. Provide --set-input key=value and/or --config '{"..."}'`);
|
|
2451
|
-
|
|
2459
|
+
process10.exit(1);
|
|
2452
2460
|
}
|
|
2453
2461
|
let configJson = {};
|
|
2454
2462
|
if (configArg) {
|
|
@@ -2456,7 +2464,7 @@ async function handleNodePatch(argv, apiUrl, token) {
|
|
|
2456
2464
|
configJson = JSON.parse(configArg);
|
|
2457
2465
|
} catch (e) {
|
|
2458
2466
|
console.error(`Error: Invalid JSON in --config: ${e instanceof Error ? e.message : String(e)}`);
|
|
2459
|
-
|
|
2467
|
+
process10.exit(1);
|
|
2460
2468
|
}
|
|
2461
2469
|
}
|
|
2462
2470
|
if (setInputArgs.length > 0) {
|
|
@@ -2465,7 +2473,7 @@ async function handleNodePatch(argv, apiUrl, token) {
|
|
|
2465
2473
|
const eqIdx = arg.indexOf("=");
|
|
2466
2474
|
if (eqIdx === -1) {
|
|
2467
2475
|
console.error(`Error: --set-input must be key=value, got: "${arg}"`);
|
|
2468
|
-
|
|
2476
|
+
process10.exit(1);
|
|
2469
2477
|
}
|
|
2470
2478
|
inputValues[arg.slice(0, eqIdx)] = arg.slice(eqIdx + 1);
|
|
2471
2479
|
}
|
|
@@ -2478,7 +2486,7 @@ async function handleNodePatch(argv, apiUrl, token) {
|
|
|
2478
2486
|
const getResult = await getRes.json();
|
|
2479
2487
|
if (!getResult.workflow) {
|
|
2480
2488
|
console.error(`Error: Workflow not found.`);
|
|
2481
|
-
|
|
2489
|
+
process10.exit(1);
|
|
2482
2490
|
}
|
|
2483
2491
|
const existingNode = getResult.workflow.nodes.find((n) => n.id === nodeId);
|
|
2484
2492
|
if (!existingNode) {
|
|
@@ -2487,7 +2495,7 @@ async function handleNodePatch(argv, apiUrl, token) {
|
|
|
2487
2495
|
for (const n of topoOrderNodes(getResult.workflow.nodes, getResult.workflow.edges ?? [])) {
|
|
2488
2496
|
console.error(` ${n.id} [${n.nodeType}] ${getNodeTitle(n)}`);
|
|
2489
2497
|
}
|
|
2490
|
-
|
|
2498
|
+
process10.exit(1);
|
|
2491
2499
|
}
|
|
2492
2500
|
const patchRes = await fetchOrExit(`${apiUrl}/workflows/${workflowId}/nodes/${nodeId}`, {
|
|
2493
2501
|
method: "PUT",
|
|
@@ -2509,7 +2517,7 @@ async function handleNodePatch(argv, apiUrl, token) {
|
|
|
2509
2517
|
}
|
|
2510
2518
|
console.error(rendered ?? `Error (${patchRes.status}): ${errBody.slice(0, 500)}`);
|
|
2511
2519
|
}
|
|
2512
|
-
|
|
2520
|
+
process10.exit(1);
|
|
2513
2521
|
}
|
|
2514
2522
|
const patchResult = await patchRes.json();
|
|
2515
2523
|
if (jsonOutput) {
|
|
@@ -2711,7 +2719,7 @@ async function runWorkflow(argv) {
|
|
|
2711
2719
|
return;
|
|
2712
2720
|
}
|
|
2713
2721
|
if (subCommand === "debug" && hasFlag(rest, "--help", "-h")) {
|
|
2714
|
-
const { handleWorkflowDebug } = await import("./workflow-debug-
|
|
2722
|
+
const { handleWorkflowDebug } = await import("./workflow-debug-IWXZXSL2.js");
|
|
2715
2723
|
await handleWorkflowDebug(rest, "", "");
|
|
2716
2724
|
return;
|
|
2717
2725
|
}
|
|
@@ -2731,7 +2739,7 @@ async function runWorkflow(argv) {
|
|
|
2731
2739
|
await handleList(rest, apiUrl, token);
|
|
2732
2740
|
break;
|
|
2733
2741
|
case "get":
|
|
2734
|
-
await
|
|
2742
|
+
await handleWorkflowGet(rest, apiUrl, token);
|
|
2735
2743
|
break;
|
|
2736
2744
|
case "create":
|
|
2737
2745
|
await handleWorkflowCreate(rest, apiUrl, token);
|
|
@@ -2767,7 +2775,7 @@ async function runWorkflow(argv) {
|
|
|
2767
2775
|
} else {
|
|
2768
2776
|
console.error(`Unknown node sub-command: ${nodeSub ?? "(none)"}`);
|
|
2769
2777
|
printWorkflowHelp();
|
|
2770
|
-
|
|
2778
|
+
process10.exit(1);
|
|
2771
2779
|
}
|
|
2772
2780
|
break;
|
|
2773
2781
|
}
|
|
@@ -2778,7 +2786,7 @@ async function runWorkflow(argv) {
|
|
|
2778
2786
|
} else {
|
|
2779
2787
|
console.error(`Unknown seed sub-command: ${seedSub ?? "(none)"}`);
|
|
2780
2788
|
printWorkflowHelp();
|
|
2781
|
-
|
|
2789
|
+
process10.exit(1);
|
|
2782
2790
|
}
|
|
2783
2791
|
break;
|
|
2784
2792
|
}
|
|
@@ -2786,7 +2794,7 @@ async function runWorkflow(argv) {
|
|
|
2786
2794
|
await handleWorkflowSync(rest, apiUrl, token);
|
|
2787
2795
|
break;
|
|
2788
2796
|
case "proposals": {
|
|
2789
|
-
const { handleWorkflowProposals } = await import("./workflow-proposals-
|
|
2797
|
+
const { handleWorkflowProposals } = await import("./workflow-proposals-76D2MM6G.js");
|
|
2790
2798
|
await handleWorkflowProposals(rest, apiUrl, token);
|
|
2791
2799
|
break;
|
|
2792
2800
|
}
|
|
@@ -2797,23 +2805,23 @@ async function runWorkflow(argv) {
|
|
|
2797
2805
|
await handleWorkflowApiSequence(rest, apiUrl, token);
|
|
2798
2806
|
break;
|
|
2799
2807
|
case "cache": {
|
|
2800
|
-
const { handleWorkflowCache } = await import("./workflow-cache-
|
|
2808
|
+
const { handleWorkflowCache } = await import("./workflow-cache-LRH5CAPS.js");
|
|
2801
2809
|
await handleWorkflowCache(rest, apiUrl, token);
|
|
2802
2810
|
break;
|
|
2803
2811
|
}
|
|
2804
2812
|
case "debug": {
|
|
2805
|
-
const { handleWorkflowDebug } = await import("./workflow-debug-
|
|
2813
|
+
const { handleWorkflowDebug } = await import("./workflow-debug-IWXZXSL2.js");
|
|
2806
2814
|
await handleWorkflowDebug(rest, apiUrl, token);
|
|
2807
2815
|
break;
|
|
2808
2816
|
}
|
|
2809
2817
|
default:
|
|
2810
2818
|
console.error(`Unknown sub-command: ${subCommand}`);
|
|
2811
2819
|
printWorkflowHelp();
|
|
2812
|
-
|
|
2820
|
+
process10.exit(1);
|
|
2813
2821
|
}
|
|
2814
2822
|
}
|
|
2815
2823
|
export {
|
|
2816
2824
|
runWorkflow,
|
|
2817
2825
|
shouldPrintWorkflowUrlTrailer
|
|
2818
2826
|
};
|
|
2819
|
-
//# sourceMappingURL=workflow-
|
|
2827
|
+
//# sourceMappingURL=workflow-2TVSFQXK.js.map
|