botmux 2.67.1 → 2.68.1

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 (55) hide show
  1. package/dist/adapters/cli/pi.d.ts.map +1 -1
  2. package/dist/adapters/cli/pi.js +0 -1
  3. package/dist/adapters/cli/pi.js.map +1 -1
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +79 -17
  6. package/dist/cli.js.map +1 -1
  7. package/dist/core/auto-start.d.ts +23 -0
  8. package/dist/core/auto-start.d.ts.map +1 -1
  9. package/dist/core/auto-start.js +30 -0
  10. package/dist/core/auto-start.js.map +1 -1
  11. package/dist/core/command-handler.d.ts +9 -9
  12. package/dist/core/command-handler.d.ts.map +1 -1
  13. package/dist/core/command-handler.js +23 -16
  14. package/dist/core/command-handler.js.map +1 -1
  15. package/dist/core/cost-calculator.d.ts +27 -0
  16. package/dist/core/cost-calculator.d.ts.map +1 -1
  17. package/dist/core/cost-calculator.js +483 -27
  18. package/dist/core/cost-calculator.js.map +1 -1
  19. package/dist/core/dashboard-rows.d.ts +3 -0
  20. package/dist/core/dashboard-rows.d.ts.map +1 -1
  21. package/dist/core/dashboard-rows.js +11 -0
  22. package/dist/core/dashboard-rows.js.map +1 -1
  23. package/dist/core/worker-pool.d.ts.map +1 -1
  24. package/dist/core/worker-pool.js +28 -1
  25. package/dist/core/worker-pool.js.map +1 -1
  26. package/dist/daemon.d.ts.map +1 -1
  27. package/dist/daemon.js +15 -6
  28. package/dist/daemon.js.map +1 -1
  29. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  30. package/dist/dashboard/web/i18n.js +4 -0
  31. package/dist/dashboard/web/i18n.js.map +1 -1
  32. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  33. package/dist/dashboard/web/sessions.js +16 -1
  34. package/dist/dashboard/web/sessions.js.map +1 -1
  35. package/dist/dashboard-web/app.js +120 -116
  36. package/dist/dashboard-web/style.css +4 -0
  37. package/dist/dashboard.js +41 -13
  38. package/dist/dashboard.js.map +1 -1
  39. package/dist/i18n/en.js +2 -2
  40. package/dist/i18n/en.js.map +1 -1
  41. package/dist/i18n/zh.js +2 -2
  42. package/dist/i18n/zh.js.map +1 -1
  43. package/dist/services/aiden-checkpoints.d.ts +5 -0
  44. package/dist/services/aiden-checkpoints.d.ts.map +1 -0
  45. package/dist/services/aiden-checkpoints.js +91 -0
  46. package/dist/services/aiden-checkpoints.js.map +1 -0
  47. package/dist/services/codex-transcript.d.ts +7 -0
  48. package/dist/services/codex-transcript.d.ts.map +1 -1
  49. package/dist/services/codex-transcript.js +60 -1
  50. package/dist/services/codex-transcript.js.map +1 -1
  51. package/dist/services/usage-ledger.d.ts +109 -0
  52. package/dist/services/usage-ledger.d.ts.map +1 -0
  53. package/dist/services/usage-ledger.js +434 -0
  54. package/dist/services/usage-ledger.js.map +1 -0
  55. package/package.json +1 -1
