@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,401 @@
1
+ "use strict";
2
+ /**
3
+ * @file tools/opencode.ts
4
+ * @description Tool profile for OpenCode CLI tracing.
5
+ *
6
+ * This module implements the {@link ToolProfile} interface for OpenCode.
7
+ * Unlike Claude Code, OpenCode **always** uses reverse-proxy interception —
8
+ * there is no Node.js `fetch` hook path.
9
+ *
10
+ * Key responsibilities:
11
+ *
12
+ * - **Binary resolution** — locate `opencode` on PATH with the same
13
+ * MSYS/alias handling used by the Claude profile.
14
+ * - **Config discovery** — read `opencode.json` following OpenCode's
15
+ * precedence: `OPENCODE_CONFIG` → `OPENCODE_CONFIG_DIR` → global → project.
16
+ * - **Model-based routing** — build a `Record<string, ModelRoute>` from
17
+ * configured providers/models so `reverse-proxy.ts` can pick the correct
18
+ * upstream and API format (`anthropic` vs `openai`) per request.
19
+ * - **Runtime config injection** — set `OPENCODE_CONFIG_CONTENT` with all
20
+ * provider `baseURL` values rewritten to the local proxy, without touching
21
+ * the user's on-disk config file.
22
+ *
23
+ * Built-in `models.dev` providers not listed in `opencode.json` are outside
24
+ * the scope of interception; only explicitly configured providers are routed.
25
+ */
26
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ var desc = Object.getOwnPropertyDescriptor(m, k);
29
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
30
+ desc = { enumerable: true, get: function() { return m[k]; } };
31
+ }
32
+ Object.defineProperty(o, k2, desc);
33
+ }) : (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ o[k2] = m[k];
36
+ }));
37
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
38
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
39
+ }) : function(o, v) {
40
+ o["default"] = v;
41
+ });
42
+ var __importStar = (this && this.__importStar) || (function () {
43
+ var ownKeys = function(o) {
44
+ ownKeys = Object.getOwnPropertyNames || function (o) {
45
+ var ar = [];
46
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
47
+ return ar;
48
+ };
49
+ return ownKeys(o);
50
+ };
51
+ return function (mod) {
52
+ if (mod && mod.__esModule) return mod;
53
+ var result = {};
54
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
55
+ __setModuleDefault(result, mod);
56
+ return result;
57
+ };
58
+ })();
59
+ Object.defineProperty(exports, "__esModule", { value: true });
60
+ exports.isNativeBinary = exports.opencodeProfile = void 0;
61
+ exports.getOpenCodeBinaryPath = getOpenCodeBinaryPath;
62
+ exports.buildModelRouteMap = buildModelRouteMap;
63
+ exports.inferApiFormat = inferApiFormat;
64
+ const child_process_1 = require("child_process");
65
+ const path = __importStar(require("path"));
66
+ const fs = __importStar(require("fs"));
67
+ const os = __importStar(require("os"));
68
+ const api_format_1 = require("../adapt/api-format");
69
+ const binary_utils_1 = require("./binary-utils");
70
+ Object.defineProperty(exports, "isNativeBinary", { enumerable: true, get: function () { return binary_utils_1.isNativeBinary; } });
71
+ const cli_common_1 = require("../cli/cli-common");
72
+ /**
73
+ * Locate the OpenCode CLI executable on PATH or in common install locations.
74
+ *
75
+ * @param customPath - Optional explicit path from `--opencode-path`.
76
+ * @returns Resolved path to the OpenCode launcher.
77
+ * @throws Exits the process with code 1 if no binary is found.
78
+ */
79
+ function findOpenCodePath(customPath) {
80
+ if (customPath) {
81
+ if (!fs.existsSync(customPath)) {
82
+ (0, cli_common_1.log)(`OpenCode binary not found at specified path: ${customPath}`, "red");
83
+ process.exit(1);
84
+ }
85
+ return customPath;
86
+ }
87
+ const isWindows = process.platform === "win32";
88
+ try {
89
+ const findCmd = isWindows ? "where.exe opencode" : "which opencode";
90
+ let opencodePath = (0, child_process_1.execSync)(findCmd, { encoding: "utf-8" }).trim().split(/\r?\n/)[0];
91
+ // Normalize MSYS/Git Bash drive-letter paths.
92
+ const msysMatch = opencodePath.match(/^\/([a-zA-Z])\//);
93
+ if (msysMatch) {
94
+ opencodePath = msysMatch[1].toUpperCase() + ":/" + opencodePath.slice(3);
95
+ }
96
+ // Expand shell alias output from zsh/fish.
97
+ const aliasMatch = opencodePath.match(/:\s*aliased to\s+(.+)$/);
98
+ if (aliasMatch && aliasMatch[1]) {
99
+ opencodePath = aliasMatch[1];
100
+ }
101
+ return opencodePath;
102
+ }
103
+ catch {
104
+ const possiblePaths = isWindows
105
+ ? [
106
+ path.join(os.homedir(), ".local", "bin", "opencode.exe"),
107
+ path.join(process.env.APPDATA || "", "npm", "opencode.cmd"),
108
+ path.join(process.env.APPDATA || "", "npm", "opencode"),
109
+ ]
110
+ : [
111
+ path.join(os.homedir(), ".local", "bin", "opencode"),
112
+ "/opt/homebrew/bin/opencode",
113
+ "/usr/local/bin/opencode",
114
+ "/usr/bin/opencode",
115
+ ];
116
+ for (const p of possiblePaths) {
117
+ if (fs.existsSync(p)) {
118
+ return p;
119
+ }
120
+ }
121
+ (0, cli_common_1.log)(`OpenCode CLI not found in PATH or common locations`, "red");
122
+ (0, cli_common_1.log)(`Please install OpenCode first: https://opencode.ai`, "red");
123
+ process.exit(1);
124
+ }
125
+ }
126
+ /**
127
+ * Resolve symlinks to the real OpenCode executable path.
128
+ *
129
+ * @param customPath - Optional explicit path from `--opencode-path`.
130
+ * @returns Canonical binary path.
131
+ */
132
+ function getOpenCodeBinaryPath(customPath) {
133
+ const opencodePath = findOpenCodePath(customPath);
134
+ try {
135
+ return fs.realpathSync(opencodePath);
136
+ }
137
+ catch {
138
+ return opencodePath;
139
+ }
140
+ }
141
+ /**
142
+ * Resolve which `opencode.json` file to read, following OpenCode precedence.
143
+ *
144
+ * Order: `OPENCODE_CONFIG` → `OPENCODE_CONFIG_DIR/opencode.json` →
145
+ * `~/.config/opencode/opencode.json` → `.opencode/opencode.json`.
146
+ *
147
+ * @returns Absolute path to config file, or null if none exists.
148
+ */
149
+ function resolveOpenCodeConfigPath() {
150
+ if (process.env.OPENCODE_CONFIG && fs.existsSync(process.env.OPENCODE_CONFIG)) {
151
+ return process.env.OPENCODE_CONFIG;
152
+ }
153
+ if (process.env.OPENCODE_CONFIG_DIR) {
154
+ const configPath = path.join(process.env.OPENCODE_CONFIG_DIR, "opencode.json");
155
+ if (fs.existsSync(configPath)) {
156
+ return configPath;
157
+ }
158
+ }
159
+ const globalConfig = path.join(os.homedir(), ".config", "opencode", "opencode.json");
160
+ if (fs.existsSync(globalConfig)) {
161
+ return globalConfig;
162
+ }
163
+ const projectConfig = path.join(process.cwd(), ".opencode", "opencode.json");
164
+ if (fs.existsSync(projectConfig)) {
165
+ return projectConfig;
166
+ }
167
+ return null;
168
+ }
169
+ /**
170
+ * Load and parse OpenCode config, returning an empty object on missing/invalid file.
171
+ *
172
+ * @returns Parsed OpenCode config or `{}`.
173
+ */
174
+ function readOpenCodeConfig() {
175
+ const configPath = resolveOpenCodeConfigPath();
176
+ if (!configPath) {
177
+ return {};
178
+ }
179
+ try {
180
+ return JSON.parse(fs.readFileSync(configPath, "utf-8"));
181
+ }
182
+ catch {
183
+ return {};
184
+ }
185
+ }
186
+ /**
187
+ * Map an OpenCode SDK npm package name to the wire API format.
188
+ *
189
+ * Delegates to `api-format.ts` which recognizes `@ai-sdk/anthropic`,
190
+ * `@ai-sdk/openai`, `@ai-sdk/openai-compatible`, etc.
191
+ *
192
+ * @param npm - Package name from provider/model config (e.g. "@ai-sdk/anthropic").
193
+ * @returns Detected API format for proxy parsing.
194
+ */
195
+ function inferApiFormat(npm) {
196
+ return (0, api_format_1.inferApiFormatFromNpm)(npm);
197
+ }
198
+ /**
199
+ * Resolve the upstream base URL for a single OpenCode provider.
200
+ *
201
+ * Uses explicit `options.baseURL` when set; falls back to built-in defaults
202
+ * for well-known provider IDs (`anthropic`, `openai`). Providers without a
203
+ * resolvable URL are skipped during route building.
204
+ *
205
+ * @param providerId - Provider key from `opencode.json`.
206
+ * @param provider - Provider configuration block.
207
+ * @returns Upstream base URL or null if the provider cannot be routed.
208
+ */
209
+ function resolveProviderBaseUrl(providerId, provider) {
210
+ if (provider?.options?.baseURL) {
211
+ return provider.options.baseURL;
212
+ }
213
+ if (providerId === "anthropic") {
214
+ return process.env.ANTHROPIC_BASE_URL || "https://api.anthropic.com";
215
+ }
216
+ if (providerId === "openai") {
217
+ return process.env.OPENAI_BASE_URL || "https://api.openai.com/v1";
218
+ }
219
+ return null;
220
+ }
221
+ /**
222
+ * Build a model-keyed routing map for the reverse proxy.
223
+ *
224
+ * Keys include bare `modelId`, `providerId/modelId`, and `providerId/*`
225
+ * fallback entries. Providers without explicit models get a wildcard-only route.
226
+ * The proxy looks up routes by model name at request time.
227
+ *
228
+ * @param config - Parsed OpenCode configuration.
229
+ * @returns Map from model lookup keys to {@link ModelRoute} entries.
230
+ */
231
+ function buildModelRouteMap(config) {
232
+ const map = {};
233
+ for (const [providerId, provider] of Object.entries(config.provider || {})) {
234
+ const baseURL = resolveProviderBaseUrl(providerId, provider);
235
+ if (!baseURL) {
236
+ continue;
237
+ }
238
+ const providerNpm = typeof provider.npm === "string" ? provider.npm : "";
239
+ const modelIds = Object.keys(provider.models || {});
240
+ if (modelIds.length === 0) {
241
+ // Provider configured but no per-model entries — route everything via wildcard.
242
+ const apiFormat = inferApiFormat(providerNpm);
243
+ const fallbackRoute = {
244
+ providerId,
245
+ modelId: "*",
246
+ upstreamBaseUrl: baseURL,
247
+ npm: providerNpm,
248
+ apiFormat,
249
+ isProviderFallback: true,
250
+ };
251
+ map[`${providerId}/*`] = fallbackRoute;
252
+ continue;
253
+ }
254
+ for (const modelId of modelIds) {
255
+ const modelConfig = provider.models?.[modelId];
256
+ // Model-level npm overrides provider-level npm for format detection.
257
+ const modelNpm = typeof modelConfig?.npm === "string" ? modelConfig.npm : providerNpm;
258
+ const route = {
259
+ providerId,
260
+ modelId,
261
+ upstreamBaseUrl: baseURL,
262
+ npm: modelNpm,
263
+ apiFormat: inferApiFormat(modelNpm),
264
+ };
265
+ map[modelId] = route;
266
+ map[`${providerId}/${modelId}`] = route;
267
+ }
268
+ // Wildcard fallback for models not explicitly listed in config.
269
+ const providerFallback = {
270
+ providerId,
271
+ modelId: "*",
272
+ upstreamBaseUrl: baseURL,
273
+ npm: providerNpm,
274
+ apiFormat: inferApiFormat(providerNpm),
275
+ isProviderFallback: true,
276
+ };
277
+ map[`${providerId}/*`] = providerFallback;
278
+ }
279
+ return map;
280
+ }
281
+ /**
282
+ * List provider-level upstream routes for display and proxy bootstrap.
283
+ *
284
+ * @param config - Parsed OpenCode configuration.
285
+ * @returns Array of provider routes with resolvable base URLs.
286
+ */
287
+ function listRoutesFromConfig(config) {
288
+ const routes = [];
289
+ for (const [id, provider] of Object.entries(config.provider || {})) {
290
+ const baseURL = resolveProviderBaseUrl(id, provider);
291
+ if (baseURL) {
292
+ routes.push({ id, upstreamBaseUrl: baseURL });
293
+ }
294
+ }
295
+ return routes;
296
+ }
297
+ /**
298
+ * Ensure localhost bypasses system HTTP proxy so OpenCode talks to our local reverse proxy.
299
+ *
300
+ * Corporate proxies often intercept `HTTP_PROXY`; without `NO_PROXY` for
301
+ * `127.0.0.1`, OpenCode would route through the corporate proxy instead of
302
+ * hitting our local listener.
303
+ *
304
+ * @param existing - Current `NO_PROXY` env value, if any.
305
+ * @returns Merged comma-separated NO_PROXY list including 127.0.0.1 and localhost.
306
+ */
307
+ function appendNoProxy(existing) {
308
+ const required = ["127.0.0.1", "localhost"];
309
+ const current = (existing || "")
310
+ .split(",")
311
+ .map((entry) => entry.trim())
312
+ .filter(Boolean);
313
+ const merged = [...new Set([...current, ...required])];
314
+ return merged.join(",");
315
+ }
316
+ /**
317
+ * OpenCode tool profile consumed by `trace-runner.ts`.
318
+ *
319
+ * Always uses reverse-proxy mode. Config injection is inline via
320
+ * `OPENCODE_CONFIG_CONTENT` — no filesystem overlay to clean up.
321
+ */
322
+ exports.opencodeProfile = {
323
+ name: "opencode",
324
+ displayName: "OpenCode",
325
+ logDirectory: ".opencode-trace",
326
+ /** @inheritdoc ToolProfile.findBinary */
327
+ findBinary(customPath) {
328
+ return findOpenCodePath(customPath);
329
+ },
330
+ /** @inheritdoc ToolProfile.getBinaryPath */
331
+ getBinaryPath(customPath) {
332
+ return getOpenCodeBinaryPath(customPath);
333
+ },
334
+ /** @inheritdoc ToolProfile.listProviderRoutes */
335
+ listProviderRoutes() {
336
+ return listRoutesFromConfig(readOpenCodeConfig());
337
+ },
338
+ /** @inheritdoc ToolProfile.listModelRoutes */
339
+ listModelRoutes() {
340
+ return buildModelRouteMap(readOpenCodeConfig());
341
+ },
342
+ /**
343
+ * Summarize upstream URLs for CLI startup logging.
344
+ *
345
+ * Returns a single URL when one provider is configured, a comma-separated
346
+ * `id → url` list for multiple providers, or the Anthropic default when
347
+ * no providers are configured.
348
+ */
349
+ readUpstreamBaseUrl() {
350
+ const routes = listRoutesFromConfig(readOpenCodeConfig());
351
+ if (routes.length === 0) {
352
+ return process.env.ANTHROPIC_BASE_URL || "https://api.anthropic.com";
353
+ }
354
+ if (routes.length === 1) {
355
+ return routes[0].upstreamBaseUrl;
356
+ }
357
+ return routes.map((route) => `${route.id} → ${route.upstreamBaseUrl}`).join(", ");
358
+ },
359
+ /**
360
+ * Inject runtime OpenCode config so all providers point at the local proxy.
361
+ *
362
+ * Serializes a minimal `{ provider: { id: { options: { baseURL } } } }`
363
+ * object into `OPENCODE_CONFIG_CONTENT`. Removes `OPENCODE_CONFIG` from
364
+ * the child env because a file path would take precedence over the inline
365
+ * content override.
366
+ *
367
+ * @param proxyUrl - Local proxy URL (e.g. `http://127.0.0.1:PORT`).
368
+ */
369
+ prepareSpawnEnv(proxyUrl) {
370
+ const config = readOpenCodeConfig();
371
+ const routes = listRoutesFromConfig(config);
372
+ const proxyBase = proxyUrl.replace(/\/$/, "");
373
+ if (routes.length === 0) {
374
+ (0, cli_common_1.log)("Warning: no provider.options.baseURL found in OpenCode config — proxy may not intercept traffic", "yellow");
375
+ }
376
+ // All providers share one proxy URL; routing is done by model name at request time.
377
+ const providerOverrides = {};
378
+ for (const route of routes) {
379
+ providerOverrides[route.id] = {
380
+ options: { baseURL: proxyBase },
381
+ };
382
+ }
383
+ // OPENCODE_CONFIG on disk would override OPENCODE_CONFIG_CONTENT — drop it.
384
+ const { OPENCODE_CONFIG: _removedConfig, ...restEnv } = process.env;
385
+ const spawnEnv = {
386
+ ...restEnv,
387
+ OPENCODE_CONFIG_CONTENT: JSON.stringify({ provider: providerOverrides }),
388
+ NO_PROXY: appendNoProxy(process.env.NO_PROXY),
389
+ };
390
+ return { tmpDir: null, spawnEnv };
391
+ },
392
+ /** No filesystem overlay — `OPENCODE_CONFIG_CONTENT` is ephemeral. */
393
+ cleanupTempConfig(_tmpDir) {
394
+ // OPENCODE_CONFIG_CONTENT is inline — nothing to clean up.
395
+ },
396
+ /** OpenCode has no Node.js fetch hook; proxy mode only. */
397
+ supportsNodeInterceptor() {
398
+ return false;
399
+ },
400
+ };
401
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/tools/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @file tools/types.ts
3
+ * @description Core abstractions for multi-tool tracing via Tool Profiles.
4
+ *
5
+ * Each supported CLI (Claude Code, OpenCode, Codex) implements `ToolProfile`
6
+ * so `trace-runner.ts` can launch the tool with either a Node.js fetch hook
7
+ * or a local reverse proxy without tool-specific branching in the runner.
8
+ */
9
+ /** Upstream API endpoint configuration for a single provider (Codex multi-upstream). */
10
+ export interface ProviderRoute {
11
+ /** Stable route identifier used for path-based dispatch. */
12
+ id: string;
13
+ /** Real upstream base URL before proxy rewrite. */
14
+ upstreamBaseUrl: string;
15
+ /** Request path prefixes that select this route (Codex multi-upstream). */
16
+ matchPathPrefixes?: string[];
17
+ /**
18
+ * When set, forward to this exact upstream path instead of concatenating
19
+ * {@link upstreamBaseUrl} path prefix with the request path (Codex Apps MCP remapping).
20
+ */
21
+ fixedUpstreamPath?: string;
22
+ }
23
+ /**
24
+ * Wire format of the upstream LLM API.
25
+ * Used for parsing, display labels, and adapter selection in the reverse proxy.
26
+ */
27
+ export type ApiFormat = "anthropic" | "openai" | "openai-responses" | "unknown";
28
+ /**
29
+ * Model-specific routing entry for OpenCode-style `provider/model` keys.
30
+ * Maps a configured model to its upstream URL and expected API format.
31
+ */
32
+ export interface ModelRoute {
33
+ providerId: string;
34
+ modelId: string;
35
+ upstreamBaseUrl: string;
36
+ /** npm package name hint from OpenCode config (e.g. "@ai-sdk/anthropic"). */
37
+ npm: string;
38
+ apiFormat: ApiFormat;
39
+ /** True when this route matches any model under providerId (e.g. providerId/*). */
40
+ isProviderFallback?: boolean;
41
+ }
42
+ /**
43
+ * Pluggable profile describing how to find, configure, and spawn a coding CLI.
44
+ * Implemented by `claude.ts`, `opencode.ts`, and `codex.ts`.
45
+ */
46
+ export interface ToolProfile {
47
+ /** Short machine name: "claude" | "opencode" | "codex". */
48
+ name: string;
49
+ /** Human-readable label for CLI output. */
50
+ displayName: string;
51
+ /** Relative log directory under cwd (e.g. ".claude-trace"). */
52
+ logDirectory: string;
53
+ /** Resolve binary path on PATH or from optional custom override. */
54
+ findBinary(customPath?: string): string;
55
+ /** Resolve wrapper scripts/symlinks to the executable used for spawn. */
56
+ getBinaryPath(customPath?: string): string;
57
+ /** Default upstream base URL when no per-provider routes exist. */
58
+ readUpstreamBaseUrl(): string;
59
+ /** Optional list of provider routes (Codex, multi-provider setups). */
60
+ listProviderRoutes?(): ProviderRoute[];
61
+ /** Optional model-keyed routes for OpenCode proxy routing. */
62
+ listModelRoutes?(): Record<string, ModelRoute>;
63
+ /**
64
+ * Build process environment for spawning the tool against the local proxy.
65
+ * @param proxyUrl - Full local proxy URL (e.g. http://127.0.0.1:PORT)
66
+ * @returns tmpDir - Overlay config directory to clean up, or null if none
67
+ * @returns spawnEnv - Complete env vars for child process
68
+ */
69
+ prepareSpawnEnv(proxyUrl: string): {
70
+ tmpDir: string | null;
71
+ spawnEnv: NodeJS.ProcessEnv;
72
+ };
73
+ /** Remove temporary overlay directory created by prepareSpawnEnv. */
74
+ cleanupTempConfig(tmpDir: string | null): void;
75
+ /** Whether V1 Node `--require interceptor` mode is supported for this tool. */
76
+ supportsNodeInterceptor(): boolean;
77
+ }
78
+ /** Runtime options passed from CLI entry points to trace-runner. */
79
+ export interface TraceOptions {
80
+ /** Log all proxied/fetched requests, not only primary message endpoints. */
81
+ includeAllRequests?: boolean;
82
+ /** Open the generated HTML report when the session ends. */
83
+ openInBrowser?: boolean;
84
+ /** Custom log file base name (without extension) under logDirectory. */
85
+ logBaseName?: string;
86
+ /** Disable redaction of Authorization, Cookie, and similar headers. */
87
+ logSensitiveHeaders?: boolean;
88
+ /** User-supplied path to the tool binary (--claude-path, etc.). */
89
+ customBinaryPath?: string;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wFAAwF;AACxF,MAAM,WAAW,aAAa;IAC7B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,mFAAmF;IACnF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC3B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxC,yEAAyE;IACzE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C,mEAAmE;IACnE,mBAAmB,IAAI,MAAM,CAAC;IAC9B,uEAAuE;IACvE,kBAAkB,CAAC,IAAI,aAAa,EAAE,CAAC;IACvC,8DAA8D;IAC9D,eAAe,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,CAAC;IAC1F,qEAAqE;IACrE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C,+EAA+E;IAC/E,uBAAuB,IAAI,OAAO,CAAC;CACnC;AAED,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC5B,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ /**
3
+ * @file tools/types.ts
4
+ * @description Core abstractions for multi-tool tracing via Tool Profiles.
5
+ *
6
+ * Each supported CLI (Claude Code, OpenCode, Codex) implements `ToolProfile`
7
+ * so `trace-runner.ts` can launch the tool with either a Node.js fetch hook
8
+ * or a local reverse proxy without tool-specific branching in the runner.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG"}