@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.
- package/README.md +477 -0
- package/README.zh-CN.md +477 -0
- package/dist/adapt/api-format.d.ts +41 -0
- package/dist/adapt/api-format.d.ts.map +1 -0
- package/dist/adapt/api-format.js +132 -0
- package/dist/adapt/api-format.js.map +1 -0
- package/dist/adapt/openai-adapter.d.ts +123 -0
- package/dist/adapt/openai-adapter.d.ts.map +1 -0
- package/dist/adapt/openai-adapter.js +628 -0
- package/dist/adapt/openai-adapter.js.map +1 -0
- package/dist/cli/cli-common.d.ts +73 -0
- package/dist/cli/cli-common.d.ts.map +1 -0
- package/dist/cli/cli-common.js +189 -0
- package/dist/cli/cli-common.js.map +1 -0
- package/dist/cli/cli.d.ts +23 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +175 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/codex-cli.d.ts +24 -0
- package/dist/cli/codex-cli.d.ts.map +1 -0
- package/dist/cli/codex-cli.js +146 -0
- package/dist/cli/codex-cli.js.map +1 -0
- package/dist/cli/opencode-cli.d.ts +23 -0
- package/dist/cli/opencode-cli.d.ts.map +1 -0
- package/dist/cli/opencode-cli.js +156 -0
- package/dist/cli/opencode-cli.js.map +1 -0
- package/dist/cli/trace-runner.d.ts +21 -0
- package/dist/cli/trace-runner.d.ts.map +1 -0
- package/dist/cli/trace-runner.js +282 -0
- package/dist/cli/trace-runner.js.map +1 -0
- package/dist/cli/validate-trace.d.ts +30 -0
- package/dist/cli/validate-trace.d.ts.map +1 -0
- package/dist/cli/validate-trace.js +230 -0
- package/dist/cli/validate-trace.js.map +1 -0
- package/dist/cli/verify-offline-bundle.d.ts +13 -0
- package/dist/cli/verify-offline-bundle.d.ts.map +1 -0
- package/dist/cli/verify-offline-bundle.js +89 -0
- package/dist/cli/verify-offline-bundle.js.map +1 -0
- package/dist/cli/vibe-coding-proxy-cli.d.ts +12 -0
- package/dist/cli/vibe-coding-proxy-cli.d.ts.map +1 -0
- package/dist/cli/vibe-coding-proxy-cli.js +218 -0
- package/dist/cli/vibe-coding-proxy-cli.js.map +1 -0
- package/dist/config/claude-config-overlay.d.ts +69 -0
- package/dist/config/claude-config-overlay.d.ts.map +1 -0
- package/dist/config/claude-config-overlay.js +229 -0
- package/dist/config/claude-config-overlay.js.map +1 -0
- package/dist/config/codex-config-overlay.d.ts +122 -0
- package/dist/config/codex-config-overlay.d.ts.map +1 -0
- package/dist/config/codex-config-overlay.js +352 -0
- package/dist/config/codex-config-overlay.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/intercept/forward-proxy.d.ts +77 -0
- package/dist/intercept/forward-proxy.d.ts.map +1 -0
- package/dist/intercept/forward-proxy.js +368 -0
- package/dist/intercept/forward-proxy.js.map +1 -0
- package/dist/intercept/header-redaction.d.ts +7 -0
- package/dist/intercept/header-redaction.d.ts.map +1 -0
- package/dist/intercept/header-redaction.js +28 -0
- package/dist/intercept/header-redaction.js.map +1 -0
- package/dist/intercept/interceptor-loader.js +26 -0
- package/dist/intercept/interceptor.d.ts +164 -0
- package/dist/intercept/interceptor.d.ts.map +1 -0
- package/dist/intercept/interceptor.js +496 -0
- package/dist/intercept/interceptor.js.map +1 -0
- package/dist/intercept/mitm-cert.d.ts +53 -0
- package/dist/intercept/mitm-cert.d.ts.map +1 -0
- package/dist/intercept/mitm-cert.js +259 -0
- package/dist/intercept/mitm-cert.js.map +1 -0
- package/dist/intercept/proxy-log-writer.d.ts +77 -0
- package/dist/intercept/proxy-log-writer.d.ts.map +1 -0
- package/dist/intercept/proxy-log-writer.js +323 -0
- package/dist/intercept/proxy-log-writer.js.map +1 -0
- package/dist/intercept/proxy-targets.d.ts +69 -0
- package/dist/intercept/proxy-targets.d.ts.map +1 -0
- package/dist/intercept/proxy-targets.js +129 -0
- package/dist/intercept/proxy-targets.js.map +1 -0
- package/dist/intercept/reverse-proxy.d.ts +191 -0
- package/dist/intercept/reverse-proxy.d.ts.map +1 -0
- package/dist/intercept/reverse-proxy.js +807 -0
- package/dist/intercept/reverse-proxy.js.map +1 -0
- package/dist/intercept/token-extractor.js +28 -0
- package/dist/report/html-generator.d.ts +96 -0
- package/dist/report/html-generator.d.ts.map +1 -0
- package/dist/report/html-generator.js +225 -0
- package/dist/report/html-generator.js.map +1 -0
- package/dist/report/index-generator.d.ts +89 -0
- package/dist/report/index-generator.d.ts.map +1 -0
- package/dist/report/index-generator.js +319 -0
- package/dist/report/index-generator.js.map +1 -0
- package/dist/report/shared-conversation-processor.d.ts +200 -0
- package/dist/report/shared-conversation-processor.d.ts.map +1 -0
- package/dist/report/shared-conversation-processor.js +720 -0
- package/dist/report/shared-conversation-processor.js.map +1 -0
- package/dist/routing/codex-routing.d.ts +40 -0
- package/dist/routing/codex-routing.d.ts.map +1 -0
- package/dist/routing/codex-routing.js +96 -0
- package/dist/routing/codex-routing.js.map +1 -0
- package/dist/routing/proxy-routing.d.ts +48 -0
- package/dist/routing/proxy-routing.d.ts.map +1 -0
- package/dist/routing/proxy-routing.js +113 -0
- package/dist/routing/proxy-routing.js.map +1 -0
- package/dist/tools/binary-utils.d.ts +29 -0
- package/dist/tools/binary-utils.d.ts.map +1 -0
- package/dist/tools/binary-utils.js +134 -0
- package/dist/tools/binary-utils.js.map +1 -0
- package/dist/tools/claude.d.ts +61 -0
- package/dist/tools/claude.d.ts.map +1 -0
- package/dist/tools/claude.js +449 -0
- package/dist/tools/claude.js.map +1 -0
- package/dist/tools/codex.d.ts +70 -0
- package/dist/tools/codex.d.ts.map +1 -0
- package/dist/tools/codex.js +492 -0
- package/dist/tools/codex.js.map +1 -0
- package/dist/tools/opencode.d.ts +85 -0
- package/dist/tools/opencode.d.ts.map +1 -0
- package/dist/tools/opencode.js +401 -0
- package/dist/tools/opencode.js.map +1 -0
- package/dist/tools/types.d.ts +91 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +11 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +158 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/frontend/dist/index.global.js +1551 -0
- package/frontend/dist/styles.css +1027 -0
- package/frontend/template.html +19 -0
- package/node_modules/agent-base/LICENSE +22 -0
- package/node_modules/agent-base/README.md +69 -0
- package/node_modules/agent-base/dist/helpers.d.ts +15 -0
- package/node_modules/agent-base/dist/helpers.d.ts.map +1 -0
- package/node_modules/agent-base/dist/helpers.js +66 -0
- package/node_modules/agent-base/dist/helpers.js.map +1 -0
- package/node_modules/agent-base/dist/index.d.ts +41 -0
- package/node_modules/agent-base/dist/index.d.ts.map +1 -0
- package/node_modules/agent-base/dist/index.js +178 -0
- package/node_modules/agent-base/dist/index.js.map +1 -0
- package/node_modules/agent-base/package.json +46 -0
- package/node_modules/debug/LICENSE +20 -0
- package/node_modules/debug/README.md +481 -0
- package/node_modules/debug/package.json +64 -0
- package/node_modules/debug/src/browser.js +272 -0
- package/node_modules/debug/src/common.js +292 -0
- package/node_modules/debug/src/index.js +10 -0
- package/node_modules/debug/src/node.js +263 -0
- package/node_modules/http-proxy-agent/LICENSE +22 -0
- package/node_modules/http-proxy-agent/README.md +44 -0
- package/node_modules/http-proxy-agent/dist/index.d.ts +44 -0
- package/node_modules/http-proxy-agent/dist/index.d.ts.map +1 -0
- package/node_modules/http-proxy-agent/dist/index.js +148 -0
- package/node_modules/http-proxy-agent/dist/index.js.map +1 -0
- package/node_modules/http-proxy-agent/package.json +47 -0
- package/node_modules/https-proxy-agent/LICENSE +22 -0
- package/node_modules/https-proxy-agent/README.md +70 -0
- package/node_modules/https-proxy-agent/dist/index.d.ts +47 -0
- package/node_modules/https-proxy-agent/dist/index.d.ts.map +1 -0
- package/node_modules/https-proxy-agent/dist/index.js +180 -0
- package/node_modules/https-proxy-agent/dist/index.js.map +1 -0
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +15 -0
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts.map +1 -0
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.js +101 -0
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
- package/node_modules/https-proxy-agent/package.json +50 -0
- package/node_modules/ms/index.js +162 -0
- package/node_modules/ms/license.md +21 -0
- package/node_modules/ms/package.json +38 -0
- package/node_modules/ms/readme.md +59 -0
- package/node_modules/node-forge/LICENSE +331 -0
- package/node_modules/node-forge/README.md +2071 -0
- package/node_modules/node-forge/dist/forge.all.min.js +2 -0
- package/node_modules/node-forge/dist/forge.all.min.js.map +1 -0
- package/node_modules/node-forge/dist/forge.min.js +2 -0
- package/node_modules/node-forge/dist/forge.min.js.map +1 -0
- package/node_modules/node-forge/dist/prime.worker.min.js +2 -0
- package/node_modules/node-forge/dist/prime.worker.min.js.map +1 -0
- package/node_modules/node-forge/flash/swf/SocketPool.swf +0 -0
- package/node_modules/node-forge/lib/aes.js +1091 -0
- package/node_modules/node-forge/lib/aesCipherSuites.js +282 -0
- package/node_modules/node-forge/lib/asn1-validator.js +91 -0
- package/node_modules/node-forge/lib/asn1.js +1503 -0
- package/node_modules/node-forge/lib/baseN.js +186 -0
- package/node_modules/node-forge/lib/cipher.js +230 -0
- package/node_modules/node-forge/lib/cipherModes.js +999 -0
- package/node_modules/node-forge/lib/des.js +496 -0
- package/node_modules/node-forge/lib/ed25519.js +1091 -0
- package/node_modules/node-forge/lib/forge.js +13 -0
- package/node_modules/node-forge/lib/form.js +149 -0
- package/node_modules/node-forge/lib/hmac.js +146 -0
- package/node_modules/node-forge/lib/http.js +1346 -0
- package/node_modules/node-forge/lib/index.all.js +16 -0
- package/node_modules/node-forge/lib/index.js +33 -0
- package/node_modules/node-forge/lib/jsbn.js +1294 -0
- package/node_modules/node-forge/lib/kem.js +168 -0
- package/node_modules/node-forge/lib/log.js +319 -0
- package/node_modules/node-forge/lib/md.all.js +13 -0
- package/node_modules/node-forge/lib/md.js +11 -0
- package/node_modules/node-forge/lib/md5.js +289 -0
- package/node_modules/node-forge/lib/mgf.js +12 -0
- package/node_modules/node-forge/lib/mgf1.js +57 -0
- package/node_modules/node-forge/lib/oids.js +180 -0
- package/node_modules/node-forge/lib/pbe.js +1023 -0
- package/node_modules/node-forge/lib/pbkdf2.js +211 -0
- package/node_modules/node-forge/lib/pem.js +237 -0
- package/node_modules/node-forge/lib/pkcs1.js +276 -0
- package/node_modules/node-forge/lib/pkcs12.js +1078 -0
- package/node_modules/node-forge/lib/pkcs7.js +1260 -0
- package/node_modules/node-forge/lib/pkcs7asn1.js +410 -0
- package/node_modules/node-forge/lib/pki.js +102 -0
- package/node_modules/node-forge/lib/prime.js +297 -0
- package/node_modules/node-forge/lib/prime.worker.js +168 -0
- package/node_modules/node-forge/lib/prng.js +419 -0
- package/node_modules/node-forge/lib/pss.js +241 -0
- package/node_modules/node-forge/lib/random.js +191 -0
- package/node_modules/node-forge/lib/rc2.js +410 -0
- package/node_modules/node-forge/lib/rsa.js +1968 -0
- package/node_modules/node-forge/lib/sha1.js +319 -0
- package/node_modules/node-forge/lib/sha256.js +327 -0
- package/node_modules/node-forge/lib/sha512.js +561 -0
- package/node_modules/node-forge/lib/socket.js +287 -0
- package/node_modules/node-forge/lib/ssh.js +236 -0
- package/node_modules/node-forge/lib/tls.js +4282 -0
- package/node_modules/node-forge/lib/tlssocket.js +249 -0
- package/node_modules/node-forge/lib/util.js +2652 -0
- package/node_modules/node-forge/lib/x509.js +3251 -0
- package/node_modules/node-forge/lib/xhr.js +738 -0
- package/node_modules/node-forge/package.json +123 -0
- package/node_modules/smol-toml/LICENSE +24 -0
- package/node_modules/smol-toml/README.md +239 -0
- package/node_modules/smol-toml/dist/date.d.ts +41 -0
- package/node_modules/smol-toml/dist/date.js +127 -0
- package/node_modules/smol-toml/dist/error.d.ts +38 -0
- package/node_modules/smol-toml/dist/error.js +63 -0
- package/node_modules/smol-toml/dist/extract.d.ts +30 -0
- package/node_modules/smol-toml/dist/extract.js +100 -0
- package/node_modules/smol-toml/dist/index.cjs +897 -0
- package/node_modules/smol-toml/dist/index.d.ts +43 -0
- package/node_modules/smol-toml/dist/index.js +33 -0
- package/node_modules/smol-toml/dist/parse.d.ts +37 -0
- package/node_modules/smol-toml/dist/parse.js +148 -0
- package/node_modules/smol-toml/dist/primitive.d.ts +31 -0
- package/node_modules/smol-toml/dist/primitive.js +179 -0
- package/node_modules/smol-toml/dist/stringify.d.ts +31 -0
- package/node_modules/smol-toml/dist/stringify.js +167 -0
- package/node_modules/smol-toml/dist/struct.d.ts +32 -0
- package/node_modules/smol-toml/dist/struct.js +184 -0
- package/node_modules/smol-toml/dist/util.d.ts +42 -0
- package/node_modules/smol-toml/dist/util.js +111 -0
- package/node_modules/smol-toml/package.json +54 -0
- package/offline/bin/claude-trace +6 -0
- package/offline/bin/claude-wrapper +13 -0
- package/offline/bin/install-agent +14 -0
- package/offline/bin/validate-trace +6 -0
- package/offline/bin/verify-bundle +7 -0
- package/package.json +103 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.validateTrace = validateTrace;
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const header_redaction_1 = require("../intercept/header-redaction");
|
|
43
|
+
function upstreamRedaction(value) {
|
|
44
|
+
if (value.length > 14)
|
|
45
|
+
return `${value.substring(0, 10)}...${value.slice(-4)}`;
|
|
46
|
+
if (value.length > 4)
|
|
47
|
+
return `${value.substring(0, 2)}...${value.slice(-2)}`;
|
|
48
|
+
return "[REDACTED]";
|
|
49
|
+
}
|
|
50
|
+
function timestampMillis(value) {
|
|
51
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
52
|
+
return value < 1000000000000 ? value * 1000 : value;
|
|
53
|
+
}
|
|
54
|
+
if (typeof value === "string") {
|
|
55
|
+
const parsed = Date.parse(value);
|
|
56
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function isMessageExchange(record) {
|
|
61
|
+
return (record.request?.method === "POST" &&
|
|
62
|
+
String(record.request?.url || "").includes("/v1/messages"));
|
|
63
|
+
}
|
|
64
|
+
function hasMeaningfulSuccessfulResponse(record) {
|
|
65
|
+
const response = record.response;
|
|
66
|
+
if (!response)
|
|
67
|
+
return false;
|
|
68
|
+
const status = Number(response.status_code);
|
|
69
|
+
if (status < 200 || status >= 300)
|
|
70
|
+
return true;
|
|
71
|
+
if (typeof response.body_raw === "string" && response.body_raw.trim())
|
|
72
|
+
return true;
|
|
73
|
+
if (Array.isArray(response.events) && response.events.length > 0)
|
|
74
|
+
return true;
|
|
75
|
+
const body = response.body;
|
|
76
|
+
return Boolean(body &&
|
|
77
|
+
typeof body === "object" &&
|
|
78
|
+
((Array.isArray(body.content) && body.content.length > 0) || body.error));
|
|
79
|
+
}
|
|
80
|
+
function readPackageVersion() {
|
|
81
|
+
const packageRoot = path.resolve(__dirname, "..", "..");
|
|
82
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
|
|
83
|
+
return manifest.version;
|
|
84
|
+
}
|
|
85
|
+
/** Validate a WorkflowExp JSONL trace and atomically write metadata.json. */
|
|
86
|
+
function validateTrace(options) {
|
|
87
|
+
const environment = options.environment || process.env;
|
|
88
|
+
if (!path.isAbsolute(options.traceDirectory)) {
|
|
89
|
+
throw new Error("trace directory must be an absolute path");
|
|
90
|
+
}
|
|
91
|
+
fs.mkdirSync(options.traceDirectory, { recursive: true });
|
|
92
|
+
const tracePath = path.join(options.traceDirectory, "trace.jsonl");
|
|
93
|
+
const metadataPath = path.join(options.traceDirectory, "metadata.json");
|
|
94
|
+
const errors = [];
|
|
95
|
+
let redactionViolation = false;
|
|
96
|
+
let raw = fs.existsSync(tracePath) ? fs.readFileSync(tracePath, "utf8") : "";
|
|
97
|
+
const secrets = [environment.ANTHROPIC_API_KEY, environment.ANTHROPIC_AUTH_TOKEN].filter((value, index, values) => Boolean(value) && values.indexOf(value) === index);
|
|
98
|
+
for (const secret of secrets) {
|
|
99
|
+
const candidates = [
|
|
100
|
+
secret,
|
|
101
|
+
upstreamRedaction(secret),
|
|
102
|
+
upstreamRedaction(`Bearer ${secret}`),
|
|
103
|
+
].filter((value) => value !== "[REDACTED]");
|
|
104
|
+
for (const candidate of candidates) {
|
|
105
|
+
if (!raw.includes(candidate))
|
|
106
|
+
continue;
|
|
107
|
+
raw = raw.split(candidate).join("[REDACTED]");
|
|
108
|
+
redactionViolation = true;
|
|
109
|
+
errors.push("secret material was found and removed");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (fs.existsSync(tracePath))
|
|
113
|
+
fs.writeFileSync(tracePath, raw);
|
|
114
|
+
const records = [];
|
|
115
|
+
if (!raw.trim()) {
|
|
116
|
+
errors.push("trace.jsonl is missing or empty");
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
for (const [index, line] of raw.split(/\r?\n/).entries()) {
|
|
120
|
+
if (!line.trim())
|
|
121
|
+
continue;
|
|
122
|
+
try {
|
|
123
|
+
const record = JSON.parse(line);
|
|
124
|
+
if (!record.request || !record.response) {
|
|
125
|
+
errors.push(`line ${index + 1} is not a request/response pair`);
|
|
126
|
+
}
|
|
127
|
+
records.push(record);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
errors.push(`line ${index + 1} is invalid JSON: ${error.message}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
for (const [index, record] of records.entries()) {
|
|
135
|
+
for (const side of [record.request, record.response]) {
|
|
136
|
+
const headers = side?.headers;
|
|
137
|
+
if (!headers || typeof headers !== "object")
|
|
138
|
+
continue;
|
|
139
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
140
|
+
const sensitive = header_redaction_1.SENSITIVE_HEADER_PARTS.some((part) => key.toLowerCase().includes(part));
|
|
141
|
+
if (sensitive && value !== "[REDACTED]") {
|
|
142
|
+
redactionViolation = true;
|
|
143
|
+
errors.push(`line ${index + 1} contains an unredacted ${key} header`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const messageExchanges = records.filter(isMessageExchange);
|
|
149
|
+
if (messageExchanges.length === 0) {
|
|
150
|
+
errors.push("no /v1/messages request/response exchange was recorded");
|
|
151
|
+
}
|
|
152
|
+
if (messageExchanges.length > 0 &&
|
|
153
|
+
!messageExchanges.some((record) => {
|
|
154
|
+
const status = Number(record.response?.status_code);
|
|
155
|
+
return status >= 200 && status < 300;
|
|
156
|
+
})) {
|
|
157
|
+
errors.push("no successful /v1/messages response was recorded");
|
|
158
|
+
}
|
|
159
|
+
for (const [index, record] of messageExchanges.entries()) {
|
|
160
|
+
if (!hasMeaningfulSuccessfulResponse(record)) {
|
|
161
|
+
errors.push(`/v1/messages exchange ${index + 1} has an empty successful response`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const statusCodes = {};
|
|
165
|
+
for (const record of records) {
|
|
166
|
+
const status = String(record.response?.status_code || "unknown");
|
|
167
|
+
statusCodes[status] = (statusCodes[status] || 0) + 1;
|
|
168
|
+
}
|
|
169
|
+
const timestamps = records
|
|
170
|
+
.flatMap((record) => [record.logged_at, record.request?.timestamp, record.response?.timestamp])
|
|
171
|
+
.map(timestampMillis)
|
|
172
|
+
.filter((value) => value !== null)
|
|
173
|
+
.sort((left, right) => left - right);
|
|
174
|
+
const hash = raw ? crypto.createHash("sha256").update(Buffer.from(raw)).digest("hex") : null;
|
|
175
|
+
let claudeVersion = null;
|
|
176
|
+
const versionResult = (0, child_process_1.spawnSync)(options.claudePath, ["--version"], {
|
|
177
|
+
encoding: "utf8",
|
|
178
|
+
env: { ...environment, CLAUDE_TRACE_ENABLED: "0" },
|
|
179
|
+
});
|
|
180
|
+
if (versionResult.status === 0) {
|
|
181
|
+
claudeVersion = (versionResult.stdout || versionResult.stderr || "").trim();
|
|
182
|
+
}
|
|
183
|
+
const uniqueErrors = [...new Set(errors)];
|
|
184
|
+
const metadata = {
|
|
185
|
+
schema_version: 1,
|
|
186
|
+
status: options.mode === "complete" && uniqueErrors.length === 0 ? "complete" : "incomplete",
|
|
187
|
+
trace_format: "@uvl000/claude-trace-jsonl",
|
|
188
|
+
trace_file: "trace.jsonl",
|
|
189
|
+
trace_sha256: hash,
|
|
190
|
+
trace_bytes: Buffer.byteLength(raw),
|
|
191
|
+
exchange_count: records.length,
|
|
192
|
+
message_exchange_count: messageExchanges.length,
|
|
193
|
+
http_status_codes: statusCodes,
|
|
194
|
+
started_at: timestamps.length > 0 ? new Date(timestamps[0]).toISOString() : null,
|
|
195
|
+
finished_at: timestamps.length > 0 ? new Date(timestamps[timestamps.length - 1]).toISOString() : null,
|
|
196
|
+
headers_fully_redacted: !redactionViolation,
|
|
197
|
+
include_all_requests: true,
|
|
198
|
+
claude_version: claudeVersion,
|
|
199
|
+
claude_trace_version: readPackageVersion(),
|
|
200
|
+
node_version: process.version,
|
|
201
|
+
validation_errors: uniqueErrors,
|
|
202
|
+
};
|
|
203
|
+
const metadataTemporary = `${metadataPath}.tmp`;
|
|
204
|
+
fs.writeFileSync(metadataTemporary, `${JSON.stringify(metadata, null, 2)}\n`);
|
|
205
|
+
fs.renameSync(metadataTemporary, metadataPath);
|
|
206
|
+
for (const duplicate of ["trace.json", "trace.html"]) {
|
|
207
|
+
fs.rmSync(path.join(options.traceDirectory, duplicate), { force: true });
|
|
208
|
+
}
|
|
209
|
+
return metadata;
|
|
210
|
+
}
|
|
211
|
+
function main() {
|
|
212
|
+
const mode = process.argv[2];
|
|
213
|
+
const claudePath = process.argv[3];
|
|
214
|
+
if (!mode || !new Set(["complete", "incomplete"]).has(mode) || !claudePath) {
|
|
215
|
+
console.error("Usage: claude-trace-validate <complete|incomplete> CLAUDE_PATH");
|
|
216
|
+
process.exit(2);
|
|
217
|
+
}
|
|
218
|
+
const traceDirectory = process.env.CLAUDE_TRACE_LOG_DIR;
|
|
219
|
+
if (!traceDirectory) {
|
|
220
|
+
console.error("CLAUDE_TRACE_LOG_DIR must be set to an absolute path");
|
|
221
|
+
process.exit(2);
|
|
222
|
+
}
|
|
223
|
+
const metadata = validateTrace({ mode, claudePath, traceDirectory });
|
|
224
|
+
console.log(JSON.stringify(metadata));
|
|
225
|
+
if (mode === "complete" && metadata.validation_errors.length > 0)
|
|
226
|
+
process.exit(1);
|
|
227
|
+
}
|
|
228
|
+
if (require.main === module)
|
|
229
|
+
main();
|
|
230
|
+
//# sourceMappingURL=validate-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-trace.js","sourceRoot":"","sources":["../../src/cli/validate-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface BundleManifest {
|
|
3
|
+
schema_version: number;
|
|
4
|
+
platform: string;
|
|
5
|
+
arch: string;
|
|
6
|
+
node_version: string;
|
|
7
|
+
claude_trace_package: string;
|
|
8
|
+
claude_trace_version: string;
|
|
9
|
+
}
|
|
10
|
+
/** Verify platform, embedded package identity, and every file checksum in a bundle. */
|
|
11
|
+
export declare function verifyOfflineBundle(root: string): BundleManifest;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=verify-offline-bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-offline-bundle.d.ts","sourceRoot":"","sources":["../../src/cli/verify-offline-bundle.ts"],"names":[],"mappings":";AAMA,UAAU,cAAc;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;CAC7B;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAoDhE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.verifyOfflineBundle = verifyOfflineBundle;
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
/** Verify platform, embedded package identity, and every file checksum in a bundle. */
|
|
42
|
+
function verifyOfflineBundle(root) {
|
|
43
|
+
const resolvedRoot = path.resolve(root);
|
|
44
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(resolvedRoot, "manifest.json"), "utf8"));
|
|
45
|
+
if (process.platform !== manifest.platform || process.arch !== manifest.arch) {
|
|
46
|
+
throw new Error(`Bundle requires ${manifest.platform}/${manifest.arch}, got ${process.platform}/${process.arch}`);
|
|
47
|
+
}
|
|
48
|
+
if (process.version !== `v${manifest.node_version}`) {
|
|
49
|
+
throw new Error(`Bundle requires Node ${manifest.node_version}, got ${process.version}`);
|
|
50
|
+
}
|
|
51
|
+
const packageManifestPath = path.join(resolvedRoot, "package", "node_modules", ...manifest.claude_trace_package.split("/"), "package.json");
|
|
52
|
+
const packageManifest = JSON.parse(fs.readFileSync(packageManifestPath, "utf8"));
|
|
53
|
+
if (packageManifest.name !== manifest.claude_trace_package ||
|
|
54
|
+
packageManifest.version !== manifest.claude_trace_version) {
|
|
55
|
+
throw new Error(`Expected ${manifest.claude_trace_package}@${manifest.claude_trace_version}, ` +
|
|
56
|
+
`got ${packageManifest.name}@${packageManifest.version}`);
|
|
57
|
+
}
|
|
58
|
+
const checksumLines = fs
|
|
59
|
+
.readFileSync(path.join(resolvedRoot, "SHA256SUMS"), "utf8")
|
|
60
|
+
.trim()
|
|
61
|
+
.split("\n");
|
|
62
|
+
for (const line of checksumLines) {
|
|
63
|
+
const match = /^([0-9a-f]{64}) (.+)$/.exec(line);
|
|
64
|
+
if (!match)
|
|
65
|
+
throw new Error(`Invalid SHA256SUMS line: ${line}`);
|
|
66
|
+
const filePath = path.resolve(resolvedRoot, match[2]);
|
|
67
|
+
if (!filePath.startsWith(`${resolvedRoot}${path.sep}`)) {
|
|
68
|
+
throw new Error(`Checksum path escapes bundle: ${match[2]}`);
|
|
69
|
+
}
|
|
70
|
+
const actual = crypto
|
|
71
|
+
.createHash("sha256")
|
|
72
|
+
.update(fs.readFileSync(filePath))
|
|
73
|
+
.digest("hex");
|
|
74
|
+
if (actual !== match[1])
|
|
75
|
+
throw new Error(`Checksum mismatch: ${match[2]}`);
|
|
76
|
+
}
|
|
77
|
+
return manifest;
|
|
78
|
+
}
|
|
79
|
+
function main() {
|
|
80
|
+
const root = process.argv[2];
|
|
81
|
+
if (!root) {
|
|
82
|
+
console.error("Usage: verify-offline-bundle BUNDLE_ROOT");
|
|
83
|
+
process.exit(2);
|
|
84
|
+
}
|
|
85
|
+
console.log(JSON.stringify({ ok: true, ...verifyOfflineBundle(root) }));
|
|
86
|
+
}
|
|
87
|
+
if (require.main === module)
|
|
88
|
+
main();
|
|
89
|
+
//# sourceMappingURL=verify-offline-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-offline-bundle.js","sourceRoot":"","sources":["../../src/cli/verify-offline-bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file vibe-coding-proxy-cli.ts
|
|
4
|
+
* @description Entry point for the standalone `vibe-coding-proxy` command.
|
|
5
|
+
*
|
|
6
|
+
* Starts an independent HTTP/HTTPS forward proxy that clients can use through
|
|
7
|
+
* HTTP_PROXY, HTTPS_PROXY, or ALL_PROXY. The command does not spawn Claude Code
|
|
8
|
+
* or any other CLI; it only prints the proxy URL, captures allowlisted model API
|
|
9
|
+
* traffic, and writes JSONL/JSON/HTML reports compatible with the existing UI.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=vibe-coding-proxy-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vibe-coding-proxy-cli.d.ts","sourceRoot":"","sources":["../../src/cli/vibe-coding-proxy-cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* @file vibe-coding-proxy-cli.ts
|
|
5
|
+
* @description Entry point for the standalone `vibe-coding-proxy` command.
|
|
6
|
+
*
|
|
7
|
+
* Starts an independent HTTP/HTTPS forward proxy that clients can use through
|
|
8
|
+
* HTTP_PROXY, HTTPS_PROXY, or ALL_PROXY. The command does not spawn Claude Code
|
|
9
|
+
* or any other CLI; it only prints the proxy URL, captures allowlisted model API
|
|
10
|
+
* traffic, and writes JSONL/JSON/HTML reports compatible with the existing UI.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const cli_common_1 = require("./cli-common");
|
|
14
|
+
const forward_proxy_1 = require("../intercept/forward-proxy");
|
|
15
|
+
/**
|
|
16
|
+
* Print a short reference list for common LLM API hosts/paths.
|
|
17
|
+
* This helps users configure `--target-url` / `--mitm-host` without memorizing vendor URLs.
|
|
18
|
+
*/
|
|
19
|
+
function printCommonApiAddresses() {
|
|
20
|
+
console.log("Common API endpoints (examples):");
|
|
21
|
+
console.log("");
|
|
22
|
+
console.log(" Anthropic Messages API:");
|
|
23
|
+
console.log(" host: api.anthropic.com");
|
|
24
|
+
console.log(" path: /v1/messages");
|
|
25
|
+
console.log(" target-url example:");
|
|
26
|
+
console.log(" vibe-coding-proxy --target-url https://api.anthropic.com/v1/messages");
|
|
27
|
+
console.log("");
|
|
28
|
+
console.log(" OpenAI API:");
|
|
29
|
+
console.log(" host: api.openai.com");
|
|
30
|
+
console.log(" paths:");
|
|
31
|
+
console.log(" - /v1/responses");
|
|
32
|
+
console.log(" - /v1/chat/completions");
|
|
33
|
+
console.log(" target-url examples:");
|
|
34
|
+
console.log(" vibe-coding-proxy --target-url https://api.openai.com/v1/responses");
|
|
35
|
+
console.log(" vibe-coding-proxy --target-url https://api.openai.com/v1/chat/completions");
|
|
36
|
+
console.log("");
|
|
37
|
+
console.log(" Codex (ChatGPT OAuth) API:");
|
|
38
|
+
console.log(" host: chatgpt.com");
|
|
39
|
+
console.log(" base: https://chatgpt.com/backend-api/codex");
|
|
40
|
+
console.log(" common path: /backend-api/codex/responses");
|
|
41
|
+
console.log(" target-url examples:");
|
|
42
|
+
console.log(" vibe-coding-proxy --target-url https://chatgpt.com/backend-api/codex");
|
|
43
|
+
console.log(" vibe-coding-proxy --target-url https://chatgpt.com/backend-api/codex/responses");
|
|
44
|
+
console.log("");
|
|
45
|
+
console.log(" Anthropic-compatible gateways (examples):");
|
|
46
|
+
console.log(" - https://api.deepseek.com/anthropic");
|
|
47
|
+
console.log(" - https://api.minimax.chat/anthropic (if enabled by your provider)");
|
|
48
|
+
console.log("");
|
|
49
|
+
console.log("Tip: if you're not sure, start with --mitm-host <host> to decrypt all HTTPS requests for that host.");
|
|
50
|
+
}
|
|
51
|
+
/** Print command usage and examples. */
|
|
52
|
+
function showHelp() {
|
|
53
|
+
console.log(`
|
|
54
|
+
${cli_common_1.colors.blue}vibe-coding-proxy${cli_common_1.colors.reset}
|
|
55
|
+
Standalone forward proxy for logging allowlisted LLM API traffic
|
|
56
|
+
|
|
57
|
+
${cli_common_1.colors.yellow}USAGE:${cli_common_1.colors.reset}
|
|
58
|
+
vibe-coding-proxy --target-url URL [--target-url URL...]
|
|
59
|
+
|
|
60
|
+
${cli_common_1.colors.yellow}OPTIONS:${cli_common_1.colors.reset}
|
|
61
|
+
--target-url URL Full URL prefix to MITM and log (repeatable)
|
|
62
|
+
--mitm-host HOST Hostname to MITM and log (repeatable)
|
|
63
|
+
--host HOST Listen host (default: 127.0.0.1)
|
|
64
|
+
--port PORT Listen port (default: 0, random)
|
|
65
|
+
--log-dir DIR Log directory (default: .vibe-coding-proxy)
|
|
66
|
+
--log NAME Log file base name (without extension)
|
|
67
|
+
--ca-dir DIR Local CA/cache directory
|
|
68
|
+
--no-mitm Disable TLS MITM; HTTPS CONNECT is pass-through only
|
|
69
|
+
--include-all-requests Log pass-through CONNECT metadata and non-target HTTP traffic
|
|
70
|
+
--include-sensitive-headers Log auth headers without redaction
|
|
71
|
+
--no-open Do not open generated HTML when the proxy exits
|
|
72
|
+
--generate-html FILE [OUT] Generate HTML from an existing JSONL/JSON log
|
|
73
|
+
--help, -h Show this help message
|
|
74
|
+
|
|
75
|
+
${cli_common_1.colors.yellow}EXAMPLES:${cli_common_1.colors.reset}
|
|
76
|
+
vibe-coding-proxy --target-url https://api.deepseek.com/anthropic
|
|
77
|
+
vibe-coding-proxy --mitm-host api.deepseek.com --port 8888
|
|
78
|
+
|
|
79
|
+
${cli_common_1.colors.yellow}CLIENT SETUP:${cli_common_1.colors.reset}
|
|
80
|
+
export HTTP_PROXY=http://127.0.0.1:PORT
|
|
81
|
+
export HTTPS_PROXY=http://127.0.0.1:PORT
|
|
82
|
+
export ALL_PROXY=http://127.0.0.1:PORT
|
|
83
|
+
export NODE_TLS_REJECT_UNAUTHORIZED=0
|
|
84
|
+
export SSL_CERT_FILE=CA_CERT_PATH
|
|
85
|
+
`);
|
|
86
|
+
console.log("");
|
|
87
|
+
printCommonApiAddresses();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse repeatable flags and simple scalar options.
|
|
91
|
+
* @param args - Usually `process.argv.slice(2)`.
|
|
92
|
+
*/
|
|
93
|
+
function parseArgs(args) {
|
|
94
|
+
const config = {
|
|
95
|
+
targetUrls: [],
|
|
96
|
+
mitmHosts: [],
|
|
97
|
+
openBrowser: true,
|
|
98
|
+
};
|
|
99
|
+
for (let i = 0; i < args.length; i++) {
|
|
100
|
+
const arg = args[i];
|
|
101
|
+
const next = args[i + 1];
|
|
102
|
+
switch (arg) {
|
|
103
|
+
case "--target-url":
|
|
104
|
+
requireValue(arg, next);
|
|
105
|
+
config.targetUrls?.push(next);
|
|
106
|
+
i++;
|
|
107
|
+
break;
|
|
108
|
+
case "--mitm-host":
|
|
109
|
+
requireValue(arg, next);
|
|
110
|
+
config.mitmHosts?.push(next);
|
|
111
|
+
i++;
|
|
112
|
+
break;
|
|
113
|
+
case "--host":
|
|
114
|
+
requireValue(arg, next);
|
|
115
|
+
config.host = next;
|
|
116
|
+
i++;
|
|
117
|
+
break;
|
|
118
|
+
case "--port":
|
|
119
|
+
requireValue(arg, next);
|
|
120
|
+
config.port = Number(next);
|
|
121
|
+
i++;
|
|
122
|
+
break;
|
|
123
|
+
case "--log-dir":
|
|
124
|
+
requireValue(arg, next);
|
|
125
|
+
config.logDirectory = next;
|
|
126
|
+
i++;
|
|
127
|
+
break;
|
|
128
|
+
case "--log":
|
|
129
|
+
requireValue(arg, next);
|
|
130
|
+
config.logBaseName = next;
|
|
131
|
+
i++;
|
|
132
|
+
break;
|
|
133
|
+
case "--ca-dir":
|
|
134
|
+
requireValue(arg, next);
|
|
135
|
+
config.caDir = next;
|
|
136
|
+
i++;
|
|
137
|
+
break;
|
|
138
|
+
case "--no-mitm":
|
|
139
|
+
config.disableMitm = true;
|
|
140
|
+
break;
|
|
141
|
+
case "--include-all-requests":
|
|
142
|
+
config.includeAllRequests = true;
|
|
143
|
+
break;
|
|
144
|
+
case "--include-sensitive-headers":
|
|
145
|
+
config.logSensitiveHeaders = true;
|
|
146
|
+
break;
|
|
147
|
+
case "--no-open":
|
|
148
|
+
config.openBrowser = false;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { traceArgs: args, config };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Ensure an option with a required argument is followed by a usable value.
|
|
156
|
+
* @param flag - Current option name.
|
|
157
|
+
* @param value - Candidate option value.
|
|
158
|
+
*/
|
|
159
|
+
function requireValue(flag, value) {
|
|
160
|
+
if (!value || value.startsWith("--")) {
|
|
161
|
+
throw new Error(`Missing value for ${flag}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Main CLI dispatcher. */
|
|
165
|
+
async function main() {
|
|
166
|
+
const args = process.argv.slice(2);
|
|
167
|
+
const { traceArgs, config } = parseArgs(args);
|
|
168
|
+
if (traceArgs.includes("--help") || traceArgs.includes("-h")) {
|
|
169
|
+
showHelp();
|
|
170
|
+
process.exit(0);
|
|
171
|
+
}
|
|
172
|
+
if (traceArgs.includes("--generate-html")) {
|
|
173
|
+
const { inputFile, outputFile } = (0, cli_common_1.parseGenerateHtmlArgs)(traceArgs);
|
|
174
|
+
if (!inputFile) {
|
|
175
|
+
(0, cli_common_1.log)("Missing input file for --generate-html", "red");
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
await (0, cli_common_1.generateHTMLFromCLI)(inputFile, outputFile, config.includeAllRequests || false, config.openBrowser !== false, "vibe-coding-proxy");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const proxy = new forward_proxy_1.ForwardProxyServer(config);
|
|
182
|
+
const info = await proxy.start();
|
|
183
|
+
(0, cli_common_1.log)(`vibe-coding-proxy started`, "green");
|
|
184
|
+
console.log("");
|
|
185
|
+
console.log(`Proxy URL: ${info.url}`);
|
|
186
|
+
console.log(`Export:`);
|
|
187
|
+
console.log(` export HTTP_PROXY=${info.url}`);
|
|
188
|
+
console.log(` export HTTPS_PROXY=${info.url}`);
|
|
189
|
+
console.log(` export ALL_PROXY=${info.url}`);
|
|
190
|
+
console.log(` export NODE_TLS_REJECT_UNAUTHORIZED=0`);
|
|
191
|
+
if (info.caCertPath) {
|
|
192
|
+
console.log(` export SSL_CERT_FILE=${info.caCertPath}`);
|
|
193
|
+
console.log(`CA certificate: ${info.caCertPath}`);
|
|
194
|
+
console.log(`Trust this CA in clients that should expose HTTPS bodies to the proxy.`);
|
|
195
|
+
}
|
|
196
|
+
console.log(`Logs:`);
|
|
197
|
+
console.log(` JSONL: ${info.logs.jsonl}`);
|
|
198
|
+
console.log(` JSON: ${info.logs.json}`);
|
|
199
|
+
console.log(` HTML: ${info.logs.html}`);
|
|
200
|
+
console.log("");
|
|
201
|
+
console.log("Press Ctrl+C to stop the proxy.");
|
|
202
|
+
const shutdown = () => {
|
|
203
|
+
(0, cli_common_1.log)("\nStopping vibe-coding-proxy...", "yellow");
|
|
204
|
+
proxy.stop();
|
|
205
|
+
process.exit(0);
|
|
206
|
+
};
|
|
207
|
+
process.on("SIGINT", shutdown);
|
|
208
|
+
process.on("SIGTERM", shutdown);
|
|
209
|
+
await new Promise(() => {
|
|
210
|
+
// Keep the CLI alive until a signal arrives.
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
main().catch((error) => {
|
|
214
|
+
const err = error;
|
|
215
|
+
(0, cli_common_1.log)(`Error: ${err.message}`, "red");
|
|
216
|
+
process.exit(1);
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=vibe-coding-proxy-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vibe-coding-proxy-cli.js","sourceRoot":"","sources":["../../src/cli/vibe-coding-proxy-cli.ts"],"names":[],"mappings":"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"}
|