@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.
Files changed (79) hide show
  1. package/dist/cmd/ai/opencode/dashboard.d.ts +3 -0
  2. package/dist/cmd/ai/opencode/dashboard.d.ts.map +1 -0
  3. package/dist/cmd/ai/opencode/dashboard.js +580 -0
  4. package/dist/cmd/ai/opencode/dashboard.js.map +1 -0
  5. package/dist/cmd/ai/opencode/db.d.ts +11 -0
  6. package/dist/cmd/ai/opencode/db.d.ts.map +1 -0
  7. package/dist/cmd/ai/opencode/db.js +63 -0
  8. package/dist/cmd/ai/opencode/db.js.map +1 -0
  9. package/dist/cmd/ai/opencode/index.d.ts.map +1 -1
  10. package/dist/cmd/ai/opencode/index.js +17 -1
  11. package/dist/cmd/ai/opencode/index.js.map +1 -1
  12. package/dist/cmd/ai/opencode/inspect.d.ts +3 -0
  13. package/dist/cmd/ai/opencode/inspect.d.ts.map +1 -0
  14. package/dist/cmd/ai/opencode/inspect.js +405 -0
  15. package/dist/cmd/ai/opencode/inspect.js.map +1 -0
  16. package/dist/cmd/build/ast.js +1 -1
  17. package/dist/cmd/build/ast.js.map +1 -1
  18. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  19. package/dist/cmd/cloud/db/list.js +10 -7
  20. package/dist/cmd/cloud/db/list.js.map +1 -1
  21. package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
  22. package/dist/cmd/cloud/keyvalue/stats.js +78 -5
  23. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
  24. package/dist/cmd/cloud/queue/list.d.ts.map +1 -1
  25. package/dist/cmd/cloud/queue/list.js +15 -9
  26. package/dist/cmd/cloud/queue/list.js.map +1 -1
  27. package/dist/cmd/cloud/sandbox/list.d.ts.map +1 -1
  28. package/dist/cmd/cloud/sandbox/list.js +10 -9
  29. package/dist/cmd/cloud/sandbox/list.js.map +1 -1
  30. package/dist/cmd/cloud/sandbox/runtime/list.d.ts.map +1 -1
  31. package/dist/cmd/cloud/sandbox/runtime/list.js +1 -4
  32. package/dist/cmd/cloud/sandbox/runtime/list.js.map +1 -1
  33. package/dist/cmd/cloud/sandbox/snapshot/list.d.ts.map +1 -1
  34. package/dist/cmd/cloud/sandbox/snapshot/list.js +2 -5
  35. package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
  36. package/dist/cmd/cloud/session/list.d.ts.map +1 -1
  37. package/dist/cmd/cloud/session/list.js +1 -4
  38. package/dist/cmd/cloud/session/list.js.map +1 -1
  39. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  40. package/dist/cmd/cloud/storage/list.js +16 -9
  41. package/dist/cmd/cloud/storage/list.js.map +1 -1
  42. package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
  43. package/dist/cmd/cloud/stream/list.js +8 -9
  44. package/dist/cmd/cloud/stream/list.js.map +1 -1
  45. package/dist/cmd/cloud/thread/list.d.ts.map +1 -1
  46. package/dist/cmd/cloud/thread/list.js +1 -4
  47. package/dist/cmd/cloud/thread/list.js.map +1 -1
  48. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -1
  49. package/dist/cmd/cloud/vector/stats.js +28 -4
  50. package/dist/cmd/cloud/vector/stats.js.map +1 -1
  51. package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
  52. package/dist/cmd/dev/file-watcher.js +42 -0
  53. package/dist/cmd/dev/file-watcher.js.map +1 -1
  54. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  55. package/dist/cmd/upgrade/index.js.map +1 -1
  56. package/dist/cmd/upgrade/npm-availability.d.ts.map +1 -1
  57. package/dist/cmd/upgrade/npm-availability.js.map +1 -1
  58. package/dist/cmd/upgrade/npm-availability.test.js.map +1 -1
  59. package/package.json +6 -6
  60. package/src/cmd/ai/opencode/dashboard.ts +772 -0
  61. package/src/cmd/ai/opencode/db.ts +66 -0
  62. package/src/cmd/ai/opencode/index.ts +17 -1
  63. package/src/cmd/ai/opencode/inspect.ts +516 -0
  64. package/src/cmd/build/ast.ts +1 -1
  65. package/src/cmd/cloud/db/list.ts +10 -7
  66. package/src/cmd/cloud/keyvalue/stats.ts +105 -11
  67. package/src/cmd/cloud/queue/list.ts +15 -9
  68. package/src/cmd/cloud/sandbox/list.ts +10 -9
  69. package/src/cmd/cloud/sandbox/runtime/list.ts +1 -4
  70. package/src/cmd/cloud/sandbox/snapshot/list.ts +2 -5
  71. package/src/cmd/cloud/session/list.ts +17 -20
  72. package/src/cmd/cloud/storage/list.ts +16 -9
  73. package/src/cmd/cloud/stream/list.ts +18 -19
  74. package/src/cmd/cloud/thread/list.ts +8 -11
  75. package/src/cmd/cloud/vector/stats.ts +39 -4
  76. package/src/cmd/dev/file-watcher.ts +44 -0
  77. package/src/cmd/upgrade/index.ts +1 -3
  78. package/src/cmd/upgrade/npm-availability.test.ts +12 -20
  79. package/src/cmd/upgrade/npm-availability.ts +1 -3
@@ -0,0 +1,3 @@
1
+ export declare const dashboardSubcommand: import("../../..").SubcommandDefinition;
2
+ export default dashboardSubcommand;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -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"}