@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,437 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { appBaseUrl, runUrl } from '../appLinks.js';
|
|
3
|
+
import { requireContext } from '../context.js';
|
|
4
|
+
import { CaiError, userError } from '../errors.js';
|
|
5
|
+
import { normalizeNodePropWrites } from '../nodeProps.js';
|
|
6
|
+
import { emit, printKeyValues, printTable, truncate, warn } from '../output.js';
|
|
7
|
+
export const normalizeObservedExecutionTargets = (targets) => [
|
|
8
|
+
...new Map(targets
|
|
9
|
+
.filter(target => target.nodeId && Number.isSafeInteger(target.nodeExecutionId))
|
|
10
|
+
.map(target => [target.nodeId, target])).values(),
|
|
11
|
+
];
|
|
12
|
+
export const requireRequestedNodeExecution = (nodeExecutions, nodeId, workflowExecutionId) => {
|
|
13
|
+
const execution = nodeExecutions.find(candidate => candidate.nodeId === nodeId);
|
|
14
|
+
if (execution)
|
|
15
|
+
return execution;
|
|
16
|
+
throw userError(`Execution ${workflowExecutionId} did not report an execution for requested node ` +
|
|
17
|
+
`${nodeId}. Refusing to attribute another node's result to it. Inspect the run with ` +
|
|
18
|
+
`\`cai exec get ${workflowExecutionId}\`.`, 'REQUESTED_NODE_EXECUTION_MISSING');
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A node test evaluates only the selected node. Make that boundary explicit in
|
|
22
|
+
* machine output so a green run cannot be mistaken for proof that wired
|
|
23
|
+
* upstream expressions resolve end to end.
|
|
24
|
+
*/
|
|
25
|
+
export const describeNodeRunScope = (node) => {
|
|
26
|
+
const incomingInputCount = Array.isArray(node?.inputs) ? node.inputs.length : null;
|
|
27
|
+
const endToEndValidationRequired = incomingInputCount === null || incomingInputCount > 0;
|
|
28
|
+
return {
|
|
29
|
+
mode: 'isolated-node',
|
|
30
|
+
upstreamNodesExecuted: false,
|
|
31
|
+
incomingInputCount,
|
|
32
|
+
endToEndValidationRequired,
|
|
33
|
+
endToEndCommand: endToEndValidationRequired
|
|
34
|
+
? 'cai run flow <flowId> --inputs <values.json> --json'
|
|
35
|
+
: null,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const adoptObservedOutputs = async (api, workflowId, targets) => {
|
|
39
|
+
const results = [];
|
|
40
|
+
for (const { nodeId, nodeExecutionId } of normalizeObservedExecutionTargets(targets)) {
|
|
41
|
+
try {
|
|
42
|
+
results.push(await api.mutate(workflowId, () => api.tool(workflowId, 'adopt_observed_output_type', {
|
|
43
|
+
nodeId,
|
|
44
|
+
nodeExecutionId,
|
|
45
|
+
})));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
results.push({
|
|
49
|
+
nodeId,
|
|
50
|
+
status: 'error',
|
|
51
|
+
error: error instanceof Error ? error.message : String(error),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return results;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Test-input file schema. The wire contract the backend wants is
|
|
59
|
+
* a flat `{ [inputId]: value }` map, so both the flat form and the documented
|
|
60
|
+
* `{nodeInputs:[{id,testValue}], flowInputs:[…]}` form are accepted and
|
|
61
|
+
* normalised here.
|
|
62
|
+
*/
|
|
63
|
+
export const readTestValues = (path) => {
|
|
64
|
+
const raw = path === '-' ? readFileSync(0, 'utf8') : readFileSync(path, 'utf8');
|
|
65
|
+
let parsed;
|
|
66
|
+
try {
|
|
67
|
+
parsed = JSON.parse(raw);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw userError(`--inputs ${path} is not valid JSON: ${error instanceof Error ? error.message : error}`, 'BAD_INPUTS_JSON');
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(parsed)) {
|
|
73
|
+
throw userError('--inputs must be an object, not an array.', 'BAD_INPUTS_SHAPE');
|
|
74
|
+
}
|
|
75
|
+
if (parsed.nodeInputs || parsed.flowInputs) {
|
|
76
|
+
const out = {};
|
|
77
|
+
for (const entry of [...(parsed.nodeInputs ?? []), ...(parsed.flowInputs ?? [])]) {
|
|
78
|
+
if (!entry?.id) {
|
|
79
|
+
throw userError('Each nodeInputs/flowInputs entry needs an `id`.', 'BAD_INPUTS_SHAPE');
|
|
80
|
+
}
|
|
81
|
+
out[entry.id] = entry.testValue;
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
return parsed;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* `run_node_test` / `run_flow_test` are ASYNC: they return
|
|
89
|
+
* `{status:'started', workflowExecutionId}` and nothing else — no output, no
|
|
90
|
+
* resolvedConfigs. The result only becomes readable by polling
|
|
91
|
+
* `get_workflow_execution`, whose `nodeExecutions[]` carry resolvedConfigs inline.
|
|
92
|
+
*/
|
|
93
|
+
/** Inline JSON, a file path, or `-` for stdin — shared by the probe options. */
|
|
94
|
+
export const readJsonArg = (source, flag) => {
|
|
95
|
+
let raw;
|
|
96
|
+
try {
|
|
97
|
+
raw =
|
|
98
|
+
source === '-'
|
|
99
|
+
? readFileSync(0, 'utf8')
|
|
100
|
+
: /^[{[]/.test(source.trimStart())
|
|
101
|
+
? source
|
|
102
|
+
: readFileSync(source, 'utf8');
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw userError(`${flag} "${source}" is not a readable file and does not look like inline JSON ` +
|
|
106
|
+
`(inline JSON must start with "{" or "["): ${error instanceof Error ? error.message : error}`, 'UNREADABLE_JSON_ARG');
|
|
107
|
+
}
|
|
108
|
+
let parsed;
|
|
109
|
+
try {
|
|
110
|
+
parsed = JSON.parse(raw);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw userError(`${flag} is not valid JSON: ${error instanceof Error ? error.message : error}`, 'BAD_JSON_ARG');
|
|
114
|
+
}
|
|
115
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
116
|
+
throw userError(`${flag} must be a JSON object.`, 'BAD_JSON_ARG_SHAPE');
|
|
117
|
+
}
|
|
118
|
+
return parsed;
|
|
119
|
+
};
|
|
120
|
+
/** Normalize discovery props to the same backend write envelope as `node add`. */
|
|
121
|
+
export const readDiscoveryProps = (source) => normalizeNodePropWrites(readJsonArg(source, '--props'));
|
|
122
|
+
export const testInputRows = (data) => {
|
|
123
|
+
if (Array.isArray(data?.inputs))
|
|
124
|
+
return data.inputs;
|
|
125
|
+
if (Array.isArray(data))
|
|
126
|
+
return data;
|
|
127
|
+
return [...(data?.nodeInputs ?? []), ...(data?.flowInputs ?? [])];
|
|
128
|
+
};
|
|
129
|
+
export const findWorkflowExecutionId = (result) => {
|
|
130
|
+
if (!result || typeof result !== 'object')
|
|
131
|
+
return null;
|
|
132
|
+
const id = result.workflowExecutionId ?? result.id;
|
|
133
|
+
return typeof id === 'number' ? id : null;
|
|
134
|
+
};
|
|
135
|
+
const developmentWorkflowVersionId = async (api, workflowId) => {
|
|
136
|
+
const state = await api.rest(`/workflow-agent/development-version-state/${workflowId}`);
|
|
137
|
+
const versionId = state?.workflowVersionId;
|
|
138
|
+
return typeof versionId === 'number' && Number.isSafeInteger(versionId) && versionId > 0
|
|
139
|
+
? versionId
|
|
140
|
+
: null;
|
|
141
|
+
};
|
|
142
|
+
const TERMINAL = new Set(['completed', 'completed_with_error', 'failed', 'cancelled']);
|
|
143
|
+
export const isTerminal = (status) => typeof status === 'string' && TERMINAL.has(status.toLowerCase());
|
|
144
|
+
/** Reject invalid polling budgets before an execution can be started. */
|
|
145
|
+
export const parseRunTimeout = (value) => {
|
|
146
|
+
const timeoutMs = Number(value);
|
|
147
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
|
|
148
|
+
throw userError('--timeout must be a positive integer number of milliseconds.', 'BAD_TIMEOUT');
|
|
149
|
+
}
|
|
150
|
+
return timeoutMs;
|
|
151
|
+
};
|
|
152
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
153
|
+
/** Poll until the execution completes, fails, pauses for action, or the budget runs out. */
|
|
154
|
+
export const pollExecution = async (api, workflowId, workflowExecutionId, timeoutMs = 120_000) => {
|
|
155
|
+
const deadline = Date.now() + timeoutMs;
|
|
156
|
+
let delay = 250;
|
|
157
|
+
let last = null;
|
|
158
|
+
do {
|
|
159
|
+
last = await api.tool(workflowId, 'get_workflow_execution', { workflowExecutionId });
|
|
160
|
+
const status = typeof last?.status === 'string' ? last.status.toLowerCase() : null;
|
|
161
|
+
if (status === 'paused')
|
|
162
|
+
return { kind: 'paused', lastSnapshot: last };
|
|
163
|
+
if (isTerminal(status)) {
|
|
164
|
+
return {
|
|
165
|
+
kind: status === 'completed' ? 'completed' : 'failed',
|
|
166
|
+
lastSnapshot: last,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const remaining = deadline - Date.now();
|
|
170
|
+
if (remaining <= 0)
|
|
171
|
+
break;
|
|
172
|
+
await sleep(Math.min(delay, remaining));
|
|
173
|
+
delay = Math.min(delay * 1.5, 3_000);
|
|
174
|
+
} while (Date.now() < deadline);
|
|
175
|
+
return { kind: 'timeout', lastSnapshot: last };
|
|
176
|
+
};
|
|
177
|
+
const executionError = (message, code, workflowExecutionId, lastSnapshot) => new CaiError(message, {
|
|
178
|
+
code,
|
|
179
|
+
detail: {
|
|
180
|
+
workflowExecutionId,
|
|
181
|
+
status: lastSnapshot?.status ?? null,
|
|
182
|
+
lastSnapshot,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
export const requireSuccessfulExecution = (result, workflowExecutionId, timeoutMs) => {
|
|
186
|
+
if (result.kind === 'completed')
|
|
187
|
+
return result.lastSnapshot;
|
|
188
|
+
if (result.kind === 'paused') {
|
|
189
|
+
throw executionError(`Execution ${workflowExecutionId} is paused and requires action before it can finish. ` +
|
|
190
|
+
`Inspect it with \`cai exec get ${workflowExecutionId}\`.`, 'WORKFLOW_EXECUTION_PAUSED', workflowExecutionId, result.lastSnapshot);
|
|
191
|
+
}
|
|
192
|
+
if (result.kind === 'failed') {
|
|
193
|
+
throw executionError(`Execution ${workflowExecutionId} finished with non-success status ` +
|
|
194
|
+
`${JSON.stringify(result.lastSnapshot?.status ?? 'unknown')}. ` +
|
|
195
|
+
`Inspect it with \`cai exec get ${workflowExecutionId}\`.`, 'WORKFLOW_EXECUTION_FAILED', workflowExecutionId, result.lastSnapshot);
|
|
196
|
+
}
|
|
197
|
+
throw executionError(`Execution ${workflowExecutionId} did not reach a terminal status within ${timeoutMs / 1000}s. Re-read it with \`cai exec get ${workflowExecutionId}\`.`, 'WORKFLOW_EXECUTION_TIMEOUT', workflowExecutionId, result.lastSnapshot);
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* resolvedConfigs is load-bearing: a NULL entry on a prop with
|
|
201
|
+
* hasDynamicExpression is a SILENT EXPRESSION FAILURE on an otherwise-green
|
|
202
|
+
* run. The node output is the provider's response and does not echo what was
|
|
203
|
+
* sent, so this is the only place the failure is visible.
|
|
204
|
+
*/
|
|
205
|
+
export const auditResolvedConfigs = (configs) => {
|
|
206
|
+
const problems = [];
|
|
207
|
+
for (const config of configs ?? []) {
|
|
208
|
+
if (config.hasError) {
|
|
209
|
+
problems.push(`resolvedConfigs["${config.configFieldName}"] reported an error: ${config.errorMessage}`);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const empty = config.configValueProcessed === null ||
|
|
213
|
+
config.configValueProcessed === undefined ||
|
|
214
|
+
config.configValueProcessed === '';
|
|
215
|
+
if (config.hasDynamicExpression && empty) {
|
|
216
|
+
problems.push(`SILENT EXPRESSION FAILURE: resolvedConfigs["${config.configFieldName}"] is ` +
|
|
217
|
+
`${JSON.stringify(config.configValueProcessed)} but the prop has a dynamic expression. ` +
|
|
218
|
+
'The run was green; the value sent to the integration was empty.');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return problems;
|
|
222
|
+
};
|
|
223
|
+
const printConfigs = (configs) => {
|
|
224
|
+
process.stdout.write('\nresolvedConfigs (what was actually sent)\n');
|
|
225
|
+
printTable(['prop', 'dynamic', 'resolvedValue'], (configs ?? []).map(c => [
|
|
226
|
+
c.configFieldName,
|
|
227
|
+
c.hasDynamicExpression ? 'yes' : '',
|
|
228
|
+
truncate(c.configValueProcessed, 60),
|
|
229
|
+
]));
|
|
230
|
+
};
|
|
231
|
+
export const registerRun = (program) => {
|
|
232
|
+
const run = program
|
|
233
|
+
.command('run')
|
|
234
|
+
.description('Dev-version runs — REAL external actions against the development data rail');
|
|
235
|
+
run
|
|
236
|
+
.command('node')
|
|
237
|
+
.argument('<nodeId>')
|
|
238
|
+
.option('--inputs <file|->', 'JSON test values; `-` reads stdin')
|
|
239
|
+
.option('--timeout <ms>', 'how long to wait for the run to finish', '120000')
|
|
240
|
+
.description('Run one node in isolation on the dev version (real external action); always surfaces resolvedConfigs')
|
|
241
|
+
.action(async (nodeId, opts, command) => {
|
|
242
|
+
const timeoutMs = parseRunTimeout(opts.timeout);
|
|
243
|
+
const { api, config, workflowId } = requireContext(command);
|
|
244
|
+
warn('Dev run: integration actions execute for REAL (messages send, records change). ' +
|
|
245
|
+
'Dev isolation covers the data store only.');
|
|
246
|
+
const testValues = opts.inputs ? readTestValues(opts.inputs) : {};
|
|
247
|
+
const node = await api.tool(workflowId, 'get_node', { nodeId });
|
|
248
|
+
const runScope = describeNodeRunScope(node);
|
|
249
|
+
if (runScope.endToEndValidationRequired) {
|
|
250
|
+
const inputDetail = runScope.incomingInputCount === null
|
|
251
|
+
? 'its incoming wiring could not be confirmed'
|
|
252
|
+
: `it has ${runScope.incomingInputCount} wired input(s)`;
|
|
253
|
+
warn(`This is an isolated node run and upstream nodes are not executed; ${inputDetail}. ` +
|
|
254
|
+
'Use `cai run flow <flowId> --inputs <values.json> --json` before accepting ' +
|
|
255
|
+
'an upstream-dependent expression as verified.');
|
|
256
|
+
}
|
|
257
|
+
const started = await api.tool(workflowId, 'run_node_test', { nodeId, testValues });
|
|
258
|
+
const workflowExecutionId = findWorkflowExecutionId(started);
|
|
259
|
+
if (workflowExecutionId === null) {
|
|
260
|
+
throw userError(`run_node_test returned no workflowExecutionId: ${JSON.stringify(started)}. ` +
|
|
261
|
+
'resolvedConfigs cannot be resolved without it.', 'NO_EXECUTION_ID');
|
|
262
|
+
}
|
|
263
|
+
const execution = requireSuccessfulExecution(await pollExecution(api, workflowId, workflowExecutionId, timeoutMs), workflowExecutionId, timeoutMs);
|
|
264
|
+
const nodeExecutions = execution?.nodeExecutions ?? [];
|
|
265
|
+
const mine = requireRequestedNodeExecution(nodeExecutions, nodeId, workflowExecutionId);
|
|
266
|
+
const configs = mine.resolvedConfigs ?? [];
|
|
267
|
+
for (const problem of auditResolvedConfigs(configs))
|
|
268
|
+
warn(problem);
|
|
269
|
+
const outputTypeAdoption = (mine?.status ?? execution?.status) === 'completed' && Number.isSafeInteger(mine?.id)
|
|
270
|
+
? (await adoptObservedOutputs(api, workflowId, [{ nodeId, nodeExecutionId: mine.id }]))[0]
|
|
271
|
+
: null;
|
|
272
|
+
const versionId = appBaseUrl(config)
|
|
273
|
+
? await developmentWorkflowVersionId(api, workflowId)
|
|
274
|
+
: null;
|
|
275
|
+
const appUrl = versionId === null ? null : runUrl(config, workflowId, versionId, workflowExecutionId);
|
|
276
|
+
const payload = {
|
|
277
|
+
nodeId,
|
|
278
|
+
runScope,
|
|
279
|
+
workflowExecutionId,
|
|
280
|
+
nodeExecutionId: mine?.id ?? null,
|
|
281
|
+
status: mine?.status ?? execution?.status ?? null,
|
|
282
|
+
errorMessage: mine?.errorMessage ?? execution?.errorMessage ?? null,
|
|
283
|
+
skipReason: mine?.skipReason ?? null,
|
|
284
|
+
output: mine?.output ?? null,
|
|
285
|
+
// Never flattened, never omitted — the skills read this key by name.
|
|
286
|
+
resolvedConfigs: configs,
|
|
287
|
+
outputTypeAdoption,
|
|
288
|
+
...(appUrl ? { appUrl } : {}),
|
|
289
|
+
};
|
|
290
|
+
if (payload.outputTypeAdoption?.status === 'no_observed_output') {
|
|
291
|
+
warn(`Node ${nodeId} completed, but the server observed no reusable output type. ` +
|
|
292
|
+
'Downstream field expressions remain unavailable until a representative run returns data.');
|
|
293
|
+
}
|
|
294
|
+
else if (payload.outputTypeAdoption?.status === 'error') {
|
|
295
|
+
warn(`Node ${nodeId} completed, but output-type adoption failed: ` +
|
|
296
|
+
`${payload.outputTypeAdoption.error}`);
|
|
297
|
+
}
|
|
298
|
+
emit(payload, () => {
|
|
299
|
+
const rows = [
|
|
300
|
+
['nodeId', nodeId],
|
|
301
|
+
['scope', runScope.mode],
|
|
302
|
+
['upstream nodes executed', runScope.upstreamNodesExecuted],
|
|
303
|
+
['workflowExecutionId', payload.workflowExecutionId],
|
|
304
|
+
['nodeExecutionId', payload.nodeExecutionId ?? '(none)'],
|
|
305
|
+
['status', payload.status ?? '(unreported)'],
|
|
306
|
+
['error', payload.errorMessage ?? '-'],
|
|
307
|
+
];
|
|
308
|
+
if (appUrl)
|
|
309
|
+
rows.push(['open in app', appUrl]);
|
|
310
|
+
printKeyValues(rows);
|
|
311
|
+
printConfigs(configs);
|
|
312
|
+
process.stdout.write(`\noutput\n${JSON.stringify(payload.output, null, 2)}\n`);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
run
|
|
316
|
+
.command('flow')
|
|
317
|
+
.argument('<flowId>')
|
|
318
|
+
.option('--inputs <file|->', 'JSON test values; `-` reads stdin')
|
|
319
|
+
.option('--timeout <ms>', 'how long to wait for the run to finish', '300000')
|
|
320
|
+
.description('Run one flow end-to-end on the dev version (real external actions)')
|
|
321
|
+
.action(async (flowId, opts, command) => {
|
|
322
|
+
const timeoutMs = parseRunTimeout(opts.timeout);
|
|
323
|
+
const { api, config, workflowId } = requireContext(command);
|
|
324
|
+
warn('Dev run: integration actions execute for REAL (messages send, records change). ' +
|
|
325
|
+
'Dev isolation covers the data store only.');
|
|
326
|
+
const testValues = opts.inputs ? readTestValues(opts.inputs) : {};
|
|
327
|
+
const started = await api.tool(workflowId, 'run_flow_test', { flowId, testValues });
|
|
328
|
+
const workflowExecutionId = findWorkflowExecutionId(started);
|
|
329
|
+
if (workflowExecutionId === null) {
|
|
330
|
+
emit(started, () => printKeyValues([['result', truncate(JSON.stringify(started), 400)]]));
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const execution = requireSuccessfulExecution(await pollExecution(api, workflowId, workflowExecutionId, timeoutMs), workflowExecutionId, timeoutMs);
|
|
334
|
+
const nodeExecutions = execution?.nodeExecutions ?? [];
|
|
335
|
+
for (const n of nodeExecutions) {
|
|
336
|
+
for (const problem of auditResolvedConfigs(n.resolvedConfigs ?? [])) {
|
|
337
|
+
warn(`[node ${n.nodeId} / execution ${n.id}] ${problem}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
const outputTypeAdoptions = await adoptObservedOutputs(api, workflowId, nodeExecutions
|
|
341
|
+
.filter(n => n.status === 'completed' && Number.isSafeInteger(n.id))
|
|
342
|
+
.map(n => ({ nodeId: String(n.nodeId ?? ''), nodeExecutionId: n.id })));
|
|
343
|
+
const versionId = appBaseUrl(config)
|
|
344
|
+
? await developmentWorkflowVersionId(api, workflowId)
|
|
345
|
+
: null;
|
|
346
|
+
const appUrl = versionId === null ? null : runUrl(config, workflowId, versionId, workflowExecutionId);
|
|
347
|
+
const payload = {
|
|
348
|
+
flowId,
|
|
349
|
+
workflowExecutionId,
|
|
350
|
+
status: execution?.status ?? null,
|
|
351
|
+
errorMessage: execution?.errorMessage ?? null,
|
|
352
|
+
nodeExecutions,
|
|
353
|
+
outputTypeAdoptions,
|
|
354
|
+
...(appUrl ? { appUrl } : {}),
|
|
355
|
+
};
|
|
356
|
+
emit(payload, () => {
|
|
357
|
+
const rows = [
|
|
358
|
+
['flowId', flowId],
|
|
359
|
+
['workflowExecutionId', workflowExecutionId],
|
|
360
|
+
['status', execution?.status ?? '-'],
|
|
361
|
+
['error', execution?.errorMessage ?? '-'],
|
|
362
|
+
];
|
|
363
|
+
if (appUrl)
|
|
364
|
+
rows.push(['open in app', appUrl]);
|
|
365
|
+
printKeyValues(rows);
|
|
366
|
+
process.stdout.write('\n');
|
|
367
|
+
printTable(['execId', 'nodeId', 'status', 'error'], nodeExecutions.map(n => [n.id, n.nodeId, n.status, truncate(n.errorMessage, 40)]));
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
run
|
|
371
|
+
.command('inputs')
|
|
372
|
+
.argument('<nodeIdOrFlowId>')
|
|
373
|
+
.option('--flow', 'treat the argument as a flow id', false)
|
|
374
|
+
.description('The test inputs a node or flow needs (call before `run node`)')
|
|
375
|
+
.action(async (id, opts, command) => {
|
|
376
|
+
const { api, workflowId } = requireContext(command);
|
|
377
|
+
const data = opts.flow
|
|
378
|
+
? await api.tool(workflowId, 'get_flow_test_inputs', { flowId: id })
|
|
379
|
+
: await api.tool(workflowId, 'get_node_test_inputs', { nodeId: id });
|
|
380
|
+
const rows = testInputRows(data);
|
|
381
|
+
emit(data, () => printTable(['id', 'displayName', 'dataType', 'testValue'], rows.map(i => [i.id, i.displayName ?? i.name, i.dataType, truncate(i.testValue, 40)])));
|
|
382
|
+
});
|
|
383
|
+
run
|
|
384
|
+
.command('discover')
|
|
385
|
+
.requiredOption('--node <slug>', 'integration node slug')
|
|
386
|
+
.requiredOption('--key <componentKey>', 'component key from `cai node components`')
|
|
387
|
+
.requiredOption('--connection <id|none>', 'connection id, or "none" for a component that needs no auth')
|
|
388
|
+
.option('--props <json|file|->', 'prop values, same per-prop shape as `node add`')
|
|
389
|
+
.option('--enable <prop>', 'optional prop to enable first; repeatable', (value, previous = []) => [...previous, value])
|
|
390
|
+
.option('--keep', 'keep the scratch node instead of deleting it', false)
|
|
391
|
+
.option('--timeout <ms>', 'poll budget, backend caps at 55000')
|
|
392
|
+
.description('Probe what a component really returns, without touching the real graph')
|
|
393
|
+
.action(async (opts, command) => {
|
|
394
|
+
const timeoutMs = opts.timeout === undefined ? undefined : parseRunTimeout(opts.timeout);
|
|
395
|
+
const { api, workflowId } = requireContext(command);
|
|
396
|
+
warn('run discover executes the REAL third-party action and spends usage balance. It runs in ' +
|
|
397
|
+
'a hidden "Agent Scratch" flow, so the real graph is untouched, but the side effects ' +
|
|
398
|
+
'are not simulated.');
|
|
399
|
+
const result = await api.mutate(workflowId, () => api.tool(workflowId, 'run_discovery_test', {
|
|
400
|
+
nodeSlug: opts.node,
|
|
401
|
+
nodeKey: opts.key,
|
|
402
|
+
connectionId: opts.connection === 'none' ? null : Number(opts.connection),
|
|
403
|
+
...(opts.props ? { props: readDiscoveryProps(opts.props) } : {}),
|
|
404
|
+
...(opts.enable?.length ? { enableOptionalProps: opts.enable } : {}),
|
|
405
|
+
...(opts.keep ? { keepNode: true } : {}),
|
|
406
|
+
...(timeoutMs !== undefined ? { pollTimeoutMs: timeoutMs } : {}),
|
|
407
|
+
}));
|
|
408
|
+
const configs = result?.resolvedConfigs ?? [];
|
|
409
|
+
for (const problem of auditResolvedConfigs(configs))
|
|
410
|
+
warn(problem);
|
|
411
|
+
if (!result?.observedOutputType) {
|
|
412
|
+
warn('No observedOutputType came back — the probe did not resolve an output type for this ' +
|
|
413
|
+
'component, so downstream bindings on it will still be undetermined.');
|
|
414
|
+
}
|
|
415
|
+
emit({ ...result, resolvedConfigs: configs }, () => {
|
|
416
|
+
printKeyValues([
|
|
417
|
+
['component', `${opts.node} / ${opts.key}`],
|
|
418
|
+
['status', result?.status ?? '-'],
|
|
419
|
+
['observedOutputType', result?.observedOutputType ?? '(none)'],
|
|
420
|
+
['scratchNodeId', result?.nodeId ?? (opts.keep ? '(kept)' : '(deleted)')],
|
|
421
|
+
['error', result?.errorMessage ?? result?.error ?? '-'],
|
|
422
|
+
]);
|
|
423
|
+
if (configs.length)
|
|
424
|
+
printConfigs(configs);
|
|
425
|
+
process.stdout.write(`\noutput\n${JSON.stringify(result?.output ?? null, null, 2)}\n`);
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
run
|
|
429
|
+
.command('workflow')
|
|
430
|
+
.description('Not implemented — use `cai run flow <flowId>`')
|
|
431
|
+
.action(() => {
|
|
432
|
+
throw userError('Not implemented. The backend exposes no whole-workflow manual run: the manual runner ' +
|
|
433
|
+
'is flow-scoped (run_flow_test). Use `cai run flow <flowId>` on the entry flow, or ' +
|
|
434
|
+
'publish and let a trigger fire the live version.', 'NOT_IMPLEMENTED');
|
|
435
|
+
});
|
|
436
|
+
};
|
|
437
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|