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.
- package/bin/octop.js +2 -9
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +22432 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +22570 -0
- package/dist/core/agents.d.ts +11 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +58 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/session.d.ts +19 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +261 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types.d.ts +140 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +29 -0
- package/dist/core/types.js.map +1 -0
- package/dist/data/pricing.d.ts +4 -0
- package/dist/data/pricing.d.ts.map +1 -0
- package/dist/data/pricing.js +76 -0
- package/dist/data/pricing.js.map +1 -0
- package/dist/data/sqlite.d.ts +5 -0
- package/dist/data/sqlite.d.ts.map +1 -0
- package/dist/data/sqlite.js +222 -0
- package/dist/data/sqlite.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +101 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/AgentChainGraph.d.ts +9 -0
- package/dist/ui/components/AgentChainGraph.d.ts.map +1 -0
- package/dist/ui/components/AgentChainGraph.js +41 -0
- package/dist/ui/components/AgentChainGraph.js.map +1 -0
- package/dist/ui/components/AgentTree.d.ts +13 -0
- package/dist/ui/components/AgentTree.d.ts.map +1 -0
- package/dist/ui/components/AgentTree.js +50 -0
- package/dist/ui/components/AgentTree.js.map +1 -0
- package/dist/ui/components/DetailsPanel.d.ts +9 -0
- package/dist/ui/components/DetailsPanel.d.ts.map +1 -0
- package/dist/ui/components/DetailsPanel.js +82 -0
- package/dist/ui/components/DetailsPanel.js.map +1 -0
- package/dist/ui/components/MessagesPanel.d.ts +12 -0
- package/dist/ui/components/MessagesPanel.d.ts.map +1 -0
- package/dist/ui/components/MessagesPanel.js +107 -0
- package/dist/ui/components/MessagesPanel.js.map +1 -0
- package/dist/ui/components/SparkLine.d.ts +10 -0
- package/dist/ui/components/SparkLine.d.ts.map +1 -0
- package/dist/ui/components/SparkLine.js +12 -0
- package/dist/ui/components/SparkLine.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +9 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/ui/components/StatusBar.js +9 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/TabBar.d.ts +10 -0
- package/dist/ui/components/TabBar.d.ts.map +1 -0
- package/dist/ui/components/TabBar.js +17 -0
- package/dist/ui/components/TabBar.js.map +1 -0
- package/dist/ui/screens/OverviewScreen.d.ts +12 -0
- package/dist/ui/screens/OverviewScreen.d.ts.map +1 -0
- package/dist/ui/screens/OverviewScreen.js +94 -0
- package/dist/ui/screens/OverviewScreen.js.map +1 -0
- package/dist/ui/screens/SessionsScreen.d.ts +12 -0
- package/dist/ui/screens/SessionsScreen.d.ts.map +1 -0
- package/dist/ui/screens/SessionsScreen.js +98 -0
- package/dist/ui/screens/SessionsScreen.js.map +1 -0
- package/dist/ui/screens/TimelineScreen.d.ts +11 -0
- package/dist/ui/screens/TimelineScreen.d.ts.map +1 -0
- package/dist/ui/screens/TimelineScreen.js +128 -0
- package/dist/ui/screens/TimelineScreen.js.map +1 -0
- package/dist/ui/screens/ToolsScreen.d.ts +12 -0
- package/dist/ui/screens/ToolsScreen.d.ts.map +1 -0
- package/dist/ui/screens/ToolsScreen.js +113 -0
- package/dist/ui/screens/ToolsScreen.js.map +1 -0
- package/dist/ui/theme.d.ts +21 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +21 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +2 -1
- package/bin/octop.mjs +0 -13
- package/src/cli.ts +0 -60
- package/src/core/agents.ts +0 -78
- package/src/core/session.ts +0 -315
- package/src/core/types.ts +0 -156
- package/src/data/pricing.ts +0 -82
- package/src/data/sqlite.ts +0 -347
- package/src/ui/App.tsx +0 -141
- package/src/ui/components/AgentChainGraph.tsx +0 -95
- package/src/ui/components/AgentTree.tsx +0 -101
- package/src/ui/components/DetailsPanel.tsx +0 -211
- package/src/ui/components/MessagesPanel.tsx +0 -323
- package/src/ui/components/SparkLine.tsx +0 -18
- package/src/ui/components/StatusBar.tsx +0 -24
- package/src/ui/components/TabBar.tsx +0 -42
- package/src/ui/screens/OverviewScreen.tsx +0 -327
- package/src/ui/screens/SessionsScreen.tsx +0 -168
- package/src/ui/screens/TimelineScreen.tsx +0 -222
- package/src/ui/screens/ToolsScreen.tsx +0 -260
- 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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
|
@@ -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"}
|
package/dist/ui/App.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|