tracelight 0.1.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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/dist/apiTypes.d.ts +139 -0
  4. package/dist/apiTypes.d.ts.map +1 -0
  5. package/dist/apiTypes.js +11 -0
  6. package/dist/apiTypes.js.map +1 -0
  7. package/dist/cli.d.ts +13 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +73 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/model.d.ts +133 -0
  12. package/dist/model.d.ts.map +1 -0
  13. package/dist/model.js +20 -0
  14. package/dist/model.js.map +1 -0
  15. package/dist/parser/index.d.ts +27 -0
  16. package/dist/parser/index.d.ts.map +1 -0
  17. package/dist/parser/index.js +434 -0
  18. package/dist/parser/index.js.map +1 -0
  19. package/dist/parser/rawTypes.d.ts +149 -0
  20. package/dist/parser/rawTypes.d.ts.map +1 -0
  21. package/dist/parser/rawTypes.js +11 -0
  22. package/dist/parser/rawTypes.js.map +1 -0
  23. package/dist/pricing.d.ts +35 -0
  24. package/dist/pricing.d.ts.map +1 -0
  25. package/dist/pricing.js +73 -0
  26. package/dist/pricing.js.map +1 -0
  27. package/dist/projectLoader.d.ts +31 -0
  28. package/dist/projectLoader.d.ts.map +1 -0
  29. package/dist/projectLoader.js +335 -0
  30. package/dist/projectLoader.js.map +1 -0
  31. package/dist/scripts/summarize.d.ts +7 -0
  32. package/dist/scripts/summarize.d.ts.map +1 -0
  33. package/dist/scripts/summarize.js +153 -0
  34. package/dist/scripts/summarize.js.map +1 -0
  35. package/dist/server/index.d.ts +18 -0
  36. package/dist/server/index.d.ts.map +1 -0
  37. package/dist/server/index.js +100 -0
  38. package/dist/server/index.js.map +1 -0
  39. package/package.json +70 -0
  40. package/ui/dist/assets/index-Bnr6kWU4.js +62 -0
  41. package/ui/dist/assets/index-HoOM9YCS.css +1 -0
  42. package/ui/dist/index.html +13 -0
