botmux 2.67.0 → 2.68.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 (71) hide show
  1. package/dist/adapters/backend/tmux-pipe-backend.d.ts +7 -2
  2. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  3. package/dist/adapters/backend/tmux-pipe-backend.js +12 -5
  4. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  5. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  6. package/dist/adapters/cli/codex-app.js +5 -17
  7. package/dist/adapters/cli/codex-app.js.map +1 -1
  8. package/dist/adapters/cli/mira.d.ts.map +1 -1
  9. package/dist/adapters/cli/mira.js +4 -17
  10. package/dist/adapters/cli/mira.js.map +1 -1
  11. package/dist/adapters/cli/pi.d.ts.map +1 -1
  12. package/dist/adapters/cli/pi.js +0 -1
  13. package/dist/adapters/cli/pi.js.map +1 -1
  14. package/dist/adapters/cli/runner-input.d.ts +66 -0
  15. package/dist/adapters/cli/runner-input.d.ts.map +1 -0
  16. package/dist/adapters/cli/runner-input.js +125 -0
  17. package/dist/adapters/cli/runner-input.js.map +1 -0
  18. package/dist/adapters/cli/types.d.ts +8 -4
  19. package/dist/adapters/cli/types.d.ts.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +79 -17
  22. package/dist/cli.js.map +1 -1
  23. package/dist/core/auto-start.d.ts +23 -0
  24. package/dist/core/auto-start.d.ts.map +1 -1
  25. package/dist/core/auto-start.js +30 -0
  26. package/dist/core/auto-start.js.map +1 -1
  27. package/dist/core/command-handler.d.ts +9 -9
  28. package/dist/core/command-handler.d.ts.map +1 -1
  29. package/dist/core/command-handler.js +23 -16
  30. package/dist/core/command-handler.js.map +1 -1
  31. package/dist/core/cost-calculator.d.ts +27 -0
  32. package/dist/core/cost-calculator.d.ts.map +1 -1
  33. package/dist/core/cost-calculator.js +483 -27
  34. package/dist/core/cost-calculator.js.map +1 -1
  35. package/dist/core/dashboard-rows.d.ts +3 -0
  36. package/dist/core/dashboard-rows.d.ts.map +1 -1
  37. package/dist/core/dashboard-rows.js +11 -0
  38. package/dist/core/dashboard-rows.js.map +1 -1
  39. package/dist/core/worker-pool.d.ts.map +1 -1
  40. package/dist/core/worker-pool.js +22 -1
  41. package/dist/core/worker-pool.js.map +1 -1
  42. package/dist/daemon.d.ts.map +1 -1
  43. package/dist/daemon.js +15 -6
  44. package/dist/daemon.js.map +1 -1
  45. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  46. package/dist/dashboard/web/i18n.js +4 -0
  47. package/dist/dashboard/web/i18n.js.map +1 -1
  48. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  49. package/dist/dashboard/web/sessions.js +16 -1
  50. package/dist/dashboard/web/sessions.js.map +1 -1
  51. package/dist/dashboard-web/app.js +120 -116
  52. package/dist/dashboard-web/style.css +4 -0
  53. package/dist/dashboard.js +41 -13
  54. package/dist/dashboard.js.map +1 -1
  55. package/dist/i18n/en.js +2 -2
  56. package/dist/i18n/en.js.map +1 -1
  57. package/dist/i18n/zh.js +2 -2
  58. package/dist/i18n/zh.js.map +1 -1
  59. package/dist/services/aiden-checkpoints.d.ts +5 -0
  60. package/dist/services/aiden-checkpoints.d.ts.map +1 -0
  61. package/dist/services/aiden-checkpoints.js +91 -0
  62. package/dist/services/aiden-checkpoints.js.map +1 -0
  63. package/dist/services/codex-transcript.d.ts +7 -0
  64. package/dist/services/codex-transcript.d.ts.map +1 -1
  65. package/dist/services/codex-transcript.js +60 -1
  66. package/dist/services/codex-transcript.js.map +1 -1
  67. package/dist/services/usage-ledger.d.ts +81 -0
  68. package/dist/services/usage-ledger.d.ts.map +1 -0
  69. package/dist/services/usage-ledger.js +353 -0
  70. package/dist/services/usage-ledger.js.map +1 -0
  71. package/package.json +1 -1
@@ -1,59 +1,515 @@
1
1
  /**
2
2
  * Session cost calculator — computes token usage from JSONL logs.
3
3
  */
