@cargo-ai/cli 1.0.13 → 1.0.15

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 (73) hide show
  1. package/README.md +23 -2
  2. package/build/api.d.ts +5 -1
  3. package/build/api.d.ts.map +1 -1
  4. package/build/api.js +6 -7
  5. package/build/commands/{auth.d.ts → auth/index.d.ts} +2 -2
  6. package/build/commands/auth/index.d.ts.map +1 -0
  7. package/build/commands/auth/index.js +131 -0
  8. package/build/commands/auth/oauth.d.ts +7 -0
  9. package/build/commands/auth/oauth.d.ts.map +1 -0
  10. package/build/commands/auth/oauth.js +140 -0
  11. package/build/commands/auth/workspace.d.ts +10 -0
  12. package/build/commands/auth/workspace.d.ts.map +1 -0
  13. package/build/commands/auth/workspace.js +120 -0
  14. package/build/commands/billing/subscription.d.ts.map +1 -1
  15. package/build/commands/billing/subscription.js +55 -17
  16. package/build/commands/orchestration/index.d.ts.map +1 -1
  17. package/build/commands/orchestration/index.js +2 -0
  18. package/build/commands/orchestration/query.d.ts +4 -0
  19. package/build/commands/orchestration/query.d.ts.map +1 -0
  20. package/build/commands/orchestration/query.js +23 -0
  21. package/build/commands/orchestration/run.d.ts.map +1 -1
  22. package/build/commands/orchestration/run.js +6 -1
  23. package/build/commands/runHandler.d.ts +32 -1
  24. package/build/commands/runHandler.d.ts.map +1 -1
  25. package/build/commands/runHandler.js +191 -24
  26. package/build/commands/storage/index.d.ts.map +1 -1
  27. package/build/commands/storage/index.js +2 -0
  28. package/build/commands/storage/query.d.ts +4 -0
  29. package/build/commands/storage/query.d.ts.map +1 -0
  30. package/build/commands/storage/query.js +46 -0
  31. package/build/commands/workspaceManagement/file.d.ts.map +1 -0
  32. package/build/commands/workspaceManagement/folder.d.ts.map +1 -0
  33. package/build/commands/workspaceManagement/index.d.ts +4 -0
  34. package/build/commands/workspaceManagement/index.d.ts.map +1 -0
  35. package/build/commands/workspaceManagement/index.js +19 -0
  36. package/build/commands/workspaceManagement/report.d.ts +4 -0
  37. package/build/commands/workspaceManagement/report.d.ts.map +1 -0
  38. package/build/commands/workspaceManagement/report.js +17 -0
  39. package/build/commands/workspaceManagement/role.d.ts.map +1 -0
  40. package/build/commands/workspaceManagement/token.d.ts.map +1 -0
  41. package/build/commands/{workspace → workspaceManagement}/token.js +3 -2
  42. package/build/commands/workspaceManagement/user.d.ts.map +1 -0
  43. package/build/commands/{workspace → workspaceManagement}/user.js +30 -22
  44. package/build/commands/workspaceManagement/workspaces.d.ts.map +1 -0
  45. package/build/commands/{workspace → workspaceManagement}/workspaces.js +36 -7
  46. package/build/config.d.ts +3 -1
  47. package/build/config.d.ts.map +1 -1
  48. package/build/config.js +19 -17
  49. package/build/index.js +24 -10
  50. package/build/oauthConfig.d.ts +13 -0
  51. package/build/oauthConfig.d.ts.map +1 -0
  52. package/build/oauthConfig.js +17 -0
  53. package/package.json +2 -2
  54. package/build/commands/auth.d.ts.map +0 -1
  55. package/build/commands/auth.js +0 -104
  56. package/build/commands/workspace/file.d.ts.map +0 -1
  57. package/build/commands/workspace/folder.d.ts.map +0 -1
  58. package/build/commands/workspace/index.d.ts +0 -4
  59. package/build/commands/workspace/index.d.ts.map +0 -1
  60. package/build/commands/workspace/index.js +0 -17
  61. package/build/commands/workspace/role.d.ts.map +0 -1
  62. package/build/commands/workspace/token.d.ts.map +0 -1
  63. package/build/commands/workspace/user.d.ts.map +0 -1
  64. package/build/commands/workspace/workspaces.d.ts.map +0 -1
  65. /package/build/commands/{workspace → workspaceManagement}/file.d.ts +0 -0
  66. /package/build/commands/{workspace → workspaceManagement}/file.js +0 -0
  67. /package/build/commands/{workspace → workspaceManagement}/folder.d.ts +0 -0
  68. /package/build/commands/{workspace → workspaceManagement}/folder.js +0 -0
  69. /package/build/commands/{workspace → workspaceManagement}/role.d.ts +0 -0
  70. /package/build/commands/{workspace → workspaceManagement}/role.js +0 -0
  71. /package/build/commands/{workspace → workspaceManagement}/token.d.ts +0 -0
  72. /package/build/commands/{workspace → workspaceManagement}/user.d.ts +0 -0
  73. /package/build/commands/{workspace → workspaceManagement}/workspaces.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAcxC,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAiBN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAexC,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAkBN"}
