@outputai/cli 0.9.1-next.6fe398d.0 → 0.9.1

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 (36) hide show
  1. package/dist/assets/docker/docker-compose-dev.yml +1 -1
  2. package/dist/commands/workflow/history.d.ts +19 -0
  3. package/dist/commands/workflow/history.js +99 -0
  4. package/dist/commands/workflow/history.spec.d.ts +1 -0
  5. package/dist/commands/workflow/history.spec.js +26 -0
  6. package/dist/generated/framework_version.json +1 -1
  7. package/dist/services/workflow_history/correlator.d.ts +26 -0
  8. package/dist/services/workflow_history/correlator.js +261 -0
  9. package/dist/services/workflow_history/correlator.spec.d.ts +1 -0
  10. package/dist/services/workflow_history/correlator.spec.js +116 -0
  11. package/dist/services/workflow_history.d.ts +23 -0
  12. package/dist/services/workflow_history.js +79 -0
  13. package/dist/services/workflow_history.spec.d.ts +1 -0
  14. package/dist/services/workflow_history.spec.js +87 -0
  15. package/dist/utils/span_labels.d.ts +11 -0
  16. package/dist/utils/span_labels.js +22 -0
  17. package/dist/utils/span_labels.spec.d.ts +1 -0
  18. package/dist/utils/span_labels.spec.js +36 -0
  19. package/dist/utils/waterfall.d.ts +31 -0
  20. package/dist/utils/waterfall.js +192 -0
  21. package/dist/utils/waterfall.spec.d.ts +1 -0
  22. package/dist/utils/waterfall.spec.js +100 -0
  23. package/dist/views/dev/dev_app.js +17 -3
  24. package/dist/views/dev/hooks/use_step_graph.d.ts +22 -0
  25. package/dist/views/dev/hooks/use_step_graph.js +76 -0
  26. package/dist/views/dev/modals/step_graph_modal.d.ts +6 -0
  27. package/dist/views/dev/modals/step_graph_modal.js +148 -0
  28. package/dist/views/dev/modals/steps_modal.js +1 -1
  29. package/dist/views/dev/panels/runs_panel.js +7 -2
  30. package/dist/views/dev/panels/workflows_panel.js +1 -1
  31. package/dist/views/dev/state/ui_state.d.ts +8 -0
  32. package/dist/views/dev/state/ui_state.js +5 -1
  33. package/oclif.manifest.json +81 -1
  34. package/package.json +4 -4
  35. /package/dist/views/dev/utils/{constants.d.ts → ui_constants.d.ts} +0 -0
  36. /package/dist/views/dev/utils/{constants.js → ui_constants.js} +0 -0
