@alvera-ai/platform-sdk 0.5.2 → 0.6.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 (109) hide show
  1. package/README.md +34 -0
  2. package/package.json +10 -11
  3. package/src/cli.ts +1386 -0
  4. package/src/client.ts +930 -0
  5. package/src/config.ts +205 -0
  6. package/src/environments.generated.ts +16 -0
  7. package/src/generated/client/client.gen.ts +298 -0
  8. package/src/generated/client/index.ts +25 -0
  9. package/src/generated/client/types.gen.ts +214 -0
  10. package/src/generated/client/utils.gen.ts +316 -0
  11. package/{dist/generated/client.gen.d.ts → src/generated/client.gen.ts} +6 -3
  12. package/src/generated/core/auth.gen.ts +41 -0
  13. package/src/generated/core/bodySerializer.gen.ts +82 -0
  14. package/src/generated/core/params.gen.ts +169 -0
  15. package/src/generated/core/pathSerializer.gen.ts +171 -0
  16. package/src/generated/core/queryKeySerializer.gen.ts +117 -0
  17. package/src/generated/core/serverSentEvents.gen.ts +242 -0
  18. package/src/generated/core/types.gen.ts +104 -0
  19. package/src/generated/core/utils.gen.ts +140 -0
  20. package/src/generated/index.ts +4 -0
  21. package/src/generated/sdk.gen.ts +1756 -0
  22. package/{dist/generated/types.gen.d.ts → src/generated/types.gen.ts} +2243 -131
  23. package/{dist/generated/valibot.gen.js → src/generated/valibot.gen.ts} +1362 -53
  24. package/src/index.ts +69 -0
  25. package/dist/cli.d.ts +0 -3
  26. package/dist/cli.d.ts.map +0 -1
  27. package/dist/cli.js +0 -1008
  28. package/dist/cli.js.map +0 -1
  29. package/dist/client.d.ts +0 -529
  30. package/dist/client.d.ts.map +0 -1
  31. package/dist/client.js +0 -421
  32. package/dist/client.js.map +0 -1
  33. package/dist/config.d.ts +0 -34
  34. package/dist/config.d.ts.map +0 -1
  35. package/dist/config.js +0 -146
  36. package/dist/config.js.map +0 -1
  37. package/dist/environments.generated.d.ts +0 -21
  38. package/dist/environments.generated.d.ts.map +0 -1
  39. package/dist/environments.generated.js +0 -8
  40. package/dist/environments.generated.js.map +0 -1
  41. package/dist/generated/client/client.gen.d.ts +0 -3
  42. package/dist/generated/client/client.gen.d.ts.map +0 -1
  43. package/dist/generated/client/client.gen.js +0 -236
  44. package/dist/generated/client/client.gen.js.map +0 -1
  45. package/dist/generated/client/index.d.ts +0 -9
  46. package/dist/generated/client/index.d.ts.map +0 -1
  47. package/dist/generated/client/index.js +0 -7
  48. package/dist/generated/client/index.js.map +0 -1
  49. package/dist/generated/client/types.gen.d.ts +0 -118
  50. package/dist/generated/client/types.gen.d.ts.map +0 -1
  51. package/dist/generated/client/types.gen.js +0 -3
  52. package/dist/generated/client/types.gen.js.map +0 -1
  53. package/dist/generated/client/utils.gen.d.ts +0 -34
  54. package/dist/generated/client/utils.gen.d.ts.map +0 -1
  55. package/dist/generated/client/utils.gen.js +0 -229
  56. package/dist/generated/client/utils.gen.js.map +0 -1
  57. package/dist/generated/client.gen.d.ts.map +0 -1
  58. package/dist/generated/client.gen.js +0 -4
  59. package/dist/generated/client.gen.js.map +0 -1
  60. package/dist/generated/core/auth.gen.d.ts +0 -19
  61. package/dist/generated/core/auth.gen.d.ts.map +0 -1
  62. package/dist/generated/core/auth.gen.js +0 -15
  63. package/dist/generated/core/auth.gen.js.map +0 -1
  64. package/dist/generated/core/bodySerializer.gen.d.ts +0 -26
  65. package/dist/generated/core/bodySerializer.gen.d.ts.map +0 -1
  66. package/dist/generated/core/bodySerializer.gen.js +0 -58
  67. package/dist/generated/core/bodySerializer.gen.js.map +0 -1
  68. package/dist/generated/core/params.gen.d.ts +0 -44
  69. package/dist/generated/core/params.gen.d.ts.map +0 -1
  70. package/dist/generated/core/params.gen.js +0 -101
  71. package/dist/generated/core/params.gen.js.map +0 -1
  72. package/dist/generated/core/pathSerializer.gen.d.ts +0 -34
  73. package/dist/generated/core/pathSerializer.gen.d.ts.map +0 -1
  74. package/dist/generated/core/pathSerializer.gen.js +0 -107
  75. package/dist/generated/core/pathSerializer.gen.js.map +0 -1
  76. package/dist/generated/core/queryKeySerializer.gen.d.ts +0 -19
  77. package/dist/generated/core/queryKeySerializer.gen.d.ts.map +0 -1
  78. package/dist/generated/core/queryKeySerializer.gen.js +0 -93
  79. package/dist/generated/core/queryKeySerializer.gen.js.map +0 -1
  80. package/dist/generated/core/serverSentEvents.gen.d.ts +0 -72
  81. package/dist/generated/core/serverSentEvents.gen.d.ts.map +0 -1
  82. package/dist/generated/core/serverSentEvents.gen.js +0 -133
  83. package/dist/generated/core/serverSentEvents.gen.js.map +0 -1
  84. package/dist/generated/core/types.gen.d.ts +0 -79
  85. package/dist/generated/core/types.gen.d.ts.map +0 -1
  86. package/dist/generated/core/types.gen.js +0 -3
  87. package/dist/generated/core/types.gen.js.map +0 -1
  88. package/dist/generated/core/utils.gen.d.ts +0 -20
  89. package/dist/generated/core/utils.gen.d.ts.map +0 -1
  90. package/dist/generated/core/utils.gen.js +0 -88
  91. package/dist/generated/core/utils.gen.js.map +0 -1
  92. package/dist/generated/index.d.ts +0 -3
  93. package/dist/generated/index.d.ts.map +0 -1
  94. package/dist/generated/index.js +0 -3
  95. package/dist/generated/index.js.map +0 -1
  96. package/dist/generated/sdk.gen.d.ts +0 -519
  97. package/dist/generated/sdk.gen.d.ts.map +0 -1
  98. package/dist/generated/sdk.gen.js +0 -1382
  99. package/dist/generated/sdk.gen.js.map +0 -1
  100. package/dist/generated/types.gen.d.ts.map +0 -1
  101. package/dist/generated/types.gen.js +0 -3
  102. package/dist/generated/types.gen.js.map +0 -1
  103. package/dist/generated/valibot.gen.d.ts +0 -35016
  104. package/dist/generated/valibot.gen.d.ts.map +0 -1
  105. package/dist/generated/valibot.gen.js.map +0 -1
  106. package/dist/index.d.ts +0 -2
  107. package/dist/index.d.ts.map +0 -1
  108. package/dist/index.js +0 -2
  109. package/dist/index.js.map +0 -1
