@uvl000/claude-trace 4.0.1 → 4.1.1

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
@@ -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)
package/README.zh-CN.md CHANGED
@@ -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+)
package/dist/cli/cli.js CHANGED
@@ -112,7 +112,7 @@ ${cli_common_1.colors.yellow}MIGRATION:${cli_common_1.colors.reset}
112
112
  This tool replaces Python-based claude-logger and claude-token.py scripts
113
113
  with a pure Node.js implementation. All output formats are compatible.
114
114
 
115
- For more information, visit: https://github.com/hanqunfeng/claude-trace
115
+ For more information, visit: https://github.com/FlyingFish-233/claude-trace
116
116
  `);
117
117
  }
118
118
  /**
@@ -88,7 +88,7 @@ ${cli_common_1.colors.yellow}OUTPUT:${cli_common_1.colors.reset}
88
88
  Logs are saved to: ${cli_common_1.colors.green}.codex-trace/log-YYYY-MM-DD-HH-MM-SS.{jsonl,html}${cli_common_1.colors.reset}
89
89
  With --log NAME: ${cli_common_1.colors.green}.codex-trace/NAME.{jsonl,html}${cli_common_1.colors.reset}
90
90
 
91
- For more information, visit: https://github.com/hanqunfeng/claude-trace
91
+ For more information, visit: https://github.com/FlyingFish-233/claude-trace
92
92
  `);
93
93
  }
94
94
  /**
@@ -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"}
@@ -98,7 +98,7 @@ ${cli_common_1.colors.yellow}OUTPUT:${cli_common_1.colors.reset}
98
98
  Logs are saved to: ${cli_common_1.colors.green}.opencode-trace/log-YYYY-MM-DD-HH-MM-SS.{jsonl,html}${cli_common_1.colors.reset}
99
99
  With --log NAME: ${cli_common_1.colors.green}.opencode-trace/NAME.{jsonl,html}${cli_common_1.colors.reset}
100
100
 
101
- For more information, visit: https://github.com/hanqunfeng/claude-trace
101
+ For more information, visit: https://github.com/FlyingFish-233/claude-trace
102
102
  `);
103
103
  }
104
104
  /**
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkTA,oCA0HC;AA5aD,oDAAsC;AACtC,4CAA8B;AAC9B,gDAAkC;AAClC,wDAA0C;AA2D1C,SAAS,MAAM,CAAC,KAAU;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;aAC/G,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACzC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAY;IACrC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACxF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;gBACnC,OAAO,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAY;IACrC,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,GAAG,CAAC,KAAU;IACtB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IACjC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,aAAiB,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACvC,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC;QACJ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAoB;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,SAAS,KAAK,CAAC,KAAa;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO;YACtC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACxF,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,aAAa,EAAE,CAAC;YACvE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7G,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,UAAU;QAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9D,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC7I,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QACzC,IAAI,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,WAAW,GAAG,GAAG,IAAI,QAAQ,CAAC,WAAW,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/G,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACxH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;QACvH,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;gBAAE,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;YAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC9F,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAAE,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;YAClG,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QAClH,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC;oBAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,CAAC;gBAAC,CAAC;gBACzD,MAAM,CAAC;oBACN,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;oBACzH,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,CAAC,KAAK,KAAK,QAAQ;wBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBACvG,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;gBACjC,CAAC;YACF,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC7D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,KAAU;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,KAAU;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;WACnF,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;SACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB;IACxC,MAAM,KAAK,GAAa,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpG,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACxC,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/G,CAAC;;YAAM,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,OAAY,EAAE,SAAkB;IACvD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7G,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACjH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACzE,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;iBACnD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;iBACnE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAClE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9G,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBAC/C,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9E,CAAC;;gBAAM,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,QAAQ,CAAC,MAAM;YAAE,MAAM,CAAC,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACxG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;iBAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YAChH,CAAC;;gBAAM,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,KAAU;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE;KACvG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB;IAC1C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACzE,2KAA2K,CAAC,IAAI,CAAC,OAAO,CAAC,CACzL,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAe;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3E,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;gBAAE,SAAS,EAAE,CAAC;QAChF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,GAAU,EAAE,IAAW;IAC7C,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzI,CAAC;AAED,SAAS,eAAe,CAAC,QAAa,EAAE,OAAY;IACnD,OAAO,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB;IACnC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IACxG,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,IAAI,CAAC,MAA8B,EAAE,IAAY,EAAE,MAAM,GAAG,CAAC;IACrE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,UAAoB,EAAE,UAAkB,EAAE,qBAA8B;IAC1G,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,IAAI,eAAe,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5F,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACjE,MAAM,WAAW,GAAsB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACxF,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxH,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC1B,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAC/B,MAAM,CAAC;gBACN,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gBACzC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC1H,SAAS;YACV,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;gBAC9C,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBAC/H,SAAS;YACV,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9G,CAAC;IACF,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzH,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9J,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACtC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC7G,SAAS;QACV,CAAC;QACD,IAAI,QAAoB,CAAC;QACzB,IAAI,CAAC;YAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QACzC,OAAO,KAAK,EAAE,CAAC;YACd,MAAM,MAAM,GAAI,KAAe,CAAC,OAAO,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,SAAS;QACV,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;YACrD,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC7F,SAAS;QACV,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnG,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;eAC9G,eAAe,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB;YACzE,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,YAAY;gBACvC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;oBAC/F,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,IAAI,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACrF,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM;gBACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;qBACtG,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC3D,CAAC,CAAC;oBACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1E,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;yBAClE,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;iBAC3D,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,IAAI;gBACvB,MAAM,EAAE;oBACP,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC7C,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE;wBAC9F,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;iBAC9G;gBACD,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAU;aAC9F,CAAC;YACF,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;YACnD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;YAClC,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC;YAC9B,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtI,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1G,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,QAAQ;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,EAAE,QAAQ,CAAC,CAAC;YAC3E,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAI,KAAe,CAAC,OAAO,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;IACF,CAAC;IACD,WAAW,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAC9C,WAAW,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC;IACvD,WAAW,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvI,IAAI,eAAe;QAAE,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpH,OAAO,WAAW,CAAC;AACpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+ script_path="$(readlink -f "$0")"
4
+ bundle_dir="$(CDPATH= cd -- "$(dirname -- "$script_path")/.." && pwd)"
5
+ exec "$bundle_dir/node/bin/node" \
6
+ "$bundle_dir/package/node_modules/@uvl000/claude-trace/dist/cli/export-openai.js" "$@"
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@uvl000/claude-trace",
3
- "version": "4.0.1",
3
+ "version": "4.1.1",
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"