@outputai/cli 0.9.2 → 0.9.3-next.14a0cfc.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.
@@ -275,6 +275,14 @@ export interface WorkflowResultResponse {
275
275
  */
276
276
  errorDetails?: WorkflowResultResponseErrorDetails;
277
277
  }
278
+ export interface WorkflowInputResponse {
279
+ /** The workflow execution id */
280
+ workflowId: string;
281
+ /** The specific run id the input was read from */
282
+ runId: string;
283
+ /** The first input argument the workflow was started with, null if unavailable */
284
+ input: unknown;
285
+ }
278
286
  export interface StopWorkflowResponse {
279
287
  workflowId?: string;
280
288
  runId?: string;
@@ -956,6 +964,59 @@ export type getWorkflowIdRunsRidResultResponseError = (getWorkflowIdRunsRidResul
956
964
  export type getWorkflowIdRunsRidResultResponse = (getWorkflowIdRunsRidResultResponseSuccess | getWorkflowIdRunsRidResultResponseError);
957
965
  export declare const getGetWorkflowIdRunsRidResultUrl: (id: string, rid: string) => string;
958
966
  export declare const getWorkflowIdRunsRidResult: (id: string, rid: string, options?: ApiRequestOptions) => Promise<getWorkflowIdRunsRidResultResponse>;
967
+ /**
968
+ * Returns the original input passed to the latest run of the given workflow. Works for workflows in any state, including running. To pin a specific run, use `/workflow/{id}/runs/{rid}/input`.
969
+ * @summary Return the original input of a workflow (latest run)
970
+ */
971
+ export type getWorkflowIdInputResponse200 = {
972
+ data: WorkflowInputResponse;
973
+ status: 200;
974
+ };
975
+ export type getWorkflowIdInputResponse404 = {
976
+ data: NotFoundResponse;
977
+ status: 404;
978
+ };
979
+ export type getWorkflowIdInputResponse500 = {
980
+ data: InternalServerErrorResponse;
981
+ status: 500;
982
+ };
983
+ export type getWorkflowIdInputResponseSuccess = (getWorkflowIdInputResponse200) & {
984
+ headers: Headers;
985
+ };
986
+ export type getWorkflowIdInputResponseError = (getWorkflowIdInputResponse404 | getWorkflowIdInputResponse500) & {
987
+ headers: Headers;
988
+ };
989
+ export type getWorkflowIdInputResponse = (getWorkflowIdInputResponseSuccess | getWorkflowIdInputResponseError);
990
+ export declare const getGetWorkflowIdInputUrl: (id: string) => string;
991
+ export declare const getWorkflowIdInput: (id: string, options?: ApiRequestOptions) => Promise<getWorkflowIdInputResponse>;
992
+ /**
993
+ * @summary Return the original input of a specific workflow run
994
+ */
995
+ export type getWorkflowIdRunsRidInputResponse200 = {
996
+ data: WorkflowInputResponse;
997
+ status: 200;
998
+ };
999
+ export type getWorkflowIdRunsRidInputResponse400 = {
1000
+ data: BadRequestResponse;
1001
+ status: 400;
1002
+ };
1003
+ export type getWorkflowIdRunsRidInputResponse404 = {
1004
+ data: NotFoundResponse;
1005
+ status: 404;
1006
+ };
1007
+ export type getWorkflowIdRunsRidInputResponse500 = {
1008
+ data: InternalServerErrorResponse;
1009
+ status: 500;
1010
+ };
1011
+ export type getWorkflowIdRunsRidInputResponseSuccess = (getWorkflowIdRunsRidInputResponse200) & {
1012
+ headers: Headers;
1013
+ };
1014
+ export type getWorkflowIdRunsRidInputResponseError = (getWorkflowIdRunsRidInputResponse400 | getWorkflowIdRunsRidInputResponse404 | getWorkflowIdRunsRidInputResponse500) & {
1015
+ headers: Headers;
1016
+ };
1017
+ export type getWorkflowIdRunsRidInputResponse = (getWorkflowIdRunsRidInputResponseSuccess | getWorkflowIdRunsRidInputResponseError);
1018
+ export declare const getGetWorkflowIdRunsRidInputUrl: (id: string, rid: string) => string;
1019
+ export declare const getWorkflowIdRunsRidInput: (id: string, rid: string, options?: ApiRequestOptions) => Promise<getWorkflowIdRunsRidInputResponse>;
959
1020
  /**
960
1021
  * Returns trace data for the latest run of the given workflow. If trace is stored remotely (S3), fetches and returns the data inline. If trace is local only, returns the local path. To pin a specific run, use `/workflow/{id}/runs/{rid}/trace-log`.
961
1022
  * @summary Get workflow trace log data (latest run)
@@ -181,6 +181,24 @@ export const getWorkflowIdRunsRidResult = async (id, rid, options) => {
181
181
  method: 'GET'
182
182
  });
183
183
  };
184
+ export const getGetWorkflowIdInputUrl = (id) => {
185
+ return `/workflow/${id}/input`;
186
+ };
187
+ export const getWorkflowIdInput = async (id, options) => {
188
+ return customFetchInstance(getGetWorkflowIdInputUrl(id), {
189
+ ...options,
190
+ method: 'GET'
191
+ });
192
+ };
193
+ export const getGetWorkflowIdRunsRidInputUrl = (id, rid) => {
194
+ return `/workflow/${id}/runs/${rid}/input`;
195
+ };
196
+ export const getWorkflowIdRunsRidInput = async (id, rid, options) => {
197
+ return customFetchInstance(getGetWorkflowIdRunsRidInputUrl(id, rid), {
198
+ ...options,
199
+ method: 'GET'
200
+ });
201
+ };
184
202
  export const getGetWorkflowIdTraceLogUrl = (id) => {
185
203
  return `/workflow/${id}/trace-log`;
186
204
  };
@@ -80,7 +80,7 @@ services:
80
80
  condition: service_healthy
81
81
  worker:
82
82
  condition: service_healthy
83
- image: outputai/api:${OUTPUT_API_VERSION:-0.9.2}
83
+ image: outputai/api:${OUTPUT_API_VERSION:-0.9.3-next.14a0cfc.0}
84
84
  init: true
85
85
  networks:
86
86
  - main
@@ -0,0 +1,16 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class WorkflowInput extends Command {
3
+ static description: string;
4
+ static enableJsonFlag: boolean;
5
+ static examples: string[];
6
+ static args: {
7
+ workflowId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ 'run-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ };
14
+ run(): Promise<unknown>;
15
+ catch(error: Error): Promise<void>;
16
+ }
@@ -0,0 +1,74 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { getWorkflowIdInput, getWorkflowIdRunsRidInput } from '#api/generated/api.js';
5
+ import { handleApiError } from '#utils/error_handler.js';
6
+ export default class WorkflowInput extends Command {
7
+ static description = 'Get the original input a workflow run was started with';
8
+ static enableJsonFlag = true;
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> wf-12345',
11
+ '<%= config.bin %> <%= command.id %> wf-12345 --run-id 11111111-2222-4333-8444-555555555555',
12
+ '<%= config.bin %> <%= command.id %> wf-12345 -o w_input.json',
13
+ '<%= config.bin %> <%= command.id %> wf-12345 --output-file w_input.json --force'
14
+ ];
15
+ static args = {
16
+ workflowId: Args.string({
17
+ description: 'The workflow ID to get the input for',
18
+ required: true
19
+ })
20
+ };
21
+ static flags = {
22
+ 'run-id': Flags.string({
23
+ description: 'Specific run id to target (defaults to the latest run)'
24
+ }),
25
+ 'output-file': Flags.string({
26
+ char: 'o',
27
+ description: 'Write the input JSON to this file instead of stdout'
28
+ }),
29
+ force: Flags.boolean({
30
+ char: 'f',
31
+ default: false,
32
+ description: 'Overwrite the output file if it already exists'
33
+ })
34
+ };
35
+ async run() {
36
+ const { args, flags } = await this.parse(WorkflowInput);
37
+ const runId = flags['run-id'];
38
+ const outputFile = flags['output-file'];
39
+ const response = runId ?
40
+ await getWorkflowIdRunsRidInput(args.workflowId, runId) :
41
+ await getWorkflowIdInput(args.workflowId);
42
+ if (!response || !response.data) {
43
+ this.error('API returned invalid response', { exit: 1 });
44
+ }
45
+ const data = response.data;
46
+ const input = data.input;
47
+ const json = JSON.stringify(input, null, 2);
48
+ if (outputFile) {
49
+ const destPath = path.resolve(process.cwd(), outputFile);
50
+ const fileExists = await fs.access(destPath).then(() => true).catch(() => false);
51
+ if (fileExists && !flags.force) {
52
+ this.error(`File already exists at ${destPath}. Use --force to overwrite or choose a different --output-file.`, { exit: 1 });
53
+ }
54
+ await fs.writeFile(destPath, `${json}\n`, 'utf-8');
55
+ this.logToStderr(`Wrote workflow input to ${destPath}`);
56
+ // Don't return the bare input here: under --json oclif serializes run()'s return value to
57
+ // stdout, which would duplicate the input we just wrote to the file. Return a status object
58
+ // so --json emits a confirmation instead, and non-json mode keeps stdout empty.
59
+ return { outputFile: destPath };
60
+ }
61
+ // Emit only the bare input (never the response envelope) so every mode yields the same
62
+ // pipeable value (e.g. `output workflow input <id> | jq .`). Under --json oclif serializes
63
+ // run()'s return value, which is also the bare input, so skip the manual log here.
64
+ if (!this.jsonEnabled()) {
65
+ this.log(json);
66
+ }
67
+ return input;
68
+ }
69
+ async catch(error) {
70
+ return handleApiError(error, (...args) => this.error(...args), {
71
+ 404: 'Workflow not found. Check the workflow ID.'
72
+ });
73
+ }
74
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,119 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
+ import fs from 'node:fs/promises';
4
+ import { getWorkflowIdInput, getWorkflowIdRunsRidInput } from '#api/generated/api.js';
5
+ import WorkflowInput from './input.js';
6
+ vi.mock('node:fs/promises');
7
+ vi.mock('#api/generated/api.js', () => ({
8
+ getWorkflowIdInput: vi.fn(),
9
+ getWorkflowIdRunsRidInput: vi.fn()
10
+ }));
11
+ const RID = '11111111-2222-4333-8444-555555555555';
12
+ const INPUT = { values: [1, 2, 3] };
13
+ const makeCmd = (argv) => {
14
+ const config = { runHook: vi.fn().mockResolvedValue({ failures: [], successes: [] }) };
15
+ const cmd = new WorkflowInput(argv, config);
16
+ cmd.log = vi.fn();
17
+ cmd.logToStderr = vi.fn();
18
+ cmd.error = vi.fn().mockImplementation((msg) => {
19
+ throw new Error(msg);
20
+ });
21
+ cmd.jsonEnabled = vi.fn().mockReturnValue(false);
22
+ return cmd;
23
+ };
24
+ describe('workflow input command', () => {
25
+ beforeEach(() => vi.clearAllMocks());
26
+ afterEach(() => vi.restoreAllMocks());
27
+ describe('command definition', () => {
28
+ it('exports a valid OCLIF command', () => {
29
+ expect(WorkflowInput.description).toContain('input');
30
+ expect(WorkflowInput.args).toHaveProperty('workflowId');
31
+ expect(WorkflowInput.enableJsonFlag).toBe(true);
32
+ });
33
+ });
34
+ describe('fetching input', () => {
35
+ it('prints the bare input JSON to stdout and returns it for the latest run', async () => {
36
+ vi.mocked(getWorkflowIdInput).mockResolvedValue({ data: { workflowId: 'wf-1', runId: RID, input: INPUT } });
37
+ const cmd = makeCmd(['wf-1']);
38
+ const result = await cmd.run();
39
+ expect(getWorkflowIdInput).toHaveBeenCalledWith('wf-1');
40
+ expect(getWorkflowIdRunsRidInput).not.toHaveBeenCalled();
41
+ expect(cmd.log).toHaveBeenCalledWith(JSON.stringify(INPUT, null, 2));
42
+ // run() returns the bare input (not the envelope), so --json emits the same shape.
43
+ expect(result).toEqual(INPUT);
44
+ });
45
+ it('returns the bare input and skips manual logging in --json mode', async () => {
46
+ vi.mocked(getWorkflowIdInput).mockResolvedValue({ data: { workflowId: 'wf-1', runId: RID, input: INPUT } });
47
+ const cmd = makeCmd(['wf-1', '--json']);
48
+ cmd.jsonEnabled.mockReturnValue(true);
49
+ const result = await cmd.run();
50
+ expect(cmd.log).not.toHaveBeenCalled();
51
+ expect(result).toEqual(INPUT);
52
+ });
53
+ it('uses the run-pinned endpoint when --run-id is given', async () => {
54
+ vi.mocked(getWorkflowIdRunsRidInput).mockResolvedValue({ data: { workflowId: 'wf-1', runId: RID, input: INPUT } });
55
+ const cmd = makeCmd(['wf-1', '--run-id', RID]);
56
+ await cmd.run();
57
+ expect(getWorkflowIdRunsRidInput).toHaveBeenCalledWith('wf-1', RID);
58
+ expect(getWorkflowIdInput).not.toHaveBeenCalled();
59
+ });
60
+ it('prints null when no input is available', async () => {
61
+ vi.mocked(getWorkflowIdInput).mockResolvedValue({ data: { workflowId: 'wf-1', runId: RID, input: null } });
62
+ const cmd = makeCmd(['wf-1']);
63
+ await cmd.run();
64
+ expect(cmd.log).toHaveBeenCalledWith('null');
65
+ });
66
+ });
67
+ describe('writing to a file', () => {
68
+ beforeEach(() => {
69
+ vi.mocked(getWorkflowIdInput).mockResolvedValue({ data: { workflowId: 'wf-1', runId: RID, input: INPUT } });
70
+ });
71
+ it('writes the input JSON to the output file', async () => {
72
+ vi.mocked(fs.access).mockRejectedValue(new Error('not found'));
73
+ vi.mocked(fs.writeFile).mockResolvedValue();
74
+ const cmd = makeCmd(['wf-1', '-o', 'out.json']);
75
+ await cmd.run();
76
+ expect(fs.writeFile).toHaveBeenCalledWith(expect.stringContaining('out.json'), `${JSON.stringify(INPUT, null, 2)}\n`, 'utf-8');
77
+ expect(cmd.log).not.toHaveBeenCalled();
78
+ expect(cmd.logToStderr).toHaveBeenCalledWith(expect.stringContaining('out.json'));
79
+ });
80
+ it('does not return the bare input in file mode, so --json never duplicates it to stdout', async () => {
81
+ vi.mocked(fs.access).mockRejectedValue(new Error('not found'));
82
+ vi.mocked(fs.writeFile).mockResolvedValue();
83
+ const cmd = makeCmd(['wf-1', '-o', 'out.json', '--json']);
84
+ cmd.jsonEnabled.mockReturnValue(true);
85
+ const result = await cmd.run();
86
+ // The input went to the file; --json must emit a confirmation, not the input again.
87
+ expect(result).not.toEqual(INPUT);
88
+ expect(result).toMatchObject({ outputFile: expect.stringContaining('out.json') });
89
+ });
90
+ it('refuses to overwrite an existing file without --force', async () => {
91
+ vi.mocked(fs.access).mockResolvedValue();
92
+ const cmd = makeCmd(['wf-1', '-o', 'out.json']);
93
+ await expect(cmd.run()).rejects.toThrow('File already exists');
94
+ expect(fs.writeFile).not.toHaveBeenCalled();
95
+ });
96
+ it('overwrites an existing file when --force is set', async () => {
97
+ vi.mocked(fs.access).mockResolvedValue();
98
+ vi.mocked(fs.writeFile).mockResolvedValue();
99
+ const cmd = makeCmd(['wf-1', '-o', 'out.json', '--force']);
100
+ await cmd.run();
101
+ expect(fs.writeFile).toHaveBeenCalled();
102
+ });
103
+ });
104
+ describe('error handling', () => {
105
+ it('maps a 404 to a friendly message', async () => {
106
+ const cmd = makeCmd(['wf-1']);
107
+ const apiError = Object.assign(new Error('Not Found'), { response: { status: 404 } });
108
+ await expect(cmd.catch(apiError)).rejects.toThrow('Workflow not found');
109
+ });
110
+ it('shows the friendly 404 even when the API body carries error/message', async () => {
111
+ const cmd = makeCmd(['wf-1']);
112
+ // Real API 404 shape: the override must win over this body, not be shadowed by it.
113
+ const apiError = Object.assign(new Error('Not Found'), {
114
+ response: { status: 404, data: { error: 'WorkflowNotFoundError', message: 'Workflow "wf-1" not found' } }
115
+ });
116
+ await expect(cmd.catch(apiError)).rejects.toThrow('Workflow not found. Check the workflow ID.');
117
+ });
118
+ });
119
+ });
@@ -1,3 +1,3 @@
1
1
  {
2
- "framework": "0.9.2"
2
+ "framework": "0.9.3-next.14a0cfc.0"
3
3
  }
@@ -57,6 +57,14 @@ export function handleApiError(error, errorFn, overrides = {}) {
57
57
  }
58
58
  if (apiError.response?.status) {
59
59
  const status = apiError.response.status;
60
+ // A caller-supplied override for this exact status wins over the raw server body. The API's
61
+ // 404 body is a bare "WorkflowNotFoundError: ..." that the friendly override is meant to
62
+ // replace; without this, extractApiErrorDetails consumes the body first and every command's
63
+ // per-status override is dead code. Defaults are not consulted here, so commands that pass no
64
+ // override still get the rich server detail below.
65
+ if (status in overrides) {
66
+ errorFn(overrides[status], { exit: 1 });
67
+ }
60
68
  // Extract error details from response body
61
69
  const apiErrorDetails = extractApiErrorDetails(apiError.response.data);
62
70
  if (apiErrorDetails) {
@@ -762,6 +762,69 @@
762
762
  "history.js"
763
763
  ]
764
764
  },
765
+ "workflow:input": {
766
+ "aliases": [],
767
+ "args": {
768
+ "workflowId": {
769
+ "description": "The workflow ID to get the input for",
770
+ "name": "workflowId",
771
+ "required": true
772
+ }
773
+ },
774
+ "description": "Get the original input a workflow run was started with",
775
+ "examples": [
776
+ "<%= config.bin %> <%= command.id %> wf-12345",
777
+ "<%= config.bin %> <%= command.id %> wf-12345 --run-id 11111111-2222-4333-8444-555555555555",
778
+ "<%= config.bin %> <%= command.id %> wf-12345 -o w_input.json",
779
+ "<%= config.bin %> <%= command.id %> wf-12345 --output-file w_input.json --force"
780
+ ],
781
+ "flags": {
782
+ "json": {
783
+ "description": "Format output as json.",
784
+ "helpGroup": "GLOBAL",
785
+ "name": "json",
786
+ "allowNo": false,
787
+ "type": "boolean"
788
+ },
789
+ "run-id": {
790
+ "description": "Specific run id to target (defaults to the latest run)",
791
+ "name": "run-id",
792
+ "hasDynamicHelp": false,
793
+ "multiple": false,
794
+ "type": "option"
795
+ },
796
+ "output-file": {
797
+ "char": "o",
798
+ "description": "Write the input JSON to this file instead of stdout",
799
+ "name": "output-file",
800
+ "hasDynamicHelp": false,
801
+ "multiple": false,
802
+ "type": "option"
803
+ },
804
+ "force": {
805
+ "char": "f",
806
+ "description": "Overwrite the output file if it already exists",
807
+ "name": "force",
808
+ "allowNo": false,
809
+ "type": "boolean"
810
+ }
811
+ },
812
+ "hasDynamicHelp": false,
813
+ "hiddenAliases": [],
814
+ "id": "workflow:input",
815
+ "pluginAlias": "@outputai/cli",
816
+ "pluginName": "@outputai/cli",
817
+ "pluginType": "core",
818
+ "strict": true,
819
+ "enableJsonFlag": true,
820
+ "isESM": true,
821
+ "relativePath": [
822
+ "dist",
823
+ "commands",
824
+ "workflow",
825
+ "input.js"
826
+ ]
827
+ },
765
828
  "workflow:list": {
766
829
  "aliases": [],
767
830
  "args": {},
@@ -1303,6 +1366,81 @@
1303
1366
  "test_eval.js"
1304
1367
  ]
1305
1368
  },
1369
+ "workflow:runs:list": {
1370
+ "aliases": [],
1371
+ "args": {
1372
+ "workflowName": {
1373
+ "description": "Filter by workflow type/name",
1374
+ "name": "workflowName",
1375
+ "required": false
1376
+ }
1377
+ },
1378
+ "description": "List workflow runs with optional filtering by workflow type",
1379
+ "examples": [
1380
+ "<%= config.bin %> <%= command.id %>",
1381
+ "<%= config.bin %> <%= command.id %> simple",
1382
+ "<%= config.bin %> <%= command.id %> simple --limit 10",
1383
+ "<%= config.bin %> <%= command.id %> --catalog my-catalog",
1384
+ "<%= config.bin %> <%= command.id %> --json",
1385
+ "<%= config.bin %> <%= command.id %> --format table"
1386
+ ],
1387
+ "flags": {
1388
+ "json": {
1389
+ "description": "Format output as json.",
1390
+ "helpGroup": "GLOBAL",
1391
+ "name": "json",
1392
+ "allowNo": false,
1393
+ "type": "boolean"
1394
+ },
1395
+ "catalog": {
1396
+ "char": "c",
1397
+ "description": "Filter runs by catalog (defaults to OUTPUT_CATALOG_ID)",
1398
+ "env": "OUTPUT_CATALOG_ID",
1399
+ "name": "catalog",
1400
+ "hasDynamicHelp": false,
1401
+ "multiple": false,
1402
+ "type": "option"
1403
+ },
1404
+ "limit": {
1405
+ "char": "l",
1406
+ "description": "Maximum number of runs to return",
1407
+ "name": "limit",
1408
+ "default": 100,
1409
+ "hasDynamicHelp": false,
1410
+ "multiple": false,
1411
+ "type": "option"
1412
+ },
1413
+ "format": {
1414
+ "char": "f",
1415
+ "description": "Output format (use --json for JSON output)",
1416
+ "name": "format",
1417
+ "default": "table",
1418
+ "hasDynamicHelp": false,
1419
+ "multiple": false,
1420
+ "options": [
1421
+ "table",
1422
+ "text"
1423
+ ],
1424
+ "type": "option"
1425
+ }
1426
+ },
1427
+ "hasDynamicHelp": false,
1428
+ "hiddenAliases": [],
1429
+ "id": "workflow:runs:list",
1430
+ "pluginAlias": "@outputai/cli",
1431
+ "pluginName": "@outputai/cli",
1432
+ "pluginType": "core",
1433
+ "strict": true,
1434
+ "enableJsonFlag": true,
1435
+ "isESM": true,
1436
+ "relativePath": [
1437
+ "dist",
1438
+ "commands",
1439
+ "workflow",
1440
+ "runs",
1441
+ "list.js"
1442
+ ]
1443
+ },
1306
1444
  "workflow:dataset:generate": {
1307
1445
  "aliases": [],
1308
1446
  "args": {
@@ -1457,82 +1595,7 @@
1457
1595
  "dataset",
1458
1596
  "list.js"
1459
1597
  ]
1460
- },
1461
- "workflow:runs:list": {
1462
- "aliases": [],
1463
- "args": {
1464
- "workflowName": {
1465
- "description": "Filter by workflow type/name",
1466
- "name": "workflowName",
1467
- "required": false
1468
- }
1469
- },
1470
- "description": "List workflow runs with optional filtering by workflow type",
1471
- "examples": [
1472
- "<%= config.bin %> <%= command.id %>",
1473
- "<%= config.bin %> <%= command.id %> simple",
1474
- "<%= config.bin %> <%= command.id %> simple --limit 10",
1475
- "<%= config.bin %> <%= command.id %> --catalog my-catalog",
1476
- "<%= config.bin %> <%= command.id %> --json",
1477
- "<%= config.bin %> <%= command.id %> --format table"
1478
- ],
1479
- "flags": {
1480
- "json": {
1481
- "description": "Format output as json.",
1482
- "helpGroup": "GLOBAL",
1483
- "name": "json",
1484
- "allowNo": false,
1485
- "type": "boolean"
1486
- },
1487
- "catalog": {
1488
- "char": "c",
1489
- "description": "Filter runs by catalog (defaults to OUTPUT_CATALOG_ID)",
1490
- "env": "OUTPUT_CATALOG_ID",
1491
- "name": "catalog",
1492
- "hasDynamicHelp": false,
1493
- "multiple": false,
1494
- "type": "option"
1495
- },
1496
- "limit": {
1497
- "char": "l",
1498
- "description": "Maximum number of runs to return",
1499
- "name": "limit",
1500
- "default": 100,
1501
- "hasDynamicHelp": false,
1502
- "multiple": false,
1503
- "type": "option"
1504
- },
1505
- "format": {
1506
- "char": "f",
1507
- "description": "Output format (use --json for JSON output)",
1508
- "name": "format",
1509
- "default": "table",
1510
- "hasDynamicHelp": false,
1511
- "multiple": false,
1512
- "options": [
1513
- "table",
1514
- "text"
1515
- ],
1516
- "type": "option"
1517
- }
1518
- },
1519
- "hasDynamicHelp": false,
1520
- "hiddenAliases": [],
1521
- "id": "workflow:runs:list",
1522
- "pluginAlias": "@outputai/cli",
1523
- "pluginName": "@outputai/cli",
1524
- "pluginType": "core",
1525
- "strict": true,
1526
- "enableJsonFlag": true,
1527
- "isESM": true,
1528
- "relativePath": [
1529
- "dist",
1530
- "commands",
1531
- "workflow",
1532
- "runs",
1533
- "list.js"
1534
- ]
1535
1598
  }
1536
1599
  },
1537
- "version": "0.9.2"
1600
+ "version": "0.9.3-next.14a0cfc.0"
1538
1601
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outputai/cli",
3
- "version": "0.9.2",
3
+ "version": "0.9.3-next.14a0cfc.0",
4
4
  "description": "CLI for Output.ai workflow generation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -39,9 +39,9 @@
39
39
  "semver": "7.7.4",
40
40
  "undici": "8.5.0",
41
41
  "yaml": "^2.8.3",
42
- "@outputai/credentials": "0.9.2",
43
- "@outputai/llm": "0.9.2",
44
- "@outputai/evals": "0.9.2"
42
+ "@outputai/credentials": "0.9.3-next.14a0cfc.0",
43
+ "@outputai/evals": "0.9.3-next.14a0cfc.0",
44
+ "@outputai/llm": "0.9.3-next.14a0cfc.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/cli-progress": "3.11.6",