nexus-agents 11.5.5 → 11.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/{ast-rule-runner-CVDVRVAS.js → ast-rule-runner-TY2DZJBQ.js} +5 -5
  2. package/dist/{child-mcp-config-H5G3DK7S.js → child-mcp-config-YKGYKLE4.js} +4 -4
  3. package/dist/{chunk-PY6GUS22.js → chunk-2GXAL4WV.js} +2 -2
  4. package/dist/chunk-3665PYSK.js +118 -0
  5. package/dist/chunk-3665PYSK.js.map +1 -0
  6. package/dist/{chunk-6V4ERXGA.js → chunk-3DTEV3ZW.js} +7 -7
  7. package/dist/{chunk-EBMDEUH7.js → chunk-442TR7T5.js} +5 -5
  8. package/dist/{chunk-FOKNFLXF.js → chunk-4S7H76GJ.js} +2 -2
  9. package/dist/{chunk-6YWQAEAN.js → chunk-4TIN5SKQ.js} +2 -2
  10. package/dist/{chunk-Q7FEF3YH.js → chunk-4UNCRRJP.js} +2 -2
  11. package/dist/{chunk-TNZSALI4.js → chunk-53J7YO4O.js} +2 -2
  12. package/dist/{chunk-4JCRCOOV.js → chunk-A3XTSBSA.js} +4 -4
  13. package/dist/{chunk-3RVTDYT7.js → chunk-AAHTCFE4.js} +183 -151
  14. package/dist/chunk-AAHTCFE4.js.map +1 -0
  15. package/dist/{chunk-CYI7ZAMR.js → chunk-APLXNO7U.js} +13 -13
  16. package/dist/{chunk-GW35PEDO.js → chunk-BIJRNGI4.js} +2 -2
  17. package/dist/{chunk-GP2SE2FW.js → chunk-CAMFBH4W.js} +7 -7
  18. package/dist/{chunk-EA234IFY.js → chunk-CRE3VUQU.js} +8 -8
  19. package/dist/{chunk-UMX44QLL.js → chunk-CWLHWDRU.js} +4 -4
  20. package/dist/{chunk-K6OPXID6.js → chunk-F3QJ6MMF.js} +2 -2
  21. package/dist/{chunk-5SZD2I3X.js → chunk-GQ3ZYHFA.js} +5 -5
  22. package/dist/{chunk-6FHFS2QA.js → chunk-H5N7VP4L.js} +2 -2
  23. package/dist/{chunk-ZQYQZ7FQ.js → chunk-IEUSEZK7.js} +14 -14
  24. package/dist/{chunk-432FGBZR.js → chunk-KZIDRH7L.js} +4 -4
  25. package/dist/{chunk-KUAYIDEG.js → chunk-MS4PMYDL.js} +2 -2
  26. package/dist/{chunk-LNGZKTJL.js → chunk-OB7DE4QN.js} +3 -3
  27. package/dist/{chunk-EFDMPXMP.js → chunk-OMT226GF.js} +2 -2
  28. package/dist/{chunk-AUO7FSZX.js → chunk-OWRB3X7N.js} +2 -2
  29. package/dist/{chunk-7P7TBPXE.js → chunk-P4EL25PO.js} +4 -4
  30. package/dist/{chunk-5EYCAD6W.js → chunk-P7UYXTBL.js} +4 -4
  31. package/dist/{chunk-SNLDHZQ5.js → chunk-QWLNNOYX.js} +3 -3
  32. package/dist/{chunk-4PNQ3OUO.js → chunk-R6P5JIXG.js} +2 -2
  33. package/dist/{chunk-JYZDA5Z7.js → chunk-SNEXMYWH.js} +4 -4
  34. package/dist/{chunk-XJEV7JH2.js → chunk-UPATHBFM.js} +9 -9
  35. package/dist/{chunk-Z5NCR7DH.js → chunk-X4A3XAWE.js} +2 -2
  36. package/dist/{chunk-JRGPMF67.js → chunk-XCNZ63HH.js} +7 -7
  37. package/dist/{chunk-3VH6RBVJ.js → chunk-XT4BDCNW.js} +2 -2
  38. package/dist/{chunk-5BYTGR63.js → chunk-Y3FXFM7Y.js} +4 -4
  39. package/dist/{cli-circuit-breaker-7QJ4SIGM.js → cli-circuit-breaker-JVZ5PU4B.js} +5 -5
  40. package/dist/{cli-readiness-6WFM5N4I.js → cli-readiness-7JCRT2EI.js} +9 -9
  41. package/dist/{cli-server-gateway-TA7TRBJ5.js → cli-server-gateway-5MQUDWGD.js} +13 -13
  42. package/dist/cli.js +44 -44
  43. package/dist/{composite-router-52ZLFXVR.js → composite-router-XSLAMEZ2.js} +4 -4
  44. package/dist/{consensus-vote-FPSXMIFK.js → consensus-vote-PEGKNDMD.js} +17 -17
  45. package/dist/{context-retriever-HTBOLH5P.js → context-retriever-R73UHFWI.js} +10 -10
  46. package/dist/{doctor-deep-TTIMGYHS.js → doctor-deep-M2TBIEBC.js} +5 -5
  47. package/dist/{doctor-gateway-report-I4AFMGUC.js → doctor-gateway-report-YDT7XPVY.js} +8 -8
  48. package/dist/{doctor-live-E5ZMGVXF.js → doctor-live-Z4LF54MW.js} +13 -13
  49. package/dist/{expert-bridge-F6NAPNZC.js → expert-bridge-W4VQIKJZ.js} +6 -6
  50. package/dist/{factory-FO6ICRSI.js → factory-ASG5ZHNZ.js} +7 -7
  51. package/dist/{factory-7IAD2557.js → factory-PHXMDQTV.js} +12 -12
  52. package/dist/{improvement-review-536ZRPUI.js → improvement-review-ECY3ZRDL.js} +8 -8
  53. package/dist/index.js +30 -30
  54. package/dist/{init-opencode-46DMB7VH.js → init-opencode-WVUH45BK.js} +7 -7
  55. package/dist/{issue-triage-LBR6OJQ3.js → issue-triage-WJJTD4MM.js} +7 -7
  56. package/dist/{model-config-helpers-PSOLGUS4.js → model-config-helpers-7ZDR3P4Y.js} +3 -3
  57. package/dist/{openai-compat-adapter-ARDUWHBA.js → openai-compat-adapter-WMFPZ3UG.js} +7 -7
  58. package/dist/{pr-reviewer-helpers-YVHGQLCF.js → pr-reviewer-helpers-KFU6XHHL.js} +5 -5
  59. package/dist/{registry-command-7FRS53FH.js → registry-command-AOMYQ2FJ.js} +2 -2
  60. package/dist/{repo-security-plan-YINATBVX.js → repo-security-plan-7AUZZRCO.js} +4 -4
  61. package/dist/{research-helpers-synthesize-VRWS6GBM.js → research-helpers-synthesize-Q7TPPQMV.js} +6 -6
  62. package/dist/{routing-memory-52ZSJBWK.js → routing-memory-CQVHYZTF.js} +4 -4
  63. package/dist/{session-memory-PDVXENIX.js → session-memory-VKEGIPWB.js} +5 -5
  64. package/dist/{setup-config-XEAU5FMU.js → setup-config-W23HGFJX.js} +5 -5
  65. package/dist/{setup-custom-api-BTGG5HNE.js → setup-custom-api-ENCKU6RP.js} +5 -5
  66. package/dist/{setup-data-dir-FMHY5AVX.js → setup-data-dir-CGSF53FA.js} +16 -16
  67. package/dist/{tool-memory-VFHAQIEN.js → tool-memory-YKHJP5A7.js} +7 -7
  68. package/dist/{unified-registry-KHXB62QQ.js → unified-registry-TLEJ4EIA.js} +12 -12
  69. package/dist/{weather-report-DZLWIKOZ.js → weather-report-OO44SAKC.js} +4 -4
  70. package/package.json +1 -1
  71. package/dist/chunk-3RVTDYT7.js.map +0 -1
  72. package/dist/chunk-7LKX7AUQ.js +0 -57
  73. package/dist/chunk-7LKX7AUQ.js.map +0 -1
  74. /package/dist/{ast-rule-runner-CVDVRVAS.js.map → ast-rule-runner-TY2DZJBQ.js.map} +0 -0
  75. /package/dist/{child-mcp-config-H5G3DK7S.js.map → child-mcp-config-YKGYKLE4.js.map} +0 -0
  76. /package/dist/{chunk-PY6GUS22.js.map → chunk-2GXAL4WV.js.map} +0 -0
  77. /package/dist/{chunk-6V4ERXGA.js.map → chunk-3DTEV3ZW.js.map} +0 -0
  78. /package/dist/{chunk-EBMDEUH7.js.map → chunk-442TR7T5.js.map} +0 -0
  79. /package/dist/{chunk-FOKNFLXF.js.map → chunk-4S7H76GJ.js.map} +0 -0
  80. /package/dist/{chunk-6YWQAEAN.js.map → chunk-4TIN5SKQ.js.map} +0 -0
  81. /package/dist/{chunk-Q7FEF3YH.js.map → chunk-4UNCRRJP.js.map} +0 -0
  82. /package/dist/{chunk-TNZSALI4.js.map → chunk-53J7YO4O.js.map} +0 -0
  83. /package/dist/{chunk-4JCRCOOV.js.map → chunk-A3XTSBSA.js.map} +0 -0
  84. /package/dist/{chunk-CYI7ZAMR.js.map → chunk-APLXNO7U.js.map} +0 -0
  85. /package/dist/{chunk-GW35PEDO.js.map → chunk-BIJRNGI4.js.map} +0 -0
  86. /package/dist/{chunk-GP2SE2FW.js.map → chunk-CAMFBH4W.js.map} +0 -0
  87. /package/dist/{chunk-EA234IFY.js.map → chunk-CRE3VUQU.js.map} +0 -0
  88. /package/dist/{chunk-UMX44QLL.js.map → chunk-CWLHWDRU.js.map} +0 -0
  89. /package/dist/{chunk-K6OPXID6.js.map → chunk-F3QJ6MMF.js.map} +0 -0
  90. /package/dist/{chunk-5SZD2I3X.js.map → chunk-GQ3ZYHFA.js.map} +0 -0
  91. /package/dist/{chunk-6FHFS2QA.js.map → chunk-H5N7VP4L.js.map} +0 -0
  92. /package/dist/{chunk-ZQYQZ7FQ.js.map → chunk-IEUSEZK7.js.map} +0 -0
  93. /package/dist/{chunk-432FGBZR.js.map → chunk-KZIDRH7L.js.map} +0 -0
  94. /package/dist/{chunk-KUAYIDEG.js.map → chunk-MS4PMYDL.js.map} +0 -0
  95. /package/dist/{chunk-LNGZKTJL.js.map → chunk-OB7DE4QN.js.map} +0 -0
  96. /package/dist/{chunk-EFDMPXMP.js.map → chunk-OMT226GF.js.map} +0 -0
  97. /package/dist/{chunk-AUO7FSZX.js.map → chunk-OWRB3X7N.js.map} +0 -0
  98. /package/dist/{chunk-7P7TBPXE.js.map → chunk-P4EL25PO.js.map} +0 -0
  99. /package/dist/{chunk-5EYCAD6W.js.map → chunk-P7UYXTBL.js.map} +0 -0
  100. /package/dist/{chunk-SNLDHZQ5.js.map → chunk-QWLNNOYX.js.map} +0 -0
  101. /package/dist/{chunk-4PNQ3OUO.js.map → chunk-R6P5JIXG.js.map} +0 -0
  102. /package/dist/{chunk-JYZDA5Z7.js.map → chunk-SNEXMYWH.js.map} +0 -0
  103. /package/dist/{chunk-XJEV7JH2.js.map → chunk-UPATHBFM.js.map} +0 -0
  104. /package/dist/{chunk-Z5NCR7DH.js.map → chunk-X4A3XAWE.js.map} +0 -0
  105. /package/dist/{chunk-JRGPMF67.js.map → chunk-XCNZ63HH.js.map} +0 -0
  106. /package/dist/{chunk-3VH6RBVJ.js.map → chunk-XT4BDCNW.js.map} +0 -0
  107. /package/dist/{chunk-5BYTGR63.js.map → chunk-Y3FXFM7Y.js.map} +0 -0
  108. /package/dist/{cli-circuit-breaker-7QJ4SIGM.js.map → cli-circuit-breaker-JVZ5PU4B.js.map} +0 -0
  109. /package/dist/{cli-readiness-6WFM5N4I.js.map → cli-readiness-7JCRT2EI.js.map} +0 -0
  110. /package/dist/{cli-server-gateway-TA7TRBJ5.js.map → cli-server-gateway-5MQUDWGD.js.map} +0 -0
  111. /package/dist/{composite-router-52ZLFXVR.js.map → composite-router-XSLAMEZ2.js.map} +0 -0
  112. /package/dist/{consensus-vote-FPSXMIFK.js.map → consensus-vote-PEGKNDMD.js.map} +0 -0
  113. /package/dist/{context-retriever-HTBOLH5P.js.map → context-retriever-R73UHFWI.js.map} +0 -0
  114. /package/dist/{doctor-deep-TTIMGYHS.js.map → doctor-deep-M2TBIEBC.js.map} +0 -0
  115. /package/dist/{doctor-gateway-report-I4AFMGUC.js.map → doctor-gateway-report-YDT7XPVY.js.map} +0 -0
  116. /package/dist/{doctor-live-E5ZMGVXF.js.map → doctor-live-Z4LF54MW.js.map} +0 -0
  117. /package/dist/{expert-bridge-F6NAPNZC.js.map → expert-bridge-W4VQIKJZ.js.map} +0 -0
  118. /package/dist/{factory-7IAD2557.js.map → factory-ASG5ZHNZ.js.map} +0 -0
  119. /package/dist/{factory-FO6ICRSI.js.map → factory-PHXMDQTV.js.map} +0 -0
  120. /package/dist/{improvement-review-536ZRPUI.js.map → improvement-review-ECY3ZRDL.js.map} +0 -0
  121. /package/dist/{init-opencode-46DMB7VH.js.map → init-opencode-WVUH45BK.js.map} +0 -0
  122. /package/dist/{issue-triage-LBR6OJQ3.js.map → issue-triage-WJJTD4MM.js.map} +0 -0
  123. /package/dist/{model-config-helpers-PSOLGUS4.js.map → model-config-helpers-7ZDR3P4Y.js.map} +0 -0
  124. /package/dist/{openai-compat-adapter-ARDUWHBA.js.map → openai-compat-adapter-WMFPZ3UG.js.map} +0 -0
  125. /package/dist/{pr-reviewer-helpers-YVHGQLCF.js.map → pr-reviewer-helpers-KFU6XHHL.js.map} +0 -0
  126. /package/dist/{registry-command-7FRS53FH.js.map → registry-command-AOMYQ2FJ.js.map} +0 -0
  127. /package/dist/{repo-security-plan-YINATBVX.js.map → repo-security-plan-7AUZZRCO.js.map} +0 -0
  128. /package/dist/{research-helpers-synthesize-VRWS6GBM.js.map → research-helpers-synthesize-Q7TPPQMV.js.map} +0 -0
  129. /package/dist/{routing-memory-52ZSJBWK.js.map → routing-memory-CQVHYZTF.js.map} +0 -0
  130. /package/dist/{session-memory-PDVXENIX.js.map → session-memory-VKEGIPWB.js.map} +0 -0
  131. /package/dist/{setup-config-XEAU5FMU.js.map → setup-config-W23HGFJX.js.map} +0 -0
  132. /package/dist/{setup-custom-api-BTGG5HNE.js.map → setup-custom-api-ENCKU6RP.js.map} +0 -0
  133. /package/dist/{setup-data-dir-FMHY5AVX.js.map → setup-data-dir-CGSF53FA.js.map} +0 -0
  134. /package/dist/{tool-memory-VFHAQIEN.js.map → tool-memory-YKHJP5A7.js.map} +0 -0
  135. /package/dist/{unified-registry-KHXB62QQ.js.map → unified-registry-TLEJ4EIA.js.map} +0 -0
  136. /package/dist/{weather-report-DZLWIKOZ.js.map → weather-report-OO44SAKC.js.map} +0 -0
