@controllerai/cli 0.2.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 (96) hide show
  1. package/README.md +180 -0
  2. package/dist/api/client.js +330 -0
  3. package/dist/api/client.js.map +1 -0
  4. package/dist/appLinks.js +99 -0
  5. package/dist/appLinks.js.map +1 -0
  6. package/dist/argv.js +124 -0
  7. package/dist/argv.js.map +1 -0
  8. package/dist/commands/agent.js +813 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/auth.js +327 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/commands/branch.js +441 -0
  13. package/dist/commands/branch.js.map +1 -0
  14. package/dist/commands/connect.js +148 -0
  15. package/dist/commands/connect.js.map +1 -0
  16. package/dist/commands/connection.js +148 -0
  17. package/dist/commands/connection.js.map +1 -0
  18. package/dist/commands/data.js +441 -0
  19. package/dist/commands/data.js.map +1 -0
  20. package/dist/commands/deps.js +63 -0
  21. package/dist/commands/deps.js.map +1 -0
  22. package/dist/commands/doctor.js +102 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/events.js +72 -0
  25. package/dist/commands/events.js.map +1 -0
  26. package/dist/commands/exec.js +306 -0
  27. package/dist/commands/exec.js.map +1 -0
  28. package/dist/commands/expr.js +346 -0
  29. package/dist/commands/expr.js.map +1 -0
  30. package/dist/commands/flow.js +447 -0
  31. package/dist/commands/flow.js.map +1 -0
  32. package/dist/commands/integration.js +102 -0
  33. package/dist/commands/integration.js.map +1 -0
  34. package/dist/commands/node.js +885 -0
  35. package/dist/commands/node.js.map +1 -0
  36. package/dist/commands/organize.js +234 -0
  37. package/dist/commands/organize.js.map +1 -0
  38. package/dist/commands/run.js +437 -0
  39. package/dist/commands/run.js.map +1 -0
  40. package/dist/commands/schema.js +269 -0
  41. package/dist/commands/schema.js.map +1 -0
  42. package/dist/commands/skills.js +1156 -0
  43. package/dist/commands/skills.js.map +1 -0
  44. package/dist/commands/trigger.js +992 -0
  45. package/dist/commands/trigger.js.map +1 -0
  46. package/dist/commands/workflow.js +503 -0
  47. package/dist/commands/workflow.js.map +1 -0
  48. package/dist/config.js +74 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/context.js +39 -0
  51. package/dist/context.js.map +1 -0
  52. package/dist/errors.js +59 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/index.js +125 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/jsSource.js +32 -0
  57. package/dist/jsSource.js.map +1 -0
  58. package/dist/nodeProps.js +177 -0
  59. package/dist/nodeProps.js.map +1 -0
  60. package/dist/output.js +85 -0
  61. package/dist/output.js.map +1 -0
  62. package/dist/version.js +7 -0
  63. package/dist/version.js.map +1 -0
  64. package/package.json +41 -0
  65. package/skills/controllerai-agents/SKILL.md +169 -0
  66. package/skills/controllerai-agents/agents/openai.yaml +4 -0
  67. package/skills/controllerai-agents/references/instructions-and-versioning.md +76 -0
  68. package/skills/controllerai-ai-nodes/SKILL.md +83 -0
  69. package/skills/controllerai-ai-nodes/agents/openai.yaml +4 -0
  70. package/skills/controllerai-ai-nodes/references/selection-and-testing.md +46 -0
  71. package/skills/controllerai-data/SKILL.md +121 -0
  72. package/skills/controllerai-data/agents/openai.yaml +4 -0
  73. package/skills/controllerai-data/references/data-rails.md +46 -0
  74. package/skills/controllerai-expressions/SKILL.md +115 -0
  75. package/skills/controllerai-expressions/agents/openai.yaml +4 -0
  76. package/skills/controllerai-expressions/references/dsl-and-recipes.md +120 -0
  77. package/skills/controllerai-flow-control/SKILL.md +132 -0
  78. package/skills/controllerai-flow-control/agents/openai.yaml +4 -0
  79. package/skills/controllerai-flow-control/references/patterns.md +61 -0
  80. package/skills/controllerai-integration-actions/SKILL.md +95 -0
  81. package/skills/controllerai-integration-actions/agents/openai.yaml +4 -0
  82. package/skills/controllerai-node-config/SKILL.md +138 -0
  83. package/skills/controllerai-node-config/agents/openai.yaml +4 -0
  84. package/skills/controllerai-node-config/references/prop-and-readiness.md +72 -0
  85. package/skills/controllerai-runs/SKILL.md +109 -0
  86. package/skills/controllerai-runs/agents/openai.yaml +4 -0
  87. package/skills/controllerai-runs/references/debugging.md +53 -0
  88. package/skills/controllerai-start/SKILL.md +44 -0
  89. package/skills/controllerai-start/agents/openai.yaml +4 -0
  90. package/skills/controllerai-triggers/SKILL.md +174 -0
  91. package/skills/controllerai-triggers/agents/openai.yaml +4 -0
  92. package/skills/controllerai-triggers/references/lifecycle.md +54 -0
  93. package/skills/controllerai-workflows/SKILL.md +86 -0
  94. package/skills/controllerai-workflows/agents/openai.yaml +4 -0
  95. package/skills/controllerai-workflows/references/command-map.md +64 -0
  96. package/skills/manifest.json +248 -0
