@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,449 @@
1
+ "use strict";
2
+ /**
3
+ * @file tools/claude.ts
4
+ * @description Tool profile for Claude Code CLI tracing.
5
+ *
6
+ * This module is the Claude-specific implementation of the {@link ToolProfile}
7
+ * interface consumed by `trace-runner.ts`. Responsibilities include:
8
+ *
9
+ * - **Binary resolution** — locate Claude on PATH, unwrap bash/npm wrappers,
10
+ * and distinguish V1 Node.js scripts from V2+ native Mach-O/ELF/PE binaries.
11
+ * - **Upstream URL discovery** — read `ANTHROPIC_BASE_URL` from `settings.json`
12
+ * or environment so the reverse proxy knows where to forward traffic.
13
+ * - **Spawn environment** — set `ANTHROPIC_BASE_URL` to the local proxy; when
14
+ * `settings.json` also defines that variable, build a persistent config overlay
15
+ * at `~/.claude-trace/claude-config-overlay/` so the proxy URL wins without
16
+ * editing the user's original `~/.claude` directory.
17
+ * - **OAuth token extraction** — optional `--extract-token` mode that preloads
18
+ * `token-extractor.js` to capture a bearer token for SDK usage.
19
+ *
20
+ * Interception mode is chosen by `trace-runner.ts` after calling
21
+ * `isNativeBinary(getBinaryPath())`: native → reverse proxy, Node script →
22
+ * `node --require interceptor-loader.js`.
23
+ */
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || (function () {
41
+ var ownKeys = function(o) {
42
+ ownKeys = Object.getOwnPropertyNames || function (o) {
43
+ var ar = [];
44
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
45
+ return ar;
46
+ };
47
+ return ownKeys(o);
48
+ };
49
+ return function (mod) {
50
+ if (mod && mod.__esModule) return mod;
51
+ var result = {};
52
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
53
+ __setModuleDefault(result, mod);
54
+ return result;
55
+ };
56
+ })();
57
+ Object.defineProperty(exports, "__esModule", { value: true });
58
+ exports.resolveToJsFile = exports.isNativeBinary = exports.claudeProfile = void 0;
59
+ exports.getClaudeTraceLogDirectory = getClaudeTraceLogDirectory;
60
+ exports.extractClaudeToken = extractClaudeToken;
61
+ exports.getClaudeBinaryPath = getClaudeBinaryPath;
62
+ const child_process_1 = require("child_process");
63
+ const path = __importStar(require("path"));
64
+ const fs = __importStar(require("fs"));
65
+ const os = __importStar(require("os"));
66
+ const claude_config_overlay_1 = require("../config/claude-config-overlay");
67
+ const binary_utils_1 = require("./binary-utils");
68
+ Object.defineProperty(exports, "isNativeBinary", { enumerable: true, get: function () { return binary_utils_1.isNativeBinary; } });
69
+ Object.defineProperty(exports, "resolveToJsFile", { enumerable: true, get: function () { return binary_utils_1.resolveToJsFile; } });
70
+ const cli_common_1 = require("../cli/cli-common");
71
+ /**
72
+ * Locate the Claude CLI executable on PATH or in common install locations.
73
+ *
74
+ * Handles MSYS/Git Bash drive-letter paths (`/c/...` → `C:/...`) and shell
75
+ * alias expansion (`claude: aliased to /path/to/claude`).
76
+ *
77
+ * @param customPath - Optional explicit path from `--claude-path`.
78
+ * @returns Resolved path to the Claude launcher script or binary.
79
+ * @throws Exits the process with code 1 if no binary is found.
80
+ */
81
+ function findClaudePath(customPath) {
82
+ if (customPath) {
83
+ if (!fs.existsSync(customPath)) {
84
+ (0, cli_common_1.log)(`Claude binary not found at specified path: ${customPath}`, "red");
85
+ process.exit(1);
86
+ }
87
+ return customPath;
88
+ }
89
+ const isWindows = process.platform === "win32";
90
+ try {
91
+ const findCmd = isWindows ? "where.exe claude" : "which claude";
92
+ let claudePath = (0, child_process_1.execSync)(findCmd, { encoding: "utf-8" }).trim().split(/\r?\n/)[0];
93
+ // Git Bash / MSYS returns POSIX-style Windows paths like /c/Users/...
94
+ const msysMatch = claudePath.match(/^\/([a-zA-Z])\//);
95
+ if (msysMatch) {
96
+ claudePath = msysMatch[1].toUpperCase() + ":/" + claudePath.slice(3);
97
+ }
98
+ // zsh/fish may report "claude: aliased to /actual/path"
99
+ const aliasMatch = claudePath.match(/:\s*aliased to\s+(.+)$/);
100
+ if (aliasMatch && aliasMatch[1]) {
101
+ claudePath = aliasMatch[1];
102
+ }
103
+ return claudePath;
104
+ }
105
+ catch {
106
+ // `which`/`where.exe` failed — scan well-known install paths.
107
+ const possiblePaths = isWindows
108
+ ? [
109
+ path.join(os.homedir(), ".local", "bin", "claude.exe"),
110
+ path.join(process.env.APPDATA || "", "npm", "claude.cmd"),
111
+ path.join(process.env.APPDATA || "", "npm", "claude"),
112
+ ]
113
+ : [
114
+ path.join(os.homedir(), ".claude", "bin", "claude"),
115
+ path.join(os.homedir(), ".claude", "local", "claude"),
116
+ path.join(os.homedir(), ".local", "bin", "claude"),
117
+ "/opt/homebrew/bin/claude",
118
+ "/usr/local/bin/claude",
119
+ "/usr/bin/claude",
120
+ ];
121
+ for (const p of possiblePaths) {
122
+ if (fs.existsSync(p)) {
123
+ return p;
124
+ }
125
+ }
126
+ (0, cli_common_1.log)(`Claude CLI not found in PATH or common locations`, "red");
127
+ (0, cli_common_1.log)(`Please install Claude Code CLI first`, "red");
128
+ process.exit(1);
129
+ }
130
+ }
131
+ /**
132
+ * Resolve the JavaScript entry point for V1 Node.js interceptor mode.
133
+ *
134
+ * Follows bash wrapper scripts that `exec` into the real `.js` launcher so
135
+ * `node --require interceptor` can hook `fetch`. Only used when the resolved
136
+ * binary is not a native executable.
137
+ *
138
+ * @param customPath - Optional explicit path from `--claude-path`.
139
+ * @returns Absolute path to the Claude JS entry file.
140
+ */
141
+ function getClaudeAbsolutePath(customPath) {
142
+ const claudePath = findClaudePath(customPath);
143
+ const isWindows = process.platform === "win32";
144
+ if (!isWindows && fs.existsSync(claudePath)) {
145
+ const content = fs.readFileSync(claudePath, "utf-8");
146
+ if (content.startsWith("#!/bin/bash") || content.startsWith("#!/bin/sh")) {
147
+ const execMatch = content.match(/exec\s+"([^"]+)"/);
148
+ if (execMatch && execMatch[1]) {
149
+ return (0, binary_utils_1.resolveToJsFile)(execMatch[1]);
150
+ }
151
+ }
152
+ }
153
+ return (0, binary_utils_1.resolveToJsFile)(claudePath);
154
+ }
155
+ /**
156
+ * Resolve the real executable used for native-binary detection and proxy mode.
157
+ *
158
+ * Unwraps npm `.cmd` shims, bash wrappers, and symlinks to find the actual
159
+ * Mach-O/ELF/PE binary (V2+) or `.exe` on Windows. This path is passed to
160
+ * `isNativeBinary()` in `trace-runner.ts` to choose proxy vs interceptor.
161
+ *
162
+ * @param customPath - Optional explicit path from `--claude-path`.
163
+ * @returns Absolute path to the underlying Claude executable.
164
+ */
165
+ function getClaudeBinaryPath(customPath) {
166
+ const claudePath = findClaudePath(customPath);
167
+ const isWindows = process.platform === "win32";
168
+ if (isWindows && fs.existsSync(claudePath)) {
169
+ const content = fs.readFileSync(claudePath, "utf-8");
170
+ // npm .cmd shim: "%dp0%\node_modules\@anthropic-ai\claude-code\bin\claude.exe"
171
+ const cmdMatch = content.match(/"?%dp0%\\([^"]+\.exe)"?\s/i);
172
+ if (cmdMatch && cmdMatch[1]) {
173
+ const dir = path.dirname(claudePath);
174
+ const resolved = path.join(dir, cmdMatch[1]);
175
+ if (fs.existsSync(resolved)) {
176
+ return resolved;
177
+ }
178
+ }
179
+ // Git Bash npm shim: exec "$basedir/node_modules/.../claude.exe"
180
+ const shMatch = content.match(/exec\s+"?\$basedir\/([^"]+\.exe)"?\s/);
181
+ if (shMatch && shMatch[1]) {
182
+ const dir = path.dirname(claudePath);
183
+ const resolved = path.join(dir, shMatch[1]);
184
+ if (fs.existsSync(resolved)) {
185
+ return resolved;
186
+ }
187
+ }
188
+ if (claudePath.endsWith(".exe")) {
189
+ try {
190
+ return fs.realpathSync(claudePath);
191
+ }
192
+ catch {
193
+ return claudePath;
194
+ }
195
+ }
196
+ const exePath = claudePath + ".exe";
197
+ if (fs.existsSync(exePath)) {
198
+ return exePath;
199
+ }
200
+ // Fallback: npm global install layout
201
+ const dir = path.dirname(claudePath);
202
+ const npmExePath = path.join(dir, "node_modules", "@anthropic-ai", "claude-code", "bin", "claude.exe");
203
+ if (fs.existsSync(npmExePath)) {
204
+ return npmExePath;
205
+ }
206
+ }
207
+ if (!isWindows && fs.existsSync(claudePath)) {
208
+ const content = fs.readFileSync(claudePath, "utf-8");
209
+ if (content.startsWith("#!/bin/bash") || content.startsWith("#!/bin/sh")) {
210
+ const execMatch = content.match(/exec\s+"([^"]+)"/);
211
+ if (execMatch && execMatch[1]) {
212
+ try {
213
+ return fs.realpathSync(execMatch[1]);
214
+ }
215
+ catch {
216
+ return execMatch[1];
217
+ }
218
+ }
219
+ }
220
+ }
221
+ try {
222
+ return fs.realpathSync(claudePath);
223
+ }
224
+ catch {
225
+ return claudePath;
226
+ }
227
+ }
228
+ /**
229
+ * Resolve the user's Claude config directory (`CLAUDE_CONFIG_DIR` or `~/.claude`).
230
+ *
231
+ * @returns Absolute path to the Claude configuration directory.
232
+ */
233
+ function getClaudeConfigDir() {
234
+ return (0, claude_config_overlay_1.resolveUserClaudeConfigDir)();
235
+ }
236
+ /** Resolve the optional absolute log directory used by WorkflowExp/Pier. */
237
+ function getClaudeTraceLogDirectory(environment = process.env) {
238
+ const configured = environment.CLAUDE_TRACE_LOG_DIR;
239
+ if (!configured)
240
+ return ".claude-trace";
241
+ if (!path.isAbsolute(configured)) {
242
+ throw new Error("CLAUDE_TRACE_LOG_DIR must be an absolute path");
243
+ }
244
+ return configured;
245
+ }
246
+ /**
247
+ * Claude Code tool profile consumed by `trace-runner.ts`.
248
+ *
249
+ * Supports both V1 Node interceptor and V2+ reverse-proxy interception.
250
+ * When `settings.json` defines its own `ANTHROPIC_BASE_URL`, a persistent
251
+ * config overlay rewrites that value without modifying the original file.
252
+ */
253
+ exports.claudeProfile = {
254
+ name: "claude",
255
+ displayName: "Claude Code",
256
+ logDirectory: getClaudeTraceLogDirectory(),
257
+ /** @inheritdoc ToolProfile.findBinary */
258
+ findBinary(customPath) {
259
+ return findClaudePath(customPath);
260
+ },
261
+ /** @inheritdoc ToolProfile.getBinaryPath */
262
+ getBinaryPath(customPath) {
263
+ return getClaudeBinaryPath(customPath);
264
+ },
265
+ /**
266
+ * Read the upstream Anthropic API base URL for proxy forwarding.
267
+ *
268
+ * Precedence: `settings.json` → `ANTHROPIC_BASE_URL` env → default
269
+ * `https://api.anthropic.com`.
270
+ */
271
+ readUpstreamBaseUrl() {
272
+ const settingsPath = path.join(getClaudeConfigDir(), "settings.json");
273
+ if (fs.existsSync(settingsPath)) {
274
+ try {
275
+ const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
276
+ if (settings.env?.ANTHROPIC_BASE_URL) {
277
+ return settings.env.ANTHROPIC_BASE_URL;
278
+ }
279
+ }
280
+ catch {
281
+ // Fall through to environment/default
282
+ }
283
+ }
284
+ return process.env.ANTHROPIC_BASE_URL || "https://api.anthropic.com";
285
+ },
286
+ /**
287
+ * Build spawn environment pointing Claude at the local reverse proxy.
288
+ *
289
+ * Always sets `ANTHROPIC_BASE_URL` to `proxyUrl`. When the user's
290
+ * `settings.json` also sets that variable (which would override the env
291
+ * var inside Claude), creates a config overlay and sets `CLAUDE_CONFIG_DIR`
292
+ * to the overlay path.
293
+ *
294
+ * @param proxyUrl - Local proxy URL (e.g. `http://127.0.0.1:PORT`).
295
+ */
296
+ prepareSpawnEnv(proxyUrl) {
297
+ const sourceConfigDir = (0, claude_config_overlay_1.resolveUserClaudeConfigDir)();
298
+ const settingsPath = path.join(sourceConfigDir, "settings.json");
299
+ let tmpDir = null;
300
+ const spawnEnv = {
301
+ ...process.env,
302
+ ANTHROPIC_BASE_URL: proxyUrl,
303
+ };
304
+ if (fs.existsSync(settingsPath)) {
305
+ try {
306
+ const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
307
+ // settings.json env overrides ANTHROPIC_BASE_URL — build overlay so
308
+ // the proxy URL wins without editing the user's original config.
309
+ if (settings.env?.ANTHROPIC_BASE_URL) {
310
+ const overlayDir = (0, claude_config_overlay_1.getClaudeConfigOverlayDir)();
311
+ const syncResult = (0, claude_config_overlay_1.syncClaudeConfigOverlay)(sourceConfigDir, overlayDir, os.homedir());
312
+ (0, claude_config_overlay_1.writeOverlaySettings)(settingsPath, overlayDir);
313
+ tmpDir = overlayDir;
314
+ spawnEnv.CLAUDE_CONFIG_DIR = overlayDir;
315
+ if (syncResult.skipped.length > 0) {
316
+ (0, cli_common_1.traceDebug)(`claude-trace: overlay linked ${syncResult.linked.length}, skipped ${syncResult.skipped.length} (proxy still active)`);
317
+ for (const skip of syncResult.skipped) {
318
+ (0, cli_common_1.traceDebug)(`claude-trace: overlay skip ${skip.entry}: ${skip.reason}`);
319
+ }
320
+ }
321
+ }
322
+ }
323
+ catch (error) {
324
+ const err = error;
325
+ (0, cli_common_1.log)(`Warning: could not prepare Claude config overlay: ${err.message}`, "yellow");
326
+ }
327
+ }
328
+ return { tmpDir, spawnEnv };
329
+ },
330
+ /**
331
+ * Remove a temporary overlay directory after the session ends.
332
+ *
333
+ * Skips the persistent overlay at `~/.claude-trace/claude-config-overlay/`
334
+ * which is intentionally reused across runs.
335
+ */
336
+ cleanupTempConfig(tmpDir) {
337
+ // Persistent overlay at ~/.claude-trace/claude-config-overlay/ is reused across runs.
338
+ if (!tmpDir || (0, claude_config_overlay_1.isPersistentOverlayDir)(tmpDir)) {
339
+ return;
340
+ }
341
+ try {
342
+ fs.rmSync(tmpDir, { recursive: true, force: true });
343
+ }
344
+ catch {
345
+ // Best-effort cleanup
346
+ }
347
+ },
348
+ /** Claude V1 Node.js installs support the `--require interceptor` hook. */
349
+ supportsNodeInterceptor() {
350
+ return true;
351
+ },
352
+ };
353
+ /**
354
+ * Extract the OAuth bearer token from a live Claude Code session.
355
+ *
356
+ * Spawns Claude via `node --require token-extractor.js` with a minimal prompt,
357
+ * watches for the token written to `.claude-trace/token.txt`, and prints it
358
+ * to stdout (for `export ANTHROPIC_API_KEY=$(claude-trace --extract-token)`).
359
+ *
360
+ * Uses polling (500 ms) and a 30 s timeout so the child can be killed as soon
361
+ * as the token is captured, without waiting for a full Claude session to finish.
362
+ *
363
+ * @param customClaudePath - Optional explicit path from `--claude-path`.
364
+ */
365
+ async function extractClaudeToken(customClaudePath) {
366
+ const claudePath = getClaudeAbsolutePath(customClaudePath);
367
+ console.error(`Using Claude binary: ${claudePath}`);
368
+ const claudeTraceDir = path.join(process.cwd(), exports.claudeProfile.logDirectory);
369
+ if (!fs.existsSync(claudeTraceDir)) {
370
+ fs.mkdirSync(claudeTraceDir, { recursive: true });
371
+ }
372
+ const tokenFile = path.join(claudeTraceDir, "token.txt");
373
+ const tokenExtractorPath = path.join(__dirname, "..", "intercept", "token-extractor.js");
374
+ if (!fs.existsSync(tokenExtractorPath)) {
375
+ (0, cli_common_1.log)(`Token extractor not found at: ${tokenExtractorPath}`, "red");
376
+ process.exit(1);
377
+ }
378
+ const cleanup = () => {
379
+ try {
380
+ if (fs.existsSync(tokenFile))
381
+ fs.unlinkSync(tokenFile);
382
+ }
383
+ catch {
384
+ // Ignore cleanup errors
385
+ }
386
+ };
387
+ // Strip ANTHROPIC_API_KEY so Claude uses OAuth flow instead of API key auth.
388
+ const { ANTHROPIC_API_KEY: _removed, ...envWithoutApiKey } = process.env;
389
+ const child = (0, child_process_1.spawn)("node", ["--require", tokenExtractorPath, claudePath, "-p", "hello"], {
390
+ env: {
391
+ ...envWithoutApiKey,
392
+ NODE_TLS_REJECT_UNAUTHORIZED: "0",
393
+ CLAUDE_TRACE_TOKEN_FILE: tokenFile,
394
+ },
395
+ stdio: "inherit",
396
+ cwd: process.cwd(),
397
+ });
398
+ const timeout = setTimeout(() => {
399
+ child.kill();
400
+ cleanup();
401
+ console.error("Timeout: No token found within 30 seconds");
402
+ process.exit(1);
403
+ }, 30000);
404
+ child.on("error", (error) => {
405
+ clearTimeout(timeout);
406
+ cleanup();
407
+ console.error(`Error starting Claude: ${error.message}`);
408
+ process.exit(1);
409
+ });
410
+ child.on("exit", () => {
411
+ clearTimeout(timeout);
412
+ try {
413
+ if (fs.existsSync(tokenFile)) {
414
+ const token = fs.readFileSync(tokenFile, "utf-8").trim();
415
+ cleanup();
416
+ if (token) {
417
+ console.log(token);
418
+ process.exit(0);
419
+ }
420
+ }
421
+ }
422
+ catch {
423
+ // File doesn't exist or read error
424
+ }
425
+ cleanup();
426
+ console.error("No authorization token found");
427
+ process.exit(1);
428
+ });
429
+ // Poll for early token capture so we can kill Claude before full session startup.
430
+ const checkToken = setInterval(() => {
431
+ try {
432
+ if (fs.existsSync(tokenFile)) {
433
+ const token = fs.readFileSync(tokenFile, "utf-8").trim();
434
+ if (token) {
435
+ clearTimeout(timeout);
436
+ clearInterval(checkToken);
437
+ child.kill();
438
+ cleanup();
439
+ console.log(token);
440
+ process.exit(0);
441
+ }
442
+ }
443
+ }
444
+ catch {
445
+ // Ignore read errors, keep trying
446
+ }
447
+ }, 500);
448
+ }
449
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/tools/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @file tools/codex.ts
3
+ * @description Tool profile for OpenAI Codex CLI tracing.
4
+ *
5
+ * This module implements the {@link ToolProfile} interface for the Codex CLI.
6
+ * Codex is a **Rust native binary** — it always uses reverse-proxy interception;
7
+ * there is no Node.js interceptor path.
8
+ *
9
+ * Key responsibilities:
10
+ *
11
+ * - **Binary resolution** — locate `codex` on PATH (same MSYS/alias handling
12
+ * as other profiles).
13
+ * - **TOML config reading** — load `config.toml` from `$CODEX_HOME` (default
14
+ * `~/.codex/`) via `codex-config-overlay.ts`.
15
+ * - **Path-based upstream routing** — register separate upstreams for OpenAI
16
+ * API Key auth (`/v1/responses`), ChatGPT OAuth (`/backend-api/codex`), ChatGPT
17
+ * Apps MCP (`/backend-api/wham`), and custom `model_providers.*.base_url` entries.
18
+ * Dispatch is handled in `codex-routing.ts` using `matchPathPrefixes` on each
19
+ * {@link ProviderRoute}.
20
+ * - **Config overlay** — build a persistent `$CODEX_HOME` overlay at
21
+ * `~/.claude-trace/codex-config-overlay/` that rewrites `openai_base_url`,
22
+ * `chatgpt_base_url`, and custom provider URLs to the local proxy.
23
+ *
24
+ * Codex uses the OpenAI Responses API wire format exclusively; all model routes
25
+ * are tagged with `apiFormat: "openai-responses"`.
26
+ */
27
+ import type { ModelRoute, ProviderRoute, ToolProfile } from "./types";
28
+ import { type CodexConfig } from "../config/codex-config-overlay";
29
+ import { isNativeBinary } from "./binary-utils";
30
+ /**
31
+ * Resolve symlinks to the real Codex executable path.
32
+ *
33
+ * @param customPath - Optional explicit path from `--codex-path`.
34
+ * @returns Canonical binary path.
35
+ */
36
+ declare function getCodexBinaryPath(customPath?: string): string;
37
+ /**
38
+ * Build the full list of upstream provider routes from Codex config.
39
+ *
40
+ * Combines the active custom provider, OpenAI API Key route, ChatGPT OAuth
41
+ * route, and any additional custom providers. Each route carries
42
+ * `matchPathPrefixes` for path-based dispatch in `codex-routing.ts`.
43
+ *
44
+ * @param config - Parsed Codex TOML config.
45
+ * @param codexHome - Optional override for `$CODEX_HOME` (defaults to user home).
46
+ * @returns Deduplicated provider route list.
47
+ */
48
+ export declare function listRoutesFromCodexConfig(config: CodexConfig, codexHome?: string): ProviderRoute[];
49
+ /**
50
+ * Build a model-keyed routing map for the Codex reverse proxy.
51
+ *
52
+ * Uses the configured `model` and `model_provider` to select the active
53
+ * upstream, then registers both exact (`model`, `provider/model`) and wildcard
54
+ * (`provider/*`) lookup keys.
55
+ *
56
+ * @param config - Parsed Codex TOML config.
57
+ * @param codexHome - Optional override for `$CODEX_HOME`.
58
+ * @returns Map from model lookup keys to {@link ModelRoute} entries.
59
+ */
60
+ export declare function buildCodexModelRouteMap(config: CodexConfig, codexHome?: string): Record<string, ModelRoute>;
61
+ /**
62
+ * Codex CLI tool profile consumed by `trace-runner.ts`.
63
+ *
64
+ * Always uses reverse-proxy mode with a persistent `$CODEX_HOME` overlay at
65
+ * `~/.claude-trace/codex-config-overlay/`.
66
+ */
67
+ export declare const codexProfile: ToolProfile;
68
+ /** Re-exported for `trace-runner.ts` binary detection. */
69
+ export { getCodexBinaryPath, isNativeBinary };
70
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/tools/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EASN,KAAK,WAAW,EAEhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAmFhD;;;;;GAKG;AACH,iBAAS,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAQvD;AAmID;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAmDlG;AA4BD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA4B3G;AAkBD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,WA8F1B,CAAC;AAEF,0DAA0D;AAC1D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}