@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,492 @@
1
+ "use strict";
2
+ /**
3
+ * @file tools/codex.ts
4
+ * @description Tool profile for OpenAI Codex CLI tracing.
5
+ *
6
+ * This module implements the {@link ToolProfile} interface for the Codex CLI.
7
+ * Codex is a **Rust native binary** — it always uses reverse-proxy interception;
8
+ * there is no Node.js interceptor path.
9
+ *
10
+ * Key responsibilities:
11
+ *
12
+ * - **Binary resolution** — locate `codex` on PATH (same MSYS/alias handling
13
+ * as other profiles).
14
+ * - **TOML config reading** — load `config.toml` from `$CODEX_HOME` (default
15
+ * `~/.codex/`) via `codex-config-overlay.ts`.
16
+ * - **Path-based upstream routing** — register separate upstreams for OpenAI
17
+ * API Key auth (`/v1/responses`), ChatGPT OAuth (`/backend-api/codex`), ChatGPT
18
+ * Apps MCP (`/backend-api/wham`), and custom `model_providers.*.base_url` entries.
19
+ * Dispatch is handled in `codex-routing.ts` using `matchPathPrefixes` on each
20
+ * {@link ProviderRoute}.
21
+ * - **Config overlay** — build a persistent `$CODEX_HOME` overlay at
22
+ * `~/.claude-trace/codex-config-overlay/` that rewrites `openai_base_url`,
23
+ * `chatgpt_base_url`, and custom provider URLs to the local proxy.
24
+ *
25
+ * Codex uses the OpenAI Responses API wire format exclusively; all model routes
26
+ * are tagged with `apiFormat: "openai-responses"`.
27
+ */
28
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
32
+ desc = { enumerable: true, get: function() { return m[k]; } };
33
+ }
34
+ Object.defineProperty(o, k2, desc);
35
+ }) : (function(o, m, k, k2) {
36
+ if (k2 === undefined) k2 = k;
37
+ o[k2] = m[k];
38
+ }));
39
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
40
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
41
+ }) : function(o, v) {
42
+ o["default"] = v;
43
+ });
44
+ var __importStar = (this && this.__importStar) || (function () {
45
+ var ownKeys = function(o) {
46
+ ownKeys = Object.getOwnPropertyNames || function (o) {
47
+ var ar = [];
48
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
49
+ return ar;
50
+ };
51
+ return ownKeys(o);
52
+ };
53
+ return function (mod) {
54
+ if (mod && mod.__esModule) return mod;
55
+ var result = {};
56
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
57
+ __setModuleDefault(result, mod);
58
+ return result;
59
+ };
60
+ })();
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ exports.isNativeBinary = exports.codexProfile = void 0;
63
+ exports.listRoutesFromCodexConfig = listRoutesFromCodexConfig;
64
+ exports.buildCodexModelRouteMap = buildCodexModelRouteMap;
65
+ exports.getCodexBinaryPath = getCodexBinaryPath;
66
+ const child_process_1 = require("child_process");
67
+ const path = __importStar(require("path"));
68
+ const fs = __importStar(require("fs"));
69
+ const os = __importStar(require("os"));
70
+ const codex_config_overlay_1 = require("../config/codex-config-overlay");
71
+ const binary_utils_1 = require("./binary-utils");
72
+ Object.defineProperty(exports, "isNativeBinary", { enumerable: true, get: function () { return binary_utils_1.isNativeBinary; } });
73
+ const cli_common_1 = require("../cli/cli-common");
74
+ /** Default upstream for OpenAI API Key auth (`/v1/responses`). */
75
+ const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
76
+ /** Default upstream for ChatGPT OAuth auth (`/backend-api/codex/responses`). */
77
+ const DEFAULT_CHATGPT_BASE_URL = "https://chatgpt.com/backend-api/codex";
78
+ /** npm hint for Codex Responses API wire format. */
79
+ const RESPONSES_NPM = "@openai/codex-responses";
80
+ /** Request path prefixes routed to the OpenAI API Key upstream. */
81
+ const OPENAI_PATH_PREFIXES = ["/v1/responses", "/responses"];
82
+ /** Request path prefixes routed to the ChatGPT OAuth upstream. */
83
+ const CHATGPT_PATH_PREFIXES = ["/backend-api/codex"];
84
+ /** Path prefix for ChatGPT Apps MCP (`codex_apps` → `/backend-api/wham/apps`). */
85
+ const CHATGPT_WHAM_PATH_PREFIXES = ["/backend-api/wham"];
86
+ /**
87
+ * Proxy path Codex builds when `chatgpt_base_url` is a bare local proxy URL
88
+ * (`http://127.0.0.1:PORT`) — see `codex_apps_mcp_url_for_base_url` in Codex source.
89
+ */
90
+ const CHATGPT_APPS_MCP_PROXY_PATH_PREFIXES = ["/api/codex/apps"];
91
+ /** Canonical upstream path for ChatGPT Apps MCP on chatgpt.com. */
92
+ const CHATGPT_APPS_MCP_UPSTREAM_PATH = "/backend-api/wham/apps";
93
+ /**
94
+ * Locate the Codex CLI executable on PATH or in common install locations.
95
+ *
96
+ * @param customPath - Optional explicit path from `--codex-path`.
97
+ * @returns Resolved path to the Codex launcher.
98
+ * @throws Exits the process with code 1 if no binary is found.
99
+ */
100
+ function findCodexPath(customPath) {
101
+ if (customPath) {
102
+ if (!fs.existsSync(customPath)) {
103
+ (0, cli_common_1.log)(`Codex binary not found at specified path: ${customPath}`, "red");
104
+ process.exit(1);
105
+ }
106
+ return customPath;
107
+ }
108
+ const isWindows = process.platform === "win32";
109
+ try {
110
+ const findCmd = isWindows ? "where.exe codex" : "which codex";
111
+ let codexPath = (0, child_process_1.execSync)(findCmd, { encoding: "utf-8" }).trim().split(/\r?\n/)[0];
112
+ const msysMatch = codexPath.match(/^\/([a-zA-Z])\//);
113
+ if (msysMatch) {
114
+ codexPath = msysMatch[1].toUpperCase() + ":/" + codexPath.slice(3);
115
+ }
116
+ const aliasMatch = codexPath.match(/:\s*aliased to\s+(.+)$/);
117
+ if (aliasMatch && aliasMatch[1]) {
118
+ codexPath = aliasMatch[1];
119
+ }
120
+ return codexPath;
121
+ }
122
+ catch {
123
+ const possiblePaths = isWindows
124
+ ? [
125
+ path.join(os.homedir(), ".local", "bin", "codex.exe"),
126
+ path.join(process.env.APPDATA || "", "npm", "codex.cmd"),
127
+ path.join(process.env.APPDATA || "", "npm", "codex"),
128
+ ]
129
+ : [
130
+ path.join(os.homedir(), ".local", "bin", "codex"),
131
+ "/opt/homebrew/bin/codex",
132
+ "/usr/local/bin/codex",
133
+ "/usr/bin/codex",
134
+ ];
135
+ for (const p of possiblePaths) {
136
+ if (fs.existsSync(p)) {
137
+ return p;
138
+ }
139
+ }
140
+ (0, cli_common_1.log)(`Codex CLI not found in PATH or common locations`, "red");
141
+ (0, cli_common_1.log)(`Please install Codex CLI first: https://github.com/openai/codex`, "red");
142
+ process.exit(1);
143
+ }
144
+ }
145
+ /**
146
+ * Resolve symlinks to the real Codex executable path.
147
+ *
148
+ * @param customPath - Optional explicit path from `--codex-path`.
149
+ * @returns Canonical binary path.
150
+ */
151
+ function getCodexBinaryPath(customPath) {
152
+ const codexPath = findCodexPath(customPath);
153
+ try {
154
+ return fs.realpathSync(codexPath);
155
+ }
156
+ catch {
157
+ return codexPath;
158
+ }
159
+ }
160
+ /**
161
+ * Resolve the OpenAI API Key upstream base URL from config or environment.
162
+ *
163
+ * @param config - Parsed Codex TOML config.
164
+ * @returns OpenAI-compatible base URL.
165
+ */
166
+ function resolveOpenAiBaseUrl(config) {
167
+ return config.openai_base_url || process.env.OPENAI_BASE_URL || DEFAULT_OPENAI_BASE_URL;
168
+ }
169
+ /**
170
+ * Resolve the ChatGPT OAuth upstream base URL from config or default.
171
+ *
172
+ * @param config - Parsed Codex TOML config.
173
+ * @returns ChatGPT backend base URL.
174
+ */
175
+ function resolveChatGptBaseUrl(config) {
176
+ return config.chatgpt_base_url || DEFAULT_CHATGPT_BASE_URL;
177
+ }
178
+ /**
179
+ * ChatGPT site origin (scheme + host only) for `/backend-api/*` paths outside `/backend-api/codex`.
180
+ *
181
+ * Used for `codex_apps` MCP (`/backend-api/wham/apps`) so requests are not prefixed with
182
+ * `/backend-api/codex` when forwarded upstream.
183
+ *
184
+ * @param config - Parsed Codex TOML config.
185
+ */
186
+ function resolveChatGptSiteOrigin(config) {
187
+ const parsed = new URL(resolveChatGptBaseUrl(config));
188
+ return `${parsed.protocol}//${parsed.host}`;
189
+ }
190
+ /**
191
+ * Path prefixes for the ChatGPT OAuth upstream.
192
+ *
193
+ * When `auth.json` sets `auth_mode: "chatgpt"`, Codex may POST to `/responses`
194
+ * against the proxy base URL; those requests must still reach ChatGPT OAuth upstream.
195
+ *
196
+ * @param codexHome - User's `$CODEX_HOME` directory for auth file detection.
197
+ */
198
+ function chatGptPathPrefixes(codexHome) {
199
+ if ((0, codex_config_overlay_1.isChatGptAuthMode)(codexHome)) {
200
+ return [...CHATGPT_PATH_PREFIXES, ...OPENAI_PATH_PREFIXES];
201
+ }
202
+ return CHATGPT_PATH_PREFIXES;
203
+ }
204
+ /**
205
+ * Determine whether the OpenAI API Key route should be included.
206
+ *
207
+ * Included when explicit config/env signals OpenAI usage, or when the active
208
+ * `model_provider` is unset/openai, or when a custom provider has no own base URL.
209
+ * Excluded when another built-in provider (e.g. `chatgpt`) is active and owns routing,
210
+ * or when `auth.json` explicitly selects ChatGPT OAuth (`auth_mode: "chatgpt"`).
211
+ *
212
+ * @param config - Parsed Codex TOML config.
213
+ * @param codexHome - User's `$CODEX_HOME` directory for auth file detection.
214
+ * @returns True if the OpenAI route should be registered.
215
+ */
216
+ function shouldIncludeOpenAiRoute(config, codexHome) {
217
+ if ((0, codex_config_overlay_1.isChatGptAuthMode)(codexHome)) {
218
+ return false;
219
+ }
220
+ if (config.openai_base_url || process.env.OPENAI_API_KEY || process.env.OPENAI_BASE_URL) {
221
+ return true;
222
+ }
223
+ const modelProvider = config.model_provider;
224
+ if (!modelProvider || modelProvider === "openai") {
225
+ return true;
226
+ }
227
+ // Another built-in provider (e.g. chatgpt) owns routing — skip OpenAI unless custom.
228
+ if (codex_config_overlay_1.RESERVED_BUILTIN_PROVIDERS.has(modelProvider) && modelProvider !== "openai") {
229
+ return false;
230
+ }
231
+ const custom = config.model_providers?.[modelProvider];
232
+ return !custom?.base_url;
233
+ }
234
+ /**
235
+ * Determine whether the ChatGPT OAuth route should be included.
236
+ *
237
+ * Active when `chatgpt_base_url` is set in config or when OAuth credentials
238
+ * are present in `$CODEX_HOME` (detected by `hasChatGptAuth`).
239
+ *
240
+ * @param config - Parsed Codex TOML config.
241
+ * @param codexHome - User's `$CODEX_HOME` directory for auth file detection.
242
+ * @returns True if ChatGPT OAuth credentials or explicit URL are present.
243
+ */
244
+ function shouldIncludeChatGptRoute(config, codexHome) {
245
+ if (config.chatgpt_base_url) {
246
+ return true;
247
+ }
248
+ return (0, codex_config_overlay_1.hasChatGptAuth)(codexHome);
249
+ }
250
+ /**
251
+ * Collect upstream routes for non-reserved custom `model_providers` entries.
252
+ *
253
+ * Skips built-in provider IDs (`openai`, `chatgpt`) which are handled
254
+ * separately by `shouldIncludeOpenAiRoute` / `shouldIncludeChatGptRoute`.
255
+ *
256
+ * @param config - Parsed Codex TOML config.
257
+ * @returns Provider routes for custom providers with explicit `base_url`.
258
+ */
259
+ function listCustomProviderRoutes(config) {
260
+ const routes = [];
261
+ for (const [id, provider] of Object.entries(config.model_providers || {})) {
262
+ if (codex_config_overlay_1.RESERVED_BUILTIN_PROVIDERS.has(id)) {
263
+ continue;
264
+ }
265
+ if (!provider.base_url) {
266
+ continue;
267
+ }
268
+ routes.push({
269
+ id,
270
+ upstreamBaseUrl: provider.base_url,
271
+ matchPathPrefixes: OPENAI_PATH_PREFIXES,
272
+ });
273
+ }
274
+ return routes;
275
+ }
276
+ /**
277
+ * Build the full list of upstream provider routes from Codex config.
278
+ *
279
+ * Combines the active custom provider, OpenAI API Key route, ChatGPT OAuth
280
+ * route, and any additional custom providers. Each route carries
281
+ * `matchPathPrefixes` for path-based dispatch in `codex-routing.ts`.
282
+ *
283
+ * @param config - Parsed Codex TOML config.
284
+ * @param codexHome - Optional override for `$CODEX_HOME` (defaults to user home).
285
+ * @returns Deduplicated provider route list.
286
+ */
287
+ function listRoutesFromCodexConfig(config, codexHome) {
288
+ const home = codexHome || (0, codex_config_overlay_1.resolveUserCodexHome)();
289
+ const routes = [];
290
+ const modelProvider = config.model_provider;
291
+ // Active custom provider takes priority when it has its own base_url.
292
+ if (modelProvider && !codex_config_overlay_1.RESERVED_BUILTIN_PROVIDERS.has(modelProvider)) {
293
+ const custom = config.model_providers?.[modelProvider];
294
+ if (custom?.base_url) {
295
+ routes.push({
296
+ id: modelProvider,
297
+ upstreamBaseUrl: custom.base_url,
298
+ matchPathPrefixes: OPENAI_PATH_PREFIXES,
299
+ });
300
+ }
301
+ }
302
+ if (shouldIncludeOpenAiRoute(config, home)) {
303
+ routes.push({
304
+ id: "openai",
305
+ upstreamBaseUrl: resolveOpenAiBaseUrl(config),
306
+ matchPathPrefixes: OPENAI_PATH_PREFIXES,
307
+ });
308
+ }
309
+ if (shouldIncludeChatGptRoute(config, home)) {
310
+ routes.push({
311
+ id: "chatgpt",
312
+ upstreamBaseUrl: resolveChatGptBaseUrl(config),
313
+ matchPathPrefixes: chatGptPathPrefixes(home),
314
+ });
315
+ routes.push({
316
+ id: "chatgpt-wham",
317
+ upstreamBaseUrl: resolveChatGptSiteOrigin(config),
318
+ matchPathPrefixes: CHATGPT_WHAM_PATH_PREFIXES,
319
+ });
320
+ routes.push({
321
+ id: "chatgpt-apps-mcp",
322
+ upstreamBaseUrl: resolveChatGptSiteOrigin(config),
323
+ matchPathPrefixes: CHATGPT_APPS_MCP_PROXY_PATH_PREFIXES,
324
+ fixedUpstreamPath: CHATGPT_APPS_MCP_UPSTREAM_PATH,
325
+ });
326
+ }
327
+ for (const route of listCustomProviderRoutes(config)) {
328
+ if (!routes.some((existing) => existing.id === route.id)) {
329
+ routes.push(route);
330
+ }
331
+ }
332
+ return routes;
333
+ }
334
+ /**
335
+ * Construct a single {@link ModelRoute} for Codex Responses API traffic.
336
+ *
337
+ * All Codex routes use `apiFormat: "openai-responses"` regardless of auth mode.
338
+ *
339
+ * @param providerId - Active provider identifier.
340
+ * @param modelId - Model name or `"*"` for wildcard fallback.
341
+ * @param baseURL - Upstream base URL for this route.
342
+ * @param isProviderFallback - True for `providerId/*` wildcard entries.
343
+ */
344
+ function buildModelRoute(providerId, modelId, baseURL, isProviderFallback = false) {
345
+ return {
346
+ providerId,
347
+ modelId,
348
+ upstreamBaseUrl: baseURL,
349
+ npm: RESPONSES_NPM,
350
+ apiFormat: "openai-responses",
351
+ isProviderFallback,
352
+ };
353
+ }
354
+ /**
355
+ * Build a model-keyed routing map for the Codex reverse proxy.
356
+ *
357
+ * Uses the configured `model` and `model_provider` to select the active
358
+ * upstream, then registers both exact (`model`, `provider/model`) and wildcard
359
+ * (`provider/*`) lookup keys.
360
+ *
361
+ * @param config - Parsed Codex TOML config.
362
+ * @param codexHome - Optional override for `$CODEX_HOME`.
363
+ * @returns Map from model lookup keys to {@link ModelRoute} entries.
364
+ */
365
+ function buildCodexModelRouteMap(config, codexHome) {
366
+ const map = {};
367
+ const routes = listRoutesFromCodexConfig(config, codexHome);
368
+ const model = config.model;
369
+ if (!model) {
370
+ return map;
371
+ }
372
+ const modelProvider = config.model_provider || "openai";
373
+ // Prefer the configured provider, then OpenAI, then first available route.
374
+ const activeRoute = routes.find((route) => route.id === modelProvider) ||
375
+ routes.find((route) => route.id === "openai") ||
376
+ routes[0];
377
+ if (!activeRoute) {
378
+ return map;
379
+ }
380
+ const route = buildModelRoute(modelProvider, model, activeRoute.upstreamBaseUrl);
381
+ map[model] = route;
382
+ map[`${modelProvider}/${model}`] = route;
383
+ const fallback = buildModelRoute(modelProvider, "*", activeRoute.upstreamBaseUrl, true);
384
+ map[`${modelProvider}/*`] = fallback;
385
+ return map;
386
+ }
387
+ /**
388
+ * Ensure localhost bypasses system HTTP proxy so Codex talks to our local reverse proxy.
389
+ *
390
+ * @param existing - Current `NO_PROXY` env value, if any.
391
+ * @returns Merged comma-separated NO_PROXY list including 127.0.0.1 and localhost.
392
+ */
393
+ function appendNoProxy(existing) {
394
+ const required = ["127.0.0.1", "localhost"];
395
+ const current = (existing || "")
396
+ .split(",")
397
+ .map((entry) => entry.trim())
398
+ .filter(Boolean);
399
+ const merged = [...new Set([...current, ...required])];
400
+ return merged.join(",");
401
+ }
402
+ /**
403
+ * Codex CLI tool profile consumed by `trace-runner.ts`.
404
+ *
405
+ * Always uses reverse-proxy mode with a persistent `$CODEX_HOME` overlay at
406
+ * `~/.claude-trace/codex-config-overlay/`.
407
+ */
408
+ exports.codexProfile = {
409
+ name: "codex",
410
+ displayName: "Codex CLI",
411
+ logDirectory: ".codex-trace",
412
+ /** @inheritdoc ToolProfile.findBinary */
413
+ findBinary(customPath) {
414
+ return findCodexPath(customPath);
415
+ },
416
+ /** @inheritdoc ToolProfile.getBinaryPath */
417
+ getBinaryPath(customPath) {
418
+ return getCodexBinaryPath(customPath);
419
+ },
420
+ /** @inheritdoc ToolProfile.listProviderRoutes */
421
+ listProviderRoutes() {
422
+ const home = (0, codex_config_overlay_1.resolveUserCodexHome)();
423
+ return listRoutesFromCodexConfig((0, codex_config_overlay_1.readCodexConfig)(home), home);
424
+ },
425
+ /** @inheritdoc ToolProfile.listModelRoutes */
426
+ listModelRoutes() {
427
+ const home = (0, codex_config_overlay_1.resolveUserCodexHome)();
428
+ return buildCodexModelRouteMap((0, codex_config_overlay_1.readCodexConfig)(home), home);
429
+ },
430
+ /**
431
+ * Summarize upstream URLs for CLI startup logging.
432
+ *
433
+ * Returns a single URL, a comma-separated `id → url` list, or the OpenAI
434
+ * default when no routes are configured.
435
+ */
436
+ readUpstreamBaseUrl() {
437
+ const routes = exports.codexProfile.listProviderRoutes?.() ?? [];
438
+ if (routes.length === 0) {
439
+ return DEFAULT_OPENAI_BASE_URL;
440
+ }
441
+ if (routes.length === 1) {
442
+ return routes[0].upstreamBaseUrl;
443
+ }
444
+ return routes.map((route) => `${route.id} → ${route.upstreamBaseUrl}`).join(", ");
445
+ },
446
+ /**
447
+ * Build a `$CODEX_HOME` overlay with rewritten upstream URLs.
448
+ *
449
+ * Syncs the user's real `$CODEX_HOME` into the persistent overlay directory,
450
+ * rewrites base URLs to `proxyUrl`, and sets `CODEX_HOME` in the child env
451
+ * to point at the overlay.
452
+ *
453
+ * @param proxyUrl - Local proxy URL (e.g. `http://127.0.0.1:PORT`).
454
+ */
455
+ prepareSpawnEnv(proxyUrl) {
456
+ const sourceHome = (0, codex_config_overlay_1.resolveUserCodexHome)();
457
+ const overlayDir = (0, codex_config_overlay_1.getCodexConfigOverlayDir)();
458
+ const syncResult = (0, codex_config_overlay_1.syncCodexConfigOverlay)(sourceHome, overlayDir, proxyUrl);
459
+ if (syncResult.skipped.length > 0) {
460
+ for (const skip of syncResult.skipped) {
461
+ (0, cli_common_1.log)(`Warning: codex overlay skip ${skip.entry}: ${skip.reason}`, "yellow");
462
+ }
463
+ }
464
+ const spawnEnv = {
465
+ ...process.env,
466
+ CODEX_HOME: overlayDir,
467
+ NO_PROXY: appendNoProxy(process.env.NO_PROXY),
468
+ };
469
+ return { tmpDir: overlayDir, spawnEnv };
470
+ },
471
+ /**
472
+ * Remove a temporary overlay directory after the session ends.
473
+ *
474
+ * Skips the persistent overlay at `~/.claude-trace/codex-config-overlay/`.
475
+ */
476
+ cleanupTempConfig(tmpDir) {
477
+ if (!tmpDir || (0, codex_config_overlay_1.isPersistentCodexOverlayDir)(tmpDir)) {
478
+ return;
479
+ }
480
+ try {
481
+ fs.rmSync(tmpDir, { recursive: true, force: true });
482
+ }
483
+ catch {
484
+ // Best-effort cleanup
485
+ }
486
+ },
487
+ /** Codex is a Rust binary — no Node.js fetch hook. */
488
+ supportsNodeInterceptor() {
489
+ return false;
490
+ },
491
+ };
492
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/tools/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @file tools/opencode.ts
3
+ * @description Tool profile for OpenCode CLI tracing.
4
+ *
5
+ * This module implements the {@link ToolProfile} interface for OpenCode.
6
+ * Unlike Claude Code, OpenCode **always** uses reverse-proxy interception —
7
+ * there is no Node.js `fetch` hook path.
8
+ *
9
+ * Key responsibilities:
10
+ *
11
+ * - **Binary resolution** — locate `opencode` on PATH with the same
12
+ * MSYS/alias handling used by the Claude profile.
13
+ * - **Config discovery** — read `opencode.json` following OpenCode's
14
+ * precedence: `OPENCODE_CONFIG` → `OPENCODE_CONFIG_DIR` → global → project.
15
+ * - **Model-based routing** — build a `Record<string, ModelRoute>` from
16
+ * configured providers/models so `reverse-proxy.ts` can pick the correct
17
+ * upstream and API format (`anthropic` vs `openai`) per request.
18
+ * - **Runtime config injection** — set `OPENCODE_CONFIG_CONTENT` with all
19
+ * provider `baseURL` values rewritten to the local proxy, without touching
20
+ * the user's on-disk config file.
21
+ *
22
+ * Built-in `models.dev` providers not listed in `opencode.json` are outside
23
+ * the scope of interception; only explicitly configured providers are routed.
24
+ */
25
+ import type { ApiFormat, ModelRoute, ToolProfile } from "./types";
26
+ import { isNativeBinary } from "./binary-utils";
27
+ /** Per-model entry inside an OpenCode provider block. */
28
+ interface OpenCodeModelConfig {
29
+ name?: string;
30
+ npm?: string;
31
+ [key: string]: unknown;
32
+ }
33
+ /** Provider block from `opencode.json` with optional SDK npm hint and base URL. */
34
+ interface OpenCodeProviderConfig {
35
+ npm?: string;
36
+ models?: Record<string, OpenCodeModelConfig>;
37
+ options?: {
38
+ baseURL?: string;
39
+ [key: string]: unknown;
40
+ };
41
+ [key: string]: unknown;
42
+ }
43
+ /** Top-level OpenCode configuration shape (subset used for routing). */
44
+ interface OpenCodeConfig {
45
+ provider?: Record<string, OpenCodeProviderConfig>;
46
+ [key: string]: unknown;
47
+ }
48
+ /**
49
+ * Resolve symlinks to the real OpenCode executable path.
50
+ *
51
+ * @param customPath - Optional explicit path from `--opencode-path`.
52
+ * @returns Canonical binary path.
53
+ */
54
+ declare function getOpenCodeBinaryPath(customPath?: string): string;
55
+ /**
56
+ * Map an OpenCode SDK npm package name to the wire API format.
57
+ *
58
+ * Delegates to `api-format.ts` which recognizes `@ai-sdk/anthropic`,
59
+ * `@ai-sdk/openai`, `@ai-sdk/openai-compatible`, etc.
60
+ *
61
+ * @param npm - Package name from provider/model config (e.g. "@ai-sdk/anthropic").
62
+ * @returns Detected API format for proxy parsing.
63
+ */
64
+ declare function inferApiFormat(npm: string): ApiFormat;
65
+ /**
66
+ * Build a model-keyed routing map for the reverse proxy.
67
+ *
68
+ * Keys include bare `modelId`, `providerId/modelId`, and `providerId/*`
69
+ * fallback entries. Providers without explicit models get a wildcard-only route.
70
+ * The proxy looks up routes by model name at request time.
71
+ *
72
+ * @param config - Parsed OpenCode configuration.
73
+ * @returns Map from model lookup keys to {@link ModelRoute} entries.
74
+ */
75
+ declare function buildModelRouteMap(config: OpenCodeConfig): Record<string, ModelRoute>;
76
+ /**
77
+ * OpenCode tool profile consumed by `trace-runner.ts`.
78
+ *
79
+ * Always uses reverse-proxy mode. Config injection is inline via
80
+ * `OPENCODE_CONFIG_CONTENT` — no filesystem overlay to clean up.
81
+ */
82
+ export declare const opencodeProfile: ToolProfile;
83
+ /** Re-exported for tests and `trace-runner.ts` binary detection. */
84
+ export { getOpenCodeBinaryPath, isNativeBinary, buildModelRouteMap, inferApiFormat };
85
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/tools/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAiB,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,yDAAyD;AACzD,UAAU,mBAAmB;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,mFAAmF;AACnF,UAAU,sBAAsB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACvB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,wEAAwE;AACxE,UAAU,cAAc;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAClD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AA+DD;;;;;GAKG;AACH,iBAAS,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAqDD;;;;;;;;GAQG;AACH,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAE9C;AA0BD;;;;;;;;;GASG;AACH,iBAAS,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAuD9E;AAyCD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,WA8F7B,CAAC;AAEF,oEAAoE;AACpE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}