@@ -0,0 +1,434 @@
1
+ /**
2
+ * Normalizing parser for Claude Code JSONL transcript files.
3
+ *
4
+ * Two-layer design: all knowledge of the Claude Code format lives here.
5
+ * The rest of the codebase imports only from src/model.ts.
6
+ *
7
+ * Parsing strategy:
8
+ * - Parse each line as JSON; any parse failure becomes an UnknownEvent.
9
+ * - Recognize known line types; unrecognized types become UnknownEvent.
10
+ * - Group conversation lines into Turns by promptId.
11
+ * - Multiple assistant lines sharing the same message.id are merged into
12
+ * a single Turn (Claude Code emits streaming chunks as separate lines).
13
+ * - Tool calls and their matching results are paired across turns.
14
+ */
15
+ // ---------------------------------------------------------------------------
16
+ // Public API
17
+ // ---------------------------------------------------------------------------
18
+ export function parseSessionJsonl(jsonlText) {
19
+ const lines = jsonlText.split("\n");
20
+ return parseLines(lines);
21
+ }
22
+ /**
23
+ * Parses a subagent transcript's JSONL text into Turn[].
24
+ *
25
+ * Subagent .jsonl files use the same line format as the main transcript.
26
+ * All their turns have isSidechain true (that flag is on the raw lines themselves).
27
+ * This function reuses the core turn-building logic from parseLines; it extracts
28
+ * just the turns from the resulting SessionSummary rather than duplicating logic.
29
+ */
30
+ export function parseSubagentTurns(jsonlText) {
31
+ const lines = jsonlText.split("\n");
32
+ const sessionSummary = parseLines(lines);
33
+ return Array.from(sessionSummary.turns);
34
+ }
35
+ export function parseLines(lines) {
36
+ const unknownEvents = [];
37
+ let sessionId = "";
38
+ let aiTitle;
39
+ // Map from promptId to accumulator turn
40
+ const turnsByPromptId = new Map();
41
+ // Ordered list of turns (by first-seen order)
42
+ const turnOrder = [];
43
+ // Map from tool_use_id to MutableToolCall so we can patch results later
44
+ const toolCallsById = new Map();
45
+ // turn_duration system lines arrive after all the messages in a turn;
46
+ // we store them indexed by the last-seen promptId at the time
47
+ let lastSeenPromptId;
48
+ // System turn_duration events: keyed by promptId to patch durationMs
49
+ const durationByPromptId = new Map();
50
+ // Models set
51
+ const modelsUsed = new Set();
52
+ let turnIndex = 0;
53
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
54
+ const rawLine = lines[lineIndex].trim();
55
+ if (rawLine === "")
56
+ continue;
57
+ let parsed;
58
+ try {
59
+ parsed = JSON.parse(rawLine);
60
+ }
61
+ catch {
62
+ unknownEvents.push({
63
+ kind: "unknown",
64
+ rawType: "<json-parse-error>",
65
+ rawPayload: { rawLine },
66
+ lineIndex,
67
+ });
68
+ continue;
69
+ }
70
+ const lineType = typeof parsed["type"] === "string" ? parsed["type"] : "";
71
+ // Capture sessionId from any line that has it
72
+ if (typeof parsed["sessionId"] === "string" && parsed["sessionId"]) {
73
+ sessionId = parsed["sessionId"];
74
+ }
75
+ switch (lineType) {
76
+ case "ai-title": {
77
+ if (typeof parsed["aiTitle"] === "string") {
78
+ aiTitle = parsed["aiTitle"];
79
+ }
80
+ break;
81
+ }
82
+ case "system": {
83
+ const subtype = parsed["subtype"];
84
+ if (subtype === "turn_duration" && typeof parsed["durationMs"] === "number") {
85
+ if (lastSeenPromptId !== undefined) {
86
+ durationByPromptId.set(lastSeenPromptId, parsed["durationMs"]);
87
+ }
88
+ }
89
+ // Other system subtypes (local_command, etc.) are informational — skip silently
90
+ break;
91
+ }
92
+ case "user": {
93
+ const userLine = parsed;
94
+ const message = userLine.message;
95
+ if (!message)
96
+ break;
97
+ const promptId = userLine.promptId;
98
+ const isSidechain = userLine.isSidechain === true;
99
+ // Check if this user line contains tool_result blocks (tool result delivery)
100
+ const content = message.content;
101
+ if (Array.isArray(content)) {
102
+ const toolResultBlocks = content.filter((block) => typeof block === "object" &&
103
+ block !== null &&
104
+ block["type"] === "tool_result");
105
+ if (toolResultBlocks.length > 0) {
106
+ // This is a tool-result delivery line — patch the matching ToolCall
107
+ for (const block of toolResultBlocks) {
108
+ const resultBlock = block;
109
+ const toolUseId = resultBlock["tool_use_id"];
110
+ if (typeof toolUseId !== "string")
111
+ continue;
112
+ const toolCall = toolCallsById.get(toolUseId);
113
+ if (!toolCall)
114
+ continue;
115
+ const isError = resultBlock["is_error"] === true;
116
+ toolCall.isError = isError;
117
+ const blockContent = resultBlock["content"];
118
+ if (typeof blockContent === "string") {
119
+ toolCall.result = blockContent;
120
+ }
121
+ else if (Array.isArray(blockContent)) {
122
+ // Agent tool returns array of text blocks
123
+ const textParts = blockContent
124
+ .filter((b) => typeof b === "object" && b !== null && b["type"] === "text")
125
+ .map((b) => String(b["text"] ?? ""));
126
+ toolCall.result = textParts.join("\n");
127
+ }
128
+ // For Agent tool: extract subagentId from toolUseResult
129
+ const toolUseResult = userLine.toolUseResult;
130
+ if (toolUseResult && typeof toolUseResult["agentId"] === "string") {
131
+ toolCall.subagentId = toolUseResult["agentId"];
132
+ }
133
+ }
134
+ // Don't create a new Turn for tool-result-only user lines
135
+ break;
136
+ }
137
+ }
138
+ // Regular user message — open or update a Turn for this promptId.
139
+ if (promptId === undefined)
140
+ break;
141
+ lastSeenPromptId = promptId;
142
+ if (!turnsByPromptId.has(promptId)) {
143
+ const newTurn = {
144
+ turnIndex: turnIndex++,
145
+ promptId,
146
+ userMessageUuid: userLine.uuid,
147
+ timestamp: userLine.timestamp,
148
+ userText: extractUserText(message.content),
149
+ isMeta: userLine.isMeta === true,
150
+ assistantBlocks: [],
151
+ toolCallsMap: new Map(),
152
+ usage: undefined,
153
+ model: undefined,
154
+ durationMs: undefined,
155
+ isSidechain,
156
+ lastAssistantMessageId: undefined,
157
+ };
158
+ turnsByPromptId.set(promptId, newTurn);
159
+ turnOrder.push(newTurn);
160
+ }
161
+ else {
162
+ // A turn for this promptId already exists (opened by a meta or assistant line).
163
+ // If this user line is non-meta and has real text, upgrade the turn's user fields.
164
+ const existingTurn = turnsByPromptId.get(promptId);
165
+ if (userLine.isMeta !== true) {
166
+ const text = extractUserText(message.content);
167
+ if (text !== undefined) {
168
+ existingTurn.userText = text;
169
+ existingTurn.isMeta = false;
170
+ existingTurn.userMessageUuid = userLine.uuid;
171
+ if (userLine.timestamp) {
172
+ existingTurn.timestamp = userLine.timestamp;
173
+ }
174
+ }
175
+ }
176
+ }
177
+ break;
178
+ }
179
+ case "assistant": {
180
+ const assistantLine = parsed;
181
+ const message = assistantLine.message;
182
+ if (!message)
183
+ break;
184
+ // Assistant lines frequently lack promptId in real transcripts.
185
+ // Fall back to the most recently seen promptId from a user line.
186
+ const promptId = assistantLine.promptId ?? lastSeenPromptId;
187
+ if (promptId === undefined)
188
+ break;
189
+ // Only update lastSeenPromptId if the line has an explicit value (don't
190
+ // let assistant lines overwrite a user-established promptId with undefined).
191
+ if (assistantLine.promptId !== undefined) {
192
+ lastSeenPromptId = assistantLine.promptId;
193
+ }
194
+ // Get or create the Turn (assistant lines can arrive before the corresponding
195
+ // user line when the file records them out of strict order — be defensive)
196
+ if (!turnsByPromptId.has(promptId)) {
197
+ const newTurn = {
198
+ turnIndex: turnIndex++,
199
+ promptId,
200
+ userMessageUuid: undefined,
201
+ timestamp: assistantLine.timestamp,
202
+ userText: undefined,
203
+ isMeta: false,
204
+ assistantBlocks: [],
205
+ toolCallsMap: new Map(),
206
+ usage: undefined,
207
+ model: undefined,
208
+ durationMs: undefined,
209
+ isSidechain: assistantLine.isSidechain === true,
210
+ lastAssistantMessageId: undefined,
211
+ };
212
+ turnsByPromptId.set(promptId, newTurn);
213
+ turnOrder.push(newTurn);
214
+ }
215
+ const turn = turnsByPromptId.get(promptId);
216
+ // Track message id to merge streaming chunks
217
+ const apiMessageId = message.id;
218
+ const isNewApiMessage = apiMessageId !== undefined &&
219
+ apiMessageId !== turn.lastAssistantMessageId;
220
+ if (apiMessageId !== undefined) {
221
+ turn.lastAssistantMessageId = apiMessageId;
222
+ }
223
+ // Capture usage only from the first line per API message (they're duplicated
224
+ // across streaming chunk lines — all have the same usage totals)
225
+ if (isNewApiMessage && message.usage) {
226
+ turn.usage = normalizeUsage(message.usage);
227
+ }
228
+ if (message.model && typeof message.model === "string") {
229
+ turn.model = message.model;
230
+ modelsUsed.add(message.model);
231
+ }
232
+ // Parse content blocks
233
+ const rawContent = message.content;
234
+ const rawBlocks = Array.isArray(rawContent)
235
+ ? rawContent
236
+ : [];
237
+ for (const rawBlock of rawBlocks) {
238
+ if (typeof rawBlock !== "object" || rawBlock === null)
239
+ continue;
240
+ const block = normalizeContentBlock(rawBlock);
241
+ if (block === null)
242
+ continue;
243
+ turn.assistantBlocks.push(block);
244
+ // Register tool_use blocks so we can match results later
245
+ if (block.type === "tool_use") {
246
+ const toolCall = {
247
+ id: block.id,
248
+ name: block.name,
249
+ input: block.input,
250
+ result: undefined,
251
+ isError: false,
252
+ subagentId: undefined,
253
+ };
254
+ turn.toolCallsMap.set(block.id, toolCall);
255
+ toolCallsById.set(block.id, toolCall);
256
+ }
257
+ }
258
+ break;
259
+ }
260
+ // Metadata lines — recognized and silently consumed
261
+ case "mode":
262
+ case "permission-mode":
263
+ case "file-history-snapshot":
264
+ case "last-prompt":
265
+ case "attachment":
266
+ case "queue-operation":
267
+ break;
268
+ default: {
269
+ unknownEvents.push({
270
+ kind: "unknown",
271
+ rawType: lineType || "<missing>",
272
+ rawPayload: parsed,
273
+ lineIndex,
274
+ });
275
+ }
276
+ }
277
+ }
278
+ // Patch durationMs into turns
279
+ for (const [promptId, durationMs] of durationByPromptId) {
280
+ const turn = turnsByPromptId.get(promptId);
281
+ if (turn) {
282
+ turn.durationMs = durationMs;
283
+ }
284
+ }
285
+ // Freeze turns into immutable Turn objects
286
+ const frozenTurns = turnOrder.map((mutableTurn) => freezeTurn(mutableTurn));
287
+ // Compute aggregate token usage
288
+ const totalUsage = aggregateUsage(frozenTurns);
289
+ // Derive start/end timestamps
290
+ const timestamps = frozenTurns
291
+ .map((t) => t.timestamp)
292
+ .filter((ts) => ts !== undefined)
293
+ .sort();
294
+ const startedAt = timestamps[0];
295
+ const endedAt = timestamps[timestamps.length - 1];
296
+ const durationMs = startedAt && endedAt
297
+ ? new Date(endedAt).getTime() - new Date(startedAt).getTime()
298
+ : undefined;
299
+ return {
300
+ sessionId,
301
+ aiTitle,
302
+ startedAt,
303
+ endedAt,
304
+ durationMs,
305
+ turns: frozenTurns,
306
+ subagents: [],
307
+ totalUsage,
308
+ modelsUsed: Array.from(modelsUsed),
309
+ unknownEvents,
310
+ };
311
+ }
312
+ // ---------------------------------------------------------------------------
313
+ // Helpers
314
+ // ---------------------------------------------------------------------------
315
+ function normalizeContentBlock(rawBlock) {
316
+ const blockType = rawBlock.type;
317
+ switch (blockType) {
318
+ case "text": {
319
+ const b = rawBlock;
320
+ return {
321
+ type: "text",
322
+ text: typeof b.text === "string" ? b.text : "",
323
+ };
324
+ }
325
+ case "thinking": {
326
+ const b = rawBlock;
327
+ return {
328
+ type: "thinking",
329
+ thinking: typeof b.thinking === "string" ? b.thinking : "",
330
+ signature: typeof b.signature === "string" ? b.signature : "",
331
+ };
332
+ }
333
+ case "tool_use": {
334
+ const b = rawBlock;
335
+ const id = typeof b.id === "string" ? b.id : "";
336
+ const name = typeof b.name === "string" ? b.name : "";
337
+ const input = b.input !== null && typeof b.input === "object" && !Array.isArray(b.input)
338
+ ? b.input
339
+ : {};
340
+ return { type: "tool_use", id, name, input };
341
+ }
342
+ case "tool_result": {
343
+ const b = rawBlock;
344
+ const toolUseId = typeof b.tool_use_id === "string" ? b.tool_use_id : "";
345
+ let content;
346
+ if (typeof b.content === "string") {
347
+ content = b.content;
348
+ }
349
+ else if (Array.isArray(b.content)) {
350
+ content = b.content
351
+ .filter((item) => item["type"] === "text")
352
+ .map((item) => ({ type: "text", text: String(item["text"] ?? "") }));
353
+ }
354
+ else {
355
+ content = "";
356
+ }
357
+ return {
358
+ type: "tool_result",
359
+ tool_use_id: toolUseId,
360
+ content,
361
+ is_error: b.is_error === true,
362
+ };
363
+ }
364
+ default:
365
+ // Unknown content block type — skip rather than crash
366
+ return null;
367
+ }
368
+ }
369
+ function normalizeUsage(rawUsage) {
370
+ return {
371
+ inputTokens: rawUsage.input_tokens ?? 0,
372
+ outputTokens: rawUsage.output_tokens ?? 0,
373
+ cacheCreationInputTokens: rawUsage.cache_creation_input_tokens ?? 0,
374
+ cacheReadInputTokens: rawUsage.cache_read_input_tokens ?? 0,
375
+ };
376
+ }
377
+ function extractUserText(content) {
378
+ if (typeof content === "string") {
379
+ // Strip known XML wrappers that Claude Code injects
380
+ const stripped = content
381
+ .replace(/<local-command-caveat>[\s\S]*?<\/local-command-caveat>/g, "")
382
+ .replace(/<local-command-stdout>[\s\S]*?<\/local-command-stdout>/g, "")
383
+ .replace(/<command-name>[\s\S]*?<\/command-name>/g, "")
384
+ .replace(/<command-message>[\s\S]*?<\/command-message>/g, "")
385
+ .replace(/<command-args>[\s\S]*?<\/command-args>/g, "")
386
+ .trim();
387
+ return stripped || undefined;
388
+ }
389
+ if (Array.isArray(content)) {
390
+ // List content is typically tool results — not a user text message
391
+ return undefined;
392
+ }
393
+ return undefined;
394
+ }
395
+ function freezeTurn(mutableTurn) {
396
+ const toolCalls = Array.from(mutableTurn.toolCallsMap.values()).map((tc) => ({
397
+ id: tc.id,
398
+ name: tc.name,
399
+ input: tc.input,
400
+ result: tc.result,
401
+ isError: tc.isError,
402
+ subagentId: tc.subagentId,
403
+ }));
404
+ return {
405
+ turnIndex: mutableTurn.turnIndex,
406
+ promptId: mutableTurn.promptId,
407
+ userMessageUuid: mutableTurn.userMessageUuid,
408
+ timestamp: mutableTurn.timestamp,
409
+ userText: mutableTurn.userText,
410
+ isMeta: mutableTurn.isMeta,
411
+ assistantBlocks: mutableTurn.assistantBlocks,
412
+ toolCalls,
413
+ usage: mutableTurn.usage,
414
+ model: mutableTurn.model,
415
+ durationMs: mutableTurn.durationMs,
416
+ isSidechain: mutableTurn.isSidechain,
417
+ };
418
+ }
419
+ function aggregateUsage(turns) {
420
+ let inputTokens = 0;
421
+ let outputTokens = 0;
422
+ let cacheCreationInputTokens = 0;
423
+ let cacheReadInputTokens = 0;
424
+ for (const turn of turns) {
425
+ if (turn.usage) {
426
+ inputTokens += turn.usage.inputTokens;
427
+ outputTokens += turn.usage.outputTokens;
428
+ cacheCreationInputTokens += turn.usage.cacheCreationInputTokens;
429
+ cacheReadInputTokens += turn.usage.cacheReadInputTokens;
430
+ }
431
+ }
432
+ return { inputTokens, outputTokens, cacheCreationInputTokens, cacheReadInputTokens };
433
+ }
434
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Raw JSONL line shapes as they appear in Claude Code transcript files.
3
+ *
4
+ * These types are intentionally loose (lots of `unknown` and optional fields)
5
+ * because the format is undocumented and changes between versions.
6
+ *
7
+ * RULE: All knowledge of the Claude Code format lives in src/parser/.
8
+ * The rest of the codebase imports only from src/model.ts.
9
+ */
10
+ export interface RawBase {
11
+ readonly type: string;
12
+ readonly uuid?: string;
13
+ readonly parentUuid?: string | null;
14
+ readonly sessionId?: string;
15
+ readonly timestamp?: string;
16
+ readonly isSidechain?: boolean;
17
+ readonly promptId?: string;
18
+ readonly isMeta?: boolean;
19
+ readonly cwd?: string;
20
+ readonly version?: string;
21
+ readonly gitBranch?: string;
22
+ readonly userType?: string;
23
+ readonly entrypoint?: string;
24
+ }
25
+ export interface RawTextBlock {
26
+ readonly type: "text";
27
+ readonly text: string;
28
+ }
29
+ export interface RawThinkingBlock {
30
+ readonly type: "thinking";
31
+ readonly thinking: string;
32
+ readonly signature: string;
33
+ }
34
+ export interface RawToolUseBlock {
35
+ readonly type: "tool_use";
36
+ readonly id: string;
37
+ readonly name: string;
38
+ readonly input: Record<string, unknown>;
39
+ readonly caller?: {
40
+ type: string;
41
+ };
42
+ }
43
+ export interface RawToolResultBlock {
44
+ readonly type: "tool_result";
45
+ readonly tool_use_id: string;
46
+ readonly content: string | Array<{
47
+ type: string;
48
+ text?: string;
49
+ }>;
50
+ readonly is_error?: boolean;
51
+ }
52
+ export type RawContentBlock = RawTextBlock | RawThinkingBlock | RawToolUseBlock | RawToolResultBlock | {
53
+ readonly type: string;
54
+ [key: string]: unknown;
55
+ };
56
+ export interface RawUsage {
57
+ readonly input_tokens?: number;
58
+ readonly output_tokens?: number;
59
+ readonly cache_creation_input_tokens?: number;
60
+ readonly cache_read_input_tokens?: number;
61
+ readonly [key: string]: unknown;
62
+ }
63
+ export interface RawMessage {
64
+ readonly role: "user" | "assistant";
65
+ readonly content: string | RawContentBlock[];
66
+ readonly model?: string;
67
+ readonly id?: string;
68
+ readonly type?: string;
69
+ readonly stop_reason?: string | null;
70
+ readonly usage?: RawUsage;
71
+ readonly [key: string]: unknown;
72
+ }
73
+ export interface RawUserLine extends RawBase {
74
+ readonly type: "user";
75
+ readonly message: RawMessage;
76
+ readonly agentId?: string;
77
+ /** Present on tool-result delivery lines — contains structured metadata about the result */
78
+ readonly toolUseResult?: RawToolUseResult;
79
+ }
80
+ export interface RawAssistantLine extends RawBase {
81
+ readonly type: "assistant";
82
+ readonly message: RawMessage;
83
+ readonly requestId?: string;
84
+ readonly agentId?: string;
85
+ readonly attributionAgent?: string;
86
+ readonly attributionSkill?: string;
87
+ /** toolUseResult is present on user lines that are tool results, not assistant lines */
88
+ readonly toolUseResult?: unknown;
89
+ }
90
+ export interface RawToolResultUserLine extends RawBase {
91
+ readonly type: "user";
92
+ readonly message: RawMessage;
93
+ /** Structured tool result metadata, present when message.content is a tool_result array */
94
+ readonly toolUseResult?: RawToolUseResult;
95
+ }
96
+ export interface RawToolUseResult {
97
+ readonly isAsync?: boolean;
98
+ readonly status?: string;
99
+ readonly agentId?: string;
100
+ readonly description?: string;
101
+ readonly prompt?: string;
102
+ readonly filePath?: string;
103
+ readonly oldString?: string;
104
+ readonly newString?: string;
105
+ readonly [key: string]: unknown;
106
+ }
107
+ export interface RawSystemLine extends RawBase {
108
+ readonly type: "system";
109
+ readonly subtype?: string;
110
+ readonly content?: string;
111
+ readonly level?: string;
112
+ readonly durationMs?: number;
113
+ readonly messageCount?: number;
114
+ }
115
+ export interface RawModeLine extends RawBase {
116
+ readonly type: "mode";
117
+ readonly mode: string;
118
+ }
119
+ export interface RawPermissionModeLine extends RawBase {
120
+ readonly type: "permission-mode";
121
+ readonly permissionMode: string;
122
+ }
123
+ export interface RawFileHistorySnapshotLine extends RawBase {
124
+ readonly type: "file-history-snapshot";
125
+ readonly messageId?: string;
126
+ readonly snapshot?: unknown;
127
+ readonly isSnapshotUpdate?: boolean;
128
+ }
129
+ export interface RawAiTitleLine extends RawBase {
130
+ readonly type: "ai-title";
131
+ readonly aiTitle: string;
132
+ }
133
+ export interface RawLastPromptLine extends RawBase {
134
+ readonly type: "last-prompt";
135
+ readonly leafUuid: string;
136
+ }
137
+ export interface RawAttachmentLine extends RawBase {
138
+ readonly type: "attachment";
139
+ readonly attachment?: {
140
+ readonly type: string;
141
+ readonly [key: string]: unknown;
142
+ };
143
+ }
144
+ export interface RawQueueOperationLine extends RawBase {
145
+ readonly type: "queue-operation";
146
+ readonly operation?: string;
147
+ readonly content?: string;
148
+ }
149
+ //# sourceMappingURL=rawTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawTypes.d.ts","sourceRoot":"","sources":["../../src/parser/rawTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Raw JSONL line shapes as they appear in Claude Code transcript files.
3
+ *
4
+ * These types are intentionally loose (lots of `unknown` and optional fields)
5
+ * because the format is undocumented and changes between versions.
6
+ *
7
+ * RULE: All knowledge of the Claude Code format lives in src/parser/.
8
+ * The rest of the codebase imports only from src/model.ts.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=rawTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawTypes.js","sourceRoot":"","sources":["../../src/parser/rawTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Hand-maintained cost table for Claude model families.
3
+ *
4
+ * IMPORTANT: These prices are hand-maintained and must be verified against
5
+ * https://www.anthropic.com/pricing before using for billing or reporting.
6
+ * Last verified: 2026-06-13.
7
+ */
8
+ import type { TokenUsage } from "./model.js";
9
+ export interface ModelPricing {
10
+ /** USD per 1 million input tokens */
11
+ readonly inputPer1M: number;
12
+ /** USD per 1 million output tokens */
13
+ readonly outputPer1M: number;
14
+ /** USD per 1 million cache-write tokens */
15
+ readonly cacheWritePer1M: number;
16
+ /** USD per 1 million cache-read tokens */
17
+ readonly cacheReadPer1M: number;
18
+ }
19
+ /** Date this pricing table was last verified against Anthropic's public list prices. */
20
+ export declare const PRICING_AS_OF_DATE = "2026-06-13";
21
+ /**
22
+ * Known model-family prefixes mapped to their public list prices (USD per 1M tokens).
23
+ *
24
+ * Real model ids look like "claude-sonnet-4-6-20250930"; we match by prefix so
25
+ * versioned ids resolve correctly. Add new families here as they are released.
26
+ */
27
+ export declare const MODEL_PRICING: Record<string, ModelPricing>;
28
+ /**
29
+ * Estimates the cost in USD for a given model and token usage.
30
+ *
31
+ * Returns undefined for model ids that don't match any known prefix (e.g. "<synthetic>"),
32
+ * so the UI can display "cost unavailable" rather than a misleading zero.
33
+ */
34
+ export declare function estimateCostUsd(modelId: string, usage: TokenUsage): number | undefined;
35
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA2BtD,CAAC;AAeF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CActF"}