nexus-agents 8.108.1 → 8.110.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/dist/{ast-rule-runner-KZMBJQLP.js → ast-rule-runner-ZO3T66KP.js} +3 -3
- package/dist/{child-mcp-config-IB73HXHT.js → child-mcp-config-M4MRFMP3.js} +2 -2
- package/dist/{chunk-37GZJOQE.js → chunk-22AF7TYV.js} +6 -39
- package/dist/chunk-22AF7TYV.js.map +1 -0
- package/dist/{chunk-EPCENSPC.js → chunk-33OFW2GU.js} +356 -179
- package/dist/chunk-33OFW2GU.js.map +1 -0
- package/dist/{chunk-ZHGIPNXY.js → chunk-4QWRKVJS.js} +3 -3
- package/dist/{chunk-2FHRJR4I.js → chunk-5O4KT2WO.js} +2 -2
- package/dist/{chunk-CTBQSJXR.js → chunk-AG2XK7CQ.js} +3 -3
- package/dist/{chunk-RCUX2KV2.js → chunk-BE6L6MIE.js} +99 -11
- package/dist/chunk-BE6L6MIE.js.map +1 -0
- package/dist/{chunk-DMDDIONG.js → chunk-BJJOZV7O.js} +5 -5
- package/dist/{chunk-JKGZNPON.js → chunk-C4OZ4F67.js} +5 -5
- package/dist/{chunk-N6KPLEMJ.js → chunk-CDPPWCGO.js} +2 -2
- package/dist/{chunk-IRIN3UUI.js → chunk-CGPKV4KH.js} +5 -5
- package/dist/chunk-CJKHQ6MV.js +109 -0
- package/dist/chunk-CJKHQ6MV.js.map +1 -0
- package/dist/{chunk-34KB3PTX.js → chunk-CX3YZ4S6.js} +8 -8
- package/dist/{chunk-A3NV45KD.js → chunk-D6LZY3W7.js} +2 -2
- package/dist/{chunk-OQ6KK4UB.js → chunk-DNXEQKBR.js} +2 -2
- package/dist/{chunk-YKMMCFAK.js → chunk-FE2VYSSA.js} +2 -2
- package/dist/{chunk-TAAM2NGL.js → chunk-FOBWXDHO.js} +208 -181
- package/dist/chunk-FOBWXDHO.js.map +1 -0
- package/dist/{chunk-SUN4XEIZ.js → chunk-FRBFTFSQ.js} +4 -4
- package/dist/{chunk-OKGILMKQ.js → chunk-G4UBTYE3.js} +2 -2
- package/dist/{chunk-5CMHNRPS.js → chunk-GCQLEDCY.js} +10 -8
- package/dist/{chunk-5CMHNRPS.js.map → chunk-GCQLEDCY.js.map} +1 -1
- package/dist/{chunk-BZOTBURT.js → chunk-GDUB2OE4.js} +2 -2
- package/dist/{chunk-UXWPD2F5.js → chunk-J2QYPARH.js} +7 -3
- package/dist/{chunk-UXWPD2F5.js.map → chunk-J2QYPARH.js.map} +1 -1
- package/dist/{chunk-ARFKHTTR.js → chunk-JRDNNCM7.js} +62 -58
- package/dist/chunk-JRDNNCM7.js.map +1 -0
- package/dist/{chunk-3DMMPHEZ.js → chunk-METD44P2.js} +2 -2
- package/dist/{chunk-4E5KLHUM.js → chunk-NBSI5ICR.js} +3 -3
- package/dist/{chunk-ENJAJCBQ.js → chunk-O4QDBQI6.js} +2 -2
- package/dist/{chunk-26G6WKXC.js → chunk-OM4JSIPB.js} +2 -2
- package/dist/{chunk-VWXFWJGM.js → chunk-OTIVROWE.js} +12 -12
- package/dist/{chunk-CT6GAHMH.js → chunk-PLNSFL2K.js} +2 -2
- package/dist/{chunk-RTH5A2UF.js → chunk-RIF7TUYH.js} +53 -33
- package/dist/chunk-RIF7TUYH.js.map +1 -0
- package/dist/{chunk-Q4VLKRB4.js → chunk-SARPPCY5.js} +2 -2
- package/dist/{chunk-6JFXJWB5.js → chunk-SWHKENEB.js} +4 -4
- package/dist/{chunk-W5LDCQ4I.js → chunk-U5TT4C5O.js} +2 -2
- package/dist/{chunk-H27VYMC5.js → chunk-UMESP2HX.js} +2 -2
- package/dist/{chunk-SQ52P2FG.js → chunk-WKNSD7YL.js} +136 -29
- package/dist/chunk-WKNSD7YL.js.map +1 -0
- package/dist/{chunk-5CK27FJM.js → chunk-YLQNJAJP.js} +10 -111
- package/dist/chunk-YLQNJAJP.js.map +1 -0
- package/dist/{chunk-UL6GDIKP.js → chunk-ZEDLXDDY.js} +2 -2
- package/dist/{chunk-5TSGLULY.js → chunk-ZTOTKIAO.js} +7 -2
- package/dist/chunk-ZTOTKIAO.js.map +1 -0
- package/dist/{cli-circuit-breaker-CLL3LOLL.js → cli-circuit-breaker-FVO43RVL.js} +3 -3
- package/dist/cli.js +46 -45
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-FVXOTCQA.js → composite-router-SJVN7OB4.js} +2 -2
- package/dist/{consensus-vote-IM3ROFV2.js → consensus-vote-OIQKDL5M.js} +19 -18
- package/dist/{context-retriever-VWRPBCPI.js → context-retriever-SONR6BIO.js} +9 -8
- package/dist/{doctor-deep-DD4WSW75.js → doctor-deep-KRSLLEPY.js} +3 -3
- package/dist/doctor-gateway-report-N4H4LV2Q.js +17 -0
- package/dist/{doctor-live-U3TPV5JL.js → doctor-live-XPJKPSRM.js} +11 -11
- package/dist/{expert-bridge-UFC2UQSR.js → expert-bridge-R4AM2VPK.js} +5 -5
- package/dist/{factory-3G5OHH3N.js → factory-G7SSRQET.js} +5 -5
- package/dist/{factory-LRJQQDEM.js → factory-KHLGIPPZ.js} +10 -10
- package/dist/{improvement-review-WUVA2ANM.js → improvement-review-SIVH45QT.js} +6 -6
- package/dist/index.d.ts +94 -40
- package/dist/index.js +49 -44
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-7QQTP3GK.js → init-opencode-GVENWYH4.js} +6 -6
- package/dist/issue-triage-CS4WXPIE.js +17 -0
- package/dist/{openai-compat-adapter-XFWG24FI.js → openai-compat-adapter-CUETEQEQ.js} +6 -6
- package/dist/{pr-reviewer-helpers-L7DICRKO.js → pr-reviewer-helpers-FGON5RFG.js} +5 -4
- package/dist/{registry-command-PM3UKILO.js → registry-command-CARW7JBG.js} +2 -2
- package/dist/{repo-security-plan-CDNABEGW.js → repo-security-plan-4KAW7ELW.js} +3 -3
- package/dist/{research-helpers-synthesize-JGRXBJIR.js → research-helpers-synthesize-CYO2YUAE.js} +4 -4
- package/dist/{routing-memory-5JRMFZCT.js → routing-memory-SFXZODKG.js} +2 -2
- package/dist/{session-memory-TNY2LRPH.js → session-memory-5DAEGAX5.js} +4 -3
- package/dist/{setup-config-S75GGD75.js → setup-config-J6YHOKO3.js} +3 -3
- package/dist/{setup-custom-api-Y3XWGWXR.js → setup-custom-api-4XKOPRRP.js} +4 -4
- package/dist/setup-data-dir-TPK53BTA.js +34 -0
- package/dist/{tool-memory-PMO6P5ST.js → tool-memory-YBFEA2W5.js} +6 -5
- package/dist/{unified-registry-EV5NRQUT.js → unified-registry-S7L5SYG2.js} +12 -12
- package/dist/{weather-report-NVCCE3NE.js → weather-report-MVSIUA23.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-37GZJOQE.js.map +0 -1
- package/dist/chunk-5CK27FJM.js.map +0 -1
- package/dist/chunk-5TSGLULY.js.map +0 -1
- package/dist/chunk-ARFKHTTR.js.map +0 -1
- package/dist/chunk-EPCENSPC.js.map +0 -1
- package/dist/chunk-RCUX2KV2.js.map +0 -1
- package/dist/chunk-RTH5A2UF.js.map +0 -1
- package/dist/chunk-SQ52P2FG.js.map +0 -1
- package/dist/chunk-TAAM2NGL.js.map +0 -1
- package/dist/doctor-gateway-report-DBDMVYWI.js +0 -17
- package/dist/issue-triage-DU4W2KFJ.js +0 -16
- package/dist/setup-data-dir-RGIMEVWQ.js +0 -34
- /package/dist/{ast-rule-runner-KZMBJQLP.js.map → ast-rule-runner-ZO3T66KP.js.map} +0 -0
- /package/dist/{child-mcp-config-IB73HXHT.js.map → child-mcp-config-M4MRFMP3.js.map} +0 -0
- /package/dist/{chunk-ZHGIPNXY.js.map → chunk-4QWRKVJS.js.map} +0 -0
- /package/dist/{chunk-2FHRJR4I.js.map → chunk-5O4KT2WO.js.map} +0 -0
- /package/dist/{chunk-CTBQSJXR.js.map → chunk-AG2XK7CQ.js.map} +0 -0
- /package/dist/{chunk-DMDDIONG.js.map → chunk-BJJOZV7O.js.map} +0 -0
- /package/dist/{chunk-JKGZNPON.js.map → chunk-C4OZ4F67.js.map} +0 -0
- /package/dist/{chunk-N6KPLEMJ.js.map → chunk-CDPPWCGO.js.map} +0 -0
- /package/dist/{chunk-IRIN3UUI.js.map → chunk-CGPKV4KH.js.map} +0 -0
- /package/dist/{chunk-34KB3PTX.js.map → chunk-CX3YZ4S6.js.map} +0 -0
- /package/dist/{chunk-A3NV45KD.js.map → chunk-D6LZY3W7.js.map} +0 -0
- /package/dist/{chunk-OQ6KK4UB.js.map → chunk-DNXEQKBR.js.map} +0 -0
- /package/dist/{chunk-YKMMCFAK.js.map → chunk-FE2VYSSA.js.map} +0 -0
- /package/dist/{chunk-SUN4XEIZ.js.map → chunk-FRBFTFSQ.js.map} +0 -0
- /package/dist/{chunk-OKGILMKQ.js.map → chunk-G4UBTYE3.js.map} +0 -0
- /package/dist/{chunk-BZOTBURT.js.map → chunk-GDUB2OE4.js.map} +0 -0
- /package/dist/{chunk-3DMMPHEZ.js.map → chunk-METD44P2.js.map} +0 -0
- /package/dist/{chunk-4E5KLHUM.js.map → chunk-NBSI5ICR.js.map} +0 -0
- /package/dist/{chunk-ENJAJCBQ.js.map → chunk-O4QDBQI6.js.map} +0 -0
- /package/dist/{chunk-26G6WKXC.js.map → chunk-OM4JSIPB.js.map} +0 -0
- /package/dist/{chunk-VWXFWJGM.js.map → chunk-OTIVROWE.js.map} +0 -0
- /package/dist/{chunk-CT6GAHMH.js.map → chunk-PLNSFL2K.js.map} +0 -0
- /package/dist/{chunk-Q4VLKRB4.js.map → chunk-SARPPCY5.js.map} +0 -0
- /package/dist/{chunk-6JFXJWB5.js.map → chunk-SWHKENEB.js.map} +0 -0
- /package/dist/{chunk-W5LDCQ4I.js.map → chunk-U5TT4C5O.js.map} +0 -0
- /package/dist/{chunk-H27VYMC5.js.map → chunk-UMESP2HX.js.map} +0 -0
- /package/dist/{chunk-UL6GDIKP.js.map → chunk-ZEDLXDDY.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-CLL3LOLL.js.map → cli-circuit-breaker-FVO43RVL.js.map} +0 -0
- /package/dist/{composite-router-FVXOTCQA.js.map → composite-router-SJVN7OB4.js.map} +0 -0
- /package/dist/{consensus-vote-IM3ROFV2.js.map → consensus-vote-OIQKDL5M.js.map} +0 -0
- /package/dist/{context-retriever-VWRPBCPI.js.map → context-retriever-SONR6BIO.js.map} +0 -0
- /package/dist/{doctor-deep-DD4WSW75.js.map → doctor-deep-KRSLLEPY.js.map} +0 -0
- /package/dist/{doctor-gateway-report-DBDMVYWI.js.map → doctor-gateway-report-N4H4LV2Q.js.map} +0 -0
- /package/dist/{doctor-live-U3TPV5JL.js.map → doctor-live-XPJKPSRM.js.map} +0 -0
- /package/dist/{expert-bridge-UFC2UQSR.js.map → expert-bridge-R4AM2VPK.js.map} +0 -0
- /package/dist/{factory-3G5OHH3N.js.map → factory-G7SSRQET.js.map} +0 -0
- /package/dist/{factory-LRJQQDEM.js.map → factory-KHLGIPPZ.js.map} +0 -0
- /package/dist/{improvement-review-WUVA2ANM.js.map → improvement-review-SIVH45QT.js.map} +0 -0
- /package/dist/{init-opencode-7QQTP3GK.js.map → init-opencode-GVENWYH4.js.map} +0 -0
- /package/dist/{issue-triage-DU4W2KFJ.js.map → issue-triage-CS4WXPIE.js.map} +0 -0
- /package/dist/{openai-compat-adapter-XFWG24FI.js.map → openai-compat-adapter-CUETEQEQ.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-L7DICRKO.js.map → pr-reviewer-helpers-FGON5RFG.js.map} +0 -0
- /package/dist/{registry-command-PM3UKILO.js.map → registry-command-CARW7JBG.js.map} +0 -0
- /package/dist/{repo-security-plan-CDNABEGW.js.map → repo-security-plan-4KAW7ELW.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-JGRXBJIR.js.map → research-helpers-synthesize-CYO2YUAE.js.map} +0 -0
- /package/dist/{routing-memory-5JRMFZCT.js.map → routing-memory-SFXZODKG.js.map} +0 -0
- /package/dist/{session-memory-TNY2LRPH.js.map → session-memory-5DAEGAX5.js.map} +0 -0
- /package/dist/{setup-config-S75GGD75.js.map → setup-config-J6YHOKO3.js.map} +0 -0
- /package/dist/{setup-custom-api-Y3XWGWXR.js.map → setup-custom-api-4XKOPRRP.js.map} +0 -0
- /package/dist/{setup-data-dir-RGIMEVWQ.js.map → setup-data-dir-TPK53BTA.js.map} +0 -0
- /package/dist/{tool-memory-PMO6P5ST.js.map → tool-memory-YBFEA2W5.js.map} +0 -0
- /package/dist/{unified-registry-EV5NRQUT.js.map → unified-registry-S7L5SYG2.js.map} +0 -0
- /package/dist/{weather-report-NVCCE3NE.js.map → weather-report-MVSIUA23.js.map} +0 -0
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
getBuiltInAstRulesPath,
|
|
10
10
|
loadRules,
|
|
11
11
|
runAstQaRules
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-CDPPWCGO.js";
|
|
13
13
|
import "./chunk-XEPZSDN5.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-RIF7TUYH.js";
|
|
15
15
|
import "./chunk-UE7A2XHM.js";
|
|
16
16
|
import "./chunk-LWOX65CP.js";
|
|
17
17
|
import "./chunk-PX6F3LHL.js";
|
|
@@ -27,4 +27,4 @@ export {
|
|
|
27
27
|
loadRules,
|
|
28
28
|
runAstQaRules
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=ast-rule-runner-
|
|
30
|
+
//# sourceMappingURL=ast-rule-runner-ZO3T66KP.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-OITVVSWO.js";
|
|
4
4
|
import {
|
|
5
5
|
createLogger
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-RIF7TUYH.js";
|
|
7
7
|
import "./chunk-UE7A2XHM.js";
|
|
8
8
|
import "./chunk-LWOX65CP.js";
|
|
9
9
|
import "./chunk-PX6F3LHL.js";
|
|
@@ -56,4 +56,4 @@ async function generateMcpConfig(options) {
|
|
|
56
56
|
export {
|
|
57
57
|
generateMcpConfig
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=child-mcp-config-
|
|
59
|
+
//# sourceMappingURL=child-mcp-config-M4MRFMP3.js.map
|
|
@@ -1,45 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
redactCredentialShapes
|
|
3
|
+
} from "./chunk-RIF7TUYH.js";
|
|
4
|
+
|
|
1
5
|
// src/security/output-sanitizer.ts
|
|
2
6
|
var REDACTED_KEY_PLACEHOLDER = "[REDACTED_KEY]";
|
|
3
|
-
var KEY_PATTERNS = [
|
|
4
|
-
// Anthropic: sk-ant-api03-... (at least 20 chars after prefix)
|
|
5
|
-
/sk-ant-[A-Za-z0-9_-]{20,}/g,
|
|
6
|
-
// OpenAI project: sk-proj-... (at least 20 chars after prefix)
|
|
7
|
-
/sk-proj-[A-Za-z0-9_-]{20,}/g,
|
|
8
|
-
// Generic OpenAI: sk-... (at least 20 chars after prefix)
|
|
9
|
-
/sk-[A-Za-z0-9_-]{20,}/g,
|
|
10
|
-
// Public keys: pk-...
|
|
11
|
-
/pk-[A-Za-z0-9_-]{20,}/g,
|
|
12
|
-
// AWS access key ID
|
|
13
|
-
/\bAKIA[A-Z0-9]{16}\b/g,
|
|
14
|
-
// Google AI / Gemini: AIzaSy... (at least 30 chars total)
|
|
15
|
-
/AIzaSy[A-Za-z0-9_-]{24,}/g,
|
|
16
|
-
// GitHub PAT: ghp_...
|
|
17
|
-
/ghp_[A-Za-z0-9]{20,}/g,
|
|
18
|
-
// GitHub OAuth: gho_...
|
|
19
|
-
/gho_[A-Za-z0-9]{20,}/g,
|
|
20
|
-
// GitHub user-to-server: ghu_...
|
|
21
|
-
/ghu_[A-Za-z0-9]{20,}/g,
|
|
22
|
-
// GitHub server-to-server (app installation): ghs_...
|
|
23
|
-
/ghs_[A-Za-z0-9]{20,}/g,
|
|
24
|
-
// GitHub fine-grained PAT: github_pat_...
|
|
25
|
-
/github_pat_[A-Za-z0-9_]{22,}/g,
|
|
26
|
-
// GitLab PAT: glpat-...
|
|
27
|
-
/glpat-[A-Za-z0-9_-]{10,}/g,
|
|
28
|
-
// npm token: npm_...
|
|
29
|
-
/npm_[A-Za-z0-9]{20,}/g,
|
|
30
|
-
// PyPI token: pypi-...
|
|
31
|
-
/pypi-[A-Za-z0-9_-]{20,}/g
|
|
32
|
-
];
|
|
33
|
-
var URL_USERINFO_PATTERN = /\b([a-z][a-z0-9+.-]{0,31}:\/\/)[^\s/?#@:]{0,256}(?::[^\s/?#@]{0,256})?@/gi;
|
|
34
7
|
function sanitizeOutput(text, placeholder = REDACTED_KEY_PLACEHOLDER) {
|
|
35
8
|
if (text === "") return text;
|
|
36
|
-
|
|
37
|
-
for (const pattern of KEY_PATTERNS) {
|
|
38
|
-
pattern.lastIndex = 0;
|
|
39
|
-
result = result.replace(pattern, placeholder);
|
|
40
|
-
}
|
|
41
|
-
URL_USERINFO_PATTERN.lastIndex = 0;
|
|
42
|
-
return result.replace(URL_USERINFO_PATTERN, `$1${placeholder}@`);
|
|
9
|
+
return redactCredentialShapes(text, placeholder);
|
|
43
10
|
}
|
|
44
11
|
function sanitizeErrorDetails(text, apiKey, placeholder = REDACTED_KEY_PLACEHOLDER) {
|
|
45
12
|
if (text === "") return "";
|
|
@@ -87,4 +54,4 @@ export {
|
|
|
87
54
|
sanitizeErrorDetails,
|
|
88
55
|
sanitizeStringLeaves
|
|
89
56
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-22AF7TYV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/security/output-sanitizer.ts"],"sourcesContent":["/**\n * nexus-agents/security - Output Sanitizer\n *\n * Redacts API keys and tokens from CLI subprocess stdout/stderr\n * before the output is returned, logged, or traced.\n *\n * @module security/output-sanitizer\n * (Source: Issue #1597 — subprocess output scrubbing gap)\n */\n\nimport { redactCredentialShapes } from '../core/credential-patterns.js';\n\n/** Placeholder text that replaces redacted keys. */\nexport const REDACTED_KEY_PLACEHOLDER = '[REDACTED_KEY]';\n\n/**\n * Redacts known API key patterns from a string: the shared credential-shape\n * set (`core/credential-patterns`, #6753) and URL userinfo. Context rules\n * (Authorization headers, `password=`, query and JSON fields) are NOT applied\n * here — subprocess output is prose, where they misfire (`bearer\\s+` takes\n * \"the bearer of\"); they are the local\n * extension {@link sanitizeErrorDetails} adds for upstream error bodies.\n *\n * Designed to be called on subprocess stdout/stderr before the output\n * is returned to callers, written to logs, or included in trace data.\n *\n * @param text - Raw subprocess output\n * @param placeholder - Replacement placeholder (default: [REDACTED_KEY])\n * @returns The same text with API keys replaced by placeholder\n */\nexport function sanitizeOutput(\n text: string,\n placeholder: string = REDACTED_KEY_PLACEHOLDER\n): string {\n if (text === '') return text;\n\n return redactCredentialShapes(text, placeholder);\n}\n\n/**\n * Redacts credentials (API keys, authorization headers, Bearer tokens, URL credentials,\n * and sensitive JSON fields) from error messages and response bodies.\n *\n * Designed to be called on upstream API error representations before they are\n * attached to error envelopes, logged, or returned to callers.\n *\n * @param text - Raw error message or serialized error body\n * @param apiKey - Optional configured API key to redact by exact match\n * @returns The sanitized text with credentials redacted\n */\nexport function sanitizeErrorDetails(\n text: string,\n apiKey?: string,\n placeholder: string = REDACTED_KEY_PLACEHOLDER\n): string {\n if (text === '') return '';\n\n let result = text;\n if (apiKey !== undefined && apiKey.trim() !== '') {\n result = result.replaceAll(apiKey.trim(), placeholder);\n }\n\n // Redact known key patterns and URL credentials (user:pass@ / token@)\n result = sanitizeOutput(result, placeholder);\n\n // Redact Authorization headers: Bearer and Basic tokens\n result = result.replace(/(authorization:\\s*bearer\\s+)\\S+/gi, `$1${placeholder}`);\n result = result.replace(/(authorization:\\s*basic\\s+)\\S+/gi, `$1${placeholder}`);\n result = result.replace(/(bearer\\s+)[A-Za-z0-9._~+/-]+=*/gi, `$1${placeholder}`);\n\n // Redact plain text assignments like password=... or secret: ...\n result = result.replace(/(\\b(?:password|passwd|secret)\\s*[=:]\\s*)\\S{4,}/gi, `$1${placeholder}`);\n\n // Redact sensitive query parameters in URLs or logs (?api_key=..., &token=..., &prompt=...)\n result = result.replace(\n /([?&](?:api[_-]?key|token|access[_-]?token|secret|password|prompt|system_prompt|user_prompt)=)[^&\\s]+/gi,\n `$1${placeholder}`\n );\n\n // Redact sensitive JSON keys: \"api_key\": \"...\", \"token\": \"...\", \"prompt\": \"...\", etc.\n result = result.replace(\n /\"(api[_-]?key|access[_-]?token|token|secret|password|prompt|system_prompt|user_prompt)\"\\s*:\\s*\"(?:[^\"\\\\]|\\\\.)*\"/gi,\n `\"$1\": \"${placeholder}\"`\n );\n\n return result;\n}\n\n/** `value.toJSON()` when it has one (a `Date`), as `JSON.stringify` would; else `value`. */\nfunction serializedForm(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) return value;\n const toJSON: unknown = (value as { toJSON?: unknown }).toJSON;\n return typeof toJSON === 'function' ? (toJSON as () => unknown).call(value) : value;\n}\n\n/**\n * `value` with `sanitize` applied to every string LEAF. A `toJSON` object (a\n * `Date`) is taken in its serialized form first, as `JSON.stringify` would;\n * arrays are mapped and objects copied from their own enumerable entries.\n * Keys, numbers, booleans and `null` are untouched, so the structure a JSON\n * reader sees survives. Returns a copy — the input is not mutated.\n */\nexport function sanitizeStringLeaves(input: unknown, sanitize: (text: string) => string): unknown {\n const value = serializedForm(input);\n if (typeof value === 'string') return sanitize(value);\n if (Array.isArray(value)) return value.map((item) => sanitizeStringLeaves(item, sanitize));\n if (typeof value === 'object' && value !== null) {\n const copy: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n copy[key] = sanitizeStringLeaves(entry, sanitize);\n }\n return copy;\n }\n return value;\n}\n"],"mappings":";;;;;AAaO,IAAM,2BAA2B;AAiBjC,SAAS,eACd,MACA,cAAsB,0BACd;AACR,MAAI,SAAS,GAAI,QAAO;AAExB,SAAO,uBAAuB,MAAM,WAAW;AACjD;AAaO,SAAS,qBACd,MACA,QACA,cAAsB,0BACd;AACR,MAAI,SAAS,GAAI,QAAO;AAExB,MAAI,SAAS;AACb,MAAI,WAAW,UAAa,OAAO,KAAK,MAAM,IAAI;AAChD,aAAS,OAAO,WAAW,OAAO,KAAK,GAAG,WAAW;AAAA,EACvD;AAGA,WAAS,eAAe,QAAQ,WAAW;AAG3C,WAAS,OAAO,QAAQ,qCAAqC,KAAK,WAAW,EAAE;AAC/E,WAAS,OAAO,QAAQ,oCAAoC,KAAK,WAAW,EAAE;AAC9E,WAAS,OAAO,QAAQ,qCAAqC,KAAK,WAAW,EAAE;AAG/E,WAAS,OAAO,QAAQ,oDAAoD,KAAK,WAAW,EAAE;AAG9F,WAAS,OAAO;AAAA,IACd;AAAA,IACA,KAAK,WAAW;AAAA,EAClB;AAGA,WAAS,OAAO;AAAA,IACd;AAAA,IACA,UAAU,WAAW;AAAA,EACvB;AAEA,SAAO;AACT;AAGA,SAAS,eAAe,OAAyB;AAC/C,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAmB,MAA+B;AACxD,SAAO,OAAO,WAAW,aAAc,OAAyB,KAAK,KAAK,IAAI;AAChF;AASO,SAAS,qBAAqB,OAAgB,UAA6C;AAChG,QAAM,QAAQ,eAAe,KAAK;AAClC,MAAI,OAAO,UAAU,SAAU,QAAO,SAAS,KAAK;AACpD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,qBAAqB,MAAM,QAAQ,CAAC;AACzF,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,OAAgC,CAAC;AACvC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,WAAK,GAAG,IAAI,qBAAqB,OAAO,QAAQ;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":[]}
|