4
- import { existsSync, readFileSync } from 'node:fs';
4
+ import { closeSync, existsSync, openSync, readFileSync, readSync, statSync } from 'node:fs';
5
5
  import { join, resolve } from 'node:path';
6
6
  import { homedir } from 'node:os';
7
7
  import { logger } from '../utils/logger.js';
8
- import { expandHome } from './session-manager.js';
8
+ import { expandHome } from './working-dir.js';
9
+ import { findAidenLatestCheckpointByBotmuxSessionId, findAidenLatestCheckpointBySessionId } from '../services/aiden-checkpoints.js';
10
+ import { findCodexRolloutBySessionId, findCodexSessionIdByBotmuxSessionId } from '../services/codex-transcript.js';
11
+ import { cocoEventsPathForSession } from '../services/coco-transcript.js';
12
+ import { findCursorTranscriptByChatId } from '../services/cursor-transcript.js';
13
+ import { findTraexRolloutBySessionId } from '../services/traex-transcript.js';
9
14
  // ─── Helpers ─────────────────────────────────────────────────────────────────
10
15
  export function getSessionJsonlPath(sessionId, cwd) {
16
+ return getClaudeSessionJsonlPath(sessionId, cwd, join(homedir(), '.claude'));
17
+ }
18
+ function getClaudeSessionJsonlPath(sessionId, cwd, dataDir) {
11
19
  const resolvedCwd = resolve(expandHome(cwd));
12
20
  // Claude stores sessions at ~/.claude/projects/<project-key>/<sessionId>.jsonl
13
- // where project-key = absolute path with / replaced by -
14
- const projectKey = resolvedCwd.replace(/\//g, '-');
15
- const jsonlPath = join(homedir(), '.claude', 'projects', projectKey, `${sessionId}.jsonl`);
21
+ // where project-key = absolute path with non [A-Za-z0-9-] chars replaced by -
22
+ const projectKey = resolvedCwd.replace(/[^A-Za-z0-9-]/g, '-');
23
+ const jsonlPath = join(dataDir, 'projects', projectKey, `${sessionId}.jsonl`);
16
24
  return existsSync(jsonlPath) ? jsonlPath : null;
17
25
  }
18
26
  export function getSessionCost(sessionId, cwd) {
19
27
  const jsonlPath = getSessionJsonlPath(sessionId, cwd);
20
28
  if (!jsonlPath)
21
29
  return null;
22
- let inputTokens = 0;
23
- let outputTokens = 0;
24
- let cacheReadTokens = 0;
25
- let cacheCreateTokens = 0;
26
- let model = '';
27
- let turns = 0;
30
+ const read = readSessionTokenAggregateCached(jsonlPath, 'claude');
31
+ if (!read)
32
+ return null;
33
+ const { inputTokens, outputTokens, cacheReadTokens, cacheCreateTokens, model, turns } = read.agg;
34
+ return { inputTokens, outputTokens, cacheReadTokens, cacheCreateTokens, model, turns };
35
+ }
36
+ function num(value) {
37
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
38
+ }
39
+ function pickNum(obj, keys) {
40
+ if (!obj || typeof obj !== 'object')
41
+ return 0;
42
+ for (const key of keys) {
43
+ const value = num(obj[key]);
44
+ if (value)
45
+ return value;
46
+ }
47
+ return 0;
48
+ }
49
+ function extractNativeUsage(entry) {
50
+ const candidates = [
51
+ { usage: entry?.message?.usage, model: entry?.message?.model },
52
+ { usage: entry?.message?.usageMetadata, model: entry?.message?.model },
53
+ {
54
+ usage: entry?.message?.message?.response_meta?.usage,
55
+ model: entry?.message?.message?.extra?._source_model ?? entry?.message?.message?.extra?.trae_extra_info?.model,
56
+ },
57
+ { usage: entry?.payload?.usage, model: entry?.payload?.model },
58
+ { usage: entry?.payload?.usageMetadata, model: entry?.payload?.model },
59
+ { usage: entry?.response?.usage, model: entry?.response?.model },
60
+ { usage: entry?.response?.usageMetadata, model: entry?.response?.model },
61
+ { usage: entry?.usage, model: entry?.model },
62
+ { usage: entry?.usageMetadata, model: entry?.model },
63
+ ];
64
+ for (const c of candidates) {
65
+ if (c.usage && typeof c.usage === 'object')
66
+ return c;
67
+ }
68
+ return null;
69
+ }
70
+ function extractCodexTokenCountUsage(entry) {
71
+ if (entry?.type !== 'event_msg' || entry?.payload?.type !== 'token_count')
72
+ return null;
73
+ const u = entry.payload?.info?.total_token_usage;
74
+ if (!u || typeof u !== 'object')
75
+ return null;
76
+ const inputTokens = pickNum(u, ['input_tokens', 'inputTokens']);
77
+ const outputTokens = pickNum(u, ['output_tokens', 'outputTokens']);
78
+ const cacheReadTokens = pickNum(u, ['cached_input_tokens', 'cachedInputTokens']);
79
+ return {
80
+ in: inputTokens,
81
+ out: outputTokens,
82
+ inputTokens,
83
+ outputTokens,
84
+ cacheReadTokens,
85
+ cacheCreateTokens: 0,
86
+ model: '',
87
+ turns: 0,
88
+ };
89
+ }
90
+ function usageKindForCli(cliId) {
91
+ switch (cliId) {
92
+ case 'claude-code':
93
+ case 'seed':
94
+ return 'claude';
95
+ case 'codex':
96
+ return 'codex';
97
+ case 'coco':
98
+ return 'coco';
99
+ default:
100
+ return 'generic';
101
+ }
102
+ }
103
+ function newTokenUsageAggregate() {
104
+ return { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreateTokens: 0, model: '', turns: 0, latestCodexUsage: null };
105
+ }
106
+ /** Claude Code / Seed: one JSONL line per content block; blocks of the same
107
+ * turn repeat the same message.id and usage snapshot — count once per id. */
108
+ function foldClaudeLine(agg, seenMessageIds, entry) {
109
+ if (entry?.type !== 'assistant')
110
+ return;
111
+ const msg = entry.message;
112
+ const u = msg?.usage;
113
+ if (!u || typeof u !== 'object')
114
+ return;
115
+ const messageId = typeof msg.id === 'string' ? msg.id : '';
116
+ if (messageId) {
117
+ if (seenMessageIds.has(messageId))
118
+ return;
119
+ seenMessageIds.add(messageId);
120
+ }
121
+ agg.inputTokens += num(u.input_tokens);
122
+ agg.outputTokens += num(u.output_tokens);
123
+ agg.cacheReadTokens += num(u.cache_read_input_tokens);
124
+ agg.cacheCreateTokens += num(u.cache_creation_input_tokens);
125
+ if (!agg.model && typeof msg.model === 'string')
126
+ agg.model = msg.model;
127
+ agg.turns++;
128
+ }
129
+ /** Codex rollouts report cumulative totals via event_msg/token_count; only
130
+ * the latest snapshot counts. The active model rides on turn_context /
131
+ * session_meta payloads (latest wins — sessions can switch models). */
132
+ function foldCodexLine(agg, entry) {
133
+ const codexUsage = extractCodexTokenCountUsage(entry);
134
+ if (codexUsage) {
135
+ agg.latestCodexUsage = codexUsage;
136
+ return;
137
+ }
138
+ const m = entry?.payload?.model ?? entry?.payload?.collaboration_mode?.settings?.model;
139
+ if (typeof m === 'string' && m)
140
+ agg.model = m;
141
+ }
142
+ /** CoCo events: only assistant messages with response_meta.usage count; the
143
+ * agent_end summary repeats the last turn's usage and must not be counted. */
144
+ function foldCocoLine(agg, entry) {
145
+ const inner = entry?.message?.message;
146
+ if (!inner || inner.role !== 'assistant')
147
+ return;
148
+ const u = inner.response_meta?.usage;
149
+ if (!u || typeof u !== 'object')
150
+ return;
151
+ agg.inputTokens += pickNum(u, ['prompt_tokens', 'input_tokens']);
152
+ agg.outputTokens += pickNum(u, ['completion_tokens', 'output_tokens']);
153
+ agg.cacheReadTokens += pickNum(u, ['cache_read_input_tokens', 'cache_read_tokens']);
154
+ agg.cacheCreateTokens += pickNum(u, ['cache_creation_input_tokens', 'cache_write_input_tokens']);
155
+ if (!agg.model) {
156
+ const m = inner.extra?._source_model ?? inner.extra?.trae_extra_info?.model;
157
+ if (typeof m === 'string')
158
+ agg.model = m;
159
+ }
160
+ agg.turns++;
161
+ }
162
+ /** Cursor / TraeX / Antigravity: transcripts whose exact dialect is not yet
163
+ * pinned down — keep the tolerant multi-shape extraction for them. */
164
+ function foldGenericLine(agg, seenMessageIds, entry) {
165
+ const codexUsage = extractCodexTokenCountUsage(entry);
166
+ if (codexUsage) {
167
+ agg.latestCodexUsage = codexUsage;
168
+ return;
169
+ }
170
+ const native = extractNativeUsage(entry);
171
+ if (!native)
172
+ return;
173
+ const messageId = entry?.message?.id;
174
+ if (typeof messageId === 'string' && messageId) {
175
+ if (seenMessageIds.has(messageId))
176
+ return;
177
+ seenMessageIds.add(messageId);
178
+ }
179
+ const u = native.usage;
180
+ agg.inputTokens += pickNum(u, ['input_tokens', 'inputTokens', 'prompt_tokens', 'promptTokens', 'promptTokenCount']);
181
+ agg.outputTokens += pickNum(u, ['output_tokens', 'outputTokens', 'completion_tokens', 'completionTokens', 'candidatesTokenCount']);
182
+ agg.cacheReadTokens += pickNum(u, ['cache_read_input_tokens', 'cacheReadInputTokens', 'cache_read_tokens', 'cacheReadTokens']);
183
+ agg.cacheCreateTokens += pickNum(u, ['cache_creation_input_tokens', 'cacheCreationInputTokens', 'cache_write_input_tokens', 'cacheWriteInputTokens']);
184
+ if (!agg.model && typeof native.model === 'string')
185
+ agg.model = native.model;
186
+ agg.turns++;
187
+ }
188
+ function foldUsageLine(kind, agg, seenMessageIds, entry) {
189
+ switch (kind) {
190
+ case 'claude':
191
+ return foldClaudeLine(agg, seenMessageIds, entry);
192
+ case 'codex':
193
+ return foldCodexLine(agg, entry);
194
+ case 'coco':
195
+ return foldCocoLine(agg, entry);
196
+ case 'generic':
197
+ return foldGenericLine(agg, seenMessageIds, entry);
198
+ }
199
+ }
200
+ /** Aggregate token usage over a JSONL transcript. Returns null only on read
201
+ * failure; an empty/usage-less file yields a zeroed aggregate. */
202
+ function readTokenUsageAggregate(path, kind) {
203
+ const agg = newTokenUsageAggregate();
204
+ const seenMessageIds = new Set();
28
205
  try {
29
- const content = readFileSync(jsonlPath, 'utf-8');
206
+ const content = readFileSync(path, 'utf-8');
30
207
  for (const line of content.split('\n')) {
31
208
  if (!line.trim())
32
209
  continue;
33
210
  try {
34
211
  const entry = JSON.parse(line);
35
- if (entry.type !== 'assistant')
36
- continue;
37
- const msg = entry.message;
38
- if (!msg?.usage)
39
- continue;
40
- const u = msg.usage;
41
- inputTokens += u.input_tokens ?? 0;
42
- outputTokens += u.output_tokens ?? 0;
43
- cacheReadTokens += u.cache_read_input_tokens ?? 0;
44
- cacheCreateTokens += u.cache_creation_input_tokens ?? 0;
45
- if (msg.model && !model)
46
- model = msg.model;
47
- turns++;
212
+ foldUsageLine(kind, agg, seenMessageIds, entry);
48
213
  }
49
214
  catch { /* skip malformed lines */ }
50
215
  }
51
216
  }
52
217
  catch (err) {
53
- logger.error(`Failed to read session JSONL: ${err.message}`);
218
+ logger.error(`Failed to read session token usage JSONL (${kind}): ${err.message}`);
54
219
  return null;
55
220
  }
56
- return { inputTokens, outputTokens, cacheReadTokens, cacheCreateTokens, model, turns };
221
+ return agg;
222
+ }
223
+ function finalizeTokenUsage(aggregate) {
224
+ const { inputTokens, outputTokens, cacheReadTokens, cacheCreateTokens, model, turns, latestCodexUsage } = aggregate;
225
+ if (latestCodexUsage)
226
+ return { ...latestCodexUsage, model: model || latestCodexUsage.model };
227
+ if (turns === 0)
228
+ return null;
229
+ return {
230
+ in: inputTokens + cacheReadTokens + cacheCreateTokens,
231
+ out: outputTokens,
232
+ inputTokens,
233
+ outputTokens,
234
+ cacheReadTokens,
235
+ cacheCreateTokens,
236
+ model,
237
+ turns,
238
+ };
239
+ }
240
+ const usageFileCache = new Map();
241
+ const USAGE_FILE_CACHE_MAX_ENTRIES = 512;
242
+ /** While a transcript keeps changing, serve the cached value and reparse at
243
+ * most once per interval — keeps row composition off the disk. */
244
+ const USAGE_REPARSE_MIN_INTERVAL_MS = 15_000;
245
+ const sessionPathCache = new Map();
246
+ const SESSION_PATH_CACHE_MAX_ENTRIES = 1024;
247
+ /** A missed lookup (transcript not on disk yet) is retried only after this
248
+ * window — fresh sessions otherwise trigger a directory scan per row render. */
249
+ const PATH_MISS_RETRY_MS = 30_000;
250
+ /** Aiden checkpoint paths move as the session progresses (latest.json points
251
+ * at a new checkpoint id per turn), so positive hits expire quickly too. */
252
+ const AIDEN_PATH_HIT_TTL_MS = 15_000;
253
+ export function __resetSessionUsageCachesForTest() {
254
+ usageFileCache.clear();
255
+ sessionPathCache.clear();
256
+ }
257
+ /** Memoize a transcript-path lookup. `hitTtlMs === null` means a found path
258
+ * is trusted forever (rollout/transcript files never move); misses are
259
+ * retried after PATH_MISS_RETRY_MS — or immediately when `retryMiss` is set
260
+ * (ledger reads must see lazily created transcripts at turn boundaries).
261
+ * `refreshHit` additionally re-resolves a cached positive hit — for sources
262
+ * whose path MOVES between turns (aiden checkpoints), a fresh ledger read
263
+ * must not settle for a stale path inside the hit TTL. */
264
+ function cachedPathLookup(key, hitTtlMs, lookup, opts) {
265
+ const now = Date.now();
266
+ const cached = sessionPathCache.get(key);
267
+ if (cached) {
268
+ if (cached.path !== null) {
269
+ if (!opts?.refreshHit && (hitTtlMs === null || now - cached.atMs < hitTtlMs))
270
+ return cached.path;
271
+ }
272
+ else if (!opts?.retryMiss && now - cached.atMs < PATH_MISS_RETRY_MS) {
273
+ return null;
274
+ }
275
+ }
276
+ if (sessionPathCache.size >= SESSION_PATH_CACHE_MAX_ENTRIES && !sessionPathCache.has(key)) {
277
+ const oldest = sessionPathCache.keys().next().value;
278
+ if (oldest !== undefined)
279
+ sessionPathCache.delete(oldest);
280
+ }
281
+ const path = lookup();
282
+ sessionPathCache.set(key, { path, atMs: now });
283
+ return path;
284
+ }
285
+ function cloneAggregate(agg) {
286
+ return { ...agg };
287
+ }
288
+ function foldUsageText(kind, agg, seenMessageIds, text) {
289
+ for (const line of text.split('\n')) {
290
+ if (!line.trim())
291
+ continue;
292
+ try {
293
+ foldUsageLine(kind, agg, seenMessageIds, JSON.parse(line));
294
+ }
295
+ catch { /* skip malformed lines */ }
296
+ }
297
+ }
298
+ function readFileSlice(path, start, length) {
299
+ try {
300
+ const fd = openSync(path, 'r');
301
+ const buf = Buffer.alloc(length);
302
+ let bytesRead = 0;
303
+ try {
304
+ while (bytesRead < length) {
305
+ const n = readSync(fd, buf, bytesRead, length - bytesRead, start + bytesRead);
306
+ if (n <= 0)
307
+ break;
308
+ bytesRead += n;
309
+ }
310
+ }
311
+ finally {
312
+ closeSync(fd);
313
+ }
314
+ return buf.subarray(0, bytesRead);
315
+ }
316
+ catch (err) {
317
+ logger.error(`Failed to read transcript slice ${path}: ${err.message}`);
318
+ return null;
319
+ }
320
+ }
321
+ function readSessionTokenAggregateCached(path, kind, opts) {
322
+ const key = `${kind}:${path}`;
323
+ let st = null;
324
+ try {
325
+ st = statSync(path);
326
+ }
327
+ catch {
328
+ st = null;
329
+ }
330
+ if (!st) {
331
+ // Unstat-able (file gone, or mocked fs in unit tests): parse directly, uncached.
332
+ usageFileCache.delete(key);
333
+ if (kind === 'aiden') {
334
+ const result = readTokenUsageFromAidenCheckpoint(path);
335
+ return result ? { agg: newTokenUsageAggregate(), result } : null;
336
+ }
337
+ const agg = readTokenUsageAggregate(path, kind);
338
+ return agg ? { agg, result: finalizeTokenUsage(agg) } : null;
339
+ }
340
+ const now = Date.now();
341
+ const cached = usageFileCache.get(key);
342
+ if (cached) {
343
+ const unchanged = cached.mtimeMs === st.mtimeMs && cached.size === st.size;
344
+ const throttled = !opts?.fresh && now - cached.parsedAtMs < USAGE_REPARSE_MIN_INTERVAL_MS;
345
+ if (unchanged || throttled) {
346
+ return { agg: cached.previewAgg, result: cached.result };
347
+ }
348
+ }
349
+ if (usageFileCache.size >= USAGE_FILE_CACHE_MAX_ENTRIES && !usageFileCache.has(key)) {
350
+ const oldest = usageFileCache.keys().next().value;
351
+ if (oldest !== undefined)
352
+ usageFileCache.delete(oldest);
353
+ }
354
+ if (kind === 'aiden') {
355
+ // Checkpoints are rewritten whole — nothing incremental to exploit.
356
+ const result = readTokenUsageFromAidenCheckpoint(path);
357
+ const blank = newTokenUsageAggregate();
358
+ usageFileCache.set(key, {
359
+ mtimeMs: st.mtimeMs,
360
+ size: st.size,
361
+ offset: -1,
362
+ state: blank,
363
+ seenMessageIds: new Set(),
364
+ previewAgg: blank,
365
+ result,
366
+ parsedAtMs: now,
367
+ });
368
+ return { agg: blank, result };
369
+ }
370
+ let state;
371
+ let seenMessageIds;
372
+ let baseOffset;
373
+ if (cached && cached.offset > 0 && st.size >= cached.offset) {
374
+ // Append-only growth: continue folding from the durable frontier.
375
+ state = cached.state;
376
+ seenMessageIds = cached.seenMessageIds;
377
+ baseOffset = cached.offset;
378
+ }
379
+ else {
380
+ state = newTokenUsageAggregate();
381
+ seenMessageIds = new Set();
382
+ baseOffset = 0;
383
+ }
384
+ const chunk = readFileSlice(path, baseOffset, st.size - baseOffset);
385
+ if (!chunk) {
386
+ usageFileCache.delete(key);
387
+ return null;
388
+ }
389
+ const lastNewline = chunk.lastIndexOf(0x0a);
390
+ const completeBytes = lastNewline >= 0 ? lastNewline + 1 : 0;
391
+ foldUsageText(kind, state, seenMessageIds, chunk.toString('utf8', 0, completeBytes));
392
+ // The bytes after the last newline may still be a complete JSON record
393
+ // (writer mid-flush). Fold them into a preview copy only — the durable
394
+ // frontier stays at the newline, so the line is folded durably exactly
395
+ // once when its terminator arrives.
396
+ let previewAgg = state;
397
+ const tailText = chunk.toString('utf8', completeBytes).trim();
398
+ if (tailText) {
399
+ previewAgg = cloneAggregate(state);
400
+ foldUsageText(kind, previewAgg, new Set(seenMessageIds), tailText);
401
+ }
402
+ const result = finalizeTokenUsage(previewAgg);
403
+ usageFileCache.set(key, {
404
+ mtimeMs: st.mtimeMs,
405
+ size: st.size,
406
+ offset: baseOffset + completeBytes,
407
+ state,
408
+ seenMessageIds,
409
+ previewAgg,
410
+ result,
411
+ parsedAtMs: now,
412
+ });
413
+ return { agg: previewAgg, result };
414
+ }
415
+ /** Read a transcript's token usage through the stat/incremental cache.
416
+ * This is the reusable entry point for dashboard rows and, later, the
417
+ * persistent usage ledger. */
418
+ export function readSessionTokenUsageFile(path, kind, opts) {
419
+ return readSessionTokenAggregateCached(path, kind, opts)?.result ?? null;
420
+ }
421
+ function readTokenUsageFromAidenCheckpoint(path) {
422
+ let inputTokens = 0;
423
+ let outputTokens = 0;
424
+ let cacheReadTokens = 0;
425
+ let cacheCreateTokens = 0;
426
+ let model = '';
427
+ let turns = 0;
428
+ try {
429
+ const checkpoint = JSON.parse(readFileSync(path, 'utf-8'));
430
+ const messages = checkpoint?.checkpoint?.channel_values?.messages;
431
+ if (!Array.isArray(messages))
432
+ return null;
433
+ for (const msg of messages) {
434
+ // LangGraph checkpoints only attribute usage to AI messages; human/tool
435
+ // entries occasionally echo usage metadata and must not be counted.
436
+ if (msg?.type === 'human' || msg?.type === 'tool')
437
+ continue;
438
+ const u = msg?.usage_metadata ?? msg?.usage;
439
+ if (!u || typeof u !== 'object')
440
+ continue;
441
+ const input = pickNum(u, ['input_tokens', 'inputTokens', 'prompt_tokens', 'promptTokens']);
442
+ const output = pickNum(u, ['output_tokens', 'outputTokens', 'completion_tokens', 'completionTokens']);
443
+ inputTokens += input;
444
+ outputTokens += output;
445
+ cacheReadTokens +=
446
+ pickNum(u?.input_token_details, ['cache_read', 'cached_tokens', 'cacheRead']) +
447
+ pickNum(u?.input_tokens_details, ['cache_read', 'cached_tokens', 'cacheRead']);
448
+ cacheCreateTokens +=
449
+ pickNum(u?.input_token_details, ['cache_creation', 'cache_write', 'cacheCreate']) +
450
+ pickNum(u?.input_tokens_details, ['cache_creation', 'cache_write', 'cacheCreate']);
451
+ if (!model && typeof msg?.response_metadata?.model_name === 'string')
452
+ model = msg.response_metadata.model_name;
453
+ turns++;
454
+ }
455
+ }
456
+ catch (err) {
457
+ logger.error(`Failed to read Aiden checkpoint token usage: ${err.message}`);
458
+ return null;
459
+ }
460
+ if (turns === 0)
461
+ return null;
462
+ return {
463
+ in: inputTokens,
464
+ out: outputTokens,
465
+ inputTokens,
466
+ outputTokens,
467
+ cacheReadTokens,
468
+ cacheCreateTokens,
469
+ model,
470
+ turns,
471
+ };
472
+ }
473
+ function tokenUsagePathForSession(q) {
474
+ const sid = q.cliSessionId || q.sessionId;
475
+ switch (q.cliId) {
476
+ case 'claude-code':
477
+ return q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, join(homedir(), '.claude')) : null;
478
+ case 'seed':
479
+ return q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, process.env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude-runtime')) : null;
480
+ case 'codex':
481
+ return cachedPathLookup(`codex:${q.sessionId}:${q.cliSessionId ?? ''}`, null, () => {
482
+ const codexSid = q.cliSessionId || findCodexSessionIdByBotmuxSessionId(q.sessionId) || q.sessionId;
483
+ return findCodexRolloutBySessionId(codexSid) ?? null;
484
+ }, { retryMiss: q.fresh });
485
+ case 'coco':
486
+ return cocoEventsPathForSession(sid);
487
+ case 'cursor':
488
+ return cachedPathLookup(`cursor:${sid}`, null, () => findCursorTranscriptByChatId(sid) ?? null, { retryMiss: q.fresh });
489
+ case 'traex':
490
+ return cachedPathLookup(`traex:${sid}`, null, () => findTraexRolloutBySessionId(sid) ?? null, { retryMiss: q.fresh });
491
+ case 'antigravity':
492
+ return q.cliSessionId
493
+ ? join(homedir(), '.gemini', 'antigravity-cli', 'brain', q.cliSessionId, '.system_generated', 'logs', 'transcript.jsonl')
494
+ : null;
495
+ default:
496
+ return null;
497
+ }
498
+ }
499
+ export function getSessionTokenUsage(q) {
500
+ if (q.cliId === 'aiden') {
501
+ const sid = q.cliSessionId || q.sessionId;
502
+ const checkpointPath = cachedPathLookup(`aiden:${q.sessionId}:${sid}:${q.cwd ?? ''}`, AIDEN_PATH_HIT_TTL_MS, () => findAidenLatestCheckpointBySessionId(sid, undefined, q.cwd) ??
503
+ findAidenLatestCheckpointByBotmuxSessionId(q.sessionId, undefined, q.cwd) ??
504
+ null, { retryMiss: q.fresh, refreshHit: q.fresh });
505
+ if (!checkpointPath || !existsSync(checkpointPath))
506
+ return null;
507
+ return readSessionTokenUsageFile(checkpointPath, 'aiden', { fresh: q.fresh });
508
+ }
509
+ const path = tokenUsagePathForSession(q);
510
+ if (!path || !existsSync(path))
511
+ return null;
512
+ return readSessionTokenUsageFile(path, usageKindForCli(q.cliId), { fresh: q.fresh });
57
513
  }
