@rasensio/aidlc 1.26.2 → 1.27.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/commands/cost.d.ts +7 -0
- package/dist/commands/cost.d.ts.map +1 -1
- package/dist/commands/cost.js +137 -0
- package/dist/commands/cost.js.map +1 -1
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +11 -3
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +27 -66
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +8 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/cost/context.d.ts +72 -0
- package/dist/cost/context.d.ts.map +1 -0
- package/dist/cost/context.js +155 -0
- package/dist/cost/context.js.map +1 -0
- package/dist/cost/dedupe-history.d.ts +98 -0
- package/dist/cost/dedupe-history.d.ts.map +1 -0
- package/dist/cost/dedupe-history.js +275 -0
- package/dist/cost/dedupe-history.js.map +1 -0
- package/dist/cost/ledger.d.ts.map +1 -1
- package/dist/cost/ledger.js +11 -5
- package/dist/cost/ledger.js.map +1 -1
- package/dist/cost/providers/claude-code.d.ts +13 -1
- package/dist/cost/providers/claude-code.d.ts.map +1 -1
- package/dist/cost/providers/claude-code.js +112 -10
- package/dist/cost/providers/claude-code.js.map +1 -1
- package/dist/cost/rates.d.ts +16 -1
- package/dist/cost/rates.d.ts.map +1 -1
- package/dist/cost/rates.js +21 -0
- package/dist/cost/rates.js.map +1 -1
- package/dist/cost/recorder.d.ts.map +1 -1
- package/dist/cost/recorder.js +3 -0
- package/dist/cost/recorder.js.map +1 -1
- package/dist/cost/report.d.ts +30 -0
- package/dist/cost/report.d.ts.map +1 -1
- package/dist/cost/report.js +96 -5
- package/dist/cost/report.js.map +1 -1
- package/dist/cost/sync.d.ts +18 -0
- package/dist/cost/sync.d.ts.map +1 -1
- package/dist/cost/sync.js +1 -1
- package/dist/cost/sync.js.map +1 -1
- package/dist/cost/types.d.ts +40 -0
- package/dist/cost/types.d.ts.map +1 -1
- package/dist/cost/types.js +15 -0
- package/dist/cost/types.js.map +1 -1
- package/dist/discover/scanner.d.ts +20 -2
- package/dist/discover/scanner.d.ts.map +1 -1
- package/dist/discover/scanner.js +80 -14
- package/dist/discover/scanner.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correct ledger entries written while one API response was counted many times.
|
|
3
|
+
*
|
|
4
|
+
* The claude-code provider used to emit one usage record per transcript *line*.
|
|
5
|
+
* Claude Code writes one line per content block and repeats the response's `usage`
|
|
6
|
+
* object on every one, so a response spanning three blocks was charged three times.
|
|
7
|
+
* Measured on this repo's 53 transcripts: 17,292 usage-bearing lines against 9,357
|
|
8
|
+
* unique `message.id` values — an over-count factor of **1.848**, with 7,935 repeat
|
|
9
|
+
* lines and zero whose usage object differed.
|
|
10
|
+
*
|
|
11
|
+
* `providers/claude-code.ts` now groups by `message.id`, which fixes capture going
|
|
12
|
+
* forward. This corrects what is already on disk, by re-reading each entry's source
|
|
13
|
+
* transcript through the fixed provider.
|
|
14
|
+
*
|
|
15
|
+
* Three properties are deliberate, and each is the same choice `rederive.ts` made
|
|
16
|
+
* for the same reason:
|
|
17
|
+
*
|
|
18
|
+
* 1. **Bounded by the entry's own coverage window.** One entry's cursor sits in a
|
|
19
|
+
* 633-record transcript while the entry covers only 80 of them, so re-deriving
|
|
20
|
+
* over the whole file inflated it 23x there. The bound is what makes this
|
|
21
|
+
* arithmetic rather than estimation.
|
|
22
|
+
* 2. **A missing transcript is reported, never estimated.** An entry that cannot be
|
|
23
|
+
* re-read is left byte-identical and counted. Scaling it by the measured 1.848x
|
|
24
|
+
* is explicitly rejected: an estimate that looks like a measurement is the
|
|
25
|
+
* defect this whole change exists to remove. `provenance.ts` keeps `unknown`
|
|
26
|
+
* distinct from `foreign` for the same reason — under-recovering is the safe
|
|
27
|
+
* direction.
|
|
28
|
+
* 3. **Verification is on precedence-weighted dollars, not raw token sums.** Raw
|
|
29
|
+
* sums can balance while weighted totals move, which is the exact shape of a
|
|
30
|
+
* defect that once reported a plausible total while double-counting 950 entries.
|
|
31
|
+
*
|
|
32
|
+
* Read-only unless `apply` is set. The plan names the dollar delta before anything
|
|
33
|
+
* is written, because applying it moves every cost figure this project has already
|
|
34
|
+
* published in a retrospective or a blog post.
|
|
35
|
+
*
|
|
36
|
+
* Requirements: context-budget/AC-11, AC-12, AC-13; NFR-5
|
|
37
|
+
* Design: design.md Part 3
|
|
38
|
+
*
|
|
39
|
+
* @module
|
|
40
|
+
*/
|
|
41
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
42
|
+
import { join } from 'node:path';
|
|
43
|
+
import { readEntries, rewriteLedger, applyPrecedence, ledgerPath, unattributedPath, } from './ledger.js';
|
|
44
|
+
import { effectiveRates, priceUnits } from './rates.js';
|
|
45
|
+
import { claudeCodeProvider } from './providers/claude-code.js';
|
|
46
|
+
import { buildCursorFileIndex } from './rederive.js';
|
|
47
|
+
function emptyReport(applied) {
|
|
48
|
+
return {
|
|
49
|
+
scanned: 0,
|
|
50
|
+
rederived: 0,
|
|
51
|
+
unchanged: 0,
|
|
52
|
+
duplicates: 0,
|
|
53
|
+
duplicateMicroUsd: 0,
|
|
54
|
+
transcriptGone: [],
|
|
55
|
+
manualSkipped: 0,
|
|
56
|
+
microUsdBefore: 0,
|
|
57
|
+
microUsdAfter: 0,
|
|
58
|
+
applied,
|
|
59
|
+
files: [],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Locate the single transcript holding `cursor`, or null when it is gone or ambiguous. */
|
|
63
|
+
function fileForCursor(cursor, index) {
|
|
64
|
+
if (cursor === null)
|
|
65
|
+
return null;
|
|
66
|
+
const files = index.get(cursor);
|
|
67
|
+
// A uuid in two files is ambiguous, never resolved by picking one: `/branch`
|
|
68
|
+
// copies transcripts, so the same uuid legitimately appears twice.
|
|
69
|
+
if (files === undefined || files.size !== 1)
|
|
70
|
+
return null;
|
|
71
|
+
return [...files][0];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Precedence-weighted micro-USD over a set of entries.
|
|
75
|
+
*
|
|
76
|
+
* Weighted, not raw, because `applyPrecedence` reduces overlap across fidelity
|
|
77
|
+
* ranks — a total that ignores it can balance while the real figure moves.
|
|
78
|
+
*/
|
|
79
|
+
function weightedMicroUsd(entries, rates) {
|
|
80
|
+
let micro = 0;
|
|
81
|
+
for (const { entry, weight } of applyPrecedence(entries)) {
|
|
82
|
+
if (weight === 0 || entry.units === null)
|
|
83
|
+
continue;
|
|
84
|
+
const price = priceUnits(entry.units, rates);
|
|
85
|
+
if (price !== null)
|
|
86
|
+
micro += price * weight;
|
|
87
|
+
}
|
|
88
|
+
return Math.round(micro);
|
|
89
|
+
}
|
|
90
|
+
function sameTokens(a, b) {
|
|
91
|
+
return (a.model === b.model &&
|
|
92
|
+
a.input_tokens === b.input_tokens &&
|
|
93
|
+
a.output_tokens === b.output_tokens &&
|
|
94
|
+
a.cache_read_tokens === b.cache_read_tokens &&
|
|
95
|
+
a.cache_write_tokens === b.cache_write_tokens);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Re-derive one entry's units from its transcript.
|
|
99
|
+
*
|
|
100
|
+
* Three outcomes, deliberately distinct because they justify three different
|
|
101
|
+
* actions: corrected units (rewrite), `'duplicate'` (drop — the charge is already
|
|
102
|
+
* counted elsewhere, provably), or `'unreadable'` (leave alone — an honest unknown).
|
|
103
|
+
*
|
|
104
|
+
* Returns the number of unique responses behind the corrected units, so the entry
|
|
105
|
+
* can carry a response count that pre-fix entries lack.
|
|
106
|
+
*/
|
|
107
|
+
async function rederiveUnits(entry, source, env, cache) {
|
|
108
|
+
/*
|
|
109
|
+
* One parse per transcript, not one per entry.
|
|
110
|
+
*
|
|
111
|
+
* Many entries share a source — this repo has 30,824 candidate entries across 53
|
|
112
|
+
* transcripts — so re-extracting per entry re-reads each megabyte file hundreds of
|
|
113
|
+
* times. Cached by path, which is safe because a single pass is a point-in-time
|
|
114
|
+
* correction: re-reading the same file twice mid-run and getting different answers
|
|
115
|
+
* would make the plan disagree with the apply.
|
|
116
|
+
*
|
|
117
|
+
* `null` caches a *failure* too, so an unreadable file is attempted once rather
|
|
118
|
+
* than once per entry that points at it.
|
|
119
|
+
*/
|
|
120
|
+
let segments = cache.get(source);
|
|
121
|
+
if (segments === undefined) {
|
|
122
|
+
try {
|
|
123
|
+
segments = await claudeCodeProvider.extract({ provider: 'claude-code', path: source }, null, env);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
segments = null;
|
|
127
|
+
}
|
|
128
|
+
cache.set(source, segments);
|
|
129
|
+
}
|
|
130
|
+
if (segments === null)
|
|
131
|
+
return 'unreadable';
|
|
132
|
+
if (entry.units === null || entry.units.kind !== 'tokens')
|
|
133
|
+
return 'unreadable';
|
|
134
|
+
const model = entry.units.model;
|
|
135
|
+
const lo = Date.parse(entry.coverage.from);
|
|
136
|
+
const hi = Date.parse(entry.coverage.to);
|
|
137
|
+
const sum = {
|
|
138
|
+
kind: 'tokens',
|
|
139
|
+
model,
|
|
140
|
+
input_tokens: 0,
|
|
141
|
+
output_tokens: 0,
|
|
142
|
+
cache_read_tokens: 0,
|
|
143
|
+
cache_write_tokens: 0,
|
|
144
|
+
};
|
|
145
|
+
let responses = 0;
|
|
146
|
+
for (const s of segments) {
|
|
147
|
+
if (s.units.kind !== 'tokens' || s.units.model !== model)
|
|
148
|
+
continue;
|
|
149
|
+
const at = Date.parse(s.at);
|
|
150
|
+
if (at < lo || at > hi)
|
|
151
|
+
continue;
|
|
152
|
+
sum.input_tokens += s.units.input_tokens;
|
|
153
|
+
sum.output_tokens += s.units.output_tokens;
|
|
154
|
+
sum.cache_read_tokens += s.units.cache_read_tokens;
|
|
155
|
+
sum.cache_write_tokens += s.units.cache_write_tokens;
|
|
156
|
+
responses += 1;
|
|
157
|
+
}
|
|
158
|
+
// No deduped record inside the window, in a transcript that *was* found. The
|
|
159
|
+
// entry's line was a non-leading content block of a response now carried by its
|
|
160
|
+
// group's first line, so this entry is a second charge for something already
|
|
161
|
+
// counted. Signalled distinctly from a read failure, because it justifies dropping
|
|
162
|
+
// the entry while a read failure justifies leaving it alone.
|
|
163
|
+
if (responses === 0)
|
|
164
|
+
return 'duplicate';
|
|
165
|
+
return { units: sum, responses };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Plan (or apply) the dedupe correction across every ledger.
|
|
169
|
+
*
|
|
170
|
+
* @param apply - false plans and writes nothing; true rewrites each changed ledger
|
|
171
|
+
* atomically via `rewriteLedger`, all-or-nothing per file (NFR-5).
|
|
172
|
+
*/
|
|
173
|
+
export async function dedupeHistory(projectRoot, config, apply, env = { projectRoot }, provenanceFiles) {
|
|
174
|
+
const report = emptyReport(apply);
|
|
175
|
+
const rates = effectiveRates(projectRoot, config);
|
|
176
|
+
const targets = [];
|
|
177
|
+
const stateDir = join(projectRoot, '.aidlc', 'state');
|
|
178
|
+
if (existsSync(stateDir)) {
|
|
179
|
+
for (const d of readdirSync(stateDir, { withFileTypes: true })) {
|
|
180
|
+
if (!d.isDirectory())
|
|
181
|
+
continue;
|
|
182
|
+
const p = ledgerPath(projectRoot, d.name);
|
|
183
|
+
if (existsSync(p))
|
|
184
|
+
targets.push(p);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const un = unattributedPath(projectRoot);
|
|
188
|
+
if (existsSync(un))
|
|
189
|
+
targets.push(un);
|
|
190
|
+
if (targets.length === 0)
|
|
191
|
+
return report;
|
|
192
|
+
const cursorFiles = provenanceFiles ?? buildCursorFileIndex(env);
|
|
193
|
+
/** Parsed segments per transcript path, shared across every entry in this run. */
|
|
194
|
+
const segmentCache = new Map();
|
|
195
|
+
for (const file of targets) {
|
|
196
|
+
const entries = readEntries(file);
|
|
197
|
+
report.microUsdBefore += weightedMicroUsd(entries, rates);
|
|
198
|
+
const kept = [];
|
|
199
|
+
let changed = false;
|
|
200
|
+
for (const e of entries) {
|
|
201
|
+
// A human placed these deliberately; a re-read must not overrule them.
|
|
202
|
+
if (e.provider === 'manual') {
|
|
203
|
+
report.manualSkipped++;
|
|
204
|
+
kept.push(e);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
// `unknown`-fidelity interval markers carry no units and no money.
|
|
208
|
+
if (e.units === null || e.units.kind !== 'tokens') {
|
|
209
|
+
kept.push(e);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
// Already counted per response — nothing to correct.
|
|
213
|
+
if (typeof e.responses === 'number') {
|
|
214
|
+
kept.push(e);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
report.scanned++;
|
|
218
|
+
const source = fileForCursor(e.cursor, cursorFiles);
|
|
219
|
+
if (source === null) {
|
|
220
|
+
report.transcriptGone.push(`${file}: cursor ${e.cursor ?? 'null'} has no unique transcript`);
|
|
221
|
+
kept.push(e);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const fixed = await rederiveUnits(e, source, env, segmentCache);
|
|
225
|
+
if (fixed === 'unreadable') {
|
|
226
|
+
report.transcriptGone.push(`${file}: could not read ${source} for ${e.cursor ?? 'null'}`);
|
|
227
|
+
kept.push(e);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (fixed === 'duplicate') {
|
|
231
|
+
/*
|
|
232
|
+
* A second charge for a response counted elsewhere — see
|
|
233
|
+
* DedupeReport.duplicates for why this is proven rather than inferred.
|
|
234
|
+
*
|
|
235
|
+
* Dropped from `kept` in **both** modes, because `kept` is what
|
|
236
|
+
* `microUsdAfter` is measured from and a plan whose projected total ignores
|
|
237
|
+
* its own largest correction is not a plan. Only `rewriteLedger` is gated on
|
|
238
|
+
* `apply`.
|
|
239
|
+
*/
|
|
240
|
+
report.duplicates++;
|
|
241
|
+
const price = priceUnits(e.units, rates);
|
|
242
|
+
if (price !== null)
|
|
243
|
+
report.duplicateMicroUsd += price;
|
|
244
|
+
changed = true;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (sameTokens(e.units, fixed.units)) {
|
|
248
|
+
// Re-read and identical: the entry was never a duplicate. It still gains a
|
|
249
|
+
// response count, which is new information and costs nothing.
|
|
250
|
+
report.unchanged++;
|
|
251
|
+
kept.push({ ...e, responses: fixed.responses });
|
|
252
|
+
changed = true;
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
/*
|
|
256
|
+
* `reconciled` is how this schema already says "corrected after the fact",
|
|
257
|
+
* and `applyPrecedence` already ranks it above `metered`. So a reader of an
|
|
258
|
+
* older retrospective can tell a moved figure from a historical one without a
|
|
259
|
+
* new field, and no new fidelity value is minted (AC-11).
|
|
260
|
+
*/
|
|
261
|
+
kept.push({ ...e, units: fixed.units, responses: fixed.responses, fidelity: 'reconciled' });
|
|
262
|
+
report.rederived++;
|
|
263
|
+
changed = true;
|
|
264
|
+
}
|
|
265
|
+
report.microUsdAfter += weightedMicroUsd(kept, rates);
|
|
266
|
+
if (changed) {
|
|
267
|
+
report.files.push(file);
|
|
268
|
+
// Atomic per file: an interrupted run leaves the original intact (NFR-5).
|
|
269
|
+
if (apply)
|
|
270
|
+
rewriteLedger(file, kept);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return report;
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=dedupe-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-history.js","sourceRoot":"","sources":["../../src/cost/dedupe-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/cost/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/cost/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;AAuDrE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA8C3D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CAkC3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAU5E;AAED,mCAAmC;AACnC,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAerF;AAiDD,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,CA8CrE;AAED,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CAC/C;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,WAAW,CAsBjE"}
|
package/dist/cost/ledger.js
CHANGED
|
@@ -20,8 +20,10 @@ const PHASE_RE = /^[a-z][a-z0-9-]{0,31}$/;
|
|
|
20
20
|
const CURSOR_RE = /^[A-Za-z0-9_.:/@-]{1,256}$/;
|
|
21
21
|
const ENTRY_KEYS = new Set([
|
|
22
22
|
'timestamp', 'session_id', 'phase', 'provider', 'fidelity', 'coverage', 'cursor', 'units',
|
|
23
|
-
'active_ms',
|
|
23
|
+
'active_ms', 'responses',
|
|
24
24
|
]);
|
|
25
|
+
/** Entry keys that may be absent, because entries predating them must stay valid. */
|
|
26
|
+
const OPTIONAL_ENTRY_KEYS = new Set(['active_ms', 'responses']);
|
|
25
27
|
const TOKEN_KEYS = new Set([
|
|
26
28
|
'kind', 'model', 'input_tokens', 'output_tokens', 'cache_read_tokens', 'cache_write_tokens',
|
|
27
29
|
]);
|
|
@@ -77,10 +79,11 @@ export function validateEntry(entry) {
|
|
|
77
79
|
if (!keysWithin(e, ENTRY_KEYS))
|
|
78
80
|
return 'unknown key in entry';
|
|
79
81
|
for (const k of ENTRY_KEYS) {
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
// "not measured", never
|
|
83
|
-
|
|
82
|
+
// Optional keys were each added after entries already existed, and those
|
|
83
|
+
// entries must stay valid — `active_ms` from turn-scoped-cost/AC-24,
|
|
84
|
+
// `responses` from context-budget/AC-7. Absent reads as "not measured", never
|
|
85
|
+
// as zero.
|
|
86
|
+
if (OPTIONAL_ENTRY_KEYS.has(k))
|
|
84
87
|
continue;
|
|
85
88
|
if (!(k in e))
|
|
86
89
|
return `missing key ${k}`;
|
|
@@ -88,6 +91,9 @@ export function validateEntry(entry) {
|
|
|
88
91
|
if ('active_ms' in e && e.active_ms !== null && !isCount(e.active_ms)) {
|
|
89
92
|
return 'invalid active_ms';
|
|
90
93
|
}
|
|
94
|
+
if ('responses' in e && e.responses !== null && !isCount(e.responses)) {
|
|
95
|
+
return 'invalid responses';
|
|
96
|
+
}
|
|
91
97
|
if (!isIso8601(e.timestamp))
|
|
92
98
|
return 'invalid timestamp';
|
|
93
99
|
if (e.session_id !== null && (typeof e.session_id !== 'string' || !SESSION_ID_RE.test(e.session_id))) {
|
package/dist/cost/ledger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/cost/ledger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/cost/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,19 @@
|
|
|
11
11
|
* (e.g. /branch copied the file), extraction falls back to the beginning
|
|
12
12
|
* and the recorder's coverage dedup prevents double counting.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* **One API response spans several lines.** Claude Code writes one line per
|
|
15
|
+
* content block and repeats the response's `usage` object on every one, so
|
|
16
|
+
* counting per line counts one charge many times over. Segments are therefore
|
|
17
|
+
* grouped by `message.id`, and the repeats are *collapsed* rather than summed —
|
|
18
|
+
* see `extract` for the measurement that settles which of the two is correct.
|
|
19
|
+
*
|
|
20
|
+
* The other two providers were checked, not assumed: `codex.ts` emits one segment
|
|
21
|
+
* per `token_count` event and its own docblock records that no record carries an
|
|
22
|
+
* id at all, while `kiro.ts` emits one per `usage_summary` turn summary. Neither
|
|
23
|
+
* writes per content block, so neither carries this defect and neither needs the
|
|
24
|
+
* grouping.
|
|
25
|
+
*
|
|
26
|
+
* Design: design.md §3; context-budget design Part 1
|
|
15
27
|
*/
|
|
16
28
|
import { isWithin } from '../../core/paths.js';
|
|
17
29
|
import type { CostProvider, ProviderEnv } from './provider.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/cost/providers/claude-code.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/cost/providers/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE/D,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAIvD;AAMD;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,eAAO,MAAM,kBAAkB,EAAE,YA+NhC,CAAC"}
|
|
@@ -11,7 +11,19 @@
|
|
|
11
11
|
* (e.g. /branch copied the file), extraction falls back to the beginning
|
|
12
12
|
* and the recorder's coverage dedup prevents double counting.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* **One API response spans several lines.** Claude Code writes one line per
|
|
15
|
+
* content block and repeats the response's `usage` object on every one, so
|
|
16
|
+
* counting per line counts one charge many times over. Segments are therefore
|
|
17
|
+
* grouped by `message.id`, and the repeats are *collapsed* rather than summed —
|
|
18
|
+
* see `extract` for the measurement that settles which of the two is correct.
|
|
19
|
+
*
|
|
20
|
+
* The other two providers were checked, not assumed: `codex.ts` emits one segment
|
|
21
|
+
* per `token_count` event and its own docblock records that no record carries an
|
|
22
|
+
* id at all, while `kiro.ts` emits one per `usage_summary` turn summary. Neither
|
|
23
|
+
* writes per content block, so neither carries this defect and neither needs the
|
|
24
|
+
* grouping.
|
|
25
|
+
*
|
|
26
|
+
* Design: design.md §3; context-budget design Part 1
|
|
15
27
|
*/
|
|
16
28
|
import { createReadStream, existsSync, realpathSync } from 'node:fs';
|
|
17
29
|
import { createInterface } from 'node:readline';
|
|
@@ -95,6 +107,45 @@ export const claudeCodeProvider = {
|
|
|
95
107
|
// everything; the recorder's coverage dedup handles the overlap.
|
|
96
108
|
let skipping = since !== null;
|
|
97
109
|
const all = [];
|
|
110
|
+
/*
|
|
111
|
+
* Response identity → index of its segment, one map per list.
|
|
112
|
+
*
|
|
113
|
+
* Two maps because the two lists have independent lifetimes: `all` is
|
|
114
|
+
* discarded wholesale the moment the cursor is found, so an index into it
|
|
115
|
+
* would then point into an empty array. Its map is cleared at the same
|
|
116
|
+
* moment for that reason.
|
|
117
|
+
*/
|
|
118
|
+
const groupsAfter = new Map();
|
|
119
|
+
const groupsBefore = new Map();
|
|
120
|
+
/*
|
|
121
|
+
* Responses that were already charged by a previous capture.
|
|
122
|
+
*
|
|
123
|
+
* A capture can fire while a response's lines are still being written, leaving
|
|
124
|
+
* the cursor in the *middle* of a group. On the next pass the group's tail sits
|
|
125
|
+
* after the cursor and looks like a fresh response — so grouping alone charges
|
|
126
|
+
* it a second time, one capture later, which is the failure a naive dedupe
|
|
127
|
+
* produces rather than removes.
|
|
128
|
+
*
|
|
129
|
+
* Populated from the keys seen before the cursor, which are by definition
|
|
130
|
+
* already counted. The indices those keys pointed at are dropped with `all`;
|
|
131
|
+
* only the identities survive.
|
|
132
|
+
*/
|
|
133
|
+
let chargedBefore = null;
|
|
134
|
+
/*
|
|
135
|
+
* The last usage-bearing uuid in the file, assigned to the final segment
|
|
136
|
+
* before returning.
|
|
137
|
+
*
|
|
138
|
+
* `recorder.ts` takes `segments[segments.length - 1].cursor` and writes it
|
|
139
|
+
* onto every bucket it appends, so this one value decides where the next
|
|
140
|
+
* capture resumes. Array order already gives the right answer while response
|
|
141
|
+
* groups stay contiguous — measured on this repo, 0 of 9,358 groups had
|
|
142
|
+
* another response's line interleaved — but the entry format is internal to
|
|
143
|
+
* Claude Code and documented above as liable to change. If contiguity ever
|
|
144
|
+
* breaks, inferring the cursor from array order sends it *backwards* and
|
|
145
|
+
* re-charges a span of the transcript. Assigning it explicitly costs one
|
|
146
|
+
* variable and removes the class.
|
|
147
|
+
*/
|
|
148
|
+
let lastUsageUuid = null;
|
|
98
149
|
/*
|
|
99
150
|
* uuid → timestamp, for resolving each record's parent so a span can be
|
|
100
151
|
* measured (turn-scoped-cost/AC-19).
|
|
@@ -142,25 +193,76 @@ export const claudeCodeProvider = {
|
|
|
142
193
|
const span = parentAt !== undefined && Date.parse(parentAt) <= Date.parse(at)
|
|
143
194
|
? { from: parentAt, to: at }
|
|
144
195
|
: null;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
196
|
+
/*
|
|
197
|
+
* One key per API response. `message.id` when the line carries one,
|
|
198
|
+
* otherwise the line's own uuid — prefixed so a uuid fallback can never
|
|
199
|
+
* collide with a real message id.
|
|
200
|
+
*
|
|
201
|
+
* Absent identity means "cannot be deduped", never "drop it": such a line
|
|
202
|
+
* gets its own segment and behaves exactly as every line did before this
|
|
203
|
+
* grouping existed. Measured here as unreachable — 0 of 17,292
|
|
204
|
+
* usage-bearing lines lacked an id — so it is a guard against format
|
|
205
|
+
* change, not a live path.
|
|
206
|
+
*/
|
|
207
|
+
const messageId = typeof message?.id === 'string' && message.id !== '' ? message.id : null;
|
|
208
|
+
const key = messageId !== null ? `id:${messageId}` : `uuid:${uuid}`;
|
|
209
|
+
// Already charged before the cursor: this is a trailing content block of a
|
|
210
|
+
// response a previous capture counted. Contributes nothing at all — not even
|
|
211
|
+
// a new segment — but still advances the resume point past itself.
|
|
212
|
+
if (!skipping && chargedBefore !== null && chargedBefore.has(key)) {
|
|
213
|
+
lastUsageUuid = uuid;
|
|
214
|
+
if (uuid !== null && typeof entry.timestamp === 'string')
|
|
215
|
+
stamps.set(uuid, entry.timestamp);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const list = skipping ? all : segments;
|
|
219
|
+
const groups = skipping ? groupsBefore : groupsAfter;
|
|
220
|
+
const seen = groups.get(key);
|
|
221
|
+
if (seen !== undefined) {
|
|
222
|
+
/*
|
|
223
|
+
* Another content block of a response already counted. Collapse: take
|
|
224
|
+
* nothing from this line but its uuid.
|
|
225
|
+
*
|
|
226
|
+
* Collapsing rather than summing is a measurement, not a preference.
|
|
227
|
+
* Across this repo's 53 transcripts there were 7,935 repeat lines and
|
|
228
|
+
* *zero* whose usage object differed from the first — the repeats are
|
|
229
|
+
* duplication, not incremental updates. Summing them reproduces the
|
|
230
|
+
* exact 1.848x over-count this grouping exists to remove.
|
|
231
|
+
*
|
|
232
|
+
* The cursor advances to this line so resuming skips the whole group.
|
|
233
|
+
* Keeping the first line's uuid would leave the rest to be re-emitted
|
|
234
|
+
* as a fresh group on the next capture, reintroducing the duplicate one
|
|
235
|
+
* capture later.
|
|
236
|
+
*/
|
|
237
|
+
list[seen].cursor = uuid;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
groups.set(key, list.length);
|
|
241
|
+
list.push({ at, units, cursor: uuid, span });
|
|
242
|
+
}
|
|
243
|
+
lastUsageUuid = uuid;
|
|
150
244
|
}
|
|
151
245
|
if (uuid !== null && typeof entry.timestamp === 'string') {
|
|
152
246
|
stamps.set(uuid, entry.timestamp);
|
|
153
247
|
}
|
|
154
248
|
if (skipping && uuid === since) {
|
|
155
|
-
// Found the cursor: everything collected so far precedes it — drop it
|
|
249
|
+
// Found the cursor: everything collected so far precedes it — drop it, and
|
|
250
|
+
// drop the indices that pointed into it. The response *identities* are kept,
|
|
251
|
+
// because a group straddling the cursor must not be charged twice.
|
|
156
252
|
skipping = false;
|
|
253
|
+
chargedBefore = new Set(groupsBefore.keys());
|
|
157
254
|
all.length = 0;
|
|
255
|
+
groupsBefore.clear();
|
|
158
256
|
}
|
|
159
257
|
}
|
|
160
258
|
// Cursor never found: fall back to emitting everything (recorder dedups).
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
259
|
+
const out = skipping ? all : segments;
|
|
260
|
+
// The final segment carries the resume point for the whole pass — see
|
|
261
|
+
// lastUsageUuid above for why this is assigned rather than inferred.
|
|
262
|
+
if (out.length > 0 && lastUsageUuid !== null) {
|
|
263
|
+
out[out.length - 1].cursor = lastUsageUuid;
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
164
266
|
},
|
|
165
267
|
};
|
|
166
268
|
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cost/providers/claude-code.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cost/providers/claude-code.ts"],"names":[],"mappings":"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"}
|
package/dist/cost/rates.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Design: design.md §4.5, D3
|
|
11
11
|
*/
|
|
12
|
-
import type { RateEntry, RateSnapshot, CostConfig, CostUnits } from './types.js';
|
|
12
|
+
import type { RateEntry, RateSnapshot, CostConfig, CostUnits, TokenUnits } from './types.js';
|
|
13
13
|
/** Normalization rule: applied in order; printed by `rates show --normalization`. */
|
|
14
14
|
export declare const NORMALIZATION_RULES: Array<{
|
|
15
15
|
kind: 'prefix' | 'suffix';
|
|
@@ -32,6 +32,21 @@ export interface EffectiveRates {
|
|
|
32
32
|
export declare function effectiveRates(projectRoot: string, config: CostConfig | null): EffectiveRates;
|
|
33
33
|
/** Cost of usage units in integer micro-dollars; null = unpriced. */
|
|
34
34
|
export declare function priceUnits(units: CostUnits, rates: EffectiveRates): number | null;
|
|
35
|
+
/**
|
|
36
|
+
* The cache-read component of a token bill, in micro-USD.
|
|
37
|
+
*
|
|
38
|
+
* Split out so the report can say what share of the total is re-reading the
|
|
39
|
+
* conversation rather than producing anything — measured at 59.6% on this
|
|
40
|
+
* project's ledger, which is the finding the whole context budget rests on.
|
|
41
|
+
*
|
|
42
|
+
* Returns 0 when the model or its cache-read rate is unknown, rather than null:
|
|
43
|
+
* this is a *share* of a total that `priceUnits` has already declared priceable,
|
|
44
|
+
* so an unknown component is absent from the numerator, and the alternative —
|
|
45
|
+
* propagating null — would blank the share for a whole instance because one
|
|
46
|
+
* model in it lacked a rate. Under-reporting the share is the safe direction and
|
|
47
|
+
* matches the shape `priceUnits` uses for a missing rate class with zero tokens.
|
|
48
|
+
*/
|
|
49
|
+
export declare function priceCacheRead(units: TokenUnits, rates: EffectiveRates): number;
|
|
35
50
|
export declare function microToUsd(micro: number): string;
|
|
36
51
|
/**
|
|
37
52
|
* Fetch the LiteLLM pricing JSON and cache the models we know how to price.
|