@@ -0,0 +1,434 @@
1
+ /**
2
+ * Usage ledger — durable per-turn token usage records.
3
+ *
4
+ * On every turn boundary (working→idle edge, session close) the daemon takes
5
+ * a cumulative token snapshot of the session's transcript (via the cached
6
+ * reader in cost-calculator) and appends the positive delta as one
7
+ * self-describing JSON line to a daily ledger file.
8
+ *
9
+ * The ledger is the stable contract for external usage trackers (kaboo-cli
10
+ * reads it the same way it reads HappyClaw's usage_records table):
11
+ * ~/.botmux/usage/usage-YYYY-MM-DD.jsonl (UTC date, append-only)
12
+ * ~/.botmux/usage/state.json (per-session baselines)
13
+ *
14
+ * Records intentionally carry redundant context (larkAppId, chatId, title,
15
+ * callerOpenId, cumulative totals) so a single excerpted line self-validates
16
+ * without joining back to sessions.json.
17
+ */
18
+ import { appendFileSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
19
+ import { homedir } from 'node:os';
20
+ import { join } from 'node:path';
21
+ import { createHash } from 'node:crypto';
22
+ import { logger } from '../utils/logger.js';
23
+ import { getSessionTokenUsage } from '../core/cost-calculator.js';
24
+ /** Last authoritative baseline per session, kept in memory: the hot path
25
+ * never rescans the ledger, and a lost/stale state file inside one process
26
+ * lifetime cannot regress the baseline. */
27
+ const sessionBaselineMemory = new Map();
28
+ export function __resetUsageLedgerMemoryForTest() {
29
+ sessionBaselineMemory.clear();
30
+ ownershipWritten.clear();
31
+ }
32
+ /** Ownership markers already written by this process (recordId-keyed). */
33
+ const ownershipWritten = new Set();
34
+ function baselineMemoryKey(larkAppId, sessionId) {
35
+ return `${larkAppId ?? ''}\u0000${sessionId}`;
36
+ }
37
+ function finiteNum(v) {
38
+ return typeof v === 'number' && Number.isFinite(v) ? v : 0;
39
+ }
40
+ /** Reconstruct the newest baseline for a session from the ledger files
41
+ * themselves (newest file first; last matching line in a file is newest).
42
+ * This is the crash-recovery source of truth: a record that reached the
43
+ * ledger but whose state advance was lost is still binding. */
44
+ function baselineFromLedger(dir, sessionId) {
45
+ let files;
46
+ try {
47
+ files = readdirSync(dir)
48
+ .filter((f) => /^usage-\d{4}-\d{2}-\d{2}\.jsonl$/.test(f))
49
+ .sort()
50
+ .reverse();
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ for (const name of files) {
56
+ let content;
57
+ try {
58
+ content = readFileSync(join(dir, name), 'utf8');
59
+ }
60
+ catch {
61
+ continue;
62
+ }
63
+ let latest = null;
64
+ for (const line of content.split('\n')) {
65
+ if (!line.includes(sessionId))
66
+ continue;
67
+ try {
68
+ const rec = JSON.parse(line);
69
+ // Ownership markers are not accounting events — their zero totals
70
+ // must never re-seed a baseline.
71
+ if (rec?.sessionId === sessionId && rec?.kind !== 'ownership')
72
+ latest = rec;
73
+ }
74
+ catch { /* skip malformed lines */ }
75
+ }
76
+ if (latest) {
77
+ return {
78
+ inputTokens: finiteNum(latest.totalInputTokens),
79
+ outputTokens: finiteNum(latest.totalOutputTokens),
80
+ cacheReadTokens: finiteNum(latest.totalCacheReadTokens),
81
+ cacheCreateTokens: finiteNum(latest.totalCacheCreateTokens),
82
+ recordedAt: typeof latest.ts === 'string' ? latest.ts : new Date(0).toISOString(),
83
+ epoch: finiteNum(latest.epoch),
84
+ };
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ /** Of two baseline candidates, pick the newer: higher epoch wins; within an
90
+ * epoch totals are monotonic, so the larger sum wins. */
91
+ function newerBaseline(a, b) {
92
+ if (!a)
93
+ return b ?? undefined;
94
+ if (!b)
95
+ return a;
96
+ const ea = a.epoch ?? 0;
97
+ const eb = b.epoch ?? 0;
98
+ if (ea !== eb)
99
+ return ea > eb ? a : b;
100
+ const sum = (x) => x.inputTokens + x.outputTokens + x.cacheReadTokens + x.cacheCreateTokens;
101
+ return sum(a) >= sum(b) ? a : b;
102
+ }
103
+ /** Effective baseline = newest of (state file, in-memory latest, ledger scan).
104
+ * The ledger scan runs at most once per session per process lifetime. */
105
+ function resolveBaseline(dir, larkAppId, sessionId, stateBaseline) {
106
+ const key = baselineMemoryKey(larkAppId, sessionId);
107
+ let remembered = sessionBaselineMemory.get(key);
108
+ if (remembered === undefined) {
109
+ remembered = baselineFromLedger(dir, sessionId);
110
+ sessionBaselineMemory.set(key, remembered);
111
+ }
112
+ return newerBaseline(stateBaseline, remembered);
113
+ }
114
+ /** Baselines for sessions idle longer than this are pruned from state.json. */
115
+ const BASELINE_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;
116
+ export function defaultLedgerDir() {
117
+ return process.env.BOTMUX_USAGE_DIR || join(homedir(), '.botmux', 'usage');
118
+ }
119
+ // Baselines are partitioned per bot (larkAppId): botmux can run one daemon
120
+ // per bot, and a shared read-modify-write state file would let one daemon's
121
+ // rename clobber another's freshly advanced baselines.
122
+ function statePath(dir, larkAppId) {
123
+ const id = (larkAppId ?? '').replace(/[^A-Za-z0-9_-]/g, '') || 'default';
124
+ return join(dir, `state-${id}.json`);
125
+ }
126
+ function loadState(dir, larkAppId) {
127
+ try {
128
+ const parsed = JSON.parse(readFileSync(statePath(dir, larkAppId), 'utf8'));
129
+ if (parsed && typeof parsed === 'object' && parsed.sessions && typeof parsed.sessions === 'object') {
130
+ return { v: 1, sessions: parsed.sessions };
131
+ }
132
+ }
133
+ catch { /* first run or corrupt state — start fresh */ }
134
+ return { v: 1, sessions: {} };
135
+ }
136
+ function saveState(dir, larkAppId, state, now) {
137
+ for (const [sessionId, baseline] of Object.entries(state.sessions)) {
138
+ const recordedAt = Date.parse(baseline.recordedAt);
139
+ if (Number.isFinite(recordedAt) && now.getTime() - recordedAt > BASELINE_RETENTION_MS) {
140
+ delete state.sessions[sessionId];
141
+ }
142
+ }
143
+ // temp+rename keeps a crash from truncating state; the pid suffix keeps
144
+ // concurrent daemons from stomping each other's tmp file.
145
+ const target = statePath(dir, larkAppId);
146
+ const tmp = `${target}.${process.pid}.tmp`;
147
+ writeFileSync(tmp, JSON.stringify(state));
148
+ renameSync(tmp, target);
149
+ }
150
+ /** Deterministic id for one baseline→snapshot transition: a crash-replay of
151
+ * the same transition regenerates the SAME id, so the consumer's DedupKey
152
+ * collapses the duplicated ledger line instead of double counting it. */
153
+ function deterministicRecordId(sessionId, epoch, prev, cur) {
154
+ const h = createHash('sha256');
155
+ h.update([
156
+ sessionId,
157
+ epoch,
158
+ prev?.inputTokens ?? 0,
159
+ prev?.outputTokens ?? 0,
160
+ prev?.cacheReadTokens ?? 0,
161
+ prev?.cacheCreateTokens ?? 0,
162
+ cur.inputTokens,
163
+ cur.outputTokens,
164
+ cur.cacheReadTokens,
165
+ cur.cacheCreateTokens,
166
+ ].join('|'));
167
+ return h.digest('hex').slice(0, 32);
168
+ }
169
+ function ledgerFilePath(dir, now) {
170
+ const date = now.toISOString().slice(0, 10);
171
+ return join(dir, `usage-${date}.jsonl`);
172
+ }
173
+ /**
174
+ * Diff the cumulative usage snapshot against the session's stored baseline
175
+ * and append a record when the delta is positive. Returns the record, or
176
+ * null when there is nothing to write (no growth, or a shrink — transcript
177
+ * rotation / clear — which just resets the baseline).
178
+ */
179
+ export function recordSessionUsage(args) {
180
+ try {
181
+ const now = args.now ?? new Date();
182
+ const dir = args.ledgerDir ?? defaultLedgerDir();
183
+ mkdirSync(dir, { recursive: true });
184
+ const state = loadState(dir, args.larkAppId);
185
+ const prev = resolveBaseline(dir, args.larkAppId, args.sessionId, state.sessions[args.sessionId]);
186
+ const cur = args.usage;
187
+ const prevEpoch = prev?.epoch ?? 0;
188
+ const deltaInput = cur.inputTokens - (prev?.inputTokens ?? 0);
189
+ const deltaOutput = cur.outputTokens - (prev?.outputTokens ?? 0);
190
+ const deltaCacheRead = cur.cacheReadTokens - (prev?.cacheReadTokens ?? 0);
191
+ const deltaCacheCreate = cur.cacheCreateTokens - (prev?.cacheCreateTokens ?? 0);
192
+ const baseline = {
193
+ inputTokens: cur.inputTokens,
194
+ outputTokens: cur.outputTokens,
195
+ cacheReadTokens: cur.cacheReadTokens,
196
+ cacheCreateTokens: cur.cacheCreateTokens,
197
+ recordedAt: now.toISOString(),
198
+ epoch: prevEpoch,
199
+ };
200
+ if (deltaInput < 0 || deltaOutput < 0 || deltaCacheRead < 0 || deltaCacheCreate < 0) {
201
+ // Cumulative shrank (/clear, rotation): re-anchor, never write negatives.
202
+ // The epoch bump keeps a later identical totals transition from reusing
203
+ // a pre-reset recordId.
204
+ baseline.epoch = prevEpoch + 1;
205
+ sessionBaselineMemory.set(baselineMemoryKey(args.larkAppId, args.sessionId), baseline);
206
+ state.sessions[args.sessionId] = baseline;
207
+ saveState(dir, args.larkAppId, state, now);
208
+ return null;
209
+ }
210
+ if (deltaInput === 0 && deltaOutput === 0 && deltaCacheRead === 0 && deltaCacheCreate === 0) {
211
+ return null;
212
+ }
213
+ const record = {
214
+ v: 1,
215
+ recordId: deterministicRecordId(args.sessionId, prevEpoch, prev, cur),
216
+ ts: now.toISOString(),
217
+ epoch: prevEpoch,
218
+ ...(args.larkAppId ? { larkAppId: args.larkAppId } : {}),
219
+ sessionId: args.sessionId,
220
+ ...(args.cliId ? { cliId: args.cliId } : {}),
221
+ ...(args.cliSessionId ? { cliSessionId: args.cliSessionId } : {}),
222
+ ...(args.chatId ? { chatId: args.chatId } : {}),
223
+ ...(args.title ? { title: args.title } : {}),
224
+ ...(args.workingDir ? { workingDir: args.workingDir } : {}),
225
+ ...(args.callerOpenId ? { callerOpenId: args.callerOpenId } : {}),
226
+ model: cur.model,
227
+ inputTokens: deltaInput,
228
+ outputTokens: deltaOutput,
229
+ cacheReadTokens: deltaCacheRead,
230
+ cacheCreateTokens: deltaCacheCreate,
231
+ totalInputTokens: cur.inputTokens,
232
+ totalOutputTokens: cur.outputTokens,
233
+ totalCacheReadTokens: cur.cacheReadTokens,
234
+ totalCacheCreateTokens: cur.cacheCreateTokens,
235
+ };
236
+ // Append first, then advance the baseline: a crash in between replays the
237
+ // same transition with the SAME recordId, which the consumer dedupes.
238
+ appendFileSync(ledgerFilePath(dir, now), JSON.stringify(record) + '\n');
239
+ // Memory advances immediately after the append: even if saveState throws
240
+ // without killing the process, this process will not re-bill the interval.
241
+ sessionBaselineMemory.set(baselineMemoryKey(args.larkAppId, args.sessionId), baseline);
242
+ state.sessions[args.sessionId] = baseline;
243
+ saveState(dir, args.larkAppId, state, now);
244
+ return record;
245
+ }
246
+ catch (err) {
247
+ // The ledger must never take the daemon down with it.
248
+ logger.error(`usage-ledger: failed to record session usage: ${err?.message ?? err}`);
249
+ return null;
250
+ }
251
+ }
252
+ /**
253
+ * Re-anchor a session's baseline to the current cumulative snapshot WITHOUT
254
+ * writing a record. Called at worker spawn: anything already in the
255
+ * transcript at that point (resumed history, direct-tmux use while the
256
+ * daemon was down) stays out of the ledger — only growth that happens while
257
+ * botmux drives the session is recorded.
258
+ */
259
+ export function anchorSessionUsage(args) {
260
+ try {
261
+ const now = args.now ?? new Date();
262
+ const dir = args.ledgerDir ?? defaultLedgerDir();
263
+ mkdirSync(dir, { recursive: true });
264
+ const state = loadState(dir, args.larkAppId);
265
+ const prev = resolveBaseline(dir, args.larkAppId, args.sessionId, state.sessions[args.sessionId]);
266
+ const baseline = {
267
+ inputTokens: args.usage.inputTokens,
268
+ outputTokens: args.usage.outputTokens,
269
+ cacheReadTokens: args.usage.cacheReadTokens,
270
+ cacheCreateTokens: args.usage.cacheCreateTokens,
271
+ recordedAt: now.toISOString(),
272
+ // Anchors start a new epoch: transitions after a re-anchor must never
273
+ // collide with recordIds from before it.
274
+ epoch: (prev?.epoch ?? 0) + 1,
275
+ };
276
+ sessionBaselineMemory.set(baselineMemoryKey(args.larkAppId, args.sessionId), baseline);
277
+ state.sessions[args.sessionId] = baseline;
278
+ saveState(dir, args.larkAppId, state, now);
279
+ }
280
+ catch (err) {
281
+ logger.error(`usage-ledger: failed to anchor session baseline: ${err?.message ?? err}`);
282
+ }
283
+ }
284
+ function ledgerArgsForDaemonSession(ds) {
285
+ const s = ds.session;
286
+ const workingDir = ds.workingDir ?? s.workingDir;
287
+ // fresh: ledger snapshots are turn-boundary exact — bypass the dashboard
288
+ // read throttle (incremental folding keeps this cheap).
289
+ const usage = getSessionTokenUsage({
290
+ cliId: s.cliId ?? 'unknown',
291
+ sessionId: s.sessionId,
292
+ cliSessionId: s.cliSessionId,
293
+ cwd: workingDir,
294
+ fresh: true,
295
+ });
296
+ return {
297
+ sessionId: s.sessionId,
298
+ usage,
299
+ larkAppId: ds.larkAppId ?? s.larkAppId,
300
+ cliId: s.cliId,
301
+ cliSessionId: s.cliSessionId,
302
+ chatId: s.chatId,
303
+ title: s.title,
304
+ workingDir,
305
+ callerOpenId: s.lastCallerOpenId ?? s.creatorOpenId ?? s.ownerOpenId,
306
+ };
307
+ }
308
+ /** Turn boundary (idle/limited edge, session close): append the delta. */
309
+ export function recordUsageForDaemonSession(ds, opts) {
310
+ try {
311
+ const args = ledgerArgsForDaemonSession(ds);
312
+ if (!args.usage)
313
+ return null;
314
+ return recordSessionUsage({ ...args, usage: args.usage, ...opts });
315
+ }
316
+ catch (err) {
317
+ logger.error(`usage-ledger: failed to record daemon session usage: ${err?.message ?? err}`);
318
+ return null;
319
+ }
320
+ }
321
+ /**
322
+ * Append a zero-delta ownership marker tying a botmux session to its
323
+ * CLI-native session id. Written at spawn / as soon as the CLI session id is
324
+ * known — consumers (kaboo) exclude the session from their native parsers the
325
+ * moment this line exists, closing the "native parser uploads the transcript
326
+ * before the first positive delta lands" double-count window. Does NOT touch
327
+ * baselines; the deterministic recordId makes cross-restart repeats collapse
328
+ * at the consumer.
329
+ */
330
+ export function recordSessionOwnership(args) {
331
+ try {
332
+ if (!args.cliSessionId)
333
+ return null;
334
+ const recordId = createHash('sha256')
335
+ .update(`ownership|${args.sessionId}|${args.cliSessionId}`)
336
+ .digest('hex')
337
+ .slice(0, 32);
338
+ if (ownershipWritten.has(recordId))
339
+ return null;
340
+ const now = args.now ?? new Date();
341
+ const dir = args.ledgerDir ?? defaultLedgerDir();
342
+ mkdirSync(dir, { recursive: true });
343
+ const record = {
344
+ v: 1,
345
+ kind: 'ownership',
346
+ recordId,
347
+ ts: now.toISOString(),
348
+ epoch: 0,
349
+ ...(args.larkAppId ? { larkAppId: args.larkAppId } : {}),
350
+ sessionId: args.sessionId,
351
+ ...(args.cliId ? { cliId: args.cliId } : {}),
352
+ cliSessionId: args.cliSessionId,
353
+ ...(args.chatId ? { chatId: args.chatId } : {}),
354
+ ...(args.title ? { title: args.title } : {}),
355
+ ...(args.workingDir ? { workingDir: args.workingDir } : {}),
356
+ ...(args.callerOpenId ? { callerOpenId: args.callerOpenId } : {}),
357
+ model: '',
358
+ inputTokens: 0,
359
+ outputTokens: 0,
360
+ cacheReadTokens: 0,
361
+ cacheCreateTokens: 0,
362
+ totalInputTokens: 0,
363
+ totalOutputTokens: 0,
364
+ totalCacheReadTokens: 0,
365
+ totalCacheCreateTokens: 0,
366
+ };
367
+ appendFileSync(ledgerFilePath(dir, now), JSON.stringify(record) + '\n');
368
+ ownershipWritten.add(recordId);
369
+ return record;
370
+ }
371
+ catch (err) {
372
+ logger.error(`usage-ledger: failed to record session ownership: ${err?.message ?? err}`);
373
+ return null;
374
+ }
375
+ }
376
+ /** Ownership marker from a live daemon session (no transcript read needed). */
377
+ export function recordOwnershipForDaemonSession(ds, opts) {
378
+ try {
379
+ const s = ds.session;
380
+ return recordSessionOwnership({
381
+ sessionId: s.sessionId,
382
+ cliSessionId: s.cliSessionId,
383
+ larkAppId: ds.larkAppId ?? s.larkAppId,
384
+ cliId: s.cliId,
385
+ chatId: s.chatId,
386
+ title: s.title,
387
+ workingDir: ds.workingDir ?? s.workingDir,
388
+ callerOpenId: s.lastCallerOpenId ?? s.creatorOpenId ?? s.ownerOpenId,
389
+ ...opts,
390
+ });
391
+ }
392
+ catch (err) {
393
+ logger.error(`usage-ledger: failed to record daemon session ownership: ${err?.message ?? err}`);
394
+ return null;
395
+ }
396
+ }
397
+ /**
398
+ * Daemon-restart restore: a turn that was in flight when the daemon died may
399
+ * have finished inside tmux while we were away — that work was submitted by
400
+ * botmux and belongs in the ledger. If the session already has a baseline,
401
+ * record the catch-up delta; only sessions the ledger has never seen are
402
+ * anchored (their transcript history predates botmux bookkeeping).
403
+ */
404
+ export function reconcileUsageForDaemonSession(ds, opts) {
405
+ try {
406
+ const args = ledgerArgsForDaemonSession(ds);
407
+ if (!args.usage)
408
+ return null;
409
+ const dir = opts?.ledgerDir ?? defaultLedgerDir();
410
+ const state = loadState(dir, args.larkAppId);
411
+ if (resolveBaseline(dir, args.larkAppId, args.sessionId, state.sessions[args.sessionId])) {
412
+ return recordSessionUsage({ ...args, usage: args.usage, ...opts });
413
+ }
414
+ anchorSessionUsage({ ...args, usage: args.usage, ...opts });
415
+ return null;
416
+ }
417
+ catch (err) {
418
+ logger.error(`usage-ledger: failed to reconcile daemon session usage: ${err?.message ?? err}`);
419
+ return null;
420
+ }
421
+ }
422
+ /** Worker spawn: re-anchor so pre-existing transcript history is not billed. */
423
+ export function anchorUsageForDaemonSession(ds, opts) {
424
+ try {
425
+ const args = ledgerArgsForDaemonSession(ds);
426
+ if (!args.usage)
427
+ return;
428
+ anchorSessionUsage({ ...args, usage: args.usage, ...opts });
429
+ }
430
+ catch (err) {
431
+ logger.error(`usage-ledger: failed to anchor daemon session usage: ${err?.message ?? err}`);
432
+ }
433
+ }
434
+ //# sourceMappingURL=usage-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-ledger.js","sourceRoot":"","sources":["../../src/services/usage-ledger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botmux",
3
- "version": "2.67.1",
3
+ "version": "2.68.1",
4
4
  "description": "Bridge between IM platforms and AI coding CLIs — one topic, one CLI session with live streaming",
5
5
  "type": "module",
6
6
  "main": "dist/index-daemon.js",