claude-code-infinite 1.0.11 → 1.0.16
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/README.md +214 -47
- package/dist/cc-request.d.ts +94 -0
- package/dist/cc-request.d.ts.map +1 -0
- package/dist/cc-request.js +194 -0
- package/dist/cc-request.js.map +1 -0
- package/dist/claude-env.d.ts +30 -0
- package/dist/claude-env.d.ts.map +1 -0
- package/dist/claude-env.js +55 -0
- package/dist/claude-env.js.map +1 -0
- package/dist/cli-args.d.ts +32 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +72 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-lifecycle.d.ts +17 -0
- package/dist/cli-lifecycle.d.ts.map +1 -0
- package/dist/cli-lifecycle.js +30 -0
- package/dist/cli-lifecycle.js.map +1 -0
- package/dist/cli-main.d.ts +15 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +464 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.js +13 -178
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -3
- package/dist/config.js.map +1 -1
- package/dist/count-tokens.d.ts +78 -0
- package/dist/count-tokens.d.ts.map +1 -0
- package/dist/count-tokens.js +277 -0
- package/dist/count-tokens.js.map +1 -0
- package/dist/final-index.d.ts +10 -0
- package/dist/final-index.d.ts.map +1 -0
- package/dist/final-index.js +37 -0
- package/dist/final-index.js.map +1 -0
- package/dist/hooks.d.ts +239 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +618 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/memtree-fetch.d.ts +24 -0
- package/dist/memtree-fetch.d.ts.map +1 -0
- package/dist/memtree-fetch.js +121 -0
- package/dist/memtree-fetch.js.map +1 -0
- package/dist/memtree-finder.d.ts +99 -0
- package/dist/memtree-finder.d.ts.map +1 -0
- package/dist/memtree-finder.js +235 -0
- package/dist/memtree-finder.js.map +1 -0
- package/dist/memtree-links.d.ts +16 -0
- package/dist/memtree-links.d.ts.map +1 -0
- package/dist/memtree-links.js +66 -0
- package/dist/memtree-links.js.map +1 -0
- package/dist/memtree-mcp-config.d.ts +28 -0
- package/dist/memtree-mcp-config.d.ts.map +1 -0
- package/dist/memtree-mcp-config.js +121 -0
- package/dist/memtree-mcp-config.js.map +1 -0
- package/dist/memtree-mcp.d.ts +265 -0
- package/dist/memtree-mcp.d.ts.map +1 -0
- package/dist/memtree-mcp.js +667 -0
- package/dist/memtree-mcp.js.map +1 -0
- package/dist/memtree-newest.d.ts +74 -0
- package/dist/memtree-newest.d.ts.map +1 -0
- package/dist/memtree-newest.js +217 -0
- package/dist/memtree-newest.js.map +1 -0
- package/dist/memtree-tools.d.ts +105 -0
- package/dist/memtree-tools.d.ts.map +1 -0
- package/dist/memtree-tools.js +408 -0
- package/dist/memtree-tools.js.map +1 -0
- package/dist/memtree.d.ts +430 -0
- package/dist/memtree.d.ts.map +1 -0
- package/dist/memtree.js +1286 -0
- package/dist/memtree.js.map +1 -0
- package/dist/notices.d.ts +177 -0
- package/dist/notices.d.ts.map +1 -0
- package/dist/notices.js +469 -0
- package/dist/notices.js.map +1 -0
- package/dist/payment-gate.d.ts +53 -0
- package/dist/payment-gate.d.ts.map +1 -0
- package/dist/payment-gate.js +97 -0
- package/dist/payment-gate.js.map +1 -0
- package/dist/project-meta.d.ts +15 -0
- package/dist/project-meta.d.ts.map +1 -0
- package/dist/project-meta.js +80 -0
- package/dist/project-meta.js.map +1 -0
- package/dist/prompt-accounting.d.ts +12 -0
- package/dist/prompt-accounting.d.ts.map +1 -0
- package/dist/prompt-accounting.js +70 -0
- package/dist/prompt-accounting.js.map +1 -0
- package/dist/proxy.d.ts +204 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +4299 -0
- package/dist/proxy.js.map +1 -0
- package/dist/reqlog.d.ts +427 -0
- package/dist/reqlog.d.ts.map +1 -0
- package/dist/reqlog.js +146 -0
- package/dist/reqlog.js.map +1 -0
- package/dist/request-sizing.d.ts +74 -0
- package/dist/request-sizing.d.ts.map +1 -0
- package/dist/request-sizing.js +121 -0
- package/dist/request-sizing.js.map +1 -0
- package/dist/resume-repair-file.d.ts +17 -0
- package/dist/resume-repair-file.d.ts.map +1 -0
- package/dist/resume-repair-file.js +100 -0
- package/dist/resume-repair-file.js.map +1 -0
- package/dist/resume-repair.d.ts +27 -0
- package/dist/resume-repair.d.ts.map +1 -0
- package/dist/resume-repair.js +198 -0
- package/dist/resume-repair.js.map +1 -0
- package/dist/route-cache.d.ts +5 -0
- package/dist/route-cache.d.ts.map +1 -0
- package/dist/route-cache.js +63 -0
- package/dist/route-cache.js.map +1 -0
- package/dist/route-fallback.d.ts +67 -0
- package/dist/route-fallback.d.ts.map +1 -0
- package/dist/route-fallback.js +126 -0
- package/dist/route-fallback.js.map +1 -0
- package/dist/route-identity.d.ts +6 -0
- package/dist/route-identity.d.ts.map +1 -0
- package/dist/route-identity.js +100 -0
- package/dist/route-identity.js.map +1 -0
- package/dist/transcript-usage.d.ts +57 -0
- package/dist/transcript-usage.d.ts.map +1 -0
- package/dist/transcript-usage.js +570 -0
- package/dist/transcript-usage.js.map +1 -0
- package/dist/turns.d.ts +77 -0
- package/dist/turns.d.ts.map +1 -0
- package/dist/turns.js +330 -0
- package/dist/turns.js.map +1 -0
- package/dist/update-check.d.ts +38 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +67 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-response token usage, read from Claude Code's own session transcript,
|
|
3
|
+
* for the MemTree page to show how much of each response was thinking.
|
|
4
|
+
*
|
|
5
|
+
* Anthropic reports thinking only as a number on the response
|
|
6
|
+
* (`usage.output_tokens_details.thinking_tokens`): the thinking text is mostly
|
|
7
|
+
* omitted, and ccc strips thinking blocks before MemTree sees the history
|
|
8
|
+
* anyway. Conversation history carries no usage and no message ids, so the
|
|
9
|
+
* proxy cannot attach it on its own. Claude Code's transcript
|
|
10
|
+
* (`~/.claude/projects/<project>/<session id>.jsonl`) records every
|
|
11
|
+
* response's usage next to its content, and survives restarts and resumes, so
|
|
12
|
+
* it is the source: each response is matched to the assistant message it
|
|
13
|
+
* became by its tool-call ids, or by a hash of its text when it made none.
|
|
14
|
+
*
|
|
15
|
+
* The same transcript stamps every entry with the time Claude Code wrote it,
|
|
16
|
+
* so it is also the source of each message's time (`timesFor`): an assistant
|
|
17
|
+
* message takes its response's last entry, a user message the latest entry
|
|
18
|
+
* among its tool results (by tool-call id) and typed text (by a hash of the
|
|
19
|
+
* text without `<system-reminder>` blocks). Text can repeat ("yes", "Done."),
|
|
20
|
+
* so a text match consumes the next unused entry at or after the previous message's.
|
|
21
|
+
* A subagent's messages come from its own transcript,
|
|
22
|
+
* `<session id>/subagents/agent-<agent id>.jsonl` next to the main one. MemTree records these per input
|
|
23
|
+
* block, to tell which conversation and block is most recent.
|
|
24
|
+
*
|
|
25
|
+
* Every failure (no transcript, unreadable line, unknown shape) yields no
|
|
26
|
+
* usage and no times; the MemTree call goes out unchanged.
|
|
27
|
+
*/
|
|
28
|
+
import { createHash } from "node:crypto";
|
|
29
|
+
import fs from "node:fs";
|
|
30
|
+
import { setImmediate as yieldTurn } from "node:timers/promises";
|
|
31
|
+
import os from "node:os";
|
|
32
|
+
import path from "node:path";
|
|
33
|
+
/** Session and agent ids name files: no path separators or dots. */
|
|
34
|
+
const SAFE_ID = /^[A-Za-z0-9-]+$/;
|
|
35
|
+
/** Transcript bytes read per refresh; later calls pick up the rest. */
|
|
36
|
+
const MAX_READ_BYTES = 1024 * 1024;
|
|
37
|
+
/**
|
|
38
|
+
* The most catchUp reads in one go. Far above any session seen (10 MB); the
|
|
39
|
+
* cap only bounds a pathological file, which then finishes on later lookups.
|
|
40
|
+
*/
|
|
41
|
+
const MAX_CATCH_UP_BYTES = 256 * 1024 * 1024;
|
|
42
|
+
/** Oversized JSONL entries are optional metadata; discard them without accumulating. */
|
|
43
|
+
const MAX_LINE_BYTES = 1024 * 1024;
|
|
44
|
+
/**
|
|
45
|
+
* Reads transcripts incrementally: each session's file is opened once and
|
|
46
|
+
* only the bytes appended since the last call are parsed.
|
|
47
|
+
*/
|
|
48
|
+
export class ClaudeTranscriptUsage {
|
|
49
|
+
projectsDir;
|
|
50
|
+
sessions = new Map();
|
|
51
|
+
constructor(projectsDir = defaultProjectsDir()) {
|
|
52
|
+
this.projectsDir = projectsDir;
|
|
53
|
+
}
|
|
54
|
+
usageFor(sessionId, messages, agentId) {
|
|
55
|
+
try {
|
|
56
|
+
const index = this.indexFor(sessionId, agentId);
|
|
57
|
+
if (!index)
|
|
58
|
+
return {};
|
|
59
|
+
index.refresh();
|
|
60
|
+
return index.match(messages);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Reads a session's transcript to its end now, off the request path. A
|
|
68
|
+
* lookup reads one bounded chunk, so without this the first requests after
|
|
69
|
+
* resuming a long session see only its oldest responses and undercount the
|
|
70
|
+
* thinking MemTree's budget check relies on. Best effort: never throws.
|
|
71
|
+
*/
|
|
72
|
+
catchUp(sessionId) {
|
|
73
|
+
try {
|
|
74
|
+
const index = this.indexFor(sessionId);
|
|
75
|
+
let read = 0;
|
|
76
|
+
while (index && read < MAX_CATCH_UP_BYTES) {
|
|
77
|
+
const bytes = index.refresh();
|
|
78
|
+
if (bytes === 0)
|
|
79
|
+
break;
|
|
80
|
+
read += bytes;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Lookups still read incrementally.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
timesFor(sessionId, messages, agentId) {
|
|
88
|
+
try {
|
|
89
|
+
const index = this.indexFor(sessionId, agentId);
|
|
90
|
+
if (!index)
|
|
91
|
+
return {};
|
|
92
|
+
index.refresh();
|
|
93
|
+
return index.matchTimes(messages);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return {};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
finalReply(sessionId) {
|
|
100
|
+
try {
|
|
101
|
+
const index = this.indexFor(sessionId);
|
|
102
|
+
if (!index)
|
|
103
|
+
return undefined;
|
|
104
|
+
let read = 0;
|
|
105
|
+
while (read < MAX_CATCH_UP_BYTES) {
|
|
106
|
+
const bytes = index.refresh();
|
|
107
|
+
if (bytes === 0)
|
|
108
|
+
break;
|
|
109
|
+
read += bytes;
|
|
110
|
+
}
|
|
111
|
+
return index.finalReply();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async finalReplyAsync(sessionId, signal) {
|
|
118
|
+
await yieldTurn(undefined, { signal });
|
|
119
|
+
try {
|
|
120
|
+
const index = this.indexFor(sessionId);
|
|
121
|
+
if (!index)
|
|
122
|
+
return undefined;
|
|
123
|
+
let read = 0;
|
|
124
|
+
while (read < MAX_CATCH_UP_BYTES) {
|
|
125
|
+
await yieldTurn(undefined, { signal });
|
|
126
|
+
const bytes = index.refresh();
|
|
127
|
+
if (bytes === 0)
|
|
128
|
+
return index.finalReply();
|
|
129
|
+
read += bytes;
|
|
130
|
+
}
|
|
131
|
+
// A partial transcript cannot establish the latest turn's answer.
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
signal?.throwIfAborted();
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
indexFor(sessionId, agentId) {
|
|
140
|
+
if (!SAFE_ID.test(sessionId))
|
|
141
|
+
return undefined;
|
|
142
|
+
if (agentId !== undefined && !SAFE_ID.test(agentId))
|
|
143
|
+
return undefined;
|
|
144
|
+
const key = agentId === undefined ? sessionId : `${sessionId}/${agentId}`;
|
|
145
|
+
const known = this.sessions.get(key);
|
|
146
|
+
if (known)
|
|
147
|
+
return known;
|
|
148
|
+
const file = findTranscript(this.projectsDir, sessionId, agentId);
|
|
149
|
+
if (!file)
|
|
150
|
+
return undefined;
|
|
151
|
+
const index = new TranscriptIndex(file);
|
|
152
|
+
this.sessions.set(key, index);
|
|
153
|
+
return index;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** `$CLAUDE_CONFIG_DIR/projects`, else `~/.claude/projects`. */
|
|
157
|
+
export function defaultProjectsDir(env = process.env) {
|
|
158
|
+
const base = env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude");
|
|
159
|
+
return path.join(base, "projects");
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* The session's transcript in whichever project directory holds it, or with
|
|
163
|
+
* `agentId`, that subagent's. The id is accepted with or without its `agent-`
|
|
164
|
+
* file prefix.
|
|
165
|
+
*/
|
|
166
|
+
export function findTranscript(projectsDir, sessionId, agentId) {
|
|
167
|
+
const name = agentId === undefined
|
|
168
|
+
? `${sessionId}.jsonl`
|
|
169
|
+
: path.join(sessionId, "subagents", `agent-${agentId.replace(/^agent-/, "")}.jsonl`);
|
|
170
|
+
let projects;
|
|
171
|
+
try {
|
|
172
|
+
projects = fs.readdirSync(projectsDir);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
for (const project of projects) {
|
|
178
|
+
const file = path.join(projectsDir, project, name);
|
|
179
|
+
if (fs.existsSync(file))
|
|
180
|
+
return file;
|
|
181
|
+
}
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
class TranscriptIndex {
|
|
185
|
+
file;
|
|
186
|
+
offset = 0;
|
|
187
|
+
partial = Buffer.alloc(0);
|
|
188
|
+
/** Skip to newline after an oversized line or a complete EOF record already ingested. */
|
|
189
|
+
discardingOversizedLine = false;
|
|
190
|
+
/** Response message id → its usage (the largest seen: entries repeat it). */
|
|
191
|
+
usageById = new Map();
|
|
192
|
+
idByToolUse = new Map();
|
|
193
|
+
/** Response id → its text so far (one transcript entry per content block). */
|
|
194
|
+
textById = new Map();
|
|
195
|
+
/** Response id → its latest entry's time (thinking starts, last block lands). */
|
|
196
|
+
timeById = new Map();
|
|
197
|
+
/** tool_use_id → when its result was written. */
|
|
198
|
+
timeByToolResult = new Map();
|
|
199
|
+
/** Hash of typed user text (reminders removed) → every time it was written. */
|
|
200
|
+
timesByUserText = new Map();
|
|
201
|
+
/** Hash of a response's text → every response id with that text, in order. */
|
|
202
|
+
idsByText = new Map();
|
|
203
|
+
/** The newest response's id, and every response that called a tool. */
|
|
204
|
+
lastResponseId;
|
|
205
|
+
toolCallingIds = new Set();
|
|
206
|
+
constructor(file) {
|
|
207
|
+
this.file = file;
|
|
208
|
+
}
|
|
209
|
+
/** The newest response as a text-only assistant message, unless it called a tool. */
|
|
210
|
+
finalReply() {
|
|
211
|
+
const id = this.lastResponseId;
|
|
212
|
+
if (id === undefined || this.toolCallingIds.has(id))
|
|
213
|
+
return undefined;
|
|
214
|
+
const text = this.textById.get(id);
|
|
215
|
+
return text && text.trim() ? { role: "assistant", content: [{ type: "text", text }] } : undefined;
|
|
216
|
+
}
|
|
217
|
+
/** Reads the next bounded chunk; returns the bytes read (0 at the end). */
|
|
218
|
+
refresh() {
|
|
219
|
+
const size = fs.statSync(this.file).size;
|
|
220
|
+
if (size < this.offset)
|
|
221
|
+
this.reset(); // rewritten transcript
|
|
222
|
+
if (size === this.offset)
|
|
223
|
+
return 0;
|
|
224
|
+
const length = Math.min(size - this.offset, MAX_READ_BYTES);
|
|
225
|
+
const buffer = Buffer.alloc(length);
|
|
226
|
+
const fd = fs.openSync(this.file, "r");
|
|
227
|
+
let bytesRead;
|
|
228
|
+
try {
|
|
229
|
+
bytesRead = fs.readSync(fd, buffer, 0, length, this.offset);
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
fs.closeSync(fd);
|
|
233
|
+
}
|
|
234
|
+
this.offset += bytesRead;
|
|
235
|
+
// One bounded read per refresh, even while discarding: a corrupt line must
|
|
236
|
+
// never turn optional metadata lookup into a synchronous scan to EOF.
|
|
237
|
+
let bytes = buffer.subarray(0, bytesRead);
|
|
238
|
+
if (this.discardingOversizedLine) {
|
|
239
|
+
const newline = bytes.indexOf(10);
|
|
240
|
+
if (newline < 0)
|
|
241
|
+
return bytesRead;
|
|
242
|
+
bytes = bytes.subarray(newline + 1);
|
|
243
|
+
this.discardingOversizedLine = false;
|
|
244
|
+
}
|
|
245
|
+
// Keep bytes intact until a whole line is available, including UTF-8
|
|
246
|
+
// characters split across reads. Both operands are independently bounded.
|
|
247
|
+
const lines = this.partial.length ? Buffer.concat([this.partial, bytes]) : bytes;
|
|
248
|
+
this.partial = Buffer.alloc(0);
|
|
249
|
+
let start = 0;
|
|
250
|
+
let newline;
|
|
251
|
+
while ((newline = lines.indexOf(10, start)) >= 0) {
|
|
252
|
+
if (newline - start <= MAX_LINE_BYTES) {
|
|
253
|
+
this.ingest(lines.toString("utf-8", start, newline));
|
|
254
|
+
}
|
|
255
|
+
start = newline + 1;
|
|
256
|
+
}
|
|
257
|
+
const remaining = lines.length - start;
|
|
258
|
+
if (remaining > MAX_LINE_BYTES) {
|
|
259
|
+
this.discardingOversizedLine = true;
|
|
260
|
+
}
|
|
261
|
+
else if (remaining) {
|
|
262
|
+
// Copy only the tail, rather than retaining the whole read buffer.
|
|
263
|
+
this.partial = Buffer.from(lines.subarray(start));
|
|
264
|
+
if (this.offset === size)
|
|
265
|
+
this.ingestCompleteEof();
|
|
266
|
+
}
|
|
267
|
+
return bytesRead;
|
|
268
|
+
}
|
|
269
|
+
ingestCompleteEof() {
|
|
270
|
+
const line = this.partial.toString("utf-8");
|
|
271
|
+
try {
|
|
272
|
+
JSON.parse(line);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return; // A writer may still be appending this JSON record.
|
|
276
|
+
}
|
|
277
|
+
this.ingest(line);
|
|
278
|
+
this.partial = Buffer.alloc(0);
|
|
279
|
+
// A later newline terminates this same record; don't ingest it twice.
|
|
280
|
+
this.discardingOversizedLine = true;
|
|
281
|
+
}
|
|
282
|
+
match(messages) {
|
|
283
|
+
const out = {};
|
|
284
|
+
// Reserve identities before matching any text, including identities in
|
|
285
|
+
// ambiguous messages. Input order must not let a text-only reply steal a
|
|
286
|
+
// response that another message identifies by its tool calls.
|
|
287
|
+
const claims = new Map();
|
|
288
|
+
const textCounts = new Map();
|
|
289
|
+
const matches = messages.map((message) => {
|
|
290
|
+
if (message?.role !== "assistant")
|
|
291
|
+
return undefined;
|
|
292
|
+
const ids = new Set();
|
|
293
|
+
let hasTools = false;
|
|
294
|
+
let unknownTool = false;
|
|
295
|
+
for (const part of Array.isArray(message.content) ? message.content : []) {
|
|
296
|
+
if (part?.type !== "tool_use")
|
|
297
|
+
continue;
|
|
298
|
+
hasTools = true;
|
|
299
|
+
const id = typeof part.id === "string" ? this.idByToolUse.get(part.id) : undefined;
|
|
300
|
+
if (id)
|
|
301
|
+
ids.add(id);
|
|
302
|
+
else
|
|
303
|
+
unknownTool = true;
|
|
304
|
+
}
|
|
305
|
+
for (const id of ids)
|
|
306
|
+
claims.set(id, (claims.get(id) ?? 0) + 1);
|
|
307
|
+
const text = messageText(message).trim();
|
|
308
|
+
if (!hasTools && text)
|
|
309
|
+
textCounts.set(text, (textCounts.get(text) ?? 0) + 1);
|
|
310
|
+
return { ids, hasTools, unknownTool, text };
|
|
311
|
+
});
|
|
312
|
+
matches.forEach((match, index) => {
|
|
313
|
+
if (!match)
|
|
314
|
+
return;
|
|
315
|
+
let id;
|
|
316
|
+
if (match.hasTools) {
|
|
317
|
+
if (match.unknownTool || match.ids.size !== 1)
|
|
318
|
+
return;
|
|
319
|
+
const candidate = match.ids.values().next().value;
|
|
320
|
+
if (claims.get(candidate) !== 1)
|
|
321
|
+
return;
|
|
322
|
+
id = candidate;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
if (!match.text || textCounts.get(match.text) !== 1)
|
|
326
|
+
return;
|
|
327
|
+
const key = textKey(match.text);
|
|
328
|
+
const candidates = (key ? this.idsByText.get(key) ?? [] : []).filter((candidate) => !claims.has(candidate) && this.textById.get(candidate)?.trim() === match.text);
|
|
329
|
+
// A subset of history can contain any occurrence of repeated text.
|
|
330
|
+
// Neither first nor last is safe to guess, even if usage is missing
|
|
331
|
+
// for one candidate; omit uncertain metadata instead.
|
|
332
|
+
if (candidates.length !== 1)
|
|
333
|
+
return;
|
|
334
|
+
id = candidates[0];
|
|
335
|
+
}
|
|
336
|
+
const usage = this.usageById.get(id);
|
|
337
|
+
if (usage)
|
|
338
|
+
out[String(index)] = usage;
|
|
339
|
+
});
|
|
340
|
+
return out;
|
|
341
|
+
}
|
|
342
|
+
matchTimes(messages) {
|
|
343
|
+
const out = {};
|
|
344
|
+
const userCursors = new Map();
|
|
345
|
+
const responseCursors = new Map();
|
|
346
|
+
const usedResponses = new Set();
|
|
347
|
+
// Latest time assigned so far: repeated text matches forward from it.
|
|
348
|
+
let floor;
|
|
349
|
+
messages.forEach((message, index) => {
|
|
350
|
+
const time = message?.role === "assistant"
|
|
351
|
+
? this.timeForResponse(message, floor, responseCursors, usedResponses)
|
|
352
|
+
: message?.role === "user"
|
|
353
|
+
? this.timeForUser(message, floor, userCursors)
|
|
354
|
+
: undefined;
|
|
355
|
+
if (time) {
|
|
356
|
+
out[String(index)] = time;
|
|
357
|
+
floor = latest([floor, time]);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
return out;
|
|
361
|
+
}
|
|
362
|
+
timeForResponse(message, floor, cursors, used) {
|
|
363
|
+
for (const part of Array.isArray(message.content) ? message.content : []) {
|
|
364
|
+
if (part?.type === "tool_use" && typeof part.id === "string") {
|
|
365
|
+
const id = this.idByToolUse.get(part.id);
|
|
366
|
+
if (id) {
|
|
367
|
+
if (used.has(id))
|
|
368
|
+
return undefined;
|
|
369
|
+
used.add(id);
|
|
370
|
+
return this.timeById.get(id);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
const text = messageText(message).trim();
|
|
375
|
+
const key = textKey(text);
|
|
376
|
+
if (!key)
|
|
377
|
+
return undefined;
|
|
378
|
+
const ids = this.idsByText.get(key) ?? [];
|
|
379
|
+
for (let i = cursors.get(key) ?? 0; i < ids.length; i++) {
|
|
380
|
+
cursors.set(key, i + 1);
|
|
381
|
+
const id = ids[i];
|
|
382
|
+
const time = this.timeById.get(id);
|
|
383
|
+
if (used.has(id) || this.textById.get(id)?.trim() !== text)
|
|
384
|
+
continue;
|
|
385
|
+
if (!time || (floor && time < floor))
|
|
386
|
+
continue;
|
|
387
|
+
used.add(id);
|
|
388
|
+
return time;
|
|
389
|
+
}
|
|
390
|
+
return undefined;
|
|
391
|
+
}
|
|
392
|
+
/** Latest time among the entries this message was built from. */
|
|
393
|
+
timeForUser(message, floor, cursors) {
|
|
394
|
+
const times = [];
|
|
395
|
+
const typed = (text) => {
|
|
396
|
+
const key = userTextKey(text);
|
|
397
|
+
if (!key)
|
|
398
|
+
return undefined;
|
|
399
|
+
const entries = this.timesByUserText.get(key) ?? [];
|
|
400
|
+
for (let i = cursors.get(key) ?? 0; i < entries.length; i++) {
|
|
401
|
+
cursors.set(key, i + 1);
|
|
402
|
+
if (!floor || entries[i] >= floor)
|
|
403
|
+
return entries[i];
|
|
404
|
+
}
|
|
405
|
+
return undefined;
|
|
406
|
+
};
|
|
407
|
+
if (typeof message.content === "string")
|
|
408
|
+
times.push(typed(message.content));
|
|
409
|
+
for (const part of Array.isArray(message.content) ? message.content : []) {
|
|
410
|
+
if (part?.type === "tool_result" && typeof part.tool_use_id === "string") {
|
|
411
|
+
times.push(this.timeByToolResult.get(part.tool_use_id));
|
|
412
|
+
}
|
|
413
|
+
else if (part?.type === "text" && typeof part.text === "string") {
|
|
414
|
+
times.push(typed(part.text));
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return latest(times);
|
|
418
|
+
}
|
|
419
|
+
ingest(line) {
|
|
420
|
+
if (!line.trim())
|
|
421
|
+
return;
|
|
422
|
+
let entry;
|
|
423
|
+
try {
|
|
424
|
+
entry = JSON.parse(line);
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const time = entryTime(entry);
|
|
430
|
+
if (entry?.type === "user") {
|
|
431
|
+
// A later user/tool-result entry starts an unanswered turn. An exit
|
|
432
|
+
// before its response must not append the preceding turn's answer.
|
|
433
|
+
this.lastResponseId = undefined;
|
|
434
|
+
if (time)
|
|
435
|
+
this.ingestUserTime(entry.message, time);
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (entry?.type !== "assistant")
|
|
439
|
+
return;
|
|
440
|
+
const message = entry.message;
|
|
441
|
+
const id = message?.id;
|
|
442
|
+
if (typeof id !== "string")
|
|
443
|
+
return;
|
|
444
|
+
this.lastResponseId = id;
|
|
445
|
+
if (time)
|
|
446
|
+
this.timeById.set(id, latest([this.timeById.get(id), time]));
|
|
447
|
+
const usage = toUsage(message.usage);
|
|
448
|
+
if (usage) {
|
|
449
|
+
const seen = this.usageById.get(id);
|
|
450
|
+
if (!seen || usage.output_tokens >= seen.output_tokens)
|
|
451
|
+
this.usageById.set(id, usage);
|
|
452
|
+
}
|
|
453
|
+
for (const part of Array.isArray(message.content) ? message.content : []) {
|
|
454
|
+
if (part?.type === "tool_use" && typeof part.id === "string") {
|
|
455
|
+
this.idByToolUse.set(part.id, id);
|
|
456
|
+
this.toolCallingIds.add(id);
|
|
457
|
+
}
|
|
458
|
+
else if (part?.type === "text" && typeof part.text === "string") {
|
|
459
|
+
const text = (this.textById.get(id) ?? "") + part.text;
|
|
460
|
+
this.textById.set(id, text);
|
|
461
|
+
const key = textKey(text);
|
|
462
|
+
if (key) {
|
|
463
|
+
appendOnce(this.idsByText, key, id);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
ingestUserTime(message, time) {
|
|
469
|
+
const content = message?.content;
|
|
470
|
+
if (typeof content === "string") {
|
|
471
|
+
const key = userTextKey(content);
|
|
472
|
+
if (key)
|
|
473
|
+
appendTime(this.timesByUserText, key, time);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
for (const part of Array.isArray(content) ? content : []) {
|
|
477
|
+
if (part?.type === "tool_result" && typeof part.tool_use_id === "string") {
|
|
478
|
+
this.timeByToolResult.set(part.tool_use_id, time);
|
|
479
|
+
}
|
|
480
|
+
else if (part?.type === "text" && typeof part.text === "string") {
|
|
481
|
+
const key = userTextKey(part.text);
|
|
482
|
+
if (key)
|
|
483
|
+
appendTime(this.timesByUserText, key, time);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
reset() {
|
|
488
|
+
this.offset = 0;
|
|
489
|
+
this.partial = Buffer.alloc(0);
|
|
490
|
+
this.discardingOversizedLine = false;
|
|
491
|
+
this.usageById.clear();
|
|
492
|
+
this.idByToolUse.clear();
|
|
493
|
+
this.textById.clear();
|
|
494
|
+
this.timeById.clear();
|
|
495
|
+
this.timeByToolResult.clear();
|
|
496
|
+
this.timesByUserText.clear();
|
|
497
|
+
this.idsByText.clear();
|
|
498
|
+
this.lastResponseId = undefined;
|
|
499
|
+
this.toolCallingIds.clear();
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
function toUsage(raw) {
|
|
503
|
+
if (!raw || typeof raw !== "object" || typeof raw.output_tokens !== "number")
|
|
504
|
+
return undefined;
|
|
505
|
+
const usage = {
|
|
506
|
+
output_tokens: raw.output_tokens,
|
|
507
|
+
thinking_tokens: typeof raw.output_tokens_details?.thinking_tokens === "number"
|
|
508
|
+
? raw.output_tokens_details.thinking_tokens
|
|
509
|
+
: 0,
|
|
510
|
+
};
|
|
511
|
+
for (const field of ["input_tokens", "cache_read_input_tokens", "cache_creation_input_tokens"]) {
|
|
512
|
+
if (typeof raw[field] === "number")
|
|
513
|
+
usage[field] = raw[field];
|
|
514
|
+
}
|
|
515
|
+
return usage;
|
|
516
|
+
}
|
|
517
|
+
function messageText(message) {
|
|
518
|
+
if (typeof message.content === "string")
|
|
519
|
+
return message.content;
|
|
520
|
+
if (!Array.isArray(message.content))
|
|
521
|
+
return "";
|
|
522
|
+
return message.content
|
|
523
|
+
.filter((part) => part?.type === "text" && typeof part.text === "string")
|
|
524
|
+
.map((part) => part.text)
|
|
525
|
+
.join("");
|
|
526
|
+
}
|
|
527
|
+
/** Hash the entire normalized text: shared prefixes must never identify a message. */
|
|
528
|
+
function textKey(text) {
|
|
529
|
+
const trimmed = text.trim();
|
|
530
|
+
if (!trimmed)
|
|
531
|
+
return undefined;
|
|
532
|
+
return createHash("sha256").update(trimmed).digest("hex").slice(0, 32);
|
|
533
|
+
}
|
|
534
|
+
/** The entry's ISO time, normalized; entries without a parseable one have none. */
|
|
535
|
+
function entryTime(entry) {
|
|
536
|
+
const raw = entry?.timestamp;
|
|
537
|
+
if (typeof raw !== "string")
|
|
538
|
+
return undefined;
|
|
539
|
+
const ms = Date.parse(raw);
|
|
540
|
+
return Number.isNaN(ms) ? undefined : new Date(ms).toISOString();
|
|
541
|
+
}
|
|
542
|
+
/** The latest of some ISO times (all normalized by entryTime, so they sort as text). */
|
|
543
|
+
function latest(times) {
|
|
544
|
+
let best;
|
|
545
|
+
for (const time of times)
|
|
546
|
+
if (time && (!best || time > best))
|
|
547
|
+
best = time;
|
|
548
|
+
return best;
|
|
549
|
+
}
|
|
550
|
+
/** Keep separate entries even when they have identical millisecond timestamps. */
|
|
551
|
+
function appendTime(map, key, time) {
|
|
552
|
+
const times = map.get(key);
|
|
553
|
+
if (times)
|
|
554
|
+
times.push(time);
|
|
555
|
+
else
|
|
556
|
+
map.set(key, [time]);
|
|
557
|
+
}
|
|
558
|
+
function appendOnce(map, key, value) {
|
|
559
|
+
const list = map.get(key);
|
|
560
|
+
if (!list)
|
|
561
|
+
map.set(key, [value]);
|
|
562
|
+
else if (list[list.length - 1] !== value)
|
|
563
|
+
list.push(value);
|
|
564
|
+
}
|
|
565
|
+
const SYSTEM_REMINDER_RE = /<system-reminder>[\s\S]*?<\/system-reminder>/g;
|
|
566
|
+
/** Typed text keyed without Claude Code's reminders, which the API copy may add or drop. */
|
|
567
|
+
function userTextKey(text) {
|
|
568
|
+
return textKey(text.replace(SYSTEM_REMINDER_RE, ""));
|
|
569
|
+
}
|
|
570
|
+
//# sourceMappingURL=transcript-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-usage.js","sourceRoot":"","sources":["../src/transcript-usage.ts"],"names":[],"mappings":"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"}
|