nexus-agents 2.174.1 → 2.174.2
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/{child-mcp-config-EYDYXTEN.js → child-mcp-config-GWB7JLIS.js} +2 -2
- package/dist/{chunk-SBKJMPV4.js → chunk-2CB6QMRX.js} +35 -35
- package/dist/{chunk-WP46LCTZ.js → chunk-3P7SMHBU.js} +3 -3
- package/dist/{chunk-JJC2FHX5.js → chunk-4PTAG65V.js} +2 -2
- package/dist/{chunk-H2HZSKLO.js → chunk-5QVJCBM4.js} +3 -3
- package/dist/{chunk-MJXTFQH6.js → chunk-6RRAQFSX.js} +2 -2
- package/dist/{chunk-GFXS3OAX.js → chunk-ASJTVA7W.js} +5 -5
- package/dist/{chunk-3XTGA2YK.js → chunk-DGR27REV.js} +4 -170
- package/dist/chunk-DGR27REV.js.map +1 -0
- package/dist/{chunk-KS4EN2WR.js → chunk-DJZGCMNU.js} +2 -2
- package/dist/{chunk-VLSXX6KA.js → chunk-E35RUETV.js} +2 -2
- package/dist/{chunk-LV3UNCC6.js → chunk-EDWON3X5.js} +4 -4
- package/dist/{chunk-BS43TZVD.js → chunk-H5KLPUAL.js} +2 -2
- package/dist/{chunk-DU2YW5DH.js → chunk-HUYP2XXH.js} +2 -2
- package/dist/{chunk-VIE5QLTI.js → chunk-IVINLVGP.js} +2 -2
- package/dist/{chunk-OC3ABO5L.js → chunk-JSIX5L3C.js} +2 -2
- package/dist/{chunk-G456TOMJ.js → chunk-JVBI4WKP.js} +35 -5
- package/dist/{chunk-G456TOMJ.js.map → chunk-JVBI4WKP.js.map} +1 -1
- package/dist/{chunk-6RIQEBF5.js → chunk-K6NXLBHG.js} +10 -8
- package/dist/{chunk-6RIQEBF5.js.map → chunk-K6NXLBHG.js.map} +1 -1
- package/dist/{chunk-4TULFLTP.js → chunk-KAL22DYO.js} +2 -2
- package/dist/{chunk-JF4Y6CBM.js → chunk-KU2HPCJG.js} +4 -4
- package/dist/{chunk-TL4CD7XY.js → chunk-KWKGX7LC.js} +5 -5
- package/dist/{chunk-RYGZPL4A.js → chunk-KYF4YAZO.js} +3 -3
- package/dist/{chunk-YQL4WYSM.js → chunk-MRRKFMYJ.js} +4 -4
- package/dist/{chunk-S3HKSR6E.js → chunk-OCTNNEXT.js} +8 -8
- package/dist/{chunk-GPWRQY5I.js → chunk-OGR5Q6QO.js} +5 -5
- package/dist/chunk-OM2VVQKB.js +172 -0
- package/dist/chunk-OM2VVQKB.js.map +1 -0
- package/dist/{chunk-AVMNKTWJ.js → chunk-PN43VH6Z.js} +7 -7
- package/dist/{chunk-WJKHJSU2.js → chunk-RAIFOYRM.js} +2 -2
- package/dist/{chunk-TWAUWJET.js → chunk-SGIWJYLJ.js} +2 -2
- package/dist/{chunk-KNBV3J5O.js → chunk-UB6APBIY.js} +2 -2
- package/dist/{chunk-LRGCUZZX.js → chunk-VSETLO4Q.js} +2 -2
- package/dist/{chunk-KPM6FF6T.js → chunk-Y5JA7XEO.js} +404 -378
- package/dist/chunk-Y5JA7XEO.js.map +1 -0
- package/dist/{chunk-QONNR66T.js → chunk-YE2XMU3T.js} +3 -3
- package/dist/{chunk-ZCKKNSKZ.js → chunk-YUCJ7VSJ.js} +8 -8
- package/dist/{chunk-VXWN5FFG.js → chunk-Z77MIV3C.js} +2 -2
- package/dist/{cli-circuit-breaker-MIH22DC4.js → cli-circuit-breaker-EINPV2CX.js} +3 -3
- package/dist/cli.js +41 -40
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-OU47H54C.js → composite-router-CUJAG7O4.js} +2 -2
- package/dist/{consensus-vote-RKTBZKDP.js → consensus-vote-BLCQCWPV.js} +16 -15
- package/dist/{context-retriever-QCZYGSM3.js → context-retriever-MTJR3AQM.js} +8 -8
- package/dist/{dist-KUG63MRZ.js → dist-GR7PQU7T.js} +563 -482
- package/dist/dist-GR7PQU7T.js.map +1 -0
- package/dist/{doctor-deep-CUXNDGFF.js → doctor-deep-X2KP2G4M.js} +3 -3
- package/dist/{expert-bridge-OQDZJ2VV.js → expert-bridge-2W2JMFQW.js} +4 -4
- package/dist/{factory-DYFK43AX.js → factory-7UFJ6LXW.js} +9 -8
- package/dist/{factory-VX6MAME5.js → factory-SC5D5P3C.js} +5 -5
- package/dist/{improvement-review-ICJL6DFU.js → improvement-review-ZMUJQSX3.js} +5 -5
- package/dist/index.d.ts +17 -0
- package/dist/index.js +30 -29
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-5XGLKLVG.js → init-opencode-I5XSFY34.js} +6 -5
- package/dist/{init-opencode-5XGLKLVG.js.map → init-opencode-I5XSFY34.js.map} +1 -1
- package/dist/{issue-triage-CGRLM4XU.js → issue-triage-KOIPTNDH.js} +6 -6
- package/dist/{pr-reviewer-helpers-F65CSRZB.js → pr-reviewer-helpers-CZDMP5UJ.js} +4 -4
- package/dist/{registry-command-CHV3DNPI.js → registry-command-5J6RJZMS.js} +2 -2
- package/dist/{repo-security-plan-EZNBLHIT.js → repo-security-plan-MKSCD567.js} +3 -3
- package/dist/{research-helpers-synthesize-HHREAHNY.js → research-helpers-synthesize-TIT43XF4.js} +4 -4
- package/dist/{routing-memory-QJ74QYTY.js → routing-memory-HAWL7RKO.js} +2 -2
- package/dist/{session-memory-CTE4IJTZ.js → session-memory-RPSM7Y4Q.js} +3 -3
- package/dist/{setup-command-CNLGTJIR.js → setup-command-SORJLYU3.js} +14 -13
- package/dist/{setup-config-KPKOPIKH.js → setup-config-YDA4MY4N.js} +3 -3
- package/dist/{setup-custom-api-T7FR4YI6.js → setup-custom-api-BZSHB2M5.js} +6 -4
- package/dist/{setup-custom-api-T7FR4YI6.js.map → setup-custom-api-BZSHB2M5.js.map} +1 -1
- package/dist/{tool-memory-TJMCWGYC.js → tool-memory-FCEJMKEH.js} +5 -5
- package/dist/{unified-registry-RICD6FKY.js → unified-registry-JWPD2ES2.js} +10 -9
- package/dist/{weather-report-ZMA3OJS7.js → weather-report-VNABZRH7.js} +2 -2
- package/package.json +8 -8
- package/dist/chunk-3XTGA2YK.js.map +0 -1
- package/dist/chunk-KPM6FF6T.js.map +0 -1
- package/dist/dist-KUG63MRZ.js.map +0 -1
- /package/dist/{child-mcp-config-EYDYXTEN.js.map → child-mcp-config-GWB7JLIS.js.map} +0 -0
- /package/dist/{chunk-SBKJMPV4.js.map → chunk-2CB6QMRX.js.map} +0 -0
- /package/dist/{chunk-WP46LCTZ.js.map → chunk-3P7SMHBU.js.map} +0 -0
- /package/dist/{chunk-JJC2FHX5.js.map → chunk-4PTAG65V.js.map} +0 -0
- /package/dist/{chunk-H2HZSKLO.js.map → chunk-5QVJCBM4.js.map} +0 -0
- /package/dist/{chunk-MJXTFQH6.js.map → chunk-6RRAQFSX.js.map} +0 -0
- /package/dist/{chunk-GFXS3OAX.js.map → chunk-ASJTVA7W.js.map} +0 -0
- /package/dist/{chunk-KS4EN2WR.js.map → chunk-DJZGCMNU.js.map} +0 -0
- /package/dist/{chunk-VLSXX6KA.js.map → chunk-E35RUETV.js.map} +0 -0
- /package/dist/{chunk-LV3UNCC6.js.map → chunk-EDWON3X5.js.map} +0 -0
- /package/dist/{chunk-BS43TZVD.js.map → chunk-H5KLPUAL.js.map} +0 -0
- /package/dist/{chunk-DU2YW5DH.js.map → chunk-HUYP2XXH.js.map} +0 -0
- /package/dist/{chunk-VIE5QLTI.js.map → chunk-IVINLVGP.js.map} +0 -0
- /package/dist/{chunk-OC3ABO5L.js.map → chunk-JSIX5L3C.js.map} +0 -0
- /package/dist/{chunk-4TULFLTP.js.map → chunk-KAL22DYO.js.map} +0 -0
- /package/dist/{chunk-JF4Y6CBM.js.map → chunk-KU2HPCJG.js.map} +0 -0
- /package/dist/{chunk-TL4CD7XY.js.map → chunk-KWKGX7LC.js.map} +0 -0
- /package/dist/{chunk-RYGZPL4A.js.map → chunk-KYF4YAZO.js.map} +0 -0
- /package/dist/{chunk-YQL4WYSM.js.map → chunk-MRRKFMYJ.js.map} +0 -0
- /package/dist/{chunk-S3HKSR6E.js.map → chunk-OCTNNEXT.js.map} +0 -0
- /package/dist/{chunk-GPWRQY5I.js.map → chunk-OGR5Q6QO.js.map} +0 -0
- /package/dist/{chunk-AVMNKTWJ.js.map → chunk-PN43VH6Z.js.map} +0 -0
- /package/dist/{chunk-WJKHJSU2.js.map → chunk-RAIFOYRM.js.map} +0 -0
- /package/dist/{chunk-TWAUWJET.js.map → chunk-SGIWJYLJ.js.map} +0 -0
- /package/dist/{chunk-KNBV3J5O.js.map → chunk-UB6APBIY.js.map} +0 -0
- /package/dist/{chunk-LRGCUZZX.js.map → chunk-VSETLO4Q.js.map} +0 -0
- /package/dist/{chunk-QONNR66T.js.map → chunk-YE2XMU3T.js.map} +0 -0
- /package/dist/{chunk-ZCKKNSKZ.js.map → chunk-YUCJ7VSJ.js.map} +0 -0
- /package/dist/{chunk-VXWN5FFG.js.map → chunk-Z77MIV3C.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-MIH22DC4.js.map → cli-circuit-breaker-EINPV2CX.js.map} +0 -0
- /package/dist/{composite-router-OU47H54C.js.map → composite-router-CUJAG7O4.js.map} +0 -0
- /package/dist/{consensus-vote-RKTBZKDP.js.map → consensus-vote-BLCQCWPV.js.map} +0 -0
- /package/dist/{context-retriever-QCZYGSM3.js.map → context-retriever-MTJR3AQM.js.map} +0 -0
- /package/dist/{doctor-deep-CUXNDGFF.js.map → doctor-deep-X2KP2G4M.js.map} +0 -0
- /package/dist/{expert-bridge-OQDZJ2VV.js.map → expert-bridge-2W2JMFQW.js.map} +0 -0
- /package/dist/{factory-DYFK43AX.js.map → factory-7UFJ6LXW.js.map} +0 -0
- /package/dist/{factory-VX6MAME5.js.map → factory-SC5D5P3C.js.map} +0 -0
- /package/dist/{improvement-review-ICJL6DFU.js.map → improvement-review-ZMUJQSX3.js.map} +0 -0
- /package/dist/{issue-triage-CGRLM4XU.js.map → issue-triage-KOIPTNDH.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-F65CSRZB.js.map → pr-reviewer-helpers-CZDMP5UJ.js.map} +0 -0
- /package/dist/{registry-command-CHV3DNPI.js.map → registry-command-5J6RJZMS.js.map} +0 -0
- /package/dist/{repo-security-plan-EZNBLHIT.js.map → repo-security-plan-MKSCD567.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-HHREAHNY.js.map → research-helpers-synthesize-TIT43XF4.js.map} +0 -0
- /package/dist/{routing-memory-QJ74QYTY.js.map → routing-memory-HAWL7RKO.js.map} +0 -0
- /package/dist/{session-memory-CTE4IJTZ.js.map → session-memory-RPSM7Y4Q.js.map} +0 -0
- /package/dist/{setup-command-CNLGTJIR.js.map → setup-command-SORJLYU3.js.map} +0 -0
- /package/dist/{setup-config-KPKOPIKH.js.map → setup-config-YDA4MY4N.js.map} +0 -0
- /package/dist/{tool-memory-TJMCWGYC.js.map → tool-memory-FCEJMKEH.js.map} +0 -0
- /package/dist/{unified-registry-RICD6FKY.js.map → unified-registry-JWPD2ES2.js.map} +0 -0
- /package/dist/{weather-report-ZMA3OJS7.js.map → weather-report-VNABZRH7.js.map} +0 -0
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
CACHE_TIMEOUTS,
|
|
3
3
|
createLogger,
|
|
4
4
|
getTimeProvider
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
6
6
|
|
|
7
7
|
// src/security/trust-types.ts
|
|
8
8
|
import { z } from "zod";
|
|
@@ -560,4 +560,4 @@ export {
|
|
|
560
560
|
resolveReputationGatingMode,
|
|
561
561
|
gateWithReputation
|
|
562
562
|
};
|
|
563
|
-
//# sourceMappingURL=chunk-
|
|
563
|
+
//# sourceMappingURL=chunk-KAL22DYO.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GitHubProvider,
|
|
3
3
|
ScmError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-E35RUETV.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveToken
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HUYP2XXH.js";
|
|
8
8
|
import {
|
|
9
9
|
err,
|
|
10
10
|
ok
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-Y5JA7XEO.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-
|
|
44
|
+
//# sourceMappingURL=chunk-KU2HPCJG.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GitHubProvider,
|
|
3
3
|
ScmError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-E35RUETV.js";
|
|
5
5
|
import {
|
|
6
6
|
ROLE_DEFAULT_TRUST,
|
|
7
7
|
ReputationCache,
|
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
gateWithReputation,
|
|
12
12
|
resolveReputationGatingMode,
|
|
13
13
|
sanitizeInput
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-KAL22DYO.js";
|
|
15
15
|
import {
|
|
16
16
|
emitPolicyEvent
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-VSETLO4Q.js";
|
|
18
18
|
import {
|
|
19
19
|
CLI_SUBPROCESS_TIMEOUTS,
|
|
20
20
|
createLogger,
|
|
21
21
|
err,
|
|
22
22
|
getTimeProvider,
|
|
23
23
|
ok
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
25
25
|
|
|
26
26
|
// src/security/trust-classifier.ts
|
|
27
27
|
function mapAuthorAssociation(association) {
|
|
@@ -1211,4 +1211,4 @@ export {
|
|
|
1211
1211
|
IssueTriage,
|
|
1212
1212
|
createIssueTriage
|
|
1213
1213
|
};
|
|
1214
|
-
//# sourceMappingURL=chunk-
|
|
1214
|
+
//# sourceMappingURL=chunk-KWKGX7LC.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
toolStructuredError,
|
|
8
8
|
toolSuccessStructured,
|
|
9
9
|
wrapToolWithTimeout
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-5QVJCBM4.js";
|
|
11
11
|
import {
|
|
12
12
|
JsonlStore,
|
|
13
13
|
SECURITY_KEYWORDS,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
getPipelineEventBus,
|
|
20
20
|
getTimeProvider,
|
|
21
21
|
isDeclaredNeverDeprecate
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
23
23
|
import {
|
|
24
24
|
getNexusDataDir,
|
|
25
25
|
nexusDataPath
|
|
@@ -2132,4 +2132,4 @@ export {
|
|
|
2132
2132
|
runImprovementReview,
|
|
2133
2133
|
registerImprovementReviewTool
|
|
2134
2134
|
};
|
|
2135
|
-
//# sourceMappingURL=chunk-
|
|
2135
|
+
//# sourceMappingURL=chunk-KYF4YAZO.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createAutoAdapter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-K6NXLBHG.js";
|
|
4
4
|
import {
|
|
5
5
|
mapModelErrorToCategory
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-Z77MIV3C.js";
|
|
7
7
|
import {
|
|
8
8
|
CLI_NAMES,
|
|
9
9
|
CircularBuffer,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
ok,
|
|
25
25
|
recordRateLimitEvent,
|
|
26
26
|
toRateLimitError
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
28
28
|
|
|
29
29
|
// src/agents/collaboration/event-bus-helpers.ts
|
|
30
30
|
import { randomUUID } from "crypto";
|
|
@@ -1041,4 +1041,4 @@ export {
|
|
|
1041
1041
|
getGlobalRegistry,
|
|
1042
1042
|
resetGlobalRegistry
|
|
1043
1043
|
};
|
|
1044
|
-
//# sourceMappingURL=chunk-
|
|
1044
|
+
//# sourceMappingURL=chunk-MRRKFMYJ.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
computeCostDetail
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-H5KLPUAL.js";
|
|
4
4
|
import {
|
|
5
5
|
DEFAULT_CONSENSUS_CONFIG,
|
|
6
6
|
DEFAULT_INCREMENTAL_QUORUM_CONFIG,
|
|
@@ -18,20 +18,20 @@ import {
|
|
|
18
18
|
toolSuccess,
|
|
19
19
|
withProgressHeartbeat,
|
|
20
20
|
wrapToolWithTimeout
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-5QVJCBM4.js";
|
|
22
22
|
import {
|
|
23
23
|
createEvent,
|
|
24
24
|
getGlobalRegistry
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-MRRKFMYJ.js";
|
|
26
26
|
import {
|
|
27
27
|
getToolMemory
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-EDWON3X5.js";
|
|
29
29
|
import {
|
|
30
30
|
authRemediation,
|
|
31
31
|
delay,
|
|
32
32
|
getAvailableClis,
|
|
33
33
|
withTimeout
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-K6NXLBHG.js";
|
|
35
35
|
import {
|
|
36
36
|
AgentError,
|
|
37
37
|
CLI_NAMES,
|
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
resolveClassGuardMs,
|
|
61
61
|
resolveModelIdentitySync,
|
|
62
62
|
resolveVoteTimeout
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
64
64
|
import {
|
|
65
65
|
ensureLearningDir,
|
|
66
66
|
getOutcomesFile
|
|
@@ -5926,7 +5926,7 @@ async function processVotesWithCascade(engineVotes, opts) {
|
|
|
5926
5926
|
var CONTRARIAN_ESCALATION_THRESHOLD = 0.8;
|
|
5927
5927
|
async function runContrarianCheck(proposal, log) {
|
|
5928
5928
|
try {
|
|
5929
|
-
const { executeExpert } = await import("./expert-bridge-
|
|
5929
|
+
const { executeExpert } = await import("./expert-bridge-2W2JMFQW.js");
|
|
5930
5930
|
const prompt = [
|
|
5931
5931
|
"You are a contrarian analyst. Your job is to find reasons this proposal should be REJECTED.",
|
|
5932
5932
|
"Look for: YAGNI (not needed), MISALIGNED (wrong tech/architecture), SECURITY_RISK, SCOPE_CREEP.",
|
|
@@ -6453,4 +6453,4 @@ export {
|
|
|
6453
6453
|
CONSENSUS_VOTE_OUTPUT_SCHEMA,
|
|
6454
6454
|
registerConsensusVoteTool
|
|
6455
6455
|
};
|
|
6456
|
-
//# sourceMappingURL=chunk-
|
|
6456
|
+
//# sourceMappingURL=chunk-OCTNNEXT.js.map
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveToken
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HUYP2XXH.js";
|
|
4
4
|
import {
|
|
5
5
|
REGISTRY_PATH,
|
|
6
6
|
getProjectRoot,
|
|
7
7
|
loadPapersRegistry,
|
|
8
8
|
loadTechniquesRegistry,
|
|
9
9
|
savePapersRegistry
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-DJZGCMNU.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveInsideRoot
|
|
13
13
|
} from "./chunk-NUBSJGQZ.js";
|
|
14
14
|
import {
|
|
15
15
|
getToolMemory
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-EDWON3X5.js";
|
|
17
17
|
import {
|
|
18
18
|
capitalizeWords,
|
|
19
19
|
truncateSentence
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
getTimeProvider,
|
|
39
39
|
ok,
|
|
40
40
|
registerPersistentDistillerFactory
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
42
42
|
import {
|
|
43
43
|
ensureLearningDir,
|
|
44
44
|
getRulesFile
|
|
@@ -4090,4 +4090,4 @@ export {
|
|
|
4090
4090
|
DEFAULT_CONTEXT_BUDGET_TOKENS,
|
|
4091
4091
|
getContextPromptPrefix
|
|
4092
4092
|
};
|
|
4093
|
-
//# sourceMappingURL=chunk-
|
|
4093
|
+
//# sourceMappingURL=chunk-OGR5Q6QO.js.map
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConfigError,
|
|
3
|
+
createLogger,
|
|
4
|
+
err,
|
|
5
|
+
ok
|
|
6
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
7
|
+
|
|
8
|
+
// src/adapters/sdk/types.ts
|
|
9
|
+
var PROVIDER_ENV_KEYS = {
|
|
10
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
11
|
+
openai: "OPENAI_API_KEY",
|
|
12
|
+
google: "GOOGLE_AI_API_KEY",
|
|
13
|
+
"custom-openai": "NEXUS_CUSTOM_API_KEY"
|
|
14
|
+
};
|
|
15
|
+
var CUSTOM_API_BASE_URL_ENV = "NEXUS_CUSTOM_API_BASE_URL";
|
|
16
|
+
var CUSTOM_API_ALLOW_PRIVATE_ENV = "NEXUS_CUSTOM_API_ALLOW_PRIVATE";
|
|
17
|
+
|
|
18
|
+
// src/adapters/sdk/custom-api-validation.ts
|
|
19
|
+
import { isIPv4, isIPv6 } from "net";
|
|
20
|
+
import { lookup as dnsLookup } from "dns/promises";
|
|
21
|
+
var logger = createLogger({ module: "custom-api-validation" });
|
|
22
|
+
function validateCustomApiBaseUrl(raw, opts = {}) {
|
|
23
|
+
if (raw === void 0 || raw.trim() === "") {
|
|
24
|
+
return err(
|
|
25
|
+
new ConfigError(
|
|
26
|
+
"Custom API base URL is required but missing. Set NEXUS_CUSTOM_API_BASE_URL or pass `baseUrl` in config."
|
|
27
|
+
)
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
let url;
|
|
31
|
+
try {
|
|
32
|
+
url = new URL(raw);
|
|
33
|
+
} catch {
|
|
34
|
+
return err(new ConfigError(`Custom API base URL is not a valid URL: ${raw}`));
|
|
35
|
+
}
|
|
36
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
37
|
+
return err(
|
|
38
|
+
new ConfigError(`Custom API base URL must use http or https, got "${url.protocol}" in ${raw}`)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
const allowPrivate = opts.allowPrivate === true || resolveAllowPrivateFromEnv();
|
|
42
|
+
if (!allowPrivate) {
|
|
43
|
+
const rejection = classifyPrivateHost(url.hostname);
|
|
44
|
+
if (rejection !== null) {
|
|
45
|
+
return err(
|
|
46
|
+
new ConfigError(
|
|
47
|
+
`Custom API base URL rejected (SSRF guard, reason="${rejection.reason}"): ${rejection.message}. Set ${CUSTOM_API_ALLOW_PRIVATE_ENV}=1 to bypass if the gateway runs on a trusted internal host.`
|
|
48
|
+
)
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return ok(url);
|
|
53
|
+
}
|
|
54
|
+
function resolveAllowPrivateFromEnv() {
|
|
55
|
+
const v = process.env[CUSTOM_API_ALLOW_PRIVATE_ENV];
|
|
56
|
+
return v === "1" || v === "true";
|
|
57
|
+
}
|
|
58
|
+
function classifyPrivateHost(hostname) {
|
|
59
|
+
const normalized = normalizeHost(hostname);
|
|
60
|
+
const literal = classifyIpAddress(normalized);
|
|
61
|
+
if (literal !== "not_an_ip") {
|
|
62
|
+
return literal;
|
|
63
|
+
}
|
|
64
|
+
if (normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local")) {
|
|
65
|
+
return {
|
|
66
|
+
reason: "loopback",
|
|
67
|
+
message: `hostname "${hostname}" resolves to loopback/mDNS`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function normalizeHost(hostname) {
|
|
73
|
+
const stripped = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
|
|
74
|
+
return stripped.toLowerCase();
|
|
75
|
+
}
|
|
76
|
+
function classifyIpAddress(normalized) {
|
|
77
|
+
if (isIPv4(normalized)) {
|
|
78
|
+
return classifyIPv4(normalized);
|
|
79
|
+
}
|
|
80
|
+
if (isIPv6(normalized)) {
|
|
81
|
+
return classifyIPv6(normalized);
|
|
82
|
+
}
|
|
83
|
+
return "not_an_ip";
|
|
84
|
+
}
|
|
85
|
+
async function assertCustomApiHostResolvesPublic(hostname, opts = {}) {
|
|
86
|
+
const allowPrivate = opts.allowPrivate === true || resolveAllowPrivateFromEnv();
|
|
87
|
+
if (allowPrivate) {
|
|
88
|
+
return ok(void 0);
|
|
89
|
+
}
|
|
90
|
+
const normalized = normalizeHost(hostname);
|
|
91
|
+
if (isIPv4(normalized) || isIPv6(normalized)) {
|
|
92
|
+
return ok(void 0);
|
|
93
|
+
}
|
|
94
|
+
let addresses;
|
|
95
|
+
try {
|
|
96
|
+
addresses = await dnsLookup(hostname, { all: true });
|
|
97
|
+
} catch (error) {
|
|
98
|
+
logger.debug("custom-api SSRF resolve check: DNS lookup failed, skipping (fail-open)", {
|
|
99
|
+
hostname,
|
|
100
|
+
error: error instanceof Error ? error.message : String(error)
|
|
101
|
+
});
|
|
102
|
+
return ok(void 0);
|
|
103
|
+
}
|
|
104
|
+
const rejection = firstPrivateAddress(addresses);
|
|
105
|
+
if (rejection !== null) {
|
|
106
|
+
return err(
|
|
107
|
+
new ConfigError(
|
|
108
|
+
`Custom API base URL rejected (SSRF resolve guard, reason="${rejection.reason}"): hostname "${hostname}" resolved to ${rejection.message}. Set ${CUSTOM_API_ALLOW_PRIVATE_ENV}=1 to bypass if the gateway runs on a trusted internal host.`
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
return ok(void 0);
|
|
113
|
+
}
|
|
114
|
+
function firstPrivateAddress(addresses) {
|
|
115
|
+
for (const { address } of addresses) {
|
|
116
|
+
const rejection = classifyIpAddress(address.toLowerCase());
|
|
117
|
+
if (rejection !== null && rejection !== "not_an_ip") {
|
|
118
|
+
return rejection;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
var IPV4_RULES = [
|
|
124
|
+
{ match: (a) => a === 127, reason: "loopback", label: "IPv4 loopback" },
|
|
125
|
+
{ match: (a) => a === 10, reason: "private_range", label: "IPv4 private (10/8)" },
|
|
126
|
+
{
|
|
127
|
+
match: (a, b) => a === 172 && b >= 16 && b <= 31,
|
|
128
|
+
reason: "private_range",
|
|
129
|
+
label: "IPv4 private (172.16/12)"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
match: (a, b) => a === 192 && b === 168,
|
|
133
|
+
reason: "private_range",
|
|
134
|
+
label: "IPv4 private (192.168/16)"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
match: (a, b) => a === 169 && b === 254,
|
|
138
|
+
reason: "link_local",
|
|
139
|
+
label: "IPv4 link-local (169.254/16 \u2014 AWS IMDS)"
|
|
140
|
+
},
|
|
141
|
+
{ match: (a) => a === 0, reason: "reserved", label: "IPv4 reserved (0/8)" }
|
|
142
|
+
];
|
|
143
|
+
function classifyIPv4(ip) {
|
|
144
|
+
const parts = ip.split(".").map((p) => Number.parseInt(p, 10));
|
|
145
|
+
if (parts.length !== 4 || parts.some((n) => Number.isNaN(n))) return null;
|
|
146
|
+
const [a, b] = parts;
|
|
147
|
+
for (const rule of IPV4_RULES) {
|
|
148
|
+
if (rule.match(a, b)) {
|
|
149
|
+
return { reason: rule.reason, message: `${rule.label} (${ip})` };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
function classifyIPv6(ip) {
|
|
155
|
+
const lower = ip.toLowerCase();
|
|
156
|
+
if (lower === "::1") return { reason: "loopback", message: `IPv6 loopback (${ip})` };
|
|
157
|
+
if (lower.startsWith("fe80:"))
|
|
158
|
+
return { reason: "link_local", message: `IPv6 link-local (${ip})` };
|
|
159
|
+
if (/^fc|^fd/.test(lower)) {
|
|
160
|
+
return { reason: "private_range", message: `IPv6 unique-local (${ip}, fc00::/7)` };
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export {
|
|
166
|
+
PROVIDER_ENV_KEYS,
|
|
167
|
+
CUSTOM_API_BASE_URL_ENV,
|
|
168
|
+
CUSTOM_API_ALLOW_PRIVATE_ENV,
|
|
169
|
+
validateCustomApiBaseUrl,
|
|
170
|
+
assertCustomApiHostResolvesPublic
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=chunk-OM2VVQKB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/sdk/types.ts","../src/adapters/sdk/custom-api-validation.ts"],"sourcesContent":["/**\n * nexus-agents/adapters/sdk - Shared Types\n *\n * Type definitions for AI SDK adapter layer.\n *\n * @module adapters/sdk/types\n * (Source: Issue #1123 — AI SDK provider layer)\n */\n\n/**\n * Supported AI SDK provider identifiers.\n *\n * `custom-openai` is for OpenAI-compatible gateways (multi-vendor proxies,\n * self-hosted LLM servers, corporate model gateways) — uses the same\n * @ai-sdk/openai package but with a configurable `baseURL`.\n */\nexport type SdkProviderId = 'anthropic' | 'openai' | 'google' | 'custom-openai';\n\n/**\n * Configuration for creating an AI SDK adapter.\n */\nexport interface SdkAdapterConfig {\n /** Provider identifier */\n providerId: SdkProviderId;\n /** Model to use (e.g., 'claude-sonnet-4-6', 'gpt-4o') */\n modelId: string;\n /** API key (falls back to environment variable) */\n apiKey?: string;\n /**\n * Base URL for OpenAI-compatible gateways. Required when\n * `providerId === 'custom-openai'`, ignored otherwise. Falls back to\n * the `NEXUS_CUSTOM_API_BASE_URL` environment variable.\n */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Maximum retries on transient failures */\n maxRetries?: number;\n}\n\n/**\n * Maps provider IDs to their environment variable names.\n */\nexport const PROVIDER_ENV_KEYS: Record<SdkProviderId, string> = {\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n google: 'GOOGLE_AI_API_KEY',\n 'custom-openai': 'NEXUS_CUSTOM_API_KEY',\n};\n\n/**\n * Environment variable name for the custom gateway base URL.\n * Keep in sync with `SdkAdapterConfig.baseUrl`.\n */\nexport const CUSTOM_API_BASE_URL_ENV = 'NEXUS_CUSTOM_API_BASE_URL';\n\n/**\n * Escape hatch: set to `1`/`true` to allow the custom gateway base URL to\n * resolve to a loopback or RFC 1918 private address. Default is DENY —\n * SSRF defense. Only disable this when you know the gateway runs on a\n * trusted internal host and you accept the risk.\n */\nexport const CUSTOM_API_ALLOW_PRIVATE_ENV = 'NEXUS_CUSTOM_API_ALLOW_PRIVATE';\n","/**\n * Validation for the `custom-openai` SDK adapter's gateway URL.\n *\n * The base URL is user-provided, so without validation the adapter becomes\n * an SSRF vector: a malicious prompt that reshaped env vars, or a typo in\n * the config, could point nexus-agents at `http://169.254.169.254/` (AWS\n * metadata) or `http://localhost:5432/` (internal services). This module\n * rejects such URLs unless the user explicitly opts in via\n * `NEXUS_CUSTOM_API_ALLOW_PRIVATE=1`.\n *\n * Called out in the #2119 consensus vote by the Security Engineer role.\n *\n * @module adapters/sdk/custom-api-validation\n */\n\nimport { isIPv4, isIPv6 } from 'node:net';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { ConfigError, ok, err, createLogger, type Result } from '../../core/index.js';\nimport { CUSTOM_API_ALLOW_PRIVATE_ENV } from './types.js';\n\nconst logger = createLogger({ module: 'custom-api-validation' });\n\n/**\n * Why a given URL was rejected. Machine-readable so error messages can\n * distinguish root causes in downstream tooling.\n */\nexport type BaseUrlRejectionReason =\n | 'empty'\n | 'not_a_url'\n | 'not_http_https'\n | 'loopback'\n | 'link_local'\n | 'private_range'\n | 'reserved';\n\ninterface RejectionDetail {\n readonly reason: BaseUrlRejectionReason;\n readonly message: string;\n}\n\n/**\n * Validates a user-provided custom-gateway base URL. Returns the URL as an\n * `ok` Result if it passes, or a `ConfigError` with a machine-readable\n * reason if it fails.\n *\n * Pass `{ allowPrivate: true }` (or set the env var) to bypass the SSRF\n * checks — use this only when the gateway is on a trusted internal host\n * and you accept the risk.\n */\nexport function validateCustomApiBaseUrl(\n raw: string | undefined,\n opts: { readonly allowPrivate?: boolean } = {}\n): Result<URL, ConfigError> {\n if (raw === undefined || raw.trim() === '') {\n return err(\n new ConfigError(\n 'Custom API base URL is required but missing. Set NEXUS_CUSTOM_API_BASE_URL or pass `baseUrl` in config.'\n )\n );\n }\n\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n return err(new ConfigError(`Custom API base URL is not a valid URL: ${raw}`));\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return err(\n new ConfigError(`Custom API base URL must use http or https, got \"${url.protocol}\" in ${raw}`)\n );\n }\n\n const allowPrivate = opts.allowPrivate === true || resolveAllowPrivateFromEnv();\n if (!allowPrivate) {\n const rejection = classifyPrivateHost(url.hostname);\n if (rejection !== null) {\n return err(\n new ConfigError(\n `Custom API base URL rejected (SSRF guard, reason=\"${rejection.reason}\"): ${rejection.message}. ` +\n `Set ${CUSTOM_API_ALLOW_PRIVATE_ENV}=1 to bypass if the gateway runs on a trusted internal host.`\n )\n );\n }\n }\n\n return ok(url);\n}\n\nfunction resolveAllowPrivateFromEnv(): boolean {\n // Deliberately strict (case-sensitive, not parseBoolEnv): this disables an\n // SSRF guard, so we don't want extra case variants (e.g. `TRUE`) to loosen\n // the control. Fail-closed on anything but exact `1`/`true` (#3297).\n const v = process.env[CUSTOM_API_ALLOW_PRIVATE_ENV];\n return v === '1' || v === 'true';\n}\n\n/**\n * Returns a rejection reason if the hostname resolves (by string form) to\n * a loopback, link-local, or RFC 1918 private address; `null` otherwise.\n *\n * Note: this is a string-level check. It does NOT perform DNS resolution,\n * so a public DNS name that secretly resolves to a private IP will pass.\n * For that level of defense, callers should additionally run\n * {@link assertCustomApiHostResolvesPublic}, which performs a DNS lookup\n * and classifies each resolved address with the same range tables below.\n */\nfunction classifyPrivateHost(hostname: string): RejectionDetail | null {\n const normalized = normalizeHost(hostname);\n\n // Literal IP addresses — classify directly against the range tables.\n const literal = classifyIpAddress(normalized);\n if (literal !== 'not_an_ip') {\n return literal;\n }\n\n // Hostname literals that resolve to loopback without needing DNS\n if (\n normalized === 'localhost' ||\n normalized.endsWith('.localhost') ||\n normalized.endsWith('.local') // mDNS\n ) {\n return {\n reason: 'loopback',\n message: `hostname \"${hostname}\" resolves to loopback/mDNS`,\n };\n }\n\n return null;\n}\n\n/**\n * Strips IPv6 bracket wrapping (URL.hostname yields \"[::1]\") and lowercases,\n * giving the bare form the `node:net` checks expect. Shared by the sync and\n * async guards so the normalization rule lives in one place.\n */\nfunction normalizeHost(hostname: string): string {\n const stripped =\n hostname.startsWith('[') && hostname.endsWith(']') ? hostname.slice(1, -1) : hostname;\n return stripped.toLowerCase();\n}\n\n/**\n * Classifies a single (already normalized, bracket-stripped) address string.\n * Returns:\n * - a {@link RejectionDetail} if it is a private/loopback/link-local/reserved IP,\n * - `null` if it is a public IP literal (safe),\n * - the sentinel `'not_an_ip'` if the string is not an IP literal at all.\n *\n * This is the shared per-address classifier reused by both the sync\n * string-level guard ({@link classifyPrivateHost}) and the async\n * DNS-resolve-time guard ({@link assertCustomApiHostResolvesPublic}), so the\n * IPv4/IPv6 range tables live in exactly one place.\n */\nfunction classifyIpAddress(normalized: string): RejectionDetail | null | 'not_an_ip' {\n if (isIPv4(normalized)) {\n return classifyIPv4(normalized);\n }\n if (isIPv6(normalized)) {\n return classifyIPv6(normalized);\n }\n return 'not_an_ip';\n}\n\n/**\n * DNS-resolve-time SSRF guard for the custom-openai gateway.\n *\n * The sync {@link validateCustomApiBaseUrl} only inspects the hostname as a\n * string, so a PUBLIC DNS name that resolves to a PRIVATE/loopback/link-local\n * IP (e.g. an attacker-controlled `gateway.evil.test` pointing at\n * `169.254.169.254`) slips past it. This function closes that gap: it resolves\n * the hostname and runs the EXISTING IP classification against every returned\n * address, failing closed if ANY of them is private.\n *\n * Behaviour:\n * - `allowPrivate` (opt or env) → bypass, returns `ok` (matches the sync guard).\n * - hostname is already an IP literal → no DNS needed; the sync guard already\n * classified literals at construction, so return `ok`.\n * - otherwise `dns.lookup(hostname, { all: true })` and classify each address.\n * If ANY resolves private → `err(ConfigError)`.\n * - on a `dns.lookup` THROW (transient/NXDOMAIN/network error) → log debug and\n * return `ok`. Failing closed here is too aggressive: it would break legit\n * gateways on a flaky resolver, and this is additive defense-in-depth layered\n * on top of the sync string guard that already ran at construction. We only\n * REJECT on a SUCCESSFUL resolution to a private address.\n *\n * Residual risk (TOCTOU): this is RESOLVE-time, not socket-connect-time. A name\n * that passes here could rebind to a private IP before the actual connect\n * (DNS rebinding). A full fix needs a custom `fetch` `lookup` hook validating\n * the peer address at the socket layer — out of scope for this LOW\n * defense-in-depth pass (#3426).\n */\nexport async function assertCustomApiHostResolvesPublic(\n hostname: string,\n opts: { readonly allowPrivate?: boolean } = {}\n): Promise<Result<void, ConfigError>> {\n const allowPrivate = opts.allowPrivate === true || resolveAllowPrivateFromEnv();\n if (allowPrivate) {\n return ok(undefined);\n }\n\n const normalized = normalizeHost(hostname);\n\n // IP literals are already handled by the sync guard at construction; no DNS.\n if (isIPv4(normalized) || isIPv6(normalized)) {\n return ok(undefined);\n }\n\n // Only `address` is read; the resolver's `family` is intentionally NOT\n // trusted — `classifyIpAddress` re-derives v4/v6 from the address string, so\n // a mislabeled family in the lookup result cannot let a private IP slip past.\n let addresses: ReadonlyArray<{ readonly address: string }>;\n try {\n addresses = await dnsLookup(hostname, { all: true });\n } catch (error) {\n // Fail OPEN: transient/NXDOMAIN/network errors must not break legit\n // gateways. The sync string guard already ran; this is additive only.\n logger.debug('custom-api SSRF resolve check: DNS lookup failed, skipping (fail-open)', {\n hostname,\n error: error instanceof Error ? error.message : String(error),\n });\n return ok(undefined);\n }\n\n const rejection = firstPrivateAddress(addresses);\n if (rejection !== null) {\n return err(\n new ConfigError(\n `Custom API base URL rejected (SSRF resolve guard, reason=\"${rejection.reason}\"): ` +\n `hostname \"${hostname}\" resolved to ${rejection.message}. ` +\n `Set ${CUSTOM_API_ALLOW_PRIVATE_ENV}=1 to bypass if the gateway runs on a trusted internal host.`\n )\n );\n }\n\n return ok(undefined);\n}\n\n/**\n * Returns the {@link RejectionDetail} for the first resolved address that\n * classifies as private/loopback/link-local/reserved, or `null` if every\n * address is public. Fail-closed: any single private hit trips the guard.\n */\nfunction firstPrivateAddress(\n addresses: ReadonlyArray<{ readonly address: string }>\n): RejectionDetail | null {\n for (const { address } of addresses) {\n const rejection = classifyIpAddress(address.toLowerCase());\n if (rejection !== null && rejection !== 'not_an_ip') {\n return rejection;\n }\n }\n return null;\n}\n\n/** IPv4 ranges the SSRF guard rejects, in order of specificity. */\nconst IPV4_RULES: ReadonlyArray<{\n readonly match: (a: number, b: number) => boolean;\n readonly reason: BaseUrlRejectionReason;\n readonly label: string;\n}> = [\n { match: (a) => a === 127, reason: 'loopback', label: 'IPv4 loopback' },\n { match: (a) => a === 10, reason: 'private_range', label: 'IPv4 private (10/8)' },\n {\n match: (a, b) => a === 172 && b >= 16 && b <= 31,\n reason: 'private_range',\n label: 'IPv4 private (172.16/12)',\n },\n {\n match: (a, b) => a === 192 && b === 168,\n reason: 'private_range',\n label: 'IPv4 private (192.168/16)',\n },\n {\n match: (a, b) => a === 169 && b === 254,\n reason: 'link_local',\n label: 'IPv4 link-local (169.254/16 — AWS IMDS)',\n },\n { match: (a) => a === 0, reason: 'reserved', label: 'IPv4 reserved (0/8)' },\n];\n\nfunction classifyIPv4(ip: string): RejectionDetail | null {\n const parts = ip.split('.').map((p) => Number.parseInt(p, 10));\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n))) return null;\n const [a, b] = parts as [number, number, number, number];\n for (const rule of IPV4_RULES) {\n if (rule.match(a, b)) {\n return { reason: rule.reason, message: `${rule.label} (${ip})` };\n }\n }\n return null;\n}\n\nfunction classifyIPv6(ip: string): RejectionDetail | null {\n const lower = ip.toLowerCase();\n if (lower === '::1') return { reason: 'loopback', message: `IPv6 loopback (${ip})` };\n if (lower.startsWith('fe80:'))\n return { reason: 'link_local', message: `IPv6 link-local (${ip})` };\n // Unique-local: fc00::/7 → first byte has high bit set and second-high bit set\n if (/^fc|^fd/.test(lower)) {\n return { reason: 'private_range', message: `IPv6 unique-local (${ip}, fc00::/7)` };\n }\n return null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveCliSlot
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RAIFOYRM.js";
|
|
4
4
|
import {
|
|
5
5
|
createLogger,
|
|
6
6
|
getTimeProvider,
|
|
7
7
|
isRateLimitText
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
9
9
|
|
|
10
10
|
// src/pipeline/expert-bridge.ts
|
|
11
11
|
function resolveCliFromModelString(model) {
|
|
@@ -21,7 +21,7 @@ async function getMcpConfigPath() {
|
|
|
21
21
|
if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;
|
|
22
22
|
mcpConfigInitPromise ??= (async () => {
|
|
23
23
|
try {
|
|
24
|
-
const { generateMcpConfig } = await import("./child-mcp-config-
|
|
24
|
+
const { generateMcpConfig } = await import("./child-mcp-config-GWB7JLIS.js");
|
|
25
25
|
const config = await generateMcpConfig();
|
|
26
26
|
cachedMcpConfigPath = config.configPath;
|
|
27
27
|
cachedMcpConfigCleanup = config.cleanup;
|
|
@@ -93,8 +93,8 @@ var routerInitPromise = null;
|
|
|
93
93
|
async function getRouter() {
|
|
94
94
|
if (cachedRouter !== null) return cachedRouter;
|
|
95
95
|
routerInitPromise ??= (async () => {
|
|
96
|
-
const { createAllAdapters } = await import("./factory-
|
|
97
|
-
const { createCompositeRouter } = await import("./composite-router-
|
|
96
|
+
const { createAllAdapters } = await import("./factory-7UFJ6LXW.js");
|
|
97
|
+
const { createCompositeRouter } = await import("./composite-router-CUJAG7O4.js");
|
|
98
98
|
const adapters = createAllAdapters();
|
|
99
99
|
if (adapters.size === 0) {
|
|
100
100
|
routerInitPromise = null;
|
|
@@ -102,7 +102,7 @@ async function getRouter() {
|
|
|
102
102
|
}
|
|
103
103
|
cachedRouter = adaptCompositeRouter(createCompositeRouter(adapters));
|
|
104
104
|
try {
|
|
105
|
-
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-
|
|
105
|
+
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-EINPV2CX.js");
|
|
106
106
|
cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
|
|
107
107
|
} catch (error) {
|
|
108
108
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -213,4 +213,4 @@ export {
|
|
|
213
213
|
tokenSplitFromUsage,
|
|
214
214
|
executeExpert
|
|
215
215
|
};
|
|
216
|
-
//# sourceMappingURL=chunk-
|
|
216
|
+
//# sourceMappingURL=chunk-PN43VH6Z.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
MODEL_IDS,
|
|
4
4
|
getTimeProvider,
|
|
5
5
|
resolveModelIdentitySync
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
7
7
|
|
|
8
8
|
// src/config/model-availability.ts
|
|
9
9
|
var DEFAULT_TTL_MS = 6e4;
|
|
@@ -150,4 +150,4 @@ export {
|
|
|
150
150
|
resetAvailabilityCache,
|
|
151
151
|
filterAvailableModels
|
|
152
152
|
};
|
|
153
|
-
//# sourceMappingURL=chunk-
|
|
153
|
+
//# sourceMappingURL=chunk-RAIFOYRM.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getRandomProvider,
|
|
3
3
|
getTimeProvider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
5
5
|
|
|
6
6
|
// src/utils/id-utils.ts
|
|
7
7
|
import { randomUUID } from "crypto";
|
|
@@ -24,4 +24,4 @@ export {
|
|
|
24
24
|
generateHyphenId,
|
|
25
25
|
generateUUID
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-SGIWJYLJ.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
createLogger,
|
|
6
6
|
getTimeProvider
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
8
8
|
|
|
9
9
|
// src/mcp/tools/scanner-registry-fetcher.ts
|
|
10
10
|
import { z } from "zod";
|
|
@@ -721,4 +721,4 @@ export {
|
|
|
721
721
|
generateSecurityPlan,
|
|
722
722
|
buildPlanFromAnalysis
|
|
723
723
|
};
|
|
724
|
-
//# sourceMappingURL=chunk-
|
|
724
|
+
//# sourceMappingURL=chunk-UB6APBIY.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getTimeProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Y5JA7XEO.js";
|
|
4
4
|
|
|
5
5
|
// src/security/audit-trail.ts
|
|
6
6
|
var MAX_EVENTS = 1e4;
|
|
@@ -205,4 +205,4 @@ export {
|
|
|
205
205
|
createGraphAuditBridge,
|
|
206
206
|
createAuditTrail
|
|
207
207
|
};
|
|
208
|
-
//# sourceMappingURL=chunk-
|
|
208
|
+
//# sourceMappingURL=chunk-VSETLO4Q.js.map
|