@@ -0,0 +1,63 @@
1
+ import { requireContext } from '../context.js';
2
+ import { emit, printKeyValues, printTable } from '../output.js';
3
+ const attachmentLabel = (row) => {
4
+ const live = row.liveAttachment ?? row.liveReference;
5
+ const draft = row.draftAttachment ?? row.draftReference;
6
+ if (live && draft)
7
+ return 'LIVE + draft';
8
+ if (live)
9
+ return 'LIVE';
10
+ if (draft)
11
+ return 'draft';
12
+ return '-';
13
+ };
14
+ export const registerDeps = (program) => {
15
+ program
16
+ .command('deps')
17
+ .option('--account', 'account-wide resource map instead of the current workflow', false)
18
+ .description('Dependency map: which agents and workflows depend on this workflow (or the whole account)')
19
+ .action(async (opts, command) => {
20
+ const { api, workflowId } = requireContext(command);
21
+ const data = await api.tool(workflowId, 'get_resource_dependencies', {
22
+ scope: opts.account ? 'account' : 'workflow',
23
+ });
24
+ emit(data, () => {
25
+ if (data.scope === 'account') {
26
+ printKeyValues([
27
+ ['agents', data.agents?.length ?? 0],
28
+ ['workflows', data.workflows?.length ?? 0],
29
+ ]);
30
+ if (data.agents?.length) {
31
+ process.stdout.write('\nagents\n');
32
+ printTable(['id', 'name', 'live version'], data.agents.map(agent => [agent.agentId, agent.name, agent.hasLiveVersion ? 'yes' : 'no']));
33
+ }
34
+ if (data.workflows?.length) {
35
+ process.stdout.write('\nworkflows\n');
36
+ printTable(['id', 'name', 'live version'], data.workflows.map(w => [w.workflowId, w.name, w.hasLiveVersion ? 'yes' : 'no']));
37
+ }
38
+ return;
39
+ }
40
+ printKeyValues([
41
+ ['workflow', `${data.workflow?.workflowId} — ${data.workflow?.name}`],
42
+ ['agents depending on it', data.agents?.length ?? 0],
43
+ ['workflows calling it', data.callingWorkflows?.length ?? 0],
44
+ ]);
45
+ if (data.agents?.length) {
46
+ process.stdout.write('\nagents using this workflow as a tool\n');
47
+ printTable(['id', 'name', 'attachment'], data.agents.map(agent => [agent.agentId, agent.name, attachmentLabel(agent)]));
48
+ }
49
+ if (data.callingWorkflows?.length) {
50
+ process.stdout.write('\nworkflows calling this workflow\n');
51
+ printTable(['id', 'name', 'reference'], data.callingWorkflows.map(w => [w.workflowId, w.name, attachmentLabel(w)]));
52
+ }
53
+ if (data.connections?.length) {
54
+ process.stdout.write('\nconnections used\n');
55
+ printTable(['id', 'name'], data.connections.map(c => [c.connectionId, c.name ?? '-']));
56
+ }
57
+ if (data.triggers?.length) {
58
+ process.stdout.write(`\ntriggers: ${data.triggers.length} (see \`cai trigger audit\`)\n`);
59
+ }
60
+ });
61
+ });
62
+ };
63
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/commands/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { statSync } from 'node:fs';
2
+ import { ApiClient } from '../api/client.js';
3
+ import { configPath, detectTokenKind, loadConfig } from '../config.js';
4
+ import { buildClient } from '../context.js';
5
+ import { userError } from '../errors.js';
6
+ import { emit, printTable } from '../output.js';
7
+ import { installedSkillStatus } from './skills.js';
8
+ export const summarizeSkillCheck = (target, rows) => {
9
+ const present = rows.filter(row => row.status !== 'missing');
10
+ if (present.length === 0)
11
+ return null;
12
+ const current = rows.filter(row => row.status === 'current').length;
13
+ const issues = rows
14
+ .filter(row => row.status !== 'current')
15
+ .reduce((counts, row) => {
16
+ counts[row.status] = (counts[row.status] ?? 0) + 1;
17
+ return counts;
18
+ }, {});
19
+ const issueSummary = Object.entries(issues)
20
+ .map(([status, count]) => `${count} ${status}`)
21
+ .join(', ');
22
+ return {
23
+ name: `${target} skills`,
24
+ ok: current === rows.length,
25
+ detail: `${current}/${rows.length} current${issueSummary ? ` — ${issueSummary}` : ''}`,
26
+ };
27
+ };
28
+ export const runDoctor = async (command) => {
29
+ const config = command ? buildClient(command).config : loadConfig();
30
+ const api = new ApiClient(config);
31
+ const major = Number(process.versions.node.split('.')[0]);
32
+ const checks = [
33
+ {
34
+ name: 'Node.js',
35
+ ok: major >= 20,
36
+ detail: `${process.version}${major >= 20 ? '' : ' — Node 20+ is required'}`,
37
+ },
38
+ {
39
+ name: 'Credential',
40
+ ok: Boolean(config.token),
41
+ detail: config.token
42
+ ? `${config.tokenKind ?? detectTokenKind(config.token)} credential configured`
43
+ : 'run `cai auth login`',
44
+ },
45
+ ];
46
+ if (config.token) {
47
+ try {
48
+ const me = await api.rest('/user/me');
49
+ checks.push({
50
+ name: 'Controller AI API',
51
+ ok: true,
52
+ detail: `${config.apiUrl} — ${me.email ?? 'authenticated'}`,
53
+ });
54
+ }
55
+ catch (error) {
56
+ checks.push({
57
+ name: 'Controller AI API',
58
+ ok: false,
59
+ detail: error instanceof Error ? error.message : String(error),
60
+ });
61
+ }
62
+ }
63
+ else {
64
+ checks.push({ name: 'Controller AI API', ok: false, detail: 'not authenticated' });
65
+ }
66
+ const skills = installedSkillStatus();
67
+ for (const target of ['agents', 'codex', 'claude', 'cursor', 'copilot']) {
68
+ const rows = skills.filter(row => row.target === target);
69
+ const check = summarizeSkillCheck(target, rows);
70
+ if (check)
71
+ checks.push(check);
72
+ }
73
+ try {
74
+ const mode = statSync(configPath()).mode & 0o777;
75
+ checks.push({
76
+ name: 'Credential file',
77
+ ok: mode === 0o600,
78
+ detail: `${configPath()} (${mode.toString(8)})`,
79
+ });
80
+ }
81
+ catch {
82
+ checks.push({ name: 'Credential file', ok: false, detail: `${configPath()} is missing` });
83
+ }
84
+ return checks;
85
+ };
86
+ export const registerDoctor = (program) => {
87
+ program
88
+ .command('doctor')
89
+ .description('Verify authentication, API access, runtime, and installed skills')
90
+ .action(async (_opts, command) => {
91
+ const checks = await runDoctor(command);
92
+ const required = checks.filter(check => ['Node.js', 'Credential', 'Controller AI API'].includes(check.name));
93
+ if (required.some(check => !check.ok)) {
94
+ throw userError(`Controller AI setup is incomplete:\n${checks
95
+ .filter(check => !check.ok)
96
+ .map(check => `- ${check.name}: ${check.detail}`)
97
+ .join('\n')}`, 'DOCTOR_FAILED');
98
+ }
99
+ emit({ ok: checks.every(check => check.ok), checks }, () => printTable(['check', 'status', 'detail'], checks.map(check => [check.name, check.ok ? 'ok' : 'warning', check.detail])));
100
+ });
101
+ };
102
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { requireContext } from '../context.js';
2
+ import { userError } from '../errors.js';
3
+ import { emit, printTable, truncate } from '../output.js';
4
+ const RELATIVE_SINCE = /^(\d+)([smhd])$/;
5
+ const RELATIVE_UNIT_MS = {
6
+ s: 1_000,
7
+ m: 60_000,
8
+ h: 3_600_000,
9
+ d: 86_400_000,
10
+ };
11
+ /** `2h` / `30m` / `7d` → ISO timestamp; anything else passes through for the backend to validate. */
12
+ export const sinceToIso = (raw, now = Date.now) => {
13
+ const match = raw.match(RELATIVE_SINCE);
14
+ if (!match)
15
+ return raw;
16
+ const amount = Number(match[1]) * RELATIVE_UNIT_MS[match[2]];
17
+ if (!Number.isSafeInteger(amount)) {
18
+ throw userError(`--since duration is too large: ${raw}`, 'BAD_SINCE');
19
+ }
20
+ return new Date(now() - amount).toISOString();
21
+ };
22
+ const collectTypes = (value, previous) => [
23
+ ...previous,
24
+ ...value
25
+ .split(',')
26
+ .map(part => part.trim())
27
+ .filter(Boolean),
28
+ ];
29
+ export const registerEvents = (program) => {
30
+ program
31
+ .command('events')
32
+ .description('Account activity feed, newest first: connections, workflow edits/publishes/runs, agents, org members')
33
+ .option('--type <types>', 'only these event types (comma-separated or repeated)', collectTypes, [])
34
+ .option('--since <when>', 'ISO timestamp or relative like 30m, 2h, 7d')
35
+ .option('--cursor <cursor>', 'opaque cursor from a previous page; returns strictly older events')
36
+ .option('--for-workflow <id>', 'only events about this workflow')
37
+ .option('--limit <n>', 'events per page (default 50, max 200)')
38
+ .action(async (opts, command) => {
39
+ const { api, workflowId } = requireContext(command);
40
+ const forWorkflow = opts.forWorkflow === undefined ? undefined : Number(opts.forWorkflow);
41
+ if (forWorkflow !== undefined && (!Number.isInteger(forWorkflow) || forWorkflow <= 0)) {
42
+ throw userError(`Invalid --for-workflow id: ${String(opts.forWorkflow)}`, 'BAD_WORKFLOW_ID');
43
+ }
44
+ const limit = opts.limit === undefined ? undefined : Number(opts.limit);
45
+ if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
46
+ throw userError(`Invalid --limit: ${String(opts.limit)}`, 'BAD_LIMIT');
47
+ }
48
+ const data = await api.tool(workflowId, 'get_account_events', {
49
+ ...(opts.type.length > 0 ? { types: opts.type } : {}),
50
+ ...(opts.since === undefined ? {} : { since: sinceToIso(opts.since) }),
51
+ ...(opts.cursor === undefined ? {} : { cursor: opts.cursor }),
52
+ ...(forWorkflow === undefined ? {} : { workflowId: forWorkflow }),
53
+ ...(limit === undefined ? {} : { limit }),
54
+ });
55
+ emit(data, () => {
56
+ if (data.events.length === 0) {
57
+ process.stdout.write('No events.\n');
58
+ return;
59
+ }
60
+ printTable(['at', 'type', 'summary', 'actor'], data.events.map(event => [
61
+ event.at,
62
+ event.type,
63
+ truncate(event.summary, 72),
64
+ event.actor?.email ?? '-',
65
+ ]));
66
+ if (data.nextCursor) {
67
+ process.stdout.write(`\nolder events: cai events --cursor ${data.nextCursor} (repeat your filters)\n`);
68
+ }
69
+ });
70
+ });
71
+ };
72
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,306 @@
1
+ import { requireContext } from '../context.js';
2
+ import { CaiError, EXIT } from '../errors.js';
3
+ import { emit, printKeyValues, printTable, truncate, warn } from '../output.js';
4
+ import { auditResolvedConfigs } from './run.js';
5
+ const describeReadFailure = (target, error) => {
6
+ const cause = error instanceof CaiError
7
+ ? error
8
+ : new CaiError(error instanceof Error ? error.message : String(error), {
9
+ code: 'UNEXPECTED',
10
+ });
11
+ return {
12
+ target,
13
+ code: cause.code,
14
+ message: cause.message,
15
+ exitCode: cause.exitCode,
16
+ ...(cause.detail !== undefined ? { detail: cause.detail } : {}),
17
+ scrubbed: cause.scrubbed,
18
+ };
19
+ };
20
+ const aggregateReadExitCode = (failures) => {
21
+ if (failures.some(failure => failure.exitCode === EXIT.auth))
22
+ return EXIT.auth;
23
+ if (failures.some(failure => failure.exitCode === EXIT.conflict))
24
+ return EXIT.conflict;
25
+ if (failures.some(failure => failure.exitCode === EXIT.network))
26
+ return EXIT.network;
27
+ return EXIT.user;
28
+ };
29
+ const readFailureDetail = (failure) => ({
30
+ code: failure.code,
31
+ message: failure.message,
32
+ exitCode: failure.exitCode,
33
+ ...(failure.scrubbed ? { scrubbed: true } : {}),
34
+ ...(failure.detail !== undefined ? { detail: failure.detail } : {}),
35
+ });
36
+ const aggregateReadError = (summary, code, failures, detail) => new CaiError(`${summary}:\n${failures.map(failure => `- ${failure.target}: ${failure.message}`).join('\n')}`, {
37
+ exitCode: aggregateReadExitCode(failures),
38
+ code,
39
+ detail,
40
+ scrubbed: failures.some(failure => failure.scrubbed),
41
+ });
42
+ export const registerExec = (program) => {
43
+ const exec = program.command('exec').description('Read execution history');
44
+ exec
45
+ .command('list')
46
+ .option('--limit <n>', 'max rows', '10')
47
+ .description('Recent workflow executions')
48
+ .action(async (opts, command) => {
49
+ const { api, workflowId } = requireContext(command);
50
+ const data = await api.tool(workflowId, 'get_workflow_executions', {
51
+ limit: Number(opts.limit),
52
+ });
53
+ const rows = data?.executions ?? (Array.isArray(data) ? data : []);
54
+ emit(data, () => printTable(['id', 'status', 'startedAt', 'completedAt'], rows.map(e => [e.id, e.status, e.startedAt, e.completedAt])));
55
+ });
56
+ exec
57
+ .command('get')
58
+ .argument('<workflowExecutionId>')
59
+ .description('One workflow execution with its flow executions')
60
+ .action(async (id, _opts, command) => {
61
+ const { api, workflowId } = requireContext(command);
62
+ const data = await api.tool(workflowId, 'get_workflow_execution', {
63
+ workflowExecutionId: Number(id),
64
+ });
65
+ emit(data, () => {
66
+ printKeyValues([
67
+ ['id', data.id ?? id],
68
+ ['status', data.status],
69
+ ['startedAt', data.startedAt],
70
+ ['completedAt', data.completedAt],
71
+ ['error', data.errorMessage ?? '-'],
72
+ ]);
73
+ const flows = data.flowExecutions ?? [];
74
+ if (flows.length) {
75
+ process.stdout.write('\nflow executions\n');
76
+ printTable(['id', 'flowId', 'status'], flows.map((f) => [f.id, f.flowId, f.status]));
77
+ }
78
+ });
79
+ });
80
+ exec
81
+ .command('flow')
82
+ .argument('<flowExecutionId>')
83
+ .description('Node-by-node detail of one flow execution (includes resolvedConfigs)')
84
+ .action(async (id, _opts, command) => {
85
+ const { api, workflowId } = requireContext(command);
86
+ const data = await api.tool(workflowId, 'get_flow_execution', {
87
+ flowExecutionId: Number(id),
88
+ });
89
+ const nodes = data?.nodeExecutions ?? [];
90
+ for (const node of nodes) {
91
+ for (const problem of auditResolvedConfigs(node.resolvedConfigs ?? [])) {
92
+ warn(`[node ${node.nodeId} / execution ${node.id}] ${problem}`);
93
+ }
94
+ }
95
+ emit(data, () => printTable(['execId', 'nodeId', 'status', 'error', 'configs'], nodes.map(n => [
96
+ n.id,
97
+ n.nodeId,
98
+ n.status,
99
+ truncate(n.errorMessage, 30),
100
+ (n.resolvedConfigs ?? []).length,
101
+ ])));
102
+ });
103
+ exec
104
+ .command('node')
105
+ .argument('<nodeExecutionId>')
106
+ .option('--full', 'print the untruncated output blob', false)
107
+ .description('One node execution: status, output, and resolvedConfigs')
108
+ .action(async (id, opts, command) => {
109
+ const { api, workflowId } = requireContext(command);
110
+ const data = await api.tool(workflowId, 'get_node_execution', {
111
+ nodeExecutionId: Number(id),
112
+ });
113
+ for (const problem of auditResolvedConfigs(data?.resolvedConfigs ?? []))
114
+ warn(problem);
115
+ emit(data, () => {
116
+ printKeyValues([
117
+ ['id', data.id ?? id],
118
+ ['nodeId', data.nodeId],
119
+ ['status', data.status],
120
+ ['error', data.errorMessage ?? '-'],
121
+ ]);
122
+ process.stdout.write('\nresolvedConfigs\n');
123
+ printTable(['prop', 'dynamic', 'value'], (data.resolvedConfigs ?? []).map((c) => [
124
+ c.configFieldName,
125
+ c.hasDynamicExpression ? 'yes' : '',
126
+ truncate(c.configValueProcessed, 60),
127
+ ]));
128
+ process.stdout.write('\noutput\n');
129
+ process.stdout.write(opts.full
130
+ ? `${JSON.stringify(data.output, null, 2)}\n`
131
+ : `${truncate(JSON.stringify(data.output), 1000)}\n`);
132
+ });
133
+ });
134
+ exec
135
+ .command('ports')
136
+ .argument('<nodeExecutionId>')
137
+ .option('--full', 'do not truncate values', false)
138
+ .description('Every port of one node execution: inputs, configs, outputs')
139
+ .action(async (id, opts, command) => {
140
+ const { api } = requireContext(command);
141
+ const executionId = Number(id);
142
+ // These three reads have no MCP tool — they are plain REST on the
143
+ // nodeExecutionValue router, which is why the debugging procedure used to
144
+ // drop out of the CLI here.
145
+ const reads = [
146
+ {
147
+ key: 'inputs',
148
+ route: `/node-execution-value/get-node-execution-inputs/${executionId}`,
149
+ },
150
+ {
151
+ key: 'configs',
152
+ route: `/node-execution-value/get-node-execution-configs/${executionId}`,
153
+ },
154
+ {
155
+ key: 'outputs',
156
+ route: `/node-execution-value/get-node-execution-outputs/${executionId}`,
157
+ },
158
+ ];
159
+ const results = await Promise.allSettled(reads.map(read => api.rest(read.route)));
160
+ const partialData = {};
161
+ const failures = [];
162
+ results.forEach((result, index) => {
163
+ const read = reads[index];
164
+ if (result.status === 'fulfilled') {
165
+ partialData[read.key] = result.value ?? [];
166
+ return;
167
+ }
168
+ failures.push(describeReadFailure(`GET ${read.route}`, result.reason));
169
+ });
170
+ if (failures.length > 0) {
171
+ throw aggregateReadError(`Could not read every port for node execution ${executionId}`, 'EXEC_PORTS_READ_FAILED', failures, {
172
+ nodeExecutionId: executionId,
173
+ failures: failures.map(failure => ({
174
+ route: failure.target,
175
+ ...readFailureDetail(failure),
176
+ })),
177
+ partialData,
178
+ });
179
+ }
180
+ const inputs = partialData.inputs ?? [];
181
+ const configs = partialData.configs ?? [];
182
+ const outputs = partialData.outputs ?? [];
183
+ for (const problem of auditResolvedConfigs((configs ?? []).map((c) => ({
184
+ configFieldName: c.configFieldName,
185
+ hasDynamicExpression: c.hasDynamicExpression,
186
+ configValueProcessed: c.configValueProcessed,
187
+ hasError: c.hasError,
188
+ errorMessage: c.errorMessage,
189
+ })))) {
190
+ warn(problem);
191
+ }
192
+ const shorten = (value) => (opts.full ? value : truncate(value, 120));
193
+ const payload = {
194
+ nodeExecutionId: executionId,
195
+ inputs: inputs ?? [],
196
+ configs: configs ?? [],
197
+ outputs: outputs ?? [],
198
+ };
199
+ emit(payload, () => {
200
+ process.stdout.write('inputs\n');
201
+ printTable(['id', 'name', 'value'], (inputs ?? []).map((i) => [
202
+ i.id,
203
+ i.inputName ?? i.name,
204
+ shorten(i.value ?? i.inputValue),
205
+ ]));
206
+ process.stdout.write('\nconfigs\n');
207
+ printTable(['id', 'prop', 'dynamic', 'resolvedValue'], (configs ?? []).map((c) => [
208
+ c.id,
209
+ c.configFieldName,
210
+ c.hasDynamicExpression ? 'yes' : '',
211
+ shorten(c.configValueProcessed),
212
+ ]));
213
+ process.stdout.write('\noutputs\n');
214
+ printTable(['id', 'name', 'value'], (outputs ?? []).map((o) => [
215
+ o.id,
216
+ o.outputName ?? o.name,
217
+ shorten(o.value ?? o.outputValue),
218
+ ]));
219
+ });
220
+ });
221
+ exec
222
+ .command('tree')
223
+ .argument('<workflowExecutionId>')
224
+ .description('Node-by-node status walk across every flow in an execution')
225
+ .action(async (id, _opts, command) => {
226
+ const { api, workflowId } = requireContext(command);
227
+ const execution = await api.tool(workflowId, 'get_workflow_execution', {
228
+ workflowExecutionId: Number(id),
229
+ });
230
+ const flows = execution?.flowExecutions ?? [];
231
+ const results = await Promise.allSettled(flows.map(f => api.tool(workflowId, 'get_flow_execution', { flowExecutionId: f.id })));
232
+ const details = [];
233
+ const failures = [];
234
+ results.forEach((result, index) => {
235
+ const flow = flows[index];
236
+ if (result.status === 'fulfilled') {
237
+ details.push({
238
+ flowExecutionId: flow.id,
239
+ flowId: flow.flowId,
240
+ status: flow.status,
241
+ detail: result.value,
242
+ });
243
+ return;
244
+ }
245
+ failures.push({
246
+ ...describeReadFailure(`get_flow_execution (flowExecutionId ${flow.id})`, result.reason),
247
+ flowExecutionId: flow.id,
248
+ flowId: flow.flowId,
249
+ });
250
+ });
251
+ if (failures.length > 0) {
252
+ throw aggregateReadError(`Could not read every flow in workflow execution ${id}`, 'EXEC_TREE_READ_FAILED', failures, {
253
+ workflowExecutionId: Number(id),
254
+ failures: failures.map(failure => ({
255
+ tool: 'get_flow_execution',
256
+ arguments: { flowExecutionId: failure.flowExecutionId },
257
+ flowId: failure.flowId,
258
+ ...readFailureDetail(failure),
259
+ })),
260
+ partialData: {
261
+ workflowExecutionId: Number(id),
262
+ status: execution?.status ?? null,
263
+ flows: details.map(detail => ({
264
+ flowExecutionId: detail.flowExecutionId,
265
+ flowId: detail.flowId,
266
+ status: detail.status,
267
+ nodeExecutions: detail.detail?.nodeExecutions ?? [],
268
+ })),
269
+ },
270
+ });
271
+ }
272
+ const rows = [];
273
+ for (const entry of details) {
274
+ for (const n of (entry.detail?.nodeExecutions ?? [])) {
275
+ rows.push([
276
+ entry.flowId ?? '-',
277
+ n.id,
278
+ n.nodeId,
279
+ n.status,
280
+ n.errorMessage ?? n.skipReason ?? '',
281
+ ]);
282
+ for (const problem of auditResolvedConfigs(n.resolvedConfigs ?? [])) {
283
+ warn(`[node ${n.nodeId} / execution ${n.id}] ${problem}`);
284
+ }
285
+ }
286
+ }
287
+ emit({
288
+ workflowExecutionId: Number(id),
289
+ status: execution?.status ?? null,
290
+ flows: details.map(d => ({
291
+ flowExecutionId: d.flowExecutionId,
292
+ flowId: d.flowId,
293
+ status: d.status,
294
+ nodeExecutions: d.detail?.nodeExecutions ?? [],
295
+ })),
296
+ }, () => {
297
+ printKeyValues([
298
+ ['workflowExecution', id],
299
+ ['status', execution?.status],
300
+ ]);
301
+ process.stdout.write('\n');
302
+ printTable(['flowId', 'execId', 'nodeId', 'status', 'note'], rows);
303
+ });
304
+ });
305
+ };
306
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}