@uvl000/claude-trace 3.0.13-workflowexp.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.
Files changed (258) hide show
  1. package/README.md +477 -0
  2. package/README.zh-CN.md +477 -0
  3. package/dist/adapt/api-format.d.ts +41 -0
  4. package/dist/adapt/api-format.d.ts.map +1 -0
  5. package/dist/adapt/api-format.js +132 -0
  6. package/dist/adapt/api-format.js.map +1 -0
  7. package/dist/adapt/openai-adapter.d.ts +123 -0
  8. package/dist/adapt/openai-adapter.d.ts.map +1 -0
  9. package/dist/adapt/openai-adapter.js +628 -0
  10. package/dist/adapt/openai-adapter.js.map +1 -0
  11. package/dist/cli/cli-common.d.ts +73 -0
  12. package/dist/cli/cli-common.d.ts.map +1 -0
  13. package/dist/cli/cli-common.js +189 -0
  14. package/dist/cli/cli-common.js.map +1 -0
  15. package/dist/cli/cli.d.ts +23 -0
  16. package/dist/cli/cli.d.ts.map +1 -0
  17. package/dist/cli/cli.js +175 -0
  18. package/dist/cli/cli.js.map +1 -0
  19. package/dist/cli/codex-cli.d.ts +24 -0
  20. package/dist/cli/codex-cli.d.ts.map +1 -0
  21. package/dist/cli/codex-cli.js +146 -0
  22. package/dist/cli/codex-cli.js.map +1 -0
  23. package/dist/cli/opencode-cli.d.ts +23 -0
  24. package/dist/cli/opencode-cli.d.ts.map +1 -0
  25. package/dist/cli/opencode-cli.js +156 -0
  26. package/dist/cli/opencode-cli.js.map +1 -0
  27. package/dist/cli/trace-runner.d.ts +21 -0
  28. package/dist/cli/trace-runner.d.ts.map +1 -0
  29. package/dist/cli/trace-runner.js +282 -0
  30. package/dist/cli/trace-runner.js.map +1 -0
  31. package/dist/cli/validate-trace.d.ts +30 -0
  32. package/dist/cli/validate-trace.d.ts.map +1 -0
  33. package/dist/cli/validate-trace.js +230 -0
  34. package/dist/cli/validate-trace.js.map +1 -0
  35. package/dist/cli/verify-offline-bundle.d.ts +13 -0
  36. package/dist/cli/verify-offline-bundle.d.ts.map +1 -0
  37. package/dist/cli/verify-offline-bundle.js +89 -0
  38. package/dist/cli/verify-offline-bundle.js.map +1 -0
  39. package/dist/cli/vibe-coding-proxy-cli.d.ts +12 -0
  40. package/dist/cli/vibe-coding-proxy-cli.d.ts.map +1 -0
  41. package/dist/cli/vibe-coding-proxy-cli.js +218 -0
  42. package/dist/cli/vibe-coding-proxy-cli.js.map +1 -0
  43. package/dist/config/claude-config-overlay.d.ts +69 -0
  44. package/dist/config/claude-config-overlay.d.ts.map +1 -0
  45. package/dist/config/claude-config-overlay.js +229 -0
  46. package/dist/config/claude-config-overlay.js.map +1 -0
  47. package/dist/config/codex-config-overlay.d.ts +122 -0
  48. package/dist/config/codex-config-overlay.d.ts.map +1 -0
  49. package/dist/config/codex-config-overlay.js +352 -0
  50. package/dist/config/codex-config-overlay.js.map +1 -0
  51. package/dist/index.d.ts +15 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +37 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/intercept/forward-proxy.d.ts +77 -0
  56. package/dist/intercept/forward-proxy.d.ts.map +1 -0
  57. package/dist/intercept/forward-proxy.js +368 -0
  58. package/dist/intercept/forward-proxy.js.map +1 -0
  59. package/dist/intercept/header-redaction.d.ts +7 -0
  60. package/dist/intercept/header-redaction.d.ts.map +1 -0
  61. package/dist/intercept/header-redaction.js +28 -0
  62. package/dist/intercept/header-redaction.js.map +1 -0
  63. package/dist/intercept/interceptor-loader.js +26 -0
  64. package/dist/intercept/interceptor.d.ts +164 -0
  65. package/dist/intercept/interceptor.d.ts.map +1 -0
  66. package/dist/intercept/interceptor.js +496 -0
  67. package/dist/intercept/interceptor.js.map +1 -0
  68. package/dist/intercept/mitm-cert.d.ts +53 -0
  69. package/dist/intercept/mitm-cert.d.ts.map +1 -0
  70. package/dist/intercept/mitm-cert.js +259 -0
  71. package/dist/intercept/mitm-cert.js.map +1 -0
  72. package/dist/intercept/proxy-log-writer.d.ts +77 -0
  73. package/dist/intercept/proxy-log-writer.d.ts.map +1 -0
  74. package/dist/intercept/proxy-log-writer.js +323 -0
  75. package/dist/intercept/proxy-log-writer.js.map +1 -0
  76. package/dist/intercept/proxy-targets.d.ts +69 -0
  77. package/dist/intercept/proxy-targets.d.ts.map +1 -0
  78. package/dist/intercept/proxy-targets.js +129 -0
  79. package/dist/intercept/proxy-targets.js.map +1 -0
  80. package/dist/intercept/reverse-proxy.d.ts +191 -0
  81. package/dist/intercept/reverse-proxy.d.ts.map +1 -0
  82. package/dist/intercept/reverse-proxy.js +807 -0
  83. package/dist/intercept/reverse-proxy.js.map +1 -0
  84. package/dist/intercept/token-extractor.js +28 -0
  85. package/dist/report/html-generator.d.ts +96 -0
  86. package/dist/report/html-generator.d.ts.map +1 -0
  87. package/dist/report/html-generator.js +225 -0
  88. package/dist/report/html-generator.js.map +1 -0
  89. package/dist/report/index-generator.d.ts +89 -0
  90. package/dist/report/index-generator.d.ts.map +1 -0
  91. package/dist/report/index-generator.js +319 -0
  92. package/dist/report/index-generator.js.map +1 -0
  93. package/dist/report/shared-conversation-processor.d.ts +200 -0
  94. package/dist/report/shared-conversation-processor.d.ts.map +1 -0
  95. package/dist/report/shared-conversation-processor.js +720 -0
  96. package/dist/report/shared-conversation-processor.js.map +1 -0
  97. package/dist/routing/codex-routing.d.ts +40 -0
  98. package/dist/routing/codex-routing.d.ts.map +1 -0
  99. package/dist/routing/codex-routing.js +96 -0
  100. package/dist/routing/codex-routing.js.map +1 -0
  101. package/dist/routing/proxy-routing.d.ts +48 -0
  102. package/dist/routing/proxy-routing.d.ts.map +1 -0
  103. package/dist/routing/proxy-routing.js +113 -0
  104. package/dist/routing/proxy-routing.js.map +1 -0
  105. package/dist/tools/binary-utils.d.ts +29 -0
  106. package/dist/tools/binary-utils.d.ts.map +1 -0
  107. package/dist/tools/binary-utils.js +134 -0
  108. package/dist/tools/binary-utils.js.map +1 -0
  109. package/dist/tools/claude.d.ts +61 -0
  110. package/dist/tools/claude.d.ts.map +1 -0
  111. package/dist/tools/claude.js +449 -0
  112. package/dist/tools/claude.js.map +1 -0
  113. package/dist/tools/codex.d.ts +70 -0
  114. package/dist/tools/codex.d.ts.map +1 -0
  115. package/dist/tools/codex.js +492 -0
  116. package/dist/tools/codex.js.map +1 -0
  117. package/dist/tools/opencode.d.ts +85 -0
  118. package/dist/tools/opencode.d.ts.map +1 -0
  119. package/dist/tools/opencode.js +401 -0
  120. package/dist/tools/opencode.js.map +1 -0
  121. package/dist/tools/types.d.ts +91 -0
  122. package/dist/tools/types.d.ts.map +1 -0
  123. package/dist/tools/types.js +11 -0
  124. package/dist/tools/types.js.map +1 -0
  125. package/dist/types.d.ts +158 -0
  126. package/dist/types.d.ts.map +1 -0
  127. package/dist/types.js +12 -0
  128. package/dist/types.js.map +1 -0
  129. package/frontend/dist/index.global.js +1551 -0
  130. package/frontend/dist/styles.css +1027 -0
  131. package/frontend/template.html +19 -0
  132. package/node_modules/agent-base/LICENSE +22 -0
  133. package/node_modules/agent-base/README.md +69 -0
  134. package/node_modules/agent-base/dist/helpers.d.ts +15 -0
  135. package/node_modules/agent-base/dist/helpers.d.ts.map +1 -0
  136. package/node_modules/agent-base/dist/helpers.js +66 -0
  137. package/node_modules/agent-base/dist/helpers.js.map +1 -0
  138. package/node_modules/agent-base/dist/index.d.ts +41 -0
  139. package/node_modules/agent-base/dist/index.d.ts.map +1 -0
  140. package/node_modules/agent-base/dist/index.js +178 -0
  141. package/node_modules/agent-base/dist/index.js.map +1 -0
  142. package/node_modules/agent-base/package.json +46 -0
  143. package/node_modules/debug/LICENSE +20 -0
  144. package/node_modules/debug/README.md +481 -0
  145. package/node_modules/debug/package.json +64 -0
  146. package/node_modules/debug/src/browser.js +272 -0
  147. package/node_modules/debug/src/common.js +292 -0
  148. package/node_modules/debug/src/index.js +10 -0
  149. package/node_modules/debug/src/node.js +263 -0
  150. package/node_modules/http-proxy-agent/LICENSE +22 -0
  151. package/node_modules/http-proxy-agent/README.md +44 -0
  152. package/node_modules/http-proxy-agent/dist/index.d.ts +44 -0
  153. package/node_modules/http-proxy-agent/dist/index.d.ts.map +1 -0
  154. package/node_modules/http-proxy-agent/dist/index.js +148 -0
  155. package/node_modules/http-proxy-agent/dist/index.js.map +1 -0
  156. package/node_modules/http-proxy-agent/package.json +47 -0
  157. package/node_modules/https-proxy-agent/LICENSE +22 -0
  158. package/node_modules/https-proxy-agent/README.md +70 -0
  159. package/node_modules/https-proxy-agent/dist/index.d.ts +47 -0
  160. package/node_modules/https-proxy-agent/dist/index.d.ts.map +1 -0
  161. package/node_modules/https-proxy-agent/dist/index.js +180 -0
  162. package/node_modules/https-proxy-agent/dist/index.js.map +1 -0
  163. package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +15 -0
  164. package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts.map +1 -0
  165. package/node_modules/https-proxy-agent/dist/parse-proxy-response.js +101 -0
  166. package/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
  167. package/node_modules/https-proxy-agent/package.json +50 -0
  168. package/node_modules/ms/index.js +162 -0
  169. package/node_modules/ms/license.md +21 -0
  170. package/node_modules/ms/package.json +38 -0
  171. package/node_modules/ms/readme.md +59 -0
  172. package/node_modules/node-forge/LICENSE +331 -0
  173. package/node_modules/node-forge/README.md +2071 -0
  174. package/node_modules/node-forge/dist/forge.all.min.js +2 -0
  175. package/node_modules/node-forge/dist/forge.all.min.js.map +1 -0
  176. package/node_modules/node-forge/dist/forge.min.js +2 -0
  177. package/node_modules/node-forge/dist/forge.min.js.map +1 -0
  178. package/node_modules/node-forge/dist/prime.worker.min.js +2 -0
  179. package/node_modules/node-forge/dist/prime.worker.min.js.map +1 -0
  180. package/node_modules/node-forge/flash/swf/SocketPool.swf +0 -0
  181. package/node_modules/node-forge/lib/aes.js +1091 -0
  182. package/node_modules/node-forge/lib/aesCipherSuites.js +282 -0
  183. package/node_modules/node-forge/lib/asn1-validator.js +91 -0
  184. package/node_modules/node-forge/lib/asn1.js +1503 -0
  185. package/node_modules/node-forge/lib/baseN.js +186 -0
  186. package/node_modules/node-forge/lib/cipher.js +230 -0
  187. package/node_modules/node-forge/lib/cipherModes.js +999 -0
  188. package/node_modules/node-forge/lib/des.js +496 -0
  189. package/node_modules/node-forge/lib/ed25519.js +1091 -0
  190. package/node_modules/node-forge/lib/forge.js +13 -0
  191. package/node_modules/node-forge/lib/form.js +149 -0
  192. package/node_modules/node-forge/lib/hmac.js +146 -0
  193. package/node_modules/node-forge/lib/http.js +1346 -0
  194. package/node_modules/node-forge/lib/index.all.js +16 -0
  195. package/node_modules/node-forge/lib/index.js +33 -0
  196. package/node_modules/node-forge/lib/jsbn.js +1294 -0
  197. package/node_modules/node-forge/lib/kem.js +168 -0
  198. package/node_modules/node-forge/lib/log.js +319 -0
  199. package/node_modules/node-forge/lib/md.all.js +13 -0
  200. package/node_modules/node-forge/lib/md.js +11 -0
  201. package/node_modules/node-forge/lib/md5.js +289 -0
  202. package/node_modules/node-forge/lib/mgf.js +12 -0
  203. package/node_modules/node-forge/lib/mgf1.js +57 -0
  204. package/node_modules/node-forge/lib/oids.js +180 -0
  205. package/node_modules/node-forge/lib/pbe.js +1023 -0
  206. package/node_modules/node-forge/lib/pbkdf2.js +211 -0
  207. package/node_modules/node-forge/lib/pem.js +237 -0
  208. package/node_modules/node-forge/lib/pkcs1.js +276 -0
  209. package/node_modules/node-forge/lib/pkcs12.js +1078 -0
  210. package/node_modules/node-forge/lib/pkcs7.js +1260 -0
  211. package/node_modules/node-forge/lib/pkcs7asn1.js +410 -0
  212. package/node_modules/node-forge/lib/pki.js +102 -0
  213. package/node_modules/node-forge/lib/prime.js +297 -0
  214. package/node_modules/node-forge/lib/prime.worker.js +168 -0
  215. package/node_modules/node-forge/lib/prng.js +419 -0
  216. package/node_modules/node-forge/lib/pss.js +241 -0
  217. package/node_modules/node-forge/lib/random.js +191 -0
  218. package/node_modules/node-forge/lib/rc2.js +410 -0
  219. package/node_modules/node-forge/lib/rsa.js +1968 -0
  220. package/node_modules/node-forge/lib/sha1.js +319 -0
  221. package/node_modules/node-forge/lib/sha256.js +327 -0
  222. package/node_modules/node-forge/lib/sha512.js +561 -0
  223. package/node_modules/node-forge/lib/socket.js +287 -0
  224. package/node_modules/node-forge/lib/ssh.js +236 -0
  225. package/node_modules/node-forge/lib/tls.js +4282 -0
  226. package/node_modules/node-forge/lib/tlssocket.js +249 -0
  227. package/node_modules/node-forge/lib/util.js +2652 -0
  228. package/node_modules/node-forge/lib/x509.js +3251 -0
  229. package/node_modules/node-forge/lib/xhr.js +738 -0
  230. package/node_modules/node-forge/package.json +123 -0
  231. package/node_modules/smol-toml/LICENSE +24 -0
  232. package/node_modules/smol-toml/README.md +239 -0
  233. package/node_modules/smol-toml/dist/date.d.ts +41 -0
  234. package/node_modules/smol-toml/dist/date.js +127 -0
  235. package/node_modules/smol-toml/dist/error.d.ts +38 -0
  236. package/node_modules/smol-toml/dist/error.js +63 -0
  237. package/node_modules/smol-toml/dist/extract.d.ts +30 -0
  238. package/node_modules/smol-toml/dist/extract.js +100 -0
  239. package/node_modules/smol-toml/dist/index.cjs +897 -0
  240. package/node_modules/smol-toml/dist/index.d.ts +43 -0
  241. package/node_modules/smol-toml/dist/index.js +33 -0
  242. package/node_modules/smol-toml/dist/parse.d.ts +37 -0
  243. package/node_modules/smol-toml/dist/parse.js +148 -0
  244. package/node_modules/smol-toml/dist/primitive.d.ts +31 -0
  245. package/node_modules/smol-toml/dist/primitive.js +179 -0
  246. package/node_modules/smol-toml/dist/stringify.d.ts +31 -0
  247. package/node_modules/smol-toml/dist/stringify.js +167 -0
  248. package/node_modules/smol-toml/dist/struct.d.ts +32 -0
  249. package/node_modules/smol-toml/dist/struct.js +184 -0
  250. package/node_modules/smol-toml/dist/util.d.ts +42 -0
  251. package/node_modules/smol-toml/dist/util.js +111 -0
  252. package/node_modules/smol-toml/package.json +54 -0
  253. package/offline/bin/claude-trace +6 -0
  254. package/offline/bin/claude-wrapper +13 -0
  255. package/offline/bin/install-agent +14 -0
  256. package/offline/bin/validate-trace +6 -0
  257. package/offline/bin/verify-bundle +7 -0
  258. package/package.json +103 -0
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @file opencode-cli.ts
4
+ * @description Entry point for the `opencode-trace` command.
5
+ *
6
+ * Thin CLI wrapper that parses arguments, dispatches to utility modes
7
+ * (HTML generation, index building), or delegates interactive tracing to
8
+ * `trace-runner.ts` via the OpenCode tool profile.
9
+ *
10
+ * Architecture:
11
+ * ```
12
+ * opencode-cli.ts → opencodeProfile (tools/opencode.ts) → trace-runner.ts
13
+ * └─ reverse-proxy.ts (always)
14
+ * ```
15
+ *
16
+ * OpenCode always uses reverse-proxy interception; config is injected at
17
+ * runtime via `OPENCODE_CONFIG_CONTENT` without modifying user files.
18
+ * There is no `--extract-token` mode (Claude-only feature).
19
+ *
20
+ * Registered as the `opencode-trace` bin in package.json.
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=opencode-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-cli.d.ts","sourceRoot":"","sources":["../../src/cli/opencode-cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * @file opencode-cli.ts
5
+ * @description Entry point for the `opencode-trace` command.
6
+ *
7
+ * Thin CLI wrapper that parses arguments, dispatches to utility modes
8
+ * (HTML generation, index building), or delegates interactive tracing to
9
+ * `trace-runner.ts` via the OpenCode tool profile.
10
+ *
11
+ * Architecture:
12
+ * ```
13
+ * opencode-cli.ts → opencodeProfile (tools/opencode.ts) → trace-runner.ts
14
+ * └─ reverse-proxy.ts (always)
15
+ * ```
16
+ *
17
+ * OpenCode always uses reverse-proxy interception; config is injected at
18
+ * runtime via `OPENCODE_CONFIG_CONTENT` without modifying user files.
19
+ * There is no `--extract-token` mode (Claude-only feature).
20
+ *
21
+ * Registered as the `opencode-trace` bin in package.json.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ const opencode_1 = require("../tools/opencode");
25
+ const trace_runner_1 = require("./trace-runner");
26
+ const cli_common_1 = require("./cli-common");
27
+ /**
28
+ * Print usage help for all `opencode-trace` modes and options to stdout.
29
+ *
30
+ * Includes OpenCode-specific config discovery order and the note that
31
+ * original `opencode.json` files are never modified.
32
+ */
33
+ function showHelp() {
34
+ console.log(`
35
+ ${cli_common_1.colors.blue}OpenCode Trace${cli_common_1.colors.reset}
36
+ Record all your interactions with OpenCode as you develop your projects
37
+
38
+ ${cli_common_1.colors.yellow}USAGE:${cli_common_1.colors.reset}
39
+ opencode-trace [OPTIONS] [--run-with OPENCODE_ARG...]
40
+
41
+ ${cli_common_1.colors.yellow}OPTIONS:${cli_common_1.colors.reset}
42
+ --generate-html Generate HTML report from JSONL file
43
+ --index Generate conversation summaries and index for .opencode-trace/ directory
44
+ --run-with Pass all following arguments to OpenCode process
45
+ --include-all-requests Include all proxied API traffic, not just /v1/messages
46
+ --include-sensitive-headers Log sensitive headers (auth tokens, cookies) without redaction
47
+ --no-open Don't open generated HTML file in browser
48
+ --log Specify custom log file base name (without extension)
49
+ --opencode-path Specify custom path to OpenCode binary
50
+ --help, -h Show this help message
51
+
52
+ ${cli_common_1.colors.yellow}MODES:${cli_common_1.colors.reset}
53
+ ${cli_common_1.colors.green}Interactive logging:${cli_common_1.colors.reset}
54
+ opencode-trace Start OpenCode with traffic logging
55
+ opencode-trace --log my-session Start OpenCode with custom log file name
56
+ opencode-trace --run-with run "Explain closures" Run OpenCode with specific command
57
+
58
+ ${cli_common_1.colors.green}HTML generation:${cli_common_1.colors.reset}
59
+ opencode-trace --generate-html file.jsonl Generate HTML from JSONL file
60
+ opencode-trace --generate-html file.jsonl out.html Generate HTML with custom output name
61
+
62
+ ${cli_common_1.colors.green}Indexing:${cli_common_1.colors.reset}
63
+ opencode-trace --index Generate conversation summaries and index
64
+
65
+ ${cli_common_1.colors.yellow}EXAMPLES:${cli_common_1.colors.reset}
66
+ # Start OpenCode TUI with logging
67
+ opencode-trace
68
+
69
+ # Start with custom log file name
70
+ opencode-trace --log my-session
71
+
72
+ # Run a one-shot prompt with logging
73
+ opencode-trace --run-with run "Explain async/await"
74
+
75
+ # Run with a specific model
76
+ opencode-trace --run-with run -m anthropic/claude-sonnet-4 "Refactor this module"
77
+
78
+ # Generate HTML report
79
+ opencode-trace --generate-html .opencode-trace/log-2025-01-01-12-00-00.jsonl
80
+
81
+ # Generate conversation index
82
+ opencode-trace --index
83
+
84
+ # Use custom OpenCode binary path
85
+ opencode-trace --opencode-path /usr/local/bin/opencode
86
+
87
+ ${cli_common_1.colors.yellow}CONFIG:${cli_common_1.colors.reset}
88
+ OpenCode config is read from (in order):
89
+ 1. OPENCODE_CONFIG environment variable
90
+ 2. OPENCODE_CONFIG_DIR/opencode.json
91
+ 3. ~/.config/opencode/opencode.json
92
+ 4. .opencode/opencode.json in current directory
93
+
94
+ Intercepts all configured providers (Anthropic + OpenAI formats) via runtime
95
+ OPENCODE_CONFIG_CONTENT override. Your original config file is never modified.
96
+
97
+ ${cli_common_1.colors.yellow}OUTPUT:${cli_common_1.colors.reset}
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
+ With --log NAME: ${cli_common_1.colors.green}.opencode-trace/NAME.{jsonl,html}${cli_common_1.colors.reset}
100
+
101
+ For more information, visit: https://github.com/hanqunfeng/claude-trace
102
+ `);
103
+ }
104
+ /**
105
+ * Main CLI dispatcher.
106
+ *
107
+ * Modes are mutually exclusive and checked in priority order:
108
+ * 1. `--help` / `-h` — print usage and exit
109
+ * 2. `--generate-html` — offline HTML report from an existing JSONL log
110
+ * 3. `--index` — rebuild conversation summaries in `.opencode-trace/`
111
+ * 4. Default — launch OpenCode with live traffic tracing via `runWithTracing`
112
+ *
113
+ * Arguments after `--run-with` are passed verbatim to the OpenCode child process.
114
+ */
115
+ async function main() {
116
+ const args = process.argv.slice(2);
117
+ const { traceArgs, toolArgs, includeAllRequests, openInBrowser, logSensitiveHeaders, logBaseName } = (0, cli_common_1.parseTraceArgs)(args);
118
+ if (traceArgs.includes("--help") || traceArgs.includes("-h")) {
119
+ showHelp();
120
+ process.exit(0);
121
+ }
122
+ // `--opencode-path` takes the next positional arg as the binary location.
123
+ let customOpenCodePath;
124
+ const opencodePathIndex = traceArgs.indexOf("--opencode-path");
125
+ if (opencodePathIndex !== -1 && traceArgs[opencodePathIndex + 1]) {
126
+ customOpenCodePath = traceArgs[opencodePathIndex + 1];
127
+ }
128
+ if (traceArgs.includes("--generate-html")) {
129
+ const { inputFile, outputFile } = (0, cli_common_1.parseGenerateHtmlArgs)(traceArgs);
130
+ if (!inputFile) {
131
+ (0, cli_common_1.log)(`Missing input file for --generate-html`, "red");
132
+ (0, cli_common_1.log)(`Usage: opencode-trace --generate-html input.jsonl [output.html]`, "yellow");
133
+ process.exit(1);
134
+ }
135
+ await (0, cli_common_1.generateHTMLFromCLI)(inputFile, outputFile, includeAllRequests, openInBrowser, "opencode");
136
+ return;
137
+ }
138
+ if (traceArgs.includes("--index")) {
139
+ await (0, cli_common_1.generateIndex)(opencode_1.opencodeProfile.logDirectory);
140
+ return;
141
+ }
142
+ // Default mode: start reverse proxy + spawn OpenCode with logging.
143
+ await (0, trace_runner_1.runWithTracing)(opencode_1.opencodeProfile, toolArgs, {
144
+ includeAllRequests,
145
+ openInBrowser,
146
+ logBaseName,
147
+ logSensitiveHeaders,
148
+ customBinaryPath: customOpenCodePath,
149
+ });
150
+ }
151
+ main().catch((error) => {
152
+ const err = error;
153
+ (0, cli_common_1.log)(`Unexpected error: ${err.message}`, "red");
154
+ process.exit(1);
155
+ });
156
+ //# sourceMappingURL=opencode-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-cli.js","sourceRoot":"","sources":["../../src/cli/opencode-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file trace-runner.ts
3
+ * @description Generic launch orchestrator for all Tool Profiles.
4
+ *
5
+ * Chooses interception strategy based on binary type:
6
+ * - **Native binary** (Claude V2+, OpenCode, Codex): local reverse proxy + env/config overlay
7
+ * - **Node.js script** (Claude V1): spawn with `--require interceptor-loader.js`
8
+ *
9
+ * Handles proxy lifecycle, signal forwarding, and temp config cleanup on exit.
10
+ */
11
+ import type { ToolProfile, TraceOptions } from "../tools/types";
12
+ /**
13
+ * Main entry used by all three CLI binaries after argument parsing.
14
+ * Detects binary type and delegates to proxy or interceptor mode.
15
+ *
16
+ * @param profile - Tool-specific ToolProfile implementation
17
+ * @param toolArgs - Arguments forwarded to the underlying CLI (after --run-with)
18
+ * @param options - Logging and spawn options from CLI flags
19
+ */
20
+ export declare function runWithTracing(profile: ToolProfile, toolArgs?: string[], options?: TraceOptions): Promise<void>;
21
+ //# sourceMappingURL=trace-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-runner.d.ts","sourceRoot":"","sources":["../../src/cli/trace-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiPhE;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,OAAO,EAAE,WAAW,EACpB,QAAQ,GAAE,MAAM,EAAO,EACvB,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ /**
3
+ * @file trace-runner.ts
4
+ * @description Generic launch orchestrator for all Tool Profiles.
5
+ *
6
+ * Chooses interception strategy based on binary type:
7
+ * - **Native binary** (Claude V2+, OpenCode, Codex): local reverse proxy + env/config overlay
8
+ * - **Node.js script** (Claude V1): spawn with `--require interceptor-loader.js`
9
+ *
10
+ * Handles proxy lifecycle, signal forwarding, and temp config cleanup on exit.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.runWithTracing = runWithTracing;
47
+ const child_process_1 = require("child_process");
48
+ const path = __importStar(require("path"));
49
+ const fs = __importStar(require("fs"));
50
+ const reverse_proxy_1 = require("../intercept/reverse-proxy");
51
+ const binary_utils_1 = require("../tools/binary-utils");
52
+ const claude_config_overlay_1 = require("../config/claude-config-overlay");
53
+ const codex_config_overlay_1 = require("../config/codex-config-overlay");
54
+ const cli_common_1 = require("./cli-common");
55
+ /** Resolve path to interceptor-loader.js copied into dist/intercept/ at build time. */
56
+ function getLoaderPath() {
57
+ const loaderPath = path.join(__dirname, "..", "intercept", "interceptor-loader.js");
58
+ if (!fs.existsSync(loaderPath)) {
59
+ (0, cli_common_1.log)(`Interceptor loader not found at: ${loaderPath}`, "red");
60
+ process.exit(1);
61
+ }
62
+ return loaderPath;
63
+ }
64
+ /**
65
+ * Launch a native CLI with ReverseProxyServer and tool-specific config overlay.
66
+ * Sets ANTHROPIC_BASE_URL / OPENCODE_CONFIG_CONTENT / CODEX_HOME as appropriate.
67
+ */
68
+ async function runNativeWithProxy(profile, binaryPath, toolArgs, options) {
69
+ (0, cli_common_1.log)("Using reverse proxy mode for native binary", "yellow");
70
+ const providerRoutes = profile.listProviderRoutes?.() ?? [];
71
+ const modelRoutes = profile.listModelRoutes?.() ?? {};
72
+ const hasModelRoutes = Object.keys(modelRoutes).length > 0;
73
+ const upstreamBaseUrl = providerRoutes.length > 0 ? providerRoutes[0].upstreamBaseUrl : profile.readUpstreamBaseUrl();
74
+ // Simple id→URL map when no per-model routing (legacy single-upstream mode)
75
+ const routes = !hasModelRoutes && providerRoutes.length > 0
76
+ ? Object.fromEntries(providerRoutes.map((route) => [route.id, route.upstreamBaseUrl]))
77
+ : undefined;
78
+ if (hasModelRoutes) {
79
+ const uniqueModels = new Set();
80
+ for (const route of Object.values(modelRoutes)) {
81
+ uniqueModels.add(`${route.providerId}/${route.modelId} (${route.apiFormat}) → ${route.upstreamBaseUrl}`);
82
+ }
83
+ (0, cli_common_1.log)(`Model-based routing (${uniqueModels.size} model(s)):`, "blue");
84
+ for (const entry of uniqueModels) {
85
+ (0, cli_common_1.log)(` ${entry}`, "blue");
86
+ }
87
+ }
88
+ else if (providerRoutes.length > 0) {
89
+ (0, cli_common_1.log)(`Intercepting ${providerRoutes.length} provider(s):`, "blue");
90
+ for (const route of providerRoutes) {
91
+ (0, cli_common_1.log)(` ${route.id} → ${route.upstreamBaseUrl}`, "blue");
92
+ }
93
+ }
94
+ else {
95
+ (0, cli_common_1.log)(`Upstream API: ${upstreamBaseUrl}`, "blue");
96
+ }
97
+ console.log("");
98
+ // Codex needs path-prefix-aware provider routes for OpenAI vs ChatGPT OAuth upstreams
99
+ const codexProviderRoutes = profile.name === "codex" && providerRoutes.length > 0 ? providerRoutes : undefined;
100
+ const proxy = new reverse_proxy_1.ReverseProxyServer({
101
+ logDirectory: profile.logDirectory,
102
+ logBaseName: options.logBaseName,
103
+ includeAllRequests: options.includeAllRequests,
104
+ openBrowser: options.openInBrowser,
105
+ logSensitiveHeaders: options.logSensitiveHeaders,
106
+ targetBaseUrl: upstreamBaseUrl,
107
+ routes,
108
+ modelRoutes: hasModelRoutes ? modelRoutes : undefined,
109
+ providerRoutes: codexProviderRoutes,
110
+ tool: profile.name,
111
+ });
112
+ let proxyInfo;
113
+ let tmpConfigDir = null;
114
+ let shutdownCalled = false;
115
+ /** Idempotent teardown: stop proxy and remove ephemeral overlay dirs. */
116
+ const shutdown = () => {
117
+ if (shutdownCalled) {
118
+ return;
119
+ }
120
+ shutdownCalled = true;
121
+ proxy.stop();
122
+ profile.cleanupTempConfig(tmpConfigDir);
123
+ };
124
+ try {
125
+ proxyInfo = await proxy.start();
126
+ (0, cli_common_1.log)(`Reverse proxy started at ${proxyInfo.url}`, "green");
127
+ console.log("");
128
+ }
129
+ catch (error) {
130
+ const err = error;
131
+ (0, cli_common_1.log)(`Failed to start reverse proxy: ${err.message}`, "red");
132
+ process.exit(1);
133
+ }
134
+ const { tmpDir, spawnEnv } = profile.prepareSpawnEnv(proxyInfo.url);
135
+ tmpConfigDir = tmpDir;
136
+ if (tmpConfigDir &&
137
+ ((0, claude_config_overlay_1.isPersistentOverlayDir)(tmpConfigDir) || (0, codex_config_overlay_1.isPersistentCodexOverlayDir)(tmpConfigDir))) {
138
+ (0, cli_common_1.log)(`Using ${profile.displayName} config overlay (original settings unchanged)`, "blue");
139
+ }
140
+ else if (tmpConfigDir) {
141
+ (0, cli_common_1.log)(`Using temporary ${profile.displayName} config (original config unchanged)`, "blue");
142
+ }
143
+ else if (spawnEnv.OPENCODE_CONFIG_CONTENT) {
144
+ (0, cli_common_1.log)(`Using OPENCODE_CONFIG_CONTENT runtime override (original config unchanged)`, "blue");
145
+ }
146
+ const child = (0, child_process_1.spawn)(binaryPath, toolArgs, {
147
+ env: spawnEnv,
148
+ stdio: "inherit",
149
+ cwd: process.cwd(),
150
+ });
151
+ child.on("error", (error) => {
152
+ shutdown();
153
+ (0, cli_common_1.log)(`Error starting ${profile.displayName}: ${error.message}`, "red");
154
+ process.exit(1);
155
+ });
156
+ child.on("exit", (code, signal) => {
157
+ shutdown();
158
+ if (signal) {
159
+ (0, cli_common_1.log)(`\n${profile.displayName} terminated by signal: ${signal}`, "yellow");
160
+ }
161
+ else if (code !== 0 && code !== null) {
162
+ (0, cli_common_1.log)(`\n${profile.displayName} exited with code: ${code}`, "yellow");
163
+ }
164
+ else {
165
+ (0, cli_common_1.log)(`\n${profile.displayName} session completed`, "green");
166
+ }
167
+ });
168
+ const handleSignal = (signal) => {
169
+ (0, cli_common_1.log)(`\nReceived ${signal}, shutting down...`, "yellow");
170
+ shutdown();
171
+ if (child.pid) {
172
+ child.kill(signal);
173
+ }
174
+ };
175
+ process.on("SIGINT", () => handleSignal("SIGINT"));
176
+ process.on("SIGTERM", () => handleSignal("SIGTERM"));
177
+ let childResult;
178
+ try {
179
+ childResult = await new Promise((resolve, reject) => {
180
+ child.on("exit", (code, signal) => resolve({ code, signal }));
181
+ child.on("error", reject);
182
+ });
183
+ }
184
+ catch (error) {
185
+ const err = error;
186
+ shutdown();
187
+ (0, cli_common_1.log)(`Unexpected error: ${err.message}`, "red");
188
+ process.exit(1);
189
+ }
190
+ shutdown();
191
+ if (childResult.signal || (childResult.code !== null && childResult.code !== 0)) {
192
+ process.exitCode = childResult.code ?? 1;
193
+ }
194
+ }
195
+ /**
196
+ * Launch Claude Code V1 (Node.js) with fetch() interception via preloaded module.
197
+ * Environment variables configure logging behavior inside interceptor-loader.js.
198
+ */
199
+ async function runNodeInterceptor(profile, binaryPath, toolArgs, options) {
200
+ const jsPath = (0, binary_utils_1.resolveToJsFile)(binaryPath);
201
+ const loaderPath = getLoaderPath();
202
+ (0, cli_common_1.log)(`Using JavaScript entry: ${jsPath}`, "blue");
203
+ (0, cli_common_1.log)("Starting traffic logger...", "green");
204
+ console.log("");
205
+ const spawnArgs = ["--require", loaderPath, jsPath, ...toolArgs];
206
+ const child = (0, child_process_1.spawn)("node", spawnArgs, {
207
+ env: {
208
+ ...process.env,
209
+ NODE_OPTIONS: "--no-deprecation",
210
+ CLAUDE_TRACE_INCLUDE_ALL_REQUESTS: options.includeAllRequests ? "true" : "false",
211
+ CLAUDE_TRACE_OPEN_BROWSER: options.openInBrowser ? "true" : "false",
212
+ ...(options.logBaseName ? { CLAUDE_TRACE_LOG_NAME: options.logBaseName } : {}),
213
+ },
214
+ stdio: "inherit",
215
+ cwd: process.cwd(),
216
+ });
217
+ child.on("error", (error) => {
218
+ (0, cli_common_1.log)(`Error starting ${profile.displayName}: ${error.message}`, "red");
219
+ process.exit(1);
220
+ });
221
+ child.on("exit", (code, signal) => {
222
+ if (signal) {
223
+ (0, cli_common_1.log)(`\n${profile.displayName} terminated by signal: ${signal}`, "yellow");
224
+ }
225
+ else if (code !== 0 && code !== null) {
226
+ (0, cli_common_1.log)(`\n${profile.displayName} exited with code: ${code}`, "yellow");
227
+ }
228
+ else {
229
+ (0, cli_common_1.log)(`\n${profile.displayName} session completed`, "green");
230
+ }
231
+ });
232
+ const handleSignal = (signal) => {
233
+ (0, cli_common_1.log)(`\nReceived ${signal}, shutting down...`, "yellow");
234
+ if (child.pid) {
235
+ child.kill(signal);
236
+ }
237
+ };
238
+ process.on("SIGINT", () => handleSignal("SIGINT"));
239
+ process.on("SIGTERM", () => handleSignal("SIGTERM"));
240
+ let childResult;
241
+ try {
242
+ childResult = await new Promise((resolve, reject) => {
243
+ child.on("exit", (code, signal) => resolve({ code, signal }));
244
+ child.on("error", reject);
245
+ });
246
+ }
247
+ catch (error) {
248
+ const err = error;
249
+ (0, cli_common_1.log)(`Unexpected error: ${err.message}`, "red");
250
+ process.exit(1);
251
+ }
252
+ if (childResult.signal || (childResult.code !== null && childResult.code !== 0)) {
253
+ process.exitCode = childResult.code ?? 1;
254
+ }
255
+ }
256
+ /**
257
+ * Main entry used by all three CLI binaries after argument parsing.
258
+ * Detects binary type and delegates to proxy or interceptor mode.
259
+ *
260
+ * @param profile - Tool-specific ToolProfile implementation
261
+ * @param toolArgs - Arguments forwarded to the underlying CLI (after --run-with)
262
+ * @param options - Logging and spawn options from CLI flags
263
+ */
264
+ async function runWithTracing(profile, toolArgs = [], options = {}) {
265
+ (0, cli_common_1.log)(`${profile.displayName} Trace`, "blue");
266
+ (0, cli_common_1.log)(`Starting ${profile.displayName} with traffic logging`, "yellow");
267
+ if (toolArgs.length > 0) {
268
+ (0, cli_common_1.log)(`${profile.displayName} arguments: ${toolArgs.join(" ")}`, "blue");
269
+ }
270
+ console.log("");
271
+ const binaryPath = profile.getBinaryPath(options.customBinaryPath);
272
+ (0, cli_common_1.log)(`Using ${profile.displayName} binary: ${binaryPath}`, "blue");
273
+ if ((0, binary_utils_1.isNativeBinary)(binaryPath) || !profile.supportsNodeInterceptor()) {
274
+ if ((0, binary_utils_1.isNativeBinary)(binaryPath)) {
275
+ (0, cli_common_1.log)("Detected native binary", "yellow");
276
+ }
277
+ await runNativeWithProxy(profile, binaryPath, toolArgs, options);
278
+ return;
279
+ }
280
+ await runNodeInterceptor(profile, binaryPath, toolArgs, options);
281
+ }
282
+ //# sourceMappingURL=trace-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-runner.js","sourceRoot":"","sources":["../../src/cli/trace-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ export type ValidationMode = "complete" | "incomplete";
3
+ export interface TraceMetadata {
4
+ schema_version: 1;
5
+ status: ValidationMode;
6
+ trace_format: "@uvl000/claude-trace-jsonl";
7
+ trace_file: "trace.jsonl";
8
+ trace_sha256: string | null;
9
+ trace_bytes: number;
10
+ exchange_count: number;
11
+ message_exchange_count: number;
12
+ http_status_codes: Record<string, number>;
13
+ started_at: string | null;
14
+ finished_at: string | null;
15
+ headers_fully_redacted: boolean;
16
+ include_all_requests: true;
17
+ claude_version: string | null;
18
+ claude_trace_version: string;
19
+ node_version: string;
20
+ validation_errors: string[];
21
+ }
22
+ export interface ValidateTraceOptions {
23
+ mode: ValidationMode;
24
+ claudePath: string;
25
+ traceDirectory: string;
26
+ environment?: NodeJS.ProcessEnv;
27
+ }
28
+ /** Validate a WorkflowExp JSONL trace and atomically write metadata.json. */
29
+ export declare function validateTrace(options: ValidateTraceOptions): TraceMetadata;
30
+ //# sourceMappingURL=validate-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-trace.d.ts","sourceRoot":"","sources":["../../src/cli/validate-trace.ts"],"names":[],"mappings":";AASA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC7B,cAAc,EAAE,CAAC,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,4BAA4B,CAAC;IAC3C,UAAU,EAAE,aAAa,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAChC;AAiDD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAqI1E"}