@@ -9,11 +9,11 @@ import {
9
9
  getBuiltInAstRulesPath,
10
10
  loadRules,
11
11
  runAstQaRules
12
- } from "./chunk-GW35PEDO.js";
13
- import "./chunk-6V4ERXGA.js";
12
+ } from "./chunk-BIJRNGI4.js";
13
+ import "./chunk-3DTEV3ZW.js";
14
14
  import "./chunk-XBEKMUTO.js";
15
- import "./chunk-3VH6RBVJ.js";
16
- import "./chunk-TNZSALI4.js";
15
+ import "./chunk-XT4BDCNW.js";
16
+ import "./chunk-53J7YO4O.js";
17
17
  import "./chunk-CBN5IKTG.js";
18
18
  import "./chunk-UFAK5UGH.js";
19
19
  import "./chunk-GR6WCJWY.js";
@@ -34,4 +34,4 @@ export {
34
34
  loadRules,
35
35
  runAstQaRules
36
36
  };
37
- //# sourceMappingURL=ast-rule-runner-CVDVRVAS.js.map
37
+ //# sourceMappingURL=ast-rule-runner-TY2DZJBQ.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  nexusMkdtempSync
3
3
  } from "./chunk-CBDUTJJC.js";
4
- import "./chunk-6V4ERXGA.js";
4
+ import "./chunk-3DTEV3ZW.js";
5
5
  import "./chunk-XBEKMUTO.js";
