opencode-top 3.1.1 → 3.2.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 (103) hide show
  1. package/bin/octop.js +2 -9
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +22432 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/cli.mjs +22570 -0
  7. package/dist/core/agents.d.ts +11 -0
  8. package/dist/core/agents.d.ts.map +1 -0
  9. package/dist/core/agents.js +58 -0
  10. package/dist/core/agents.js.map +1 -0
  11. package/dist/core/session.d.ts +19 -0
  12. package/dist/core/session.d.ts.map +1 -0
  13. package/dist/core/session.js +261 -0
  14. package/dist/core/session.js.map +1 -0
  15. package/dist/core/types.d.ts +140 -0
  16. package/dist/core/types.d.ts.map +1 -0
  17. package/dist/core/types.js +29 -0
  18. package/dist/core/types.js.map +1 -0
  19. package/dist/data/pricing.d.ts +4 -0
  20. package/dist/data/pricing.d.ts.map +1 -0
  21. package/dist/data/pricing.js +76 -0
  22. package/dist/data/pricing.js.map +1 -0
  23. package/dist/data/sqlite.d.ts +5 -0
  24. package/dist/data/sqlite.d.ts.map +1 -0
  25. package/dist/data/sqlite.js +222 -0
  26. package/dist/data/sqlite.js.map +1 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/{src/index.ts → dist/index.js} +1 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/ui/App.d.ts +6 -0
  32. package/dist/ui/App.d.ts.map +1 -0
  33. package/dist/ui/App.js +101 -0
  34. package/dist/ui/App.js.map +1 -0
  35. package/dist/ui/components/AgentChainGraph.d.ts +9 -0
  36. package/dist/ui/components/AgentChainGraph.d.ts.map +1 -0
  37. package/dist/ui/components/AgentChainGraph.js +41 -0
  38. package/dist/ui/components/AgentChainGraph.js.map +1 -0
  39. package/dist/ui/components/AgentTree.d.ts +13 -0
  40. package/dist/ui/components/AgentTree.d.ts.map +1 -0
  41. package/dist/ui/components/AgentTree.js +50 -0
  42. package/dist/ui/components/AgentTree.js.map +1 -0
  43. package/dist/ui/components/DetailsPanel.d.ts +9 -0
  44. package/dist/ui/components/DetailsPanel.d.ts.map +1 -0
  45. package/dist/ui/components/DetailsPanel.js +82 -0
  46. package/dist/ui/components/DetailsPanel.js.map +1 -0
  47. package/dist/ui/components/MessagesPanel.d.ts +12 -0
  48. package/dist/ui/components/MessagesPanel.d.ts.map +1 -0
  49. package/dist/ui/components/MessagesPanel.js +107 -0
  50. package/dist/ui/components/MessagesPanel.js.map +1 -0
  51. package/dist/ui/components/SparkLine.d.ts +10 -0
  52. package/dist/ui/components/SparkLine.d.ts.map +1 -0
  53. package/dist/ui/components/SparkLine.js +12 -0
  54. package/dist/ui/components/SparkLine.js.map +1 -0
  55. package/dist/ui/components/StatusBar.d.ts +9 -0
  56. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  57. package/dist/ui/components/StatusBar.js +9 -0
  58. package/dist/ui/components/StatusBar.js.map +1 -0
  59. package/dist/ui/components/TabBar.d.ts +10 -0
  60. package/dist/ui/components/TabBar.d.ts.map +1 -0
  61. package/dist/ui/components/TabBar.js +17 -0
  62. package/dist/ui/components/TabBar.js.map +1 -0
  63. package/dist/ui/screens/OverviewScreen.d.ts +12 -0
  64. package/dist/ui/screens/OverviewScreen.d.ts.map +1 -0
  65. package/dist/ui/screens/OverviewScreen.js +94 -0
  66. package/dist/ui/screens/OverviewScreen.js.map +1 -0
  67. package/dist/ui/screens/SessionsScreen.d.ts +12 -0
  68. package/dist/ui/screens/SessionsScreen.d.ts.map +1 -0
  69. package/dist/ui/screens/SessionsScreen.js +98 -0
  70. package/dist/ui/screens/SessionsScreen.js.map +1 -0
  71. package/dist/ui/screens/TimelineScreen.d.ts +11 -0
  72. package/dist/ui/screens/TimelineScreen.d.ts.map +1 -0
  73. package/dist/ui/screens/TimelineScreen.js +128 -0
  74. package/dist/ui/screens/TimelineScreen.js.map +1 -0
  75. package/dist/ui/screens/ToolsScreen.d.ts +12 -0
  76. package/dist/ui/screens/ToolsScreen.d.ts.map +1 -0
  77. package/dist/ui/screens/ToolsScreen.js +113 -0
  78. package/dist/ui/screens/ToolsScreen.js.map +1 -0
  79. package/dist/ui/theme.d.ts +21 -0
  80. package/dist/ui/theme.d.ts.map +1 -0
  81. package/dist/ui/theme.js +21 -0
  82. package/dist/ui/theme.js.map +1 -0
  83. package/package.json +2 -1
  84. package/bin/octop.mjs +0 -13
  85. package/src/cli.ts +0 -60
  86. package/src/core/agents.ts +0 -78
  87. package/src/core/session.ts +0 -315
  88. package/src/core/types.ts +0 -156
  89. package/src/data/pricing.ts +0 -82
  90. package/src/data/sqlite.ts +0 -347
  91. package/src/ui/App.tsx +0 -141
  92. package/src/ui/components/AgentChainGraph.tsx +0 -95
  93. package/src/ui/components/AgentTree.tsx +0 -101
  94. package/src/ui/components/DetailsPanel.tsx +0 -211
  95. package/src/ui/components/MessagesPanel.tsx +0 -323
  96. package/src/ui/components/SparkLine.tsx +0 -18
  97. package/src/ui/components/StatusBar.tsx +0 -24
  98. package/src/ui/components/TabBar.tsx +0 -42
  99. package/src/ui/screens/OverviewScreen.tsx +0 -327
  100. package/src/ui/screens/SessionsScreen.tsx +0 -168
  101. package/src/ui/screens/TimelineScreen.tsx +0 -222
  102. package/src/ui/screens/ToolsScreen.tsx +0 -260
  103. package/src/ui/theme.ts +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/data/pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Session } from "../core/types";
