@cargo-ai/cli 1.0.72 → 1.0.74
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 +21 -0
- package/build/commands/ai/agent.js +2 -2
- package/build/commands/ai/chat.js +1 -1
- package/build/commands/ai/document.js +1 -1
- package/build/commands/ai/memory.js +3 -3
- package/build/commands/ai/message.js +2 -2
- package/build/commands/ai/release.d.ts.map +1 -1
- package/build/commands/ai/release.js +3 -3
- package/build/commands/ai/vote.d.ts.map +1 -1
- package/build/commands/ai/vote.js +1 -1
- package/build/commands/auth/email.d.ts +24 -0
- package/build/commands/auth/email.d.ts.map +1 -1
- package/build/commands/auth/email.js +27 -14
- package/build/commands/auth/index.d.ts.map +1 -1
- package/build/commands/auth/index.js +9 -3
- package/build/commands/auth/workspace.d.ts.map +1 -1
- package/build/commands/auth/workspace.js +99 -26
- package/build/commands/billing/subscription.d.ts.map +1 -1
- package/build/commands/billing/subscription.js +3 -3
- package/build/commands/billing/usage.d.ts.map +1 -1
- package/build/commands/billing/usage.js +1 -1
- package/build/commands/connection/action.d.ts.map +1 -1
- package/build/commands/connection/action.js +1 -1
- package/build/commands/connection/connector.d.ts.map +1 -1
- package/build/commands/connection/connector.js +145 -22
- package/build/commands/connection/integration.d.ts.map +1 -1
- package/build/commands/connection/integration.js +1 -1
- package/build/commands/content/library.js +1 -1
- package/build/commands/context/runtime.js +1 -1
- package/build/commands/expression/recipe.d.ts.map +1 -1
- package/build/commands/expression/recipe.js +9 -9
- package/build/commands/mailboxManagement/event.js +1 -1
- package/build/commands/mailboxManagement/mailbox.d.ts.map +1 -1
- package/build/commands/mailboxManagement/mailbox.js +3 -3
- package/build/commands/mailboxManagement/message.js +1 -1
- package/build/commands/mailboxManagement/suppression.js +1 -1
- package/build/commands/mailboxManagement/thread.js +1 -1
- package/build/commands/observability/alert.js +2 -2
- package/build/commands/orchestration/action.d.ts.map +1 -1
- package/build/commands/orchestration/action.js +18 -63
- package/build/commands/orchestration/batch.js +7 -7
- package/build/commands/orchestration/node.js +2 -2
- package/build/commands/orchestration/play.d.ts.map +1 -1
- package/build/commands/orchestration/play.js +9 -9
- package/build/commands/orchestration/record.d.ts.map +1 -1
- package/build/commands/orchestration/record.js +10 -10
- package/build/commands/orchestration/release.js +1 -1
- package/build/commands/orchestration/run.d.ts.map +1 -1
- package/build/commands/orchestration/run.js +14 -14
- package/build/commands/orchestration/span.d.ts.map +1 -1
- package/build/commands/orchestration/span.js +4 -4
- package/build/commands/orchestration/tool.js +2 -2
- package/build/commands/orchestration/trace.d.ts.map +1 -1
- package/build/commands/orchestration/trace.js +2 -2
- package/build/commands/revenueOrganization/capacity.d.ts.map +1 -1
- package/build/commands/revenueOrganization/capacity.js +2 -2
- package/build/commands/revenueOrganization/territory.js +2 -2
- package/build/commands/segmentation/change.d.ts.map +1 -1
- package/build/commands/segmentation/change.js +4 -4
- package/build/commands/segmentation/record.js +1 -1
- package/build/commands/segmentation/segment.js +2 -2
- package/build/commands/start/brief.d.ts +107 -0
- package/build/commands/start/brief.d.ts.map +1 -0
- package/build/commands/start/brief.js +222 -0
- package/build/commands/start/index.d.ts +44 -0
- package/build/commands/start/index.d.ts.map +1 -0
- package/build/commands/start/index.js +431 -0
- package/build/commands/start/state.d.ts +50 -0
- package/build/commands/start/state.d.ts.map +1 -0
- package/build/commands/start/state.js +101 -0
- package/build/commands/storage/query.js +1 -1
- package/build/commands/storage/record.js +2 -2
- package/build/commands/storage/run.js +2 -2
- package/build/commands/systemOfRecordIntegration/log.js +1 -1
- package/build/commands/systemOfRecordIntegration/systemOfRecord.js +1 -1
- package/build/commands/version.js +1 -1
- package/build/commands/workspaceManagement/folder.d.ts.map +1 -1
- package/build/commands/workspaceManagement/folder.js +1 -1
- package/build/commands/workspaceManagement/role.d.ts.map +1 -1
- package/build/commands/workspaceManagement/role.js +2 -2
- package/build/commands/workspaceManagement/session.js +1 -1
- package/build/commands/workspaceManagement/user.d.ts.map +1 -1
- package/build/commands/workspaceManagement/user.js +2 -2
- package/build/commands/workspaceManagement/workspaces.js +1 -1
- package/build/config.d.ts +1 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +1 -0
- package/build/index.js +50 -6
- package/build/paletteLayout.d.ts +16 -0
- package/build/paletteLayout.d.ts.map +1 -0
- package/build/paletteLayout.js +131 -0
- package/build/setupIssues.d.ts +4 -16
- package/build/setupIssues.d.ts.map +1 -1
- package/build/setupIssues.js +3 -52
- package/build/utils/booleanOption.d.ts.map +1 -1
- package/build/utils/booleanOption.js +5 -4
- package/package.json +3 -3
- package/build/commands/orchestration/costTable.d.ts +0 -121
- package/build/commands/orchestration/costTable.d.ts.map +0 -1
- package/build/commands/orchestration/costTable.js +0 -363
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { awaitBrowserStep, buildCliConnectorCreateUrl, buildCliConnectorEditUrl, isCodingAgent, openBrowser, resolveUserUuid, shouldWaitForPerson, } from "@cargo-ai/cdk/cli";
|
|
2
|
+
import { getConfig } from "../../config.js";
|
|
1
3
|
import { parseBooleanOption } from "../../utils/booleanOption.js";
|
|
2
|
-
import {
|
|
4
|
+
import { openPromptInput } from "../../utils/prompt.js";
|
|
5
|
+
import { colors, ExitCodes, failWith, handleApiCall, info, outputJson, parseJson, } from "../runHandler.js";
|
|
3
6
|
export function registerConnectorCommands(parent, getApi) {
|
|
4
7
|
const connector = parent
|
|
5
8
|
.command("connector")
|
|
@@ -46,7 +49,7 @@ export function registerConnectorCommands(parent, getApi) {
|
|
|
46
49
|
.requiredOption("--slug <slug>", "Field slug to autocomplete (string, required)")
|
|
47
50
|
.requiredOption("--params <json>", "Autocomplete parameters (JSON object, required)")
|
|
48
51
|
.option("--value <value>", "Search value to filter results (string)")
|
|
49
|
-
.option("--refresh [
|
|
52
|
+
.option("--refresh [true|false]", "Refresh cached results (defaults to true when passed bare)", parseBooleanOption)
|
|
50
53
|
.option("--variables <json>", "Additional variables (JSON object)")
|
|
51
54
|
.action(async (opts) => {
|
|
52
55
|
const api = getApi();
|
|
@@ -79,39 +82,70 @@ export function registerConnectorCommands(parent, getApi) {
|
|
|
79
82
|
});
|
|
80
83
|
connector
|
|
81
84
|
.command("create")
|
|
82
|
-
.description("Create a connector")
|
|
83
|
-
.
|
|
84
|
-
.
|
|
85
|
+
.description("Create a connector. Without --config, opens the hosted form in a browser and waits.")
|
|
86
|
+
.option("--name <name>", "Connector name (string, required with --config)")
|
|
87
|
+
.option("--slug <slug>", "Connector slug identifier (string, required with --config)")
|
|
85
88
|
.requiredOption("--integration-slug <slug>", "Integration slug to connect to (string, required)")
|
|
86
|
-
.option("--config <json>", "Connector configuration (JSON object, shape depends on integration)")
|
|
89
|
+
.option("--config <json>", "Connector configuration (JSON object, shape depends on integration). Skips the browser.")
|
|
87
90
|
.option("--rate-limit <json>", 'Rate limit configuration (JSON object). Shape: {"maxRequests": integer, "windowMs": integer}')
|
|
88
91
|
.option("--cache-ttl-milliseconds <n>", "Cache TTL in milliseconds (integer)")
|
|
89
92
|
.addHelpText("after", `
|
|
90
93
|
Examples:
|
|
91
|
-
|
|
94
|
+
# Open the hosted form, wait, then write connectors/hubspot.ts and bind it
|
|
95
|
+
$ cargo-ai connection connector create --integration-slug hubspot
|
|
96
|
+
|
|
97
|
+
# Fully non-interactive — no browser
|
|
92
98
|
$ cargo-ai connection connector create --name "HubSpot" --slug hubspot-main --integration-slug hubspot \\
|
|
93
|
-
--
|
|
99
|
+
--config '{"method":"privateApp","accessToken":"pat-..."}'
|
|
100
|
+
$ cargo-ai connection connector create --name "HubSpot" --slug hubspot-main --integration-slug hubspot \\
|
|
101
|
+
--config '{...}' --rate-limit '{"maxRequests":100,"windowMs":60000}' --cache-ttl-milliseconds 300000`)
|
|
94
102
|
.action(async (opts) => {
|
|
95
103
|
const api = getApi();
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
integrationSlug: opts.integrationSlug,
|
|
100
|
-
config: opts.config !== undefined
|
|
101
|
-
? parseJson(opts.config, "--config")
|
|
102
|
-
: undefined,
|
|
103
|
-
rateLimit: opts.rateLimit !== undefined
|
|
104
|
+
// `--config` keeps the original, fully scriptable behaviour.
|
|
105
|
+
if (opts.config !== undefined) {
|
|
106
|
+
const rateLimit = opts.rateLimit !== undefined
|
|
104
107
|
? parseJson(opts.rateLimit, "--rate-limit")
|
|
105
|
-
: undefined
|
|
106
|
-
cacheTtlMilliseconds
|
|
108
|
+
: undefined;
|
|
109
|
+
const cacheTtlMilliseconds = opts.cacheTtlMilliseconds !== undefined
|
|
107
110
|
? parseInt(opts.cacheTtlMilliseconds, 10)
|
|
108
|
-
: undefined
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
: undefined;
|
|
112
|
+
const name = opts.name;
|
|
113
|
+
const slug = opts.slug;
|
|
114
|
+
if (name === undefined || slug === undefined) {
|
|
115
|
+
failWith("--name and --slug are required when --config is passed.", { code: ExitCodes.InvalidUsage });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const config = parseJson(opts.config, "--config");
|
|
119
|
+
const result = await handleApiCall(() => api.connection.connector.create({
|
|
120
|
+
name,
|
|
121
|
+
slug,
|
|
122
|
+
integrationSlug: opts.integrationSlug,
|
|
123
|
+
config,
|
|
124
|
+
rateLimit,
|
|
125
|
+
cacheTtlMilliseconds,
|
|
126
|
+
}));
|
|
127
|
+
outputJson(result);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const ignored = [
|
|
131
|
+
opts.name === undefined ? undefined : "--name",
|
|
132
|
+
opts.slug === undefined ? undefined : "--slug",
|
|
133
|
+
opts.rateLimit === undefined ? undefined : "--rate-limit",
|
|
134
|
+
opts.cacheTtlMilliseconds === undefined
|
|
135
|
+
? undefined
|
|
136
|
+
: "--cache-ttl-milliseconds",
|
|
137
|
+
].filter((flag) => flag !== undefined);
|
|
138
|
+
// The hosted form asks for all of these itself, so accepting them here
|
|
139
|
+
// and dropping them would silently produce a connector the caller did
|
|
140
|
+
// not describe.
|
|
141
|
+
if (ignored.length > 0) {
|
|
142
|
+
failWith(`${ignored.join(", ")} only applies with --config — the browser form asks for it.`, { code: ExitCodes.InvalidUsage });
|
|
143
|
+
}
|
|
144
|
+
await runCreateHandoff({ api, integrationSlug: opts.integrationSlug });
|
|
111
145
|
});
|
|
112
146
|
connector
|
|
113
147
|
.command("update")
|
|
114
|
-
.description("Update a connector")
|
|
148
|
+
.description("Update a connector. With no field flags, opens the hosted form in a browser (use it to re-authorize).")
|
|
115
149
|
.requiredOption("--uuid <uuid>", "Connector UUID")
|
|
116
150
|
.option("--name <name>", "Connector name")
|
|
117
151
|
.option("--config <json>", "Configuration (JSON object)")
|
|
@@ -119,6 +153,19 @@ Examples:
|
|
|
119
153
|
.option("--cache-ttl-milliseconds <n>", "Cache TTL in milliseconds")
|
|
120
154
|
.action(async (opts) => {
|
|
121
155
|
const api = getApi();
|
|
156
|
+
// No field to change means "let me edit it in the form" — the only way
|
|
157
|
+
// to re-run an OAuth flow for an existing connector.
|
|
158
|
+
const hasFieldFlag = opts.name !== undefined ||
|
|
159
|
+
opts.config !== undefined ||
|
|
160
|
+
opts.rateLimit !== undefined ||
|
|
161
|
+
opts.cacheTtlMilliseconds !== undefined;
|
|
162
|
+
if (hasFieldFlag === false) {
|
|
163
|
+
// Re-auth changes credentials, not the binding: the CDK file already
|
|
164
|
+
// exists and binds by slug, so there is nothing to write and nothing
|
|
165
|
+
// to wait for. Open the form and get out of the way.
|
|
166
|
+
openConnectorEditForm(opts.uuid);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
122
169
|
const result = await handleApiCall(() => api.connection.connector.update({
|
|
123
170
|
uuid: opts.uuid,
|
|
124
171
|
name: opts.name,
|
|
@@ -144,3 +191,79 @@ Examples:
|
|
|
144
191
|
outputJson(result);
|
|
145
192
|
});
|
|
146
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Send the user to the connectors page, wait for them to confirm, then report
|
|
196
|
+
* the connector they made.
|
|
197
|
+
*
|
|
198
|
+
* Imperative only: it creates a connector and prints it. Writing
|
|
199
|
+
* `connectors/<slug>.ts` and binding cargo.state.json is
|
|
200
|
+
* `cargo-ai cdk add connector/<integration>`, so running this inside a repo
|
|
201
|
+
* never touches the repo.
|
|
202
|
+
*/
|
|
203
|
+
async function runCreateHandoff(input) {
|
|
204
|
+
const { api, integrationSlug } = input;
|
|
205
|
+
const url = buildCliConnectorCreateUrl({
|
|
206
|
+
...resolveAppContext(),
|
|
207
|
+
integrationSlug,
|
|
208
|
+
});
|
|
209
|
+
// Nothing can drive a browser for an agent: hand back the URL and where to
|
|
210
|
+
// look once a human has clicked through. `openPromptInput` still finds
|
|
211
|
+
// `/dev/tty` when stdin is piped; `shouldWaitForPerson` additionally
|
|
212
|
+
// refuses coding agents, whose stdin often looks like a TTY.
|
|
213
|
+
if (shouldWaitForPerson({
|
|
214
|
+
isCodingAgent: isCodingAgent(),
|
|
215
|
+
isCi: process.env["CI"] === "true",
|
|
216
|
+
hasPromptInput: openPromptInput() !== undefined,
|
|
217
|
+
}) === false) {
|
|
218
|
+
outputJson({
|
|
219
|
+
ok: true,
|
|
220
|
+
status: "actionRequired",
|
|
221
|
+
action: "openBrowser",
|
|
222
|
+
integrationSlug,
|
|
223
|
+
url,
|
|
224
|
+
reason: "Creating this connector needs the hosted form, which cannot be driven headlessly.",
|
|
225
|
+
next: `cargo-ai connection connector list --integration-slug ${integrationSlug}`,
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const [before, userUuid] = await Promise.all([
|
|
230
|
+
handleApiCall(() => api.connection.connector.list({ integrationSlug })),
|
|
231
|
+
resolveUserUuid(api),
|
|
232
|
+
]);
|
|
233
|
+
const connector = await awaitBrowserStep({
|
|
234
|
+
api,
|
|
235
|
+
url,
|
|
236
|
+
integrationSlug,
|
|
237
|
+
before: before.connectors,
|
|
238
|
+
userUuid,
|
|
239
|
+
});
|
|
240
|
+
if (connector === undefined) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
outputJson({ ok: true, status: "connected", connector });
|
|
244
|
+
}
|
|
245
|
+
/** Open this connector's edit form so the user can re-run its auth flow. */
|
|
246
|
+
function openConnectorEditForm(connectorUuid) {
|
|
247
|
+
const url = buildCliConnectorEditUrl({
|
|
248
|
+
...resolveAppContext(),
|
|
249
|
+
connectorUuid,
|
|
250
|
+
});
|
|
251
|
+
info(["", "Re-authorize the connector here:", ` ${colors.cyan(url)}`, ""].join("\n"));
|
|
252
|
+
openBrowser(url);
|
|
253
|
+
outputJson({
|
|
254
|
+
ok: true,
|
|
255
|
+
status: "actionRequired",
|
|
256
|
+
action: "openBrowser",
|
|
257
|
+
url,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
/** The workspace to act in; the app URL is configuration, not a guess. */
|
|
261
|
+
function resolveAppContext() {
|
|
262
|
+
const { appUrl, workspaceUuid } = getConfig();
|
|
263
|
+
if (workspaceUuid === undefined) {
|
|
264
|
+
return failWith("No workspace selected. Run 'cargo-ai login' first.", {
|
|
265
|
+
code: ExitCodes.NotAuthenticated,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return { appUrl, workspaceUuid };
|
|
269
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/commands/connection/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/commands/connection/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAuGN"}
|
|
@@ -6,7 +6,7 @@ export function registerIntegrationCommands(parent, getApi) {
|
|
|
6
6
|
integration
|
|
7
7
|
.command("list")
|
|
8
8
|
.description("List all integrations")
|
|
9
|
-
.option("--category <
|
|
9
|
+
.option("--category <engagement|marketing|sales|finance|analytics|freeform|success|support|enrichment|storage|custom>", "Filter by category")
|
|
10
10
|
.option("--slugs <list>", "Filter by integration slugs (comma-separated strings)")
|
|
11
11
|
.option("--search <search>", "Search by name, case-insensitive (string)")
|
|
12
12
|
.option("--has-actions <bool>", 'Filter by presence of actions (string: "true" or "false")')
|
|
@@ -7,7 +7,7 @@ export function registerLibraryCommands(parent, getApi) {
|
|
|
7
7
|
.command("list")
|
|
8
8
|
.description("List workspace libraries")
|
|
9
9
|
.option("--connector-uuid <uuid>", "Filter by connector UUID")
|
|
10
|
-
.option("--kind <
|
|
10
|
+
.option("--kind <native|connector>", "Filter by kind")
|
|
11
11
|
.action(async (opts) => {
|
|
12
12
|
const api = getApi();
|
|
13
13
|
const kind = opts.kind === "connector" || opts.kind === "native"
|
|
@@ -51,7 +51,7 @@ export function registerRuntimeCommands(parent, getApi) {
|
|
|
51
51
|
.requiredOption("--path <path>", "Path to the file")
|
|
52
52
|
.requiredOption("--old-string <old>", "Exact substring to replace (must occur once unless --replace-all is set)")
|
|
53
53
|
.requiredOption("--new-string <new>", "Replacement string (may be empty to delete the match). Must differ from --old-string.")
|
|
54
|
-
.option("--replace-all [
|
|
54
|
+
.option("--replace-all [true|false]", "Replace every occurrence of --old-string instead of requiring a single match", parseBooleanOption)
|
|
55
55
|
.option("--commit-message <message>", "Commit message override")
|
|
56
56
|
.action(async (opts) => {
|
|
57
57
|
const api = getApi();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/commands/expression/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,
|
|
1
|
+
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/commands/expression/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAIxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAgLN"}
|
|
@@ -5,9 +5,9 @@ export function registerRecipeCommands(parent, getApi) {
|
|
|
5
5
|
recipe
|
|
6
6
|
.command("list")
|
|
7
7
|
.description("List recipes")
|
|
8
|
-
.option("--tab <
|
|
9
|
-
.option("--ui-types <
|
|
10
|
-
.option("--categories <
|
|
8
|
+
.option("--tab <all|user|workspace|favorites>", "Tab filter")
|
|
9
|
+
.option("--ui-types <js,ai>", "UI types")
|
|
10
|
+
.option("--categories <other,classification,cleaning,marketing,sales,event,copywriting>", "Categories")
|
|
11
11
|
.option("--name <name>", "Filter by name")
|
|
12
12
|
.option("--limit <n>", "Limit")
|
|
13
13
|
.option("--offset <n>", "Offset")
|
|
@@ -45,12 +45,12 @@ export function registerRecipeCommands(parent, getApi) {
|
|
|
45
45
|
.description("Create a recipe")
|
|
46
46
|
.requiredOption("--name <name>", "Recipe name")
|
|
47
47
|
.requiredOption("--description <text>", "Recipe description")
|
|
48
|
-
.requiredOption("--category <
|
|
49
|
-
.requiredOption("--kind <
|
|
48
|
+
.requiredOption("--category <other|classification|cleaning|marketing|sales|event|copywriting>", "Category")
|
|
49
|
+
.requiredOption("--kind <jsExpression|templateExpression>", "Kind")
|
|
50
50
|
.requiredOption("--expression <expr>", "Expression")
|
|
51
|
-
.requiredOption("--instruct-to <
|
|
51
|
+
.requiredOption("--instruct-to <ai|none>", "Instruct to")
|
|
52
52
|
.requiredOption("--placeholders <json>", 'Placeholders (JSON array, e.g. [{"slug":"my_var","label":"My Variable","kind":"text"}])')
|
|
53
|
-
.option("--is-public [
|
|
53
|
+
.option("--is-public [true|false]", "Make recipe public", parseBooleanOption)
|
|
54
54
|
.action(async (opts) => {
|
|
55
55
|
const api = getApi();
|
|
56
56
|
const result = await handleApiCall(() => api.expression.recipe.create({
|
|
@@ -71,10 +71,10 @@ export function registerRecipeCommands(parent, getApi) {
|
|
|
71
71
|
.requiredOption("--uuid <uuid>", "Recipe UUID")
|
|
72
72
|
.requiredOption("--name <name>", "Recipe name")
|
|
73
73
|
.requiredOption("--description <text>", "Recipe description")
|
|
74
|
-
.requiredOption("--category <
|
|
74
|
+
.requiredOption("--category <other|classification|cleaning|marketing|sales|event|copywriting>", "Category")
|
|
75
75
|
.requiredOption("--expression <expr>", "Expression")
|
|
76
76
|
.requiredOption("--placeholders <json>", 'Placeholders (JSON array, e.g. [{"slug":"my_var","label":"My Variable","kind":"text"}])')
|
|
77
|
-
.option("--is-public [
|
|
77
|
+
.option("--is-public [true|false]", "Make recipe public", parseBooleanOption)
|
|
78
78
|
.action(async (opts) => {
|
|
79
79
|
const api = getApi();
|
|
80
80
|
const result = await handleApiCall(() => api.expression.recipe.createNewVersion({
|
|
@@ -10,7 +10,7 @@ export function registerEventCommands(parent, getApi) {
|
|
|
10
10
|
.option("--mailbox-uuid <uuid>", "Filter by mailbox")
|
|
11
11
|
.option("--message-uuid <uuid>", "Filter by outbound message")
|
|
12
12
|
.option("--thread-uuid <uuid>", "Filter by thread")
|
|
13
|
-
.option("--kinds <
|
|
13
|
+
.option("--kinds <sent,opened,clicked,replied,bounced,unsubscribed>", "Filter by kind")
|
|
14
14
|
.option("--occurred-after <date>", "Occurred after (ISO 8601)")
|
|
15
15
|
.option("--occurred-before <date>", "Occurred before (ISO 8601)")
|
|
16
16
|
.option("--search <text>", "Search actor email or snippet")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/commands/mailboxManagement/mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAUxC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,
|
|
1
|
+
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/commands/mailboxManagement/mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAUxC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAySN"}
|
|
@@ -9,7 +9,7 @@ export function registerMailboxCommands(parent, getApi) {
|
|
|
9
9
|
.description("List mailboxes in this workspace")
|
|
10
10
|
.option("--domain-uuid <uuid>", "Only mailboxes on this sending domain")
|
|
11
11
|
.option("--folder-uuid <uuid>", 'Folder UUID, or "none" for mailboxes not in a folder')
|
|
12
|
-
.option("--statuses <
|
|
12
|
+
.option("--statuses <pending,active,inactive>", "Filter by statuses")
|
|
13
13
|
.option("--limit <n>", "Max results to return (integer)")
|
|
14
14
|
.option("--offset <n>", "Number of results to skip (integer)")
|
|
15
15
|
.addHelpText("after", `
|
|
@@ -43,7 +43,7 @@ Example:
|
|
|
43
43
|
.command("create")
|
|
44
44
|
.description("Provision a mailbox on a sending domain the workspace owns")
|
|
45
45
|
.requiredOption("--domain-uuid <uuid>", "Sending domain UUID")
|
|
46
|
-
.requiredOption("--type <
|
|
46
|
+
.requiredOption("--type <google|shared|private>", "Mailbox flavour (outlook cannot deliver yet)")
|
|
47
47
|
.requiredOption("--username <local-part>", "Local part of the address, e.g. jane for jane@acme.com")
|
|
48
48
|
.requiredOption("--first-name <name>", "Sender first name in the From header")
|
|
49
49
|
.requiredOption("--last-name <name>", "Sender last name in the From header")
|
|
@@ -136,7 +136,7 @@ Example:
|
|
|
136
136
|
.description("Change warm-up daily target or pause/resume the pool")
|
|
137
137
|
.requiredOption("--uuid <uuid>", "Mailbox UUID")
|
|
138
138
|
.option("--daily-target <n>", "Warm-up messages per day at full ramp")
|
|
139
|
-
.option("--status <
|
|
139
|
+
.option("--status <disabled|pending|active|paused|failed>", "Warm-up state")
|
|
140
140
|
.addHelpText("after", `
|
|
141
141
|
Example:
|
|
142
142
|
$ cargo-ai mailboxManagement mailbox update-warmup --uuid 550e8400-... --status paused`)
|
|
@@ -9,7 +9,7 @@ export function registerMessageCommands(parent, getApi) {
|
|
|
9
9
|
.description("List outbound messages")
|
|
10
10
|
.option("--mailbox-uuid <uuid>", "Filter by mailbox")
|
|
11
11
|
.option("--thread-uuid <uuid>", "Filter by thread")
|
|
12
|
-
.option("--statuses <
|
|
12
|
+
.option("--statuses <pending,error,sent,opened,clicked,replied,bounced,unsubscribed>", "Filter by list status")
|
|
13
13
|
.option("--created-after <date>", "Created after (ISO 8601)")
|
|
14
14
|
.option("--created-before <date>", "Created before (ISO 8601)")
|
|
15
15
|
.option("--search <text>", "Search subject or recipient")
|
|
@@ -7,7 +7,7 @@ export function registerSuppressionCommands(parent, getApi) {
|
|
|
7
7
|
suppression
|
|
8
8
|
.command("list")
|
|
9
9
|
.description("List suppressions")
|
|
10
|
-
.option("--reasons <
|
|
10
|
+
.option("--reasons <unsubscribed,bounced,complained,manual>", "Filter by reason")
|
|
11
11
|
.option("--limit <n>", "Max results to return (integer)")
|
|
12
12
|
.option("--offset <n>", "Number of results to skip (integer)")
|
|
13
13
|
.addHelpText("after", `
|
|
@@ -8,7 +8,7 @@ export function registerThreadCommands(parent, getApi) {
|
|
|
8
8
|
.command("list")
|
|
9
9
|
.description("List threads")
|
|
10
10
|
.option("--mailbox-uuid <uuid>", "Filter by mailbox")
|
|
11
|
-
.option("--statuses <
|
|
11
|
+
.option("--statuses <pending,error,sent,opened,clicked,replied,bounced,unsubscribed>", "Filter by latest list status")
|
|
12
12
|
.option("--created-after <date>", "Created after (ISO 8601)")
|
|
13
13
|
.option("--created-before <date>", "Created before (ISO 8601)")
|
|
14
14
|
.option("--search <text>", "Search subject or recipient")
|
|
@@ -28,7 +28,7 @@ export function registerAlertCommands(parent, getApi) {
|
|
|
28
28
|
.requiredOption("--scope <json>", 'Scope (JSON), one of: {"kind":"spans","workflowUuid":"..."}, {"kind":"runs","workflowUuid":"...","statuses":["error"]}, {"kind":"records","workflowUuid":"...","statuses":["error"]}, {"kind":"orchestrationQuery","query":"select ..."}, {"kind":"storageQuery","query":"select ..."} or {"kind":"model","modelUuid":"...","filter":{...}}')
|
|
29
29
|
.requiredOption("--threshold <json>", 'Threshold (JSON). Spans, runs and records scopes: {"metric":"errorRate","operator":"gte","value":10}, {"metric":"duration","aggregation":"p95","operator":"gte","value":30}, {"metric":"credits","aggregation":"sum","operator":"gte","value":500} or {"metric":"count","operator":"lte","value":0}; model scopes: {"metric":"recordsCount","operator":"lte","value":0}, {"metric":"recordsShare","operator":"gte","value":30} (needs a scope filter), {"metric":"freshness","operator":"gte","value":60} or {"metric":"syncDuration","operator":"gte","value":300}; query scopes: {"metric":"query","operator":"gte","value":10}')
|
|
30
30
|
.option("--actions <json>", "Actions fired as runs on breach (JSON Action[]: connector, tool, or agent nodes)")
|
|
31
|
-
.option("--disabled [
|
|
31
|
+
.option("--disabled [true|false]", "Create the alert disabled", parseBooleanOption)
|
|
32
32
|
.option("--description <text>", "What this alert watches")
|
|
33
33
|
.option("--folder <uuid>", "Folder UUID to file the alert under")
|
|
34
34
|
.action(async (opts) => {
|
|
@@ -53,7 +53,7 @@ export function registerAlertCommands(parent, getApi) {
|
|
|
53
53
|
.requiredOption("--uuid <uuid>", "Alert UUID")
|
|
54
54
|
.option("--name <name>", "Alert name")
|
|
55
55
|
.option("--cron <cron>", 'Evaluation schedule: 5-field cron or "@every <interval>" (UTC), at most once a minute')
|
|
56
|
-
.option("--enabled [
|
|
56
|
+
.option("--enabled [true|false]", "Enable or disable the alert", parseBooleanOption)
|
|
57
57
|
.option("--scope <json>", "Scope (JSON). See `alert create`")
|
|
58
58
|
.option("--threshold <json>", "Threshold (JSON). See `alert create`")
|
|
59
59
|
.option("--actions <json>", "Actions fired as runs on breach (JSON Action[])")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAcxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAgTN"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { parseBooleanOption } from "../../utils/booleanOption.js";
|
|
2
2
|
import { applyRecordsLimit, ExitCodes, failWith, handleApiCall, outputJson, parseJson, parsePositiveInt, pollBatchUntilFinished, pollRunUntilFinished, } from "../runHandler.js";
|
|
3
|
-
import { buildCostRows, groupActionsByIntegration, renderCostTable, summarize, } from "./costTable.js";
|
|
4
3
|
export function registerActionCommands(parent, getApi) {
|
|
5
4
|
const action = parent
|
|
6
5
|
.command("action")
|
|
@@ -18,21 +17,34 @@ graph needed. Creates a run and consumes credits.
|
|
|
18
17
|
|
|
19
18
|
To debug a node inside an existing workflow instead, use
|
|
20
19
|
'cargo-ai orchestration node'.`);
|
|
21
|
-
registerCostTableCommand(action, getApi);
|
|
22
20
|
const listableKinds = ["connector", "native", "tool", "agent"];
|
|
23
21
|
action
|
|
24
22
|
.command("list")
|
|
25
23
|
.description("List actions")
|
|
26
24
|
.argument("[query...]", "Keywords to match (space-separated, optional)")
|
|
27
|
-
.option("--kind <
|
|
25
|
+
.option("--kind <connector|native|tool|agent>", "Restrict to one kind")
|
|
28
26
|
.option("--integration-slug <slug>", "Restrict connector actions to this integration (string)")
|
|
29
|
-
.option("--category <
|
|
27
|
+
.option("--category <engagement|marketing|sales|finance|analytics|freeform|success|support|enrichment|storage|custom>", "Restrict connector actions to integrations in this category")
|
|
30
28
|
.option("--limit <n>", "Maximum results to return (integer). Omit to return all results.")
|
|
31
29
|
.addHelpText("after", `
|
|
32
30
|
Each result includes an 'action' object you can pass to execute, execute-batch,
|
|
33
31
|
or get-output-schema. All query terms must match (AND). Matches on the action
|
|
34
32
|
slug or name rank above integration matches, which rank above description.
|
|
35
33
|
|
|
34
|
+
Billed actions carry a 'credits' array — this is where pricing lives, so it is
|
|
35
|
+
the answer to "what does <action> cost". Actions without it cost no credits.
|
|
36
|
+
Each entry is one of three shapes, selected by the 'config' it matches:
|
|
37
|
+
|
|
38
|
+
- fixed: 'cost' credits per call.
|
|
39
|
+
- unit: 'cost' credits per 'unit' consumed, plus 'fixedCost' per call.
|
|
40
|
+
- package: 'cost' credits per block of 'unitsCount' 'unit', plus 'fixedCost'.
|
|
41
|
+
|
|
42
|
+
'fixedCost' is a base charge on top of the metered rate, not an alternative to
|
|
43
|
+
it — a search billed 0.175 fixedCost + 0.025 per item costs 0.2 for one item.
|
|
44
|
+
When several entries are present the price depends on config, and each entry's
|
|
45
|
+
'config.jsonSchema' const/enum is what selects it (an LLM model, a phone-or-
|
|
46
|
+
email toggle).
|
|
47
|
+
|
|
36
48
|
Examples:
|
|
37
49
|
$ cargo-ai orchestration action list enrich
|
|
38
50
|
$ cargo-ai orchestration action list --kind tool
|
|
@@ -65,7 +77,7 @@ Examples:
|
|
|
65
77
|
.description("Execute a single action")
|
|
66
78
|
.requiredOption("--action <json>", 'Action definition (JSON object, required). Example: \'{"kind":"tool","toolUuid":"550e8400-..."}\'')
|
|
67
79
|
.requiredOption("--data <json>", "Input data for the run (JSON object, required)")
|
|
68
|
-
.option("--wait-until-finished [
|
|
80
|
+
.option("--wait-until-finished [true|false]", "Poll the run until it reaches a terminal status before returning (defaults to true when passed bare)", parseBooleanOption)
|
|
69
81
|
.option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
|
|
70
82
|
.option("--webhook-url <url>", "URL to call when the run completes")
|
|
71
83
|
.option("--webhook-secret <secret>", "Secret used to sign webhook deliveries")
|
|
@@ -99,7 +111,7 @@ Examples:
|
|
|
99
111
|
.option("--webhook-url <url>", "URL to call when the batch completes")
|
|
100
112
|
.option("--webhook-secret <secret>", "Secret used to sign webhook deliveries")
|
|
101
113
|
.option("--limit <n>", "Pilot: only submit the first N records (integer). Inspect the pilot's output before re-running on the full set — credits-based actions bill per record.")
|
|
102
|
-
.option("--wait-until-finished [
|
|
114
|
+
.option("--wait-until-finished [true|false]", "Poll the batch until it reaches a terminal status before returning (defaults to true when passed bare)", parseBooleanOption)
|
|
103
115
|
.option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
|
|
104
116
|
.addHelpText("after", `
|
|
105
117
|
Examples:
|
|
@@ -160,60 +172,3 @@ Examples:
|
|
|
160
172
|
outputJson(result);
|
|
161
173
|
});
|
|
162
174
|
}
|
|
163
|
-
function registerCostTableCommand(action, getApi) {
|
|
164
|
-
action
|
|
165
|
-
.command("cost-table")
|
|
166
|
-
.description("Price list of every credits-based action in the catalog, sorted by cost (free, reads the catalog)")
|
|
167
|
-
.option("--category <category>", "Filter by integration category (string)")
|
|
168
|
-
.option("--integration <slug>", "Filter by integration slug (string)")
|
|
169
|
-
.option("--raw", "Print the markdown document instead of JSON")
|
|
170
|
-
.addHelpText("after", `
|
|
171
|
-
Free, spends nothing: the catalog is where pricing actually lives, so this is
|
|
172
|
-
the answer to "what does <action> cost" and "what is the cheapest way to do
|
|
173
|
-
<stage>" without pricing anyone copied by hand.
|
|
174
|
-
|
|
175
|
-
Covers connector actions and Cargo's own native actions: sendEmail, modelAsk
|
|
176
|
-
and fileSearch are billed, so a connector-only price list is not a complete one.
|
|
177
|
-
Filtering by --category or --integration drops the natives.
|
|
178
|
-
|
|
179
|
-
Actions absent from the output cost no credits. Actions whose price depends on
|
|
180
|
-
config (an LLM model, a phone-or-email toggle) show a range, with the
|
|
181
|
-
per-config prices in the document's second half.
|
|
182
|
-
|
|
183
|
-
Examples:
|
|
184
|
-
$ cargo-ai orchestration action cost-table
|
|
185
|
-
$ cargo-ai orchestration action cost-table --category enrichment --raw
|
|
186
|
-
$ cargo-ai orchestration action cost-table --raw > credits-cost-table.md`)
|
|
187
|
-
.action(async (opts) => {
|
|
188
|
-
const api = getApi();
|
|
189
|
-
const isFiltered = opts.category !== undefined || opts.integration !== undefined;
|
|
190
|
-
// Fetch all connector and native actions. Omitting limit returns all.
|
|
191
|
-
// When filtering by category or integration, only connectors match —
|
|
192
|
-
// natives have no category and no integrationSlug.
|
|
193
|
-
const kinds = isFiltered
|
|
194
|
-
? ["connector"]
|
|
195
|
-
: ["connector", "native"];
|
|
196
|
-
const allActions = [];
|
|
197
|
-
for (const kind of kinds) {
|
|
198
|
-
const result = await handleApiCall(() => api.orchestration.action.list({
|
|
199
|
-
kind,
|
|
200
|
-
category: opts.category,
|
|
201
|
-
integrationSlug: opts.integration,
|
|
202
|
-
}));
|
|
203
|
-
allActions.push(...result.results);
|
|
204
|
-
}
|
|
205
|
-
const catalog = groupActionsByIntegration(allActions);
|
|
206
|
-
const rows = buildCostRows(catalog);
|
|
207
|
-
const summary = summarize(catalog);
|
|
208
|
-
if (opts.raw === true) {
|
|
209
|
-
console.log(renderCostTable(rows, summary, {
|
|
210
|
-
generatedAt: new Date().toISOString().slice(0, 10),
|
|
211
|
-
filter: isFiltered
|
|
212
|
-
? { category: opts.category, integration: opts.integration }
|
|
213
|
-
: undefined,
|
|
214
|
-
}));
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
outputJson({ summary, rows });
|
|
218
|
-
});
|
|
219
|
-
}
|
|
@@ -13,12 +13,12 @@ export function registerBatchCommands(parent, getApi) {
|
|
|
13
13
|
.option("--parent-batch-uuid <uuid>", "Filter by parent batch UUID (string)")
|
|
14
14
|
.option("--parent-run-uuid <uuid>", "Filter by parent run UUID (string)")
|
|
15
15
|
.option("--parent-node-uuid <uuid>", "Filter by parent node UUID (string)")
|
|
16
|
-
.option("--statuses <
|
|
17
|
-
.option("--has-runs [
|
|
18
|
-
.option("--is-skipped [
|
|
19
|
-
.option("--is-finished [
|
|
20
|
-
.option("--included-data-kinds <
|
|
21
|
-
.option("--excluded-data-kinds <
|
|
16
|
+
.option("--statuses <pending,syncing,skipped,querying,running,success,cancelling,error,cancelled>", "Filter by statuses")
|
|
17
|
+
.option("--has-runs [true|false]", "Only return batches that have runs (defaults to true when passed bare)", parseBooleanOption)
|
|
18
|
+
.option("--is-skipped [true|false]", "Only return skipped batches (defaults to true when passed bare)", parseBooleanOption)
|
|
19
|
+
.option("--is-finished [true|false]", "Only return finished batches (defaults to true when passed bare)", parseBooleanOption)
|
|
20
|
+
.option("--included-data-kinds <segment,change,filter,recordIds,watchedRecords,records,file,runs,group,schedule,form>", "Include only these data kinds")
|
|
21
|
+
.option("--excluded-data-kinds <segment,change,filter,recordIds,watchedRecords,records,file,runs,group,schedule,form>", "Exclude these data kinds")
|
|
22
22
|
.option("--limit <n>", "Max results to return (integer, default: 20)", "20")
|
|
23
23
|
.option("--offset <n>", "Number of results to skip (integer, default: 0)", "0")
|
|
24
24
|
.action(async (opts) => {
|
|
@@ -69,7 +69,7 @@ export function registerBatchCommands(parent, getApi) {
|
|
|
69
69
|
.option("--release-uuid <uuid>", "Release UUID to pin the batch to (string)")
|
|
70
70
|
.option("--file <path>", "Path to a Workflow SDK module (its default export must be the compiled workflow returned by defineWorkflow()). Compiles it, resolves any @cargo-ai/cdk resource handles to real uuids from cargo.state.json, and runs the resulting nodes. Rejected with --nodes.")
|
|
71
71
|
.option("--nodes <json>", "Custom nodes to override the workflow definition (JSON array). Rejected with --file.")
|
|
72
|
-
.option("--wait-until-finished [
|
|
72
|
+
.option("--wait-until-finished [true|false]", "Poll the batch until it reaches a terminal status before returning (defaults to true when passed bare)", parseBooleanOption)
|
|
73
73
|
.option("--polling-interval <ms>", "Polling interval in milliseconds, used with --wait-until-finished (integer, default: 5000)", "5000")
|
|
74
74
|
.addHelpText("after", `
|
|
75
75
|
Examples:
|
|
@@ -111,7 +111,7 @@ function registerDiagramCommand(node, getApi) {
|
|
|
111
111
|
.option("--nodes <json>", "Node definitions (JSON array, or '-' to read from stdin)")
|
|
112
112
|
.option("--file <path>", "Read a JSON payload or node array from a file")
|
|
113
113
|
.option("--workflow-uuid <uuid>", "Diagram a workflow's deployed release (add --draft for its draft)")
|
|
114
|
-
.option("--draft [
|
|
114
|
+
.option("--draft [true|false]", "With --workflow-uuid, use the draft release", parseBooleanOption)
|
|
115
115
|
.option("--release-uuid <uuid>", "Diagram a specific release")
|
|
116
116
|
.option("--run-uuid <uuid>", "Diagram the graph a run executed (follows the run's release when it has one)")
|
|
117
117
|
.option("--title <text>", "Title rendered above the diagram")
|
|
@@ -119,7 +119,7 @@ function registerDiagramCommand(node, getApi) {
|
|
|
119
119
|
.option("--direction <TD|LR>", "Mermaid flow direction, ignored by --format ascii (default: TD)", "TD")
|
|
120
120
|
.option("--paid <slugs>", "Comma-separated node slugs/uuids that bill credits — marked 💳")
|
|
121
121
|
.option("--highlight <slugs>", "Comma-separated node slugs/uuids to mark (red in Mermaid, ← in ASCII)")
|
|
122
|
-
.option("--raw [
|
|
122
|
+
.option("--raw [true|false]", "Print the diagram itself instead of JSON", parseBooleanOption)
|
|
123
123
|
.addHelpText("after", `
|
|
124
124
|
Free, runs nothing: turns a node graph into a picture so a reviewer can see the
|
|
125
125
|
routing, the fallback paths and which steps bill before approving or deploying
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/play.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAOxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/play.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAOxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CA2R7E"}
|
|
@@ -9,9 +9,9 @@ export function registerPlayCommands(parent, getApi) {
|
|
|
9
9
|
.description("List plays (optional filters match GET /orchestration/plays/list)")
|
|
10
10
|
.option("--model-uuid <uuid>", "Only plays for this model UUID")
|
|
11
11
|
.option("--segment-uuid <uuid>", "Only plays for this segment UUID")
|
|
12
|
-
.option("--schedule-type <
|
|
13
|
-
.option("--is-enabled [
|
|
14
|
-
.option("--is-disabled [
|
|
12
|
+
.option("--schedule-type <dbt|cron|realtime|dependency|watch>", "Only plays with this schedule type")
|
|
13
|
+
.option("--is-enabled [true|false]", "Only enabled plays (defaults to true when passed bare)", parseBooleanOption)
|
|
14
|
+
.option("--is-disabled [true|false]", "Only disabled plays (defaults to true when passed bare)", parseBooleanOption)
|
|
15
15
|
.action(async (opts) => {
|
|
16
16
|
const api = getApi();
|
|
17
17
|
const isEnabledFilter = resolveBooleanPair(opts.isEnabled, opts.isDisabled, { positive: "--is-enabled", negative: "--is-disabled" });
|
|
@@ -43,8 +43,8 @@ export function registerPlayCommands(parent, getApi) {
|
|
|
43
43
|
.description("Create a play")
|
|
44
44
|
.requiredOption("--name <name>", "Play name (string, required)")
|
|
45
45
|
.requiredOption("--model-uuid <uuid>", "Model UUID to trigger on (string, required)")
|
|
46
|
-
.requiredOption("--change-kinds <
|
|
47
|
-
.requiredOption("--run-creation-rule <
|
|
46
|
+
.requiredOption("--change-kinds <added,updated,removed,unchanged>", "Change kinds to trigger on (required)")
|
|
47
|
+
.requiredOption("--run-creation-rule <always|once|noConcurrency>", "Run creation rule")
|
|
48
48
|
.option("--description <description>", "Play description (string)")
|
|
49
49
|
.option("--folder-uuid <uuid>", "Folder UUID (string)")
|
|
50
50
|
.addHelpText("after", `
|
|
@@ -82,10 +82,10 @@ Examples:
|
|
|
82
82
|
.description("Update a play")
|
|
83
83
|
.option("--name <name>", "Play name")
|
|
84
84
|
.option("--description <description>", "Description")
|
|
85
|
-
.option("--is-enabled [
|
|
86
|
-
.option("--is-disabled [
|
|
87
|
-
.option("--change-kinds <
|
|
88
|
-
.option("--run-creation-rule <
|
|
85
|
+
.option("--is-enabled [true|false]", "Enable the play", parseBooleanOption)
|
|
86
|
+
.option("--is-disabled [true|false]", "Disable the play", parseBooleanOption)
|
|
87
|
+
.option("--change-kinds <added,updated,removed,unchanged>", "Change kinds to trigger on")
|
|
88
|
+
.option("--run-creation-rule <always|once|noConcurrency>", "Run creation rule")
|
|
89
89
|
.option("--folder-uuid <uuid>", "Folder UUID")
|
|
90
90
|
.option("--filter <json>", "Filter definition (JSON object, same format as segmentation segment update)")
|
|
91
91
|
.option("--sort <json>", 'Sort definition (JSON object). Shape: {"slug": string, "order": "asc" | "desc"}')
|