@@ -4,6 +4,7 @@ import { registerDraftReleaseCommands } from "./draftRelease.js";
4
4
  import { registerLogCommands } from "./log.js";
5
5
  import { registerNodeCommands } from "./node.js";
6
6
  import { registerPlayCommands } from "./play.js";
7
+ import { registerQueryCommands } from "./query.js";
7
8
  import { registerRecordCommands } from "./record.js";
8
9
  import { registerReleaseCommands } from "./release.js";
9
10
  import { registerRunCommands } from "./run.js";
@@ -26,4 +27,5 @@ export function registerOrchestrationCommands(parent, getApi) {
26
27
  registerRecordCommands(orchestration, getApi);
27
28
  registerTemplateCommands(orchestration, getApi);
28
29
  registerNodeCommands(orchestration, getApi);
30
+ registerQueryCommands(orchestration, getApi);
29
31
  }
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { Api } from "../../api.js";
3
+ export declare function registerQueryCommands(parent: Command, getApi: () => Api): void;
4
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CA2BN"}
@@ -0,0 +1,23 @@
1
+ import { handleApiCall, outputJson } from "../runHandler.js";
2
+ export function registerQueryCommands(parent, getApi) {
3
+ const query = parent
4
+ .command("query")
5
+ .description("Execute SQL queries against orchestration tables");
6
+ query
7
+ .command("execute")
8
+ .description("Execute a read-only SQL query")
9
+ .argument("<sql>", "SQL query string")
10
+ .addHelpText("after", `
11
+ Available tables: logs, runs, batches, records
12
+
13
+ Examples:
14
+ $ cargo-ai orchestration query execute "SELECT count() FROM runs"
15
+ $ cargo-ai orchestration query execute "SELECT status, count() FROM batches GROUP BY status"
16
+ $ cargo-ai orchestration query execute "SELECT * FROM logs ORDER BY execution_started_at DESC LIMIT 10"
17
+ $ cargo-ai orchestration query execute "WITH recent AS (SELECT * FROM runs WHERE created_at > now() - INTERVAL 1 DAY) SELECT status, count() FROM recent GROUP BY status"`)
18
+ .action(async (sql) => {
19
+ const api = getApi();
20
+ const result = await handleApiCall(() => api.orchestration.query.execute({ query: sql }));
21
+ outputJson(result);
22
+ });
23
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAQxC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CAsiB5E"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/orchestration/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAQxC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CA+iB5E"}
@@ -222,11 +222,14 @@ Examples:
222
222
  .option("--executions-filter <json>", "Filter by node executions (JSON object, same format as 'run list')")
223
223
  .option("--created-after <date>", "Filter runs created after this date (ISO 8601 string)")
224
224
  .option("--created-before <date>", "Filter runs created before this date (ISO 8601 string)")