@@ -0,0 +1,148 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useInput, useStdout } from 'ink';
4
+ import { computeBar, buildRulerLine, formatDurationLabel, FULL_BLOCK, THIN_BLOCK } from '#utils/waterfall.js';
5
+ import { useStepGraph } from '#views/dev/hooks/use_step_graph.js';
6
+ import { isTerminalRunStatus } from '#views/dev/hooks/use_run_detail.js';
7
+ import { LoadingSpinner } from '#views/dev/chrome/loading_spinner.js';
8
+ import { SelectionIndicator } from '#views/dev/chrome/selection_indicator.js';
9
+ import { ModalFrame, getHeight as getModalFrameHeight } from '#views/dev/modals/modal_frame.js';
10
+ import { MasterDetailPanel } from '#views/dev/components/master_detail_panel.js';
11
+ import { ContentTitle, getHeight as getContentTitleHeight } from '#views/dev/components/content_title.js';
12
+ import { TabBar, getHeight as getTabBarHeight } from '#views/dev/chrome/tab_bar.js';
13
+ import { JsonView } from '#views/dev/utils/json_render.js';
14
+ import { workflowStatusColor } from '#views/dev/components/workflow_status.js';
15
+ import { useUiState } from '#views/dev/state/ui_state.js';
16
+ import { capitalize, cycleValue, formatContentTitle, formatStartedShort, truncate, useListSelection } from '#views/dev/utils/panel_helpers.js';
17
+ const FRAME_WIDTH_OVERHEAD = 6; // outer paddingX (2) + round border (2) + inner paddingX (2)
18
+ const META_ROWS = 2; // run status/started line + its bottom margin
19
+ const FALLBACK_COLS = 100;
20
+ const MIN_WIDTH = 40;
21
+ const MIN_TRACK = 10;
22
+ const VISIBLE_ROWS = 10;
23
+ const TICK_MS = 1_000;
24
+ const COL = { sel: 3, label: 22, duration: 8 };
25
+ const PANE_ORDER = ['input', 'output', 'meta'];
26
+ const PANE_TABS = [
27
+ { id: 'input', label: 'Input' },
28
+ { id: 'output', label: 'Output' },
29
+ { id: 'meta', label: 'Meta' }
30
+ ];
31
+ const STEP_GRAPH_SHORTCUTS = [
32
+ ['↑/↓', 'navigate'],
33
+ ['←/→', 'tab'],
34
+ ['e', 'expand'],
35
+ ['esc', 'close']
36
+ ];
37
+ const parseMs = (iso) => {
38
+ if (!iso) {
39
+ return null;
40
+ }
41
+ const ms = Date.parse(iso);
42
+ return Number.isNaN(ms) ? null : ms;
43
+ };
44
+ const spanColor = (status) => (status === 'pending' ? 'gray' : workflowStatusColor(status));
45
+ // Stretch a still-running step's bar to the live edge so it visibly grows.
46
+ const toLiveSpans = (spans, totalMs, terminal) => {
47
+ if (terminal) {
48
+ return spans;
49
+ }
50
+ return spans.map(span => (span.status === 'running' ?
51
+ { ...span, endOffsetMs: Math.max(span.endOffsetMs, totalMs), durationMs: Math.max(0, totalMs - span.startOffsetMs) } :
52
+ span));
53
+ };
54
+ const spanPaneValue = (span, tab) => {
55
+ if (tab === 'input') {
56
+ return span.input;
57
+ }
58
+ if (tab === 'output') {
59
+ return span.failureMessage ?? span.output;
60
+ }
61
+ return {
62
+ status: span.status,
63
+ started: span.startedAt,
64
+ ended: span.completedAt,
65
+ duration: formatDurationLabel(Math.max(0, span.durationMs)),
66
+ startOffset: formatDurationLabel(Math.max(0, span.startOffsetMs)),
67
+ attempt: span.attempt,
68
+ kind: span.kind,
69
+ step: span.technicalName
70
+ };
71
+ };
72
+ const RulerRow = ({ trackW, totalMs }) => (_jsxs(Box, { children: [_jsx(Box, { width: COL.sel + COL.label, children: _jsx(Text, { children: " " }) }), _jsx(Box, { width: trackW, children: _jsx(Text, { dimColor: true, children: buildRulerLine(totalMs, trackW) }) }), _jsx(Box, { width: COL.duration, children: _jsx(Text, { children: " " }) })] }));
73
+ const SpanRow = ({ span, label, selected, trackW, totalMs }) => {
74
+ const { startCol, barLen, instantaneous } = computeBar(span.startOffsetMs, span.endOffsetMs, totalMs, trackW);
75
+ const glyph = instantaneous ? THIN_BLOCK : FULL_BLOCK;
76
+ const bar = `${' '.repeat(startCol)}${glyph.repeat(barLen)}${' '.repeat(Math.max(0, trackW - startCol - barLen))}`;
77
+ return (_jsxs(Box, { children: [_jsx(Box, { width: COL.sel, children: _jsx(SelectionIndicator, { selected: selected }) }), _jsx(Box, { width: COL.label, children: _jsx(Text, { bold: selected, children: truncate(label, COL.label - 1) }) }), _jsx(Box, { width: trackW, children: _jsx(Text, { color: spanColor(span.status), children: bar }) }), _jsx(Box, { width: COL.duration, justifyContent: "flex-end", children: _jsx(Text, { dimColor: !selected, children: formatDurationLabel(Math.max(0, span.durationMs)) }) })] }));
78
+ };
79
+ const SpanDetail = ({ span, activeTab, label, rows }) => {
80
+ if (!span) {
81
+ return _jsx(Text, { dimColor: true, children: "Select a step to see its input, output, and timing." });
82
+ }
83
+ const tabContentRows = Math.max(1, rows - getContentTitleHeight() - getTabBarHeight());
84
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(ContentTitle, { title: formatContentTitle([`Step "${label}"`, capitalize(activeTab)]) }), _jsx(TabBar, { active: activeTab, items: PANE_TABS }), _jsx(Box, { flexDirection: "column", children: _jsx(JsonView, { value: spanPaneValue(span, activeTab), maxLines: tabContentRows, truncateLine: true }) })] }));
85
+ };
86
+ export const StepGraphModal = ({ run, height }) => {
87
+ const ui = useUiState();
88
+ const { stdout } = useStdout();
89
+ const { spans, totalDurationMs, workflow, labels, loading, error } = useStepGraph(run.workflowId, run.runId, run.status);
90
+ const status = run.status ?? 'unknown';
91
+ const terminal = isTerminalRunStatus(status);
92
+ // Tick once a second while the run is live so the axis advances between polls.
93
+ const [now, setNow] = useState(() => Date.now());
94
+ useEffect(() => {
95
+ const timer = terminal ? undefined : setInterval(() => setNow(Date.now()), TICK_MS);
96
+ return () => {
97
+ if (timer) {
98
+ clearInterval(timer);
99
+ }
100
+ };
101
+ }, [terminal]);
102
+ // Recorded history only reaches the last event; for a running run grow the
103
+ // axis to elapsed wall-clock so the right edge tracks "now", not open time.
104
+ const startMs = parseMs(workflow?.startTime) ?? parseMs(run.startedAt);
105
+ const liveTotalMs = terminal || startMs === null ? totalDurationMs : Math.max(totalDurationMs, now - startMs);
106
+ const liveSpans = toLiveSpans(spans, liveTotalMs, terminal);
107
+ const { selectedIndex, selectPrevious, selectNext } = useListSelection(liveSpans.length);
108
+ const selectedSpan = liveSpans[selectedIndex];
109
+ const labelFor = (span) => labels.get(span.id) ?? span.name;
110
+ const activeTab = ui.runStepPaneTab;
111
+ useInput((input, key) => {
112
+ if (key.escape) {
113
+ ui.closeStepGraph();
114
+ return;
115
+ }
116
+ if (key.upArrow) {
117
+ selectPrevious();
118
+ return;
119
+ }
120
+ if (key.downArrow) {
121
+ selectNext();
122
+ return;
123
+ }
124
+ if (key.leftArrow || key.rightArrow) {
125
+ ui.setRunStepPaneTab(cycleValue(PANE_ORDER, activeTab, key.rightArrow ? 1 : -1));
126
+ return;
127
+ }
128
+ if (input === 'e' && selectedSpan) {
129
+ ui.openExpandedJson(spanPaneValue(selectedSpan, activeTab), `step: ${labelFor(selectedSpan)} → ${activeTab}`);
130
+ }
131
+ }, { isActive: ui.stepGraph.open && !ui.expandedJson.open });
132
+ const width = Math.max(MIN_WIDTH, (stdout?.columns ?? FALLBACK_COLS) - FRAME_WIDTH_OVERHEAD);
133
+ const trackW = Math.max(MIN_TRACK, width - COL.sel - COL.label - COL.duration);
134
+ const contentRows = Math.max(1, height - getModalFrameHeight() - META_ROWS);
135
+ const renderContent = () => {
136
+ if (error) {
137
+ return _jsxs(Text, { color: "red", wrap: "truncate-end", children: ["Failed to load history: ", error] });
138
+ }
139
+ if (loading && liveSpans.length === 0) {
140
+ return _jsx(LoadingSpinner, { label: "Loading step graph..." });
141
+ }
142
+ if (liveSpans.length === 0) {
143
+ return _jsx(Text, { dimColor: true, children: "No steps recorded for this run." });
144
+ }
145
+ return (_jsx(MasterDetailPanel, { items: liveSpans, selectedIndex: selectedIndex, height: contentRows, visibleRows: VISIBLE_ROWS, renderHeader: () => _jsx(RulerRow, { trackW: trackW, totalMs: liveTotalMs }), renderRow: (span, selected) => (_jsx(SpanRow, { span: span, label: labelFor(span), selected: selected, trackW: trackW, totalMs: liveTotalMs })), rowKey: span => span.id, detail: ({ detailRows }) => (_jsx(SpanDetail, { span: selectedSpan, activeTab: activeTab, label: selectedSpan ? labelFor(selectedSpan) : '', rows: detailRows })) }));
146
+ };
147
+ return (_jsx(ModalFrame, { title: formatContentTitle([`Workflow "${run.workflowType}"`, 'Step graph']), titleRight: _jsx(Text, { dimColor: true, children: formatDurationLabel(liveTotalMs) }), shortcuts: STEP_GRAPH_SHORTCUTS, children: _jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { columnGap: 2, marginBottom: 1, children: [_jsx(Text, { color: workflowStatusColor(status), bold: true, children: status }), _jsxs(Text, { dimColor: true, children: ["started ", formatStartedShort(run.startedAt)] })] }), renderContent()] }) }));
148
+ };
@@ -9,7 +9,7 @@ import { useUiState } from '#views/dev/state/ui_state.js';
9
9
  import { useRunDetail } from '#views/dev/hooks/use_run_detail.js';