package/dist/cli.js DELETED
@@ -1,1008 +0,0 @@
1
- #!/usr/bin/env node
2
- import { readFileSync } from 'node:fs';
3
- import { createInterface } from 'node:readline';
4
- import { dirname, resolve } from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
- import { Command, Option } from 'commander';
7
- import { ValiError } from 'valibot';
8
- import { createPlatformApi, createSession, revokeSession } from './client.js';
9
- const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
10
- const { version: packageVersion } = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
11
- import { CONFIG_PATHS, DEFAULT_ENVIRONMENT, ENVIRONMENTS, clearProfileCreds, getProfileName, readProfileConfig, resolveProfile, writeProfileConfig, writeProfileCreds, } from './config.js';
12
- const ENVIRONMENT_NAMES = Object.keys(ENVIRONMENTS);
13
- // ---------------------------------------------------------------------------
14
- // Helpers
15
- // ---------------------------------------------------------------------------
16
- function out(value) {
17
- process.stdout.write(JSON.stringify(value, null, 2) + '\n');
18
- }
19
- function die(message, code = 1) {
20
- process.stderr.write(`alvera: ${message}\n`);
21
- process.exit(code);
22
- }
23
- async function prompt(question, { hidden = false } = {}) {
24
- const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
25
- if (!hidden) {
26
- return new Promise((resolve) => rl.question(question, (ans) => {
27
- rl.close();
28
- resolve(ans);
29
- }));
30
- }
31
- // Hidden input — mute output by replacing _writeToOutput.
32
- const anyRl = rl;
33
- const originalWrite = anyRl._writeToOutput.bind(rl);
34
- anyRl._writeToOutput = (s) => {
35
- if (s.includes(question))
36
- originalWrite(s);
37
- else
38
- originalWrite('');
39
- };
40
- return new Promise((resolve) => rl.question(question, (ans) => {
41
- rl.close();
42
- process.stderr.write('\n');
43
- resolve(ans);
44
- }));
45
- }
46
- function readBody(body, bodyFile) {
47
- if (body && bodyFile)
48
- die('use only one of --body or --body-file');
49
- let raw;
50
- if (body)
51
- raw = body;
52
- else if (bodyFile === '-')
53
- raw = readFileSync(0, 'utf8');
54
- else if (bodyFile)
55
- raw = readFileSync(bodyFile, 'utf8');
56
- else
57
- die('missing request body (pass --body <json> or --body-file <path>)');
58
- try {
59
- const parsed = JSON.parse(raw);
60
- if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
61
- die('body must be a JSON object');
62
- }
63
- return parsed;
64
- }
65
- catch (err) {
66
- die(`invalid JSON in body: ${err.message}`);
67
- }
68
- }
69
- function resolveTenant(explicit, profileTenant) {
70
- const tenant = explicit ?? profileTenant;
71
- if (!tenant)
72
- die('tenant slug required (pass as argument or set `tenant_slug` in the profile)');
73
- return tenant;
74
- }
75
- function authedApi(opts) {
76
- const profile = getProfileName(opts.profile);
77
- const resolved = resolveProfile(profile);
78
- if (!resolved.sessionToken) {
79
- die(`no session token for profile "${profile}". ` +
80
- `Run \`alvera login --profile ${profile}\` or set ALVERA_SESSION_TOKEN.`);
81
- }
82
- if (resolved.expiresAt && new Date(resolved.expiresAt) < new Date()) {
83
- die(`session for profile "${profile}" expired at ${resolved.expiresAt}. ` +
84
- `Run \`alvera login --profile ${profile}\` to refresh.`);
85
- }
86
- return { api: createPlatformApi({ baseUrl: resolved.baseUrl, sessionToken: resolved.sessionToken }), resolved };
87
- }
88
- async function run(fn) {
89
- try {
90
- const result = await fn();
91
- if (result !== undefined)
92
- out(result);
93
- }
94
- catch (err) {
95
- die(formatError(err));
96
- }
97
- }
98
- function formatError(err) {
99
- if (err instanceof ValiError) {
100
- const lines = err.issues.map((issue) => {
101
- const path = (issue.path ?? [])
102
- .map((p) => String(p.key ?? '?'))
103
- .join('.') || '(root)';
104
- return ` ${path}: ${issue.message}`;
105
- });
106
- return `validation failed:\n${lines.join('\n')}`;
107
- }
108
- if (err instanceof Error)
109
- return err.message;
110
- if (err && typeof err === 'object') {
111
- const detail = err.errors?.detail;
112
- if (typeof detail === 'string')
113
- return detail;
114
- return JSON.stringify(err, null, 2);
115
- }
116
- return String(err);
117
- }
118
- // ---------------------------------------------------------------------------
119
- // Program
120
- // ---------------------------------------------------------------------------
121
- const program = new Command();
122
- program
123
- .name('alvera')
124
- .description('Alvera platform CLI')
125
- .version(packageVersion, '-v, --version', 'print the installed version')
126
- .addOption(new Option('--profile <name>', 'config profile to use').default('default'))
127
- .addOption(new Option('--env <name>', `environment from spec/openapi.yaml (${ENVIRONMENT_NAMES.join(', ')})`))
128
- .showHelpAfterError()
129
- .hook('preAction', (thisCommand) => {
130
- const env = thisCommand.optsWithGlobals().env;
131
- if (env !== undefined)
132
- process.env.ALVERA_ENV = env;
133
- const candidate = process.env.ALVERA_ENV;
134
- if (candidate !== undefined && !ENVIRONMENT_NAMES.includes(candidate)) {
135
- die(`unknown environment "${candidate}". Valid: ${ENVIRONMENT_NAMES.join(', ')}`);
136
- }
137
- });
138
- // -- configure --------------------------------------------------------------
139
- program
140
- .command('configure')
141
- .description('Interactively set defaults (environment, tenant, email) for a profile')
142
- .action(async () => {
143
- const profile = getProfileName(program.opts().profile);
144
- const current = resolveProfile(profile);
145
- const currentCfg = readProfileConfig(profile);
146
- const options = ENVIRONMENT_NAMES.map((name) => `${name} (${ENVIRONMENTS[name].base_url})`).join(', ');
147
- const defaultChoice = currentCfg.environment ?? current.environment;
148
- const envInput = (await prompt(`Environment [${defaultChoice}] — one of: ${options}, or a custom URL: `)) ||
149
- defaultChoice;
150
- const patch = {};
151
- const unset = [];
152
- if (ENVIRONMENT_NAMES.includes(envInput)) {
153
- patch.environment = envInput;
154
- unset.push('base_url');
155
- }
156
- else if (/^https?:\/\//.test(envInput)) {
157
- patch.base_url = envInput;
158
- unset.push('environment');
159
- }
160
- else {
161
- die(`"${envInput}" is not a known environment or a URL. ` +
162
- `Valid: ${ENVIRONMENT_NAMES.join(', ')} or http(s)://…`);
163
- }
164
- patch.tenant_slug =
165
- (await prompt(`Default tenant slug [${current.tenantSlug ?? ''}]: `)) || current.tenantSlug || '';
166
- patch.email = (await prompt(`Email [${current.email ?? ''}]: `)) || current.email || '';
167
- writeProfileConfig(profile, patch, unset);
168
- process.stderr.write(`Saved profile "${profile}" → ${CONFIG_PATHS.config}\n`);
169
- });
170
- // -- login ------------------------------------------------------------------
171
- program
172
- .command('login')
173
- .description('Exchange credentials for a session token and store it')
174
- .option('--email <email>')
175
- .option('--password <password>')
176
- .option('--tenant <slug>')
177
- .option('--base-url <url>')
178
- .option('--expires-in <seconds>', 'session duration (default 86400, max 2592000)')
179
- .action(async (opts) => {
180
- const profile = getProfileName(program.opts().profile);
181
- const current = resolveProfile(profile);
182
- const baseUrl = opts.baseUrl ?? current.baseUrl;
183
- const email = opts.email ?? current.email ?? (await prompt('Email: '));
184
- const password = opts.password ?? process.env.ALVERA_PASSWORD ?? (await prompt('Password: ', { hidden: true }));
185
- const tenant = opts.tenant ?? current.tenantSlug ?? (await prompt('Tenant slug: '));
186
- if (!email || !password || !tenant)
187
- die('email, password, and tenant are required');
188
- await run(async () => {
189
- const session = await createSession({
190
- baseUrl,
191
- email,
192
- password,
193
- tenantSlug: tenant,
194
- expiresIn: opts.expiresIn ? Number(opts.expiresIn) : undefined,
195
- });
196
- // Only pin base_url into the profile when the user explicitly overrode it.
197
- // Otherwise the environment selection (profile.environment) keeps driving baseUrl.
198
- writeProfileConfig(profile, {
199
- ...(opts.baseUrl ? { base_url: baseUrl } : {}),
200
- tenant_slug: tenant,
201
- email,
202
- });
203
- writeProfileCreds(profile, {
204
- session_token: session.sessionToken,
205
- expires_at: session.expiresAt ?? '',
206
- });
207
- process.stderr.write(`Logged in as ${email} → tenant "${session.tenant.slug}" (profile "${profile}").\n` +
208
- `Token stored in ${CONFIG_PATHS.credentials}\n` +
209
- (session.expiresAt ? `Expires at ${session.expiresAt}\n` : ''));
210
- return undefined;
211
- });
212
- });
213
- // -- logout -----------------------------------------------------------------
214
- program
215
- .command('logout')
216
- .description('Revoke the current session and clear stored credentials')
217
- .action(async () => {
218
- const profile = getProfileName(program.opts().profile);
219
- const resolved = resolveProfile(profile);
220
- if (resolved.sessionToken) {
221
- createPlatformApi({ baseUrl: resolved.baseUrl, sessionToken: resolved.sessionToken });
222
- try {
223
- await revokeSession();
224
- }
225
- catch {
226
- // Token may already be invalid/expired — clear local state anyway.
227
- }
228
- }
229
- clearProfileCreds(profile);
230
- process.stderr.write(`Cleared credentials for profile "${profile}".\n`);
231
- });
232
- // -- whoami -----------------------------------------------------------------
233
- program
234
- .command('whoami')
235
- .description('Print the current profile configuration')
236
- .action(() => {
237
- const profile = getProfileName(program.opts().profile);
238
- const resolved = resolveProfile(profile);
239
- out({
240
- profile: resolved.profile,
241
- environment: resolved.environment,
242
- baseUrl: resolved.baseUrl,
243
- tenantSlug: resolved.tenantSlug,
244
- email: resolved.email,
245
- hasSessionToken: Boolean(resolved.sessionToken),
246
- expiresAt: resolved.expiresAt,
247
- });
248
- });
249
- // -- ping -------------------------------------------------------------------
250
- program
251
- .command('ping')
252
- .description('Health check')
253
- .action(async () => {
254
- await run(async () => {
255
- const { api } = authedApi(program.opts());
256
- const { data } = await api.ping();
257
- return data;
258
- });
259
- });
260
- // -- env --------------------------------------------------------------------
261
- // Environments are baked from spec/openapi.yaml servers[] at build time.
262
- // Default (prod / or last-in-list) is chosen in scripts/gen-environments.mjs.
263
- const envCmd = program
264
- .command('env')
265
- .description('List and switch Alvera API environments');
266
- envCmd
267
- .command('list')
268
- .description('List available environments (from spec/openapi.yaml)')
269
- .action(() => {
270
- const profile = getProfileName(program.opts().profile);
271
- const resolved = resolveProfile(profile);
272
- out(ENVIRONMENT_NAMES.map((name) => ({
273
- name,
274
- baseUrl: ENVIRONMENTS[name].base_url,
275
- description: ENVIRONMENTS[name].description,
276
- default: name === DEFAULT_ENVIRONMENT,
277
- active: name === resolved.environment,
278
- })));
279
- });
280
- envCmd
281
- .command('use <name>')
282
- .description('Persist the selected environment to the profile (clears any custom base_url)')
283
- .action((name) => {
284
- if (!ENVIRONMENT_NAMES.includes(name)) {
285
- die(`unknown environment "${name}". Valid: ${ENVIRONMENT_NAMES.join(', ')}`);
286
- }
287
- const profile = getProfileName(program.opts().profile);
288
- writeProfileConfig(profile, { environment: name }, ['base_url']);
289
- process.stderr.write(`Profile "${profile}" now uses environment "${name}" ` +
290
- `(${ENVIRONMENTS[name].base_url}).\n`);
291
- });
292
- // -- tenants ----------------------------------------------------------------
293
- const tenants = program.command('tenants').description('Manage tenants');
294
- tenants
295
- .command('list')
296
- .description('List tenants accessible to the current session')
297
- .action(async () => {
298
- await run(async () => {
299
- const { api } = authedApi(program.opts());
300
- const { data } = await api.tenants.list();
301
- return data;
302
- });
303
- });
304
- // ---------------------------------------------------------------------------
305
- // Resource commands — thin wrappers over the SDK
306
- // ---------------------------------------------------------------------------
307
- const bodyOption = (cmd) => cmd
308
- .option('--body <json>', 'request body as a JSON string')
309
- .option('--body-file <path>', 'path to a JSON file (or "-" for stdin)');
310
- // -- datalakes --------------------------------------------------------------
311
- const datalakes = program.command('datalakes').description('Manage datalakes');
312
- datalakes
313
- .command('list [tenant]')
314
- .description('List datalakes for a tenant')
315
- .action(async (tenant) => {
316
- await run(async () => {
317
- const { api, resolved } = authedApi(program.opts());
318
- const { data } = await api.datalakes.list(resolveTenant(tenant, resolved.tenantSlug));
319
- return data;
320
- });
321
- });
322
- datalakes
323
- .command('get <id> [tenant]')
324
- .description('Get a datalake by id')
325
- .action(async (id, tenant) => {
326
- await run(async () => {
327
- const { api, resolved } = authedApi(program.opts());
328
- const { data } = await api.datalakes.get(resolveTenant(tenant, resolved.tenantSlug), id);
329
- return data;
330
- });
331
- });
332
- // -- data-sources -----------------------------------------------------------
333
- const dataSources = program.command('data-sources').description('Manage data sources');
334
- dataSources
335
- .command('list <datalake> [tenant]')
336
- .description('List data sources in a datalake')
337
- .action(async (datalake, tenant) => {
338
- await run(async () => {
339
- const { api, resolved } = authedApi(program.opts());
340
- const { data } = await api.dataSources.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
341
- return data;
342
- });
343
- });
344
- bodyOption(dataSources.command('create <datalake> [tenant]').description('Create a data source'))
345
- .action(async (datalake, tenant, opts) => {
346
- await run(async () => {
347
- const { api, resolved } = authedApi(program.opts());
348
- const { data } = await api.dataSources.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
349
- return data;
350
- });
351
- });
352
- bodyOption(dataSources.command('update <datalake> <id> [tenant]').description('Update a data source'))
353
- .action(async (datalake, id, tenant, opts) => {
354
- await run(async () => {
355
- const { api, resolved } = authedApi(program.opts());
356
- const { data } = await api.dataSources.update(resolveTenant(tenant, resolved.tenantSlug), datalake, id, readBody(opts.body, opts.bodyFile));
357
- return data;
358
- });
359
- });
360
- // -- tools ------------------------------------------------------------------
361
- const tools = program.command('tools').description('Manage tools');
362
- tools
363
- .command('list [tenant]')
364
- .description('List tools for a tenant')
365
- .action(async (tenant) => {
366
- await run(async () => {
367
- const { api, resolved } = authedApi(program.opts());
368
- const { data } = await api.tools.list(resolveTenant(tenant, resolved.tenantSlug));
369
- return data;
370
- });
371
- });
372
- tools
373
- .command('get <id> [tenant]')
374
- .description('Get a tool by id')
375
- .action(async (id, tenant) => {
376
- await run(async () => {
377
- const { api, resolved } = authedApi(program.opts());
378
- const { data } = await api.tools.get(resolveTenant(tenant, resolved.tenantSlug), id);
379
- return data;
380
- });
381
- });
382
- bodyOption(tools.command('create [tenant]').description('Create a tool'))
383
- .action(async (tenant, opts) => {
384
- await run(async () => {
385
- const { api, resolved } = authedApi(program.opts());
386
- const { data } = await api.tools.create(resolveTenant(tenant, resolved.tenantSlug), readBody(opts.body, opts.bodyFile));
387
- return data;
388
- });
389
- });
390
- bodyOption(tools.command('update <id> [tenant]').description('Update a tool'))
391
- .action(async (id, tenant, opts) => {
392
- await run(async () => {
393
- const { api, resolved } = authedApi(program.opts());
394
- const { data } = await api.tools.update(resolveTenant(tenant, resolved.tenantSlug), id, readBody(opts.body, opts.bodyFile));
395
- return data;
396
- });
397
- });
398
- tools
399
- .command('delete <id> [tenant]')
400
- .description('Delete a tool')
401
- .action(async (id, tenant) => {
402
- await run(async () => {
403
- const { api, resolved } = authedApi(program.opts());
404
- const { data } = await api.tools.delete(resolveTenant(tenant, resolved.tenantSlug), id);
405
- return data;
406
- });
407
- });
408
- // -- generic-tables ---------------------------------------------------------
409
- const genericTables = program.command('generic-tables').description('Manage generic tables');
410
- genericTables
411
- .command('list <datalake> [tenant]')
412
- .description('List generic tables in a datalake')
413
- .action(async (datalake, tenant) => {
414
- await run(async () => {
415
- const { api, resolved } = authedApi(program.opts());
416
- const { data } = await api.genericTables.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
417
- return data;
418
- });
419
- });
420
- bodyOption(genericTables.command('create <datalake> [tenant]').description('Create a generic table'))
421
- .action(async (datalake, tenant, opts) => {
422
- await run(async () => {
423
- const { api, resolved } = authedApi(program.opts());
424
- const { data } = await api.genericTables.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
425
- return data;
426
- });
427
- });
428
- // -- action-status-updaters -------------------------------------------------
429
- const updaters = program.command('action-status-updaters').description('Manage action status updaters');
430
- updaters
431
- .command('list [tenant]')
432
- .description('List action status updaters')
433
- .action(async (tenant) => {
434
- await run(async () => {
435
- const { api, resolved } = authedApi(program.opts());
436
- const { data } = await api.actionStatusUpdaters.list(resolveTenant(tenant, resolved.tenantSlug));
437
- return data;
438
- });
439
- });
440
- bodyOption(updaters.command('create [tenant]').description('Create an action status updater'))
441
- .action(async (tenant, opts) => {
442
- await run(async () => {
443
- const { api, resolved } = authedApi(program.opts());
444
- const { data } = await api.actionStatusUpdaters.create(resolveTenant(tenant, resolved.tenantSlug), readBody(opts.body, opts.bodyFile));
445
- return data;
446
- });
447
- });
448
- bodyOption(updaters.command('update <id> [tenant]').description('Update an action status updater'))
449
- .action(async (id, tenant, opts) => {
450
- await run(async () => {
451
- const { api, resolved } = authedApi(program.opts());
452
- const { data } = await api.actionStatusUpdaters.update(resolveTenant(tenant, resolved.tenantSlug), id, readBody(opts.body, opts.bodyFile));
453
- return data;
454
- });
455
- });
456
- // -- ai-agents --------------------------------------------------------------
457
- const aiAgents = program.command('ai-agents').description('Manage AI agents');
458
- aiAgents
459
- .command('list <datalake> [tenant]')
460
- .description('List AI agents in a datalake')
461
- .action(async (datalake, tenant) => {
462
- await run(async () => {
463
- const { api, resolved } = authedApi(program.opts());
464
- const { data } = await api.aiAgents.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
465
- return data;
466
- });
467
- });
468
- aiAgents
469
- .command('get <datalake> <id> [tenant]')
470
- .description('Get an AI agent by id')
471
- .action(async (datalake, id, tenant) => {
472
- await run(async () => {
473
- const { api, resolved } = authedApi(program.opts());
474
- const { data } = await api.aiAgents.get(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
475
- return data;
476
- });
477
- });
478
- bodyOption(aiAgents.command('create <datalake> [tenant]').description('Create an AI agent'))
479
- .action(async (datalake, tenant, opts) => {
480
- await run(async () => {
481
- const { api, resolved } = authedApi(program.opts());
482
- const { data } = await api.aiAgents.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
483
- return data;
484
- });
485
- });
486
- bodyOption(aiAgents.command('update <datalake> <id> [tenant]').description('Update an AI agent'))
487
- .action(async (datalake, id, tenant, opts) => {
488
- await run(async () => {
489
- const { api, resolved } = authedApi(program.opts());
490
- const { data } = await api.aiAgents.update(resolveTenant(tenant, resolved.tenantSlug), datalake, id, readBody(opts.body, opts.bodyFile));
491
- return data;
492
- });
493
- });
494
- aiAgents
495
- .command('delete <datalake> <id> [tenant]')
496
- .description('Delete an AI agent')
497
- .action(async (datalake, id, tenant) => {
498
- await run(async () => {
499
- const { api, resolved } = authedApi(program.opts());
500
- const { data } = await api.aiAgents.delete(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
501
- return data;
502
- });
503
- });
504
- // -- session verify (via API) ----------------------------------------------
505
- program
506
- .command('sessions-verify')
507
- .description('Verify the current session token via the API')
508
- .action(async () => {
509
- await run(async () => {
510
- const { api } = authedApi(program.opts());
511
- const { data } = await api.sessions.verify();
512
- return data;
513
- });
514
- });
515
- // -- datasets ---------------------------------------------------------------
516
- const datasets = program.command('datasets').description('Search datasets');
517
- datasets
518
- .command('search <dataset>')
519
- .description('Search a dataset (e.g. patient, member)')
520
- .option('--datalake-id <id>', 'restrict to a specific datalake')
521
- .option('--page <n>', 'page number', (v) => Number(v))
522
- .option('--page-size <n>', 'results per page (max 100)', (v) => Number(v))
523
- .action(async (dataset, opts) => {
524
- await run(async () => {
525
- const { api } = authedApi(program.opts());
526
- const { data } = await api.datasets.search(dataset, {
527
- datalakeId: opts.datalakeId,
528
- page: opts.page,
529
- pageSize: opts.pageSize,
530
- });
531
- return data;
532
- });
533
- });
534
- // -- datalakes create (extension) ------------------------------------------
535
- bodyOption(datalakes.command('create [tenant]').description('Create a datalake'))
536
- .action(async (tenant, opts) => {
537
- await run(async () => {
538
- const { api, resolved } = authedApi(program.opts());
539
- const { data } = await api.datalakes.create(resolveTenant(tenant, resolved.tenantSlug), readBody(opts.body, opts.bodyFile));
540
- return data;
541
- });
542
- });
543
- // -- connected-apps (datalake-scoped management + tenant-scoped actions) ---
544
- const connectedApps = program.command('connected-apps').description('Manage connected apps');
545
- connectedApps
546
- .command('list <datalake> [tenant]')
547
- .description('List connected apps in a datalake')
548
- .action(async (datalake, tenant) => {
549
- await run(async () => {
550
- const { api, resolved } = authedApi(program.opts());
551
- const { data } = await api.connectedApps.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
552
- return data;
553
- });
554
- });
555
- connectedApps
556
- .command('get <datalake> <id> [tenant]')
557
- .description('Get a connected app by id')
558
- .action(async (datalake, id, tenant) => {
559
- await run(async () => {
560
- const { api, resolved } = authedApi(program.opts());
561
- const { data } = await api.connectedApps.get(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
562
- return data;
563
- });
564
- });
565
- bodyOption(connectedApps.command('create <datalake> [tenant]').description('Create a connected app'))
566
- .action(async (datalake, tenant, opts) => {
567
- await run(async () => {
568
- const { api, resolved } = authedApi(program.opts());
569
- const { data } = await api.connectedApps.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
570
- return data;
571
- });
572
- });
573
- bodyOption(connectedApps.command('update <datalake> <id> [tenant]').description('Update a connected app'))
574
- .action(async (datalake, id, tenant, opts) => {
575
- await run(async () => {
576
- const { api, resolved } = authedApi(program.opts());
577
- const { data } = await api.connectedApps.update(resolveTenant(tenant, resolved.tenantSlug), datalake, id, readBody(opts.body, opts.bodyFile));
578
- return data;
579
- });
580
- });
581
- connectedApps
582
- .command('sync-routes <datalake> <id> [tenant]')
583
- .description('Trigger a sync of routes for a connected app')
584
- .action(async (datalake, id, tenant) => {
585
- await run(async () => {
586
- const { api, resolved } = authedApi(program.opts());
587
- const { data } = await api.connectedApps.syncRoutes(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
588
- return data;
589
- });
590
- });
591
- bodyOption(connectedApps
592
- .command('resolve-page <slug> [tenant]')
593
- .description('Resolve a connected app page (tenant-scoped, by slug)'))
594
- .action(async (slug, tenant, opts) => {
595
- await run(async () => {
596
- const { api, resolved } = authedApi(program.opts());
597
- const { data } = await api.connectedApps.resolvePage(resolveTenant(tenant, resolved.tenantSlug), slug, readBody(opts.body, opts.bodyFile));
598
- return data;
599
- });
600
- });
601
- bodyOption(connectedApps
602
- .command('update-message-tracking <slug> [tenant]')
603
- .description('Update page message tracking for a connected app'))
604
- .action(async (slug, tenant, opts) => {
605
- await run(async () => {
606
- const { api, resolved } = authedApi(program.opts());
607
- const { data } = await api.connectedApps.updateMessageTracking(resolveTenant(tenant, resolved.tenantSlug), slug, readBody(opts.body, opts.bodyFile));
608
- return data;
609
- });
610
- });
611
- // -- data-activation-clients -----------------------------------------------
612
- const dac = program.command('data-activation-clients').description('Manage data activation clients');
613
- dac
614
- .command('list <datalake> [tenant]')
615
- .description('List data activation clients in a datalake')
616
- .action(async (datalake, tenant) => {
617
- await run(async () => {
618
- const { api, resolved } = authedApi(program.opts());
619
- const { data } = await api.dataActivationClients.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
620
- return data;
621
- });
622
- });
623
- dac
624
- .command('get <datalake> <slug> [tenant]')
625
- .description('Get a data activation client by slug')
626
- .action(async (datalake, slug, tenant) => {
627
- await run(async () => {
628
- const { api, resolved } = authedApi(program.opts());
629
- const { data } = await api.dataActivationClients.get(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
630
- return data;
631
- });
632
- });
633
- bodyOption(dac.command('create <datalake> [tenant]').description('Create a data activation client'))
634
- .action(async (datalake, tenant, opts) => {
635
- await run(async () => {
636
- const { api, resolved } = authedApi(program.opts());
637
- const { data } = await api.dataActivationClients.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
638
- return data;
639
- });
640
- });
641
- bodyOption(dac.command('update <datalake> <slug> [tenant]').description('Update a data activation client'))
642
- .action(async (datalake, slug, tenant, opts) => {
643
- await run(async () => {
644
- const { api, resolved } = authedApi(program.opts());
645
- const { data } = await api.dataActivationClients.update(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, readBody(opts.body, opts.bodyFile));
646
- return data;
647
- });
648
- });
649
- dac
650
- .command('delete <datalake> <slug> [tenant]')
651
- .description('Delete a data activation client')
652
- .action(async (datalake, slug, tenant) => {
653
- await run(async () => {
654
- const { api, resolved } = authedApi(program.opts());
655
- const { data } = await api.dataActivationClients.delete(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
656
- return data;
657
- });
658
- });
659
- dac
660
- .command('metadata <datalake> <slug> [tenant]')
661
- .description('Get markdown metadata for a data activation client')
662
- .action(async (datalake, slug, tenant) => {
663
- await run(async () => {
664
- const { api, resolved } = authedApi(program.opts());
665
- const { data } = await api.dataActivationClients.metadata(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
666
- return data;
667
- });
668
- });
669
- bodyOption(dac
670
- .command('run-manually <datalake> <slug> [tenant]')
671
- .description('Trigger a manual run (optional --body for tool_call override)'))
672
- .action(async (datalake, slug, tenant, opts) => {
673
- await run(async () => {
674
- const { api, resolved } = authedApi(program.opts());
675
- const body = opts.body || opts.bodyFile ? readBody(opts.body, opts.bodyFile) : undefined;
676
- const { data } = await api.dataActivationClients.runManually(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, body);
677
- return data;
678
- });
679
- });
680
- bodyOption(dac.command('ingest <datalake> <slug> [tenant]').description('Ingest a JSON payload'))
681
- .action(async (datalake, slug, tenant, opts) => {
682
- await run(async () => {
683
- const { api, resolved } = authedApi(program.opts());
684
- const { data } = await api.dataActivationClients.ingest(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, readBody(opts.body, opts.bodyFile));
685
- return data;
686
- });
687
- });
688
- dac
689
- .command('ingest-file <datalake> <slug> <key> [tenant]')
690
- .description('Ingest a previously uploaded file (key from upload-link)')
691
- .action(async (datalake, slug, key, tenant) => {
692
- await run(async () => {
693
- const { api, resolved } = authedApi(program.opts());
694
- const { data } = await api.dataActivationClients.ingestFile(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, { key });
695
- return data;
696
- });
697
- });
698
- dac
699
- .command('logs <datalake> <slug> [tenant]')
700
- .description('List execution logs for a data activation client')
701
- .action(async (datalake, slug, tenant) => {
702
- await run(async () => {
703
- const { api, resolved } = authedApi(program.opts());
704
- const { data } = await api.dataActivationClients.logs.list(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
705
- return data;
706
- });
707
- });
708
- dac
709
- .command('log-get <datalake> <slug> <id> [tenant]')
710
- .description('Get a single execution log by id')
711
- .action(async (datalake, slug, id, tenant) => {
712
- await run(async () => {
713
- const { api, resolved } = authedApi(program.opts());
714
- const { data } = await api.dataActivationClients.logs.get(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, id);
715
- return data;
716
- });
717
- });
718
- datalakes
719
- .command('upload-link <datalake> <filename> [tenant]')
720
- .description('Create a presigned upload link for a datalake')
721
- .addOption(new Option('--content-type <type>', 'MIME type of the file')
722
- .choices(['application/x-ndjson', 'text/csv'])
723
- .default('application/x-ndjson'))
724
- .action(async (datalake, filename, tenant, opts) => {
725
- await run(async () => {
726
- const { api, resolved } = authedApi(program.opts());
727
- const { data } = await api.datalakes.createUploadLink(resolveTenant(tenant, resolved.tenantSlug), datalake, {
728
- content_type: opts.contentType,
729
- filename,
730
- });
731
- return data;
732
- });
733
- });
734
- datalakes
735
- .command('download-link <datalake> <bucket> <key> [tenant]')
736
- .description('Create a presigned download URL for a datalake object')
737
- .action(async (datalake, bucket, key, tenant) => {
738
- await run(async () => {
739
- const { api, resolved } = authedApi(program.opts());
740
- const { data } = await api.datalakes.createDownloadLink(resolveTenant(tenant, resolved.tenantSlug), datalake, { bucket, key });
741
- return data;
742
- });
743
- });
744
- // -- mdm --------------------------------------------------------------------
745
- const mdm = program.command('mdm').description('Master data management');
746
- bodyOption(mdm.command('verify <datalake> [tenant]').description('Fuzzy-verify an identity against MDM'))
747
- .action(async (datalake, tenant, opts) => {
748
- await run(async () => {
749
- const { api, resolved } = authedApi(program.opts());
750
- const { data } = await api.mdm.verify(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
751
- return data;
752
- });
753
- });
754
- // -- datalakes metadata + datasets metadata --------------------------------
755
- datalakes
756
- .command('metadata <datalake> [tenant]')
757
- .description('Get markdown metadata for a datalake')
758
- .action(async (datalake, tenant) => {
759
- await run(async () => {
760
- const { api, resolved } = authedApi(program.opts());
761
- const { data } = await api.datalakes.metadata(resolveTenant(tenant, resolved.tenantSlug), datalake);
762
- return data;
763
- });
764
- });
765
- datasets
766
- .command('metadata <dataset-type>')
767
- .description('Get markdown schema metadata for a dataset type')
768
- .option('--datalake-id <id>', 'restrict to a specific datalake')
769
- .option('--generic-table-id <id>', 'required when dataset-type is generic_table')
770
- .action(async (datasetType, opts) => {
771
- await run(async () => {
772
- const { api } = authedApi(program.opts());
773
- const { data } = await api.datasets.metadata(datasetType, {
774
- datalakeId: opts.datalakeId,
775
- genericTableId: opts.genericTableId,
776
- });
777
- return data;
778
- });
779
- });
780
- // -- interoperability-contracts --------------------------------------------
781
- const interop = program
782
- .command('interoperability-contracts')
783
- .alias('interop')
784
- .description('Manage interoperability contracts');
785
- interop
786
- .command('list <datalake> [tenant]')
787
- .description('List interoperability contracts in a datalake')
788
- .action(async (datalake, tenant) => {
789
- await run(async () => {
790
- const { api, resolved } = authedApi(program.opts());
791
- const { data } = await api.interoperabilityContracts.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
792
- return data;
793
- });
794
- });
795
- interop
796
- .command('get <datalake> <slug> [tenant]')
797
- .description('Get a contract by slug')
798
- .action(async (datalake, slug, tenant) => {
799
- await run(async () => {
800
- const { api, resolved } = authedApi(program.opts());
801
- const { data } = await api.interoperabilityContracts.get(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
802
- return data;
803
- });
804
- });
805
- bodyOption(interop.command('create <datalake> [tenant]').description('Create a contract'))
806
- .action(async (datalake, tenant, opts) => {
807
- await run(async () => {
808
- const { api, resolved } = authedApi(program.opts());
809
- const { data } = await api.interoperabilityContracts.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
810
- return data;
811
- });
812
- });
813
- bodyOption(interop.command('update <datalake> <slug> [tenant]').description('Update a contract'))
814
- .action(async (datalake, slug, tenant, opts) => {
815
- await run(async () => {
816
- const { api, resolved } = authedApi(program.opts());
817
- const { data } = await api.interoperabilityContracts.update(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, readBody(opts.body, opts.bodyFile));
818
- return data;
819
- });
820
- });
821
- interop
822
- .command('delete <datalake> <slug> [tenant]')
823
- .description('Delete a contract')
824
- .action(async (datalake, slug, tenant) => {
825
- await run(async () => {
826
- const { api, resolved } = authedApi(program.opts());
827
- const { data } = await api.interoperabilityContracts.delete(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
828
- return data;
829
- });
830
- });
831
- interop
832
- .command('metadata <datalake> <slug> [tenant]')
833
- .description('Get markdown metadata for a contract')
834
- .action(async (datalake, slug, tenant) => {
835
- await run(async () => {
836
- const { api, resolved } = authedApi(program.opts());
837
- const { data } = await api.interoperabilityContracts.metadata(resolveTenant(tenant, resolved.tenantSlug), datalake, slug);
838
- return data;
839
- });
840
- });
841
- bodyOption(interop
842
- .command('run <datalake> <slug> [tenant]')
843
- .description('Execute a contract against a raw source row'))
844
- .action(async (datalake, slug, tenant, opts) => {
845
- await run(async () => {
846
- const { api, resolved } = authedApi(program.opts());
847
- const { data } = await api.interoperabilityContracts.run(resolveTenant(tenant, resolved.tenantSlug), datalake, slug, readBody(opts.body, opts.bodyFile));
848
- return data;
849
- });
850
- });
851
- // -- workflows --------------------------------------------------------------
852
- const workflows = program.command('workflows').description('Agentic workflows');
853
- workflows
854
- .command('list <datalake> [tenant]')
855
- .description('List workflow definitions in a datalake')
856
- .action(async (datalake, tenant) => {
857
- await run(async () => {
858
- const { api, resolved } = authedApi(program.opts());
859
- const { data } = await api.workflows.list(resolveTenant(tenant, resolved.tenantSlug), datalake);
860
- return data;
861
- });
862
- });
863
- workflows
864
- .command('get <datalake> <id> [tenant]')
865
- .description('Get a workflow by id')
866
- .action(async (datalake, id, tenant) => {
867
- await run(async () => {
868
- const { api, resolved } = authedApi(program.opts());
869
- const { data } = await api.workflows.get(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
870
- return data;
871
- });
872
- });
873
- bodyOption(workflows.command('create <datalake> [tenant]').description('Create a workflow'))
874
- .action(async (datalake, tenant, opts) => {
875
- await run(async () => {
876
- const { api, resolved } = authedApi(program.opts());
877
- const { data } = await api.workflows.create(resolveTenant(tenant, resolved.tenantSlug), datalake, readBody(opts.body, opts.bodyFile));
878
- return data;
879
- });
880
- });
881
- bodyOption(workflows.command('update <datalake> <id> [tenant]').description('Update a workflow'))
882
- .action(async (datalake, id, tenant, opts) => {
883
- await run(async () => {
884
- const { api, resolved } = authedApi(program.opts());
885
- const { data } = await api.workflows.update(resolveTenant(tenant, resolved.tenantSlug), datalake, id, readBody(opts.body, opts.bodyFile));
886
- return data;
887
- });
888
- });
889
- workflows
890
- .command('delete <datalake> <id> [tenant]')
891
- .description('Delete a workflow')
892
- .action(async (datalake, id, tenant) => {
893
- await run(async () => {
894
- const { api, resolved } = authedApi(program.opts());
895
- const { data } = await api.workflows.delete(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
896
- return data;
897
- });
898
- });
899
- workflows
900
- .command('metadata <datalake> <id> [tenant]')
901
- .description('Get markdown metadata for a workflow')
902
- .action(async (datalake, id, tenant) => {
903
- await run(async () => {
904
- const { api, resolved } = authedApi(program.opts());
905
- const { data } = await api.workflows.metadata(resolveTenant(tenant, resolved.tenantSlug), datalake, id);
906
- return data;
907
- });
908
- });
909
- bodyOption(workflows.command('execute <workflow-slug> [tenant]').description('Execute an agentic workflow'))
910
- .action(async (workflowSlug, tenant, opts) => {
911
- await run(async () => {
912
- const { api, resolved } = authedApi(program.opts());
913
- const { data } = await api.workflows.execute(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, readBody(opts.body, opts.bodyFile));
914
- return data;
915
- });
916
- });
917
- bodyOption(workflows
918
- .command('run <workflow-slug> [tenant]')
919
- .description('Run a workflow across records matched by a SQL WHERE clause'))
920
- .action(async (workflowSlug, tenant, opts) => {
921
- await run(async () => {
922
- const { api, resolved } = authedApi(program.opts());
923
- const { data } = await api.workflows.run(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, readBody(opts.body, opts.bodyFile));
924
- return data;
925
- });
926
- });
927
- workflows
928
- .command('batch-logs <workflow-slug> [tenant]')
929
- .description('List batch logs for a workflow')
930
- .action(async (workflowSlug, tenant) => {
931
- await run(async () => {
932
- const { api, resolved } = authedApi(program.opts());
933
- const { data } = await api.workflows.batchLogs.list(resolveTenant(tenant, resolved.tenantSlug), workflowSlug);
934
- return data;
935
- });
936
- });
937
- workflows
938
- .command('batch-log <workflow-slug> <id> [tenant]')
939
- .description('Get a single batch log by id')
940
- .action(async (workflowSlug, id, tenant) => {
941
- await run(async () => {
942
- const { api, resolved } = authedApi(program.opts());
943
- const { data } = await api.workflows.batchLogs.get(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, id);
944
- return data;
945
- });
946
- });
947
- workflows
948
- .command('batch-log-start <workflow-slug> <id> [tenant]')
949
- .description('Start polling a batch log')
950
- .action(async (workflowSlug, id, tenant) => {
951
- await run(async () => {
952
- const { api, resolved } = authedApi(program.opts());
953
- const { data } = await api.workflows.batchLogs.start(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, id);
954
- return data;
955
- });
956
- });
957
- workflows
958
- .command('batch-log-stop <workflow-slug> <id> [tenant]')
959
- .description('Stop polling a batch log')
960
- .action(async (workflowSlug, id, tenant) => {
961
- await run(async () => {
962
- const { api, resolved } = authedApi(program.opts());
963
- const { data } = await api.workflows.batchLogs.stop(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, id);
964
- return data;
965
- });
966
- });
967
- workflows
968
- .command('batch-log-refresh <workflow-slug> <id> [tenant]')
969
- .description('Force-refresh a batch log')
970
- .action(async (workflowSlug, id, tenant) => {
971
- await run(async () => {
972
- const { api, resolved } = authedApi(program.opts());
973
- const { data } = await api.workflows.batchLogs.refresh(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, id);
974
- return data;
975
- });
976
- });
977
- workflows
978
- .command('workflow-logs <workflow-slug> [tenant]')
979
- .description('List execution logs for a workflow')
980
- .action(async (workflowSlug, tenant) => {
981
- await run(async () => {
982
- const { api, resolved } = authedApi(program.opts());
983
- const { data } = await api.workflows.workflowLogs.list(resolveTenant(tenant, resolved.tenantSlug), workflowSlug);
984
- return data;
985
- });
986
- });
987
- workflows
988
- .command('workflow-log <workflow-slug> <id> [tenant]')
989
- .description('Get a single execution log by id')
990
- .action(async (workflowSlug, id, tenant) => {
991
- await run(async () => {
992
- const { api, resolved } = authedApi(program.opts());
993
- const { data } = await api.workflows.workflowLogs.get(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, id);
994
- return data;
995
- });
996
- });
997
- workflows
998
- .command('workflow-log-download <workflow-slug> <id> [tenant]')
999
- .description('Get a presigned download URL for an execution log')
1000
- .action(async (workflowSlug, id, tenant) => {
1001
- await run(async () => {
1002
- const { api, resolved } = authedApi(program.opts());
1003
- const { data } = await api.workflows.workflowLogs.download(resolveTenant(tenant, resolved.tenantSlug), workflowSlug, id);
1004
- return data;
1005
- });
1006
- });
1007
- program.parseAsync();
1008
- //# sourceMappingURL=cli.js.map