@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,447 @@
1
+ import { requireContext } from '../context.js';
2
+ import { userError } from '../errors.js';
3
+ import { resolveJsSource } from '../jsSource.js';
4
+ import { nodePropsFromPayload } from '../nodeProps.js';
5
+ import { emit, printKeyValues, printTable, warn } from '../output.js';
6
+ import { parseFieldSpecs } from './schema.js';
7
+ const toSnakeCase = (value) => value
8
+ .trim()
9
+ .replace(/[-\s]+/g, '_')
10
+ .replace(/[^a-zA-Z0-9_]/g, '')
11
+ .toLowerCase()
12
+ .replace(/_+/g, '_')
13
+ .replace(/^_/, '')
14
+ .replace(/_$/, '');
15
+ const toCamel = (value) => value.replace(/_([a-z0-9])/g, (_, char) => char.toUpperCase());
16
+ export const resolveFlowInputDisplayName = (displayName, legacyName) => {
17
+ const value = String(displayName ?? legacyName ?? '').trim();
18
+ if (!value) {
19
+ throw userError('Pass --display <human label>. --name remains only as a legacy alias; the server derives ' +
20
+ 'and deduplicates the immutable JS binding.', 'MISSING_FLOW_INPUT_DISPLAY');
21
+ }
22
+ return value;
23
+ };
24
+ /** Mirror the backend's new-loop input naming before the loop exists. */
25
+ export const buildSourceListExpression = (sourceOutputLabel, fieldPath) => {
26
+ const binding = toCamel(toSnakeCase(sourceOutputLabel) || 'input');
27
+ const segments = fieldPath.split('.').map(segment => segment.trim());
28
+ if (!segments.length || segments.some(segment => !segment)) {
29
+ throw userError('--list-field must be a non-empty dot-delimited field path.', 'BAD_LIST_FIELD');
30
+ }
31
+ const access = segments
32
+ .map(segment => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(segment) ? `.${segment}` : `[${JSON.stringify(segment)}]`)
33
+ .join('');
34
+ return `inputs.${binding}.data${access}`;
35
+ };
36
+ export const parseLoopMaxItems = (raw) => {
37
+ if (raw === undefined)
38
+ return undefined;
39
+ const value = Number(raw);
40
+ if (!Number.isInteger(value) || value < 1 || value > 10_000) {
41
+ throw userError('--max-items must be an integer from 1 through 10000.', 'BAD_MAX_ITEMS');
42
+ }
43
+ return value;
44
+ };
45
+ export const selectSourceOutput = (sourceNodeId, source, sourceOutputId) => {
46
+ const outputs = (source?.outputs ?? source?.data?.outputs ?? []);
47
+ const selected = outputs.find(output => output.id === sourceOutputId);
48
+ if (!selected) {
49
+ const available = outputs.map(output => ({
50
+ id: output.id,
51
+ displayName: output.displayName,
52
+ }));
53
+ throw userError(`--source-output "${sourceOutputId}" is not an output id on node ${sourceNodeId}. ` +
54
+ `Available outputs: ${JSON.stringify(available)}. Copy the exact opaque outputs[].id ` +
55
+ `from \`cai node get ${sourceNodeId} --json\`; do not pass a label.`, 'UNKNOWN_SOURCE_OUTPUT');
56
+ }
57
+ return selected;
58
+ };
59
+ export const sourceOutputBindingLabel = (source, output) => {
60
+ const nodeType = String(source.type ?? source.data?.type ?? source.canvasNodeType ?? '');
61
+ // get_node intentionally projects branch families as routes/branches rather
62
+ // than exposing the canvas node type. Detect both response shapes so a
63
+ // --list-field expression uses the same branch label that ADD_EDGE_AND_INPUT
64
+ // materializes as the loop node's input binding.
65
+ const branchOutput = nodeType === 'router' ||
66
+ nodeType === 'ifElse' ||
67
+ Array.isArray(source.routes) ||
68
+ Array.isArray(source.branches);
69
+ const errorOutput = String(output.dataType ?? '').endsWith('#error');
70
+ return branchOutput || errorOutput
71
+ ? output.displayName
72
+ : (source.displayName ?? source.data?.displayName ?? output.displayName);
73
+ };
74
+ export const registerFlow = (program) => {
75
+ const flow = program.command('flow').description('Flows — a workflow has many canvases');
76
+ flow
77
+ .command('list')
78
+ .description('List the flows on this workflow')
79
+ .action(async (_opts, command) => {
80
+ const { api, workflowId } = requireContext(command);
81
+ const flows = await api.tool(workflowId, 'get_flows', {});
82
+ emit({ items: flows ?? [], flows: flows ?? [] }, () => printTable(['id', 'name', 'nodes', 'edges', 'inputs'], (flows ?? []).map(f => [f.id, f.name, f.nodeCount, f.edgeCount, f.flowInputCount])));
83
+ });
84
+ flow
85
+ .command('get')
86
+ .argument('<flowId>')
87
+ .description('Nodes, edges and inputs of one flow')
88
+ .action(async (flowId, _opts, command) => {
89
+ const { api, workflowId } = requireContext(command);
90
+ const data = await api.tool(workflowId, 'get_flow', { flowId });
91
+ emit(data, () => {
92
+ printKeyValues([
93
+ ['flow', `${data.id ?? flowId} — ${data.name ?? ''}`],
94
+ ['nodes', (data.nodes ?? []).length],
95
+ ['edges', (data.edges ?? []).length],
96
+ ]);
97
+ if (data.nodes?.length) {
98
+ process.stdout.write('\nnodes\n');
99
+ printTable(['id', 'displayName', 'component'], data.nodes.map((n) => [
100
+ n.id,
101
+ n.displayName ?? n.data?.displayName,
102
+ n.nodeComponentKey ?? n.data?.nodeComponentKey ?? '-',
103
+ ]));
104
+ }
105
+ if (data.flowInputs?.length) {
106
+ process.stdout.write('\ninputs\n');
107
+ printTable(['id', 'name', 'displayName', 'dataType'], data.flowInputs.map((i) => [
108
+ i.id,
109
+ i.jsBinding ?? i.name,
110
+ i.displayName,
111
+ i.dataType,
112
+ ]));
113
+ }
114
+ });
115
+ });
116
+ flow
117
+ .command('create')
118
+ .description('Create a new flow canvas')
119
+ .requiredOption('--name <name>')
120
+ .action(async (opts, command) => {
121
+ const { api, workflowId } = requireContext(command);
122
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'create_flow', { name: opts.name }));
123
+ emit(data, () => printKeyValues([
124
+ ['flowId', data.flowId ?? data.id],
125
+ ['name', opts.name],
126
+ ]));
127
+ });
128
+ flow
129
+ .command('rename')
130
+ .argument('<flowId>')
131
+ .requiredOption('--name <name>')
132
+ .description('Rename a flow')
133
+ .action(async (flowId, opts, command) => {
134
+ const { api, workflowId } = requireContext(command);
135
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'rename_flow', { flowId, name: opts.name }));
136
+ emit(data, () => printKeyValues([
137
+ ['flowId', flowId],
138
+ ['name', opts.name],
139
+ ]));
140
+ });
141
+ flow
142
+ .command('delete')
143
+ .argument('<flowId>')
144
+ .description('Delete a flow')
145
+ .action(async (flowId, _opts, command) => {
146
+ const { api, workflowId } = requireContext(command);
147
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'delete_flow', { flowId }));
148
+ emit(data, () => printKeyValues([['deleted', flowId]]));
149
+ });
150
+ flow
151
+ .command('outputs')
152
+ .argument('<flowId>')
153
+ .description('Declared outputs of a flow')
154
+ .action(async (flowId, _opts, command) => {
155
+ const { api, workflowId } = requireContext(command);
156
+ const data = await api.tool(workflowId, 'get_flow_outputs', { flowId });
157
+ emit(data, () => printTable(['id', 'name', 'displayName', 'dataType'], (data.outputs ?? []).map((o) => [o.id, o.name, o.displayName, o.dataType])));
158
+ });
159
+ flow
160
+ .command('duplicate')
161
+ .argument('<flowId>')
162
+ .description('Copy a flow with fresh ids for every node and edge')
163
+ .action(async (flowId, _opts, command) => {
164
+ const { api, workflowId } = requireContext(command);
165
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'duplicate_flow', { flowId }));
166
+ emit(data, () => printKeyValues([
167
+ ['source', flowId],
168
+ ['copy', data?.newFlowId ?? data?.flowId ?? data?.id ?? JSON.stringify(data)],
169
+ ]));
170
+ });
171
+ flow
172
+ .command('reorder')
173
+ .requiredOption('--order <flowIds>', 'every flow id, comma-separated, in the new order')
174
+ .description('Reorder the workflow’s flows (presentation order, not execution order)')
175
+ .action(async (opts, command) => {
176
+ const { api, workflowId } = requireContext(command);
177
+ const requested = String(opts.order)
178
+ .split(',')
179
+ .map(s => s.trim())
180
+ .filter(Boolean);
181
+ const flows = await api.tool(workflowId, 'get_flows', {});
182
+ const known = (flows ?? []).map(f => f.id);
183
+ const missing = known.filter(id => !requested.includes(id));
184
+ const unknown = requested.filter(id => !known.includes(id));
185
+ if (missing.length || unknown.length) {
186
+ throw userError('--order must list every flow id exactly once.' +
187
+ (missing.length ? `\nmissing: ${missing.join(', ')}` : '') +
188
+ (unknown.length ? `\nnot on this workflow: ${unknown.join(', ')}` : ''), 'BAD_ORDER');
189
+ }
190
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'reorder_flows', { flowIds: requested }));
191
+ const names = new Map((flows ?? []).map(f => [f.id, f.name]));
192
+ emit({ flowIds: requested, result: data }, () => printTable(['order', 'flowId', 'name'], requested.map((id, i) => [i, id, names.get(id) ?? ''])));
193
+ });
194
+ const output = flow
195
+ .command('output')
196
+ .description('Flow outputs — declare these BEFORE adding a Return response node');
197
+ output
198
+ .command('add')
199
+ .argument('<flowId>')
200
+ .requiredOption('--display <name>', 'human-readable output label')
201
+ .requiredOption('--type <ctype>', 'e.g. text / number / list.text / custom.lead')
202
+ .option('--name <name>', 'internal snake_case name (generated from --display when omitted)')
203
+ .option('--description <text>')
204
+ .description('Declare an output a flow returns')
205
+ .action(async (flowId, opts, command) => {
206
+ const { api, workflowId } = requireContext(command);
207
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'add_flow_output', {
208
+ flowId,
209
+ displayName: opts.display,
210
+ dataType: opts.type,
211
+ ...(opts.name ? { name: opts.name } : {}),
212
+ ...(opts.description ? { description: opts.description } : {}),
213
+ }));
214
+ warn('A Return response node generates its props FROM the flow outputs, so outputs must exist ' +
215
+ 'before the node is added or configured — adding one later does not retro-fit an ' +
216
+ 'existing node’s props.');
217
+ emit(data, () => printKeyValues([
218
+ ['flowOutputId', data?.flowOutputId ?? data?.id ?? '-'],
219
+ ['displayName', opts.display],
220
+ ['dataType', opts.type],
221
+ ]));
222
+ });
223
+ output
224
+ .command('update')
225
+ .argument('<flowId>')
226
+ .requiredOption('--output <id>', 'flow output id')
227
+ .option('--name <name>')
228
+ .option('--display <name>')
229
+ .option('--type <ctype>')
230
+ .option('--description <text>')
231
+ .description('Update a flow output (Return response props are kept in sync)')
232
+ .action(async (flowId, opts, command) => {
233
+ const { api, workflowId } = requireContext(command);
234
+ if (!opts.name && !opts.display && !opts.type && opts.description === undefined) {
235
+ throw userError('Pass at least one of --name, --display, --type, --description.', 'NOTHING_TO_DO');
236
+ }
237
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'update_flow_output', {
238
+ flowId,
239
+ flowOutputId: opts.output,
240
+ ...(opts.name ? { name: opts.name } : {}),
241
+ ...(opts.display ? { displayName: opts.display } : {}),
242
+ ...(opts.type ? { dataType: opts.type } : {}),
243
+ ...(opts.description !== undefined ? { description: opts.description } : {}),
244
+ }));
245
+ emit(data, () => printKeyValues([['updated', opts.output]]));
246
+ });
247
+ output
248
+ .command('delete')
249
+ .argument('<flowId>')
250
+ .requiredOption('--output <id>')
251
+ .description('Remove a flow output (its Return response prop goes too)')
252
+ .action(async (flowId, opts, command) => {
253
+ const { api, workflowId } = requireContext(command);
254
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'delete_flow_output', { flowId, flowOutputId: opts.output }));
255
+ emit(data, () => printKeyValues([['deleted', opts.output]]));
256
+ });
257
+ flow
258
+ .command('for-each')
259
+ .requiredOption('--flow <flowId>', 'parent flow holding the list-producing node')
260
+ .requiredOption('--from <nodeId>', 'node whose output carries the list')
261
+ .requiredOption('--source-output <outputId>', 'exact opaque outputs[].id from `cai node get <nodeId> --json`; never a label')
262
+ .requiredOption('--name <bodyFlowName>', 'name for the new per-item flow')
263
+ .requiredOption('--item-type <type>', 'one item: a primitive (text|number|date|boolean) or an existing/new custom.* type')
264
+ .option('--item-field <id:type[:display]>', 'field of a NEW custom item type; repeatable. Omit to reuse an existing custom type', (value, previous = []) => [...previous, value])
265
+ .option('--list-js <expr>', 'JS selecting the list from the wired input')
266
+ .option('--js-file <path|->', 'read the list-selection JS from a UTF-8 file or stdin')
267
+ .option('--list-field <path>', 'nested list field under the source output; builds the exact inputs.<binding>.data path')
268
+ .option('--max-items <n>', 'runtime list cap, 1..10000 (default when omitted: 500)')
269
+ .option('--item-name <displayName>', 'display name of the item flow input')
270
+ .option('--continue-on-error', 'keep looping when one iteration fails', false)
271
+ .description('Build the for-each pattern; the core scaffold is atomic and maxItems is verified afterward')
272
+ .action(async (opts, command) => {
273
+ let listJs = resolveJsSource({ js: opts.listJs, jsFile: opts.jsFile }, { required: false, inlineFlag: '--list-js' });
274
+ const { api, workflowId } = requireContext(command);
275
+ const isPrimitive = !opts.itemType.startsWith('custom.');
276
+ if (isPrimitive && opts.itemField?.length) {
277
+ throw userError(`--item-field is only for custom.* item types; "${opts.itemType}" is a primitive, ` +
278
+ 'and a list of plain values needs no wrapper type.', 'FIELDS_ON_PRIMITIVE');
279
+ }
280
+ if (listJs !== undefined && opts.listField) {
281
+ throw userError('--list-field is mutually exclusive with --list-js and --js-file.', 'CONFLICTING_LIST_PATH');
282
+ }
283
+ if (opts.listField) {
284
+ const source = await api.tool(workflowId, 'get_node', { nodeId: opts.from });
285
+ const sourceOutput = selectSourceOutput(opts.from, source, opts.sourceOutput);
286
+ const sourceOutputLabel = sourceOutputBindingLabel(source, sourceOutput);
287
+ if (!sourceOutputLabel) {
288
+ throw userError(`Selected output ${opts.sourceOutput} on node ${opts.from} has no resolvable label; ` +
289
+ `cannot derive its loop binding. ` +
290
+ 'Use --list-js with an expression from `cai expr context`.', 'UNRESOLVED_LIST_BINDING');
291
+ }
292
+ listJs = buildSourceListExpression(sourceOutputLabel, opts.listField);
293
+ }
294
+ const maxItems = parseLoopMaxItems(opts.maxItems);
295
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'scaffold_for_each', {
296
+ flowId: opts.flow,
297
+ sourceNodeId: opts.from,
298
+ sourceOutputId: opts.sourceOutput,
299
+ bodyFlowName: opts.name,
300
+ itemType: {
301
+ name: opts.itemType,
302
+ ...(opts.itemField?.length
303
+ ? { fields: parseFieldSpecs(opts.itemField) }
304
+ : {}),
305
+ },
306
+ ...(listJs !== undefined ? { listJs } : {}),
307
+ ...(opts.itemName ? { itemInputDisplayName: opts.itemName } : {}),
308
+ ...(opts.continueOnError ? { continueOnIterationError: true } : {}),
309
+ }));
310
+ let maxItemsReadback = 500;
311
+ if (maxItems !== undefined) {
312
+ // scaffold_for_each does not currently accept maxItems, so materialize
313
+ // and set the optional prop immediately after the atomic scaffold.
314
+ await api.mutate(workflowId, () => api.tool(workflowId, 'enable_optional_prop', {
315
+ nodeId: data.loopNodeId,
316
+ propName: 'maxItems',
317
+ }));
318
+ await api.mutate(workflowId, () => api.tool(workflowId, 'update_node_prop', {
319
+ nodeId: data.loopNodeId,
320
+ key: 'maxItems',
321
+ value: maxItems,
322
+ }));
323
+ const readback = nodePropsFromPayload(await api.tool(workflowId, 'get_node_props', { nodeId: data.loopNodeId })).find(prop => (prop.name ?? prop.key) === 'maxItems');
324
+ maxItemsReadback = Number(readback?.value);
325
+ if (maxItemsReadback !== maxItems) {
326
+ throw userError(`Loop ${data.loopNodeId} was created, but maxItems did not read back as ${maxItems}. ` +
327
+ `Run \`cai node set ${data.loopNodeId} --prop maxItems --value ${maxItems}\`.`, 'LOOP_MAX_ITEMS_READBACK_MISMATCH');
328
+ }
329
+ }
330
+ for (const warning of data?.warnings ?? [])
331
+ warn(`Loop scaffold: ${String(warning)}`);
332
+ // The item binding is nested under `itemFlowInput`, and the wired list
333
+ // expression under `listWiring` — flattening either would lose the pairing
334
+ // between an input id and the js name that reaches it.
335
+ emit({
336
+ ...data,
337
+ maxItems: maxItemsReadback,
338
+ maxItemsConfigured: maxItems !== undefined,
339
+ }, () => {
340
+ printKeyValues([
341
+ ['bodyFlowId', data?.bodyFlowId ?? '-'],
342
+ ['bodyFlowName', data?.bodyFlowName ?? '-'],
343
+ ['loopNodeId', data?.loopNodeId ?? '-'],
344
+ ['itemType', data?.dataTypeName ?? opts.itemType],
345
+ ['itemInputId', data?.itemFlowInput?.id ?? '-'],
346
+ ['jsBinding', data?.itemFlowInput?.jsBinding ?? '-'],
347
+ ['listExpression', data?.listWiring?.listExpressionJs ?? '-'],
348
+ ['maxItems', maxItemsReadback],
349
+ ]);
350
+ for (const [i, step] of (data?.nextSteps ?? []).entries()) {
351
+ process.stdout.write(`${i === 0 ? '\nnextSteps (in order)\n' : ''}${i + 1}. ${step}\n`);
352
+ }
353
+ });
354
+ });
355
+ const input = flow.command('input').description('Flow inputs');
356
+ input
357
+ .command('add')
358
+ .argument('<flowId>')
359
+ .option('--name <displayName>', 'legacy alias for --display; it does not set the JS binding')
360
+ .requiredOption('--type <ctype>', 'CType, e.g. text / number / custom.lead')
361
+ .option('--display <name>', 'human display name; the server derives and deduplicates the frozen JS binding')
362
+ .option('--list', 'the input is a list of --type', false)
363
+ .option('--optional', 'input is optional', false)
364
+ .option('--description <text>')
365
+ .description('Add a flow input')
366
+ .action(async (flowId, opts, command) => {
367
+ const { api, workflowId } = requireContext(command);
368
+ const displayName = resolveFlowInputDisplayName(opts.display, opts.name);
369
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'add_flow_input', {
370
+ flowId,
371
+ // The MCP schema retains `name` for compatibility, but the handler
372
+ // intentionally ignores it and derives the binding from displayName.
373
+ name: displayName,
374
+ displayName,
375
+ dataType: opts.type,
376
+ isList: Boolean(opts.list),
377
+ optional: Boolean(opts.optional),
378
+ ...(opts.description ? { description: opts.description } : {}),
379
+ }));
380
+ const flowInputId = data.flowInputId ?? data.id;
381
+ const flowState = await api.tool(workflowId, 'get_flow', { flowId });
382
+ const flowInput = (flowState?.flowInputs ?? []).find((item) => item.id === flowInputId);
383
+ const result = {
384
+ ...data,
385
+ flowInputId,
386
+ displayName: flowInput?.displayName ?? displayName,
387
+ jsBinding: data.jsBinding ?? flowInput?.jsBinding ?? flowInput?.name ?? null,
388
+ };
389
+ if (!result.jsBinding) {
390
+ warn('The backend did not return the derived JS binding. Read it from `cai expr context ' +
391
+ '<nodeId> --prop <prop> --json` before authoring an expression.');
392
+ }
393
+ emit(result, () => printKeyValues([
394
+ ['flowInputId', result.flowInputId ?? '-'],
395
+ ['displayName', result.displayName],
396
+ ['jsBinding', result.jsBinding ?? '(read with expr context)'],
397
+ ]));
398
+ });
399
+ input
400
+ .command('update')
401
+ .argument('<flowId>')
402
+ .requiredOption('--input <id>', 'flow input id')
403
+ .option('--name <displayName>', 'legacy alias for --display; does not rename the JS binding')
404
+ .option('--display <name>', 'new human display name; the existing JS binding stays frozen')
405
+ .option('--type <ctype>')
406
+ .option('--description <text>')
407
+ .description('Update a flow input')
408
+ .action(async (flowId, opts, command) => {
409
+ const { api, workflowId } = requireContext(command);
410
+ const displayName = opts.display ?? opts.name;
411
+ if (!displayName && !opts.type && !opts.description) {
412
+ throw userError('Pass at least one of --display, --type, or --description. --name is a legacy alias ' +
413
+ 'for --display and never edits the JS binding.', 'NO_FLOW_INPUT_UPDATE');
414
+ }
415
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'update_flow_input', {
416
+ flowId,
417
+ flowInputId: opts.input,
418
+ ...(displayName ? { displayName } : {}),
419
+ ...(opts.type ? { dataType: opts.type } : {}),
420
+ ...(opts.description ? { description: opts.description } : {}),
421
+ }));
422
+ const flowState = await api.tool(workflowId, 'get_flow', { flowId });
423
+ const flowInput = (flowState?.flowInputs ?? []).find((item) => item.id === opts.input);
424
+ const result = {
425
+ ...data,
426
+ flowInputId: opts.input,
427
+ flowInput: flowInput ?? null,
428
+ jsBinding: flowInput?.jsBinding ?? flowInput?.name ?? null,
429
+ };
430
+ emit(result, () => printKeyValues([
431
+ ['updated', opts.input],
432
+ ['displayName', flowInput?.displayName ?? displayName ?? '-'],
433
+ ['jsBinding', result.jsBinding ?? '(read with expr context)'],
434
+ ]));
435
+ });
436
+ input
437
+ .command('delete')
438
+ .argument('<flowId>')
439
+ .requiredOption('--input <id>')
440
+ .description('Delete a flow input')
441
+ .action(async (flowId, opts, command) => {
442
+ const { api, workflowId } = requireContext(command);
443
+ const data = await api.mutate(workflowId, () => api.tool(workflowId, 'delete_flow_input', { flowId, flowInputId: opts.input }));
444
+ emit(data, () => printKeyValues([['deleted', opts.input]]));
445
+ });
446
+ };
447
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/commands/flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { buildClient } from '../context.js';
2
+ import { userError } from '../errors.js';
3
+ import { emit, printKeyValues, printTable, truncate } from '../output.js';
4
+ const parseLimit = (raw) => {
5
+ const limit = Number(raw);
6
+ if (!Number.isInteger(limit) || limit <= 0 || limit > 100) {
7
+ throw userError('--limit must be a positive integer no greater than 100.', 'BAD_LIMIT');
8
+ }
9
+ return limit;
10
+ };
11
+ const paginationRows = (pagination) => pagination?.nextCursor
12
+ ? [
13
+ ['more', 'yes'],
14
+ ['next cursor', pagination.nextCursor],
15
+ ]
16
+ : [['more', 'no']];
17
+ /**
18
+ * Discover ready actions without creating or selecting a workflow. The REST
19
+ * catalog is account-level; only the provider-backed integrations accepted by
20
+ * direct agent grants are offered here, while the public command vocabulary
21
+ * remains vendor-neutral.
22
+ */
23
+ export const registerIntegration = (program) => {
24
+ const integration = program
25
+ .command('integration')
26
+ .description('Discover ready integration actions that agents can use directly');
27
+ integration
28
+ .command('search')
29
+ .argument('<query>', 'integration or capability to find')
30
+ .option('--limit <n>', 'maximum catalog rows to inspect', '20')
31
+ .option('--after <cursor>', 'continue from a returned catalog cursor')
32
+ .description('Search integrations with ready actions; no workflow context is required')
33
+ .action(async (query, opts, command) => {
34
+ const { api } = buildClient(command);
35
+ const page = await api.rest('/nodes/list', {
36
+ method: 'POST',
37
+ body: {
38
+ query,
39
+ hasActions: true,
40
+ limit: parseLimit(opts.limit),
41
+ ...(opts.after ? { after: opts.after } : {}),
42
+ },
43
+ });
44
+ const rows = (page?.data ?? [])
45
+ .filter(row => row.source === 'pipedream')
46
+ .map(({ source: _source, ...row }) => row);
47
+ const payload = { integrations: rows, pagination: page?.pagination ?? null };
48
+ emit(payload, () => {
49
+ printTable(['slug', 'name', 'actions', 'auth', 'metered', 'description'], rows.map(row => [
50
+ row.slug,
51
+ row.name,
52
+ row.actionsCount ?? '-',
53
+ row.authRequired ? 'yes' : 'no',
54
+ row.usesMeteredUsage ? 'yes' : 'no',
55
+ truncate(row.description ?? '', 72),
56
+ ]));
57
+ if (!rows.length) {
58
+ process.stderr.write('\nNo ready integrations in this page. Refine the query or continue with --after ' +
59
+ 'when a next cursor is shown.\n');
60
+ }
61
+ process.stdout.write('\npagination\n');
62
+ printKeyValues(paginationRows(page?.pagination));
63
+ });
64
+ });
65
+ integration
66
+ .command('actions')
67
+ .argument('<integration>', 'exact integration slug returned by `cai integration search`')
68
+ .option('--search <query>', 'filter actions by capability or name')
69
+ .option('--limit <n>', 'maximum actions to return', '50')
70
+ .option('--after <cursor>', 'continue from a returned action cursor')
71
+ .description('List ready actions for one integration; no workflow context is required')
72
+ .action(async (nodeSlug, opts, command) => {
73
+ const { api } = buildClient(command);
74
+ const page = await api.rest('/nodes/components/list', {
75
+ method: 'POST',
76
+ body: {
77
+ nodeSlug,
78
+ type: 'action',
79
+ limit: parseLimit(opts.limit),
80
+ ...(opts.search ? { query: opts.search } : {}),
81
+ ...(opts.after ? { after: opts.after } : {}),
82
+ },
83
+ });
84
+ const rows = page?.data ?? [];
85
+ const payload = { integration: nodeSlug, actions: rows, pagination: page?.pagination ?? null };
86
+ emit(payload, () => {
87
+ printTable(['key', 'action', 'auth', 'metered', 'pricing', 'description'], rows.map(row => [
88
+ row.key,
89
+ row.name,
90
+ row.nodeAuthRequired ? 'yes' : 'no',
91
+ row.nodeUsesMeteredUsage ? 'yes' : 'no',
92
+ row.usagePricingDescription ?? '-',
93
+ truncate(row.description ?? '', 72),
94
+ ]));
95
+ if (!rows.length)
96
+ process.stderr.write('\nNo ready actions matched this integration.\n');
97
+ process.stdout.write('\npagination\n');
98
+ printKeyValues(paginationRows(page?.pagination));
99
+ });
100
+ });
101
+ };
102
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../../src/commands/integration.ts"],"names":[],"mappings":"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"}