225
+ .option("--limit <n>", "Max runs to include in the export (integer)")
226
+ .option("--offset <n>", "Number of runs to skip before exporting (integer)")
225
227
  .addHelpText("after", `
226
228
  Examples:
227
229
  $ cargo-ai orchestration run download-outputs --workflow-uuid 550e8400-... --output-node-slug my-output
228
230
  $ cargo-ai orchestration run download-outputs --workflow-uuid 550e8400-... --output-node-slug my-output --format json
229
- $ cargo-ai orchestration run download-outputs --workflow-uuid 550e8400-... --output-node-slug my-output --statuses finished --is-finished`)
231
+ $ cargo-ai orchestration run download-outputs --workflow-uuid 550e8400-... --output-node-slug my-output --statuses finished --is-finished
232
+ $ cargo-ai orchestration run download-outputs --workflow-uuid 550e8400-... --output-node-slug my-output --limit 1000 --offset 2000`)
230
233
  .action(async (opts) => {
231
234
  const api = getApi();
232
235
  const result = await handleApiCall(() => api.orchestration.run.downloadOutputs({
@@ -251,6 +254,8 @@ Examples:
251
254
  : undefined,
252
255
  createdAfter: opts.createdAfter,
253
256
  createdBefore: opts.createdBefore,
257
+ limit: opts.limit !== undefined ? parseInt(opts.limit, 10) : undefined,
258
+ offset: opts.offset !== undefined ? parseInt(opts.offset, 10) : undefined,
254
259
  }));
255
260
  outputJson(result);
256
261
  });
@@ -1,7 +1,38 @@
1
+ export declare const ExitCodes: {
2
+ readonly Success: 0;
3
+ readonly GenericError: 1;
4
+ readonly InvalidUsage: 2;
5
+ readonly NotAuthenticated: 3;
6
+ readonly PermissionDenied: 4;
7
+ readonly NotFound: 5;
8
+ };
9
+ export type ExitCode = (typeof ExitCodes)[keyof typeof ExitCodes];
10
+ export declare const colors: {
11
+ red: (s: string) => string;
12
+ green: (s: string) => string;
13
+ yellow: (s: string) => string;
14
+ cyan: (s: string) => string;
15
+ dim: (s: string) => string;
16
+ bold: (s: string) => string;
17
+ };
1
18
  export declare function outputJson(value: unknown): void;
19
+ export declare function info(message: string): void;
20
+ export declare function success(message: string): void;
21
+ type FailWithOpts = {
22
+ code?: ExitCode;
23
+ extra?: Record<string, unknown>;
24
+ };
25
+ export declare function failWith(message: string, opts?: FailWithOpts): never;
26
+ export declare function startSpinner(message: string): {
27
+ stop: () => void;
28
+ };
2
29
  export declare function parseJson(value: string, optionName: string): any;
3
- export declare function handleApiCall<T>(fn: () => Promise<T>): Promise<T | never>;
30
+ type HandleApiCallOpts = {
31
+ spinner?: string | false;
32
+ };
33
+ export declare function handleApiCall<T>(fn: () => Promise<T>, opts?: HandleApiCallOpts): Promise<T>;
4
34
  export declare function pollRunUntilFinished<T>(getResult: () => Promise<T>, getStatus: (result: T) => string, intervalMs: number): Promise<T>;
5
35
  export declare function pollBatchUntilFinished<T>(getResult: () => Promise<T>, getStatus: (result: T) => string, intervalMs: number): Promise<T>;
6
36
  export declare function pollMessageUntilFinished<T>(getResult: () => Promise<T>, getFinishedAt: (result: T) => string | null | undefined, intervalMs: number): Promise<T>;
37
+ export {};
7
38
  //# sourceMappingURL=runHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runHandler.d.ts","sourceRoot":"","sources":["../../src/commands/runHandler.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/C;AAGD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,GAAG,CAWhE;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAiBpB;AAoBD,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,EACvD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAWZ"}
1
+ {"version":3,"file":"runHandler.d.ts","sourceRoot":"","sources":["../../src/commands/runHandler.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;;;;;;CAOZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAclE,eAAO,MAAM,MAAM;aACR,MAAM,KAAG,MAAM;eACb,MAAM,KAAG,MAAM;gBACd,MAAM,KAAG,MAAM;cACjB,MAAM,KAAG,MAAM;aAChB,MAAM,KAAG,MAAM;cACd,MAAM,KAAG,MAAM;CAC1B,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAM/C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,KAAK,YAAY,GAAG;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,KAAK,CAyBpE;AAKD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CA4BlE;AAGD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,GAAG,CAQhE;AAKD,KAAK,iBAAiB,GAAG;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC1B,CAAC;AAEF,wBAAsB,aAAa,CAAC,CAAC,EACnC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,CAAC,CAAC,CAAC,CAiDZ;AAmFD,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,EACvD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -1,6 +1,92 @@
1
1
  import { determineIfIsFetcherError } from "@cargo-ai/api";
2
+ export const ExitCodes = {
3
+ Success: 0,
4
+ GenericError: 1,
5
+ InvalidUsage: 2,
6
+ NotAuthenticated: 3,
7
+ PermissionDenied: 4,
8
+ NotFound: 5,
9
+ };
10
+ const useColor = process.stderr.isTTY === true &&
11
+ process.env["NO_COLOR"] === undefined &&
12
+ process.env["CI"] !== "true";
13
+ const colorize = (text, code) => {
14
+ if (useColor !== true) {
15
+ return text;
16
+ }
17
+ return `\x1B[${code}m${text}\x1B[0m`;
18
+ };
19
+ export const colors = {
20
+ red: (s) => colorize(s, "31"),
21
+ green: (s) => colorize(s, "32"),
22
+ yellow: (s) => colorize(s, "33"),
23
+ cyan: (s) => colorize(s, "36"),
24
+ dim: (s) => colorize(s, "2"),
25
+ bold: (s) => colorize(s, "1"),
26
+ };
2
27
  export function outputJson(value) {
3
- console.log(JSON.stringify(value, null, 2));
28
+ if (process.stdout.isTTY === true) {
29
+ console.log(JSON.stringify(value, null, 2));
30
+ return;
31
+ }
32
+ console.log(JSON.stringify(value));
33
+ }
34
+ export function info(message) {
35
+ console.error(message);
36
+ }
37
+ export function success(message) {
38
+ console.error(`${colors.green("✓")} ${message}`);
39
+ }
40
+ export function failWith(message, opts) {
41
+ const code = opts !== undefined && opts.code !== undefined
42
+ ? opts.code
43
+ : ExitCodes.GenericError;
44
+ const extra = opts !== undefined ? opts.extra : undefined;
45
+ if (process.stderr.isTTY === true) {
46
+ process.stderr.write(`${colors.red("✗")} ${message}\n`);
47
+ if (extra !== undefined) {
48
+ for (const [key, value] of Object.entries(extra)) {
49
+ const valueStr = typeof value === "string" ? value : JSON.stringify(value);
50
+ process.stderr.write(` ${colors.dim(`${key}:`)} ${valueStr}\n`);
51
+ }
52
+ }
53
+ }
54
+ else {
55
+ const payload = { error: message };
56
+ if (extra !== undefined) {
57
+ Object.assign(payload, extra);
58
+ }
59
+ console.error(JSON.stringify(payload));
60
+ }
61
+ process.exit(code);
62
+ }
63
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
64
+ const SPINNER_INTERVAL_MS = 80;
65
+ export function startSpinner(message) {
66
+ if (process.stderr.isTTY !== true) {
67
+ process.stderr.write(`${message}\n`);
68
+ return { stop: () => undefined };
69
+ }
70
+ process.stderr.write("\x1B[?25l");
71
+ let frame = 0;
72
+ const id = setInterval(() => {
73
+ const ch = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];
74
+ if (ch !== undefined) {
75
+ process.stderr.write(`\r${colors.cyan(ch)} ${colors.dim(message)}`);
76
+ }
77
+ frame += 1;
78
+ }, SPINNER_INTERVAL_MS);
79
+ let stopped = false;
80
+ return {
81
+ stop: () => {
82
+ if (stopped) {
83
+ return;
84
+ }
85
+ stopped = true;
86
+ clearInterval(id);
87
+ process.stderr.write("\r\x1B[K\x1B[?25h");
88
+ },
89
+ };
4
90
  }
5
91
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
92
  export function parseJson(value, optionName) {
@@ -8,28 +94,109 @@ export function parseJson(value, optionName) {
8
94
  return JSON.parse(value);
9
95
  }
10
96
  catch {
11
- console.error(JSON.stringify({
12
- error: `Invalid JSON for ${optionName}: ${value}`,
13
- }));
14
- process.exit(1);
97
+ failWith(`Invalid JSON for ${optionName}: ${value}`, {
98
+ code: ExitCodes.InvalidUsage,
99
+ });
15
100
  }
16
101
  }
17
- export async function handleApiCall(fn) {
102
+ const SPINNER_DELAY_MS = 200;
103
+ const DEFAULT_SPINNER_MESSAGE = "Loading...";
104
+ export async function handleApiCall(fn, opts) {
105
+ const spinnerMessage = opts !== undefined && opts.spinner === false
106
+ ? undefined
107
+ : opts !== undefined && typeof opts.spinner === "string"
108
+ ? opts.spinner
109
+ : DEFAULT_SPINNER_MESSAGE;
110
+ let spinner;
111
+ let startTimer;
112
+ if (spinnerMessage !== undefined) {
113
+ startTimer = setTimeout(() => {
114
+ spinner = startSpinner(spinnerMessage);
115
+ }, SPINNER_DELAY_MS);
116
+ }
117
+ const stopAll = () => {
118
+ if (startTimer !== undefined) {
119
+ clearTimeout(startTimer);
120
+ }
121
+ if (spinner !== undefined) {
122
+ spinner.stop();
123
+ }
124
+ };
18
125
  try {
19
- return await fn();
20
- }
21
- catch (err) {
22
- if (determineIfIsFetcherError(err)) {
23
- const e = err;
24
- console.error(JSON.stringify({
25
- error: "API error",
26
- status: e.status !== undefined ? e.status : "unknown",
27
- body: e.body !== undefined ? e.body : String(err),
28
- }));
29
- process.exit(1);
126
+ const result = await fn();
127
+ stopAll();
128
+ return result;
129
+ }
130
+ catch (error) {
131
+ stopAll();
132
+ if (determineIfIsFetcherError(error)) {
133
+ const parsedError = error;
134
+ const status = parsedError.status;
135
+ const body = parsedError.body !== undefined ? parsedError.body : String(error);
136
+ const { message, code } = describeApiError(status, body);
137
+ failWith(message, {
138
+ code,
139
+ extra: { status: status !== undefined ? status : "unknown", body },
140
+ });
141
+ }
142
+ throw error;
143
+ }
144
+ }
145
+ function describeApiError(status, body) {
146
+ const detail = extractApiErrorDetail(body);
147
+ const detailSuffix = detail !== undefined ? `: ${detail}` : "";
148
+ if (status === 401) {
149
+ return {
150
+ message: `Not authenticated${detailSuffix}. Run \`cargo-ai login\` to refresh credentials.`,
151
+ code: ExitCodes.NotAuthenticated,
152
+ };
153
+ }
154
+ if (status === 403) {
155
+ return {
156
+ message: `Permission denied${detailSuffix}. Check your workspace permissions or selected workspace UUID.`,
157
+ code: ExitCodes.PermissionDenied,
158
+ };
159
+ }
160
+ if (status === 404) {
161
+ return {
162
+ message: `Not found${detailSuffix}. Verify the UUID(s) you passed.`,
163
+ code: ExitCodes.NotFound,
164
+ };
165
+ }
166
+ if (status === 429) {
167
+ return {
168
+ message: `Rate limited${detailSuffix}. Retry in a moment.`,
169
+ code: ExitCodes.GenericError,
170
+ };
171
+ }
172
+ if (status !== undefined && status >= 500) {
173
+ return {
174
+ message: `Server error (${String(status)})${detailSuffix}. Retry shortly or check status.cargo.io.`,
175
+ code: ExitCodes.GenericError,
176
+ };
177
+ }
178
+ return {
179
+ message: `API error (${status !== undefined ? String(status) : "unknown"})${detailSuffix}`,
180
+ code: ExitCodes.GenericError,
181
+ };
182
+ }
183
+ function extractApiErrorDetail(body) {
184
+ if (typeof body === "string" && body.length > 0) {
185
+ return body;
186
+ }
187
+ if (body !== null && typeof body === "object") {
188
+ const record = body;
189
+ if (typeof record["message"] === "string") {
190
+ return record["message"];
191
+ }
192
+ if (typeof record["reason"] === "string") {
193
+ return record["reason"];
194
+ }
195
+ if (typeof record["error"] === "string") {
196
+ return record["error"];
30
197
  }
31
- throw err;
32
198
  }
199
+ return undefined;
33
200
  }
