@tracemarketplace/shared 0.0.6 → 0.0.9

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 (82) hide show
  1. package/dist/chunker.d.ts.map +1 -1
  2. package/dist/chunker.js +14 -2
  3. package/dist/chunker.js.map +1 -1
  4. package/dist/extractor-claude-code.test.d.ts +2 -0
  5. package/dist/extractor-claude-code.test.d.ts.map +1 -0
  6. package/dist/extractor-claude-code.test.js +290 -0
  7. package/dist/extractor-claude-code.test.js.map +1 -0
  8. package/dist/extractor-codex.test.d.ts +2 -0
  9. package/dist/extractor-codex.test.d.ts.map +1 -0
  10. package/dist/extractor-codex.test.js +212 -0
  11. package/dist/extractor-codex.test.js.map +1 -0
  12. package/dist/extractor-cursor.test.d.ts +2 -0
  13. package/dist/extractor-cursor.test.d.ts.map +1 -0
  14. package/dist/extractor-cursor.test.js +120 -0
  15. package/dist/extractor-cursor.test.js.map +1 -0
  16. package/dist/extractors/claude-code.d.ts.map +1 -1
  17. package/dist/extractors/claude-code.js +172 -73
  18. package/dist/extractors/claude-code.js.map +1 -1
  19. package/dist/extractors/codex.d.ts.map +1 -1
  20. package/dist/extractors/codex.js +63 -35
  21. package/dist/extractors/codex.js.map +1 -1
  22. package/dist/extractors/common.d.ts +14 -0
  23. package/dist/extractors/common.d.ts.map +1 -0
  24. package/dist/extractors/common.js +100 -0
  25. package/dist/extractors/common.js.map +1 -0
  26. package/dist/extractors/cursor.d.ts.map +1 -1
  27. package/dist/extractors/cursor.js +205 -45
  28. package/dist/extractors/cursor.js.map +1 -1
  29. package/dist/hash.d.ts.map +1 -1
  30. package/dist/hash.js +35 -2
  31. package/dist/hash.js.map +1 -1
  32. package/dist/hash.test.js +29 -2
  33. package/dist/hash.test.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/redact.d.ts +12 -0
  39. package/dist/redact.d.ts.map +1 -1
  40. package/dist/redact.js +120 -38
  41. package/dist/redact.js.map +1 -1
  42. package/dist/redact.test.d.ts +2 -0
  43. package/dist/redact.test.d.ts.map +1 -0
  44. package/dist/redact.test.js +96 -0
  45. package/dist/redact.test.js.map +1 -0
  46. package/dist/turn-actors.d.ts +3 -0
  47. package/dist/turn-actors.d.ts.map +1 -0
  48. package/dist/turn-actors.js +57 -0
  49. package/dist/turn-actors.js.map +1 -0
  50. package/dist/turn-actors.test.d.ts +2 -0
  51. package/dist/turn-actors.test.d.ts.map +1 -0
  52. package/dist/turn-actors.test.js +65 -0
  53. package/dist/turn-actors.test.js.map +1 -0
  54. package/dist/types.d.ts +5 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/dist/utils.d.ts +1 -1
  57. package/dist/utils.d.ts.map +1 -1
  58. package/dist/utils.js +4 -0
  59. package/dist/utils.js.map +1 -1
  60. package/dist/validators.d.ts +24 -0
  61. package/dist/validators.d.ts.map +1 -1
  62. package/dist/validators.js +3 -0
  63. package/dist/validators.js.map +1 -1
  64. package/package.json +5 -1
  65. package/src/chunker.ts +17 -2
  66. package/src/extractor-claude-code.test.ts +326 -0
  67. package/src/extractor-codex.test.ts +225 -0
  68. package/src/extractor-cursor.test.ts +141 -0
  69. package/src/extractors/claude-code.ts +180 -69
  70. package/src/extractors/codex.ts +69 -38
  71. package/src/extractors/common.ts +139 -0
  72. package/src/extractors/cursor.ts +294 -52
  73. package/src/hash.test.ts +31 -2
  74. package/src/hash.ts +38 -3
  75. package/src/index.ts +1 -0
  76. package/src/redact.test.ts +100 -0
  77. package/src/redact.ts +175 -58
  78. package/src/turn-actors.test.ts +71 -0
  79. package/src/turn-actors.ts +71 -0
  80. package/src/types.ts +6 -0
  81. package/src/utils.ts +3 -1
  82. package/src/validators.ts +3 -0