58
514
  export function formatNumber(n) {
59
515
  return n.toLocaleString('en-US');
@@ -1 +1 @@
1
- {"version":3,"file":"cost-calculator.js","sourceRoot":"","sources":["../../src/core/cost-calculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAalD,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,GAAW;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,+EAA+E;IAC/E,yDAAyD;IACzD,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC3F,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,GAAW;IAC3D,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;oBAAE,SAAS;gBACzC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC1B,IAAI,CAAC,GAAG,EAAE,KAAK;oBAAE,SAAS;gBAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;gBACpB,WAAW,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;gBACnC,YAAY,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;gBACrC,eAAe,IAAI,CAAC,CAAC,uBAAuB,IAAI,CAAC,CAAC;gBAClD,iBAAiB,IAAI,CAAC,CAAC,2BAA2B,IAAI,CAAC,CAAC;gBACxD,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK;oBAAE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;gBAC3C,KAAK,EAAE,CAAC;YACV,CAAC;YAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"cost-calculator.js","sourceRoot":"","sources":["../../src/core/cost-calculator.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { DaemonSession } from './types.js';
2
2
  import type { Session, StreamStatus } from '../types.js';
3
3
  import type { CliId } from '../adapters/cli/types.js';
4
4
  import { type Brand } from '../im/lark/lark-hosts.js';
5
+ import { type SessionTokenUsage } from './cost-calculator.js';
5
6
  export interface SessionRow {
6
7
  sessionId: string;
7
8
  larkAppId: string;
@@ -48,6 +49,8 @@ export interface SessionRow {
48
49
  reason: string;
49
50
  at: number;
50
51
  };
52
+ /** Native Agent CLI token usage for this session. Null means unavailable. */
53
+ tokenUsage?: SessionTokenUsage | null;
51
54
  }
52
55
  export declare function feishuChatLink(chatId: string, brand?: Brand): string;
53
56
  export declare function setBotName(name: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-rows.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,0BAA0B,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;gFAG4E;IAC5E,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;8EAG0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB;mDAC+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;mDAC+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;wEAIoE;IACpE,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAE9E;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAA0B;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAA0B;AAY9D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,UAAU,CAgClE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAoB3D"}
1
+ {"version":3,"file":"dashboard-rows.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;gFAG4E;IAC5E,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;8EAG0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB;mDAC+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;mDAC+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;wEAIoE;IACpE,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,6EAA6E;IAC7E,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAE9E;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAA0B;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAA0B;AAY9D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE1D;AAWD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,UAAU,CAiClE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAqB3D"}
@@ -1,6 +1,7 @@
1
1
  import { getTerminalAdvertisedPort } from './terminal-url.js';
2
2
  import { getBotBrand } from '../bot-registry.js';
3
3
  import { chatAppLink } from '../im/lark/lark-hosts.js';
4
+ import { getSessionTokenUsage } from './cost-calculator.js';
4
5
  export function feishuChatLink(chatId, brand = 'feishu') {
5
6
  return chatAppLink(chatId, brand);
6
7
  }
@@ -19,6 +20,14 @@ function sessionCreatedAtMs(s) {
19
20
  export function sessionLastActivityAtMs(s) {
20
21
  return parseSessionTime(s.lastMessageAt) ?? sessionCreatedAtMs(s);
21
22
  }
23
+ function sessionTokenUsage(s, workingDir) {
24
+ return getSessionTokenUsage({
25
+ cliId: s.cliId ?? 'unknown',
26
+ sessionId: s.sessionId,
27
+ cliSessionId: s.cliSessionId,
28
+ cwd: workingDir ?? s.workingDir,
29
+ });
30
+ }
22
31
  export function composeRowFromActive(ds) {
23
32
  return {
24
33
  sessionId: ds.session.sessionId,
@@ -50,6 +59,7 @@ export function composeRowFromActive(ds) {
50
59
  agentAttention: ds.agentAttention
51
60
  ? { kind: ds.agentAttention.kind, reason: ds.agentAttention.reason, at: ds.agentAttention.at }
52
61
  : undefined,
62
+ tokenUsage: sessionTokenUsage(ds.session, ds.workingDir),
53
63
  };
54
64
  }
55
65
  export function composeRowFromClosed(s) {
@@ -71,6 +81,7 @@ export function composeRowFromClosed(s) {
71
81
  ownerOpenId: s.ownerOpenId,
72
82
  webPort: s.webPort ?? null,
73
83
  feishuChatLink: feishuChatLink(s.chatId, getBotBrand(s.larkAppId ?? '')),
84
+ tokenUsage: sessionTokenUsage(s),
74
85
  };
75
86
  }
76
87
  //# sourceMappingURL=dashboard-rows.js.map