6
- import "./chunk-3VH6RBVJ.js";
7
- import "./chunk-TNZSALI4.js";
6
+ import "./chunk-XT4BDCNW.js";
7
+ import "./chunk-53J7YO4O.js";
8
8
  import "./chunk-CBN5IKTG.js";
9
9
  import "./chunk-UFAK5UGH.js";
10
10
  import {
@@ -81,4 +81,4 @@ async function generateMcpConfig(options) {
81
81
  export {
82
82
  generateMcpConfig
83
83
  };
84
- //# sourceMappingURL=child-mcp-config-H5G3DK7S.js.map
84
+ //# sourceMappingURL=child-mcp-config-YKGYKLE4.js.map
@@ -5,7 +5,7 @@ import {
5
5
  err,
6
6
  getErrorMessage,
7
7
  ok
8
- } from "./chunk-6V4ERXGA.js";
8
+ } from "./chunk-3DTEV3ZW.js";
9
9
  import {
10
10
  createLogger,
11
11
  getTimeProvider
@@ -376,4 +376,4 @@ export {
376
376
  SessionMemory,
377
377
  createSessionMemory
378
378
  };
379
- //# sourceMappingURL=chunk-PY6GUS22.js.map
379
+ //# sourceMappingURL=chunk-2GXAL4WV.js.map
@@ -0,0 +1,118 @@
1
+ import {
2
+ redactCredentialShapes
3
+ } from "./chunk-GR6WCJWY.js";
4
+
5
+ // src/security/output-sanitizer.ts
6
+ var REDACTED_KEY_PLACEHOLDER = "[REDACTED_KEY]";
7
+ function sanitizeOutput(text, placeholder = REDACTED_KEY_PLACEHOLDER) {
8
+ if (text === "") return text;
9
+ return redactCredentialShapes(text, placeholder);
10
+ }
11
+ function isJsonDocument(text) {
12
+ if (!/^\s*[[{"]/.test(text)) return false;
13
+ try {
14
+ JSON.parse(text);
15
+ return true;
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+ function contextValueEnd(text, start, query, json) {
21
+ let end = start;
22
+ while (end < text.length) {
23
+ const char = text[end] ?? "";
24
+ if (/\s/.test(char) || query && char === "&") break;
25
+ if (json && char === '"') break;
26
+ if (json && char === "\\") end++;
27
+ end++;
28
+ }
29
+ return Math.min(end, text.length);
30
+ }
31
+ var SEMGREP_FINDING_LOCATION = /^[\w./@+-]+:\d+(?![\w.])/;
32
+ function isSemgrepRuleId(text, start, valueStart) {
33
+ const scannerStart = text.lastIndexOf("semgrep:", start);
34
+ if (scannerStart < 0) return false;
35
+ const rule = text.slice(scannerStart, start);
36
+ if (!/^semgrep:(?:[\w.-]*[._-])?generic-$/i.test(rule)) return false;
37
+ return SEMGREP_FINDING_LOCATION.test(text.slice(valueStart, valueStart + 4096));
38
+ }
39
+ function redactContextValues(text, rule, placeholder, json) {
40
+ let result = "";
41
+ let copiedUntil = 0;
42
+ for (const match of text.matchAll(rule.prefixes)) {
43
+ if (match.index < copiedUntil) continue;
44
+ const quote = match.groups?.["q"] ?? "";
45
+ const keyEnd = match.index + match[0].length - quote.length;
46
+ if (match[0].toLowerCase() === "secret:" && isSemgrepRuleId(text, match.index, keyEnd)) {
47
+ continue;
48
+ }
49
+ const start = json && quote !== '"' ? keyEnd + quote.length : keyEnd;
50
+ const end = contextValueEnd(text, start, rule.query === true, json);
51
+ if (end - start < rule.minimumLength) continue;
52
+ result += text.slice(copiedUntil, start) + placeholder;
53
+ copiedUntil = end;
54
+ }
55
+ return result + text.slice(copiedUntil);
56
+ }
57
+ var BEARER_HEADER_RULE = {
58
+ prefixes: /authorization:\s*bearer\s+(?<q>\\?["'])?/gi,
59
+ minimumLength: 1
60
+ };
61
+ var BASIC_HEADER_RULE = {
62
+ prefixes: /authorization:\s*basic\s+(?<q>\\?["'])?/gi,
63
+ minimumLength: 1
64
+ };
65
+ var ASSIGNMENT_RULE = {
66
+ prefixes: /\b(?:password|passwd|secret)\s*[=:]\s*(?<q>\\?["'])?/gi,
67
+ minimumLength: 4
68
+ };
69
+ var QUERY_RULE = {
70
+ prefixes: /[?&](?:api[_-]?key|token|access[_-]?token|secret|password|prompt|system_prompt|user_prompt)=/gi,
71
+ minimumLength: 1,
72
+ query: true
73
+ };
74
+ function sanitizeErrorDetails(text, apiKey, placeholder = REDACTED_KEY_PLACEHOLDER) {
75
+ if (text === "") return "";
76
+ let result = text;
77
+ if (apiKey !== void 0 && apiKey.trim() !== "") {
78
+ result = result.replaceAll(apiKey.trim(), placeholder);
79
+ }
80
+ result = sanitizeOutput(result, placeholder);
81
+ const json = isJsonDocument(result);
82
+ result = redactContextValues(result, BEARER_HEADER_RULE, placeholder, json);
83
+ result = redactContextValues(result, BASIC_HEADER_RULE, placeholder, json);
84
+ result = result.replace(/(bearer\s+)[A-Za-z0-9._~+/-]+=*/gi, `$1${placeholder}`);
85
+ result = redactContextValues(result, ASSIGNMENT_RULE, placeholder, json);
86
+ result = redactContextValues(result, QUERY_RULE, placeholder, json);
87
+ result = result.replace(
88
+ /"(api[_-]?key|access[_-]?token|token|secret|password|prompt|system_prompt|user_prompt)"\s*:\s*"(?:[^"\\]|\\.)*"/gi,
89
+ `"$1": "${placeholder}"`
90
+ );
91
+ return result;
92
+ }
93
+ function serializedForm(value) {
94
+ if (typeof value !== "object" || value === null) return value;
95
+ const toJSON = value.toJSON;
96
+ return typeof toJSON === "function" ? toJSON.call(value) : value;
97
+ }
98
+ function sanitizeStringLeaves(input, sanitize) {
99
+ const value = serializedForm(input);
100
+ if (typeof value === "string") return sanitize(value);
101
+ if (Array.isArray(value)) return value.map((item) => sanitizeStringLeaves(item, sanitize));
102
+ if (typeof value === "object" && value !== null) {
103
+ const copy = {};
104
+ for (const [key, entry] of Object.entries(value)) {
105
+ copy[key] = sanitizeStringLeaves(entry, sanitize);
106
+ }
107
+ return copy;
108
+ }
109
+ return value;
110
+ }
111
+
112
+ export {
113
+ REDACTED_KEY_PLACEHOLDER,
114
+ sanitizeOutput,
115
+ sanitizeErrorDetails,
116
+ sanitizeStringLeaves
117
+ };
118
+ //# sourceMappingURL=chunk-3665PYSK.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 * Whether `text` is one JSON document. Every context-rule prefix starts with a\n * letter, and in a JSON document letters occur only inside string literals, so\n * this one test places every match inside a JSON string.\n */\nfunction isJsonDocument(text: string): boolean {\n if (!/^\\s*[[{\"]/.test(text)) return false;\n try {\n JSON.parse(text);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * End of a context value. Plain text keeps the pre-#7296 extent: the whole\n * non-whitespace run (`&`-bounded for a query value). Inside a JSON string the\n * value also ends at the unescaped `\"` that closes the string, and an escape is\n * consumed as an indivisible pair, so the redaction never splits one (#7296).\n */\nfunction contextValueEnd(text: string, start: number, query: boolean, json: boolean): number {\n let end = start;\n while (end < text.length) {\n const char = text[end] ?? '';\n if (/\\s/.test(char) || (query && char === '&')) break;\n if (json && char === '\"') break;\n if (json && char === '\\\\') end++;\n end++;\n }\n return Math.min(end, text.length);\n}\n\n/** `file:line` straight after a rule id's `secret:`, as `sarif-parser` builds finding ids. */\nconst SEMGREP_FINDING_LOCATION = /^[\\w./@+-]+:\\d+(?![\\w.])/;\n\n/**\n * A semgrep finding id (`semgrep:<rule>generic-secret:<file>:<line>`) rather than a\n * `generic-secret:` assignment. `start` indexes the `secret` keyword; `valueStart`\n * the character after its colon. The rule must be dotted/dashed identifier text and\n * the colon must be followed, without whitespace, by a `file:line` location.\n */\nfunction isSemgrepRuleId(text: string, start: number, valueStart: number): boolean {\n const scannerStart = text.lastIndexOf('semgrep:', start);\n if (scannerStart < 0) return false;\n const rule = text.slice(scannerStart, start);\n if (!/^semgrep:(?:[\\w.-]*[._-])?generic-$/i.test(rule)) return false;\n return SEMGREP_FINDING_LOCATION.test(text.slice(valueStart, valueStart + 4096));\n}\n\ninterface ContextRule {\n /** Matches the key and separator; named group `q` is an optional opening quote. */\n readonly prefixes: RegExp;\n readonly minimumLength: number;\n readonly query?: boolean;\n}\n\n/** Redact only value spans; scanning avoids regex stack growth on large outputs. */\nfunction redactContextValues(\n text: string,\n rule: ContextRule,\n placeholder: string,\n json: boolean\n): string {\n let result = '';\n let copiedUntil = 0;\n for (const match of text.matchAll(rule.prefixes)) {\n if (match.index < copiedUntil) continue;\n const quote = match.groups?.['q'] ?? '';\n const keyEnd = match.index + match[0].length - quote.length;\n if (match[0].toLowerCase() === 'secret:' && isSemgrepRuleId(text, match.index, keyEnd)) {\n continue;\n }\n // Plain text: the quote is part of the value, as before #7296. JSON: an escaped\n // or single quote opens the value; a bare `\"` closes the string and is never taken.\n const start = json && quote !== '\"' ? keyEnd + quote.length : keyEnd;\n const end = contextValueEnd(text, start, rule.query === true, json);\n if (end - start < rule.minimumLength) continue;\n result += text.slice(copiedUntil, start) + placeholder;\n copiedUntil = end;\n }\n return result + text.slice(copiedUntil);\n}\n\n// Bearer and Basic stay separate passes, as before #7296: a value one consumes can hold the other.\nconst BEARER_HEADER_RULE: ContextRule = {\n prefixes: /authorization:\\s*bearer\\s+(?<q>\\\\?[\"'])?/gi,\n minimumLength: 1,\n};\nconst BASIC_HEADER_RULE: ContextRule = {\n prefixes: /authorization:\\s*basic\\s+(?<q>\\\\?[\"'])?/gi,\n minimumLength: 1,\n};\nconst ASSIGNMENT_RULE: ContextRule = {\n prefixes: /\\b(?:password|passwd|secret)\\s*[=:]\\s*(?<q>\\\\?[\"'])?/gi,\n minimumLength: 4,\n};\nconst QUERY_RULE: ContextRule = {\n prefixes:\n /[?&](?:api[_-]?key|token|access[_-]?token|secret|password|prompt|system_prompt|user_prompt)=/gi,\n minimumLength: 1,\n query: true,\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 // Plain text keeps the pre-#7296 extents; inside a JSON document a value also\n // stops at its string's closing quote, so the output still parses (#7296).\n const json = isJsonDocument(result);\n result = redactContextValues(result, BEARER_HEADER_RULE, placeholder, json);\n result = redactContextValues(result, BASIC_HEADER_RULE, placeholder, json);\n // The token class excludes quotes and backslashes, and `\\s` cannot leave a JSON string.\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 = redactContextValues(result, ASSIGNMENT_RULE, placeholder, json);\n\n // Redact sensitive query parameters in URLs or logs (?api_key=..., &token=..., &prompt=...)\n result = redactContextValues(result, QUERY_RULE, placeholder, json);\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":"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","names":[]}
@@ -11,7 +11,7 @@ import {
11
11
  getModelPricing,
12
12
  resolveCliCostPer1M,
13
13
  resolveCliModelName
14
- } from "./chunk-3VH6RBVJ.js";
14
+ } from "./chunk-XT4BDCNW.js";
15
15
  import {
16
16
  DEFAULT_MODEL_PER_CLI,
17
17
  buildInTreeEntries,
@@ -21,7 +21,7 @@ import {
21
21
  pricingSourceOf,
22
22
  resolveModelIdentitySync,
23
23
  unpricedCliCostPer1M
24
- } from "./chunk-TNZSALI4.js";
24
+ } from "./chunk-53J7YO4O.js";
25
25
  import {
26
26
  ensureLearningDir,
27
27
  getDecisionCostFile,
@@ -4717,7 +4717,7 @@ function adapterReadiness(adapter, options) {
4717
4717
  const ceiling = resolveClassGuardMs("interactive");
4718
4718
  const requested = options.timeoutMs ?? ceiling;
4719
4719
  const timeoutMs = Number.isFinite(requested) && requested > 0 ? Math.min(requested, ceiling) : ceiling;
4720
- const flight = import("./cli-readiness-6WFM5N4I.js").then(({ probeServes }) => probeServes(adapter, timeoutMs)).finally(() => readinessFlights.delete(adapter));
4720
+ const flight = import("./cli-readiness-7JCRT2EI.js").then(({ probeServes }) => probeServes(adapter, timeoutMs)).finally(() => readinessFlights.delete(adapter));
4721
4721
  readinessFlights.set(adapter, flight);
4722
4722
  return flight;
4723
4723
  }
@@ -4727,7 +4727,7 @@ async function servesListedModel(adapter, modelId, cli) {
4727
4727
  const models = await adapter.listModels();
4728
4728
  if (models.length === 0) return "unknown";
4729
4729
  const requestedKey = canonicalModelKey(modelId);
4730
- const findCanonicalModel = cli === "codex" ? (await import("./model-config-helpers-PSOLGUS4.js")).findCanonicalModel : void 0;
4730
+ const findCanonicalModel = cli === "codex" ? (await import("./model-config-helpers-7ZDR3P4Y.js")).findCanonicalModel : void 0;
4731
4731
  const requestedEntry = requestedKey === null ? findCanonicalModel?.("codex", modelId) : void 0;
4732
4732
  const listed = models.some((model) => {
4733
4733
  const listedEntry = findCanonicalModel?.("codex", model.id);
@@ -6402,7 +6402,7 @@ var ModelToCliAdapter = class {
6402
6402
  }
6403
6403
  async execute(task, options) {
6404
6404
  const gatewayArm = this.gatewayArmField().gatewayArm;
6405
- const breaker = gatewayArm !== void 0 && this.modelAdapter.providerId === `cli-${this.name}` ? (await import("./cli-circuit-breaker-7QJ4SIGM.js")).getDefaultCliCircuitBreakerRegistry().getArmBreaker(breakerKeys.forArm({ name: this.name, gatewayArm })) : void 0;
6405
+ const breaker = gatewayArm !== void 0 && this.modelAdapter.providerId === `cli-${this.name}` ? (await import("./cli-circuit-breaker-JVZ5PU4B.js")).getDefaultCliCircuitBreakerRegistry().getArmBreaker(breakerKeys.forArm({ name: this.name, gatewayArm })) : void 0;
6406
6406
  const result = await this.modelAdapter.complete(this.toCompletionRequest(task, options));
6407
6407
  if (!result.ok) {
6408
6408
  const cliError = this.toCliError(result.error);
@@ -17618,7 +17618,7 @@ var CompositeRouter = class _CompositeRouter {
17618
17618
  */
17619
17619
  async consultUnifiedContext(task) {
17620
17620
  try {
17621
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-HTBOLH5P.js");
17621
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-R73UHFWI.js");
17622
17622
  const ctx = await getContextForTask({
17623
17623
  task: task.content,
17624
17624
  category: inferTaskCategory(task.content),
@@ -19295,4 +19295,4 @@ export {
19295
19295
  AgentCapability,
19296
19296
  OrchestratorError
19297
19297
  };
19298
- //# sourceMappingURL=chunk-6V4ERXGA.js.map
19298
+ //# sourceMappingURL=chunk-3DTEV3ZW.js.map
@@ -4,10 +4,10 @@ import {
4
4
  loadPapersRegistry,
5
5
  loadTechniquesRegistry,
6
6
  savePapersRegistry
7
- } from "./chunk-Q7FEF3YH.js";
7
+ } from "./chunk-4UNCRRJP.js";
8
8
  import {
9
9
  resolveToken
10
- } from "./chunk-AUO7FSZX.js";
10
+ } from "./chunk-OWRB3X7N.js";
11
11
  import {
12
12
  getTsMorph
13
13
  } from "./chunk-W654ME6B.js";
@@ -18,7 +18,7 @@ import {
18
18
  rankedItemTrustTier,
19
19
  trustTierLabel,
20
20
  withoutUntrustedMemory
21
- } from "./chunk-5EYCAD6W.js";
21
+ } from "./chunk-P7UYXTBL.js";
22
22
  import {
23
23
  extractSystemPrompt,
24
24
  generateCacheKey,
@@ -41,7 +41,7 @@ import {
41
41
  sigmoidConfidence,
42
42
  tokenizeFiltered,
43
43
  truncateSentence
44
- } from "./chunk-6V4ERXGA.js";
44
+ } from "./chunk-3DTEV3ZW.js";
45
45
  import {
46
46
  ensureLearningDir,
47
47
  getRulesFile
@@ -4296,4 +4296,4 @@ export {
4296
4296
  DEFAULT_CONTEXT_BUDGET_TOKENS,
4297
4297
  getContextPromptPrefix
4298
4298
  };
4299
- //# sourceMappingURL=chunk-EBMDEUH7.js.map
4299
+ //# sourceMappingURL=chunk-442TR7T5.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-6V4ERXGA.js";
3
+ } from "./chunk-3DTEV3ZW.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
@@ -82,4 +82,4 @@ function ensureBackup(outputPath) {
82
82
  export {
83
83
  runConfigInitSync
84
84
  };
85
- //# sourceMappingURL=chunk-FOKNFLXF.js.map
85
+ //# sourceMappingURL=chunk-4S7H76GJ.js.map
@@ -2,7 +2,7 @@ import {
2
2
  err,
3
3
  getErrorMessage,
4
4
  ok
5
- } from "./chunk-6V4ERXGA.js";
5
+ } from "./chunk-3DTEV3ZW.js";
6
6
  import {
7
7
  createLogger
8
8
  } from "./chunk-GR6WCJWY.js";
@@ -285,4 +285,4 @@ export {
285
285
  ScmError,
286
286
  GitHubProvider
287
287
  };
288
- //# sourceMappingURL=chunk-6YWQAEAN.js.map
288
+ //# sourceMappingURL=chunk-4TIN5SKQ.js.map
@@ -5,7 +5,7 @@ import {
5
5
  getErrorMessage,
6
6
  ok,
7
7
  resolveInsideRoot
8
- } from "./chunk-6V4ERXGA.js";
8
+ } from "./chunk-3DTEV3ZW.js";
9
9
  import {
10
10
  createLogger
11
11
  } from "./chunk-GR6WCJWY.js";
@@ -213,4 +213,4 @@ export {
213
213
  loadPapersRegistry,
214
214
  savePapersRegistry
215
215
  };
216
- //# sourceMappingURL=chunk-Q7FEF3YH.js.map
216
+ //# sourceMappingURL=chunk-4UNCRRJP.js.map
@@ -1645,7 +1645,7 @@ function setDefaultRegistry(registry) {
1645
1645
  }
1646
1646
  async function reloadDefaultRegistry() {
1647
1647
  globalRegistry = buildDefaultRegistry();
1648
- const { resetGlobalRegistry } = await import("./unified-registry-KHXB62QQ.js");
1648
+ const { resetGlobalRegistry } = await import("./unified-registry-TLEJ4EIA.js");
1649
1649
  resetGlobalRegistry();
1650
1650
  return globalRegistry;
1651
1651
  }
@@ -1674,4 +1674,4 @@ export {
1674
1674
  setDefaultRegistry,
1675
1675
  reloadDefaultRegistry
1676
1676
  };
1677
- //# sourceMappingURL=chunk-TNZSALI4.js.map
1677
+ //# sourceMappingURL=chunk-53J7YO4O.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-6YWQAEAN.js";
4
+ } from "./chunk-4TIN5SKQ.js";
5
5
  import {
6
6
  resolveToken
7
- } from "./chunk-AUO7FSZX.js";
7
+ } from "./chunk-OWRB3X7N.js";
8
8
  import {
9
9
  err,
10
10
  ok
11
- } from "./chunk-6V4ERXGA.js";
11
+ } from "./chunk-3DTEV3ZW.js";
12
12
 
13
13
  // src/scm/factory.ts
14
14
  async function createScmProvider(config) {
@@ -41,4 +41,4 @@ export {
41
41
  createScmProvider,
42
42
  createGitHubProvider
43
43
  };
44
- //# sourceMappingURL=chunk-4JCRCOOV.js.map
44
+ //# sourceMappingURL=chunk-A3XTSBSA.js.map