@uvl000/claude-trace 4.0.0 → 4.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.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Record API traffic from **Claude Code**, **OpenCode**, **Codex CLI**, and allowlisted LLM endpoints through a standalone forward proxy. Inspect everything the tools hide — system prompts, tool outputs, thinking blocks, and raw request/response data — in a self-contained HTML viewer.
6
6
 
7
- **Fork of [mariozechner/claude-trace](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace)**, extended with [Claude Code V2+](https://docs.anthropic.com/en/docs/claude-code) native-binary support, a dedicated **[OpenCode](https://opencode.ai)** CLI with multi-provider interception (Anthropic and OpenAI API formats), and **[Codex CLI](https://developers.openai.com/codex/cli) ChatGPT OAuth** tracing (login via ChatGPT account — the default Codex auth path for most users).
7
+ **Fork lineage:** this repository is forked from [hanqunfeng/claude-trace](https://github.com/hanqunfeng/claude-trace), which was itself forked from [badlogic/lemmy's claude-trace](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace). It extends the project with [Claude Code V2+](https://docs.anthropic.com/en/docs/claude-code) native-binary support, a dedicated **[OpenCode](https://opencode.ai)** CLI with multi-provider interception (Anthropic and OpenAI API formats), and **[Codex CLI](https://developers.openai.com/codex/cli) ChatGPT OAuth** tracing (login via ChatGPT account — the default Codex auth path for most users).
8
8
 
9
9
  ## Proxy modes (forward & reverse)
10
10
 
@@ -55,7 +55,7 @@ npm install -g @uvl000/claude-trace
55
55
  ### From source
56
56
 
57
57
  ```bash
58
- git clone https://github.com/hanqunfeng/claude-trace.git
58
+ git clone https://github.com/FlyingFish-233/claude-trace.git
59
59
  cd claude-trace
60
60
  npm run setup # installs root + frontend dependencies
61
61
  npm run build
@@ -427,6 +427,18 @@ codex-trace --index
427
427
 
428
428
  Scans log files, summarizes meaningful conversations via Claude CLI, and generates a searchable `index.html`. **Note:** indexing uses additional API tokens.
429
429
 
430
+ ### OpenAI SFT export
431
+
432
+ ```bash
433
+ claude-trace-export-openai --input /path/to/run-a --input /path/to/run-b/trace.jsonl --output sft.jsonl [--diagnostics diagnostics.json]
434
+ ```
435
+
436
+ Directory inputs are searched recursively for `trace.jsonl`. The command refuses to overwrite existing output and creates only the JSONL file by default. Use `--diagnostics FILE` to save request-level diagnostics; skipped and duplicate requests are also reported in the command output. Each JSONL row contains `messages`, `tools`, and `metadata`. Historical messages have `trainable: false`; each captured assistant response has `trainable: true` and a corresponding entry in `metadata.response_sources`.
437
+
438
+ Inline system messages are merged into the leading system message, and Claude Code billing-header text blocks are omitted, matching vLLM's Anthropic-to-OpenAI conversion. To render the final request prompt, apply the chat template to `messages.slice(0, -1)` with `tools` and `add_generation_prompt=true`; the final assistant response remains in the SFT trajectory.
439
+
440
+ Only successful `POST /v1/messages` exchanges become training targets. History changes, including compaction, create separate rows; output from a segment ending at a history break may contain tool calls without subsequent tool results. The exporter uses only HTTP traces, does not read Claude session files, and does not generate token-level loss masks.
441
+
430
442
  ## Requirements
431
443
 
432
444
  - Node.js 16+ (Node.js 22+ recommended for full Codex OAuth request-body display in logs)
@@ -474,4 +486,4 @@ Maintainer and contributor docs live under [`doc/`](doc/):
474
486
 
475
487
  ## License
476
488
 
477
- MIT — originally by [Mario Zechner](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace), based on [@hanqunfeng/claude-trace](https://github.com/hanqunfeng/claude-trace), and packaged for WorkflowExp as `@uvl000/claude-trace`.
489
+ MIT — maintained at [FlyingFish-233/claude-trace](https://github.com/FlyingFish-233/claude-trace), forked from [hanqunfeng/claude-trace](https://github.com/hanqunfeng/claude-trace), which was forked from [badlogic/lemmy's claude-trace](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace).
package/README.zh-CN.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  记录 **Claude Code**、**OpenCode**、**Codex CLI** 以及通过独立正向代理接入的指定大模型端点 API 流量。在自包含 HTML 查看器中查看系统提示词、工具输出、思考块以及完整请求/响应数据。
6
6
 
7
- **[mariozechner/claude-trace](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace) 的分支版本**,扩展支持 [Claude Code V2+](https://docs.anthropic.com/en/docs/claude-code) 原生二进制、独立的 **[OpenCode](https://opencode.ai)** 命令(多 provider 拦截,Anthropic 与 OpenAI API 格式),以及 **[Codex CLI](https://developers.openai.com/codex/cli) ChatGPT OAuth** 追踪(通过 ChatGPT 账号登录 —— 多数用户的默认 Codex 认证方式)。
7
+ **Fork 来源:** 本仓库从 [hanqunfeng/claude-trace](https://github.com/hanqunfeng/claude-trace) fork,而该仓库又从 [badlogic/lemmy 中的 claude-trace](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace) fork。本项目在此基础上扩展支持 [Claude Code V2+](https://docs.anthropic.com/en/docs/claude-code) 原生二进制、独立的 **[OpenCode](https://opencode.ai)** 命令(多 provider 拦截,Anthropic 与 OpenAI API 格式),以及 **[Codex CLI](https://developers.openai.com/codex/cli) ChatGPT OAuth** 追踪(通过 ChatGPT 账号登录 —— 多数用户的默认 Codex 认证方式)。
8
8
 
9
9
  ## 代理模式总览(正向代理 & 反向代理)
10
10
 
@@ -55,7 +55,7 @@ npm install -g @uvl000/claude-trace
55
55
  ### 从源码安装
56
56
 
57
57
  ```bash
58
- git clone https://github.com/hanqunfeng/claude-trace.git
58
+ git clone https://github.com/FlyingFish-233/claude-trace.git
59
59
  cd claude-trace
60
60
  npm run setup # 安装根目录 + frontend 依赖
61
61
  npm run build
@@ -427,6 +427,18 @@ codex-trace --index
427
427
 
428
428
  扫描日志文件,通过 Claude CLI 为有意义会话生成摘要,并输出可搜索的 `index.html`。**注意:** 索引会产生额外 API token 消耗。
429
429
 
430
+ ### 导出 OpenAI SFT 轨迹
431
+
432
+ ```bash
433
+ claude-trace-export-openai --input /path/to/run-a --input /path/to/run-b/trace.jsonl --output sft.jsonl [--diagnostics diagnostics.json]
434
+ ```
435
+
436
+ 目录输入会递归查找 `trace.jsonl`。已有输出不会被覆盖;默认只生成 JSONL 文件。需要保存逐请求诊断时传入 `--diagnostics FILE`;跳过和去重的请求也会在命令输出中报告。每行包含 `messages`、`tools` 和 `metadata`。历史消息标记 `trainable: false`,实际响应标记 `trainable: true`,其来源记录在 `metadata.response_sources` 中。
437
+
438
+ 导出器会把内联 system 消息合并到开头的 system 消息,并过滤 Claude Code 的计费标头文本块,与 vLLM 的 Anthropic-to-OpenAI 转换保持一致。要渲染最后一次请求的 prompt,使用 `messages.slice(0, -1)`、`tools` 和 `add_generation_prompt=true`;最后一条 assistant 响应仍保留在 SFT 轨迹中。
439
+
440
+ 只有成功的 `POST /v1/messages` 请求会成为训练目标。压缩等历史变化会新建轨迹;若轨迹因历史断裂而结束,末尾工具调用可能没有后续工具结果。导出仅使用 HTTP trace,不读取 Claude session 文件,也不生成 token 级 loss mask。
441
+
430
442
  ## 环境要求
431
443
 
432
444
  - Node.js 16+(Codex OAuth 请求体完整日志展示建议 Node.js 22+)
@@ -474,4 +486,4 @@ npm run test:unit
474
486
 
475
487
  ## 许可证
476
488
 
477
- MIT — 原作者 [Mario Zechner](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace),基于 [@hanqunfeng/claude-trace](https://github.com/hanqunfeng/claude-trace),并以 `@uvl000/claude-trace` 为 WorkflowExp 打包发布。
489
+ MIT — 当前维护于 [FlyingFish-233/claude-trace](https://github.com/FlyingFish-233/claude-trace),fork 自 [hanqunfeng/claude-trace](https://github.com/hanqunfeng/claude-trace),而后者 fork 自 [badlogic/lemmy 中的 claude-trace](https://github.com/badlogic/lemmy/tree/main/apps/claude-trace)。
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=export-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-openai.d.ts","sourceRoot":"","sources":["../../src/cli/export-openai.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const openai_1 = require("../export/openai");
5
+ async function main(args) {
6
+ const inputs = [];
7
+ let output;
8
+ let diagnostics;
9
+ for (let index = 0; index < args.length; index++) {
10
+ if (args[index] === "--input" && args[index + 1])
11
+ inputs.push(args[++index]);
12
+ else if (args[index] === "--output" && args[index + 1] && !output)
13
+ output = args[++index];
14
+ else if (args[index] === "--diagnostics" && args[index + 1] && !diagnostics)
15
+ diagnostics = args[++index];
16
+ else if (args[index] === "--help" || args[index] === "-h") {
17
+ console.log("Usage: claude-trace-export-openai --input PATH [--input PATH ...] --output FILE [--diagnostics FILE]");
18
+ return;
19
+ }
20
+ else
21
+ throw new Error(`unknown or incomplete argument: ${args[index]}`);
22
+ }
23
+ if (!output || inputs.length === 0)
24
+ throw new Error("--input and --output are required");
25
+ const result = await (0, openai_1.exportOpenAI)(inputs, output, diagnostics);
26
+ console.log(`Exported ${result.counts.trajectories} trajectories from ${result.counts.assigned || 0} requests`);
27
+ for (const entry of result.requests) {
28
+ if (entry.status !== "assigned")
29
+ console.warn(`${entry.status}: ${entry.source.file}:${entry.source.line} (${entry.reason || "unknown"})`);
30
+ }
31
+ if (diagnostics)
32
+ console.log(`Diagnostics: ${diagnostics}`);
33
+ }
34
+ if (require.main === module) {
35
+ main(process.argv.slice(2)).catch((error) => {
36
+ console.error(error.message);
37
+ process.exitCode = 1;
38
+ });
39
+ }
40
+ //# sourceMappingURL=export-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-openai.js","sourceRoot":"","sources":["../../src/cli/export-openai.ts"],"names":[],"mappings":";;;AAEA,6CAAgD;AAEhD,KAAK,UAAU,IAAI,CAAC,IAAc;IACjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAA0B,CAAC;IAC/B,IAAI,WAA+B,CAAC;IACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;aACxE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;aACrF,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW;YAAE,WAAW,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;aACpG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;YACpH,OAAO;QACR,CAAC;;YAAM,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAY,EAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,YAAY,sBAAsB,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC;IAChH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC;IAC5I,CAAC;IACD,IAAI,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3C,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ type JsonObject = Record<string, any>;
2
+ export interface SourceLocation {
3
+ file: string;
4
+ line: number;
5
+ request_time: string;
6
+ }
7
+ export interface ExportedMessage extends JsonObject {
8
+ role: string;
9
+ trainable: boolean;
10
+ }
11
+ export interface ExportedTrajectory {
12
+ messages: ExportedMessage[];
13
+ tools: JsonObject[];
14
+ metadata: {
15
+ chain_id: string;
16
+ header_session_ids: string[];
17
+ segment_reason: string;
18
+ parent_trace_id: null;
19
+ relation_status: "unknown";
20
+ rounds: Array<SourceLocation & {
21
+ model: unknown;
22
+ parameters: JsonObject;
23
+ }>;
24
+ response_sources: SourceLocation[];
25
+ };
26
+ }
27
+ export interface DiagnosticEntry {
28
+ source: SourceLocation;
29
+ status: "assigned" | "skipped" | "duplicate";
30
+ chain_id?: string;
31
+ reason?: string;
32
+ duplicate_of?: SourceLocation;
33
+ }
34
+ export interface ExportDiagnostics {
35
+ trace_files: string[];
36
+ counts: Record<string, number>;
37
+ requests: DiagnosticEntry[];
38
+ }
39
+ export declare function exportOpenAI(inputPaths: string[], outputPath: string, diagnosticsOutputPath?: string): Promise<ExportDiagnostics>;
40
+ export {};
41
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/export/openai.ts"],"names":[],"mappings":"AAMA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,IAAI,CAAC;QACtB,eAAe,EAAE,SAAS,CAAC;QAC3B,MAAM,EAAE,KAAK,CAAC,cAAc,GAAG;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,UAAU,EAAE,UAAU,CAAA;SAAE,CAAC,CAAC;QAC3E,gBAAgB,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;CACF;AAED,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,cAAc,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC5B;AAqQD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0HvI"}
@@ -0,0 +1,458 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.exportOpenAI = exportOpenAI;
37
+ const crypto = __importStar(require("node:crypto"));
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const readline = __importStar(require("node:readline"));
41
+ function stable(value) {
42
+ if (Array.isArray(value))
43
+ return value.map(stable);
44
+ if (value && typeof value === "object") {
45
+ return Object.fromEntries(Object.keys(value).filter((key) => key !== "cache_control" && !(key === "signature" && value[key] === "")).sort()
46
+ .map((key) => [key, stable(value[key])]));
47
+ }
48
+ return value;
49
+ }
50
+ function normalizeContent(content) {
51
+ if (typeof content === "string")
52
+ return content;
53
+ if (Array.isArray(content)) {
54
+ if (content.every((block) => block?.type === "text" && typeof block.text === "string")) {
55
+ return content.map((block) => block.text).join("");
56
+ }
57
+ return content.map((block) => {
58
+ if (block?.type === "tool_result") {
59
+ return stable({ ...block, content: normalizeContent(block.content) });
60
+ }
61
+ return stable(block);
62
+ });
63
+ }
64
+ return stable(content);
65
+ }
66
+ function normalizeMessage(message) {
67
+ return stable({ role: message.role, content: normalizeContent(message.content) });
68
+ }
69
+ function key(value) {
70
+ return JSON.stringify(stable(value));
71
+ }
72
+ function requestTime(value) {
73
+ return new Date(value < 1000000000000 ? value * 1000 : value).toISOString();
74
+ }
75
+ function isMessagesRequest(pair) {
76
+ if (pair.request?.method?.toUpperCase() !== "POST")
77
+ return false;
78
+ try {
79
+ return new URL(pair.request.url).pathname.replace(/\/+$/, "").endsWith("/v1/messages");
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ function collectTraceFiles(inputPaths) {
86
+ const files = new Set();
87
+ const directories = new Set();
88
+ function visit(input) {
89
+ const resolved = fs.realpathSync(input);
90
+ const stat = fs.statSync(resolved);
91
+ if (stat.isDirectory()) {
92
+ if (directories.has(resolved))
93
+ return;
94
+ directories.add(resolved);
95
+ for (const child of fs.readdirSync(resolved).sort())
96
+ visit(path.join(resolved, child));
97
+ }
98
+ else if (stat.isFile() && path.basename(resolved) === "trace.jsonl") {
99
+ files.add(resolved);
100
+ }
101
+ else if (stat.isFile() && inputPaths.some((candidate) => path.resolve(candidate) === path.resolve(input))) {
102
+ throw new Error(`input file must be named trace.jsonl: ${input}`);
103
+ }
104
+ }
105
+ for (const input of inputPaths)
106
+ visit(input);
107
+ return [...files].sort();
108
+ }
109
+ function parsedEvents(pair) {
110
+ const response = pair.response;
111
+ if (!response)
112
+ return [];
113
+ if (Array.isArray(response.events) && response.events.length) {
114
+ return response.events.map((event) => event.data).filter((data) => Boolean(data && typeof data === "object"));
115
+ }
116
+ const raw = response.body_raw;
117
+ if (!raw)
118
+ return [];
119
+ const events = [];
120
+ for (const line of raw.split(/\r?\n/)) {
121
+ if (!line.startsWith("data:"))
122
+ continue;
123
+ const data = line.slice(5).trim();
124
+ if (!data || data === "[DONE]")
125
+ continue;
126
+ try {
127
+ events.push(JSON.parse(data));
128
+ }
129
+ catch {
130
+ throw new Error("invalid SSE JSON");
131
+ }
132
+ }
133
+ return events;
134
+ }
135
+ function responseMessage(pair) {
136
+ const response = pair.response;
137
+ if (!response)
138
+ throw new Error("missing_response");
139
+ if (response.status_code < 200 || response.status_code >= 300)
140
+ throw new Error(`http_${response.status_code}`);
141
+ const events = parsedEvents(pair);
142
+ if (!events.length && response.body?.role === "assistant" && Array.isArray(response.body.content))
143
+ return response.body;
144
+ if (!events.some((event) => event.type === "message_start") || !events.some((event) => event.type === "message_stop")) {
145
+ throw new Error("unparseable_stream_response");
146
+ }
147
+ const blocks = [];
148
+ const active = new Map();
149
+ const toolInputs = new Map();
150
+ for (const event of events) {
151
+ if (event.type === "error")
152
+ throw new Error("stream_error");
153
+ if (event.type === "content_block_start") {
154
+ const block = { ...event.content_block };
155
+ blocks.push(block);
156
+ active.set(event.index, block);
157
+ }
158
+ if (event.type === "content_block_delta") {
159
+ const block = active.get(event.index);
160
+ if (!block)
161
+ throw new Error("stream_delta_without_block");
162
+ const delta = event.delta;
163
+ if (delta.type === "text_delta")
164
+ block.text = (block.text || "") + delta.text;
165
+ if (delta.type === "thinking_delta")
166
+ block.thinking = (block.thinking || "") + delta.thinking;
167
+ if (delta.type === "signature_delta")
168
+ block.signature = (block.signature || "") + delta.signature;
169
+ if (delta.type === "input_json_delta")
170
+ toolInputs.set(block, (toolInputs.get(block) || "") + delta.partial_json);
171
+ }
172
+ if (event.type === "content_block_stop") {
173
+ const block = active.get(event.index);
174
+ if (block?.type === "tool_use" && toolInputs.has(block)) {
175
+ try {
176
+ block.input = JSON.parse(toolInputs.get(block));
177
+ }
178
+ catch {
179
+ const parsedBlock = response.body?.content?.find((item) => item.type === "tool_use" && item.id === block.id);
180
+ if (!parsedBlock || typeof parsedBlock.input !== "object")
181
+ throw new Error("invalid_stream_tool_json");
182
+ block.input = parsedBlock.input;
183
+ }
184
+ }
185
+ active.delete(event.index);
186
+ }
187
+ }
188
+ if (!blocks.length)
189
+ throw new Error("empty_stream_response");
190
+ return { role: "assistant", content: blocks };
191
+ }
192
+ function textContent(value) {
193
+ if (typeof value === "string")
194
+ return value;
195
+ if (Array.isArray(value) && value.every((block) => block?.type === "text")) {
196
+ return value.map((block) => block.text || "").join("");
197
+ }
198
+ if (value == null)
199
+ return "";
200
+ return JSON.stringify(value);
201
+ }
202
+ function systemBlocks(value) {
203
+ if (!Array.isArray(value))
204
+ return [];
205
+ return value.filter((block) => block?.type === "text" && typeof block.text === "string"
206
+ && block.text && !block.text.startsWith("x-anthropic-billing-header"))
207
+ .map((block) => block.text);
208
+ }
209
+ function effectiveSystem(body) {
210
+ const parts = typeof body.system === "string" ? [body.system] : systemBlocks(body.system);
211
+ for (const message of body.messages) {
212
+ if (message.role !== "system")
213
+ continue;
214
+ if (typeof message.content === "string") {
215
+ if (message.content && !message.content.startsWith("x-anthropic-billing-header"))
216
+ parts.push(message.content);
217
+ }
218
+ else
219
+ parts.push(...systemBlocks(message.content));
220
+ }
221
+ return parts.join("");
222
+ }
223
+ function convertMessage(message, trainable) {
224
+ if (message.role === "system")
225
+ return [{ role: "system", content: textContent(message.content), trainable }];
226
+ if (message.role === "assistant") {
227
+ const blocks = typeof message.content === "string" ? [{ type: "text", text: message.content }] : message.content;
228
+ if (!Array.isArray(blocks))
229
+ throw new Error("invalid_assistant_content");
230
+ const output = { role: "assistant", content: "", trainable };
231
+ const texts = [];
232
+ const thoughts = [];
233
+ const calls = [];
234
+ for (const block of blocks) {
235
+ if (block.type === "text")
236
+ texts.push(block.text || "");
237
+ else if (block.type === "thinking")
238
+ thoughts.push(block.thinking || "");
239
+ else if (block.type === "tool_use") {
240
+ if (!block.id || !block.name)
241
+ throw new Error("invalid_tool_use");
242
+ calls.push({ id: block.id, type: "function", function: { name: block.name, arguments: block.input ?? {} } });
243
+ }
244
+ else if (block.type === "redacted_thinking") {
245
+ output.redacted_thinking = [...(output.redacted_thinking || []), block.data];
246
+ }
247
+ else
248
+ throw new Error(`unsupported_assistant_block_${block.type}`);
249
+ }
250
+ output.content = texts.join("");
251
+ if (thoughts.length)
252
+ output.reasoning_content = thoughts.join("");
253
+ if (calls.length)
254
+ output.tool_calls = calls;
255
+ return [output];
256
+ }
257
+ if (message.role === "user") {
258
+ if (typeof message.content === "string")
259
+ return [{ role: "user", content: message.content, trainable }];
260
+ if (!Array.isArray(message.content))
261
+ throw new Error("invalid_user_content");
262
+ const output = [];
263
+ let text = "";
264
+ for (const block of message.content) {
265
+ if (block.type === "text")
266
+ text += block.text || "";
267
+ else if (block.type === "tool_result") {
268
+ if (!block.tool_use_id)
269
+ throw new Error("invalid_tool_result");
270
+ output.push({ role: "tool", tool_call_id: block.tool_use_id, content: textContent(block.content), trainable });
271
+ }
272
+ else
273
+ throw new Error(`unsupported_user_block_${block.type}`);
274
+ }
275
+ if (text || output.length === 0)
276
+ output.push({ role: "user", content: text, trainable });
277
+ return output;
278
+ }
279
+ throw new Error(`unsupported_role_${message.role}`);
280
+ }
281
+ function convertTools(tools) {
282
+ if (!Array.isArray(tools))
283
+ return [];
284
+ return tools.map((tool) => ({
285
+ type: "function",
286
+ function: { name: tool.name, description: tool.description || "", parameters: tool.input_schema || {} },
287
+ }));
288
+ }
289
+ function compactionMarkers(body) {
290
+ const contents = [body.system, ...body.messages.map((message) => message.content)];
291
+ return contents.map((content) => textContent(content)).filter((content) => /<summary>|<conversation_summary>|conversation (?:has been|was) compacted|summary of the conversation so far|this session is being continued from a previous conversation/i.test(content));
292
+ }
293
+ function unmatchedToolResults(messages) {
294
+ const calls = new Set();
295
+ let unmatched = 0;
296
+ for (const message of messages) {
297
+ for (const block of Array.isArray(message.content) ? message.content : []) {
298
+ if (block.type === "tool_use" && block.id)
299
+ calls.add(block.id);
300
+ if (block.type === "tool_result" && !calls.has(block.tool_use_id))
301
+ unmatched++;
302
+ }
303
+ }
304
+ return unmatched;
305
+ }
306
+ function prefixMatches(old, next) {
307
+ return old.length < next.length && old.every((message, index) => key(normalizeMessage(message)) === key(normalizeMessage(next[index])));
308
+ }
309
+ function responseMatches(response, message) {
310
+ return key(normalizeMessage(response)) === key(normalizeMessage(message));
311
+ }
312
+ function parameters(body) {
313
+ const { messages: _messages, system: _system, tools: _tools, metadata: _metadata, ...remaining } = body;
314
+ return stable(remaining);
315
+ }
316
+ function bump(counts, name, amount = 1) {
317
+ counts[name] = (counts[name] || 0) + amount;
318
+ }
319
+ async function exportOpenAI(inputPaths, outputPath, diagnosticsOutputPath) {
320
+ if (!inputPaths.length)
321
+ throw new Error("at least one --input is required");
322
+ const output = path.resolve(outputPath);
323
+ const diagnosticsPath = diagnosticsOutputPath ? path.resolve(diagnosticsOutputPath) : null;
324
+ if (diagnosticsPath === output)
325
+ throw new Error("diagnostics path must differ from output");
326
+ if (fs.existsSync(output) || (diagnosticsPath && fs.existsSync(diagnosticsPath)))
327
+ throw new Error("output or diagnostics file already exists");
328
+ const files = collectTraceFiles(inputPaths);
329
+ if (!files.length)
330
+ throw new Error("no trace.jsonl files found");
331
+ const diagnostics = { trace_files: files, counts: {}, requests: [] };
332
+ const exchanges = [];
333
+ let sequence = 0;
334
+ for (const file of files) {
335
+ const lines = readline.createInterface({ input: fs.createReadStream(file, { encoding: "utf8" }), crlfDelay: Infinity });
336
+ let line = 0;
337
+ for await (const raw of lines) {
338
+ line++;
339
+ if (!raw.trim())
340
+ continue;
341
+ let pair;
342
+ try {
343
+ pair = JSON.parse(raw);
344
+ }
345
+ catch {
346
+ bump(diagnostics.counts, "invalid_json");
347
+ diagnostics.requests.push({ source: { file, line, request_time: "unknown" }, status: "skipped", reason: "invalid_json" });
348
+ continue;
349
+ }
350
+ if (!pair?.request || !isMessagesRequest(pair))
351
+ continue;
352
+ const timestamp = Number(pair.request.timestamp);
353
+ if (!Number.isFinite(timestamp)) {
354
+ bump(diagnostics.counts, "invalid_timestamp");
355
+ diagnostics.requests.push({ source: { file, line, request_time: "unknown" }, status: "skipped", reason: "invalid_timestamp" });
356
+ continue;
357
+ }
358
+ exchanges.push({ pair, source: { file, line, request_time: requestTime(timestamp) }, sequence: sequence++ });
359
+ }
360
+ }
361
+ exchanges.sort((a, b) => Number(a.pair.request.timestamp) - Number(b.pair.request.timestamp) || a.sequence - b.sequence);
362
+ const chains = [];
363
+ const seen = new Map();
364
+ for (const exchange of exchanges) {
365
+ const { pair, source } = exchange;
366
+ const identity = crypto.createHash("sha256").update(key({ timestamp: pair.request.timestamp, url: pair.request.url, body: pair.request.body })).digest("hex");
367
+ const first = seen.get(identity);
368
+ if (first) {
369
+ bump(diagnostics.counts, "duplicate");
370
+ diagnostics.requests.push({ source, status: "duplicate", duplicate_of: first, reason: "duplicate_request" });
371
+ continue;
372
+ }
373
+ let response;
374
+ try {
375
+ response = responseMessage(pair);
376
+ }
377
+ catch (error) {
378
+ const reason = error.message;
379
+ bump(diagnostics.counts, reason);
380
+ diagnostics.requests.push({ source, status: "skipped", reason });
381
+ continue;
382
+ }
383
+ const body = pair.request.body;
384
+ if (!body || !Array.isArray(body.messages)) {
385
+ bump(diagnostics.counts, "invalid_request_messages");
386
+ diagnostics.requests.push({ source, status: "skipped", reason: "invalid_request_messages" });
387
+ continue;
388
+ }
389
+ const system = effectiveSystem(body);
390
+ const systemKey = key(system);
391
+ const toolsKey = key(body.tools || []);
392
+ const prefixCandidates = chains.filter((chain) => prefixMatches(chain.lastRequest, body.messages));
393
+ const candidates = prefixCandidates.filter((chain) => chain.systemKey === systemKey && chain.toolsKey === toolsKey
394
+ && responseMatches(chain.lastResponse, body.messages[chain.lastRequest.length]));
395
+ const longest = Math.max(0, ...candidates.map((chain) => chain.lastRequest.length));
396
+ const best = candidates.filter((chain) => chain.lastRequest.length === longest);
397
+ const chosen = best.length === 1 ? best[0] : null;
398
+ const markers = compactionMarkers(body);
399
+ const hasNewCompactionMarker = markers.some((marker) => !chains.some((chain) => chain.compactionMarkers.has(marker)));
400
+ const reason = chosen ? "continued" : best.length > 1 ? "ambiguous_prefix"
401
+ : hasNewCompactionMarker ? "compaction"
402
+ : prefixCandidates.some((chain) => chain.systemKey !== systemKey || chain.toolsKey !== toolsKey)
403
+ ? "system_or_tools_changed" : chains.length ? "divergent_history" : "initial";
404
+ if (!chosen && prefixCandidates.length)
405
+ bump(diagnostics.counts, "prefix_conflicts");
406
+ try {
407
+ const appended = chosen
408
+ ? body.messages.slice(chosen.lastRequest.length + 1).filter((message) => message.role !== "system")
409
+ .flatMap((message) => convertMessage(message, false))
410
+ : [
411
+ ...(system ? [{ role: "system", content: system, trainable: false }] : []),
412
+ ...body.messages.filter((message) => message.role !== "system")
413
+ .flatMap((message) => convertMessage(message, false)),
414
+ ];
415
+ const answer = convertMessage(response, true);
416
+ const chain = chosen || {
417
+ record: {
418
+ messages: [], tools: convertTools(body.tools),
419
+ metadata: { chain_id: `chain-${String(chains.length).padStart(4, "0")}`, header_session_ids: [],
420
+ segment_reason: reason, parent_trace_id: null, relation_status: "unknown", rounds: [], response_sources: [] },
421
+ },
422
+ lastRequest: [], lastResponse: null, systemKey, toolsKey, compactionMarkers: new Set(),
423
+ };
424
+ if (!chosen)
425
+ chains.push(chain);
426
+ chain.record.messages.push(...appended, ...answer);
427
+ chain.lastRequest = body.messages;
428
+ chain.lastResponse = response;
429
+ for (const marker of markers)
430
+ chain.compactionMarkers.add(marker);
431
+ const sessionId = Object.entries(pair.request.headers || {}).find(([name]) => name.toLowerCase() === "x-claude-code-session-id")?.[1];
432
+ if (sessionId && !chain.record.metadata.header_session_ids.includes(sessionId))
433
+ chain.record.metadata.header_session_ids.push(sessionId);
434
+ chain.record.metadata.rounds.push({ ...source, model: body.model ?? null, parameters: parameters(body) });
435
+ chain.record.metadata.response_sources.push(source);
436
+ seen.set(identity, source);
437
+ bump(diagnostics.counts, "assigned");
438
+ bump(diagnostics.counts, reason);
439
+ const mismatch = unmatchedToolResults(body.messages);
440
+ if (mismatch)
441
+ bump(diagnostics.counts, "unmatched_tool_results", mismatch);
442
+ diagnostics.requests.push({ source, status: "assigned", chain_id: chain.record.metadata.chain_id, reason });
443
+ }
444
+ catch (error) {
445
+ const failure = error.message;
446
+ bump(diagnostics.counts, failure);
447
+ diagnostics.requests.push({ source, status: "skipped", reason: failure });
448
+ }
449
+ }
450
+ diagnostics.counts.trace_files = files.length;
451
+ diagnostics.counts.message_requests = exchanges.length;
452
+ diagnostics.counts.trajectories = chains.length;
453
+ fs.writeFileSync(output, chains.map((chain) => JSON.stringify(chain.record)).join("\n") + (chains.length ? "\n" : ""), { flag: "wx" });
454
+ if (diagnosticsPath)
455
+ fs.writeFileSync(diagnosticsPath, JSON.stringify(diagnostics, null, 2) + "\n", { flag: "wx" });
456
+ return diagnostics;
457
+ }
458
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/export/openai.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@uvl000/claude-trace",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "WorkflowExp fork for recording API traffic from Claude Code, OpenCode, and Codex CLI",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
7
  "claude-trace": "dist/cli/cli.js",
8
8
  "claude-trace-validate": "dist/cli/validate-trace.js",
9
+ "claude-trace-export-openai": "dist/cli/export-openai.js",
9
10
  "opencode-trace": "dist/cli/opencode-cli.js",
10
11
  "codex-trace": "dist/cli/codex-cli.js",
11
12
  "vibe-coding-proxy": "dist/cli/vibe-coding-proxy-cli.js"
@@ -62,7 +63,7 @@
62
63
  "license": "MIT",
63
64
  "repository": {
64
65
  "type": "git",
65
- "url": "git+https://github.com/hanqunfeng/claude-trace.git"
66
+ "url": "git+https://github.com/FlyingFish-233/claude-trace.git"
66
67
  },
67
68
  "engines": {
68
69
  "node": ">=16.0.0"
@@ -81,9 +82,9 @@
81
82
  },
82
83
  "types": "./dist/index.d.ts",
83
84
  "bugs": {
84
- "url": "https://github.com/hanqunfeng/claude-trace/issues"
85
+ "url": "https://github.com/FlyingFish-233/claude-trace/issues"
85
86
  },
86
- "homepage": "https://github.com/hanqunfeng/claude-trace#readme",
87
+ "homepage": "https://github.com/FlyingFish-233/claude-trace#readme",
87
88
  "publishConfig": {
88
89
  "access": "public"
89
90
  },