nexus-agents 8.101.0 → 8.102.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ast-rule-runner-JVKSVDZN.js → ast-rule-runner-WWUOS722.js} +3 -3
- package/dist/{child-mcp-config-GGKIZUCK.js → child-mcp-config-U3I7K7BT.js} +2 -2
- package/dist/{chunk-B7WPNSR7.js → chunk-2I2I3DRA.js} +5 -5
- package/dist/{chunk-NQYVJNE3.js → chunk-3LKDZORV.js} +13 -13
- package/dist/{chunk-GWG6GMTY.js → chunk-5ML3THNH.js} +7 -7
- package/dist/{chunk-HWROQN3Y.js → chunk-6NYFFN42.js} +4 -4
- package/dist/{chunk-5QXPIYZC.js → chunk-7YPSWDOV.js} +2 -2
- package/dist/{chunk-VDPPDXLU.js → chunk-AWUTGAQN.js} +79 -18
- package/dist/chunk-AWUTGAQN.js.map +1 -0
- package/dist/{chunk-ZHTH6YFI.js → chunk-BY5SXMN5.js} +2 -2
- package/dist/{chunk-3QGKGM37.js → chunk-BYRIEU5S.js} +2 -2
- package/dist/{chunk-5K4JAZ67.js → chunk-C4T7UI2R.js} +49 -48
- package/dist/chunk-C4T7UI2R.js.map +1 -0
- package/dist/{chunk-S22C5R73.js → chunk-CDCEDAEO.js} +2 -2
- package/dist/{chunk-7PLT45J4.js → chunk-D5EDP3EQ.js} +2 -2
- package/dist/{chunk-K43DHPA2.js → chunk-GVSSUYBR.js} +5 -5
- package/dist/{chunk-ELGOF7OT.js → chunk-HUMPSYCP.js} +12 -10
- package/dist/{chunk-ELGOF7OT.js.map → chunk-HUMPSYCP.js.map} +1 -1
- package/dist/{chunk-Y6ITE3QZ.js → chunk-HVJIQLBC.js} +2 -2
- package/dist/{chunk-L6B46NGH.js → chunk-I4YI4J3V.js} +46 -39
- package/dist/chunk-I4YI4J3V.js.map +1 -0
- package/dist/{chunk-FFF4ORRN.js → chunk-JQAXGIDL.js} +2 -2
- package/dist/{chunk-5RFWS5YF.js → chunk-KMY3NA44.js} +2 -2
- package/dist/{chunk-Z5MWQXCV.js → chunk-LKMB7ZPK.js} +3 -3
- package/dist/{chunk-BOUGW7LJ.js → chunk-MYLHKD32.js} +2 -2
- package/dist/{chunk-LX6H36NI.js → chunk-N6TZK7LR.js} +3 -3
- package/dist/{chunk-TFB36ENN.js → chunk-NACTU45C.js} +2 -2
- package/dist/{chunk-SILMNFJ7.js → chunk-NCQGSHEH.js} +2 -2
- package/dist/{chunk-SGTR2V2K.js → chunk-OCXGPXG2.js} +2 -2
- package/dist/{chunk-GRQP3WBR.js → chunk-ODLIA33L.js} +2 -2
- package/dist/{chunk-TFDCAESD.js → chunk-PAICM2DX.js} +4 -4
- package/dist/{chunk-WSE5Q3W5.js → chunk-QHMUW6G7.js} +4 -4
- package/dist/{chunk-NVB4G33J.js → chunk-RGW4TLFO.js} +3 -3
- package/dist/{chunk-ZPMZ7QSF.js → chunk-UA3TQ773.js} +2 -2
- package/dist/{chunk-T57UKYPU.js → chunk-V3YMUA74.js} +4 -4
- package/dist/{chunk-WUCGL63P.js → chunk-XJTA5BHT.js} +3 -3
- package/dist/{chunk-DFF4PQWN.js → chunk-XROOAW6C.js} +2 -2
- package/dist/{chunk-ISEB4I5X.js → chunk-YKC7ICXJ.js} +12 -2
- package/dist/chunk-YKC7ICXJ.js.map +1 -0
- package/dist/{chunk-OLPKHKVI.js → chunk-ZR5JWLC5.js} +56 -9
- package/dist/chunk-ZR5JWLC5.js.map +1 -0
- package/dist/{chunk-LSS5ZIBM.js → chunk-ZYMOKZ5S.js} +2 -2
- package/dist/{cli-circuit-breaker-Z3VTFZRB.js → cli-circuit-breaker-V2BTK5ZW.js} +3 -3
- package/dist/cli.js +48 -44
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-LB53V3BZ.js → composite-router-RX3JZYIE.js} +2 -2
- package/dist/{consensus-vote-UEJ67Q4W.js → consensus-vote-L6D5Q5II.js} +16 -16
- package/dist/{context-retriever-U77CIMRQ.js → context-retriever-IK253TWS.js} +8 -8
- package/dist/{doctor-deep-52LKRRQK.js → doctor-deep-5K4BPYSH.js} +3 -3
- package/dist/{doctor-gateway-report-5YKA34JJ.js → doctor-gateway-report-6L7K7KQR.js} +3 -3
- package/dist/{doctor-live-NPG7BY5U.js → doctor-live-QW4XTIZW.js} +10 -10
- package/dist/{expert-bridge-2D6GGZVS.js → expert-bridge-IWTCC652.js} +4 -4
- package/dist/{factory-WFUWVRJZ.js → factory-IQRYHF2K.js} +5 -5
- package/dist/{factory-IK53LZGG.js → factory-ZPHF32DK.js} +9 -9
- package/dist/{improvement-review-ENOO2JUX.js → improvement-review-ABVCXCST.js} +5 -5
- package/dist/index.d.ts +15 -1
- package/dist/index.js +31 -31
- package/dist/{init-opencode-6R5WWVCC.js → init-opencode-6VPDLKMF.js} +5 -5
- package/dist/issue-triage-TD4LKVPI.js +16 -0
- package/dist/{openai-compat-adapter-MDDZE4MG.js → openai-compat-adapter-5WAMUIQA.js} +5 -5
- package/dist/{pr-reviewer-helpers-EE3Q7LO6.js → pr-reviewer-helpers-SNUDE5TO.js} +4 -4
- package/dist/{registry-command-EXY4BQGT.js → registry-command-APTVRLDC.js} +2 -2
- package/dist/{repo-security-plan-XPF3VILB.js → repo-security-plan-4JQGVAZZ.js} +3 -3
- package/dist/{research-helpers-synthesize-CV2AZACL.js → research-helpers-synthesize-65NCBD5R.js} +4 -4
- package/dist/{routing-memory-RI4VQ23N.js → routing-memory-FH63BFPW.js} +2 -2
- package/dist/{session-memory-CCMV3KIM.js → session-memory-VGDP7YE3.js} +3 -3
- package/dist/{setup-config-226V7DOY.js → setup-config-EZ5SSK6U.js} +3 -3
- package/dist/{setup-custom-api-EZHU4O4E.js → setup-custom-api-3HDBQLOX.js} +4 -4
- package/dist/setup-data-dir-4PF7KCEJ.js +33 -0
- package/dist/{tool-memory-C7EQORJZ.js → tool-memory-P3ANNLKT.js} +5 -5
- package/dist/{unified-registry-CX35FNJ5.js → unified-registry-UBGBRRBV.js} +10 -10
- package/dist/{weather-report-A47QZHNK.js → weather-report-PBMB3PYV.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-5K4JAZ67.js.map +0 -1
- package/dist/chunk-ISEB4I5X.js.map +0 -1
- package/dist/chunk-L6B46NGH.js.map +0 -1
- package/dist/chunk-OLPKHKVI.js.map +0 -1
- package/dist/chunk-VDPPDXLU.js.map +0 -1
- package/dist/issue-triage-O7M4OZ4D.js +0 -16
- package/dist/setup-data-dir-NA7CWUKX.js +0 -33
- /package/dist/{ast-rule-runner-JVKSVDZN.js.map → ast-rule-runner-WWUOS722.js.map} +0 -0
- /package/dist/{child-mcp-config-GGKIZUCK.js.map → child-mcp-config-U3I7K7BT.js.map} +0 -0
- /package/dist/{chunk-B7WPNSR7.js.map → chunk-2I2I3DRA.js.map} +0 -0
- /package/dist/{chunk-NQYVJNE3.js.map → chunk-3LKDZORV.js.map} +0 -0
- /package/dist/{chunk-GWG6GMTY.js.map → chunk-5ML3THNH.js.map} +0 -0
- /package/dist/{chunk-HWROQN3Y.js.map → chunk-6NYFFN42.js.map} +0 -0
- /package/dist/{chunk-5QXPIYZC.js.map → chunk-7YPSWDOV.js.map} +0 -0
- /package/dist/{chunk-ZHTH6YFI.js.map → chunk-BY5SXMN5.js.map} +0 -0
- /package/dist/{chunk-3QGKGM37.js.map → chunk-BYRIEU5S.js.map} +0 -0
- /package/dist/{chunk-S22C5R73.js.map → chunk-CDCEDAEO.js.map} +0 -0
- /package/dist/{chunk-7PLT45J4.js.map → chunk-D5EDP3EQ.js.map} +0 -0
- /package/dist/{chunk-K43DHPA2.js.map → chunk-GVSSUYBR.js.map} +0 -0
- /package/dist/{chunk-Y6ITE3QZ.js.map → chunk-HVJIQLBC.js.map} +0 -0
- /package/dist/{chunk-FFF4ORRN.js.map → chunk-JQAXGIDL.js.map} +0 -0
- /package/dist/{chunk-5RFWS5YF.js.map → chunk-KMY3NA44.js.map} +0 -0
- /package/dist/{chunk-Z5MWQXCV.js.map → chunk-LKMB7ZPK.js.map} +0 -0
- /package/dist/{chunk-BOUGW7LJ.js.map → chunk-MYLHKD32.js.map} +0 -0
- /package/dist/{chunk-LX6H36NI.js.map → chunk-N6TZK7LR.js.map} +0 -0
- /package/dist/{chunk-TFB36ENN.js.map → chunk-NACTU45C.js.map} +0 -0
- /package/dist/{chunk-SILMNFJ7.js.map → chunk-NCQGSHEH.js.map} +0 -0
- /package/dist/{chunk-SGTR2V2K.js.map → chunk-OCXGPXG2.js.map} +0 -0
- /package/dist/{chunk-GRQP3WBR.js.map → chunk-ODLIA33L.js.map} +0 -0
- /package/dist/{chunk-TFDCAESD.js.map → chunk-PAICM2DX.js.map} +0 -0
- /package/dist/{chunk-WSE5Q3W5.js.map → chunk-QHMUW6G7.js.map} +0 -0
- /package/dist/{chunk-NVB4G33J.js.map → chunk-RGW4TLFO.js.map} +0 -0
- /package/dist/{chunk-ZPMZ7QSF.js.map → chunk-UA3TQ773.js.map} +0 -0
- /package/dist/{chunk-T57UKYPU.js.map → chunk-V3YMUA74.js.map} +0 -0
- /package/dist/{chunk-WUCGL63P.js.map → chunk-XJTA5BHT.js.map} +0 -0
- /package/dist/{chunk-DFF4PQWN.js.map → chunk-XROOAW6C.js.map} +0 -0
- /package/dist/{chunk-LSS5ZIBM.js.map → chunk-ZYMOKZ5S.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-Z3VTFZRB.js.map → cli-circuit-breaker-V2BTK5ZW.js.map} +0 -0
- /package/dist/{composite-router-LB53V3BZ.js.map → composite-router-RX3JZYIE.js.map} +0 -0
- /package/dist/{consensus-vote-UEJ67Q4W.js.map → consensus-vote-L6D5Q5II.js.map} +0 -0
- /package/dist/{context-retriever-U77CIMRQ.js.map → context-retriever-IK253TWS.js.map} +0 -0
- /package/dist/{doctor-deep-52LKRRQK.js.map → doctor-deep-5K4BPYSH.js.map} +0 -0
- /package/dist/{doctor-gateway-report-5YKA34JJ.js.map → doctor-gateway-report-6L7K7KQR.js.map} +0 -0
- /package/dist/{doctor-live-NPG7BY5U.js.map → doctor-live-QW4XTIZW.js.map} +0 -0
- /package/dist/{expert-bridge-2D6GGZVS.js.map → expert-bridge-IWTCC652.js.map} +0 -0
- /package/dist/{factory-IK53LZGG.js.map → factory-IQRYHF2K.js.map} +0 -0
- /package/dist/{factory-WFUWVRJZ.js.map → factory-ZPHF32DK.js.map} +0 -0
- /package/dist/{improvement-review-ENOO2JUX.js.map → improvement-review-ABVCXCST.js.map} +0 -0
- /package/dist/{init-opencode-6R5WWVCC.js.map → init-opencode-6VPDLKMF.js.map} +0 -0
- /package/dist/{issue-triage-O7M4OZ4D.js.map → issue-triage-TD4LKVPI.js.map} +0 -0
- /package/dist/{openai-compat-adapter-MDDZE4MG.js.map → openai-compat-adapter-5WAMUIQA.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-EE3Q7LO6.js.map → pr-reviewer-helpers-SNUDE5TO.js.map} +0 -0
- /package/dist/{registry-command-EXY4BQGT.js.map → registry-command-APTVRLDC.js.map} +0 -0
- /package/dist/{repo-security-plan-XPF3VILB.js.map → repo-security-plan-4JQGVAZZ.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-CV2AZACL.js.map → research-helpers-synthesize-65NCBD5R.js.map} +0 -0
- /package/dist/{routing-memory-RI4VQ23N.js.map → routing-memory-FH63BFPW.js.map} +0 -0
- /package/dist/{session-memory-CCMV3KIM.js.map → session-memory-VGDP7YE3.js.map} +0 -0
- /package/dist/{setup-config-226V7DOY.js.map → setup-config-EZ5SSK6U.js.map} +0 -0
- /package/dist/{setup-custom-api-EZHU4O4E.js.map → setup-custom-api-3HDBQLOX.js.map} +0 -0
- /package/dist/{setup-data-dir-NA7CWUKX.js.map → setup-data-dir-4PF7KCEJ.js.map} +0 -0
- /package/dist/{tool-memory-C7EQORJZ.js.map → tool-memory-P3ANNLKT.js.map} +0 -0
- /package/dist/{unified-registry-CX35FNJ5.js.map → unified-registry-UBGBRRBV.js.map} +0 -0
- /package/dist/{weather-report-A47QZHNK.js.map → weather-report-PBMB3PYV.js.map} +0 -0
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
getBuiltInAstRulesPath,
|
|
10
10
|
loadRules,
|
|
11
11
|
runAstQaRules
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-XROOAW6C.js";
|
|
13
|
+
import "./chunk-ZR5JWLC5.js";
|
|
14
14
|
import "./chunk-UE7A2XHM.js";
|
|
15
15
|
import "./chunk-LWOX65CP.js";
|
|
16
16
|
import "./chunk-PX6F3LHL.js";
|
|
@@ -26,4 +26,4 @@ export {
|
|
|
26
26
|
loadRules,
|
|
27
27
|
runAstQaRules
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=ast-rule-runner-
|
|
29
|
+
//# sourceMappingURL=ast-rule-runner-WWUOS722.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-ZR5JWLC5.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-U3I7K7BT.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-W654ME6B.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveToken
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-KMY3NA44.js";
|
|
7
7
|
import {
|
|
8
8
|
REGISTRY_PATH,
|
|
9
9
|
getProjectRoot,
|
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
loadTechniquesRegistry,
|
|
12
12
|
resolveInsideRoot,
|
|
13
13
|
savePapersRegistry
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-NACTU45C.js";
|
|
15
15
|
import {
|
|
16
16
|
getToolMemory
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-PAICM2DX.js";
|
|
18
18
|
import {
|
|
19
19
|
capitalizeWords,
|
|
20
20
|
tokenizeFiltered,
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
ok,
|
|
44
44
|
registerPersistentDistillerFactory,
|
|
45
45
|
sigmoidConfidence
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
47
47
|
import {
|
|
48
48
|
ensureLearningDir,
|
|
49
49
|
getRulesFile
|
|
@@ -4275,4 +4275,4 @@ export {
|
|
|
4275
4275
|
DEFAULT_CONTEXT_BUDGET_TOKENS,
|
|
4276
4276
|
getContextPromptPrefix
|
|
4277
4277
|
};
|
|
4278
|
-
//# sourceMappingURL=chunk-
|
|
4278
|
+
//# sourceMappingURL=chunk-2I2I3DRA.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SERVES_PROBE_PROMPT
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BYRIEU5S.js";
|
|
4
4
|
import {
|
|
5
5
|
printVoterTransportCheck
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ZYMOKZ5S.js";
|
|
7
7
|
import {
|
|
8
8
|
NODE_ENGINE_RANGE,
|
|
9
9
|
VERSION,
|
|
10
10
|
isNodeVersionSupported
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-JQAXGIDL.js";
|
|
12
12
|
import {
|
|
13
13
|
allOf
|
|
14
14
|
} from "./chunk-EZNIYU5T.js";
|
|
@@ -18,10 +18,10 @@ import {
|
|
|
18
18
|
discoverGatewayCatalog,
|
|
19
19
|
readOpenAICompatEndpoint,
|
|
20
20
|
readOpenAICompatEnv
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-QHMUW6G7.js";
|
|
22
22
|
import {
|
|
23
23
|
claimGlobalRegistry
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-6NYFFN42.js";
|
|
25
25
|
import {
|
|
26
26
|
capitalize
|
|
27
27
|
} from "./chunk-7LP6VJRP.js";
|
|
@@ -33,13 +33,13 @@ import {
|
|
|
33
33
|
createAllAdapters,
|
|
34
34
|
isCliDisabled,
|
|
35
35
|
probeCli
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-C4T7UI2R.js";
|
|
37
37
|
import {
|
|
38
38
|
gatewayProxyUrl
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-D5EDP3EQ.js";
|
|
40
40
|
import {
|
|
41
41
|
resolveGatewayEnv
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-YKC7ICXJ.js";
|
|
43
43
|
import {
|
|
44
44
|
getNexusTmpDir
|
|
45
45
|
} from "./chunk-OITVVSWO.js";
|
|
@@ -65,7 +65,7 @@ import {
|
|
|
65
65
|
resolveGatewayCostDeclaration,
|
|
66
66
|
symbols,
|
|
67
67
|
writeLine
|
|
68
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
69
69
|
import {
|
|
70
70
|
getLearningDir,
|
|
71
71
|
getOutcomesFile,
|
|
@@ -1487,7 +1487,7 @@ async function doctorCommand(options = {}) {
|
|
|
1487
1487
|
const result = await runDoctor({ gatewayProbe: options.probe === true });
|
|
1488
1488
|
printDoctorResults(result);
|
|
1489
1489
|
if (options.gateway === true || options.probe === true) {
|
|
1490
|
-
const { formatGatewayReport } = await import("./doctor-gateway-report-
|
|
1490
|
+
const { formatGatewayReport } = await import("./doctor-gateway-report-6L7K7KQR.js");
|
|
1491
1491
|
for (const line of formatGatewayReport(result.gateway)) process.stdout.write(line + "\n");
|
|
1492
1492
|
}
|
|
1493
1493
|
if (options.fix === true) {
|
|
@@ -1504,13 +1504,13 @@ async function runDoctorFix(result) {
|
|
|
1504
1504
|
writeLine2("\u2500".repeat(40));
|
|
1505
1505
|
let fixCount = 0;
|
|
1506
1506
|
if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
|
|
1507
|
-
const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-
|
|
1507
|
+
const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-4PF7KCEJ.js");
|
|
1508
1508
|
const outcome = describeDataDirFix2(initDataDirectories2());
|
|
1509
1509
|
writeLine2(outcome.line);
|
|
1510
1510
|
if (outcome.counted) fixCount++;
|
|
1511
1511
|
}
|
|
1512
1512
|
if (!result.configFile.found) {
|
|
1513
|
-
const { runConfigInitSync } = await import("./setup-config-
|
|
1513
|
+
const { runConfigInitSync } = await import("./setup-config-EZ5SSK6U.js");
|
|
1514
1514
|
const configResult = runConfigInitSync(process.cwd(), false, false);
|
|
1515
1515
|
if (configResult.success && configResult.created) {
|
|
1516
1516
|
writeLine2(`\u2713 Generated config: ${configResult.path}`);
|
|
@@ -1606,4 +1606,4 @@ export {
|
|
|
1606
1606
|
startStdioServer,
|
|
1607
1607
|
closeServer
|
|
1608
1608
|
};
|
|
1609
|
-
//# sourceMappingURL=chunk-
|
|
1609
|
+
//# sourceMappingURL=chunk-3LKDZORV.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveCliSlot
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UA3TQ773.js";
|
|
4
4
|
import {
|
|
5
5
|
createLogger,
|
|
6
6
|
getTimeProvider,
|
|
7
7
|
isRateLimitText
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
9
9
|
|
|
10
10
|
// src/pipeline/expert-bridge.ts
|
|
11
11
|
function resolveCliFromModelString(model) {
|
|
@@ -30,7 +30,7 @@ async function getMcpConfigPath() {
|
|
|
30
30
|
if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;
|
|
31
31
|
mcpConfigInitPromise ??= (async () => {
|
|
32
32
|
try {
|
|
33
|
-
const { generateMcpConfig } = await import("./child-mcp-config-
|
|
33
|
+
const { generateMcpConfig } = await import("./child-mcp-config-U3I7K7BT.js");
|
|
34
34
|
const config = await generateMcpConfig();
|
|
35
35
|
cachedMcpConfigPath = config.configPath;
|
|
36
36
|
cachedMcpConfigCleanup = config.cleanup;
|
|
@@ -110,8 +110,8 @@ var routerInitPromise = null;
|
|
|
110
110
|
async function getRouter() {
|
|
111
111
|
if (cachedRouter !== null) return cachedRouter;
|
|
112
112
|
routerInitPromise ??= (async () => {
|
|
113
|
-
const { createAllAdapters } = await import("./factory-
|
|
114
|
-
const { createCompositeRouter } = await import("./composite-router-
|
|
113
|
+
const { createAllAdapters } = await import("./factory-ZPHF32DK.js");
|
|
114
|
+
const { createCompositeRouter } = await import("./composite-router-RX3JZYIE.js");
|
|
115
115
|
const adapters = createAllAdapters();
|
|
116
116
|
if (adapters.size === 0) {
|
|
117
117
|
routerInitPromise = null;
|
|
@@ -119,7 +119,7 @@ async function getRouter() {
|
|
|
119
119
|
}
|
|
120
120
|
cachedRouter = adaptCompositeRouter(createCompositeRouter(adapters));
|
|
121
121
|
try {
|
|
122
|
-
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-
|
|
122
|
+
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-V2BTK5ZW.js");
|
|
123
123
|
cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
|
|
124
124
|
} catch (error) {
|
|
125
125
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -252,4 +252,4 @@ export {
|
|
|
252
252
|
tokenSplitFromUsage,
|
|
253
253
|
executeExpert
|
|
254
254
|
};
|
|
255
|
-
//# sourceMappingURL=chunk-
|
|
255
|
+
//# sourceMappingURL=chunk-5ML3THNH.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createAutoAdapter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-C4T7UI2R.js";
|
|
4
4
|
import {
|
|
5
5
|
getDefaultCliCircuitBreakerRegistry,
|
|
6
6
|
mapModelErrorToCategory
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-AWUTGAQN.js";
|
|
8
8
|
import {
|
|
9
9
|
CircularBuffer,
|
|
10
10
|
ConfigError,
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
resolveModelIdentitySync,
|
|
31
31
|
toRateLimitError,
|
|
32
32
|
warnIfGatewayCostUndeclared
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
34
34
|
|
|
35
35
|
// src/config/model-equivalence.ts
|
|
36
36
|
var VARIANT_QUIRKS = /* @__PURE__ */ new Set(["small", "image"]);
|
|
@@ -1050,4 +1050,4 @@ export {
|
|
|
1050
1050
|
getGlobalRegistry,
|
|
1051
1051
|
resetGlobalRegistry
|
|
1052
1052
|
};
|
|
1053
|
-
//# sourceMappingURL=chunk-
|
|
1053
|
+
//# sourceMappingURL=chunk-6NYFFN42.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getRandomProvider,
|
|
3
3
|
getTimeProvider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
5
5
|
|
|
6
6
|
// src/utils/id-utils.ts
|
|
7
7
|
import { randomUUID } from "node:crypto";
|
|
@@ -24,4 +24,4 @@ export {
|
|
|
24
24
|
generateHyphenId,
|
|
25
25
|
generateUUID
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-7YPSWDOV.js.map
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ErrorCode,
|
|
3
3
|
NexusError,
|
|
4
|
+
ValidationError,
|
|
4
5
|
createLogger,
|
|
5
6
|
err,
|
|
6
7
|
getErrorMessage,
|
|
7
8
|
getFallbackChainForCategory,
|
|
8
9
|
getTimeProvider,
|
|
9
10
|
isCliName,
|
|
11
|
+
isDurableCapacityText,
|
|
10
12
|
isRateLimitText,
|
|
11
13
|
observedArmDisplaySlot,
|
|
12
|
-
ok
|
|
13
|
-
|
|
14
|
+
ok,
|
|
15
|
+
parseRetryAfterMs
|
|
16
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
14
17
|
|
|
15
18
|
// src/cli-adapters/circuit-breaker-types.ts
|
|
16
19
|
var CircuitErrorCode = {
|
|
@@ -208,6 +211,14 @@ var CliCircuitBreaker = class {
|
|
|
208
211
|
this.halfOpenRequests++;
|
|
209
212
|
return ok(true);
|
|
210
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* Releases a half-open probe request without recording success or failure (#6613).
|
|
216
|
+
*/
|
|
217
|
+
releaseHalfOpenProbe() {
|
|
218
|
+
if (this.state === "half-open" && this.halfOpenRequests > 0) {
|
|
219
|
+
this.halfOpenRequests--;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
211
222
|
checkStateTransition() {
|
|
212
223
|
if (this.state === "open") {
|
|
213
224
|
const elapsed = getTimeProvider().now() - this.lastStateChange;
|
|
@@ -421,6 +432,39 @@ function mapModelErrorToCategory(error) {
|
|
|
421
432
|
}
|
|
422
433
|
}
|
|
423
434
|
|
|
435
|
+
// src/cli-adapters/cli-error-helpers.ts
|
|
436
|
+
var RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
|
|
437
|
+
"TIMEOUT",
|
|
438
|
+
"RATE_LIMITED",
|
|
439
|
+
"CONNECTION_ERROR"
|
|
440
|
+
]);
|
|
441
|
+
function isRetryableErrorCode(code) {
|
|
442
|
+
return RETRYABLE_ERROR_CODES.has(code);
|
|
443
|
+
}
|
|
444
|
+
var TIMEOUT_TEXT_PATTERNS = ["timeout", "timed out", "etimedout"];
|
|
445
|
+
function isTimeoutText(text) {
|
|
446
|
+
const lower = text.toLowerCase();
|
|
447
|
+
return TIMEOUT_TEXT_PATTERNS.some((p) => lower.includes(p));
|
|
448
|
+
}
|
|
449
|
+
function createCliError(code, message, cli, cause) {
|
|
450
|
+
const retryable = isRetryableErrorCode(code) && !isDurableCapacityText(message);
|
|
451
|
+
const retryAfterMs = retryable ? parseRetryAfterMs(message) : void 0;
|
|
452
|
+
return {
|
|
453
|
+
code,
|
|
454
|
+
message,
|
|
455
|
+
cli,
|
|
456
|
+
retryable,
|
|
457
|
+
...retryAfterMs !== void 0 && { retryAfterMs },
|
|
458
|
+
...cause !== void 0 && { cause }
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function createCallerInputCliError(message, cli) {
|
|
462
|
+
return createCliError("EXECUTION_ERROR", message, cli, new ValidationError(message));
|
|
463
|
+
}
|
|
464
|
+
function isCallerInputCliError(error) {
|
|
465
|
+
return error.cause instanceof ValidationError;
|
|
466
|
+
}
|
|
467
|
+
|
|
424
468
|
// src/cli-adapters/cli-circuit-breaker.ts
|
|
425
469
|
var CATEGORY_TO_FALLBACK = {
|
|
426
470
|
code_generation: "code",
|
|
@@ -554,23 +598,35 @@ var CliCircuitBreakerIntegration = class {
|
|
|
554
598
|
}
|
|
555
599
|
async executeWithBreaker(adapter, task) {
|
|
556
600
|
const breaker = this.registry.getBreaker(adapter.name);
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
601
|
+
const canRun = breaker.canExecute();
|
|
602
|
+
if (!canRun.ok) {
|
|
603
|
+
return canRun;
|
|
604
|
+
}
|
|
605
|
+
let execResult;
|
|
606
|
+
try {
|
|
607
|
+
execResult = await adapter.execute(task);
|
|
608
|
+
} catch (error) {
|
|
609
|
+
breaker.recordFailure("unknown");
|
|
610
|
+
return err(
|
|
611
|
+
new CircuitError(`CLI execution threw unexpectedly: ${getErrorMessage(error)}`, {
|
|
612
|
+
circuitErrorCode: CircuitErrorCode.EXECUTION_FAILED,
|
|
613
|
+
cliName: adapter.name,
|
|
614
|
+
armId: adapter.name,
|
|
615
|
+
circuitState: breaker.getState(),
|
|
616
|
+
cause: error instanceof Error ? error : new Error(String(error))
|
|
617
|
+
})
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
if (!execResult.ok) {
|
|
621
|
+
if (isCallerInputCliError(execResult.error)) {
|
|
622
|
+
breaker.releaseHalfOpenProbe();
|
|
623
|
+
return err(execResult.error);
|
|
564
624
|
}
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
if (!result.ok) {
|
|
568
|
-
if (result.error.circuitErrorCode === "CIRCUIT_OPEN") return err(result.error);
|
|
569
|
-
const wrapped = result.error.cause;
|
|
570
|
-
if (wrapped?.cliError) return err(wrapped.cliError);
|
|
571
|
-
return err(result.error);
|
|
625
|
+
breaker.recordFailure(mapCliErrorToCategory(execResult.error.code));
|
|
626
|
+
return err(execResult.error);
|
|
572
627
|
}
|
|
573
|
-
|
|
628
|
+
breaker.recordSuccess();
|
|
629
|
+
return ok(execResult.value);
|
|
574
630
|
}
|
|
575
631
|
getFallbackClis(excludeCli, taskCategory) {
|
|
576
632
|
const chain = taskCategory !== void 0 ? getFallbackChainForCategory(taskCategory, CATEGORY_TO_FALLBACK[taskCategory]) : this.config.fallbackChain;
|
|
@@ -587,9 +643,14 @@ export {
|
|
|
587
643
|
DEFAULT_CIRCUIT_BREAKER_CONFIG,
|
|
588
644
|
CliCircuitBreaker,
|
|
589
645
|
mapModelErrorToCategory,
|
|
646
|
+
RETRYABLE_ERROR_CODES,
|
|
647
|
+
isTimeoutText,
|
|
648
|
+
createCliError,
|
|
649
|
+
createCallerInputCliError,
|
|
650
|
+
isCallerInputCliError,
|
|
590
651
|
getDefaultCliCircuitBreakerRegistry,
|
|
591
652
|
getCliCircuitBreakerSnapshot,
|
|
592
653
|
CliCircuitBreakerIntegration,
|
|
593
654
|
createCliCircuitBreakerIntegration
|
|
594
655
|
};
|
|
595
|
-
//# sourceMappingURL=chunk-
|
|
656
|
+
//# sourceMappingURL=chunk-AWUTGAQN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli-adapters/circuit-breaker-types.ts","../src/cli-adapters/circuit-breaker.ts","../src/cli-adapters/cli-error-helpers.ts","../src/cli-adapters/cli-circuit-breaker.ts"],"sourcesContent":["/**\n * nexus-agents/cli-adapters - Circuit Breaker Types\n *\n * Type definitions and error classes for the circuit breaker pattern.\n *\n * (Source: Issue #81 - Circuit breaker for CLI failures)\n */\n\nimport { NexusError, ErrorCode } from '../core/errors.js';\nimport { isRateLimitText } from '../adapters/rate-limit-detector.js';\nimport type { CliName, ObservedArmId } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Circuit breaker states.\n */\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\n/**\n * Categories of failures for circuit breaker decisions.\n */\nexport type FailureCategory =\n | 'timeout' // CLI didn't respond in time\n | 'crash' // Process crashed or exited unexpectedly\n | 'authentication' // OAuth/auth failure\n | 'rate_limit' // Rate limit exceeded\n | 'connection' // MCP connection failed\n | 'unknown'; // Uncategorized failure\n\n/**\n * Configuration options for circuit breaker.\n */\nexport interface CircuitBreakerConfig {\n /** Number of failures before opening circuit (default: 5) */\n readonly failureThreshold: number;\n /** Time in ms before attempting recovery (default: 30000) */\n readonly resetTimeoutMs: number;\n /** Successful calls needed in half-open to close (default: 2) */\n readonly halfOpenSuccessThreshold: number;\n /** Whether to count timeouts as failures (default: true) */\n readonly countTimeoutsAsFailures: boolean;\n /** Whether to count auth failures as failures (default: false) */\n readonly countAuthFailuresAsFailures: boolean;\n /** Whether to count rate limit errors as failures (default: false) */\n readonly countRateLimitsAsFailures: boolean;\n /** Maximum number of requests allowed in half-open state (default: 3) */\n readonly halfOpenMaxRequests: number;\n}\n\n/**\n * Circuit breaker state snapshot.\n */\nexport interface CircuitBreakerSnapshot {\n /** Current state */\n readonly state: CircuitState;\n /** Total failure count since last closed */\n readonly failureCount: number;\n /** Success count in half-open state */\n readonly successCount: number;\n /** Timestamp of last failure */\n readonly lastFailureTime: number | null;\n /** Timestamp of last state change */\n readonly lastStateChange: number;\n /** Requests in current half-open window */\n readonly halfOpenRequests: number;\n /** Configuration */\n readonly config: CircuitBreakerConfig;\n}\n\n/**\n * Event emitted on circuit state changes.\n */\nexport interface CircuitStateChangeEvent {\n /**\n * Display slot of the guarded arm: identity for a CLI slot, the collapsed\n * slot for an `api:*` arm (#4392). Always `observedArmDisplaySlot(armId)`;\n * read {@link armId} to tell an endpoint arm from the slot it displays under.\n */\n readonly cliName: CliName;\n /**\n * Arm the breaker guards — a CLI slot, a built-in `api:*` arm or a\n * registered endpoint arm (#4392). The breaker is the only producer of this\n * event in tree; a listener that builds one by hand must supply it.\n */\n readonly armId: ObservedArmId;\n /** Previous state */\n readonly previousState: CircuitState;\n /** New state */\n readonly newState: CircuitState;\n /** Timestamp of change */\n readonly timestamp: number;\n /** Failure count at time of change */\n readonly failureCount: number;\n /** Reason for state change */\n readonly reason: string;\n}\n\n/**\n * Event listener for circuit state changes.\n */\nexport type CircuitStateChangeListener = (event: CircuitStateChangeEvent) => void;\n\n/**\n * Interface for circuit breaker operations.\n */\nexport interface ICircuitBreaker {\n /**\n * Executes a function with circuit breaker protection.\n */\n execute<T>(fn: () => Promise<T>): Promise<import('../core/index.js').Result<T, CircuitError>>;\n\n /**\n * Gets the current circuit state.\n */\n getState(): CircuitState;\n\n /**\n * Gets a full snapshot of circuit breaker state.\n */\n getSnapshot(): CircuitBreakerSnapshot;\n\n /**\n * Manually resets the circuit breaker to closed state.\n */\n reset(): void;\n\n /**\n * Records a failure manually (for external failure detection).\n */\n recordFailure(category: FailureCategory): void;\n\n /**\n * Records a success manually (for external success detection).\n */\n recordSuccess(): void;\n\n /**\n * Checks whether an execution can proceed under current circuit state.\n */\n canExecute(): import('../core/index.js').Result<true, CircuitError>;\n\n /**\n * Releases a half-open probe request without recording success or failure (#6613).\n */\n releaseHalfOpenProbe(): void;\n}\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\n/**\n * Error codes specific to circuit breaker.\n */\nexport const CircuitErrorCode = {\n CIRCUIT_OPEN: 'CIRCUIT_OPEN',\n CIRCUIT_HALF_OPEN_REJECTED: 'CIRCUIT_HALF_OPEN_REJECTED',\n EXECUTION_FAILED: 'EXECUTION_FAILED',\n} as const;\n\nexport type CircuitErrorCode = (typeof CircuitErrorCode)[keyof typeof CircuitErrorCode];\n\n// ============================================================================\n// Error Class\n// ============================================================================\n\n/**\n * Error thrown when circuit breaker blocks a request.\n */\nexport class CircuitError extends NexusError {\n readonly circuitErrorCode: CircuitErrorCode;\n /** Display slot of {@link armId} — never the raw `api:*` id. */\n readonly cliName: CliName;\n /**\n * Arm whose circuit blocked the request — a CLI slot, a built-in `api:*` arm\n * or a registered endpoint arm (#4392). Defaults to `cliName` when the\n * constructor is called with the pre-#4392 option shape.\n */\n readonly armId: ObservedArmId;\n readonly circuitState: CircuitState;\n readonly failureCategory?: FailureCategory;\n\n constructor(\n message: string,\n options: {\n circuitErrorCode: CircuitErrorCode;\n /** Display slot; the breaker passes `observedArmDisplaySlot(armId)`. */\n cliName: CliName;\n /** The guarded arm (#4392). Optional so the pre-#4392 option shape still compiles; defaults to `cliName`. */\n armId?: ObservedArmId;\n circuitState: CircuitState;\n failureCategory?: FailureCategory;\n cause?: Error;\n }\n ) {\n const armId: ObservedArmId = options.armId ?? options.cliName;\n const baseOptions: { code: ErrorCode; cause?: Error; context: Record<string, unknown> } = {\n code: ErrorCode.INTERNAL_ERROR,\n context: {\n circuitErrorCode: options.circuitErrorCode,\n cliName: options.cliName,\n armId,\n circuitState: options.circuitState,\n },\n };\n if (options.cause !== undefined) {\n baseOptions.cause = options.cause;\n }\n if (options.failureCategory !== undefined) {\n baseOptions.context['failureCategory'] = options.failureCategory;\n }\n super(message, baseOptions);\n this.name = 'CircuitError';\n this.circuitErrorCode = options.circuitErrorCode;\n this.cliName = options.cliName;\n this.armId = armId;\n this.circuitState = options.circuitState;\n if (options.failureCategory !== undefined) {\n this.failureCategory = options.failureCategory;\n }\n }\n}\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/**\n * Default circuit breaker configuration.\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n resetTimeoutMs: 30_000,\n halfOpenSuccessThreshold: 2,\n countTimeoutsAsFailures: true,\n countAuthFailuresAsFailures: false,\n countRateLimitsAsFailures: true,\n halfOpenMaxRequests: 3,\n} as const;\n\n// ============================================================================\n// Error Categorization Patterns\n// ============================================================================\n\n/**\n * Pattern matchers for categorizing errors.\n */\nconst TIMEOUT_PATTERNS = ['timeout', 'timed out'];\nconst AUTH_PATTERNS = ['auth', 'unauthorized', 'forbidden', 'oauth'];\nconst CONNECTION_PATTERNS = [\n 'connection',\n 'econnrefused',\n 'enotfound',\n 'mcp',\n 'eaddrinuse',\n 'address already in use',\n];\nconst CRASH_PATTERNS = ['crash', 'exited', 'killed', 'sigterm', 'sigkill'];\n\n/**\n * Checks if text contains any of the patterns.\n */\nfunction matchesPatterns(text: string, patterns: string[]): boolean {\n return patterns.some((pattern) => text.includes(pattern));\n}\n\n/**\n * Categorizes an error into a failure category.\n */\nexport function categorizeError(error: unknown): FailureCategory {\n if (!(error instanceof Error)) {\n return 'unknown';\n }\n\n const message = error.message.toLowerCase();\n const name = error.name.toLowerCase();\n const combined = `${message} ${name}`;\n\n if (matchesPatterns(combined, TIMEOUT_PATTERNS)) return 'timeout';\n if (matchesPatterns(combined, AUTH_PATTERNS)) return 'authentication';\n if (isRateLimitText(combined)) return 'rate_limit';\n if (matchesPatterns(combined, CONNECTION_PATTERNS)) return 'connection';\n if (matchesPatterns(combined, CRASH_PATTERNS)) return 'crash';\n\n return 'unknown';\n}\n","/**\n * nexus-agents/cli-adapters - Circuit Breaker Implementation\n *\n * Implements the circuit breaker pattern to handle CLI failures gracefully\n * and prevent cascade failures in the multi-CLI mesh.\n *\n * (Source: Issue #81 - Circuit breaker for CLI failures)\n * (Source: Martin Fowler's Circuit Breaker pattern)\n */\n\nimport type { Result } from '../core/index.js';\nimport { getErrorMessage, err, ok, getTimeProvider } from '../core/index.js';\n\nimport { ErrorCode, type ModelError } from '../core/errors.js';\n\nimport type { CliName, ObservedArmId, CliErrorCode } from './types.js';\nimport { isCliName, observedArmDisplaySlot } from './types.js';\nimport {\n CircuitError,\n CircuitErrorCode,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n categorizeError,\n type CircuitState,\n type FailureCategory,\n type CircuitBreakerConfig,\n type CircuitBreakerSnapshot,\n type CircuitStateChangeEvent,\n type CircuitStateChangeListener,\n type ICircuitBreaker,\n} from './circuit-breaker-types.js';\n\n// Re-export all types for convenience\nexport {\n CircuitError,\n CircuitErrorCode,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n categorizeError,\n type CircuitState,\n type FailureCategory,\n type CircuitBreakerConfig,\n type CircuitBreakerSnapshot,\n type CircuitStateChangeEvent,\n type CircuitStateChangeListener,\n type ICircuitBreaker,\n} from './circuit-breaker-types.js';\n\n// ============================================================================\n// Circuit Breaker Implementation\n// ============================================================================\n\n/**\n * Circuit breaker implementation for CLI adapters.\n *\n * Provides protection against cascading failures by:\n * 1. Tracking failure counts\n * 2. Opening circuit when threshold exceeded\n * 3. Allowing gradual recovery through half-open state\n */\nexport class CliCircuitBreaker implements ICircuitBreaker {\n private state: CircuitState = 'closed';\n private failureCount = 0;\n private successCount = 0;\n private lastFailureTime: number | null = null;\n private lastStateChange: number;\n private halfOpenRequests = 0;\n private readonly listeners: Set<CircuitStateChangeListener> = new Set();\n\n /** Display slot of {@link armId}; what `cliName` fields on events and errors carry. */\n private readonly cliName: CliName;\n\n constructor(\n private readonly armId: ObservedArmId,\n private readonly config: CircuitBreakerConfig = DEFAULT_CIRCUIT_BREAKER_CONFIG\n ) {\n this.cliName = observedArmDisplaySlot(armId);\n this.lastStateChange = getTimeProvider().now();\n }\n\n /**\n * Executes a function with circuit breaker protection.\n */\n async execute<T>(fn: () => Promise<T>): Promise<Result<T, CircuitError>> {\n const canExecute = this.canExecute();\n if (!canExecute.ok) {\n return canExecute;\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return ok(result);\n } catch (error) {\n const category = categorizeError(error);\n if (this.shouldCountFailure(category)) {\n this.onFailure(category);\n }\n return err(this.createExecutionError(error, category));\n }\n }\n\n getState(): CircuitState {\n this.checkStateTransition();\n return this.state;\n }\n\n getSnapshot(): CircuitBreakerSnapshot {\n this.checkStateTransition();\n return {\n state: this.state,\n failureCount: this.failureCount,\n successCount: this.successCount,\n lastFailureTime: this.lastFailureTime,\n lastStateChange: this.lastStateChange,\n halfOpenRequests: this.halfOpenRequests,\n config: this.config,\n };\n }\n\n reset(): void {\n const previousState = this.state;\n this.state = 'closed';\n this.failureCount = 0;\n this.successCount = 0;\n this.lastFailureTime = null;\n this.halfOpenRequests = 0;\n this.lastStateChange = getTimeProvider().now();\n\n if (previousState !== 'closed') {\n this.emitStateChange(previousState, 'closed', 'Manual reset');\n }\n }\n\n recordFailure(category: FailureCategory): void {\n if (this.shouldCountFailure(category)) {\n this.onFailure(category);\n }\n }\n\n recordSuccess(): void {\n this.onSuccess();\n }\n\n addStateChangeListener(listener: CircuitStateChangeListener): void {\n this.listeners.add(listener);\n }\n\n removeStateChangeListener(listener: CircuitStateChangeListener): void {\n this.listeners.delete(listener);\n }\n\n // -------------------------------------------------------------------------\n // Private Methods\n // -------------------------------------------------------------------------\n\n canExecute(): Result<true, CircuitError> {\n this.checkStateTransition();\n\n if (this.state === 'closed') {\n return ok(true);\n }\n\n if (this.state === 'open') {\n return err(\n new CircuitError(`Circuit is open for CLI: ${this.armId}`, {\n circuitErrorCode: CircuitErrorCode.CIRCUIT_OPEN,\n cliName: this.cliName,\n armId: this.armId,\n circuitState: this.state,\n })\n );\n }\n\n // half-open state\n if (this.halfOpenRequests >= this.config.halfOpenMaxRequests) {\n return err(\n new CircuitError(`Circuit half-open request limit reached for CLI: ${this.armId}`, {\n circuitErrorCode: CircuitErrorCode.CIRCUIT_HALF_OPEN_REJECTED,\n cliName: this.cliName,\n armId: this.armId,\n circuitState: this.state,\n })\n );\n }\n this.halfOpenRequests++;\n return ok(true);\n }\n\n /**\n * Releases a half-open probe request without recording success or failure (#6613).\n */\n releaseHalfOpenProbe(): void {\n if (this.state === 'half-open' && this.halfOpenRequests > 0) {\n this.halfOpenRequests--;\n }\n }\n\n private checkStateTransition(): void {\n if (this.state === 'open') {\n // #5011: measured from the TRANSITION, not from the last failure. Keyed\n // on `lastFailureTime` the window restarted on every failure recorded\n // while open — and an open circuit does not shed load on the default\n // paths (`base-adapter` and `resilient-adapter` never consult\n // `canExecute`), so traffic kept arriving, kept failing occasionally, and\n // kept pushing the half-open probe another 30s out. A CLI serving 95% of\n // requests correctly stayed evicted from every voter panel until a manual\n // `reset()`. Panel choice: fix the timer, leave load-shedding alone\n // (7-voter panel, Option A, 4 of 5 approvers, audit record #79).\n const elapsed = getTimeProvider().now() - this.lastStateChange;\n if (elapsed >= this.config.resetTimeoutMs) {\n this.transitionTo('half-open', 'Reset timeout elapsed');\n }\n }\n }\n\n private onSuccess(): void {\n if (this.state === 'closed') {\n this.failureCount = 0;\n } else if (this.state === 'half-open') {\n this.successCount++;\n if (this.successCount >= this.config.halfOpenSuccessThreshold) {\n const reason = `${String(this.successCount)} consecutive successes in half-open state`;\n this.transitionTo('closed', reason);\n }\n }\n }\n\n private onFailure(category: FailureCategory): void {\n // #5011: a failure recorded while the circuit is already open carries no\n // information — the circuit is open, that is the verdict — and updating\n // `lastFailureTime` here is what delayed recovery.\n //\n // #5034: this line is the LOAD-BEARING half, and the tests now say so:\n // dropping it alone fails two assertions. The `lastStateChange` change in\n // `checkStateTransition` is genuinely redundant given this return —\n // reverting THAT alone fails nothing, because with `lastFailureTime`\n // frozen the two fields are set microseconds apart at the open transition\n // and never diverge. It is kept because measuring recovery from the\n // transition is what the window means, not because any behaviour\n // distinguishes it. Saying which half is pinned, and admitting the other\n // cannot be, beats a mutation table that implies two clean kills.\n //\n // `failureCount` stays put too: it drives the closed-state threshold and\n // is reset on the transition back to closed.\n if (this.state === 'open') return;\n\n this.failureCount++;\n this.lastFailureTime = getTimeProvider().now();\n\n if (this.state === 'closed' && this.failureCount >= this.config.failureThreshold) {\n const reason = `Failure threshold (${String(this.config.failureThreshold)}) exceeded`;\n this.transitionTo('open', reason);\n } else if (this.state === 'half-open') {\n this.transitionTo('open', `Failure during half-open recovery (category: ${category})`);\n }\n }\n\n private transitionTo(newState: CircuitState, reason: string): void {\n const previousState = this.state;\n this.state = newState;\n this.lastStateChange = getTimeProvider().now();\n\n if (newState === 'closed') {\n this.failureCount = 0;\n this.successCount = 0;\n this.halfOpenRequests = 0;\n } else if (newState === 'half-open') {\n // #3026 finding 5: pre-fix `failureCount` carried over across\n // recovery cycles. transitionTo('open',…) only zeroes counts on\n // 'closed', so a half-open→open→half-open flaky pattern grew\n // `failureCount` monotonically across cycles. The count served\n // its threshold purpose when we opened the circuit; resetting on\n // 'half-open' restores the documented per-cycle semantic that\n // operator dashboards / alerts read from `getSnapshot()`.\n this.failureCount = 0;\n this.successCount = 0;\n this.halfOpenRequests = 0;\n }\n\n this.emitStateChange(previousState, newState, reason);\n }\n\n private emitStateChange(\n previousState: CircuitState,\n newState: CircuitState,\n reason: string\n ): void {\n const event: CircuitStateChangeEvent = {\n cliName: this.cliName,\n armId: this.armId,\n previousState,\n newState,\n timestamp: this.lastStateChange,\n failureCount: this.failureCount,\n reason,\n };\n\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Ignore listener errors to prevent cascade\n }\n }\n }\n\n private shouldCountFailure(category: FailureCategory): boolean {\n if (category === 'timeout') return this.config.countTimeoutsAsFailures;\n if (category === 'authentication') return this.config.countAuthFailuresAsFailures;\n if (category === 'rate_limit') return this.config.countRateLimitsAsFailures;\n return true;\n }\n\n private createExecutionError(error: unknown, category: FailureCategory): CircuitError {\n const message = getErrorMessage(error);\n const cause = error instanceof Error ? error : new Error(String(error));\n return new CircuitError(`CLI execution failed: ${message}`, {\n circuitErrorCode: CircuitErrorCode.EXECUTION_FAILED,\n cliName: this.cliName,\n armId: this.armId,\n circuitState: this.state,\n failureCategory: category,\n cause,\n });\n }\n}\n\n// ============================================================================\n// Registry\n// ============================================================================\n\n/**\n * Registry for managing per-arm circuit breakers.\n *\n * Keyed by {@link ObservedArmId} since #4392 — a published `RoutingArmId` or a\n * registered `EndpointArmId`: a CLI slot and an `api:*` arm are distinct keys,\n * so an endpoint opening never speaks for the CLI slot it displays under. The `*Arm*` methods are the source of truth over that map;\n * the older `CliName`-typed methods keep their signatures and are FILTERED\n * VIEWS of the same map, restricted to the four CLI slots — an `api:*` arm\n * never appears in `getHealthyClis()` / `getUnhealthyClis()` /\n * `getAllSnapshots()`, only in their `*Arms` siblings (#6290 panel; the\n * narrow methods are removed in 9.0, #6291).\n */\nexport class CircuitBreakerRegistry {\n private readonly breakers: Map<ObservedArmId, CliCircuitBreaker> = new Map();\n private readonly globalListeners: Set<CircuitStateChangeListener> = new Set();\n\n constructor(private readonly defaultConfig: Partial<CircuitBreakerConfig> = {}) {}\n\n /** Breaker for any routing arm, created on first request (#4392). */\n getArmBreaker(armId: ObservedArmId, config?: Partial<CircuitBreakerConfig>): CliCircuitBreaker {\n let breaker = this.breakers.get(armId);\n\n if (!breaker) {\n const mergedConfig: CircuitBreakerConfig = {\n ...DEFAULT_CIRCUIT_BREAKER_CONFIG,\n ...this.defaultConfig,\n ...config,\n };\n breaker = new CliCircuitBreaker(armId, mergedConfig);\n\n for (const listener of this.globalListeners) {\n breaker.addStateChangeListener(listener);\n }\n\n this.breakers.set(armId, breaker);\n }\n\n return breaker;\n }\n\n /** CLI-slot view of {@link getArmBreaker}: the same breaker, same map. */\n getBreaker(cliName: CliName, config?: Partial<CircuitBreakerConfig>): CliCircuitBreaker {\n return this.getArmBreaker(cliName, config);\n }\n\n isArmOpen(armId: ObservedArmId): boolean {\n return this.breakers.get(armId)?.getState() === 'open';\n }\n\n /** CLI-slot view of {@link isArmOpen}. */\n isOpen(cliName: CliName): boolean {\n return this.isArmOpen(cliName);\n }\n\n /** Snapshot of every arm the registry holds, CLI slots and `api:*` arms alike. */\n getAllArmSnapshots(): Map<ObservedArmId, CircuitBreakerSnapshot> {\n const snapshots = new Map<ObservedArmId, CircuitBreakerSnapshot>();\n for (const [name, breaker] of this.breakers) {\n snapshots.set(name, breaker.getSnapshot());\n }\n return snapshots;\n }\n\n /** CLI-slot view of {@link getAllArmSnapshots}: `api:*` arms are filtered out. */\n getAllSnapshots(): Map<CliName, CircuitBreakerSnapshot> {\n const snapshots = new Map<CliName, CircuitBreakerSnapshot>();\n for (const [name, snapshot] of this.getAllArmSnapshots()) {\n if (isCliName(name)) snapshots.set(name, snapshot);\n }\n return snapshots;\n }\n\n resetAll(): void {\n for (const breaker of this.breakers.values()) {\n breaker.reset();\n }\n }\n\n resetArm(armId: ObservedArmId): void {\n this.breakers.get(armId)?.reset();\n }\n\n /** CLI-slot view of {@link resetArm}. */\n reset(cliName: CliName): void {\n this.resetArm(cliName);\n }\n\n addGlobalStateChangeListener(listener: CircuitStateChangeListener): void {\n this.globalListeners.add(listener);\n for (const breaker of this.breakers.values()) {\n breaker.addStateChangeListener(listener);\n }\n }\n\n removeGlobalStateChangeListener(listener: CircuitStateChangeListener): void {\n this.globalListeners.delete(listener);\n for (const breaker of this.breakers.values()) {\n breaker.removeStateChangeListener(listener);\n }\n }\n\n /** Every arm whose circuit is closed. Empty registry: `[]` — nothing is known healthy. */\n getHealthyArms(): ObservedArmId[] {\n const healthy: ObservedArmId[] = [];\n for (const [name, breaker] of this.breakers) {\n if (breaker.getState() === 'closed') {\n healthy.push(name);\n }\n }\n return healthy;\n }\n\n /** CLI-slot view of {@link getHealthyArms}: `api:*` arms are filtered out. */\n getHealthyClis(): CliName[] {\n return this.getHealthyArms().filter(isCliName);\n }\n\n /** Every arm whose circuit is open or half-open. Empty registry: `[]`. */\n getUnhealthyArms(): ObservedArmId[] {\n const unhealthy: ObservedArmId[] = [];\n for (const [name, breaker] of this.breakers) {\n const state = breaker.getState();\n if (state === 'open' || state === 'half-open') {\n unhealthy.push(name);\n }\n }\n return unhealthy;\n }\n\n /** CLI-slot view of {@link getUnhealthyArms}: `api:*` arms are filtered out. */\n getUnhealthyClis(): CliName[] {\n return this.getUnhealthyArms().filter(isCliName);\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Maps CLI error codes to failure categories.\n */\nexport function mapCliErrorToCategory(errorCode: CliErrorCode): FailureCategory {\n const mapping: Record<string, FailureCategory> = {\n TIMEOUT: 'timeout',\n NOT_AUTHENTICATED: 'authentication',\n RATE_LIMITED: 'rate_limit',\n CONNECTION_ERROR: 'connection',\n };\n return mapping[errorCode] ?? 'unknown';\n}\n\n/**\n * Maps a direct-API {@link ModelError} to a circuit-breaker failure category.\n *\n * Mirrors {@link mapCliErrorToCategory} for the IModelAdapter layer (#3423):\n * API failures must drive the same breaker degradation/failover learning that\n * CLI subprocess failures already get. Maps by the structured `error.code`\n * first, then falls back to message-pattern categorization via\n * {@link categorizeError} (which returns `'unknown'` if nothing matches).\n *\n * The fallback is what turns a generic `MODEL_ERROR` whose message reads\n * \"connection refused\" into a `connection` category instead of `unknown`.\n */\nexport function mapModelErrorToCategory(error: ModelError): FailureCategory {\n switch (error.code) {\n case ErrorCode.MODEL_TIMEOUT:\n case ErrorCode.TIMEOUT_ERROR:\n return 'timeout';\n case ErrorCode.UNAUTHORIZED:\n return 'authentication';\n case ErrorCode.MODEL_RATE_LIMITED:\n case ErrorCode.RATE_LIMIT_ERROR:\n return 'rate_limit';\n case ErrorCode.MODEL_UNAVAILABLE:\n case ErrorCode.MODEL_NOT_FOUND:\n // Intentional reuse of `connection`: there is no dedicated \"endpoint gone /\n // model retired\" category, and `connection` is a counted, failover-driving\n // category — the right behaviour for an unavailable/missing model.\n return 'connection';\n default:\n // MODEL_ERROR and any other code: fall back to message-pattern matching.\n return categorizeError(error);\n }\n}\n\n// `createCircuitBreakerRegistryWithMetrics` and the\n// `Capacity Monitor Integration` section\n// (`integrateCapacityMonitorWithCircuitBreaker` + the\n// `CapacityMonitorIntegrationConfig` interface and its default config)\n// were removed in #3018 — both had only test-file callers in the tree.\n// The `CircuitBreakerRegistry` above is what production adapters use;\n// if metrics-logging integration comes back as a real requirement,\n// reintroduce it alongside the consumer code in the same PR\n// (activation-or-delete YAGNI — same pattern as #2937–#2940).\n//\n// The capacity-monitor half of that sentence is gone: the provider-header\n// monitor it referred to was removed in #4532 after 7 months unwired, so\n// there is nothing to \"come back\". Header parsing is now a BUILD.\n","/**\n * Canonical helpers for constructing CliError values with the correct\n * `retryable` flag.\n *\n * Consolidates three previously-duplicated copies:\n * - `cli-retry-loop.ts` (as a module-local set + `isRetryableError`)\n * - `adapters/codex-adapter-helpers.ts` (as `createCodexError`)\n * - `adapters/codex-mcp-adapter-helpers.ts` (as `createCliError`)\n * - `testing/adapters/mock-adapter-helpers.ts` (as `createCliError`)\n *\n * Every call path that classifies retryable CLI errors should now flow\n * through here. Adding a new retryable code is a one-line change in one\n * place instead of four.\n *\n * (Issue #2181 — adapter harness consolidation)\n *\n * @module cli-adapters/cli-error-helpers\n */\n\nimport { parseRetryAfterMs, isDurableCapacityText } from '../adapters/rate-limit-detector.js';\nimport type { CliError, CliErrorCode, CliName } from './types.js';\nimport { ValidationError } from '../core/errors.js';\n\n/** Error codes the retry machinery treats as transient. */\nexport const RETRYABLE_ERROR_CODES: ReadonlySet<CliErrorCode> = new Set<CliErrorCode>([\n 'TIMEOUT',\n 'RATE_LIMITED',\n 'CONNECTION_ERROR',\n]);\n\n/** Whether a given CLI error code should be retried. */\nexport function isRetryableErrorCode(code: CliErrorCode): boolean {\n return RETRYABLE_ERROR_CODES.has(code);\n}\n\n/**\n * Text patterns that classify a CLI failure as `TIMEOUT`. One list, shared by\n * the subprocess stderr classifier and the voter fallover disclosure (#6115)\n * so the reason a seat fell over is the class the adapter layer assigned.\n */\nconst TIMEOUT_TEXT_PATTERNS = ['timeout', 'timed out', 'etimedout'] as const;\n\n/** Whether an error message names a timeout (the `TIMEOUT` code's text signature). */\nexport function isTimeoutText(text: string): boolean {\n const lower = text.toLowerCase();\n return TIMEOUT_TEXT_PATTERNS.some((p) => lower.includes(p));\n}\n\n/**\n * Constructs a CliError with `retryable` auto-derived from the code.\n * Every adapter that needs to surface a CliError should prefer this\n * helper (or the `createError` method on `BaseCliAdapter`, which calls\n * into the same logic) rather than building the shape inline.\n *\n * A durable capacity cap is `retryable: false` even under a retryable code\n * (#6120): it arrives as RATE_LIMITED, but a spend ceiling does not clear on\n * a retry (#5359), and a flag that says otherwise sends every retry layer\n * back at the same dead model.\n */\nexport function createCliError(\n code: CliErrorCode,\n message: string,\n cli: CliName,\n cause?: Error\n): CliError {\n const retryable = isRetryableErrorCode(code) && !isDurableCapacityText(message);\n // #4373: honor a provider-stated retry window here too, so the shared helper\n // and BaseCliAdapter.createError produce the same shape — otherwise which\n // construction path an adapter happened to use would decide whether the hint\n // survived.\n const retryAfterMs = retryable ? parseRetryAfterMs(message) : undefined;\n return {\n code,\n message,\n cli,\n retryable,\n ...(retryAfterMs !== undefined && { retryAfterMs }),\n ...(cause !== undefined && { cause }),\n };\n}\n\n/**\n * A CliError caused by the caller's input — e.g. a requested model the CLI\n * cannot resolve or has in cooldown (#6599) — rather than by the CLI's health.\n * Marked by a {@link ValidationError} cause so every layer can tell it apart:\n * the model bridge maps it to `ErrorCode.INVALID_INPUT`, and circuit breakers\n * must not count it, or one bad model preference opens the breaker for every\n * caller of that CLI. Non-retryable: the same input fails the same way.\n */\nexport function createCallerInputCliError(message: string, cli: CliName): CliError {\n return createCliError('EXECUTION_ERROR', message, cli, new ValidationError(message));\n}\n\n/** Whether `error` was built by {@link createCallerInputCliError}. */\nexport function isCallerInputCliError(error: CliError): boolean {\n return error.cause instanceof ValidationError;\n}\n","/**\n * nexus-agents/cli-adapters - CLI Circuit Breaker Integration\n *\n * Wraps CLI adapter calls with circuit breaker pattern for resilient\n * multi-CLI execution with automatic fallback on failures.\n *\n * (Source: Issue #359 - Integrate circuit breaker with CLI adapters)\n */\n\nimport type { Result, ILogger } from '../core/index.js';\nimport { ok, err, createLogger, getTimeProvider, getErrorMessage } from '../core/index.js';\nimport type { TaskCategory } from '../config/task-specialization-types.js';\nimport type { FallbackTaskType } from './task-classifier.js';\nimport { getFallbackChainForCategory } from './fallback-chains.js';\nimport type { ICliAdapter, CliName, CliTask, CliResponse, CliError } from './types.js';\nimport {\n CircuitBreakerRegistry,\n CircuitError,\n CircuitErrorCode,\n mapCliErrorToCategory,\n type CircuitBreakerConfig,\n type CircuitBreakerSnapshot,\n type CircuitStateChangeListener,\n} from './circuit-breaker.js';\nimport { isCallerInputCliError } from './cli-error-helpers.js';\n\n/** Maps canonical TaskCategory (10 types) to FallbackTaskType (5 types). */\nconst CATEGORY_TO_FALLBACK: Record<TaskCategory, FallbackTaskType> = {\n code_generation: 'code',\n code_review: 'code',\n testing: 'code',\n research: 'research',\n exploration: 'research',\n documentation: 'documentation',\n architecture: 'analysis',\n security_review: 'analysis',\n planning: 'analysis',\n devops: 'general',\n};\n\n/** Configuration for CLI circuit breaker integration. */\nexport interface CliCircuitBreakerConfig {\n readonly perCliConfig?: Partial<Record<CliName, Partial<CircuitBreakerConfig>>>;\n readonly fallbackChain?: ReadonlyArray<CliName>;\n readonly enableFallback?: boolean;\n readonly maxFallbackAttempts?: number;\n}\n\n/** Result of a circuit-protected execution with fallback info. */\nexport interface CircuitProtectedResult {\n readonly response: CliResponse;\n readonly executedBy: CliName;\n readonly usedFallback: boolean;\n readonly fallbackAttempts?: ReadonlyArray<CliName>;\n}\n\n/** Health status for all CLIs with circuit state. */\nexport interface CliCircuitHealthStatus {\n readonly clis: ReadonlyArray<{\n readonly name: CliName;\n readonly healthy: boolean;\n readonly circuitState: 'closed' | 'open' | 'half-open';\n readonly failureCount: number;\n readonly lastFailureTime: number | null;\n }>;\n readonly systemHealthy: boolean;\n readonly healthyCount: number;\n readonly timestamp: number;\n}\n\n/** Interface for CLI circuit breaker integration. */\nexport interface ICliCircuitBreakerIntegration {\n execute(\n adapter: ICliAdapter,\n task: CliTask,\n taskCategory?: TaskCategory\n ): Promise<Result<CircuitProtectedResult, CircuitError | CliError>>;\n getHealthStatus(): CliCircuitHealthStatus;\n getCircuitSnapshots(): Map<CliName, CircuitBreakerSnapshot>;\n resetCircuit(cliName: CliName): void;\n resetAllCircuits(): void;\n addStateChangeListener(listener: CircuitStateChangeListener): void;\n}\n\nconst DEFAULT_FALLBACK_CHAIN: ReadonlyArray<CliName> = ['claude', 'gemini', 'codex', 'opencode'];\nconst DEFAULT_CONFIG: Required<CliCircuitBreakerConfig> = {\n perCliConfig: {},\n fallbackChain: DEFAULT_FALLBACK_CHAIN,\n enableFallback: true,\n maxFallbackAttempts: 2,\n};\nconst defaultCliCircuitBreakerRegistry = new CircuitBreakerRegistry();\n\n// #4330: the shared registry now gates voter-panel availability, so a CLI can\n// vanish from a panel roster because its circuit opened. Log every transition —\n// otherwise the next person debugging a \"missing voter\" has no trail, and a\n// misclassified transient error silently costs the panel its diversity.\nconst registryLogger = createLogger({ component: 'cli-circuit-breaker' });\ndefaultCliCircuitBreakerRegistry.addGlobalStateChangeListener((event) => {\n registryLogger.warn('CLI circuit state changed', {\n cli: event.cliName,\n previousState: event.previousState,\n newState: event.newState,\n failureCount: event.failureCount,\n reason: event.reason,\n });\n});\n\n/** Returns the shared CLI circuit-breaker registry used by default integrations. */\nexport function getDefaultCliCircuitBreakerRegistry(): CircuitBreakerRegistry {\n return defaultCliCircuitBreakerRegistry;\n}\n\n/**\n * Reads the current snapshot for a CLI without creating a new breaker.\n *\n * `undefined` means no circuit state is known yet, so callers should fail open.\n */\nexport function getCliCircuitBreakerSnapshot(cliName: CliName): CircuitBreakerSnapshot | undefined {\n return defaultCliCircuitBreakerRegistry.getAllSnapshots().get(cliName);\n}\n\n/**\n * Integrates circuit breaker pattern with CLI adapters.\n * Provides automatic fallback when a CLI's circuit opens.\n */\nexport class CliCircuitBreakerIntegration implements ICliCircuitBreakerIntegration {\n private readonly registry: CircuitBreakerRegistry;\n private readonly adapters: Map<CliName, ICliAdapter> = new Map();\n private readonly config: Required<CliCircuitBreakerConfig>;\n private readonly logger: ILogger;\n\n constructor(\n adapters: ReadonlyArray<ICliAdapter>,\n config?: CliCircuitBreakerConfig,\n logger?: ILogger\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.logger = logger ?? createLogger({ component: 'cli-circuit-breaker-integration' });\n this.registry =\n config === undefined ? defaultCliCircuitBreakerRegistry : new CircuitBreakerRegistry();\n for (const adapter of adapters) {\n this.adapters.set(adapter.name, adapter);\n this.registry.getBreaker(adapter.name, this.config.perCliConfig[adapter.name]);\n }\n }\n\n async execute(\n adapter: ICliAdapter,\n task: CliTask,\n taskCategory?: TaskCategory\n ): Promise<Result<CircuitProtectedResult, CircuitError | CliError>> {\n const primaryCli = adapter.name;\n const fallbackAttempts: CliName[] = [];\n let lastError: CircuitError | CliError | undefined;\n\n const primaryResult = await this.executeWithBreaker(adapter, task);\n if (primaryResult.ok) {\n return ok({ response: primaryResult.value, executedBy: primaryCli, usedFallback: false });\n }\n lastError = primaryResult.error;\n\n if (!this.config.enableFallback || !(lastError instanceof CircuitError)) {\n return err(lastError);\n }\n\n for (const cli of this.getFallbackClis(primaryCli, taskCategory).slice(\n 0,\n this.config.maxFallbackAttempts\n )) {\n const fallbackAdapter = this.adapters.get(cli);\n if (!fallbackAdapter) continue;\n fallbackAttempts.push(cli);\n this.logger.info('Attempting fallback', { from: primaryCli, to: cli });\n const result = await this.executeWithBreaker(fallbackAdapter, task);\n if (result.ok) {\n return ok({\n response: result.value,\n executedBy: cli,\n usedFallback: true,\n fallbackAttempts,\n });\n }\n lastError = result.error;\n }\n\n this.logger.warn('All fallback attempts failed', { primaryCli, fallbackAttempts });\n return err(lastError);\n }\n\n getHealthStatus(): CliCircuitHealthStatus {\n const snapshots = this.registry.getAllSnapshots();\n const clis: CliCircuitHealthStatus['clis'][number][] = [];\n let healthyCount = 0;\n for (const name of this.adapters.keys()) {\n const snapshot = snapshots.get(name);\n if (!snapshot) continue;\n const healthy = snapshot.state === 'closed';\n if (healthy) healthyCount++;\n clis.push({\n name,\n healthy,\n circuitState: snapshot.state,\n failureCount: snapshot.failureCount,\n lastFailureTime: snapshot.lastFailureTime,\n });\n }\n return {\n clis,\n systemHealthy: healthyCount > 0,\n healthyCount,\n timestamp: getTimeProvider().now(),\n };\n }\n\n getCircuitSnapshots(): Map<CliName, CircuitBreakerSnapshot> {\n const allSnapshots = this.registry.getAllSnapshots();\n const snapshots = new Map<CliName, CircuitBreakerSnapshot>();\n for (const name of this.adapters.keys()) {\n const snapshot = allSnapshots.get(name);\n if (snapshot !== undefined) {\n snapshots.set(name, snapshot);\n }\n }\n return snapshots;\n }\n\n resetCircuit(cliName: CliName): void {\n this.registry.reset(cliName);\n this.logger.info('Circuit reset', { cliName });\n }\n\n resetAllCircuits(): void {\n this.registry.resetAll();\n this.logger.info('All circuits reset');\n }\n\n addStateChangeListener(listener: CircuitStateChangeListener): void {\n this.registry.addGlobalStateChangeListener(listener);\n }\n\n private async executeWithBreaker(\n adapter: ICliAdapter,\n task: CliTask\n ): Promise<Result<CliResponse, CircuitError | CliError>> {\n const breaker = this.registry.getBreaker(adapter.name);\n const canRun = breaker.canExecute();\n if (!canRun.ok) {\n return canRun;\n }\n\n let execResult: Result<CliResponse, CliError>;\n try {\n execResult = await adapter.execute(task);\n } catch (error) {\n breaker.recordFailure('unknown');\n return err(\n new CircuitError(`CLI execution threw unexpectedly: ${getErrorMessage(error)}`, {\n circuitErrorCode: CircuitErrorCode.EXECUTION_FAILED,\n cliName: adapter.name,\n armId: adapter.name,\n circuitState: breaker.getState(),\n cause: error instanceof Error ? error : new Error(String(error)),\n })\n );\n }\n\n if (!execResult.ok) {\n // #6613: caller-input errors (e.g. invalid model requested) must not count\n // against the breaker or exhaust half-open probe capacity.\n if (isCallerInputCliError(execResult.error)) {\n breaker.releaseHalfOpenProbe();\n return err(execResult.error);\n }\n breaker.recordFailure(mapCliErrorToCategory(execResult.error.code));\n return err(execResult.error);\n }\n\n breaker.recordSuccess();\n return ok(execResult.value);\n }\n\n private getFallbackClis(excludeCli: CliName, taskCategory?: TaskCategory): CliName[] {\n const chain =\n taskCategory !== undefined\n ? getFallbackChainForCategory(taskCategory, CATEGORY_TO_FALLBACK[taskCategory])\n : this.config.fallbackChain;\n return [...chain].filter(\n (cli) => cli !== excludeCli && !this.registry.isOpen(cli) && this.adapters.has(cli)\n );\n }\n}\n\n/** Creates a CLI circuit breaker integration with the specified adapters. */\nexport function createCliCircuitBreakerIntegration(\n adapters: ReadonlyArray<ICliAdapter>,\n config?: CliCircuitBreakerConfig,\n logger?: ILogger\n): CliCircuitBreakerIntegration {\n return new CliCircuitBreakerIntegration(adapters, config, logger);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
CACHE_TIMEOUTS,
|
|
3
3
|
createLogger,
|
|
4
4
|
getTimeProvider
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
6
6
|
|
|
7
7
|
// src/security/trust-types.ts
|
|
8
8
|
import { z } from "zod";
|
|
@@ -610,4 +610,4 @@ export {
|
|
|
610
610
|
resolveReputationGatingMode,
|
|
611
611
|
gateWithReputation
|
|
612
612
|
};
|
|
613
|
-
//# sourceMappingURL=chunk-
|
|
613
|
+
//# sourceMappingURL=chunk-BY5SXMN5.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveClassGuardMs
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZR5JWLC5.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/cli-readiness.ts
|
|
6
6
|
var READINESS_LEVELS = ["installed", "authenticated", "serves"];
|
|
@@ -90,4 +90,4 @@ export {
|
|
|
90
90
|
SERVES_PROBE_PROMPT,
|
|
91
91
|
probeServes
|
|
92
92
|
};
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
//# sourceMappingURL=chunk-BYRIEU5S.js.map
|