@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.
- package/README.md +180 -0
- package/dist/api/client.js +330 -0
- package/dist/api/client.js.map +1 -0
- package/dist/appLinks.js +99 -0
- package/dist/appLinks.js.map +1 -0
- package/dist/argv.js +124 -0
- package/dist/argv.js.map +1 -0
- package/dist/commands/agent.js +813 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/auth.js +327 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/branch.js +441 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/connect.js +148 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/connection.js +148 -0
- package/dist/commands/connection.js.map +1 -0
- package/dist/commands/data.js +441 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/deps.js +63 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/doctor.js +102 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.js +72 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/exec.js +306 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/expr.js +346 -0
- package/dist/commands/expr.js.map +1 -0
- package/dist/commands/flow.js +447 -0
- package/dist/commands/flow.js.map +1 -0
- package/dist/commands/integration.js +102 -0
- package/dist/commands/integration.js.map +1 -0
- package/dist/commands/node.js +885 -0
- package/dist/commands/node.js.map +1 -0
- package/dist/commands/organize.js +234 -0
- package/dist/commands/organize.js.map +1 -0
- package/dist/commands/run.js +437 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/schema.js +269 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/skills.js +1156 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/trigger.js +992 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/commands/workflow.js +503 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +39 -0
- package/dist/context.js.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/jsSource.js +32 -0
- package/dist/jsSource.js.map +1 -0
- package/dist/nodeProps.js +177 -0
- package/dist/nodeProps.js.map +1 -0
- package/dist/output.js +85 -0
- package/dist/output.js.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +41 -0
- package/skills/controllerai-agents/SKILL.md +169 -0
- package/skills/controllerai-agents/agents/openai.yaml +4 -0
- package/skills/controllerai-agents/references/instructions-and-versioning.md +76 -0
- package/skills/controllerai-ai-nodes/SKILL.md +83 -0
- package/skills/controllerai-ai-nodes/agents/openai.yaml +4 -0
- package/skills/controllerai-ai-nodes/references/selection-and-testing.md +46 -0
- package/skills/controllerai-data/SKILL.md +121 -0
- package/skills/controllerai-data/agents/openai.yaml +4 -0
- package/skills/controllerai-data/references/data-rails.md +46 -0
- package/skills/controllerai-expressions/SKILL.md +115 -0
- package/skills/controllerai-expressions/agents/openai.yaml +4 -0
- package/skills/controllerai-expressions/references/dsl-and-recipes.md +120 -0
- package/skills/controllerai-flow-control/SKILL.md +132 -0
- package/skills/controllerai-flow-control/agents/openai.yaml +4 -0
- package/skills/controllerai-flow-control/references/patterns.md +61 -0
- package/skills/controllerai-integration-actions/SKILL.md +95 -0
- package/skills/controllerai-integration-actions/agents/openai.yaml +4 -0
- package/skills/controllerai-node-config/SKILL.md +138 -0
- package/skills/controllerai-node-config/agents/openai.yaml +4 -0
- package/skills/controllerai-node-config/references/prop-and-readiness.md +72 -0
- package/skills/controllerai-runs/SKILL.md +109 -0
- package/skills/controllerai-runs/agents/openai.yaml +4 -0
- package/skills/controllerai-runs/references/debugging.md +53 -0
- package/skills/controllerai-start/SKILL.md +44 -0
- package/skills/controllerai-start/agents/openai.yaml +4 -0
- package/skills/controllerai-triggers/SKILL.md +174 -0
- package/skills/controllerai-triggers/agents/openai.yaml +4 -0
- package/skills/controllerai-triggers/references/lifecycle.md +54 -0
- package/skills/controllerai-workflows/SKILL.md +86 -0
- package/skills/controllerai-workflows/agents/openai.yaml +4 -0
- package/skills/controllerai-workflows/references/command-map.md +64 -0
- 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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"}
|