coolhand-cli 0.9.0 → 0.10.0
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 +4 -2
- package/dist/api/last-sync.d.ts.map +1 -1
- package/dist/api/last-sync.js +2 -1
- package/dist/api/last-sync.js.map +1 -1
- package/dist/base-url.d.ts +7 -0
- package/dist/base-url.d.ts.map +1 -0
- package/dist/base-url.js +14 -0
- package/dist/base-url.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +85 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze-claude-sessions.d.ts.map +1 -1
- package/dist/commands/analyze-claude-sessions.js +10 -21
- package/dist/commands/analyze-claude-sessions.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +3 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/map-claude-projects.d.ts +22 -0
- package/dist/commands/map-claude-projects.d.ts.map +1 -0
- package/dist/commands/map-claude-projects.js +282 -0
- package/dist/commands/map-claude-projects.js.map +1 -0
- package/dist/commands/upload-client-file.d.ts +3 -0
- package/dist/commands/upload-client-file.d.ts.map +1 -0
- package/dist/commands/upload-client-file.js +43 -0
- package/dist/commands/upload-client-file.js.map +1 -0
- package/dist/commands/wildcard.d.ts +6 -6
- package/dist/commands/wildcard.d.ts.map +1 -1
- package/dist/commands/wildcard.js +14 -11
- package/dist/commands/wildcard.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +31 -8
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/log-request.d.ts +4 -0
- package/dist/log-request.d.ts.map +1 -1
- package/dist/log-request.js +8 -1
- package/dist/log-request.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +30 -1
- package/dist/logger.js.map +1 -1
- package/dist/proxy/certs.d.ts.map +1 -1
- package/dist/proxy/certs.js +145 -5
- package/dist/proxy/certs.js.map +1 -1
- package/dist/proxy/interceptor.d.ts +8 -1
- package/dist/proxy/interceptor.d.ts.map +1 -1
- package/dist/proxy/interceptor.js +36 -3
- package/dist/proxy/interceptor.js.map +1 -1
- package/dist/proxy/proxy.d.ts.map +1 -1
- package/dist/proxy/proxy.js +4 -3
- package/dist/proxy/proxy.js.map +1 -1
- package/dist/proxy/wrap-runner.d.ts +0 -12
- package/dist/proxy/wrap-runner.d.ts.map +1 -1
- package/dist/proxy/wrap-runner.js +24 -11
- package/dist/proxy/wrap-runner.js.map +1 -1
- package/dist/sessions/claude-scanner.d.ts +3 -0
- package/dist/sessions/claude-scanner.d.ts.map +1 -1
- package/dist/sessions/claude-scanner.js +8 -0
- package/dist/sessions/claude-scanner.js.map +1 -1
- package/dist/sessions/cowork-scanner.d.ts.map +1 -1
- package/dist/sessions/cowork-scanner.js +6 -1
- package/dist/sessions/cowork-scanner.js.map +1 -1
- package/dist/sessions/redact-secrets.d.ts.map +1 -1
- package/dist/sessions/redact-secrets.js +10 -2
- package/dist/sessions/redact-secrets.js.map +1 -1
- package/dist/sessions/session-filter.d.ts +3 -1
- package/dist/sessions/session-filter.d.ts.map +1 -1
- package/dist/sessions/session-filter.js +9 -3
- package/dist/sessions/session-filter.js.map +1 -1
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/upload-client-file.d.ts +31 -0
- package/dist/upload-client-file.d.ts.map +1 -0
- package/dist/upload-client-file.js +81 -0
- package/dist/upload-client-file.js.map +1 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -4
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare enum ExitCode {
|
|
|
4
4
|
INTERNAL = 2,
|
|
5
5
|
ABORTED = 130
|
|
6
6
|
}
|
|
7
|
-
export type ErrorCode = 'TIMEOUT' | 'STATE_MISMATCH' | 'INVALID_CALLBACK' | 'BROWSER_FAILED' | 'CONFIG_WRITE_FAILED' | 'CONFIG_READ_FAILED' | 'NOT_CONFIGURED' | 'INVALID_REDIRECT_URI' | 'INVALID_BASE_URL' | 'INVALID_ARGS' | 'WRITE_ENV_FAILED' | 'CLIENT_NOT_FOUND' | 'NO_PRIVATE_KEY' | 'MCP_ERROR' | 'INGEST_ERROR' | 'FEEDBACK_ERROR' | 'LOG_ERROR';
|
|
7
|
+
export type ErrorCode = 'TIMEOUT' | 'STATE_MISMATCH' | 'INVALID_CALLBACK' | 'BROWSER_FAILED' | 'CONFIG_WRITE_FAILED' | 'CONFIG_READ_FAILED' | 'NOT_CONFIGURED' | 'INVALID_REDIRECT_URI' | 'INVALID_BASE_URL' | 'INVALID_ARGS' | 'WRITE_ENV_FAILED' | 'CLIENT_NOT_FOUND' | 'NO_PRIVATE_KEY' | 'MCP_ERROR' | 'INGEST_ERROR' | 'FEEDBACK_ERROR' | 'LOG_ERROR' | 'CERT_FILE_INSECURE' | 'UPLOAD_ERROR';
|
|
8
8
|
export declare class CliError extends Error {
|
|
9
9
|
readonly code: ErrorCode;
|
|
10
10
|
readonly exitCode: number;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,EAAE,IAAI;IACN,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,OAAO,MAAM;CACd;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,EAAE,IAAI;IACN,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,OAAO,MAAM;CACd;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,oBAAoB,GACpB,cAAc,CAAC;AAEnB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA4B;CAMrF"}
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAM,CAAA;IACN,mDAAc,CAAA;IACd,+CAAY,CAAA;IACZ,+CAAa,CAAA;AACf,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAM,CAAA;IACN,mDAAc,CAAA;IACd,+CAAY,CAAA;IACZ,+CAAa,CAAA;AACf,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAuBD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAIjC,YAAY,IAAe,EAAE,OAAe,EAAE,WAAmB,QAAQ,CAAC,UAAU;QAClF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
package/dist/log-request.d.ts
CHANGED
|
@@ -8,8 +8,12 @@
|
|
|
8
8
|
* The SDK swallows submission failures and returns `null`; we translate that (and a base_url
|
|
9
9
|
* rejection from the SDK constructor) back into a `CliError` so `analyze-claude-sessions` keeps its
|
|
10
10
|
* per-session success/failure accounting intact.
|
|
11
|
+
*
|
|
12
|
+
* `opts.projectPath`, when given, is sent as `metadata.project_path` so the log can be correlated
|
|
13
|
+
* back to the repo/working directory it came from.
|
|
11
14
|
*/
|
|
12
15
|
export declare function logRequest(rawRequest: unknown, opts?: {
|
|
13
16
|
clientId?: string;
|
|
17
|
+
projectPath?: string;
|
|
14
18
|
}): Promise<unknown>;
|
|
15
19
|
//# sourceMappingURL=log-request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-request.d.ts","sourceRoot":"","sources":["../src/log-request.ts"],"names":[],"mappings":"AASA
|
|
1
|
+
{"version":3,"file":"log-request.d.ts","sourceRoot":"","sources":["../src/log-request.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,OAAO,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,OAAO,CAAC,CA4ClB"}
|
package/dist/log-request.js
CHANGED
|
@@ -15,6 +15,9 @@ const COLLECTOR = `${PACKAGE_IDENTIFIER}/claude-code`;
|
|
|
15
15
|
* The SDK swallows submission failures and returns `null`; we translate that (and a base_url
|
|
16
16
|
* rejection from the SDK constructor) back into a `CliError` so `analyze-claude-sessions` keeps its
|
|
17
17
|
* per-session success/failure accounting intact.
|
|
18
|
+
*
|
|
19
|
+
* `opts.projectPath`, when given, is sent as `metadata.project_path` so the log can be correlated
|
|
20
|
+
* back to the repo/working directory it came from.
|
|
18
21
|
*/
|
|
19
22
|
export async function logRequest(rawRequest, opts = {}) {
|
|
20
23
|
const cfg = await loadConfig();
|
|
@@ -37,7 +40,11 @@ export async function logRequest(rawRequest, opts = {}) {
|
|
|
37
40
|
}
|
|
38
41
|
let result;
|
|
39
42
|
try {
|
|
40
|
-
|
|
43
|
+
const metadata = opts.projectPath ? { project_path: opts.projectPath } : undefined;
|
|
44
|
+
result = await coolhand.logRequest(rawRequest, {
|
|
45
|
+
collector: COLLECTOR,
|
|
46
|
+
...(metadata ? { metadata } : {}),
|
|
47
|
+
});
|
|
41
48
|
}
|
|
42
49
|
catch (err) {
|
|
43
50
|
throw new CliError('INGEST_ERROR', `Log submission failed: ${err.message}`);
|
package/dist/log-request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-request.js","sourceRoot":"","sources":["../src/log-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,6EAA6E;AAC7E,MAAM,SAAS,GAAG,GAAG,kBAAkB,cAAc,CAAC;AAEtD
|
|
1
|
+
{"version":3,"file":"log-request.js","sourceRoot":"","sources":["../src/log-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,6EAA6E;AAC7E,MAAM,SAAS,GAAG,GAAG,kBAAkB,cAAc,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAmB,EACnB,OAAoD,EAAE;IAEtD,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,cAAc,IAAI,CAAC,QAAQ,kBAAkB,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,gBAAgB,EAChB,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IAErD,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,0FAA0F;QAC1F,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,gCAAgC,OAAO,KAAM,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;IAChH,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,UAA8B,EAAE;YACjE,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,6FAA6F;IAC7F,4FAA4F;IAC5F,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAwCA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAcD,eAAO,MAAM,MAAM,EAAE,MAIpB,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -10,8 +10,37 @@ const TOKEN_PATTERNS = [
|
|
|
10
10
|
/ch_pub_[A-Za-z0-9_-]{8,}/g,
|
|
11
11
|
/ch_priv_[A-Za-z0-9_-]{8,}/g,
|
|
12
12
|
];
|
|
13
|
+
/**
|
|
14
|
+
* Matches ANSI/VT100 CSI and OSC escape sequences (e.g. color codes, window-title
|
|
15
|
+
* sets), so untrusted text -- a server-controlled client_name or feedback
|
|
16
|
+
* explanation -- can't manipulate the terminal when printed. Built from character
|
|
17
|
+
* codes (rather than a literal control-char regex) to avoid embedding raw escape
|
|
18
|
+
* bytes in source.
|
|
19
|
+
*/
|
|
20
|
+
function buildAnsiEscapePattern() {
|
|
21
|
+
const esc = String.fromCharCode(0x1b);
|
|
22
|
+
const bel = String.fromCharCode(0x07);
|
|
23
|
+
// 7-bit forms use a two-character introducer (ESC [ / ESC ]); the single-byte C1
|
|
24
|
+
// introducers (0x9B for CSI, 0x9D for OSC) stand in for the whole two-character
|
|
25
|
+
// introducer, so they're matched without a following bracket.
|
|
26
|
+
const c1Csi = String.fromCharCode(0x9b);
|
|
27
|
+
const c1Osc = String.fromCharCode(0x9d);
|
|
28
|
+
// Per ECMA-48: a CSI sequence is introducer + parameter bytes (0x30-0x3F, i.e.
|
|
29
|
+
// digits and ':;<=>?') + intermediate bytes (0x20-0x2F) + a single final byte
|
|
30
|
+
// (0x40-0x7E) -- not just digits/';'/'?' and a letter, which misses sequences
|
|
31
|
+
// like colon-separated true-color SGR (`\x1b[38:2:255:0:0m`), sequences with an
|
|
32
|
+
// intermediate byte (`\x1b[2 q`), or final bytes outside a-zA-Z (`\x1b[5@`).
|
|
33
|
+
const csi = `(?:${esc}\\[|${c1Csi})[0-?]*[ -/]*[@-~]`;
|
|
34
|
+
const osc = `(?:${esc}\\]|${c1Osc})[^${esc}${bel}]*(?:${bel}|${esc}\\\\)`;
|
|
35
|
+
return new RegExp(`${csi}|${osc}`, 'g');
|
|
36
|
+
}
|
|
37
|
+
const ANSI_ESCAPE_PATTERN = buildAnsiEscapePattern();
|
|
38
|
+
export function stripAnsiEscapes(text) {
|
|
39
|
+
return text.replace(ANSI_ESCAPE_PATTERN, '');
|
|
40
|
+
}
|
|
13
41
|
export function redact(text) {
|
|
14
|
-
|
|
42
|
+
const sanitized = stripAnsiEscapes(text);
|
|
43
|
+
return TOKEN_PATTERNS.reduce((acc, pattern) => acc.replace(pattern, 'REDACTED'), sanitized);
|
|
15
44
|
}
|
|
16
45
|
function defaultInfo(message) {
|
|
17
46
|
process.stderr.write(`${redact(message)}\n`);
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,cAAc,GAA0B;IAC5C,qBAAqB;IACrB,2BAA2B;IAC3B,4BAA4B;CAC7B,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,cAAc,GAA0B;IAC5C,qBAAqB;IACrB,2BAA2B;IAC3B,4BAA4B;CAC7B,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,sBAAsB;IAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,iFAAiF;IACjF,gFAAgF;IAChF,8DAA8D;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,+EAA+E;IAC/E,8EAA8E;IAC9E,8EAA8E;IAC9E,gFAAgF;IAChF,6EAA6E;IAC7E,MAAM,GAAG,GAAG,MAAM,GAAG,OAAO,KAAK,oBAAoB,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC;IAC1E,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAC;AAErD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;AAC9F,CAAC;AAQD,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;CAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"certs.d.ts","sourceRoot":"","sources":["../../src/proxy/certs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"certs.d.ts","sourceRoot":"","sources":["../../src/proxy/certs.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAiHD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CA0FxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEtE"}
|
package/dist/proxy/certs.js
CHANGED
|
@@ -2,7 +2,105 @@ import * as fs from "fs";
|
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import * as os from "os";
|
|
4
4
|
import * as mockttp from "mockttp";
|
|
5
|
+
import { CliError } from "../errors.js";
|
|
5
6
|
const DEFAULT_CERT_DIR = path.join(os.homedir(), ".coolhand", "proxy");
|
|
7
|
+
function assertRegularFile(filePath, stat) {
|
|
8
|
+
if (!stat.isFile()) {
|
|
9
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${filePath}: it is not a regular file (symlink, pipe, or other special file). ` +
|
|
10
|
+
"Remove it and re-run to generate a fresh CA.");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// POSIX-only: Windows has no comparable uid/mode semantics and process.getuid
|
|
14
|
+
// doesn't exist there, so these checks are no-ops on win32.
|
|
15
|
+
function assertOwnedByCurrentUser(filePath, stat) {
|
|
16
|
+
if (process.platform === "win32") {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const uid = process.getuid?.();
|
|
20
|
+
if (uid !== undefined && stat.uid !== uid) {
|
|
21
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${filePath}: it is owned by a different user (uid ${stat.uid}), not the current user (uid ${uid}). ` +
|
|
22
|
+
"This file must have been created by this CLI. Remove it and re-run to generate a fresh CA.");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function assertKeyFilePermissions(filePath, stat) {
|
|
26
|
+
if (process.platform === "win32") {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if ((stat.mode & 0o077) !== 0) {
|
|
30
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${filePath}: it is readable or writable by group/other (mode ${(stat.mode & 0o777).toString(8)}). ` +
|
|
31
|
+
`Run \`chmod 600 ${filePath}\` or remove it and re-run to generate a fresh CA.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Rejects certDir itself if it's a symlink, not a directory, or owned by another
|
|
36
|
+
* user, before it's ever passed to mkdirSync — otherwise the per-file checks below
|
|
37
|
+
* would be moot, since mkdirSync(..., {recursive: true}) treats an existing path as
|
|
38
|
+
* already satisfied (even through a symlink), so a pre-planted
|
|
39
|
+
* "~/.coolhand/proxy -> attacker-owned dir" symlink would have every subsequent
|
|
40
|
+
* operation silently apply to the attacker's directory instead.
|
|
41
|
+
* POSIX-only, like the file-level ownership check.
|
|
42
|
+
*/
|
|
43
|
+
function assertCertDirIsSecure(dir) {
|
|
44
|
+
let stat;
|
|
45
|
+
try {
|
|
46
|
+
stat = fs.lstatSync(dir);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (err.code === "ENOENT") {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
if (process.platform === "win32") {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (stat.isSymbolicLink()) {
|
|
58
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${dir}: it is a symlink, which could point to a directory outside your control. ` +
|
|
59
|
+
"Remove it and re-run to create a fresh cert directory.");
|
|
60
|
+
}
|
|
61
|
+
if (!stat.isDirectory()) {
|
|
62
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${dir}: it exists but is not a directory. Remove it and re-run to create a fresh cert directory.`);
|
|
63
|
+
}
|
|
64
|
+
assertOwnedByCurrentUser(dir, stat);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Opens filePath and returns its contents plus the fstat of the exact fd that was
|
|
68
|
+
* read, running `checks` against that fstat before reading. Using fstat on the open
|
|
69
|
+
* fd (rather than a separate stat-then-read) closes the TOCTOU window where a
|
|
70
|
+
* concurrent attacker could swap the file for something else between checking it
|
|
71
|
+
* and reading it. On POSIX, O_NOFOLLOW makes a symlinked path fail open() with
|
|
72
|
+
* ELOOP (reported as CERT_FILE_INSECURE below) instead of silently dereferencing
|
|
73
|
+
* it, and O_NONBLOCK keeps open() from hanging forever if the path is a FIFO
|
|
74
|
+
* with no writer — assertRegularFile then rejects the FIFO before any read is
|
|
75
|
+
* attempted, so O_NONBLOCK never affects the actual regular-file read.
|
|
76
|
+
*/
|
|
77
|
+
function readCertFileSecurely(filePath, checks) {
|
|
78
|
+
const flags = process.platform === "win32"
|
|
79
|
+
? fs.constants.O_RDONLY
|
|
80
|
+
: fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK;
|
|
81
|
+
let fd;
|
|
82
|
+
try {
|
|
83
|
+
fd = fs.openSync(filePath, flags);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const code = err.code;
|
|
87
|
+
if (code === "ELOOP") {
|
|
88
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${filePath}: it is a symlink, which could point to unrelated file content outside this directory. ` +
|
|
89
|
+
"Remove it and re-run to generate a fresh CA.");
|
|
90
|
+
}
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const stat = fs.fstatSync(fd);
|
|
95
|
+
for (const check of checks) {
|
|
96
|
+
check(filePath, stat);
|
|
97
|
+
}
|
|
98
|
+
return fs.readFileSync(fd, "utf8");
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
fs.closeSync(fd);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
6
104
|
/**
|
|
7
105
|
* Get or create a CA certificate for MITM proxy interception.
|
|
8
106
|
* Certs are persisted to disk so they can be installed in the system trust store.
|
|
@@ -10,17 +108,54 @@ const DEFAULT_CERT_DIR = path.join(os.homedir(), ".coolhand", "proxy");
|
|
|
10
108
|
export async function getOrCreateCA(certDir = DEFAULT_CERT_DIR) {
|
|
11
109
|
const keyPath = path.join(certDir, "ca-key.pem");
|
|
12
110
|
const certPath = path.join(certDir, "ca-cert.pem");
|
|
111
|
+
assertCertDirIsSecure(certDir);
|
|
112
|
+
// Tighten certDir's permissions on every call, not just when generating a fresh
|
|
113
|
+
// CA — otherwise a directory left group/world-writable by an older CLI version
|
|
114
|
+
// (or a shared machine) stays that way indefinitely as long as the cert files
|
|
115
|
+
// inside it keep passing their own ownership/mode checks below.
|
|
116
|
+
fs.mkdirSync(certDir, { recursive: true, mode: 0o700 });
|
|
117
|
+
if (process.platform !== "win32") {
|
|
118
|
+
// Open with O_NOFOLLOW|O_DIRECTORY and fchmod the resulting fd, rather than
|
|
119
|
+
// chmodSync-by-path, so a symlink swapped in for certDir between mkdirSync
|
|
120
|
+
// above and this call is rejected (ELOOP) instead of silently followed —
|
|
121
|
+
// narrowing (though, absent a dirfd-relative write API in Node's fs module,
|
|
122
|
+
// not fully eliminating) the race between checking certDir and using it.
|
|
123
|
+
let dirFd;
|
|
124
|
+
try {
|
|
125
|
+
dirFd = fs.openSync(certDir, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_DIRECTORY);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const code = err.code;
|
|
129
|
+
if (code === "ELOOP") {
|
|
130
|
+
throw new CliError("CERT_FILE_INSECURE", `Refusing to use ${certDir}: it is a symlink, which could point to a directory outside your control. ` +
|
|
131
|
+
"Remove it and re-run to create a fresh cert directory.");
|
|
132
|
+
}
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
fs.fchmodSync(dirFd, 0o700);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
throw new CliError("CERT_FILE_INSECURE", `Failed to restrict ${certDir} to owner-only permissions: ${err.message}. ` +
|
|
140
|
+
"This directory holds the CA private key and must not be group/world-accessible.");
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
fs.closeSync(dirFd);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
13
146
|
try {
|
|
14
147
|
// Known limitation: if both files exist but are from different generations
|
|
15
148
|
// (e.g. a partial write left mismatched files), the stale pair is loaded
|
|
16
149
|
// silently. The temp+rename write strategy below prevents this for new
|
|
17
150
|
// writes, but does not detect pre-existing mismatches.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
};
|
|
151
|
+
const key = readCertFileSecurely(keyPath, [assertRegularFile, assertOwnedByCurrentUser, assertKeyFilePermissions]);
|
|
152
|
+
const cert = readCertFileSecurely(certPath, [assertRegularFile, assertOwnedByCurrentUser]);
|
|
153
|
+
return { key, cert };
|
|
22
154
|
}
|
|
23
155
|
catch (err) {
|
|
156
|
+
if (err instanceof CliError) {
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
24
159
|
const code = err.code;
|
|
25
160
|
if (code !== "ENOENT" && code !== "ENOTDIR") {
|
|
26
161
|
throw err;
|
|
@@ -33,9 +168,14 @@ export async function getOrCreateCA(certDir = DEFAULT_CERT_DIR) {
|
|
|
33
168
|
}
|
|
34
169
|
}
|
|
35
170
|
const ca = await mockttp.generateCACertificate();
|
|
36
|
-
fs.mkdirSync(certDir, { recursive: true, mode: 0o700 });
|
|
37
171
|
// Write via temp+rename so a crash between the two writes never leaves a
|
|
38
172
|
// mismatched key/cert pair on disk (TOCTOU guard).
|
|
173
|
+
//
|
|
174
|
+
// Known limitation: these writes are still path-based (certDir gets re-resolved
|
|
175
|
+
// by the OS, not accessed via the fd validated above), since Node's fs module has
|
|
176
|
+
// no dirfd-relative ("openat") write API. A symlink swapped in for certDir in the
|
|
177
|
+
// narrow window between the fchmod check above and these writes would still be
|
|
178
|
+
// followed. This is an accepted residual risk given the tooling available.
|
|
39
179
|
const keyTmp = keyPath + ".tmp";
|
|
40
180
|
const certTmp = certPath + ".tmp";
|
|
41
181
|
try {
|
package/dist/proxy/certs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/proxy/certs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/proxy/certs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Check if a URL matches a known AI API pattern
|
|
2
|
+
* Check if a URL matches a known AI API pattern and isn't on coolhand-node's own
|
|
3
|
+
* exclude list (e.g. batch-prediction-job status polling) — mirrors the filtering
|
|
4
|
+
* coolhand-node's SDK applies before treating a request as an inference call.
|
|
3
5
|
* Uses coolhand-node's PatternMatchingService which covers
|
|
4
6
|
* OpenAI, Anthropic, Google AI, Cohere, Hugging Face, etc.
|
|
5
7
|
*/
|
|
@@ -13,4 +15,9 @@ export declare function flattenHeaders(headers: Record<string, string | string[]
|
|
|
13
15
|
* Sanitize headers by redacting sensitive values (API keys, auth tokens).
|
|
14
16
|
*/
|
|
15
17
|
export declare function sanitizeHeaders(headers: Record<string, string>): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize a URL by redacting sensitive query parameter values
|
|
20
|
+
* (API keys, tokens) while leaving the rest of the URL intact.
|
|
21
|
+
*/
|
|
22
|
+
export declare function sanitizeURL(url: string): string;
|
|
16
23
|
//# sourceMappingURL=interceptor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/proxy/interceptor.ts"],"names":[],"mappings":"AAYA
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/proxy/interceptor.ts"],"names":[],"mappings":"AAYA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAKlD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GACrD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB;AAWD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAe/C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PatternMatchingService } from "coolhand-node";
|
|
1
|
+
import { PatternMatchingService, DEFAULT_EXCLUDE_API_PATTERNS } from "coolhand-node";
|
|
2
2
|
// Lazily instantiated so a constructor error surfaces at shouldCapture() call
|
|
3
3
|
// time rather than at module load time. The proxy request handler wraps
|
|
4
4
|
// shouldCapture() in a try/catch so the error degrades gracefully (skip
|
|
@@ -11,12 +11,17 @@ function getPatternService() {
|
|
|
11
11
|
return _patternService;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Check if a URL matches a known AI API pattern
|
|
14
|
+
* Check if a URL matches a known AI API pattern and isn't on coolhand-node's own
|
|
15
|
+
* exclude list (e.g. batch-prediction-job status polling) — mirrors the filtering
|
|
16
|
+
* coolhand-node's SDK applies before treating a request as an inference call.
|
|
15
17
|
* Uses coolhand-node's PatternMatchingService which covers
|
|
16
18
|
* OpenAI, Anthropic, Google AI, Cohere, Hugging Face, etc.
|
|
17
19
|
*/
|
|
18
20
|
export function shouldCapture(url) {
|
|
19
|
-
|
|
21
|
+
if (getPatternService().matchesAPIPatternFromURL(url) === null) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return !DEFAULT_EXCLUDE_API_PATTERNS.some((pattern) => url.includes(pattern));
|
|
20
25
|
}
|
|
21
26
|
/**
|
|
22
27
|
* Flatten a raw header map (values may be string[], string, or undefined)
|
|
@@ -45,6 +50,7 @@ export function sanitizeHeaders(headers) {
|
|
|
45
50
|
"cookie",
|
|
46
51
|
"set-cookie",
|
|
47
52
|
"openai-api-key",
|
|
53
|
+
"cf-aig-authorization",
|
|
48
54
|
]);
|
|
49
55
|
const sanitized = {};
|
|
50
56
|
for (const [key, value] of Object.entries(headers)) {
|
|
@@ -54,4 +60,31 @@ export function sanitizeHeaders(headers) {
|
|
|
54
60
|
}
|
|
55
61
|
return sanitized;
|
|
56
62
|
}
|
|
63
|
+
const SENSITIVE_QUERY_PARAMS = new Set([
|
|
64
|
+
"key",
|
|
65
|
+
"api_key",
|
|
66
|
+
"apikey",
|
|
67
|
+
"token",
|
|
68
|
+
"access_token",
|
|
69
|
+
"secret",
|
|
70
|
+
]);
|
|
71
|
+
/**
|
|
72
|
+
* Sanitize a URL by redacting sensitive query parameter values
|
|
73
|
+
* (API keys, tokens) while leaving the rest of the URL intact.
|
|
74
|
+
*/
|
|
75
|
+
export function sanitizeURL(url) {
|
|
76
|
+
let parsed;
|
|
77
|
+
try {
|
|
78
|
+
parsed = new URL(url);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return url;
|
|
82
|
+
}
|
|
83
|
+
for (const key of parsed.searchParams.keys()) {
|
|
84
|
+
if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) {
|
|
85
|
+
parsed.searchParams.set(key, "[REDACTED]");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return parsed.href;
|
|
89
|
+
}
|
|
57
90
|
//# sourceMappingURL=interceptor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/proxy/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/proxy/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAErF,8EAA8E;AAC9E,wEAAwE;AACxE,wEAAwE;AACxE,0DAA0D;AAC1D,IAAI,eAAmD,CAAC;AACxD,SAAS,iBAAiB;IACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QAAC,eAAe,GAAG,IAAI,sBAAsB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IACzF,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,iBAAiB,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAsD;IAEtD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAA+B;IAE/B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;QAC5B,eAAe;QACf,qBAAqB;QACrB,gBAAgB;QAChB,WAAW;QACX,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,sBAAsB;KACvB,CAAC,CAAC;IAEH,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,SAAS,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACnD,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,KAAK;IACL,SAAS;IACT,QAAQ;IACR,OAAO;IACP,cAAc;IACd,QAAQ;CACT,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAWD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,aAAa,EACjB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAWD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,aAAa,EACjB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC,CA+GxB"}
|
package/dist/proxy/proxy.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as mockttp from "mockttp";
|
|
2
|
-
import { shouldCapture, sanitizeHeaders, flattenHeaders } from "./interceptor.js";
|
|
2
|
+
import { shouldCapture, sanitizeHeaders, sanitizeURL, flattenHeaders } from "./interceptor.js";
|
|
3
3
|
import { sendToCoolhand } from "./sender.js";
|
|
4
4
|
/**
|
|
5
5
|
* Start an HTTPS MITM proxy that intercepts LLM API calls
|
|
@@ -52,10 +52,11 @@ export async function startProxy(ca, options) {
|
|
|
52
52
|
// when the request arrived and is likely already settled by the time the
|
|
53
53
|
// response handler fires, so Promise.all adds no extra latency.
|
|
54
54
|
const send = Promise.all([res.body.getText(), req.bodyPromise]).then(([responseBodyText, requestBodyText]) => {
|
|
55
|
+
const sanitizedUrl = sanitizeURL(req.url);
|
|
55
56
|
const captured = {
|
|
56
57
|
request: {
|
|
57
58
|
method: req.method,
|
|
58
|
-
url:
|
|
59
|
+
url: sanitizedUrl,
|
|
59
60
|
headers: sanitizeHeaders(req.headers),
|
|
60
61
|
body: requestBodyText,
|
|
61
62
|
},
|
|
@@ -67,7 +68,7 @@ export async function startProxy(ca, options) {
|
|
|
67
68
|
timestamp: req.timestamp,
|
|
68
69
|
};
|
|
69
70
|
if (!options.silent) {
|
|
70
|
-
console.error(`[coolhand-proxy] Captured ${req.method} ${
|
|
71
|
+
console.error(`[coolhand-proxy] Captured ${req.method} ${sanitizedUrl} -> ${res.statusCode} (${Math.round(durationMs)}ms)`);
|
|
71
72
|
}
|
|
72
73
|
return sendToCoolhand(captured, {
|
|
73
74
|
apiKey: options.apiKey,
|
package/dist/proxy/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,18 +5,6 @@ export interface WrapDeps {
|
|
|
5
5
|
spawnFn?: typeof spawn;
|
|
6
6
|
startProxyFn?: (ca: Awaited<ReturnType<typeof getOrCreateCA>>, opts: Parameters<typeof startProxy>[1]) => Promise<ProxyInstance>;
|
|
7
7
|
}
|
|
8
|
-
/**
|
|
9
|
-
* On Windows, .cmd shims cannot be spawned without a shell. Rather than using
|
|
10
|
-
* shell:true (which forwards args as an unquoted string to cmd.exe, enabling
|
|
11
|
-
* metacharacter injection), we invoke cmd.exe /d /s /c directly with each arg
|
|
12
|
-
* double-quoted and windowsVerbatimArguments:true so Node does not re-quote them.
|
|
13
|
-
*
|
|
14
|
-
* Quoting rules applied per arg:
|
|
15
|
-
* 1. Double trailing backslashes (a trailing \ would escape the closing ")
|
|
16
|
-
* 2. Escape embedded " as ""
|
|
17
|
-
* 3. Escape % as %% to prevent cmd.exe environment-variable expansion
|
|
18
|
-
* 4. Wrap in double quotes unconditionally
|
|
19
|
-
*/
|
|
20
8
|
export declare function resolveWrapSpawn(cmd: string, args: string[], platform?: NodeJS.Platform): {
|
|
21
9
|
cmd: string;
|
|
22
10
|
spawnArgs: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-runner.d.ts","sourceRoot":"","sources":["../../src/proxy/wrap-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"wrap-runner.d.ts","sourceRoot":"","sources":["../../src/proxy/wrap-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAMtC,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAGxD,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CAClI;AAsBD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,kBAAmB,GAC1B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,wBAAwB,CAAC,EAAE,IAAI,CAAA;CAAE,CAWvE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBtE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,GAAE,QAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CA4FjB"}
|