10
10
  import { JsonView } from '#views/dev/utils/json_render.js';
11
11
  import { cycleValue, formatContentTitle, truncate, useListSelection } from '#views/dev/utils/panel_helpers.js';
12
- import { RUN_DETAIL_VISIBLE_STEPS } from '#views/dev/utils/constants.js';
12
+ import { RUN_DETAIL_VISIBLE_STEPS } from '#views/dev/utils/ui_constants.js';
13
13
  import { ContentTitle, getHeight as getContentTitleHeight } from '#views/dev/components/content_title.js';
14
14
  import { MasterDetailPanel } from '#views/dev/components/master_detail_panel.js';
15
15
  import { ModalFrame, getHeight as getModalFrameHeight } from '#views/dev/modals/modal_frame.js';
@@ -14,7 +14,7 @@ import { JsonView } from '#views/dev/utils/json_render.js';
14
14
  import { RunInfoSidebar } from '#views/dev/components/run_info_sidebar.js';
15
15
  import { MasterDetailPanel } from '#views/dev/components/master_detail_panel.js';
16
16
  import { capitalize, cycleValue, formatContentTitle, formatStartedShort, hasJsonValue, truncate, useListSelection } from '#views/dev/utils/panel_helpers.js';
17
- import { CATALOG_WORKFLOW_NAME, RUNS_VISIBLE_ROWS } from '#views/dev/utils/constants.js';
17
+ import { CATALOG_WORKFLOW_NAME, RUNS_VISIBLE_ROWS } from '#views/dev/utils/ui_constants.js';
18
18
  const TEMPORAL_UI_BASE = 'http://localhost:8080';
