@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,148 @@
1
+ import { connectionsUrl } from '../appLinks.js';
2
+ import { buildClient } from '../context.js';
3
+ import { CaiError, userError } from '../errors.js';
4
+ import { emit, printKeyValues, printTable } from '../output.js';
5
+ import { openBrowser } from './auth.js';
6
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
7
+ export const parseConnectionWaitTimeout = (value) => {
8
+ const timeout = Number(value);
9
+ if (!Number.isFinite(timeout) || timeout <= 0) {
10
+ throw userError('--timeout must be a positive number of seconds.', 'BAD_CONNECTION_TIMEOUT');
11
+ }
12
+ return timeout;
13
+ };
14
+ export const listConnections = async (api) => {
15
+ const data = await api.rest('/connection/list', {
16
+ method: 'POST',
17
+ body: { includeSystemConnections: false },
18
+ });
19
+ return Array.isArray(data) ? data : [];
20
+ };
21
+ const rowId = (row) => row.connectionId ?? row.id;
22
+ const rowName = (row) => row.displayName ?? row.name;
23
+ export const findNewConnection = (before, current, nodeSlug) => {
24
+ const previousIds = new Set(before
25
+ .filter(row => row.nodeSlug === nodeSlug)
26
+ .map(rowId)
27
+ .filter((id) => id !== undefined)
28
+ .map(String));
29
+ return (current.find(row => {
30
+ const id = rowId(row);
31
+ return row.nodeSlug === nodeSlug && id !== undefined && !previousIds.has(String(id));
32
+ }) ?? null);
33
+ };
34
+ export const waitForNewConnection = async (api, nodeSlug, before, timeoutMs, intervalMs = 3_000, wait = sleep) => {
35
+ const deadline = Date.now() + timeoutMs;
36
+ let polling = true;
37
+ while (polling) {
38
+ const match = findNewConnection(before, await listConnections(api), nodeSlug);
39
+ if (match)
40
+ return match;
41
+ const remainingMs = deadline - Date.now();
42
+ if (remainingMs <= 0)
43
+ polling = false;
44
+ else
45
+ await wait(Math.min(intervalMs, remainingMs));
46
+ }
47
+ return null;
48
+ };
49
+ export const registerConnection = (program) => {
50
+ const connection = program.command('connection').description('Existing user connections');
51
+ connection
52
+ .command('list')
53
+ .option('--integration <slug>', 'only connections for this integration')
54
+ .option('--node <slug>', 'legacy alias for --integration')
55
+ .description('List account connections without requiring workflow context')
56
+ .action(async (opts, command) => {
57
+ if (opts.integration && opts.node && opts.integration !== opts.node) {
58
+ throw userError('--integration and --node must name the same slug when both are used.', 'CONFLICTING_INPUT');
59
+ }
60
+ const { api } = buildClient(command);
61
+ const selected = opts.integration ?? opts.node;
62
+ const rows = (await listConnections(api)).filter(row => !selected || row.nodeSlug === selected);
63
+ emit({ items: rows }, () => {
64
+ printTable(['id', 'name', 'nodeSlug', 'status', 'default'], rows.map(c => [
65
+ c.connectionId ?? c.id,
66
+ c.displayName ?? c.name,
67
+ c.nodeSlug,
68
+ c.status,
69
+ c.isDefault ? 'yes' : '',
70
+ ]));
71
+ if (!rows.length) {
72
+ process.stderr.write('\nNo connections. Run `cai connection connect <integrationSlug>` to open the secure ' +
73
+ 'browser connection flow.\n');
74
+ }
75
+ });
76
+ });
77
+ connection
78
+ .command('connect')
79
+ .argument('<nodeSlug>', 'integration slug reported by `cai integration search`')
80
+ .option('--no-open', 'headless/remote mode: print the URL without opening a browser')
81
+ .option('--wait', 'wait for a newly created connection for this integration', false)
82
+ .option('--timeout <seconds>', 'maximum time to wait for the new connection', '300')
83
+ .description('Open the Controller AI browser flow for a missing integration, optionally waiting for completion')
84
+ .action(async (nodeSlug, opts, command) => {
85
+ // Validate before buildClient and, critically, before the pre-command
86
+ // connection snapshot can make a network request.
87
+ const timeoutSeconds = parseConnectionWaitTimeout(opts.timeout);
88
+ const { config, api } = buildClient(command);
89
+ const before = opts.wait ? await listConnections(api) : [];
90
+ const result = await api.rest(`/cli-auth/integrations/${encodeURIComponent(nodeSlug)}/connect-url`);
91
+ const url = result.connectUrl ?? result.url;
92
+ if (!url) {
93
+ throw userError('Connection URL response did not include a URL.', 'NO_CONNECTION_URL');
94
+ }
95
+ const manageUrl = connectionsUrl(config);
96
+ if (opts.wait) {
97
+ process.stderr.write(`\nConnect ${nodeSlug} in your browser:\n ${url}\n`);
98
+ }
99
+ const openRequested = opts.open !== false && openBrowser(url);
100
+ let newConnection = null;
101
+ if (opts.wait) {
102
+ process.stderr.write(`${openRequested ? 'A browser open was requested.' : 'Open the link above in any browser.'}\n` +
103
+ `Waiting up to ${timeoutSeconds}s for the new connection...\n\n`);
104
+ newConnection = await waitForNewConnection(api, nodeSlug, before, timeoutSeconds * 1_000);
105
+ if (!newConnection) {
106
+ throw new CaiError(`Timed out after ${timeoutSeconds}s waiting for a new ${nodeSlug} connection. ` +
107
+ `The connection link is still valid: ${url}. Complete it, then re-run ` +
108
+ `\`cai connection connect ${nodeSlug} --wait\` or check ` +
109
+ `\`cai connection list --integration ${nodeSlug}\`.`, {
110
+ code: 'CONNECTION_WAIT_TIMEOUT',
111
+ detail: {
112
+ nodeSlug,
113
+ url,
114
+ ...(manageUrl ? { manageUrl } : {}),
115
+ timeoutSeconds,
116
+ },
117
+ });
118
+ }
119
+ }
120
+ const payload = {
121
+ nodeSlug,
122
+ url,
123
+ ...(manageUrl ? { manageUrl } : {}),
124
+ openRequested,
125
+ ...(newConnection
126
+ ? {
127
+ connectionId: rowId(newConnection),
128
+ connectionName: rowName(newConnection),
129
+ }
130
+ : {}),
131
+ };
132
+ emit(payload, () => {
133
+ const pairs = [
134
+ ['integration', nodeSlug],
135
+ ['url', url],
136
+ ];
137
+ if (manageUrl)
138
+ pairs.push(['open in app', manageUrl]);
139
+ pairs.push(['browser open requested', openRequested ? 'yes' : 'no']);
140
+ if (newConnection) {
141
+ pairs.push(['connection id', rowId(newConnection)]);
142
+ pairs.push(['connection name', rowName(newConnection)]);
143
+ }
144
+ printKeyValues(pairs);
145
+ });
146
+ });
147
+ };
148
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/commands/connection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAcvC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAE5F,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAc,EAAU,EAAE;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,SAAS,CAAC,iDAAiD,EAAE,wBAAwB,CAAC,CAAA;IAC9F,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,GAAkB,EAA4B,EAAE;IACpF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAkB,kBAAkB,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE;KAC1C,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,GAAkB,EAA+B,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,EAAE,CAAA;AAE7F,MAAM,OAAO,GAAG,CAAC,GAAkB,EAAsB,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAA;AAEvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAuB,EACvB,OAAwB,EACxB,QAAgB,EACM,EAAE;IACxB,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,MAAM;SACH,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;SACxC,GAAG,CAAC,KAAK,CAAC;SACV,MAAM,CAAC,CAAC,EAAE,EAAyB,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC;SACvD,GAAG,CAAC,MAAM,CAAC,CACf,CAAA;IACD,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACjB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IACtF,CAAC,CAAC,IAAI,IAAI,CACX,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,GAAkB,EAClB,QAAgB,EAChB,MAAuB,EACvB,SAAiB,EACjB,UAAU,GAAG,KAAK,EAClB,OAAsC,KAAK,EACZ,EAAE;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACvC,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;QAC7E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;QAEvB,MAAM,WAAW,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACzC,IAAI,WAAW,IAAI,CAAC;YAAE,OAAO,GAAG,KAAK,CAAA;;YAChC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAA;IAEzF,UAAU;SACP,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,sBAAsB,EAAE,uCAAuC,CAAC;SACvE,MAAM,CAAC,eAAe,EAAE,gCAAgC,CAAC;SACzD,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACvC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpE,MAAM,SAAS,CACb,sEAAsE,EACtE,mBAAmB,CACpB,CAAA;QACH,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAA;QAC9C,MAAM,IAAI,GAAG,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAC9C,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAC9C,CAAA;QACD,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;YACzB,UAAU,CACR,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,EAC/C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACZ,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE;gBACtB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI;gBACvB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;aACzB,CAAC,CACH,CAAA;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sFAAsF;oBACpF,4BAA4B,CAC/B,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,UAAU;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,YAAY,EAAE,uDAAuD,CAAC;SAC/E,MAAM,CAAC,WAAW,EAAE,+DAA+D,CAAC;SACpF,MAAM,CAAC,QAAQ,EAAE,0DAA0D,EAAE,KAAK,CAAC;SACnF,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACnF,WAAW,CACV,kGAAkG,CACnG;SACA,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;QACzD,sEAAsE;QACtE,kDAAkD;QAClD,MAAM,cAAc,GAAG,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC3B,0BAA0B,kBAAkB,CAAC,QAAQ,CAAC,cAAc,CACrE,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,GAAG,CAAA;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,SAAS,CAAC,gDAAgD,EAAE,mBAAmB,CAAC,CAAA;QACxF,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,wBAAwB,GAAG,IAAI,CAAC,CAAA;QAC5E,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,CAAA;QAC7D,IAAI,aAAa,GAAyB,IAAI,CAAA;QAC9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,aAAa,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,qCAAqC,IAAI;gBAC5F,iBAAiB,cAAc,iCAAiC,CACnE,CAAA;YACD,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,KAAK,CAAC,CAAA;YACzF,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,cAAc,uBAAuB,QAAQ,eAAe;oBAC7E,uCAAuC,GAAG,6BAA6B;oBACvE,4BAA4B,QAAQ,qBAAqB;oBACzD,uCAAuC,QAAQ,KAAK,EACtD;oBACE,IAAI,EAAE,yBAAyB;oBAC/B,MAAM,EAAE;wBACN,QAAQ;wBACR,GAAG;wBACH,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnC,cAAc;qBACf;iBACF,CACF,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,GAAG;YACH,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,aAAa;YACb,GAAG,CAAC,aAAa;gBACf,CAAC,CAAC;oBACE,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC;oBAClC,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC;iBACvC;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAA;QACD,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACjB,MAAM,KAAK,GAA6B;gBACtC,CAAC,aAAa,EAAE,QAAQ,CAAC;gBACzB,CAAC,KAAK,EAAE,GAAG,CAAC;aACb,CAAA;YACD,IAAI,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAA;YACrD,KAAK,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;YACpE,IAAI,aAAa,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;gBACnD,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;YACzD,CAAC;YACD,cAAc,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
@@ -0,0 +1,441 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { basename } from 'node:path';
3
+ import { requireContext } from '../context.js';
4
+ import { userError } from '../errors.js';
5
+ import { emit, printKeyValues, printTable, truncate, warn } from '../output.js';
6
+ import { isSystemSchema, runSchemaCreate } from './schema.js';
7
+ /**
8
+ * The workflow data store. Two record stores exist per workflow and they never
9
+ * share rows: `dev` (what manual tests read and write) and `live` (what
10
+ * published, triggered runs read and write). Publishing does NOT copy records —
11
+ * `cai data copy-to-live` is the only path between them.
12
+ */
13
+ const ENVIRONMENTS = ['dev', 'live'];
14
+ export const parseEnvironment = (value) => {
15
+ if (!ENVIRONMENTS.includes(value)) {
16
+ throw userError(`--env must be "dev" or "live", got "${value}".`, 'BAD_ENVIRONMENT');
17
+ }
18
+ return value;
19
+ };
20
+ export const readFieldsJson = (source) => {
21
+ let raw;
22
+ try {
23
+ raw =
24
+ source === '-'
25
+ ? readFileSync(0, 'utf8')
26
+ : /^[{[]/.test(source.trimStart())
27
+ ? source
28
+ : readFileSync(source, 'utf8');
29
+ }
30
+ catch (error) {
31
+ throw userError(`--fields "${source}" is not a readable file and does not look like inline JSON ` +
32
+ `(inline JSON must start with "{" or "["): ${error instanceof Error ? error.message : error}`, 'UNREADABLE_FIELDS');
33
+ }
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(raw);
37
+ }
38
+ catch (error) {
39
+ throw userError(`--fields is neither valid JSON nor a readable file: ${error instanceof Error ? error.message : error}`, 'BAD_FIELDS_JSON');
40
+ }
41
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
42
+ throw userError('--fields must be a JSON object keyed by field id.', 'BAD_FIELDS_SHAPE');
43
+ }
44
+ return parsed;
45
+ };
46
+ const RESERVED = ['id', 'createdAt', 'updatedAt'];
47
+ /**
48
+ * THE ASYMMETRY THAT BITES: records are **written** keyed by field `id` and
49
+ * **read back** keyed by field `display`. Feeding a queried record straight back
50
+ * into `create` fails with `Unknown workflow data field id "Email"`. Rather than
51
+ * silently remapping (which would hide a real schema mismatch), every offending
52
+ * key is named with the id it should have been.
53
+ */
54
+ export const checkFieldKeys = (fields, schema) => {
55
+ const reserved = Object.keys(fields).filter(k => RESERVED.includes(k));
56
+ if (reserved.length) {
57
+ throw userError(`fields cannot include the reserved keys ${reserved.join(', ')} — the store owns them.`, 'RESERVED_FIELD_KEY');
58
+ }
59
+ if (!schema?.fields?.length)
60
+ return;
61
+ const byId = new Set(schema.fields.map(f => f.id));
62
+ const displayToId = new Map(schema.fields.map(f => [f.display, f.id]));
63
+ const bad = [];
64
+ for (const key of Object.keys(fields)) {
65
+ if (byId.has(key))
66
+ continue;
67
+ const viaDisplay = displayToId.get(key);
68
+ bad.push(viaDisplay
69
+ ? `"${key}" is a field DISPLAY name — writes are keyed by field id, use "${viaDisplay}"`
70
+ : `"${key}" is not a field of this type (ids: ${[...byId].join(', ')})`);
71
+ }
72
+ if (bad.length) {
73
+ throw userError(`--fields keys are wrong — nothing was written:\n ${bad.join('\n ')}\n` +
74
+ 'Reads come back keyed by display name and writes go by id; `cai data fields --type <t>` ' +
75
+ 'prints the mapping.', 'BAD_FIELD_KEYS');
76
+ }
77
+ };
78
+ const loadSchema = async (api, workflowId, dataType) => {
79
+ const schemas = await api
80
+ .tool(workflowId, 'get_schemas', {})
81
+ .catch(() => undefined);
82
+ return schemas?.[dataType];
83
+ };
84
+ const assertStoreEligible = (dataType) => {
85
+ if (isSystemSchema(dataType)) {
86
+ throw userError(`"${dataType}" is an engine-derived integration type (custom.__*) and is not ` +
87
+ 'store-eligible — the data store rejects it. Only workflow-defined `custom.*` types ' +
88
+ 'have collections; list them with `cai data collections`.', 'NOT_STORE_ELIGIBLE');
89
+ }
90
+ };
91
+ const recordRows = (records) => {
92
+ const columns = ['id'];
93
+ for (const record of records) {
94
+ for (const key of Object.keys(record))
95
+ if (!columns.includes(key))
96
+ columns.push(key);
97
+ }
98
+ return {
99
+ columns,
100
+ rows: records.map(record => columns.map(c => truncate(record[c], 30))),
101
+ };
102
+ };
103
+ /**
104
+ * Every REST data route is keyed by the NUMERIC collection id plus the
105
+ * workflowVersionId — neither of which `list_data_collections` returns. Resolve
106
+ * both from the rail the caller asked for.
107
+ */
108
+ const resolveCollection = async (api, workflowId, environment, dataType) => {
109
+ if (environment === 'live') {
110
+ throw userError('The REST data routes address the DEVELOPMENT collection only; there is no live-store ' +
111
+ 'equivalent for bulk delete or CSV import. Work on dev and promote with ' +
112
+ '`cai data copy-to-live`.', 'DEV_ONLY_ROUTE');
113
+ }
114
+ const state = await api.rest(`/workflow-agent/development-version-state/${workflowId}`);
115
+ const workflowVersionId = state?.workflowVersionId;
116
+ if (!workflowVersionId) {
117
+ throw userError('Cannot read the development workflow version id, which every REST data route needs.', 'NO_DEV_VERSION');
118
+ }
119
+ const collection = await findCollection(api, workflowId, workflowVersionId, dataType);
120
+ return { workflowVersionId, collectionId: collection.id };
121
+ };
122
+ /** Locate the numeric collection id, which only the REST surface exposes. */
123
+ const findCollection = async (api, workflowId, workflowVersionId, dataType) => {
124
+ const collections = await api.rest(`/workflow-data/${workflowId}/collections?workflowVersionId=${workflowVersionId}`);
125
+ const found = (collections ?? []).find(c => c.schemaKey === dataType);
126
+ if (!found) {
127
+ throw userError(`No "${dataType}" collection on workflow version ${workflowVersionId}. Known: ` +
128
+ `${(collections ?? []).map(c => c.schemaKey).join(', ') || '(none)'}.`, 'UNKNOWN_COLLECTION');
129
+ }
130
+ return found;
131
+ };
132
+ export const registerData = (program) => {
133
+ const data = program
134
+ .command('data')
135
+ .description('Workflow data store — collections and records (dev and live stores are separate)');
136
+ data
137
+ .command('collections')
138
+ .option('--env <dev|live>', 'record store to read', 'dev')
139
+ .description('Collections in one record store, with row counts')
140
+ .action(async (opts, command) => {
141
+ const { api, workflowId } = requireContext(command);
142
+ const environment = parseEnvironment(opts.env);
143
+ const rows = await api.tool(workflowId, 'list_data_collections', { environment });
144
+ if (environment === 'live' && (rows ?? []).length === 0) {
145
+ warn('The live store has no collections. Collections only exist on a published version — ' +
146
+ 'if this workflow has never been published, `cai workflow publish` first. Publishing ' +
147
+ 'creates the collections but never copies records.');
148
+ }
149
+ emit({ environment, items: rows ?? [], collections: rows ?? [] }, () => printTable(['schemaKey', 'display', 'records', 'active'], (rows ?? []).map(r => [r.schemaKey, r.display, r.recordCount, r.active ? 'yes' : 'no'])));
150
+ });
151
+ data
152
+ .command('fields')
153
+ .requiredOption('--type <dataType>', 'collection data type, e.g. custom.customer')
154
+ .description('Field id ⇄ display mapping — writes go by id, reads come back by display')
155
+ .action(async (opts, command) => {
156
+ const { api, workflowId } = requireContext(command);
157
+ assertStoreEligible(opts.type);
158
+ const schema = await loadSchema(api, workflowId, opts.type);
159
+ if (!schema) {
160
+ throw userError(`No schema "${opts.type}" in this workflow — see \`cai schema list\`.`, 'UNKNOWN_SCHEMA');
161
+ }
162
+ emit({ dataType: opts.type, display: schema.display, fields: schema.fields }, () => {
163
+ printTable(['writeKey (id)', 'readKey (display)', 'type'], (schema.fields ?? []).map(f => [f.id, f.display, f.type]));
164
+ process.stdout.write('\n`--fields` on create/update is keyed by the LEFT column; query/get results come ' +
165
+ 'back keyed by the RIGHT column plus id / created time / updated time.\n');
166
+ });
167
+ });
168
+ data
169
+ .command('query')
170
+ .requiredOption('--type <dataType>', 'collection data type, e.g. custom.customer')
171
+ .option('--env <dev|live>', 'record store to read', 'dev')
172
+ .option('--query <text>', 'plain-text search — NOT field-aware filtering')
173
+ .option('--limit <n>', 'page size (backend caps at 100)')
174
+ .option('--offset <n>', 'pagination offset')
175
+ .description('Records in one collection')
176
+ .action(async (opts, command) => {
177
+ const { api, workflowId } = requireContext(command);
178
+ const environment = parseEnvironment(opts.env);
179
+ assertStoreEligible(opts.type);
180
+ if (opts.query) {
181
+ warn('`--query` is a plain-text search over the record id, its timestamps and the ' +
182
+ 'serialized JSON blob — it is not a field filter. A match can come from any field, ' +
183
+ 'and a value nested in another field will still match.');
184
+ }
185
+ const result = await api.tool(workflowId, 'query_data_records', {
186
+ environment,
187
+ dataType: opts.type,
188
+ ...(opts.query ? { query: opts.query } : {}),
189
+ ...(opts.limit ? { limit: Number(opts.limit) } : {}),
190
+ ...(opts.offset ? { offset: Number(opts.offset) } : {}),
191
+ });
192
+ const records = result?.records ?? [];
193
+ emit({
194
+ environment,
195
+ dataType: opts.type,
196
+ totalCount: result?.totalCount ?? 0,
197
+ items: records,
198
+ records,
199
+ }, () => {
200
+ const { columns, rows } = recordRows(records);
201
+ printTable(columns, rows);
202
+ process.stdout.write(`\n${records.length} of ${result?.totalCount ?? 0} record(s) [${environment}]\n`);
203
+ });
204
+ });
205
+ data
206
+ .command('get')
207
+ .argument('<recordId>', 'record id, e.g. rec_…')
208
+ .requiredOption('--type <dataType>')
209
+ .option('--env <dev|live>', 'record store to read', 'dev')
210
+ .description('One record by id')
211
+ .action(async (recordId, opts, command) => {
212
+ const { api, workflowId } = requireContext(command);
213
+ const environment = parseEnvironment(opts.env);
214
+ assertStoreEligible(opts.type);
215
+ const record = await api.tool(workflowId, 'get_data_record', {
216
+ environment,
217
+ dataType: opts.type,
218
+ recordId,
219
+ });
220
+ if (record === null) {
221
+ warn(`get_data_record returned null: no record "${recordId}" in "${opts.type}" in the ` +
222
+ `${environment} store. The tool answers null rather than erroring, so this is a ` +
223
+ 'miss, not a failure — the dev and live stores hold different rows.');
224
+ }
225
+ emit({ environment, dataType: opts.type, recordId, record }, () => record
226
+ ? printKeyValues(Object.entries(record))
227
+ : process.stdout.write('(no such record)\n'));
228
+ });
229
+ data
230
+ .command('create')
231
+ .requiredOption('--type <dataType>')
232
+ .requiredOption('--fields <json|file|->', 'field values keyed by field id')
233
+ .option('--env <dev|live>', 'record store to write', 'dev')
234
+ .description('Create a record (validated against the collection schema)')
235
+ .action(async (opts, command) => {
236
+ const { api, workflowId } = requireContext(command);
237
+ const environment = parseEnvironment(opts.env);
238
+ assertStoreEligible(opts.type);
239
+ const fields = readFieldsJson(opts.fields);
240
+ checkFieldKeys(fields, await loadSchema(api, workflowId, opts.type));
241
+ if (environment === 'live') {
242
+ warn('Writing to the LIVE record store — this is the data published, triggered runs read.');
243
+ }
244
+ const record = await api.tool(workflowId, 'create_data_record', {
245
+ environment,
246
+ dataType: opts.type,
247
+ fields,
248
+ });
249
+ emit({ environment, dataType: opts.type, record }, () => printKeyValues(Object.entries(record ?? {})));
250
+ });
251
+ data
252
+ .command('update')
253
+ .argument('<recordId>')
254
+ .requiredOption('--type <dataType>')
255
+ .requiredOption('--fields <json|file|->', 'fields to patch, keyed by field id')
256
+ .option('--env <dev|live>', 'record store to write', 'dev')
257
+ .description('Patch a record — omitted fields are left alone')
258
+ .action(async (recordId, opts, command) => {
259
+ const { api, workflowId } = requireContext(command);
260
+ const environment = parseEnvironment(opts.env);
261
+ assertStoreEligible(opts.type);
262
+ const fields = readFieldsJson(opts.fields);
263
+ checkFieldKeys(fields, await loadSchema(api, workflowId, opts.type));
264
+ if (environment === 'live') {
265
+ warn('Writing to the LIVE record store — this is the data published, triggered runs read.');
266
+ }
267
+ const record = await api.tool(workflowId, 'update_data_record', {
268
+ environment,
269
+ dataType: opts.type,
270
+ recordId,
271
+ fields,
272
+ });
273
+ emit({ environment, dataType: opts.type, recordId, record }, () => printKeyValues(Object.entries(record ?? {})));
274
+ });
275
+ data
276
+ .command('delete')
277
+ .argument('<recordId>')
278
+ .requiredOption('--type <dataType>')
279
+ .option('--env <dev|live>', 'record store to write', 'dev')
280
+ .description('Soft-delete a record')
281
+ .action(async (recordId, opts, command) => {
282
+ const { api, workflowId } = requireContext(command);
283
+ const environment = parseEnvironment(opts.env);
284
+ assertStoreEligible(opts.type);
285
+ const result = await api.tool(workflowId, 'delete_data_record', { environment, dataType: opts.type, recordId });
286
+ emit({ environment, dataType: opts.type, ...result }, () => printKeyValues([
287
+ ['deleted', result?.id ?? recordId],
288
+ ['store', environment],
289
+ ['mode', 'soft delete (row retained, excluded from queries)'],
290
+ ]));
291
+ });
292
+ data
293
+ .command('delete-many')
294
+ .requiredOption('--type <dataType>')
295
+ .option('--records <id,id,…>', 'record ids to delete')
296
+ .option('--all', 'delete every record in the collection', false)
297
+ .option('--yes', 'confirm deleting every record when used with --all', false)
298
+ .option('--env <dev|live>', 'record store to write', 'dev')
299
+ .description('Bulk-delete records (REST-only — no MCP tool does bulk)')
300
+ .action(async (opts, command) => {
301
+ if (opts.all && !opts.yes) {
302
+ throw userError('Deleting every record requires both --all and --yes.', 'ALL_DELETE_CONFIRMATION_REQUIRED');
303
+ }
304
+ const { api, workflowId } = requireContext(command);
305
+ const environment = parseEnvironment(opts.env);
306
+ assertStoreEligible(opts.type);
307
+ const recordKeys = opts.records
308
+ ? String(opts.records)
309
+ .split(',')
310
+ .map((s) => s.trim())
311
+ .filter(Boolean)
312
+ : [];
313
+ if (!opts.all && recordKeys.length === 0) {
314
+ throw userError('Pass --records <id,id,…> or --all.', 'NOTHING_TO_DELETE');
315
+ }
316
+ if (opts.all && recordKeys.length) {
317
+ throw userError('--all and --records are mutually exclusive.', 'CONFLICTING_DELETE');
318
+ }
319
+ const { workflowVersionId, collectionId } = await resolveCollection(api, workflowId, environment, opts.type);
320
+ if (opts.all) {
321
+ warn(`Deleting EVERY record in "${opts.type}" from the ${environment} store.`);
322
+ }
323
+ const result = await api.rest(`/workflow-data/${workflowId}/collections/${collectionId}/records/bulk-delete?workflowVersionId=${workflowVersionId}`, { method: 'POST', body: opts.all ? { all: true } : { recordKeys } });
324
+ emit({
325
+ environment,
326
+ dataType: opts.type,
327
+ collectionId,
328
+ all: Boolean(opts.all),
329
+ recordKeys,
330
+ result,
331
+ }, () => printKeyValues([
332
+ ['dataType', opts.type],
333
+ ['store', environment],
334
+ ['deleted', opts.all ? 'all records' : recordKeys.join(', ')],
335
+ ['result', JSON.stringify(result)],
336
+ ]));
337
+ });
338
+ data
339
+ .command('import')
340
+ .requiredOption('--type <dataType>')
341
+ .requiredOption('--file <path>', 'CSV file to import')
342
+ .option('--env <dev|live>', 'record store to write', 'dev')
343
+ .option('--mode <dryRun|commit>', 'validate only, or actually write', 'dryRun')
344
+ .description('Import records from a CSV (multipart REST — no MCP tool)')
345
+ .action(async (opts, command) => {
346
+ const { api, workflowId } = requireContext(command);
347
+ const environment = parseEnvironment(opts.env);
348
+ assertStoreEligible(opts.type);
349
+ // The route's modes are dryRun / commit — a validation pass and a real
350
+ // write, NOT append/replace. `dryRun` is the default here so an import
351
+ // cannot write on a first, exploratory invocation.
352
+ if (!['dryRun', 'commit'].includes(opts.mode)) {
353
+ throw userError('--mode must be "dryRun" (validate only) or "commit" (write). There is no ' +
354
+ 'append/replace choice: a commit always appends.', 'BAD_IMPORT_MODE');
355
+ }
356
+ let csv;
357
+ try {
358
+ csv = readFileSync(opts.file);
359
+ }
360
+ catch (error) {
361
+ throw userError(`Cannot read --file ${opts.file}: ${error instanceof Error ? error.message : error}`, 'UNREADABLE_CSV');
362
+ }
363
+ const { workflowVersionId, collectionId } = await resolveCollection(api, workflowId, environment, opts.type);
364
+ if (opts.mode === 'dryRun') {
365
+ warn('Running in dryRun mode: the CSV is validated and NOTHING is written. Re-run with ' +
366
+ '`--mode commit` to actually import.');
367
+ }
368
+ const form = new FormData();
369
+ form.append('mode', opts.mode);
370
+ form.append('file', new Blob([csv], { type: 'text/csv' }), basename(opts.file));
371
+ const result = await api.upload(`/workflow-data/${workflowId}/collections/${collectionId}/records/import?workflowVersionId=${workflowVersionId}`, form);
372
+ warn('CSV columns are matched against field DISPLAY names, not field ids — the opposite of ' +
373
+ '`cai data create`. Check the result counts before trusting a silent-looking import.');
374
+ emit({ environment, dataType: opts.type, collectionId, mode: opts.mode, result }, () => printKeyValues([
375
+ ['dataType', opts.type],
376
+ ['store', environment],
377
+ ['mode', opts.mode],
378
+ ['result', JSON.stringify(result)],
379
+ ]));
380
+ });
381
+ data
382
+ .command('copy-to-live')
383
+ .requiredOption('--type <dataType>', 'collection to copy from dev to live')
384
+ .description('Copy every dev record of one collection into the live store')
385
+ .action(async (opts, command) => {
386
+ const { api, workflowId } = requireContext(command);
387
+ assertStoreEligible(opts.type);
388
+ // No MCP tool exists for this; it is REST-only, and the route needs the
389
+ // NUMERIC collection id, which `list_data_collections` never returns —
390
+ // hence the REST collections read to resolve it.
391
+ const state = await api.rest(`/workflow-agent/development-version-state/${workflowId}`);
392
+ const workflowVersionId = state?.workflowVersionId;
393
+ if (!workflowVersionId) {
394
+ throw userError('Cannot read the development workflow version id — copy-to-live needs it to locate ' +
395
+ 'the source collection.', 'NO_DEV_VERSION');
396
+ }
397
+ const collection = await findCollection(api, workflowId, workflowVersionId, opts.type);
398
+ // The route answers "This workflow has not been published yet" for BOTH a
399
+ // never-published workflow and a published one whose live rail simply has
400
+ // no collection for this type yet (schema added after the last publish).
401
+ // The second case is by far the more common and the message points the
402
+ // wrong way, so it is disambiguated here before the call.
403
+ const live = await api
404
+ .tool(workflowId, 'list_data_collections', {
405
+ environment: 'live',
406
+ })
407
+ .catch(() => []);
408
+ if (!(live ?? []).some(c => c.schemaKey === opts.type)) {
409
+ throw userError(`The live store has no "${opts.type}" collection, so there is nothing to copy into. ` +
410
+ 'Collections reach the live rail only through a publish: run `cai workflow publish` ' +
411
+ 'so the current schemas sync to live, then retry.\n' +
412
+ 'Note: the backend answers this case with "This workflow has not been published yet", ' +
413
+ 'which is misleading when the workflow IS published and only the schema is newer.', 'NO_LIVE_COLLECTION');
414
+ }
415
+ const result = await api.rest(`/workflow-data/${workflowId}/collections/${collection.id}/records/copy-to-live?workflowVersionId=${workflowVersionId}`, { method: 'POST' });
416
+ emit({ dataType: opts.type, collectionId: collection.id, workflowVersionId, result }, () => printKeyValues([
417
+ ['dataType', opts.type],
418
+ ['collectionId', collection.id],
419
+ ['fromVersion', workflowVersionId],
420
+ ['result', JSON.stringify(result)],
421
+ ]));
422
+ });
423
+ const collection = data
424
+ .command('collection')
425
+ .description('Collection lifecycle (collections are synced from `custom.*` schemas)');
426
+ collection
427
+ .command('create')
428
+ .argument('<dataType>', 'collection data type — must start with "custom."')
429
+ .option('--display <label>')
430
+ .option('--field <id:type[:display]>', 'field spec; repeatable', (value, previous = []) => [...previous, value])
431
+ .option('--from-json <file|->', 'full {display, fields} definition')
432
+ .description('Sugar over `cai schema create` — there is NO create-collection backend route')
433
+ .action(async (dataType, opts, command) => {
434
+ warn('There is no create-collection route on the backend. Collections are synced from the ' +
435
+ "workflow's custom.* schemas, so this creates the " +
436
+ `"${dataType}" data type and the collection appears as a consequence. ` +
437
+ '`cai schema create` is the very same call.');
438
+ await runSchemaCreate(command, dataType, opts);
439
+ });
440
+ };
441
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"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"}