@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,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":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE,CAC5C,KAAK;KACF,IAAI,EAAE;KACN,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;KACvB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;KAC7B,WAAW,EAAE;KACb,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;KACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;KACjB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAEtB,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CACxC,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AAEhE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,WAAoB,EAAE,UAAmB,EAAU,EAAE;IAC/F,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,CACb,0FAA0F;YACxF,4CAA4C,EAC9C,4BAA4B,CAC7B,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,iBAAyB,EAAE,SAAiB,EAAU,EAAE;IAChG,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACpE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,SAAS,CAAC,4DAA4D,EAAE,gBAAgB,CAAC,CAAA;IACjG,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ;SACpB,GAAG,CAAC,OAAO,CAAC,EAAE,CACb,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAC5F;SACA,IAAI,CAAC,EAAE,CAAC,CAAA;IACX,OAAO,UAAU,OAAO,QAAQ,MAAM,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAsB,EAAE;IACpE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;QAC5D,MAAM,SAAS,CAAC,sDAAsD,EAAE,eAAe,CAAC,CAAA;IAC1F,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,YAAoB,EACpB,MAA2B,EAC3B,cAAsB,EACD,EAAE;IACvB,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAA+B,CAAA;IAC9F,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,cAAc,CAAC,CAAA;IACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC,CAAA;QACH,MAAM,SAAS,CACb,oBAAoB,cAAc,iCAAiC,YAAY,IAAI;YACjF,sBAAsB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,uCAAuC;YACtF,uBAAuB,YAAY,iCAAiC,EACtE,uBAAuB,CACxB,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAA2B,EAC3B,MAA2B,EACP,EAAE;IACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAA;IACxF,4EAA4E;IAC5E,uEAAuE;IACvE,6EAA6E;IAC7E,iDAAiD;IACjD,MAAM,YAAY,GAChB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,QAAQ;QACrB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpE,OAAO,YAAY,IAAI,WAAW;QAChC,CAAC,CAAC,MAAM,CAAC,WAAW;QACpB,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,CAAA;AAC5E,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAA;IAExF,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAgB,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CACpD,UAAU,CACR,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAC1C,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CACnF,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,CAAC;SACpB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;QACxD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;YACd,cAAc,CAAC;gBACb,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,MAAM,MAAM,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;gBACrD,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;aACrC,CAAC,CAAA;YACF,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBACjC,UAAU,CACR,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,EAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;oBACzB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,WAAW;oBACpC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,EAAE,gBAAgB,IAAI,GAAG;iBACtD,CAAC,CACH,CAAA;YACH,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;gBAClC,UAAU,CACR,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,EACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC;oBAC9B,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI;oBACrB,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,QAAQ;iBACX,CAAC,CACH,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,cAAc,CAAC,eAAe,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CACzD,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CACd,cAAc,CAAC;YACb,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;YAClC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;SACpB,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,CAAC;SACpB,cAAc,CAAC,eAAe,CAAC;SAC/B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CACjE,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CACd,cAAc,CAAC;YACb,CAAC,QAAQ,EAAE,MAAM,CAAC;YAClB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;SACpB,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,CAAC;SACpB,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;QACxD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAChD,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,UAAU,CAAC;SACpB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;QACxD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACvE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CACd,UAAU,CACR,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,EACzC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAChF,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,WAAW,CAAC;SACpB,QAAQ,CAAC,UAAU,CAAC;SACpB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAAK,EAAE,OAAgB,EAAE,EAAE;QACxD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CACnD,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CACd,cAAc,CAAC;YACb,CAAC,QAAQ,EAAE,MAAM,CAAC;YAClB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC9E,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,cAAc,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SACvF,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC,CAAA;QAClB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAgB,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QACxE,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3D,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,SAAS,CACb,+CAA+C;gBAC7C,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACzE,WAAW,CACZ,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAC9D,CAAA;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7D,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAC9C,UAAU,CACR,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC3B,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CACvD,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM,MAAM,GAAG,IAAI;SAChB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mEAAmE,CAAC,CAAA;IAEnF,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,CAAC;SACpB,cAAc,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;SACjE,cAAc,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;SAChF,MAAM,CAAC,eAAe,EAAE,kEAAkE,CAAC;SAC3F,MAAM,CAAC,sBAAsB,CAAC;SAC9B,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE;YACtC,MAAM;YACN,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC,CACH,CAAA;QACD,IAAI,CACF,0FAA0F;YACxF,kFAAkF;YAClF,wBAAwB,CAC3B,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CACd,cAAc,CAAC;YACb,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,CAAC;YACvD,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC;YAC7B,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC;SACxB,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,CAAC;SACpB,cAAc,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACjD,MAAM,CAAC,eAAe,CAAC;SACvB,MAAM,CAAC,kBAAkB,CAAC;SAC1B,MAAM,CAAC,gBAAgB,CAAC;SACxB,MAAM,CAAC,sBAAsB,CAAC;SAC9B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAChF,MAAM,SAAS,CACb,gEAAgE,EAChE,eAAe,CAChB,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,EAAE;YACzC,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,MAAM;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC,CACH,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEJ,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,CAAC;SACpB,cAAc,CAAC,eAAe,CAAC;SAC/B,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAClF,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,UAAU,CAAC;SACnB,cAAc,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;SAChF,cAAc,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SACvE,cAAc,CACb,4BAA4B,EAC5B,8EAA8E,CAC/E;SACA,cAAc,CAAC,uBAAuB,EAAE,gCAAgC,CAAC;SACzE,cAAc,CACb,oBAAoB,EACpB,mFAAmF,CACpF;SACA,MAAM,CACL,kCAAkC,EAClC,oFAAoF,EACpF,CAAC,KAAa,EAAE,WAAqB,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CACjE;SACA,MAAM,CAAC,kBAAkB,EAAE,4CAA4C,CAAC;SACxE,MAAM,CAAC,oBAAoB,EAAE,uDAAuD,CAAC;SACrF,MAAM,CACL,qBAAqB,EACrB,wFAAwF,CACzF;SACA,MAAM,CAAC,iBAAiB,EAAE,wDAAwD,CAAC;SACnF,MAAM,CAAC,2BAA2B,EAAE,qCAAqC,CAAC;SAC1E,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,EAAE,KAAK,CAAC;SAC7E,WAAW,CACV,4FAA4F,CAC7F;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvC,IAAI,MAAM,GAAG,eAAe,CAC1B,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EACxC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,CAC7C,CAAA;QACD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACxD,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC1C,MAAM,SAAS,CACb,kDAAkD,IAAI,CAAC,QAAQ,oBAAoB;gBACjF,mDAAmD,EACrD,qBAAqB,CACtB,CAAA;QACH,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,SAAS,CACb,kEAAkE,EAClE,uBAAuB,CACxB,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAM,UAAU,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACjF,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;YAC7E,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;YACxE,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,SAAS,CACb,mBAAmB,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,IAAI,4BAA4B;oBACnF,kCAAkC;oBAClC,2DAA2D,EAC7D,yBAAyB,CAC1B,CAAA;YACH,CAAC;YACD,MAAM,GAAG,yBAAyB,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACvE,CAAC;QACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE;YACxC,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,cAAc,EAAE,IAAI,CAAC,YAAY;YACjC,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM;oBACxB,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,SAAqB,CAAC,EAAE;oBACzD,CAAC,CAAC,EAAE,CAAC;aACR;YACD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC,CACH,CAAA;QACD,IAAI,gBAAgB,GAAG,GAAG,CAAA;QAC1B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,uEAAuE;YACvE,mEAAmE;YACnE,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAChC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,EAAE;gBAC3C,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,QAAQ,EAAE,UAAU;aACrB,CAAC,CACH,CAAA;YACD,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAChC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE;gBACvC,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,QAAQ;aAChB,CAAC,CACH,CAAA;YACD,MAAM,QAAQ,GAAG,oBAAoB,CACnC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,CAAA;YACtD,gBAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC1C,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,SAAS,CACb,QAAQ,IAAI,CAAC,UAAU,mDAAmD,QAAQ,IAAI;oBACpF,sBAAsB,IAAI,CAAC,UAAU,4BAA4B,QAAQ,KAAK,EAChF,kCAAkC,CACnC,CAAA;YACH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE;YAAE,IAAI,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrF,uEAAuE;QACvE,2EAA2E;QAC3E,uDAAuD;QACvD,IAAI,CACF;YACE,GAAG,IAAI;YACP,QAAQ,EAAE,gBAAgB;YAC1B,kBAAkB,EAAE,QAAQ,KAAK,SAAS;SAC3C,EACD,GAAG,EAAE;YACH,cAAc,CAAC;gBACb,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG,CAAC;gBACvC,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,IAAI,GAAG,CAAC;gBAC3C,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG,CAAC;gBACvC,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC;gBACjD,CAAC,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,GAAG,CAAC;gBAC/C,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,IAAI,GAAG,CAAC;gBACpD,CAAC,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,IAAI,GAAG,CAAC;gBAC7D,CAAC,UAAU,EAAE,gBAAgB,CAAC;aAC/B,CAAC,CAAA;YACF,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAK,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAc,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;YACzF,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;IAE9D,KAAK;SACF,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,CAAC;SACpB,MAAM,CAAC,sBAAsB,EAAE,4DAA4D,CAAC;SAC5F,cAAc,CAAC,gBAAgB,EAAE,yCAAyC,CAAC;SAC3E,MAAM,CACL,kBAAkB,EAClB,+EAA+E,CAChF;SACA,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,YAAY,EAAE,mBAAmB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,sBAAsB,CAAC;SAC9B,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACxE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE;YACrC,MAAM;YACN,mEAAmE;YACnE,qEAAqE;YACrE,IAAI,EAAE,WAAW;YACjB,WAAW;YACX,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC,CACH,CAAA;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,EAAE,CAAA;QAC/C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAM,UAAU,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACzE,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,WAAW,CAAC,CAAA;QAC5F,MAAM,MAAM,GAAG;YACb,GAAG,IAAI;YACP,WAAW;YACX,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,WAAW;YAClD,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,IAAI,IAAI,IAAI;SAC7E,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CACF,oFAAoF;gBAClF,gEAAgE,CACnE,CAAA;QACH,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAChB,cAAc,CAAC;YACb,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;YAC1C,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC;YACnC,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,IAAI,0BAA0B,CAAC;SAC9D,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,CAAC;SACpB,cAAc,CAAC,cAAc,EAAE,eAAe,CAAC;SAC/C,MAAM,CAAC,sBAAsB,EAAE,4DAA4D,CAAC;SAC5F,MAAM,CAAC,kBAAkB,EAAE,8DAA8D,CAAC;SAC1F,MAAM,CAAC,gBAAgB,CAAC;SACxB,MAAM,CAAC,sBAAsB,CAAC;SAC9B,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAA;QAC7C,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,MAAM,SAAS,CACb,qFAAqF;gBACnF,+CAA+C,EACjD,sBAAsB,CACvB,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE;YACxC,MAAM;YACN,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC,CACH,CAAA;QACD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAM,UAAU,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACzE,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3F,MAAM,MAAM,GAAG;YACb,GAAG,IAAI;YACP,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,SAAS,EAAE,SAAS,IAAI,IAAI;YAC5B,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,IAAI,IAAI,IAAI;SAC3D,CAAA;QACD,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAChB,cAAc,CAAC;YACb,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;YACvB,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,IAAI,WAAW,IAAI,GAAG,CAAC;YAC7D,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,IAAI,0BAA0B,CAAC;SAC9D,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,CAAC;SACpB,cAAc,CAAC,cAAc,CAAC;SAC9B,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAC/E,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
|
|
@@ -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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"}
|