@@ -6,6 +6,9 @@ export declare const NormalizedTraceSchema: z.ZodObject<{
6
6
  source_session_id: z.ZodString;
7
7
  chunk_index: z.ZodDefault<z.ZodNumber>;
8
8
  chunk_start_turn: z.ZodDefault<z.ZodNumber>;
9
+ chunk_complete: z.ZodOptional<z.ZodBoolean>;
10
+ chunk_close_reason: z.ZodOptional<z.ZodEnum<["100k_tokens", "idle_2d"]>>;
11
+ chunk_closed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9
12
  source_version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
10
13
  submitted_by: z.ZodOptional<z.ZodString>;
11
14
  submitted_at: z.ZodOptional<z.ZodString>;
@@ -37,6 +40,9 @@ export declare const NormalizedTraceSchema: z.ZodObject<{
37
40
  chunk_start_turn: number;
38
41
  trace_id?: string | undefined;
39
42
  schema_version?: string | undefined;
43
+ chunk_complete?: boolean | undefined;
44
+ chunk_close_reason?: "100k_tokens" | "idle_2d" | undefined;
45
+ chunk_closed_at?: string | null | undefined;
40
46
  source_version?: string | null | undefined;
41
47
  submitted_by?: string | undefined;
42
48
  submitted_at?: string | undefined;
@@ -68,6 +74,9 @@ export declare const NormalizedTraceSchema: z.ZodObject<{
68
74
  schema_version?: string | undefined;
69
75
  chunk_index?: number | undefined;
70
76
  chunk_start_turn?: number | undefined;
77
+ chunk_complete?: boolean | undefined;
78
+ chunk_close_reason?: "100k_tokens" | "idle_2d" | undefined;
79
+ chunk_closed_at?: string | null | undefined;
71
80
  source_version?: string | null | undefined;
72
81
  submitted_by?: string | undefined;
73
82
  submitted_at?: string | undefined;
@@ -102,6 +111,9 @@ export declare const BatchSubmitSchema: z.ZodObject<{
102
111
  source_session_id: z.ZodString;
103
112
  chunk_index: z.ZodDefault<z.ZodNumber>;
104
113
  chunk_start_turn: z.ZodDefault<z.ZodNumber>;
114
+ chunk_complete: z.ZodOptional<z.ZodBoolean>;
115
+ chunk_close_reason: z.ZodOptional<z.ZodEnum<["100k_tokens", "idle_2d"]>>;
116
+ chunk_closed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
117
  source_version: z.ZodOptional<z.ZodNullable<z.ZodString>>;
106
118
  submitted_by: z.ZodOptional<z.ZodString>;
107
119
  submitted_at: z.ZodOptional<z.ZodString>;
@@ -133,6 +145,9 @@ export declare const BatchSubmitSchema: z.ZodObject<{
133
145
  chunk_start_turn: number;
134
146
  trace_id?: string | undefined;
135
147
  schema_version?: string | undefined;
148
+ chunk_complete?: boolean | undefined;
149
+ chunk_close_reason?: "100k_tokens" | "idle_2d" | undefined;
150
+ chunk_closed_at?: string | null | undefined;
136
151
  source_version?: string | null | undefined;
137
152
  submitted_by?: string | undefined;
138
153
  submitted_at?: string | undefined;
@@ -164,6 +179,9 @@ export declare const BatchSubmitSchema: z.ZodObject<{
164
179
  schema_version?: string | undefined;
165
180
  chunk_index?: number | undefined;
166
181
  chunk_start_turn?: number | undefined;
182
+ chunk_complete?: boolean | undefined;
183
+ chunk_close_reason?: "100k_tokens" | "idle_2d" | undefined;
184
+ chunk_closed_at?: string | null | undefined;
167
185
  source_version?: string | null | undefined;
168
186
  submitted_by?: string | undefined;
169
187
  submitted_at?: string | undefined;
@@ -198,6 +216,9 @@ export declare const BatchSubmitSchema: z.ZodObject<{
198
216
  chunk_start_turn: number;
199
217
  trace_id?: string | undefined;
200
218
  schema_version?: string | undefined;
219
+ chunk_complete?: boolean | undefined;
220
+ chunk_close_reason?: "100k_tokens" | "idle_2d" | undefined;
221
+ chunk_closed_at?: string | null | undefined;
201
222
  source_version?: string | null | undefined;
202
223
  submitted_by?: string | undefined;
203
224
  submitted_at?: string | undefined;
@@ -232,6 +253,9 @@ export declare const BatchSubmitSchema: z.ZodObject<{
232
253
  schema_version?: string | undefined;
233
254
  chunk_index?: number | undefined;
234
255
  chunk_start_turn?: number | undefined;
256
+ chunk_complete?: boolean | undefined;
257
+ chunk_close_reason?: "100k_tokens" | "idle_2d" | undefined;
258
+ chunk_closed_at?: string | null | undefined;
235
259
  source_version?: string | null | undefined;
236
260
  submitted_by?: string | undefined;
237
261
  submitted_at?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkChC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -6,6 +6,9 @@ export const NormalizedTraceSchema = z.object({
6
6
  source_session_id: z.string().min(1),
7
7
  chunk_index: z.number().int().nonnegative().default(0),
8
8
  chunk_start_turn: z.number().int().nonnegative().default(0),
9
+ chunk_complete: z.boolean().optional(),
10
+ chunk_close_reason: z.enum(["100k_tokens", "idle_2d"]).optional(),
11
+ chunk_closed_at: z.string().nullable().optional(),
9
12
  source_version: z.string().nullable().optional(),
10
13
  submitted_by: z.string().optional(),
11
14
  submitted_at: z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracemarketplace/shared",
3
- "version": "0.0.6",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -20,6 +20,10 @@
20
20
  "./types": {
21
21
  "import": "./dist/types.js",
22
22
  "types": "./dist/types.d.ts"
23
+ },
24
+ "./turn-actors": {
25
+ "import": "./dist/turn-actors.js",
26
+ "types": "./dist/turn-actors.d.ts"
23
27
  }
24
28
  },
25
29
  "scripts": {
package/src/chunker.ts CHANGED
@@ -69,14 +69,29 @@ export function chunkTrace(
69
69
  return [{ ...trace, chunk_index: 0, chunk_start_turn: 0 }];
70
70
  }
71
71
 
72
+ // If per-turn usage isn't populated, distribute total_output_tokens uniformly
73
+ // across assistant turns so the chunk boundary logic still fires correctly.
74
+ const perTurnSum = sumOutputTokens(trace.turns);
75
+ const turns: Turn[] = perTurnSum > 0
76
+ ? trace.turns
77
+ : (() => {
78
+ const assistantTurns = trace.turns.filter(t => t.role === "assistant").length || 1;
79
+ const tokensPerAssistantTurn = Math.ceil(totalOutput / assistantTurns);
80
+ return trace.turns.map(t =>
81
+ t.role === "assistant" && (t.usage?.output_tokens ?? 0) === 0
82
+ ? { ...t, usage: { input_tokens: t.usage?.input_tokens ?? 0, output_tokens: tokensPerAssistantTurn, cache_read_input_tokens: t.usage?.cache_read_input_tokens ?? null, cache_creation_input_tokens: t.usage?.cache_creation_input_tokens ?? null, reasoning_tokens: t.usage?.reasoning_tokens ?? null } } as Turn
83
+ : t
84
+ );
85
+ })();
86
+
72
87
  const chunks: NormalizedTrace[] = [];
73
88
  let chunkStartTurn = 0;
74
89
  let chunkOutputTokens = 0;
75
90
  let chunkTurns: Turn[] = [];
76
91
  let chunkIndex = 0;
77
92
 
78
- for (let i = 0; i < trace.turns.length; i++) {
79
- const turn = trace.turns[i];
93
+ for (let i = 0; i < turns.length; i++) {
94
+ const turn = turns[i];
80
95
 
81
96
  // Break at user-turn boundary once we've accumulated enough
82
97
  if (
@@ -0,0 +1,326 @@
1
+ import { describe, it, expect, beforeAll } from "vitest";
2
+ import { writeFileSync, mkdirSync } from "fs";
3
+ import { tmpdir } from "os";
4
+ import { join } from "path";
5
+ import { extractClaudeCode } from "./extractors/claude-code.js";
6
+
7
+ // Build a JSONL fixture on disk once, then test against it.
8
+ // The fixture exercises the key bugs that were fixed:
9
+ // 1. Chained assistant entries (thinking+tool_use) must be merged into one turn
10
+ // 2. Cache tokens (cache_creation + cache_read) must be included in total_input_tokens
11
+ // 3. Output tokens must be summed across all chain entries, not just the root
12
+
13
+ const FIXTURE_PATH = join(tmpdir(), "tracemp-extractor-test.jsonl");
14
+
15
+ const FIXTURE_LINES = [
16
+ // Skipped: file-history-snapshot
17
+ { type: "file-history-snapshot", messageId: "snap1", snapshot: {} },
18
+
19
+ // Turn 0 — user initial message (string content)
20
+ {
21
+ type: "user",
22
+ uuid: "u1",
23
+ parentUuid: null,
24
+ timestamp: "2024-01-01T00:00:00.000Z",
25
+ gitBranch: "main",
26
+ cwd: "/home/user/project",
27
+ message: { role: "user", content: "Please help me with a task" },
28
+ },
29
+
30
+ // Turn 1 — assistant: thinking (root) → tool_use (child), must MERGE
31
+ {
32
+ type: "assistant",
33
+ uuid: "a1",
34
+ parentUuid: "u1",
35
+ timestamp: "2024-01-01T00:00:01.000Z",
36
+ message: {
37
+ role: "assistant",
38
+ model: "claude-sonnet-4-5",
39
+ content: [{ type: "thinking", thinking: "Let me think..." }],
40
+ usage: {
41
+ input_tokens: 5,
42
+ cache_creation_input_tokens: 1000,
43
+ cache_read_input_tokens: 500,
44
+ output_tokens: 10,
45
+ },
46
+ },
47
+ },
48
+ {
49
+ type: "assistant",
50
+ uuid: "a2",
51
+ parentUuid: "a1",
52
+ timestamp: "2024-01-01T00:00:01.000Z",
53
+ message: {
54
+ role: "assistant",
55
+ model: "claude-sonnet-4-5",
56
+ content: [{ type: "tool_use", id: "tu1", name: "Bash", input: { command: "ls" } }],
57
+ usage: {
58
+ input_tokens: 5,
59
+ cache_creation_input_tokens: 1000,
60
+ cache_read_input_tokens: 500,
61
+ output_tokens: 25,
62
+ },
63
+ },
64
+ },
65
+
66
+ // Skipped: progress entries
67
+ { type: "progress", uuid: "p1", parentUuid: "a2" },
68
+ { type: "progress", uuid: "p2", parentUuid: "p1" },
69
+
70
+ // Turn 2 — user tool_result
71
+ {
72
+ type: "user",
73
+ uuid: "u2",
74
+ parentUuid: "a2",
75
+ timestamp: "2024-01-01T00:00:02.000Z",
76
+ message: {
77
+ role: "user",
78
+ content: [
79
+ {
80
+ type: "tool_result",
81
+ tool_use_id: "tu1",
82
+ content: [{ type: "text", text: "file1.ts\nfile2.ts" }],
83
+ is_error: false,
84
+ },
85
+ ],
86
+ },
87
+ },
88
+
89
+ // Turn 3 — assistant: text (root) → tool_use (child), must MERGE
90
+ {
91
+ type: "assistant",
92
+ uuid: "a3",
93
+ parentUuid: "u2",
94
+ timestamp: "2024-01-01T00:00:03.000Z",
95
+ message: {
96
+ role: "assistant",
97
+ model: "claude-sonnet-4-5",
98
+ content: [{ type: "text", text: "Here is what I found:" }],
99
+ usage: {
100
+ input_tokens: 3,
101
+ cache_creation_input_tokens: 0,
102
+ cache_read_input_tokens: 1500,
103
+ output_tokens: 8,
104
+ },
105
+ },
106
+ },
107
+ {
108
+ type: "assistant",
109
+ uuid: "a4",
110
+ parentUuid: "a3",
111
+ timestamp: "2024-01-01T00:00:03.000Z",
112
+ message: {
113
+ role: "assistant",
114
+ model: "claude-sonnet-4-5",
115
+ content: [{ type: "tool_use", id: "tu2", name: "Read", input: { file_path: "file1.ts" } }],
116
+ usage: {
117
+ input_tokens: 3,
118
+ cache_creation_input_tokens: 0,
119
+ cache_read_input_tokens: 1500,
120
+ output_tokens: 15,
121
+ },
122
+ },
123
+ },
124
+
125
+ // Turn 4 — user tool_result
126
+ {
127
+ type: "user",
128
+ uuid: "u3",
129
+ parentUuid: "a4",
130
+ timestamp: "2024-01-01T00:00:04.000Z",
131
+ message: {
132
+ role: "user",
133
+ content: [
134
+ {
135
+ type: "tool_result",
136
+ tool_use_id: "tu2",
137
+ content: [{ type: "text", text: "const x = 1;" }],
138
+ is_error: false,
139
+ },
140
+ ],
141
+ },
142
+ },
143
+
144
+ // Turn 5 — simple assistant text, no chain
145
+ {
146
+ type: "assistant",
147
+ uuid: "a5",
148
+ parentUuid: "u3",
149
+ timestamp: "2024-01-01T00:00:05.000Z",
150
+ message: {
151
+ role: "assistant",
152
+ model: "claude-sonnet-4-5",
153
+ content: [{ type: "text", text: "Done! The file contains a constant." }],
154
+ usage: {
155
+ input_tokens: 2,
156
+ cache_creation_input_tokens: 0,
157
+ cache_read_input_tokens: 2000,
158
+ output_tokens: 20,
159
+ },
160
+ },
161
+ },
162
+
163
+ // Skipped: last-prompt
164
+ { type: "last-prompt", uuid: "" },
165
+ ];
166
+
167
+ beforeAll(() => {
168
+ mkdirSync(tmpdir(), { recursive: true });
169
+ writeFileSync(
170
+ FIXTURE_PATH,
171
+ FIXTURE_LINES.map((l) => JSON.stringify(l)).join("\n") + "\n"
172
+ );
173
+ });
174
+
175
+ describe("extractClaudeCode", () => {
176
+ it("merges chained assistant entries into one turn", async () => {
177
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
178
+
179
+ // Should have 6 turns: user, assistant(merged), user, assistant(merged), user, assistant
180
+ expect(trace.turn_count).toBe(6);
181
+
182
+ // Roles must strictly alternate
183
+ const roles = trace.turns.map((t) => t.role);
184
+ for (let i = 1; i < roles.length; i++) {
185
+ expect(roles[i]).not.toBe(roles[i - 1]);
186
+ }
187
+
188
+ // Turn 1: thinking+tool_use merged from two chained entries
189
+ expect(trace.turns[1].role).toBe("assistant");
190
+ const t1Types = trace.turns[1].content.map((c) => c.type);
191
+ expect(t1Types).toContain("thinking");
192
+ expect(t1Types).toContain("tool_use");
193
+
194
+ // Turn 3: text+tool_use merged
195
+ expect(trace.turns[3].role).toBe("assistant");
196
+ const t3Types = trace.turns[3].content.map((c) => c.type);
197
+ expect(t3Types).toContain("text");
198
+ expect(t3Types).toContain("tool_use");
199
+ });
200
+
201
+ it("counts tool calls correctly", async () => {
202
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
203
+ expect(trace.tool_call_count).toBe(2);
204
+ });
205
+
206
+ it("includes cache tokens in total_input_tokens", async () => {
207
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
208
+
209
+ // Turn 1: input=5 + cache_create=1000 + cache_read=500 = 1505 (counted once, not twice)
210
+ // Turn 3: input=3 + cache_create=0 + cache_read=1500 = 1503
211
+ // Turn 5: input=2 + cache_create=0 + cache_read=2000 = 2002
212
+ // Total: 1505 + 1503 + 2002 = 5010
213
+ expect(trace.total_input_tokens).toBe(5010);
214
+ });
215
+
216
+ it("does not double-count input tokens from chained entries", async () => {
217
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
218
+
219
+ // Turn 1 root (a1) and child (a2) both carry the same input/cache usage (same API call).
220
+ // We must count it only once from the root.
221
+ // If double-counted: 1505 * 2 + 1503 + 2002 = 6010. Correct: 5010.
222
+ expect(trace.total_input_tokens).toBe(5010);
223
+ });
224
+
225
+ it("sums output tokens across all chain entries", async () => {
226
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
227
+
228
+ // Turn 1: root output=10 (thinking) + child output=25 (tool_use) = 35
229
+ // Turn 3: root output=8 (text) + child output=15 (tool_use) = 23
230
+ // Turn 5: output=20
231
+ // Total: 35 + 23 + 20 = 78
232
+ expect(trace.total_output_tokens).toBe(78);
233
+
234
+ // Turn 1's per-turn usage should also reflect the summed output
235
+ expect(trace.turns[1].usage?.output_tokens).toBe(35);
236
+ });
237
+
238
+ it("skips progress, file-history-snapshot, and last-prompt entries", async () => {
239
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
240
+ // All entries that should be skipped produce no turns
241
+ expect(trace.turn_count).toBe(6);
242
+ });
243
+
244
+ it("captures git branch and session metadata", async () => {
245
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
246
+ expect(trace.git_branch).toBe("main");
247
+ expect(trace.cwd_hash).toBeTruthy();
248
+ expect(trace.source_tool).toBe("claude_code");
249
+ expect(trace.submitted_by).toBe("test@test.com");
250
+ });
251
+
252
+ it("sets started_at and ended_at from first and last turn timestamps", async () => {
253
+ const trace = await extractClaudeCode(FIXTURE_PATH, "test@test.com");
254
+ expect(trace.started_at).toBe("2024-01-01T00:00:00.000Z");
255
+ expect(trace.ended_at).toBe("2024-01-01T00:00:05.000Z");
256
+ });
257
+
258
+ it("marks skill context chained off tool output as tool-authored", async () => {
259
+ const skillFixturePath = join(tmpdir(), "tracemp-extractor-skill-test.jsonl");
260
+ writeFileSync(
261
+ skillFixturePath,
262
+ [
263
+ {
264
+ type: "user",
265
+ uuid: "u1",
266
+ parentUuid: null,
267
+ timestamp: "2024-01-01T00:00:00.000Z",
268
+ message: { role: "user", content: "why is lazyvim failing" },
269
+ },
270
+ {
271
+ type: "assistant",
272
+ uuid: "a1",
273
+ parentUuid: "u1",
274
+ timestamp: "2024-01-01T00:00:01.000Z",
275
+ message: {
276
+ role: "assistant",
277
+ model: "claude-sonnet-4-5",
278
+ content: [{ type: "tool_use", id: "skill-1", name: "Skill", input: { skill_name: "trent-lazyvim" } }],
279
+ usage: {
280
+ input_tokens: 10,
281
+ cache_creation_input_tokens: 0,
282
+ cache_read_input_tokens: 0,
283
+ output_tokens: 5,
284
+ },
285
+ },
286
+ },
287
+ {
288
+ type: "user",
289
+ uuid: "u2",
290
+ parentUuid: "a1",
291
+ timestamp: "2024-01-01T00:00:02.000Z",
292
+ message: {
293
+ role: "user",
294
+ content: [
295
+ {
296
+ type: "tool_result",
297
+ tool_use_id: "skill-1",
298
+ content: [{ type: "text", text: "Launching skill: trent-lazyvim" }],
299
+ is_error: false,
300
+ },
301
+ ],
302
+ },
303
+ },
304
+ {
305
+ type: "user",
306
+ uuid: "u3",
307
+ parentUuid: "u2",
308
+ timestamp: "2024-01-01T00:00:03.000Z",
309
+ message: {
310
+ role: "user",
311
+ content: "Base directory for this skill: ~/.claude/skills/trent-lazyvim",
312
+ },
313
+ },
314
+ ].map((line) => JSON.stringify(line)).join("\n") + "\n",
315
+ );
316
+
317
+ const trace = await extractClaudeCode(skillFixturePath, "test@test.com");
318
+
319
+ expect(trace.turns.map((turn) => turn.actor)).toEqual([
320
+ "human",
321
+ "assistant",
322
+ "tool",
323
+ "tool",
324
+ ]);
325
+ });
326
+ });