@agentuity/cli 1.0.12 → 1.0.13
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/dist/cmd/ai/opencode/dashboard.d.ts +3 -0
- package/dist/cmd/ai/opencode/dashboard.d.ts.map +1 -0
- package/dist/cmd/ai/opencode/dashboard.js +580 -0
- package/dist/cmd/ai/opencode/dashboard.js.map +1 -0
- package/dist/cmd/ai/opencode/db.d.ts +11 -0
- package/dist/cmd/ai/opencode/db.d.ts.map +1 -0
- package/dist/cmd/ai/opencode/db.js +63 -0
- package/dist/cmd/ai/opencode/db.js.map +1 -0
- package/dist/cmd/ai/opencode/index.d.ts.map +1 -1
- package/dist/cmd/ai/opencode/index.js +17 -1
- package/dist/cmd/ai/opencode/index.js.map +1 -1
- package/dist/cmd/ai/opencode/inspect.d.ts +3 -0
- package/dist/cmd/ai/opencode/inspect.d.ts.map +1 -0
- package/dist/cmd/ai/opencode/inspect.js +405 -0
- package/dist/cmd/ai/opencode/inspect.js.map +1 -0
- package/dist/cmd/build/ast.js +1 -1
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/cloud/db/list.d.ts.map +1 -1
- package/dist/cmd/cloud/db/list.js +10 -7
- package/dist/cmd/cloud/db/list.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/stats.js +78 -5
- package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
- package/dist/cmd/cloud/queue/list.d.ts.map +1 -1
- package/dist/cmd/cloud/queue/list.js +15 -9
- package/dist/cmd/cloud/queue/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/list.js +10 -9
- package/dist/cmd/cloud/sandbox/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/runtime/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/runtime/list.js +1 -4
- package/dist/cmd/cloud/sandbox/runtime/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/list.js +2 -5
- package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
- package/dist/cmd/cloud/session/list.d.ts.map +1 -1
- package/dist/cmd/cloud/session/list.js +1 -4
- package/dist/cmd/cloud/session/list.js.map +1 -1
- package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/list.js +16 -9
- package/dist/cmd/cloud/storage/list.js.map +1 -1
- package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
- package/dist/cmd/cloud/stream/list.js +8 -9
- package/dist/cmd/cloud/stream/list.js.map +1 -1
- package/dist/cmd/cloud/thread/list.d.ts.map +1 -1
- package/dist/cmd/cloud/thread/list.js +1 -4
- package/dist/cmd/cloud/thread/list.js.map +1 -1
- package/dist/cmd/cloud/vector/stats.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/stats.js +28 -4
- package/dist/cmd/cloud/vector/stats.js.map +1 -1
- package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
- package/dist/cmd/dev/file-watcher.js +42 -0
- package/dist/cmd/dev/file-watcher.js.map +1 -1
- package/dist/cmd/upgrade/index.d.ts.map +1 -1
- package/dist/cmd/upgrade/index.js.map +1 -1
- package/dist/cmd/upgrade/npm-availability.d.ts.map +1 -1
- package/dist/cmd/upgrade/npm-availability.js.map +1 -1
- package/dist/cmd/upgrade/npm-availability.test.js.map +1 -1
- package/package.json +6 -6
- package/src/cmd/ai/opencode/dashboard.ts +772 -0
- package/src/cmd/ai/opencode/db.ts +66 -0
- package/src/cmd/ai/opencode/index.ts +17 -1
- package/src/cmd/ai/opencode/inspect.ts +516 -0
- package/src/cmd/build/ast.ts +1 -1
- package/src/cmd/cloud/db/list.ts +10 -7
- package/src/cmd/cloud/keyvalue/stats.ts +105 -11
- package/src/cmd/cloud/queue/list.ts +15 -9
- package/src/cmd/cloud/sandbox/list.ts +10 -9
- package/src/cmd/cloud/sandbox/runtime/list.ts +1 -4
- package/src/cmd/cloud/sandbox/snapshot/list.ts +2 -5
- package/src/cmd/cloud/session/list.ts +17 -20
- package/src/cmd/cloud/storage/list.ts +16 -9
- package/src/cmd/cloud/stream/list.ts +18 -19
- package/src/cmd/cloud/thread/list.ts +8 -11
- package/src/cmd/cloud/vector/stats.ts +39 -4
- package/src/cmd/dev/file-watcher.ts +44 -0
- package/src/cmd/upgrade/index.ts +1 -3
- package/src/cmd/upgrade/npm-availability.test.ts +12 -20
- package/src/cmd/upgrade/npm-availability.ts +1 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../../src/cmd/ai/opencode/dashboard.ts"],"names":[],"mappings":"AA2lBA,eAAO,MAAM,mBAAmB,yCAsK9B,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
import { Database } from 'bun:sqlite';
|
|
2
|
+
import { createSubcommand } from '../../../types';
|
|
3
|
+
import * as tui from '../../../tui';
|
|
4
|
+
import { getCommand } from '../../../command-prefix';
|
|
5
|
+
import { isJSONMode, outputJSON } from '../../../output';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { REQUIRED_TABLES, isMemoryPath, getDefaultDBCandidates, resolveOpenCodeDBPath } from './db';
|
|
8
|
+
const DashboardOptionsSchema = z.object({
|
|
9
|
+
json: z.boolean().optional().describe('Output JSON format'),
|
|
10
|
+
session: z.string().optional().describe('Focus on a specific session ID'),
|
|
11
|
+
watch: z.boolean().optional().describe('Continuously refresh the dashboard'),
|
|
12
|
+
interval: z.number().optional().describe('Refresh interval in seconds (default: 5)'),
|
|
13
|
+
limit: z.number().optional().describe('Maximum number of sessions to show (default: 10)'),
|
|
14
|
+
since: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Show sessions updated within duration (e.g., 1h, 6h, 24h, 7d)'),
|
|
18
|
+
status: z.string().optional().describe('Filter by status: active, idle, error, archived'),
|
|
19
|
+
all: z.boolean().optional().describe('Show all sessions (overrides default limit)'),
|
|
20
|
+
search: z.string().optional().describe('Search sessions by title (fuzzy, case-insensitive)'),
|
|
21
|
+
allTodos: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Show all todos including completed (default: pending only)'),
|
|
25
|
+
});
|
|
26
|
+
function formatCost(cost) {
|
|
27
|
+
if (!cost || cost.totalCost <= 0) {
|
|
28
|
+
return '$0.00';
|
|
29
|
+
}
|
|
30
|
+
return `$${cost.totalCost.toFixed(2)}`;
|
|
31
|
+
}
|
|
32
|
+
const DURATION_UNITS = {
|
|
33
|
+
m: 60 * 1000,
|
|
34
|
+
h: 60 * 60 * 1000,
|
|
35
|
+
d: 24 * 60 * 60 * 1000,
|
|
36
|
+
};
|
|
37
|
+
function parseDuration(duration) {
|
|
38
|
+
const match = duration.match(/^(\d+)([mhd])$/);
|
|
39
|
+
if (!match) {
|
|
40
|
+
throw new Error(`Invalid duration format: "${duration}". Use a number followed by m (minutes), h (hours), or d (days). Examples: 30m, 1h, 7d`);
|
|
41
|
+
}
|
|
42
|
+
const value = parseInt(match[1], 10);
|
|
43
|
+
const unit = match[2];
|
|
44
|
+
const ms = DURATION_UNITS[unit];
|
|
45
|
+
if (!ms) {
|
|
46
|
+
throw new Error(`Unknown duration unit: "${unit}"`);
|
|
47
|
+
}
|
|
48
|
+
return Date.now() - value * ms;
|
|
49
|
+
}
|
|
50
|
+
function formatRelativeTime(epochMs) {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
const diffMs = now - epochMs;
|
|
53
|
+
if (diffMs < 60 * 1000) {
|
|
54
|
+
return 'just now';
|
|
55
|
+
}
|
|
56
|
+
if (diffMs < 60 * 60 * 1000) {
|
|
57
|
+
const minutes = Math.floor(diffMs / (60 * 1000));
|
|
58
|
+
return `${minutes}m ago`;
|
|
59
|
+
}
|
|
60
|
+
if (diffMs < 24 * 60 * 60 * 1000) {
|
|
61
|
+
const hours = Math.floor(diffMs / (60 * 60 * 1000));
|
|
62
|
+
return `${hours}h ago`;
|
|
63
|
+
}
|
|
64
|
+
if (diffMs < 7 * 24 * 60 * 60 * 1000) {
|
|
65
|
+
const days = Math.floor(diffMs / (24 * 60 * 60 * 1000));
|
|
66
|
+
return `${days}d ago`;
|
|
67
|
+
}
|
|
68
|
+
const date = new Date(epochMs);
|
|
69
|
+
const yyyy = date.getFullYear();
|
|
70
|
+
const mm = String(date.getMonth() + 1).padStart(2, '0');
|
|
71
|
+
const dd = String(date.getDate()).padStart(2, '0');
|
|
72
|
+
return `${yyyy}-${mm}-${dd}`;
|
|
73
|
+
}
|
|
74
|
+
function formatToolCount(activeTools) {
|
|
75
|
+
const count = activeTools.length;
|
|
76
|
+
if (count === 0)
|
|
77
|
+
return '0';
|
|
78
|
+
return `${count} run${count === 1 ? '' : 's'}`;
|
|
79
|
+
}
|
|
80
|
+
function computeStatus(session, latest, activeTools) {
|
|
81
|
+
if (session.time_archived) {
|
|
82
|
+
return { status: 'archived', lastActivity: session.time_updated };
|
|
83
|
+
}
|
|
84
|
+
if (session.time_compacting) {
|
|
85
|
+
return { status: 'compacting', lastActivity: session.time_updated };
|
|
86
|
+
}
|
|
87
|
+
if (latest?.error) {
|
|
88
|
+
return { status: 'error', lastActivity: latest.time_updated ?? session.time_updated };
|
|
89
|
+
}
|
|
90
|
+
const lastActivity = Math.max(session.time_updated, latest?.time_updated ?? 0);
|
|
91
|
+
if (activeTools.length > 0) {
|
|
92
|
+
return { status: 'active', lastActivity };
|
|
93
|
+
}
|
|
94
|
+
return { status: 'idle', lastActivity };
|
|
95
|
+
}
|
|
96
|
+
function buildSessionTree(sessions, messageCounts, activeTools, todos, costs, latestMessages) {
|
|
97
|
+
const nodeMap = new Map();
|
|
98
|
+
for (const session of sessions) {
|
|
99
|
+
const sessionActiveTools = activeTools.get(session.id) ?? [];
|
|
100
|
+
const sessionTodos = todos.get(session.id) ?? [];
|
|
101
|
+
const sessionCost = costs.get(session.id) ?? { totalCost: 0, totalTokens: 0 };
|
|
102
|
+
const latest = latestMessages.get(session.id);
|
|
103
|
+
const { status, lastActivity } = computeStatus(session, latest, sessionActiveTools);
|
|
104
|
+
nodeMap.set(session.id, {
|
|
105
|
+
session,
|
|
106
|
+
status,
|
|
107
|
+
lastActivity,
|
|
108
|
+
messageCount: messageCounts.get(session.id) ?? 0,
|
|
109
|
+
activeTools: sessionActiveTools,
|
|
110
|
+
todos: sessionTodos,
|
|
111
|
+
cost: sessionCost,
|
|
112
|
+
children: [],
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const roots = [];
|
|
116
|
+
for (const node of nodeMap.values()) {
|
|
117
|
+
const parentId = node.session.parent_id;
|
|
118
|
+
if (parentId && nodeMap.has(parentId)) {
|
|
119
|
+
const parent = nodeMap.get(parentId);
|
|
120
|
+
if (parent) {
|
|
121
|
+
parent.children.push(node);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
roots.push(node);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const sortNodes = (nodes) => {
|
|
129
|
+
nodes.sort((a, b) => b.session.time_updated - a.session.time_updated);
|
|
130
|
+
nodes.forEach((node) => {
|
|
131
|
+
sortNodes(node.children);
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
sortNodes(roots);
|
|
135
|
+
return { roots, allNodes: Array.from(nodeMap.values()) };
|
|
136
|
+
}
|
|
137
|
+
function flattenSessionRows(nodes) {
|
|
138
|
+
const flattened = [];
|
|
139
|
+
const walk = (node) => {
|
|
140
|
+
flattened.push(node);
|
|
141
|
+
for (const child of node.children) {
|
|
142
|
+
walk(child);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
for (const node of nodes) {
|
|
146
|
+
walk(node);
|
|
147
|
+
}
|
|
148
|
+
return flattened;
|
|
149
|
+
}
|
|
150
|
+
function filterTreeByStatus(nodes, targetStatus) {
|
|
151
|
+
return nodes
|
|
152
|
+
.map((node) => ({
|
|
153
|
+
...node,
|
|
154
|
+
children: filterTreeByStatus(node.children, targetStatus),
|
|
155
|
+
}))
|
|
156
|
+
.filter((node) => node.status === targetStatus || node.children.length > 0);
|
|
157
|
+
}
|
|
158
|
+
async function loadDashboardData(dbPath, filterOpts) {
|
|
159
|
+
const focusSessionId = filterOpts?.focusSessionId;
|
|
160
|
+
const isMemory = isMemoryPath(dbPath);
|
|
161
|
+
let db = null;
|
|
162
|
+
try {
|
|
163
|
+
db = new Database(dbPath, isMemory ? undefined : { readonly: true });
|
|
164
|
+
const tableRows = db
|
|
165
|
+
.query("SELECT name FROM sqlite_master WHERE type = 'table'")
|
|
166
|
+
.all();
|
|
167
|
+
const foundTables = new Set(tableRows.map((row) => row.name));
|
|
168
|
+
for (const table of REQUIRED_TABLES) {
|
|
169
|
+
if (!foundTables.has(table)) {
|
|
170
|
+
return {
|
|
171
|
+
error: 'schema',
|
|
172
|
+
message: 'OpenCode database schema is missing required tables.',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const sessions = db
|
|
177
|
+
.query(`SELECT id, project_id, parent_id, title, time_created, time_updated, time_compacting, time_archived
|
|
178
|
+
FROM session
|
|
179
|
+
ORDER BY time_updated DESC`)
|
|
180
|
+
.all();
|
|
181
|
+
const messageCounts = new Map();
|
|
182
|
+
const messageCountRows = db
|
|
183
|
+
.query('SELECT session_id, COUNT(*) as count FROM message GROUP BY session_id')
|
|
184
|
+
.all();
|
|
185
|
+
for (const row of messageCountRows) {
|
|
186
|
+
messageCounts.set(row.session_id, row.count);
|
|
187
|
+
}
|
|
188
|
+
const activeTools = new Map();
|
|
189
|
+
const activeToolRows = db
|
|
190
|
+
.query(`SELECT p.session_id as session_id,
|
|
191
|
+
json_extract(p.data, '$.tool') as tool,
|
|
192
|
+
json_extract(p.data, '$.state.status') as status,
|
|
193
|
+
COALESCE(json_extract(p.data, '$.callID'), json_extract(p.data, '$.callId')) as call_id
|
|
194
|
+
FROM part p
|
|
195
|
+
WHERE json_valid(p.data)
|
|
196
|
+
AND json_extract(p.data, '$.type') IN ('tool-invocation', 'tool')
|
|
197
|
+
AND json_extract(p.data, '$.state.status') IN ('running', 'pending')`)
|
|
198
|
+
.all();
|
|
199
|
+
for (const row of activeToolRows) {
|
|
200
|
+
const list = activeTools.get(row.session_id) ?? [];
|
|
201
|
+
list.push({
|
|
202
|
+
tool: row.tool ?? 'unknown',
|
|
203
|
+
status: row.status ?? 'unknown',
|
|
204
|
+
callId: row.call_id ?? null,
|
|
205
|
+
});
|
|
206
|
+
activeTools.set(row.session_id, list);
|
|
207
|
+
}
|
|
208
|
+
const todos = new Map();
|
|
209
|
+
const todoRows = db
|
|
210
|
+
.query('SELECT session_id, content, status, priority FROM todo ORDER BY session_id, position')
|
|
211
|
+
.all();
|
|
212
|
+
for (const row of todoRows) {
|
|
213
|
+
const list = todos.get(row.session_id) ?? [];
|
|
214
|
+
list.push({
|
|
215
|
+
content: row.content,
|
|
216
|
+
status: row.status,
|
|
217
|
+
priority: row.priority ?? undefined,
|
|
218
|
+
});
|
|
219
|
+
todos.set(row.session_id, list);
|
|
220
|
+
}
|
|
221
|
+
const costs = new Map();
|
|
222
|
+
const costRows = db
|
|
223
|
+
.query(`SELECT session_id,
|
|
224
|
+
SUM(json_extract(m.data, '$.cost')) as total_cost,
|
|
225
|
+
SUM(
|
|
226
|
+
COALESCE(json_extract(m.data, '$.tokens.input'), 0) +
|
|
227
|
+
COALESCE(json_extract(m.data, '$.tokens.output'), 0)
|
|
228
|
+
) as total_tokens
|
|
229
|
+
FROM message m
|
|
230
|
+
WHERE json_valid(m.data) AND json_extract(m.data, '$.cost') IS NOT NULL
|
|
231
|
+
GROUP BY session_id`)
|
|
232
|
+
.all();
|
|
233
|
+
for (const row of costRows) {
|
|
234
|
+
costs.set(row.session_id, {
|
|
235
|
+
totalCost: row.total_cost ?? 0,
|
|
236
|
+
totalTokens: row.total_tokens ?? 0,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
const latestMessages = new Map();
|
|
240
|
+
const latestRows = db
|
|
241
|
+
.query(`SELECT m.session_id as session_id,
|
|
242
|
+
CASE WHEN json_valid(m.data) THEN json_extract(m.data, '$.error') END as error,
|
|
243
|
+
m.time_updated as time_updated
|
|
244
|
+
FROM message m
|
|
245
|
+
INNER JOIN (
|
|
246
|
+
SELECT session_id, MAX(time_updated) as max_time
|
|
247
|
+
FROM message
|
|
248
|
+
GROUP BY session_id
|
|
249
|
+
) latest
|
|
250
|
+
ON latest.session_id = m.session_id AND latest.max_time = m.time_updated`)
|
|
251
|
+
.all();
|
|
252
|
+
for (const row of latestRows) {
|
|
253
|
+
latestMessages.set(row.session_id, row);
|
|
254
|
+
}
|
|
255
|
+
let filteredSessions = sessions;
|
|
256
|
+
// Apply search filter at session level (case-insensitive LIKE)
|
|
257
|
+
if (filterOpts?.search) {
|
|
258
|
+
const query = filterOpts.search.toLowerCase();
|
|
259
|
+
filteredSessions = filteredSessions.filter((s) => s.title.toLowerCase().includes(query));
|
|
260
|
+
}
|
|
261
|
+
const { roots, allNodes } = buildSessionTree(filteredSessions, messageCounts, activeTools, todos, costs, latestMessages);
|
|
262
|
+
if (focusSessionId) {
|
|
263
|
+
const focusNode = allNodes.find((node) => node.session.id === focusSessionId);
|
|
264
|
+
if (!focusNode) {
|
|
265
|
+
return {
|
|
266
|
+
error: 'not_found',
|
|
267
|
+
message: `Session ${focusSessionId} not found in database.`,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
return { data: { database: dbPath, sessions: [focusNode], allSessions: allNodes } };
|
|
271
|
+
}
|
|
272
|
+
// Apply post-build filters on root nodes
|
|
273
|
+
let filteredRoots = roots;
|
|
274
|
+
// Filter by --since (compare lastActivity against parsed timestamp)
|
|
275
|
+
if (filterOpts?.since) {
|
|
276
|
+
try {
|
|
277
|
+
const sinceTimestamp = parseDuration(filterOpts.since);
|
|
278
|
+
filteredRoots = filteredRoots.filter((node) => node.lastActivity >= sinceTimestamp);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return {
|
|
282
|
+
error: 'invalid_duration',
|
|
283
|
+
message: `Invalid --since value: "${filterOpts.since}". Use format like 30m, 1h, 6h, 24h, 7d.`,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Filter by --status (recursively prune non-matching nodes from tree)
|
|
288
|
+
if (filterOpts?.status) {
|
|
289
|
+
const targetStatus = filterOpts.status.toLowerCase();
|
|
290
|
+
filteredRoots = filterTreeByStatus(filteredRoots, targetStatus);
|
|
291
|
+
}
|
|
292
|
+
// Apply --limit (default 10) unless --all is set
|
|
293
|
+
if (!filterOpts?.all) {
|
|
294
|
+
const limit = filterOpts?.limit ?? 10;
|
|
295
|
+
filteredRoots = filteredRoots.slice(0, limit);
|
|
296
|
+
}
|
|
297
|
+
return { data: { database: dbPath, sessions: filteredRoots, allSessions: allNodes } };
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
return {
|
|
301
|
+
error: 'query_failed',
|
|
302
|
+
message: error instanceof Error ? error.message : 'Failed to query OpenCode database.',
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
if (db) {
|
|
307
|
+
db.close();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function renderMissingDatabase(expectedPaths, envPath) {
|
|
312
|
+
tui.newline();
|
|
313
|
+
tui.output(`${tui.ICONS.info} OpenCode database not found.`);
|
|
314
|
+
tui.newline();
|
|
315
|
+
tui.output('The dashboard requires OpenCode v1.2.0+ with SQLite storage.');
|
|
316
|
+
if (envPath) {
|
|
317
|
+
tui.output(`Expected location: ${envPath}`);
|
|
318
|
+
}
|
|
319
|
+
else if (expectedPaths.length === 1) {
|
|
320
|
+
tui.output(`Expected location: ${expectedPaths[0]}`);
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
tui.output('Expected locations:');
|
|
324
|
+
for (const path of expectedPaths) {
|
|
325
|
+
tui.output(` ${tui.ICONS.bullet} ${path}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
tui.newline();
|
|
329
|
+
tui.output('Tip: Set OPENCODE_DB_PATH to override the database location.');
|
|
330
|
+
}
|
|
331
|
+
function renderDashboard(data, watchMode, intervalSeconds, showAllTodos) {
|
|
332
|
+
const flattened = flattenSessionRows(data.sessions);
|
|
333
|
+
const activeCount = flattened.filter((node) => node.status === 'active').length;
|
|
334
|
+
tui.newline();
|
|
335
|
+
tui.output(tui.bold('Coder Dashboard'));
|
|
336
|
+
tui.output('────────────────');
|
|
337
|
+
tui.newline();
|
|
338
|
+
tui.output(`Database: ${data.database}`);
|
|
339
|
+
tui.newline();
|
|
340
|
+
const sessionLabel = `Sessions (${activeCount} active)`;
|
|
341
|
+
tui.output(tui.bold(sessionLabel));
|
|
342
|
+
if (flattened.length === 0) {
|
|
343
|
+
tui.info('No sessions found');
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const rows = [];
|
|
347
|
+
const walk = (node, prefix, isLast, isRoot) => {
|
|
348
|
+
const connector = isRoot ? '' : isLast ? '└─ ' : '├─ ';
|
|
349
|
+
rows.push({
|
|
350
|
+
Session: `${prefix}${connector}${node.session.id}`,
|
|
351
|
+
Status: node.status,
|
|
352
|
+
'Last Active': formatRelativeTime(node.lastActivity),
|
|
353
|
+
Messages: String(node.messageCount),
|
|
354
|
+
Tools: formatToolCount(node.activeTools),
|
|
355
|
+
Cost: formatCost(node.cost),
|
|
356
|
+
});
|
|
357
|
+
const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');
|
|
358
|
+
const lastIndex = node.children.length - 1;
|
|
359
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
360
|
+
const child = node.children[i];
|
|
361
|
+
if (!child)
|
|
362
|
+
continue;
|
|
363
|
+
walk(child, childPrefix, i === lastIndex, false);
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
const lastIndex = data.sessions.length - 1;
|
|
367
|
+
for (let i = 0; i < data.sessions.length; i++) {
|
|
368
|
+
const root = data.sessions[i];
|
|
369
|
+
if (!root)
|
|
370
|
+
continue;
|
|
371
|
+
walk(root, '', i === lastIndex, true);
|
|
372
|
+
}
|
|
373
|
+
tui.table(rows, ['Session', 'Status', 'Last Active', 'Messages', 'Tools', 'Cost']);
|
|
374
|
+
}
|
|
375
|
+
const allTodoItems = [];
|
|
376
|
+
for (const node of flattened) {
|
|
377
|
+
for (const todo of node.todos) {
|
|
378
|
+
allTodoItems.push({ sessionId: node.session.id, todo });
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
const totalTodos = allTodoItems.length;
|
|
382
|
+
const pendingTodos = allTodoItems.filter((item) => item.todo.status !== 'completed').length;
|
|
383
|
+
const displayTodos = showAllTodos
|
|
384
|
+
? allTodoItems
|
|
385
|
+
: allTodoItems.filter((item) => item.todo.status !== 'completed');
|
|
386
|
+
tui.newline();
|
|
387
|
+
const todosLabel = showAllTodos
|
|
388
|
+
? `Todos (${pendingTodos} pending / ${totalTodos} total)`
|
|
389
|
+
: `Todos (${pendingTodos} pending)`;
|
|
390
|
+
tui.output(tui.bold(todosLabel));
|
|
391
|
+
if (displayTodos.length === 0 && totalTodos > 0) {
|
|
392
|
+
tui.output(tui.muted(`${totalTodos} completed (use --all-todos to show)`));
|
|
393
|
+
}
|
|
394
|
+
else if (displayTodos.length === 0) {
|
|
395
|
+
tui.output(tui.muted('No todos found'));
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
const showSessionLabel = new Set(displayTodos.map((item) => item.sessionId)).size > 1;
|
|
399
|
+
for (const { sessionId, todo } of displayTodos) {
|
|
400
|
+
const checked = todo.status === 'completed' ? 'x' : ' ';
|
|
401
|
+
const sessionLabel = showSessionLabel ? `(${sessionId}) ` : '';
|
|
402
|
+
tui.output(`- [${checked}] ${sessionLabel}${todo.content}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (watchMode) {
|
|
406
|
+
tui.newline();
|
|
407
|
+
const interval = intervalSeconds ?? 5;
|
|
408
|
+
tui.output(tui.muted(`Press q to quit · r to refresh · refreshing every ${interval}s`));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
function serializeNode(node) {
|
|
412
|
+
return {
|
|
413
|
+
id: node.session.id,
|
|
414
|
+
title: node.session.title,
|
|
415
|
+
status: node.status,
|
|
416
|
+
lastActivity: node.lastActivity,
|
|
417
|
+
messageCount: node.messageCount,
|
|
418
|
+
activeTools: node.activeTools,
|
|
419
|
+
todos: node.todos,
|
|
420
|
+
cost: node.cost,
|
|
421
|
+
children: node.children.map(serializeNode),
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
function clearTerminal() {
|
|
425
|
+
if (!process.stdout.isTTY) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
process.stdout.write('\x1b[2J\x1b[H');
|
|
429
|
+
}
|
|
430
|
+
export const dashboardSubcommand = createSubcommand({
|
|
431
|
+
name: 'dashboard',
|
|
432
|
+
description: 'View Coder session dashboard',
|
|
433
|
+
tags: ['read-only', 'fast'],
|
|
434
|
+
schema: {
|
|
435
|
+
options: DashboardOptionsSchema,
|
|
436
|
+
},
|
|
437
|
+
examples: [
|
|
438
|
+
{
|
|
439
|
+
command: getCommand('ai opencode dashboard'),
|
|
440
|
+
description: 'Recent 10 sessions',
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
command: getCommand('ai opencode dashboard --all'),
|
|
444
|
+
description: 'All sessions',
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
command: getCommand('ai opencode dashboard --since 1h'),
|
|
448
|
+
description: 'Sessions active in last hour',
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
command: getCommand('ai opencode dashboard --status active'),
|
|
452
|
+
description: 'Only active sessions',
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
command: getCommand('ai opencode dashboard --search "auth"'),
|
|
456
|
+
description: 'Search by title',
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
command: getCommand('ai opencode dashboard --limit 5 --status idle'),
|
|
460
|
+
description: '5 most recent idle sessions',
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
command: getCommand('ai opencode dashboard --watch --since 1h'),
|
|
464
|
+
description: 'Watch recent sessions',
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
command: getCommand('ai opencode dashboard --session ses_abc123'),
|
|
468
|
+
description: 'Focus on a specific session tree',
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
command: getCommand('ai opencode dashboard --json'),
|
|
472
|
+
description: 'Output dashboard data as JSON',
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
command: getCommand('ai opencode dashboard --all-todos'),
|
|
476
|
+
description: 'Show all todos including completed',
|
|
477
|
+
},
|
|
478
|
+
],
|
|
479
|
+
async handler(ctx) {
|
|
480
|
+
const { options, opts } = ctx;
|
|
481
|
+
const jsonMode = isJSONMode(options) || opts?.json === true;
|
|
482
|
+
const watchMode = opts?.watch === true;
|
|
483
|
+
const intervalSeconds = opts?.interval ?? 5;
|
|
484
|
+
const intervalMs = Math.max(1, intervalSeconds) * 1000;
|
|
485
|
+
const showAllTodos = opts?.allTodos ?? false;
|
|
486
|
+
const filterOpts = {
|
|
487
|
+
focusSessionId: opts?.session,
|
|
488
|
+
search: opts?.search,
|
|
489
|
+
since: opts?.since,
|
|
490
|
+
status: opts?.status,
|
|
491
|
+
limit: opts?.limit,
|
|
492
|
+
all: opts?.all,
|
|
493
|
+
};
|
|
494
|
+
const resolvedDbPath = await resolveOpenCodeDBPath();
|
|
495
|
+
if (!resolvedDbPath) {
|
|
496
|
+
const candidates = getDefaultDBCandidates();
|
|
497
|
+
if (jsonMode) {
|
|
498
|
+
outputJSON({
|
|
499
|
+
database: null,
|
|
500
|
+
sessions: [],
|
|
501
|
+
message: 'OpenCode database not found.',
|
|
502
|
+
expectedLocations: candidates,
|
|
503
|
+
});
|
|
504
|
+
return { success: false };
|
|
505
|
+
}
|
|
506
|
+
renderMissingDatabase(candidates, process.env.OPENCODE_DB_PATH);
|
|
507
|
+
return { success: false };
|
|
508
|
+
}
|
|
509
|
+
const runOnce = async () => {
|
|
510
|
+
const result = await loadDashboardData(resolvedDbPath, filterOpts);
|
|
511
|
+
if (result.error || !result.data) {
|
|
512
|
+
if (jsonMode) {
|
|
513
|
+
outputJSON({
|
|
514
|
+
database: resolvedDbPath,
|
|
515
|
+
sessions: [],
|
|
516
|
+
error: result.error,
|
|
517
|
+
message: result.message,
|
|
518
|
+
});
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
tui.newline();
|
|
522
|
+
tui.error(result.message ?? 'Failed to load dashboard data.');
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
if (jsonMode) {
|
|
526
|
+
outputJSON({
|
|
527
|
+
database: result.data.database,
|
|
528
|
+
sessions: result.data.sessions.map(serializeNode),
|
|
529
|
+
});
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
renderDashboard(result.data, watchMode, intervalSeconds, showAllTodos);
|
|
533
|
+
return true;
|
|
534
|
+
};
|
|
535
|
+
if (!watchMode || jsonMode) {
|
|
536
|
+
const ok = await runOnce();
|
|
537
|
+
return { success: ok };
|
|
538
|
+
}
|
|
539
|
+
// Set up keyboard input handling for watch mode
|
|
540
|
+
if (process.stdin.isTTY) {
|
|
541
|
+
process.stdin.setRawMode(true);
|
|
542
|
+
process.stdin.resume();
|
|
543
|
+
process.stdin.setEncoding('utf8');
|
|
544
|
+
}
|
|
545
|
+
let shouldExit = false;
|
|
546
|
+
let shouldRefresh = false;
|
|
547
|
+
process.stdin.on('data', (key) => {
|
|
548
|
+
if (key === 'q' || key === '\x03') {
|
|
549
|
+
// 'q' or Ctrl+C
|
|
550
|
+
shouldExit = true;
|
|
551
|
+
}
|
|
552
|
+
if (key === 'r') {
|
|
553
|
+
shouldRefresh = true;
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
while (!shouldExit) {
|
|
557
|
+
clearTerminal();
|
|
558
|
+
await runOnce();
|
|
559
|
+
// Sleep in small increments so we can respond to keypresses quickly
|
|
560
|
+
const sleepChunk = 100;
|
|
561
|
+
let elapsed = 0;
|
|
562
|
+
while (elapsed < intervalMs && !shouldExit && !shouldRefresh) {
|
|
563
|
+
await Bun.sleep(sleepChunk);
|
|
564
|
+
elapsed += sleepChunk;
|
|
565
|
+
}
|
|
566
|
+
if (shouldRefresh) {
|
|
567
|
+
shouldRefresh = false;
|
|
568
|
+
// Loop continues immediately to refresh
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
// Cleanup stdin state
|
|
572
|
+
if (process.stdin.isTTY) {
|
|
573
|
+
process.stdin.setRawMode(false);
|
|
574
|
+
process.stdin.pause();
|
|
575
|
+
}
|
|
576
|
+
return { success: true };
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
export default dashboardSubcommand;
|
|
580
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../../src/cmd/ai/opencode/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const REQUIRED_TABLES: Set<string>;
|
|
2
|
+
export declare function isMemoryPath(path: string): boolean;
|
|
3
|
+
export declare function getDefaultDBCandidates(): string[];
|
|
4
|
+
export declare function resolveOpenCodeDBPath(): Promise<string | null>;
|
|
5
|
+
/**
|
|
6
|
+
* Parse display title from session title JSON.
|
|
7
|
+
* OpenCode stores titles as JSON strings like: {"title":"Some Title"}
|
|
8
|
+
* Falls back to the raw title if parsing fails.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseDisplayTitle(title: string): string;
|
|
11
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../src/cmd/ai/opencode/db.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,aAAkD,CAAC;AAE/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAmBjD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAepE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAavD"}
|