2
+ export declare function getDbPath(): string;
3
+ export declare function loadSessions(dbPath?: string): Session[];
4
+ export declare function sessionExists(dbPath?: string): boolean;
5
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/data/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,OAAO,EAAsC,MAAM,eAAe,CAAC;AA6F7F,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,MAAoB,GAAG,OAAO,EAAE,CA8BpE;AAiND,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAoB,GAAG,OAAO,CASnE"}
@@ -0,0 +1,222 @@
1
+ import Database from "better-sqlite3";
2
+ import { TokenUsage } from "../core/types";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ export function getDbPath() {
6
+ return path.join(os.homedir(), ".local", "share", "opencode", "opencode.db");
7
+ }
8
+ export function loadSessions(dbPath = getDbPath()) {
9
+ const db = new Database(dbPath, { readonly: true });
10
+ const sessions = db
11
+ .prepare(`
12
+ SELECT
13
+ s.id, s.parent_id, s.project_id, s.title,
14
+ s.time_created, s.time_archived,
15
+ p.name as project_name
16
+ FROM session s
17
+ LEFT JOIN project p ON s.project_id = p.id
18
+ ORDER BY s.time_created DESC
19
+ `)
20
+ .all();
21
+ const sessionIds = sessions.map((s) => s.id);
22
+ const interactions = loadInteractions(db, sessionIds);
23
+ db.close();
24
+ return sessions.map((s) => ({
25
+ id: s.id,
26
+ parentId: s.parent_id,
27
+ projectId: s.project_id,
28
+ projectName: s.project_name,
29
+ title: s.title,
30
+ timeCreated: s.time_created,
31
+ timeArchived: s.time_archived,
32
+ interactions: interactions.get(s.id) ?? [],
33
+ source: "sqlite",
34
+ }));
35
+ }
36
+ function loadInteractions(db, sessionIds) {
37
+ const result = new Map();
38
+ if (sessionIds.length === 0)
39
+ return result;
40
+ const placeholders = sessionIds.map(() => "?").join(",");
41
+ const messages = db
42
+ .prepare(`
43
+ SELECT id, session_id, data, time_created
44
+ FROM message
45
+ WHERE session_id IN (${placeholders})
46
+ ORDER BY time_created ASC
47
+ `)
48
+ .all(...sessionIds);
49
+ if (messages.length === 0)
50
+ return result;
51
+ // Load all parts for these messages in one batch
52
+ const messageIds = messages.map((m) => m.id);
53
+ const partsByMessageId = loadParts(db, messageIds);
54
+ for (const msg of messages) {
55
+ if (!result.has(msg.session_id)) {
56
+ result.set(msg.session_id, []);
57
+ }
58
+ const parts = partsByMessageId.get(msg.id) ?? [];
59
+ const parsed = parseMessageData(msg.data, msg.id, msg.session_id, msg.time_created, parts);
60
+ if (parsed) {
61
+ result.get(msg.session_id).push(parsed);
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+ function loadParts(db, messageIds) {
67
+ const result = new Map();
68
+ if (messageIds.length === 0)
69
+ return result;
70
+ // Check if part table exists
71
+ const tableExists = db
72
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='part'")
73
+ .get();
74
+ if (!tableExists)
75
+ return result;
76
+ const placeholders = messageIds.map(() => "?").join(",");
77
+ let rows = [];
78
+ try {
79
+ rows = db
80
+ .prepare(`
81
+ SELECT message_id, session_id, data
82
+ FROM part
83
+ WHERE message_id IN (${placeholders})
84
+ ORDER BY rowid ASC
85
+ `)
86
+ .all(...messageIds);
87
+ }
88
+ catch {
89
+ // part table may have different schema
90
+ return result;
91
+ }
92
+ for (const row of rows) {
93
+ if (!result.has(row.message_id)) {
94
+ result.set(row.message_id, []);
95
+ }
96
+ const part = parsePart(row.data);
97
+ if (part) {
98
+ result.get(row.message_id).push(part);
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ function parsePart(data) {
104
+ try {
105
+ const json = JSON.parse(data);
106
+ const timeStart = json.time?.start ?? 0;
107
+ const timeEnd = json.time?.end ?? 0;
108
+ switch (json.type) {
109
+ case "text":
110
+ return {
111
+ type: "text",
112
+ text: json.text ?? "",
113
+ timeStart,
114
+ timeEnd,
115
+ };
116
+ case "tool": {
117
+ const state = json.state ?? {};
118
+ const status = normalizeToolStatus(state.status);
119
+ // Timing lives in state.time, not top-level time
120
+ const toolTimeStart = state.time?.start ?? timeStart;
121
+ const toolTimeEnd = state.time?.end ?? timeEnd;
122
+ return {
123
+ type: "tool",
124
+ callId: json.callID ?? "",
125
+ toolName: json.tool ?? "unknown",
126
+ status,
127
+ input: state.input ?? {},
128
+ output: state.output ?? "",
129
+ title: state.title ?? null,
130
+ exitCode: state.metadata?.exit ?? state.metadata?.exitCode ?? null,
131
+ truncated: state.metadata?.truncated ?? false,
132
+ timeStart: toolTimeStart,
133
+ timeEnd: toolTimeEnd,
134
+ };
135
+ }
136
+ case "reasoning":
137
+ return {
138
+ type: "reasoning",
139
+ text: json.text ?? "",
140
+ timeStart,
141
+ timeEnd,
142
+ };
143
+ case "patch":
144
+ return {
145
+ type: "patch",
146
+ hash: json.hash ?? "",
147
+ files: json.files ?? [],
148
+ };
149
+ default:
150
+ return null;
151
+ }
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ }
157
+ function normalizeToolStatus(status) {
158
+ if (status === "completed")
159
+ return "completed";
160
+ if (status === "error")
161
+ return "error";
162
+ return "pending";
163
+ }
164
+ function parseMessageData(data, messageId, sessionId, timeCreated, parts) {
165
+ try {
166
+ const json = JSON.parse(data);
167
+ // Support both new schema (tokens.*) and legacy schema (usage.*)
168
+ const newTokens = json.tokens;
169
+ const legacyUsage = json.usage ?? {};
170
+ const input = newTokens?.input ?? legacyUsage.input_tokens ?? 0;
171
+ const output = newTokens?.output ?? legacyUsage.output_tokens ?? 0;
172
+ const cacheRead = newTokens?.cache?.read ?? legacyUsage.cache_read_input_tokens ?? 0;
173
+ const cacheWrite = newTokens?.cache?.write ?? legacyUsage.cache_write_input_tokens ?? 0;
174
+ const reasoning = newTokens?.reasoning ?? 0;
175
+ const timeCompleted = json.time?.completed ?? null;
176
+ const timeDelta = timeCompleted && json.time?.created
177
+ ? (timeCompleted - json.time.created) / 1000
178
+ : null;
179
+ const outputRate = output > 0 && timeDelta && timeDelta > 0 ? output / timeDelta : 0;
180
+ const role = json.role ?? "assistant";
181
+ // Only include interactions that have meaningful data (assistant messages with tokens)
182
+ if (role !== "assistant" && input === 0 && output === 0)
183
+ return null;
184
+ return {
185
+ id: messageId,
186
+ sessionId,
187
+ modelId: normalizeModelName(json.modelID ?? json.model ?? "unknown"),
188
+ providerId: json.providerID ?? null,
189
+ role,
190
+ tokens: new TokenUsage(input, output, cacheRead, cacheWrite, reasoning),
191
+ time: {
192
+ created: json.time?.created ?? timeCreated,
193
+ completed: timeCompleted,
194
+ },
195
+ agent: json.agent ?? null,
196
+ finishReason: json.finish ?? json.stop_reason ?? null,
197
+ outputRate,
198
+ parts,
199
+ };
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ }
205
+ function normalizeModelName(model) {
206
+ return model
207
+ .replace(/-\d{8}$/, "")
208
+ .replace(/:/g, "-")
209
+ .toLowerCase();
210
+ }
211
+ export function sessionExists(dbPath = getDbPath()) {
212
+ try {
213
+ const db = new Database(dbPath, { readonly: true });
214
+ db.prepare("SELECT 1 FROM session LIMIT 1").get();
215
+ db.close();
216
+ return true;
217
+ }
218
+ catch {
219
+ return false;
220
+ }
221
+ }
222
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/data/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { App } from "./ui/App";
2
+ export * from "./core/types";
3
+ export * from "./core/session";
4
+ export * from "./core/agents";
5
+ export * from "./data/sqlite";
6
+ export * from "./data/pricing";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -4,3 +4,4 @@ export * from "./core/session";
4
4
  export * from "./core/agents";
5
5
  export * from "./data/sqlite";
6
6
  export * from "./data/pricing";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface AppProps {
2
+ refreshInterval?: number;
3
+ }
4
+ export declare function App({ refreshInterval }: AppProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAWA,UAAU,QAAQ;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAYD,wBAAgB,GAAG,CAAC,EAAE,eAAsB,EAAE,EAAE,QAAQ,2CAmHvD"}
package/dist/ui/App.js ADDED
@@ -0,0 +1,101 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback, useRef } from "react";
3
+ import { Box, Text, useApp, useInput, useStdout } from "ink";
4
+ import { colors } from "./theme";
5
+ import { TabBar } from "./components/TabBar";
6
+ import { SessionsScreen } from "./screens/SessionsScreen";
7
+ import { ToolsScreen } from "./screens/ToolsScreen";
8
+ import { OverviewScreen } from "./screens/OverviewScreen";
9
+ import { loadSessions, sessionExists } from "../data/sqlite";
10
+ import { groupSessionsToWorkflows } from "../core/agents";
11
+ function workflowsEqual(a, b) {
12
+ if (a.length !== b.length)
13
+ return false;
14
+ for (let i = 0; i < a.length; i++) {
15
+ if (a[i].id !== b[i].id)
16
+ return false;
17
+ if (a[i].mainSession.interactions.length !== b[i].mainSession.interactions.length)
18
+ return false;
19
+ if (a[i].subAgentSessions.length !== b[i].subAgentSessions.length)
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ export function App({ refreshInterval = 2000 }) {
25
+ const { exit } = useApp();
26
+ const { stdout } = useStdout();
27
+ const terminalHeight = stdout?.rows ?? 24;
28
+ const terminalWidth = stdout?.columns ?? 80;
29
+ const [workflows, setWorkflows] = useState([]);
30
+ const [screen, setScreen] = useState("sessions");
31
+ const [error, setError] = useState(null);
32
+ const [lastRefresh, setLastRefresh] = useState(new Date());
33
+ const workflowsRef = useRef([]);
34
+ const mountedRef = useRef(false);
35
+ const loadData = useCallback(() => {
36
+ if (!sessionExists()) {
37
+ if (mountedRef.current) {
38
+ setError("No OpenCode database found. Run OpenCode first.");
39
+ }
40
+ return;
41
+ }
42
+ try {
43
+ const sessions = loadSessions();
44
+ const grouped = groupSessionsToWorkflows(sessions);
45
+ if (!workflowsEqual(workflowsRef.current, grouped)) {
46
+ workflowsRef.current = grouped;
47
+ if (mountedRef.current) {
48
+ setWorkflows(grouped);
49
+ setLastRefresh(new Date());
50
+ }
51
+ }
52
+ if (mountedRef.current) {
53
+ setError(null);
54
+ }
55
+ }
56
+ catch (e) {
57
+ if (mountedRef.current) {
58
+ setError(e instanceof Error ? e.message : "Failed to load sessions");
59
+ }
60
+ }
61
+ }, []);
62
+ useEffect(() => {
63
+ mountedRef.current = true;
64
+ loadData();
65
+ const interval = setInterval(loadData, refreshInterval);
66
+ return () => {
67
+ mountedRef.current = false;
68
+ clearInterval(interval);
69
+ };
70
+ }, [loadData, refreshInterval]);
71
+ // Global: q quit, r refresh, 1-3 tabs
72
+ useInput((input, key) => {
73
+ if (input === "q" || key.escape) {
74
+ exit();
75
+ return;
76
+ }
77
+ if (input === "r") {
78
+ loadData();
79
+ return;
80
+ }
81
+ if (input === "1") {
82
+ setScreen("sessions");
83
+ return;
84
+ }
85
+ if (input === "2") {
86
+ setScreen("tools");
87
+ return;
88
+ }
89
+ if (input === "3") {
90
+ setScreen("overview");
91
+ return;
92
+ }
93
+ });
94
+ if (error) {
95
+ return (_jsxs(Box, { flexDirection: "column", padding: 2, children: [_jsx(Text, { color: colors.error, bold: true, children: "Error" }), _jsx(Text, { color: colors.text, children: error }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: colors.textDim, children: "Press q to quit" }) })] }));
96
+ }
97
+ // Tab bar is 3 rows (border top + content + border bottom)
98
+ const contentHeight = terminalHeight - 3;
99
+ return (_jsxs(Box, { flexDirection: "column", width: terminalWidth, children: [_jsx(TabBar, { activeScreen: screen, lastRefresh: lastRefresh }), _jsxs(Box, { width: terminalWidth, height: contentHeight, children: [screen === "sessions" && (_jsx(SessionsScreen, { workflows: workflows, isActive: true, contentHeight: contentHeight, terminalWidth: terminalWidth })), screen === "tools" && (_jsx(ToolsScreen, { workflows: workflows, isActive: true, contentHeight: contentHeight, terminalWidth: terminalWidth })), screen === "overview" && (_jsx(OverviewScreen, { workflows: workflows, isActive: true, contentHeight: contentHeight, terminalWidth: terminalWidth }))] })] }));
100
+ }
101
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAM1D,SAAS,cAAc,CAAC,CAAa,EAAE,CAAa;IAClD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAChG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI,EAAY;IACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAE5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAW,UAAU,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAO,IAAI,IAAI,EAAE,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,MAAM,CAAa,EAAE,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,QAAQ,CAAC,iDAAiD,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAEnD,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBACnD,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC/B,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,QAAQ,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAC3B,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAEhC,sCAAsC;IACtC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACrD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAClD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,4BAAa,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,KAAK,GAAQ,EACxC,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,gCAAwB,GAC/C,IACF,CACP,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,CAAC;IAEzC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,aAAa,aAC9C,KAAC,MAAM,IAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAI,EAC1D,MAAC,GAAG,IAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,aAC7C,MAAM,KAAK,UAAU,IAAI,CACxB,KAAC,cAAc,IACb,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,IAAI,EACd,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,GAC5B,CACH,EACA,MAAM,KAAK,OAAO,IAAI,CACrB,KAAC,WAAW,IACV,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,IAAI,EACd,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,GAC5B,CACH,EACA,MAAM,KAAK,UAAU,IAAI,CACxB,KAAC,cAAc,IACb,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,IAAI,EACd,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,GAC5B,CACH,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { AgentNode } from "../../core/types";
3
+ interface AgentChainGraphProps {
4
+ agentTree: AgentNode;
5
+ }
6
+ declare function AgentChainGraphInner({ agentTree }: AgentChainGraphProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export declare const AgentChainGraph: React.MemoExoticComponent<typeof AgentChainGraphInner>;
8
+ export {};
9
+ //# sourceMappingURL=AgentChainGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentChainGraph.d.ts","sourceRoot":"","sources":["../../../src/ui/components/AgentChainGraph.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAGpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiDlD,UAAU,oBAAoB;IAC5B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE,oBAAoB,kDA+BhE;AAED,eAAO,MAAM,eAAe,wDAA6B,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ import { Box, Text } from "ink";
4
+ import { colors } from "../theme";
5
+ import { getSessionTokens, getSessionCostSingle } from "../../core/session";
6
+ import { getPricing } from "../../data/pricing";
7
+ function formatTokens(n) {
8
+ if (n >= 1_000_000)
9
+ return `${(n / 1_000_000).toFixed(1)}M`;
10
+ if (n >= 1_000)
11
+ return `${(n / 1_000).toFixed(1)}K`;
12
+ return n.toString();
13
+ }
14
+ function AgentNodeRow({ node, isLast, prefix }) {
15
+ const { session } = node;
16
+ const tokens = getSessionTokens(session);
17
+ const pricing = getPricing(session.interactions[0]?.modelId ?? "");
18
+ const cost = getSessionCostSingle(session, pricing);
19
+ const agentName = session.interactions[0]?.agent ?? session.interactions[0]?.role ?? "main";
20
+ const connector = isLast ? "└─ " : "├─ ";
21
+ const childPrefix = prefix + (isLast ? " " : "│ ");
22
+ return (_jsxs(_Fragment, { children: [_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: colors.textDim, children: [prefix, connector] }), _jsxs(Text, { color: colors.cyan, children: ["[", agentName, "]"] }), _jsxs(Text, { color: colors.text, children: [" ", truncate(session.title ?? session.id.slice(0, 8), 20)] }), _jsx(Box, { flexGrow: 1 }), _jsx(Text, { color: colors.textDim, children: formatTokens(tokens.total) }), _jsx(Text, { color: colors.textDim, children: " " }), _jsxs(Text, { color: colors.success, children: ["$", cost.toFixed(3)] })] }), node.children.map((child, i) => (_jsx(AgentNodeRow, { node: child, isLast: i === node.children.length - 1, prefix: childPrefix }, child.session.id)))] }));
23
+ }
24
+ function AgentChainGraphInner({ agentTree }) {
25
+ const { session } = agentTree;
26
+ const tokens = getSessionTokens(session);
27
+ const pricing = getPricing(session.interactions[0]?.modelId ?? "");
28
+ const cost = getSessionCostSingle(session, pricing);
29
+ const agentName = session.interactions[0]?.agent ?? "main";
30
+ if (agentTree.children.length === 0) {
31
+ return null;
32
+ }
33
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: colors.cyan, bold: true, children: ["[", agentName, "]"] }), _jsxs(Text, { color: colors.text, children: [" ", truncate(session.title ?? "root", 20)] }), _jsx(Box, { flexGrow: 1 }), _jsx(Text, { color: colors.textDim, children: formatTokens(tokens.total) }), _jsx(Text, { color: colors.textDim, children: " " }), _jsxs(Text, { color: colors.success, children: ["$", cost.toFixed(3)] })] }), agentTree.children.map((child, i) => (_jsx(AgentNodeRow, { node: child, isLast: i === agentTree.children.length - 1, prefix: "" }, child.session.id)))] }));
34
+ }
35
+ export const AgentChainGraph = memo(AgentChainGraphInner);
36
+ function truncate(s, max) {
37
+ if (s.length <= max)
38
+ return s;
39
+ return s.slice(0, max - 1) + "…";
40
+ }
41
+ //# sourceMappingURL=AgentChainGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentChainGraph.js","sourceRoot":"","sources":["../../../src/ui/components/AgentChainGraph.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import type { Workflow, FlatNode } from "../../core/types";
3
+ interface AgentTreeProps {
4
+ workflows: Workflow[];
5
+ selectedId: string | null;
6
+ flatNodes: FlatNode[];
7
+ onSelect: (id: string) => void;
8
+ maxHeight?: number;
9
+ }
10
+ declare function AgentTreeInner({ workflows, selectedId, flatNodes, maxHeight }: AgentTreeProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare const AgentTree: React.MemoExoticComponent<typeof AgentTreeInner>;
12
+ export {};
13
+ //# sourceMappingURL=AgentTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentTree.d.ts","sourceRoot":"","sources":["../../../src/ui/components/AgentTree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAGpC,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK3D,UAAU,cAAc;IACtB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAc,EAAE,EAAE,cAAc,2CA+D3F;AAED,eAAO,MAAM,SAAS,kDAAuB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ import { Box, Text } from "ink";
4
+ import { colors } from "../theme";
5
+ import { getSessionTokens, getSessionCostSingle } from "../../core/session";
6
+ import { getPricing } from "../../data/pricing";
7
+ function formatTokens(n) {
8
+ if (n >= 1_000_000)
9
+ return `${(n / 1_000_000).toFixed(1)}M`;
10
+ if (n >= 1_000)
11
+ return `${(n / 1_000).toFixed(1)}K`;
12
+ return n.toString();
13
+ }
14
+ function formatCost(d) {
15
+ if (d.lessThan(0.01))
16
+ return `$${d.toFixed(4)}`;
17
+ return `$${d.toFixed(2)}`;
18
+ }
19
+ function AgentTreeInner({ workflows, selectedId, flatNodes, maxHeight = 20 }) {
20
+ const headerHeight = 2;
21
+ const visibleCount = Math.max(1, maxHeight - headerHeight);
22
+ const selectedIndex = flatNodes.findIndex((n) => n.id === selectedId);
23
+ let startIndex = 0;
24
+ if (selectedIndex >= visibleCount - 1) {
25
+ startIndex = Math.max(0, selectedIndex - visibleCount + 2);
26
+ }
27
+ const visibleNodes = flatNodes.slice(startIndex, startIndex + visibleCount);
28
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, flexDirection: "row", children: [_jsx(Text, { color: colors.accent, bold: true, children: "Sessions" }), _jsx(Box, { flexGrow: 1 }), _jsx(Text, { color: colors.textDim, children: workflows.length })] }), visibleNodes.map((node) => {
29
+ const isSelected = node.id === selectedId;
30
+ const tokens = getSessionTokens(node.session);
31
+ const pricing = getPricing(node.session.interactions[0]?.modelId ?? "");
32
+ const cost = getSessionCostSingle(node.session, pricing);
33
+ const agentName = node.session.interactions[0]?.agent ?? null;
34
+ const indent = " ".repeat(node.depth);
35
+ const prefix = node.depth === 0
36
+ ? (node.hasChildren ? "▶ " : "● ")
37
+ : (node.hasChildren ? "├▶ " : "├─ ");
38
+ const label = node.depth === 0
39
+ ? truncate(node.session.title ?? node.session.projectName ?? "Untitled", 22)
40
+ : truncate(`[${agentName ?? "?"}] ${node.session.title ?? ""}`, 20);
41
+ return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 1 }), _jsxs(Text, { color: isSelected ? undefined : colors.text, backgroundColor: isSelected ? colors.accent : undefined, bold: isSelected, children: [indent, prefix, label] }), _jsx(Box, { flexGrow: 1 }), _jsx(Text, { color: colors.textDim, dimColor: true, children: formatTokens(tokens.total) }), _jsx(Box, { width: 1 }), _jsx(Text, { color: colors.success, children: formatCost(cost) }), _jsx(Box, { width: 1 })] }, node.id));
42
+ }), flatNodes.length > visibleCount && (_jsxs(Text, { color: colors.textDim, children: [startIndex > 0 ? "↑ " : " ", startIndex + visibleCount, "/", flatNodes.length, startIndex + visibleCount < flatNodes.length ? " ↓" : " "] }))] }));
43
+ }
44
+ export const AgentTree = memo(AgentTreeInner);
45
+ function truncate(label, maxLen) {
46
+ if (label.length <= maxLen)
47
+ return label;
48
+ return label.slice(0, maxLen - 1) + "…";
49
+ }
50
+ //# sourceMappingURL=AgentTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentTree.js","sourceRoot":"","sources":["../../../src/ui/components/AgentTree.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAWhD,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,EAAE,EAAkB;IAC1F,MAAM,YAAY,GAAG,CAAC,CAAC;IACvB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAEtE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACtC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC;IAE5E,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACrC,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,aACvC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,+BAAgB,EAChD,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,GAAI,EACpB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,SAAS,CAAC,MAAM,GAAQ,IAClD,EAEL,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;gBAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;gBACxE,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;gBAE9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;oBAC7B,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAClC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;oBAC5B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,UAAU,EAAE,EAAE,CAAC;oBAC5E,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAEtE,OAAO,CACL,MAAC,GAAG,IAAe,aAAa,EAAC,KAAK,aACpC,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,GAAI,EACjB,MAAC,IAAI,IACH,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAC3C,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACvD,IAAI,EAAE,UAAU,aAEf,MAAM,EAAE,MAAM,EAAE,KAAK,IACjB,EACP,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,GAAI,EACpB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,kBAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,EACzE,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,GAAI,EACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,UAAU,CAAC,IAAI,CAAC,GAAQ,EACtD,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,GAAI,KAbT,IAAI,CAAC,EAAE,CAcX,CACP,CAAC;YACJ,CAAC,CAAC,EAED,SAAS,CAAC,MAAM,GAAG,YAAY,IAAI,CAClC,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,aACxB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAC5B,UAAU,GAAG,YAAY,OAAG,SAAS,CAAC,MAAM,EAC5C,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IACtD,CACR,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AAE9C,SAAS,QAAQ,CAAC,KAAa,EAAE,MAAc;IAC7C,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { Workflow } from "../../core/types";
3
+ interface DetailsPanelProps {
4
+ workflow: Workflow | null;
5
+ }
6
+ declare function DetailsPanelInner({ workflow }: DetailsPanelProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare const DetailsPanel: React.MemoExoticComponent<typeof DetailsPanelInner>;
8
+ export {};
9
+ //# sourceMappingURL=DetailsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailsPanel.d.ts","sourceRoot":"","sources":["../../../src/ui/components/DetailsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAG7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAWjD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC3B;AA2DD,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAoIzD;AAED,eAAO,MAAM,YAAY,qDAA0B,CAAC"}