clawprobe 0.3.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core/db.d.ts CHANGED
@@ -13,16 +13,39 @@ export interface SessionSnapshotRow {
13
13
  compaction_count: number;
14
14
  sampled_at: number;
15
15
  }
16
- export interface CostRecordRow {
16
+ /**
17
+ * One row per assistant turn, keyed by (agent, session_key, turn_index).
18
+ * Stores the raw token breakdown reported by the model so that cost can be
19
+ * recomputed accurately at any time with the current price table.
20
+ *
21
+ * Billing semantics (matches provider invoices):
22
+ * cost = (input - cache_read - cache_write) * input_price
23
+ * + output * output_price
24
+ * + cache_read * input_price * cacheReadMultiplier
25
+ * + cache_write * input_price * cacheWriteMultiplier
26
+ */
27
+ export interface TurnRecordRow {
17
28
  id: number;
18
29
  agent: string;
19
30
  session_key: string;
31
+ /** YYYY-MM-DD of the turn, in local timezone */
20
32
  date: string;
33
+ /** 1-based index within the session */
34
+ turn_index: number;
35
+ /** Unix seconds */
36
+ sampled_at: number;
37
+ model: string | null;
38
+ provider: string | null;
39
+ /** Full context tokens sent this turn (billed as input by provider) */
21
40
  input_tokens: number;
41
+ /** Tokens generated this turn */
22
42
  output_tokens: number;
23
- model: string | null;
43
+ /** Tokens served from prompt cache (billed at discounted rate) */
44
+ cache_read: number;
45
+ /** Tokens written to prompt cache */
46
+ cache_write: number;
47
+ /** Pre-computed USD cost for this turn, stored for fast aggregation */
24
48
  estimated_usd: number;
25
- recorded_at: number;
26
49
  }
27
50
  export interface CompactEventRow {
28
51
  id: number;
@@ -57,6 +80,11 @@ export interface SuggestionRow {
57
80
  dismissed: number;
58
81
  }
59
82
  export declare function openDb(probeDir: string): DatabaseSync;
83
+ /**
84
+ * Delete the probe.db file and reset the in-memory handle.
85
+ * The next call to openDb() will recreate a fresh database.
86
+ */
87
+ export declare function dropAndResetDb(probeDir: string): void;
60
88
  export declare function getDb(): DatabaseSync;
61
89
  export declare function resetDb(): void;
62
90
  export declare function insertSessionSnapshot(db: DatabaseSync, row: Omit<SessionSnapshotRow, "id">): void;
@@ -67,27 +95,25 @@ export declare function getAllSessionKeys(db: DatabaseSync, agent: string): {
67
95
  session_key: string;
68
96
  last_sampled_at: number;
69
97
  }[];
70
- export declare function upsertCostRecord(db: DatabaseSync, row: Omit<CostRecordRow, "id">): void;
71
- export declare function getDailyCostSummary(db: DatabaseSync, agent: string, days: number): {
72
- date: string;
73
- total_usd: number;
74
- input_tokens: number;
75
- output_tokens: number;
76
- }[];
98
+ export declare function upsertTurnRecord(db: DatabaseSync, row: Omit<TurnRecordRow, "id">): void;
77
99
  /**
78
- * Returns the raw per-session cost rows for a date range, including model name.
79
- * Used by getPeriodCost to recompute USD from live price table rather than
80
- * relying on the stored estimated_usd (which may have been recorded before
81
- * prices were available).
100
+ * Return per-date aggregated token counts for the cost summary view.
101
+ * estimated_usd is the stored value; callers may recompute from token columns.
82
102
  */
83
- export declare function getDailyCostRows(db: DatabaseSync, agent: string, days: number): {
103
+ export declare function getTurnSummaryByDate(db: DatabaseSync, agent: string, days: number): {
84
104
  date: string;
85
- session_key: string;
86
- model: string | null;
87
105
  input_tokens: number;
88
106
  output_tokens: number;
107
+ cache_read: number;
108
+ cache_write: number;
109
+ model: string | null;
89
110
  estimated_usd: number;
90
111
  }[];
112
+ /**
113
+ * Return raw per-turn rows for a date range.
114
+ * Used by getPeriodCost to recompute USD with the live price table.
115
+ */
116
+ export declare function getTurnRows(db: DatabaseSync, agent: string, days: number): TurnRecordRow[];
91
117
  export declare function upsertCompactEvent(db: DatabaseSync, row: Omit<CompactEventRow, "id">): void;
92
118
  export declare function getCompactEvents(db: DatabaseSync, agent: string, limit: number, sessionKey?: string): CompactEventRow[];
93
119
  export declare function getCompactEventById(db: DatabaseSync, id: number): CompactEventRow | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
package/dist/core/db.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import { DatabaseSync } from "node:sqlite";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
+ // ---------------------------------------------------------------------------
5
+ // Schema (v0.5 — replaces cost_records with turn_records)
6
+ // ---------------------------------------------------------------------------
4
7
  const SCHEMA = `
5
8
  PRAGMA journal_mode = WAL;
6
9
  PRAGMA foreign_keys = ON;
@@ -20,22 +23,32 @@ CREATE TABLE IF NOT EXISTS session_snapshots (
20
23
  sampled_at INTEGER NOT NULL
21
24
  );
22
25
 
23
- CREATE UNIQUE INDEX IF NOT EXISTS idx_ss_agent_session ON session_snapshots(agent, session_key, sampled_at);
26
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_ss_agent_session
27
+ ON session_snapshots(agent, session_key, sampled_at);
24
28
 
25
- CREATE TABLE IF NOT EXISTS cost_records (
29
+ -- Per-turn token records the single source of truth for cost.
30
+ -- Replacing the old cost_records table which discarded cache token info.
31
+ CREATE TABLE IF NOT EXISTS turn_records (
26
32
  id INTEGER PRIMARY KEY AUTOINCREMENT,
27
33
  agent TEXT NOT NULL,
28
34
  session_key TEXT NOT NULL,
29
35
  date TEXT NOT NULL,
36
+ turn_index INTEGER NOT NULL,
37
+ sampled_at INTEGER NOT NULL,
38
+ model TEXT,
39
+ provider TEXT,
30
40
  input_tokens INTEGER NOT NULL DEFAULT 0,
31
41
  output_tokens INTEGER NOT NULL DEFAULT 0,
32
- model TEXT,
33
- estimated_usd REAL NOT NULL DEFAULT 0,
34
- recorded_at INTEGER NOT NULL
42
+ cache_read INTEGER NOT NULL DEFAULT 0,
43
+ cache_write INTEGER NOT NULL DEFAULT 0,
44
+ estimated_usd REAL NOT NULL DEFAULT 0
35
45
  );
36
46
 
37
- CREATE INDEX IF NOT EXISTS idx_cr_agent_date ON cost_records(agent, date);
47
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_tr_agent_session_turn
48
+ ON turn_records(agent, session_key, turn_index);
38
49
 
50
+ CREATE INDEX IF NOT EXISTS idx_tr_agent_date
51
+ ON turn_records(agent, date);
39
52
 
40
53
  CREATE TABLE IF NOT EXISTS compact_events (
41
54
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -62,7 +75,8 @@ CREATE TABLE IF NOT EXISTS file_snapshots (
62
75
  sampled_at INTEGER NOT NULL
63
76
  );
64
77
 
65
- CREATE UNIQUE INDEX IF NOT EXISTS idx_fs_agent_path ON file_snapshots(agent, file_path, sampled_at);
78
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_fs_agent_path
79
+ ON file_snapshots(agent, file_path, sampled_at);
66
80
 
67
81
  CREATE TABLE IF NOT EXISTS suggestions (
68
82
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -78,6 +92,9 @@ CREATE TABLE IF NOT EXISTS suggestions (
78
92
 
79
93
  CREATE INDEX IF NOT EXISTS idx_sg_agent_rule ON suggestions(agent, rule_id, dismissed);
80
94
  `;
95
+ // ---------------------------------------------------------------------------
96
+ // DB lifecycle
97
+ // ---------------------------------------------------------------------------
81
98
  let _db = null;
82
99
  export function openDb(probeDir) {
83
100
  if (_db)
@@ -86,33 +103,20 @@ export function openDb(probeDir) {
86
103
  const dbPath = path.join(probeDir, "probe.db");
87
104
  _db = new DatabaseSync(dbPath);
88
105
  _db.exec(SCHEMA);
89
- migrateDb(_db);
90
106
  return _db;
91
107
  }
92
108
  /**
93
- * Run lightweight migrations for schema changes that can't be done with
94
- * CREATE TABLE IF NOT EXISTS (e.g. deduplicating existing rows before
95
- * adding a UNIQUE index, or adding columns to existing tables).
109
+ * Delete the probe.db file and reset the in-memory handle.
110
+ * The next call to openDb() will recreate a fresh database.
96
111
  */
97
- function migrateDb(db) {
98
- // v0.2.11: deduplicate cost_records before adding unique index
99
- try {
100
- // Remove duplicate rows, keeping only the one with the highest output_tokens per (agent, session_key, date)
101
- db.exec(`
102
- DELETE FROM cost_records
103
- WHERE id NOT IN (
104
- SELECT MAX(id) FROM cost_records
105
- GROUP BY agent, session_key, date
106
- )
107
- `);
108
- db.exec(`
109
- CREATE UNIQUE INDEX IF NOT EXISTS idx_cr_unique
110
- ON cost_records(agent, session_key, date)
111
- `);
112
- }
113
- catch {
114
- // If migration fails, the SELECT+UPDATE fallback in upsertCostRecord still works
112
+ export function dropAndResetDb(probeDir) {
113
+ if (_db) {
114
+ _db.close();
115
+ _db = null;
115
116
  }
117
+ const dbPath = path.join(probeDir, "probe.db");
118
+ if (fs.existsSync(dbPath))
119
+ fs.unlinkSync(dbPath);
116
120
  }
117
121
  export function getDb() {
118
122
  if (!_db)
@@ -125,11 +129,10 @@ export function resetDb() {
125
129
  _db = null;
126
130
  }
127
131
  }
128
- // --- Session Snapshots ---
132
+ // ---------------------------------------------------------------------------
133
+ // Session Snapshots
134
+ // ---------------------------------------------------------------------------
129
135
  export function insertSessionSnapshot(db, row) {
130
- // INSERT OR REPLACE deduplicates same (agent, session_key, sampled_at) so that
131
- // if the daemon triggers twice in the same second we don't create duplicate rows
132
- // that would cause token deltas to be counted twice in recordDailyCost.
133
136
  db.prepare(`
134
137
  INSERT INTO session_snapshots
135
138
  (agent, session_key, session_id, model, provider,
@@ -180,66 +183,66 @@ export function getAllSessionKeys(db, agent) {
180
183
  ORDER BY last_sampled_at DESC
181
184
  `).all(agent);
182
185
  }
183
- // --- Cost Records ---
184
- export function upsertCostRecord(db, row) {
185
- // Use SELECT + UPDATE/INSERT to avoid relying on UNIQUE constraint
186
- // (which may not exist on older DBs created before v0.2.11).
187
- // We store the cumulative daily total per session, updating when the
188
- // new value is larger (so repeated scans don't double-count).
189
- const existing = db.prepare(`
190
- SELECT id, input_tokens, output_tokens, estimated_usd
191
- FROM cost_records
192
- WHERE agent = ? AND session_key = ? AND date = ?
193
- ORDER BY id DESC LIMIT 1
194
- `).get(row.agent, row.session_key, row.date);
195
- if (existing) {
196
- // Only update if the new value is larger (cumulative total grew)
197
- if (row.output_tokens > existing.output_tokens) {
198
- db.prepare(`
199
- UPDATE cost_records
200
- SET input_tokens = ?, output_tokens = ?, model = ?, estimated_usd = ?, recorded_at = ?
201
- WHERE id = ?
202
- `).run(row.input_tokens, row.output_tokens, row.model, row.estimated_usd, row.recorded_at, existing.id);
203
- }
204
- }
205
- else {
206
- db.prepare(`
207
- INSERT INTO cost_records
208
- (agent, session_key, date, input_tokens, output_tokens, model, estimated_usd, recorded_at)
209
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
210
- `).run(row.agent, row.session_key, row.date, row.input_tokens, row.output_tokens, row.model, row.estimated_usd, row.recorded_at);
211
- }
186
+ // ---------------------------------------------------------------------------
187
+ // Turn Records (replaces cost_records)
188
+ // ---------------------------------------------------------------------------
189
+ export function upsertTurnRecord(db, row) {
190
+ db.prepare(`
191
+ INSERT INTO turn_records
192
+ (agent, session_key, date, turn_index, sampled_at, model, provider,
193
+ input_tokens, output_tokens, cache_read, cache_write, estimated_usd)
194
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
195
+ ON CONFLICT(agent, session_key, turn_index) DO UPDATE SET
196
+ date = excluded.date,
197
+ sampled_at = excluded.sampled_at,
198
+ model = excluded.model,
199
+ provider = excluded.provider,
200
+ input_tokens = excluded.input_tokens,
201
+ output_tokens = excluded.output_tokens,
202
+ cache_read = excluded.cache_read,
203
+ cache_write = excluded.cache_write,
204
+ estimated_usd = excluded.estimated_usd
205
+ `).run(row.agent, row.session_key, row.date, row.turn_index, row.sampled_at, row.model, row.provider, row.input_tokens, row.output_tokens, row.cache_read, row.cache_write, row.estimated_usd);
212
206
  }
213
- export function getDailyCostSummary(db, agent, days) {
207
+ /**
208
+ * Return per-date aggregated token counts for the cost summary view.
209
+ * estimated_usd is the stored value; callers may recompute from token columns.
210
+ */
211
+ export function getTurnSummaryByDate(db, agent, days) {
214
212
  const cutoff = new Date(Date.now() - days * 86400_000).toISOString().slice(0, 10);
213
+ // Group by date + model so the caller can apply the correct per-model price.
214
+ // Use MAX(model) as a tiebreaker when a session switches models within a day.
215
215
  return db.prepare(`
216
216
  SELECT
217
217
  date,
218
- SUM(estimated_usd) AS total_usd,
219
- SUM(input_tokens) AS input_tokens,
220
- SUM(output_tokens) AS output_tokens
221
- FROM cost_records
218
+ SUM(input_tokens) AS input_tokens,
219
+ SUM(output_tokens) AS output_tokens,
220
+ SUM(cache_read) AS cache_read,
221
+ SUM(cache_write) AS cache_write,
222
+ model,
223
+ SUM(estimated_usd) AS estimated_usd
224
+ FROM turn_records
222
225
  WHERE agent = ? AND date >= ?
223
- GROUP BY date
226
+ GROUP BY date, model
224
227
  ORDER BY date ASC
225
228
  `).all(agent, cutoff);
226
229
  }
227
230
  /**
228
- * Returns the raw per-session cost rows for a date range, including model name.
229
- * Used by getPeriodCost to recompute USD from live price table rather than
230
- * relying on the stored estimated_usd (which may have been recorded before
231
- * prices were available).
231
+ * Return raw per-turn rows for a date range.
232
+ * Used by getPeriodCost to recompute USD with the live price table.
232
233
  */
233
- export function getDailyCostRows(db, agent, days) {
234
+ export function getTurnRows(db, agent, days) {
234
235
  const cutoff = new Date(Date.now() - days * 86400_000).toISOString().slice(0, 10);
235
236
  return db.prepare(`
236
- SELECT date, session_key, model, input_tokens, output_tokens, estimated_usd
237
- FROM cost_records
237
+ SELECT *
238
+ FROM turn_records
238
239
  WHERE agent = ? AND date >= ?
239
- ORDER BY date ASC
240
+ ORDER BY date ASC, sampled_at ASC
240
241
  `).all(agent, cutoff);
241
242
  }
242
- // --- Compact Events ---
243
+ // ---------------------------------------------------------------------------
244
+ // Compact Events
245
+ // ---------------------------------------------------------------------------
243
246
  export function upsertCompactEvent(db, row) {
244
247
  db.prepare(`
245
248
  INSERT OR REPLACE INTO compact_events
@@ -268,10 +271,10 @@ export function getCompactEvents(db, agent, limit, sessionKey) {
268
271
  export function getCompactEventById(db, id) {
269
272
  return db.prepare(`SELECT * FROM compact_events WHERE id = ?`).get(id);
270
273
  }
271
- // --- File Snapshots ---
274
+ // ---------------------------------------------------------------------------
275
+ // File Snapshots
276
+ // ---------------------------------------------------------------------------
272
277
  export function insertFileSnapshot(db, row) {
273
- // ON CONFLICT deduplicates same (agent, file_path, sampled_at) so repeated
274
- // snapshots within the same second don't produce phantom rows in context output.
275
278
  db.prepare(`
276
279
  INSERT INTO file_snapshots
277
280
  (agent, file_path, raw_chars, injected_chars, was_truncated, sampled_at)
@@ -283,8 +286,6 @@ export function insertFileSnapshot(db, row) {
283
286
  `).run(row.agent, row.file_path, row.raw_chars, row.injected_chars, row.was_truncated, row.sampled_at);
284
287
  }
285
288
  export function getLatestFileSnapshots(db, agent) {
286
- // UNIQUE index on (agent, file_path, sampled_at) guarantees at most one row per
287
- // (file, second), so the simple MAX(sampled_at) join is always duplicate-free.
288
289
  return db.prepare(`
289
290
  SELECT fs.*
290
291
  FROM file_snapshots fs
@@ -298,7 +299,9 @@ export function getLatestFileSnapshots(db, agent) {
298
299
  ORDER BY fs.raw_chars DESC
299
300
  `).all(agent, agent);
300
301
  }
301
- // --- Suggestions ---
302
+ // ---------------------------------------------------------------------------
303
+ // Suggestions
304
+ // ---------------------------------------------------------------------------
302
305
  export function upsertSuggestion(db, row) {
303
306
  const existing = db.prepare(`
304
307
  SELECT id, dismissed FROM suggestions
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
@@ -86,8 +86,10 @@ export interface SessionStats {
86
86
  totalInput: number;
87
87
  /** Total output tokens across all turns (non-error) */
88
88
  totalOutput: number;
89
- /** Total cache-read tokens */
89
+ /** Total cache-read tokens (served from prompt cache, billed at discounted rate) */
90
90
  totalCacheRead: number;
91
+ /** Total cache-write tokens (written to prompt cache, may be billed at premium) */
92
+ totalCacheWrite: number;
91
93
  /** Total tokens in last successful assistant turn (= current context usage) */
92
94
  lastTotalTokens: number;
93
95
  /** Number of user turns */
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-parser.d.ts","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsonl-parser.d.ts","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
@@ -91,6 +91,7 @@ export function parseSessionStats(filePath) {
91
91
  let totalInput = 0;
92
92
  let totalOutput = 0;
93
93
  let totalCacheRead = 0;
94
+ let totalCacheWrite = 0;
94
95
  let lastTotalTokens = 0;
95
96
  let userTurns = 0;
96
97
  let assistantTurns = 0;
@@ -160,6 +161,7 @@ export function parseSessionStats(filePath) {
160
161
  totalInput += usage.input ?? 0;
161
162
  totalOutput += usage.output ?? 0;
162
163
  totalCacheRead += usage.cacheRead ?? 0;
164
+ totalCacheWrite += usage.cacheWrite ?? 0;
163
165
  // Track the last turn's totalTokens for context window display
164
166
  if (usage.totalTokens > 0) {
165
167
  lastTotalTokens = usage.totalTokens;
@@ -190,6 +192,7 @@ export function parseSessionStats(filePath) {
190
192
  totalInput,
191
193
  totalOutput,
192
194
  totalCacheRead,
195
+ totalCacheWrite,
193
196
  lastTotalTokens,
194
197
  userTurns,
195
198
  assistantTurns,
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-parser.js","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsonl-parser.js","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA8BlD,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGpE"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA8BlD,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGpE"}
package/dist/daemon.js CHANGED
@@ -2,12 +2,12 @@ import fs from "fs";
2
2
  import path from "path";
3
3
  import { openDb, insertSessionSnapshot, upsertCompactEvent } from "./core/db.js";
4
4
  import { FileWatcher, buildWatchGlobs } from "./core/watcher.js";
5
- import { readSessionsStore, listJsonlFiles, findJsonlPath } from "./core/session-store.js";
5
+ import { readSessionsStore, listJsonlFiles, findJsonlPath, clearJsonlCache } from "./core/session-store.js";
6
6
  import { parseIncremental, parseAll, parseSessionStats } from "./core/jsonl-parser.js";
7
7
  import { analyzeCompaction } from "./engines/compact-diff.js";
8
8
  import { snapshotWorkspaceFiles } from "./engines/file-analyzer.js";
9
9
  import { runRules, persistSuggestions } from "./engines/rule-engine.js";
10
- import { recordDailyCost, todayString } from "./engines/cost.js";
10
+ import { recordSessionTurns } from "./engines/cost.js";
11
11
  let watcher = null;
12
12
  /** Redirect stdout/stderr to daemon.log when running as detached child (stdio is ignored). */
13
13
  function redirectStdioToLogFile(probeDir) {
@@ -46,7 +46,7 @@ export async function startDaemon(cfg) {
46
46
  console.error(`[daemon] WARNING: sessionsDir does not exist: ${cfg.sessionsDir}`);
47
47
  console.error(`[daemon] Token snapshots will not be written until this directory is created.`);
48
48
  }
49
- // Initial scan of all existing .jsonl files
49
+ // Initial scan of all existing .jsonl files (writes turn_records for cost)
50
50
  const jsonlFiles = listJsonlFiles(cfg.sessionsDir);
51
51
  console.log(`[daemon] Found ${jsonlFiles.length} .jsonl transcript(s) to scan`);
52
52
  for (const jsonlPath of jsonlFiles) {
@@ -57,7 +57,9 @@ export async function startDaemon(cfg) {
57
57
  console.error(`[daemon] Error scanning ${jsonlPath}:`, err);
58
58
  }
59
59
  }
60
- // Initial snapshot of sessions.json
60
+ // Clear uuid→path cache after initial scan so watcher picks up new files correctly
61
+ clearJsonlCache();
62
+ // Snapshot sessions.json for status/context display (not cost)
61
63
  try {
62
64
  const sessionCount = await processSessionsJson(cfg, agent);
63
65
  console.log(`[daemon] Snapshotted ${sessionCount} session(s) from sessions.json`);
@@ -120,8 +122,8 @@ async function processSessionsJson(cfg, agent) {
120
122
  const db = openDb(cfg.probeDir);
121
123
  const sessions = readSessionsStore(cfg.sessionsDir);
122
124
  const now = Math.floor(Date.now() / 1000);
123
- const today = todayString();
124
125
  for (const session of sessions) {
126
+ // Snapshot for status/context queries (not used for cost anymore)
125
127
  insertSessionSnapshot(db, {
126
128
  agent,
127
129
  session_key: session.sessionKey,
@@ -135,31 +137,9 @@ async function processSessionsJson(cfg, agent) {
135
137
  compaction_count: session.compactionCount,
136
138
  sampled_at: now,
137
139
  });
138
- // Record daily cost using sessions.json totals (authoritative cumulative values)
139
- // Use jsonl only to resolve model name if sessions.json doesn't have it.
140
- try {
141
- const outputTokens = session.outputTokens;
142
- const inputTokens = session.inputTokens;
143
- let model = session.modelOverride ?? null;
144
- if (!model) {
145
- const jsonlPath = findJsonlPath(cfg.sessionsDir, session);
146
- if (jsonlPath) {
147
- const stats = parseSessionStats(jsonlPath);
148
- if (stats?.model)
149
- model = stats.model;
150
- }
151
- }
152
- if (outputTokens > 0 || inputTokens > 0) {
153
- recordDailyCost(db, agent, session.sessionKey, today, inputTokens, outputTokens, model, cfg.probe.cost.customPrices);
154
- console.log(`[daemon] cost recorded: ${session.sessionKey.slice(0, 30)} in=${inputTokens} out=${outputTokens} model=${model}`);
155
- }
156
- else {
157
- console.log(`[daemon] cost skip: ${session.sessionKey.slice(0, 30)} — zero tokens in sessions.json`);
158
- }
159
- }
160
- catch (err) {
161
- console.error(`[daemon] cost record error for ${session.sessionKey}:`, err);
162
- }
140
+ // Cost is recorded exclusively from jsonl in processJsonlFile.
141
+ // sessions.json only provides coarse cumulative totals without per-turn
142
+ // or cache token breakdown, so we skip cost recording here.
163
143
  }
164
144
  return sessions.length;
165
145
  }
@@ -174,24 +154,22 @@ async function processJsonlFile(cfg, agent, filePath, fullScan) {
174
154
  });
175
155
  // Fall back to UUID filename if no sessions.json entry (orphan transcript)
176
156
  const sessionKey = matchedSession?.sessionKey ?? path.basename(filePath, ".jsonl");
177
- // For orphan sessions (no sessions.json entry), record cost from jsonl stats.
178
- // Named sessions are handled in processSessionsJson with more accurate totals.
179
- if (!matchedSession) {
180
- try {
181
- const stats = parseSessionStats(filePath);
182
- if (stats && (stats.totalOutput > 0 || stats.totalInput > 0)) {
183
- // Use the date the session was last active, not today
184
- const lastActiveDate = stats.lastActiveAt > 0
185
- ? new Date(stats.lastActiveAt * 1000).toISOString().slice(0, 10)
186
- : todayString();
187
- recordDailyCost(db, agent, sessionKey, lastActiveDate, stats.totalInput, stats.totalOutput, stats.model, cfg.probe.cost.customPrices);
188
- console.log(`[daemon] cost recorded (orphan): ${sessionKey.slice(0, 30)} in=${stats.totalInput} out=${stats.totalOutput}`);
189
- }
190
- }
191
- catch (err) {
192
- console.error(`[daemon] cost record error (orphan) for ${sessionKey}:`, err);
157
+ // Record per-turn cost data from jsonl for all sessions (named and orphan).
158
+ // This is the only cost-recording path sessions.json is no longer used for billing.
159
+ // On fullScan we always re-parse to capture all turns; on incremental we still
160
+ // re-parse the full file because parseSessionStats reads everything anyway.
161
+ try {
162
+ const stats = parseSessionStats(filePath);
163
+ if (stats && stats.turns.length > 0) {
164
+ recordSessionTurns(db, agent, sessionKey, stats, cfg.probe.cost.customPrices);
165
+ console.log(`[daemon] turns recorded: ${sessionKey.slice(0, 30)} ` +
166
+ `turns=${stats.turns.length} in=${stats.totalInput} out=${stats.totalOutput} ` +
167
+ `cacheRead=${stats.totalCacheRead} cacheWrite=${stats.totalCacheWrite} model=${stats.model}`);
193
168
  }
194
169
  }
170
+ catch (err) {
171
+ console.error(`[daemon] turn record error for ${sessionKey}:`, err);
172
+ }
195
173
  const { entries, compactEvents } = fullScan ? parseAll(filePath) : parseIncremental(filePath);
196
174
  if (compactEvents.length === 0)
197
175
  return;