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 +43 -17
- package/dist/core/db.d.ts.map +1 -1
- package/dist/core/db.js +86 -83
- package/dist/core/db.js.map +1 -1
- package/dist/core/jsonl-parser.d.ts +3 -1
- package/dist/core/jsonl-parser.d.ts.map +1 -1
- package/dist/core/jsonl-parser.js +3 -0
- package/dist/core/jsonl-parser.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +24 -46
- package/dist/daemon.js.map +1 -1
- package/dist/engines/cost.d.ts +28 -18
- package/dist/engines/cost.d.ts.map +1 -1
- package/dist/engines/cost.js +91 -56
- package/dist/engines/cost.js.map +1 -1
- package/dist/engines/rule-engine.d.ts.map +1 -1
- package/dist/engines/rule-engine.js +15 -10
- package/dist/engines/rule-engine.js.map +1 -1
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
*
|
|
79
|
-
*
|
|
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
|
|
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;
|
package/dist/core/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,
|
|
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
|
|
26
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_ss_agent_session
|
|
27
|
+
ON session_snapshots(agent, session_key, sampled_at);
|
|
24
28
|
|
|
25
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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
|
|
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
|
-
*
|
|
94
|
-
*
|
|
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
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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(
|
|
219
|
-
SUM(
|
|
220
|
-
SUM(
|
|
221
|
-
|
|
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
|
-
*
|
|
229
|
-
* Used by getPeriodCost to recompute USD
|
|
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
|
|
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
|
|
237
|
-
FROM
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
// Suggestions
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
302
305
|
export function upsertSuggestion(db, row) {
|
|
303
306
|
const existing = db.prepare(`
|
|
304
307
|
SELECT id, dismissed FROM suggestions
|
package/dist/core/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AA2FxB,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFd,CAAC;AAEF,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,IAAI,GAAG,GAAwB,IAAI,CAAC;AAEpC,MAAM,UAAU,MAAM,CAAC,QAAgB;IACrC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/C,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CACnC,EAAgB,EAChB,GAAmC;IAEnC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;GAgBV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EACnE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,cAAc,EACzE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,UAAU,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAgB,EAChB,KAAa,EACb,UAAkB;IAElB,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;GAKjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAA8C,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAgB,EAChB,KAAa,EACb,UAAkB;IAElB,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;GAKjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAA8C,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,EAAgB,EAChB,KAAa,EACb,UAAkB;IAElB,OAAO,EAAE,CAAC,OAAO,CAAC;;;;GAIjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAoC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAgB,EAChB,KAAa;IAEb,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;;GAMjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAkE,CAAC;AACjF,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAC9B,EAAgB,EAChB,GAA8B;IAE9B,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;GAeV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EACpE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EACvB,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,EACpE,GAAG,CAAC,aAAa,CAClB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAgB,EAChB,KAAa,EACb,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,6EAA6E;IAC7E,8EAA8E;IAC9E,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;GAajB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAqK,CAAC;AAC5L,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,EAAgB,EAChB,KAAa,EACb,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;GAKjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAA+B,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAChC,EAAgB,EAChB,GAAgC;IAEhC,EAAE,CAAC,OAAO,CAAC;;;;;;GAMV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,EAC5E,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,EACrD,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,kBAAkB,CACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAgB,EAChB,KAAa,EACb,KAAa,EACb,UAAmB;IAEnB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;KAKjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAiC,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;GAKjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAiC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAgB,EAChB,EAAU;IAEV,OAAO,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,EAAE,CAA2C,CAAC;AACnH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAChC,EAAgB,EAChB,GAAgC;IAEhC,EAAE,CAAC,OAAO,CAAC;;;;;;;;GAQV,CAAC,CAAC,GAAG,CACJ,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EACvC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,EAAgB,EAChB,KAAa;IAEb,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;GAWjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAiC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAC9B,EAAgB,EAChB,GAA4C;IAE5C,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAG3B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAA6D,CAAC;IAE3F,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,SAAS;YAAE,OAAO;QAC/B,EAAE,CAAC,OAAO,CAAC;;;;KAIV,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,OAAO,CAAC;;;;KAIV,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,EAAgB,EAChB,KAAa,EACb,QAAiB;IAEjB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,CAAC,OAAO,CAAC;;;;KAIjB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAA+B,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC;;;;GAIjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA+B,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAgB,EAChB,KAAa,EACb,MAAc;IAEd,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,KAAa;IAC5D,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAgB,EAChB,KAAa,EACb,MAAc;IAEd,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonl-parser.js","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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
|
-
//
|
|
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
|
-
//
|
|
139
|
-
//
|
|
140
|
-
|
|
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
|
-
//
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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;
|