19
19
  const STATUS_ORDER = {
20
20
  running: 0,
@@ -121,6 +121,7 @@ const DetailPane = ({ run, pane, rows }) => {
121
121
  export const RUNS_HINTS = [
122
122
  { key: '↑/↓', label: 'navigate' },
123
123
  { key: 'enter', label: 'open' },
124
+ { key: 'g', label: 'graph' },
124
125
  { key: '←/→', label: 'switch pane' },
125
126
  { key: 'e', label: 'expand' },
126
127
  { key: 'o', label: 'temporal' }
@@ -173,6 +174,10 @@ export const RunsPanel = ({ runs, height }) => {
173
174
  ui.setRunsView('detail');
174
175
  return;
175
176
  }
177
+ if (input === 'g' && selectedRun?.workflowId) {
178
+ ui.openStepGraph(selectedRun);
179
+ return;
180
+ }
176
181
  if (key.leftArrow || key.rightArrow) {
177
182
  ui.setRunListPaneTab(cycleValue(RUN_INFO_TAB_ORDER, ui.runListPaneTab, key.rightArrow ? 1 : -1));
178
183
  return;
@@ -183,7 +188,7 @@ export const RunsPanel = ({ runs, height }) => {
183
188
  const title = formatContentTitle(['Recent Runs', `Workflow "${selectedRun?.workflowType ?? ''}"`, capitalize(activePane)]);
184
189
  ui.openExpandedJson(content, title);
185
190
  }
186
- }, { isActive: ui.tab === 'runs' && ui.runsView === 'list' && !ui.search.open });
191
+ }, { isActive: ui.tab === 'runs' && ui.runsView === 'list' && !ui.search.open && !ui.stepGraph.open });
187
192
  if (runs.length === 0) {
188
193
  return (_jsx(Box, { flexDirection: "column", children: _jsx(Text, { dimColor: true, children: "No runs yet. Trigger one from the Workflows tab or with `output workflow run \u2026`." }) }));
189
194
  }