34
201
  function sleep(ms) {
35
202
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -47,27 +214,27 @@ const TERMINAL_BATCH_STATUSES = new Set([
47
214
  "skipped",
48
215
  ]);
49
216
  export async function pollRunUntilFinished(getResult, getStatus, intervalMs) {
50
- let result = await handleApiCall(getResult);
217
+ let result = await handleApiCall(getResult, { spinner: false });
51
218
  while (!TERMINAL_RUN_STATUSES.has(getStatus(result))) {
52
219
  await sleep(intervalMs);
53
- result = await handleApiCall(getResult);
220
+ result = await handleApiCall(getResult, { spinner: false });
54
221
  }
55
222
  return result;
56
223
  }
57
224
  export async function pollBatchUntilFinished(getResult, getStatus, intervalMs) {
58
- let result = await handleApiCall(getResult);
225
+ let result = await handleApiCall(getResult, { spinner: false });
59
226
  while (!TERMINAL_BATCH_STATUSES.has(getStatus(result))) {
60
227
  await sleep(intervalMs);
61
- result = await handleApiCall(getResult);
228
+ result = await handleApiCall(getResult, { spinner: false });
62
229
  }
63
230
  return result;
64
231
  }
65
232
  export async function pollMessageUntilFinished(getResult, getFinishedAt, intervalMs) {
66
- let result = await handleApiCall(getResult);
233
+ let result = await handleApiCall(getResult, { spinner: false });
67
234
  const finishedAt = getFinishedAt(result);
68
235
  while (finishedAt === null || finishedAt === undefined) {
69
236
  await sleep(intervalMs);
70
- result = await handleApiCall(getResult);
237
+ result = await handleApiCall(getResult, { spinner: false });
71
238
  }
72
239
  return result;
73
240
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAQxC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAWN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AASxC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAYN"}
@@ -1,6 +1,7 @@
1
1
  import { registerColumnCommands } from "./column.js";
2
2
  import { registerDatasetCommands } from "./dataset.js";
3
3
  import { registerModelCommands } from "./model.js";
4
+ import { registerQueryCommands } from "./query.js";
4
5
  import { registerRecordCommands } from "./record.js";
5
6
  import { registerRelationshipCommands } from "./relationship.js";
6
7
  import { registerRunCommands } from "./run.js";
@@ -14,4 +15,5 @@ export function registerStorageCommands(parent, getApi) {
14
15
  registerRunCommands(storage, getApi);
15
16
  registerRecordCommands(storage, getApi);
16
17
  registerColumnCommands(storage, getApi);
18
+ registerQueryCommands(storage, getApi);
17
19
  }
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { Api } from "../../api.js";
3
+ export declare function registerQueryCommands(parent: Command, getApi: () => Api): void;
4
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/storage/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CA4DN"}
@@ -0,0 +1,46 @@
1
+ import { handleApiCall, outputJson } from "../runHandler.js";
2
+ export function registerQueryCommands(parent, getApi) {
3
+ const query = parent
4
+ .command("query")
5
+ .description("Execute SQL queries against storage models");
6
+ query
7
+ .command("execute")
8
+ .description("Execute a read-only SQL query against storage models")
9
+ .argument("<sql>", "SQL query string")
10
+ .addHelpText("after", `
11
+ Tables must be referenced as [datasetSlug].[modelSlug] and are rewritten
12
+ to the underlying warehouse table under the hood.
13
+
14
+ Examples:
15
+ $ cargo-ai storage query execute "SELECT count(*) FROM my_dataset.my_model"
16
+ $ cargo-ai storage query execute "SELECT a._id FROM sales.accounts a JOIN sales.contacts c ON c.account_id = a._id"
17
+ $ cargo-ai storage query execute "WITH recent AS (SELECT * FROM sales.accounts) SELECT count(*) FROM recent"`)
18
+ .action(async (sql) => {
19
+ const api = getApi();
20
+ const result = await handleApiCall(() => api.storage.query.execute({ query: sql }));
21
+ outputJson(result);
22
+ });
23
+ query
24
+ .command("download")
25
+ .description("Download the result of a SQL query against storage models as files")
26
+ .requiredOption("--query <sql>", "SQL query string")
27
+ .option("--format <format>", "Download format (csv or parquet)", "csv")
28
+ .addHelpText("after", `
29
+ Tables must be referenced as [datasetSlug].[modelSlug] and are rewritten
30
+ to the underlying warehouse table under the hood. Returns signed URLs to
31
+ download the resulting files.
32
+
33
+ Examples:
34
+ $ cargo-ai storage query download --query "SELECT * FROM my_dataset.my_model"
35
+ $ cargo-ai storage query download --query "SELECT * FROM sales.accounts" --format parquet`)
36
+ .action(async (opts) => {
37
+ const api = getApi();
38
+ const format = opts.format === "parquet"
39
+ ? "parquet"
40
+ : opts.format === "csv"
41
+ ? "csv"
42
+ : undefined;
43
+ const result = await handleApiCall(() => api.storage.query.download({ query: opts.query, format }));
44
+ outputJson(result);
45
+ });
46
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CA+C7E"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/folder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CA6FN"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { Api } from "../../api.js";
3
+ export declare function registerWorkspaceManagementCommands(parent: Command, getApi: () => Api): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AASxC,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAYN"}
@@ -0,0 +1,19 @@
1
+ import { registerFileCommands } from "./file.js";
2
+ import { registerFolderCommands } from "./folder.js";
3
+ import { registerReportCommands } from "./report.js";
4
+ import { registerRoleCommands } from "./role.js";
5
+ import { registerTokenCommands } from "./token.js";
6
+ import { registerUserCommands } from "./user.js";
7
+ import { registerWorkspacesCommands } from "./workspaces.js";
8
+ export function registerWorkspaceManagementCommands(parent, getApi) {
9
+ const workspaceManagement = parent
10
+ .command("workspaceManagement")
11
+ .description("Workspaces, users, tokens, roles, folders, reports");
12
+ registerWorkspacesCommands(workspaceManagement, getApi);
13
+ registerUserCommands(workspaceManagement, getApi);
14
+ registerTokenCommands(workspaceManagement, getApi);
15
+ registerRoleCommands(workspaceManagement, getApi);
16
+ registerFolderCommands(workspaceManagement, getApi);
17
+ registerFileCommands(workspaceManagement, getApi);
18
+ registerReportCommands(workspaceManagement, getApi);
19
+ }
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { Api } from "../../api.js";
3
+ export declare function registerReportCommands(parent: Command, getApi: () => Api): void;
4
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAkBN"}
@@ -0,0 +1,17 @@
1
+ import { handleApiCall, outputJson } from "../runHandler.js";
2
+ export function registerReportCommands(parent, getApi) {
3
+ const report = parent.command("report").description("Report operations");
4
+ report
5
+ .command("create")
6
+ .description("Submit a report for the current workspace")
7
+ .requiredOption("--title <title>", "Report title")
8
+ .requiredOption("--description <description>", "Report description")
9
+ .action(async (opts) => {
10
+ const api = getApi();
11
+ const result = await handleApiCall(() => api.workspaceManagement.report.create({
12
+ title: opts.title,
13
+ description: opts.description,
14
+ }));
15
+ outputJson(result);
16
+ });
17
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/role.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CAa7E"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,GAChB,IAAI,CAqCN"}
@@ -12,11 +12,12 @@ export function registerTokenCommands(parent, getApi) {
12
12
  token
13
13
  .command("create")
14
14
  .description("Create a token")
15
- .option("--from-user", "Create token from current user")
15
+ .requiredOption("--name <name>", "Name of the token")
16
16
  .action(async (opts) => {
17
17
  const api = getApi();
18
18
  const result = await handleApiCall(() => api.workspaceManagement.token.create({
19
- fromUser: opts.fromUser !== undefined ? opts.fromUser : true,
19
+ name: opts.name,
20
+ permissions: null,
20
21
  }));
21
22
  outputJson(result);
22
23
  });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaceManagement/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CA8M7E"}