@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.
- package/dist/chunker.d.ts.map +1 -1
- package/dist/chunker.js +14 -2
- package/dist/chunker.js.map +1 -1
- package/dist/extractor-claude-code.test.d.ts +2 -0
- package/dist/extractor-claude-code.test.d.ts.map +1 -0
- package/dist/extractor-claude-code.test.js +290 -0
- package/dist/extractor-claude-code.test.js.map +1 -0
- package/dist/extractor-codex.test.d.ts +2 -0
- package/dist/extractor-codex.test.d.ts.map +1 -0
- package/dist/extractor-codex.test.js +212 -0
- package/dist/extractor-codex.test.js.map +1 -0
- package/dist/extractor-cursor.test.d.ts +2 -0
- package/dist/extractor-cursor.test.d.ts.map +1 -0
- package/dist/extractor-cursor.test.js +120 -0
- package/dist/extractor-cursor.test.js.map +1 -0
- package/dist/extractors/claude-code.d.ts.map +1 -1
- package/dist/extractors/claude-code.js +172 -73
- package/dist/extractors/claude-code.js.map +1 -1
- package/dist/extractors/codex.d.ts.map +1 -1
- package/dist/extractors/codex.js +63 -35
- package/dist/extractors/codex.js.map +1 -1
- package/dist/extractors/common.d.ts +14 -0
- package/dist/extractors/common.d.ts.map +1 -0
- package/dist/extractors/common.js +100 -0
- package/dist/extractors/common.js.map +1 -0
- package/dist/extractors/cursor.d.ts.map +1 -1
- package/dist/extractors/cursor.js +205 -45
- package/dist/extractors/cursor.js.map +1 -1
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +35 -2
- package/dist/hash.js.map +1 -1
- package/dist/hash.test.js +29 -2
- package/dist/hash.test.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/redact.d.ts +12 -0
- package/dist/redact.d.ts.map +1 -1
- package/dist/redact.js +120 -38
- package/dist/redact.js.map +1 -1
- package/dist/redact.test.d.ts +2 -0
- package/dist/redact.test.d.ts.map +1 -0
- package/dist/redact.test.js +96 -0
- package/dist/redact.test.js.map +1 -0
- package/dist/turn-actors.d.ts +3 -0
- package/dist/turn-actors.d.ts.map +1 -0
- package/dist/turn-actors.js +57 -0
- package/dist/turn-actors.js.map +1 -0
- package/dist/turn-actors.test.d.ts +2 -0
- package/dist/turn-actors.test.d.ts.map +1 -0
- package/dist/turn-actors.test.js +65 -0
- package/dist/turn-actors.test.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -0
- package/dist/utils.js.map +1 -1
- package/dist/validators.d.ts +24 -0
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +3 -0
- package/dist/validators.js.map +1 -1
- package/package.json +5 -1
- package/src/chunker.ts +17 -2
- package/src/extractor-claude-code.test.ts +326 -0
- package/src/extractor-codex.test.ts +225 -0
- package/src/extractor-cursor.test.ts +141 -0
- package/src/extractors/claude-code.ts +180 -69
- package/src/extractors/codex.ts +69 -38
- package/src/extractors/common.ts +139 -0
- package/src/extractors/cursor.ts +294 -52
- package/src/hash.test.ts +31 -2
- package/src/hash.ts +38 -3
- package/src/index.ts +1 -0
- package/src/redact.test.ts +100 -0
- package/src/redact.ts +175 -58
- package/src/turn-actors.test.ts +71 -0
- package/src/turn-actors.ts +71 -0
- package/src/types.ts +6 -0
- package/src/utils.ts +3 -1
- package/src/validators.ts +3 -0
package/dist/validators.d.ts
CHANGED
|
@@ -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;
|
package/dist/validators.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/validators.js
CHANGED
|
@@ -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(),
|
package/dist/validators.js.map
CHANGED
|
@@ -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.
|
|
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 <
|
|
79
|
-
const turn =
|
|
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
|
+
});
|