@@ -8,7 +8,7 @@ import { SelectionIndicator } from '#views/dev/chrome/selection_indicator.js';
8
8
  import { useUiState } from '#views/dev/state/ui_state.js';
9
9
  import { MasterDetailPanel } from '#views/dev/components/master_detail_panel.js';
10
10
  import { formatStartedShort, useListSelection } from '#views/dev/utils/panel_helpers.js';
11
- import { WORKFLOWS_VISIBLE_ROWS, WORKFLOWS_RECENT_RUNS_LIMIT } from '#views/dev/utils/constants.js';
11
+ import { WORKFLOWS_VISIBLE_ROWS, WORKFLOWS_RECENT_RUNS_LIMIT } from '#views/dev/utils/ui_constants.js';
12
12
  const COL = {
13
13
  indicator: 3,
14
14
  name: 30
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import type { WorkflowRun } from '#services/workflow_runs.js';
2
3
  export type Tab = 'workflows' | 'runs' | 'services' | 'help';
3
4
  export declare const TAB_ORDER: Tab[];
4
5
  export declare const TAB_LABELS: Record<Tab, string>;
@@ -25,6 +26,10 @@ export interface ExpandedJsonState {
25
26
  value: unknown;
26
27
  title: string;
27
28
  }
29
+ export interface StepGraphState {
30
+ open: boolean;
31
+ run: WorkflowRun | null;
32
+ }
28
33
  export interface Toast {
29
34
  id: number;
30
35
  message: string;
@@ -40,6 +45,7 @@ export interface UiState {
40
45
  runsView: RunsView;
41
46
  runModal: RunModalState;
42
47
  expandedJson: ExpandedJsonState;
48
+ stepGraph: StepGraphState;
43
49
  toasts: Toast[];
44
50
  setTab: (tab: Tab) => void;
45
51
  nextTab: () => void;
@@ -56,6 +62,8 @@ export interface UiState {
56
62
  closeRunModal: () => void;
57
63
  openExpandedJson: (value: unknown, title: string) => void;
58
64
  closeExpandedJson: () => void;
65
+ openStepGraph: (run: WorkflowRun) => void;
66
+ closeStepGraph: () => void;
59
67
  pushToast: (message: string, tone?: Toast['tone']) => void;
60
68
  dismissToast: (id: number) => void;
61
69
  }
@@ -18,6 +18,7 @@ export const UiStateProvider = ({ children }) => {
18
18
  const [runsView, setRunsView] = useState('list');
19
19
  const [runModal, setRunModal] = useState({ open: false, workflowName: '' });
20
20
  const [expandedJson, setExpandedJson] = useState({ open: false, value: null, title: '' });
21
+ const [stepGraph, setStepGraph] = useState({ open: false, run: null });
21
22
  const [toasts, setToasts] = useState([]);
22
23
  const toastIdRef = useRef(0);
23
24
  const value = useMemo(() => ({
@@ -29,6 +30,7 @@ export const UiStateProvider = ({ children }) => {
29
30
  runsView,
30
31
  runModal,
31
32
  expandedJson,
33
+ stepGraph,
32
34
  toasts,
33
35
  setTab: next => {
34
36
  setTab(current => {
@@ -64,12 +66,14 @@ export const UiStateProvider = ({ children }) => {
64
66
  closeRunModal: () => setRunModal({ open: false, workflowName: '' }),
65
67
  openExpandedJson: (value, title) => setExpandedJson({ open: true, value, title }),
66
68
  closeExpandedJson: () => setExpandedJson({ open: false, value: null, title: '' }),
69
+ openStepGraph: (run) => setStepGraph({ open: true, run }),
70
+ closeStepGraph: () => setStepGraph({ open: false, run: null }),
67
71
  pushToast: (message, tone = 'info') => {
68
72
  const id = ++toastIdRef.current;
69
73
  setToasts(prev => [...prev, { id, message, tone }].slice(-MAX_VISIBLE_TOASTS));
70
74
  },
71
75
  dismissToast: (id) => setToasts(prev => prev.filter(t => t.id !== id))
72
- }), [tab, search, selection, runListPaneTab, runStepPaneTab, runsView, runModal, expandedJson, toasts]);
76
+ }), [tab, search, selection, runListPaneTab, runStepPaneTab, runsView, runModal, expandedJson, stepGraph, toasts]);
73
77
  return _jsx(UiStateContext.Provider, { value: value, children: children });
74
78
  };
75
79
  export const useUiState = () => {
@@ -682,6 +682,86 @@
682
682
  "generate.js"
683
683
  ]
684
684
  },
685
+ "workflow:history": {
686
+ "aliases": [],
687
+ "args": {
688
+ "workflowId": {
689
+ "description": "The workflow ID to show history for",
690
+ "name": "workflowId",
691
+ "required": true
692
+ }
693
+ },
694
+ "description": "Show a workflow run's step timeline as a waterfall (durations and start times)",
695
+ "examples": [
696
+ "<%= config.bin %> <%= command.id %> wf-12345",
697
+ "<%= config.bin %> <%= command.id %> wf-12345 --run-id 2fe0b36b-...",
698
+ "<%= config.bin %> <%= command.id %> wf-12345 --format json",
699
+ "<%= config.bin %> <%= command.id %> wf-12345 --raw --include-payloads"
700
+ ],
701
+ "flags": {
702
+ "run-id": {
703
+ "char": "r",
704
+ "description": "Show a specific run (defaults to the latest run)",
705
+ "name": "run-id",
706
+ "hasDynamicHelp": false,
707
+ "multiple": false,
708
+ "type": "option"
709
+ },
710
+ "format": {
711
+ "char": "f",
712
+ "description": "Output format",
713
+ "name": "format",
714
+ "default": "text",
715
+ "hasDynamicHelp": false,
716
+ "multiple": false,
717
+ "options": [
718
+ "text",
719
+ "json"
720
+ ],
721
+ "type": "option"
722
+ },
723
+ "raw": {
724
+ "description": "Print the history endpoint's raw response (workflow + events)",
725
+ "name": "raw",
726
+ "allowNo": false,
727
+ "type": "boolean"
728
+ },
729
+ "include-payloads": {
730
+ "description": "Include decoded step input/output payloads",
731
+ "name": "include-payloads",
732
+ "allowNo": false,
733
+ "type": "boolean"
734
+ },
735
+ "width": {
736
+ "description": "Override the detected terminal width",
737
+ "name": "width",
738
+ "hasDynamicHelp": false,
739
+ "multiple": false,
740
+ "type": "option"
741
+ },
742
+ "color": {
743
+ "description": "Colorize the waterfall (use --no-color to disable)",
744
+ "name": "color",
745
+ "allowNo": true,
746
+ "type": "boolean"
747
+ }
748
+ },
749
+ "hasDynamicHelp": false,
750
+ "hiddenAliases": [],
751
+ "id": "workflow:history",
752
+ "pluginAlias": "@outputai/cli",
753
+ "pluginName": "@outputai/cli",
754
+ "pluginType": "core",
755
+ "strict": true,
756
+ "enableJsonFlag": false,
757
+ "isESM": true,
758
+ "relativePath": [
759
+ "dist",
760
+ "commands",
761
+ "workflow",
762
+ "history.js"
763
+ ]
764
+ },
685
765
  "workflow:list": {
686
766
  "aliases": [],
687
767
  "args": {},
@@ -1454,5 +1534,5 @@
1454
1534
  ]
1455
1535
  }
1456
1536
  },
1457
- "version": "0.9.1-next.6fe398d.0"
1537
+ "version": "0.9.1"
1458
1538
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outputai/cli",
3
- "version": "0.9.1-next.6fe398d.0",
3
+ "version": "0.9.1",
4
4
  "description": "CLI for Output.ai workflow generation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -36,9 +36,9 @@
36
36
  "semver": "7.7.4",
37
37
  "undici": "8.5.0",
38
38
  "yaml": "^2.8.3",
39
- "@outputai/credentials": "0.9.1-next.6fe398d.0",
40
- "@outputai/evals": "0.9.1-next.6fe398d.0",
41
- "@outputai/llm": "0.9.1-next.6fe398d.0"
39
+ "@outputai/evals": "0.9.1",
40
+ "@outputai/llm": "0.9.1",
41
+ "@outputai/credentials": "0.9.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/cli-progress": "3.11.6",