nexus-agents 8.133.1 → 8.133.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/{ast-rule-runner-TAYUN6EA.js → ast-rule-runner-3ILUYP2S.js} +4 -4
  2. package/dist/{child-mcp-config-22JSAQEB.js → child-mcp-config-ZAVMFMHC.js} +3 -3
  3. package/dist/{chunk-WZRHDRV4.js → chunk-26YUABXD.js} +2 -2
  4. package/dist/{chunk-QNQPBSCF.js → chunk-37PFBRXG.js} +7 -7
  5. package/dist/{chunk-3AF4P6MX.js → chunk-3RVR6TNF.js} +3 -3
  6. package/dist/{chunk-YTLV5RA7.js → chunk-4LOCKA6Z.js} +5 -5
  7. package/dist/{chunk-DXA6KCY4.js → chunk-5TIVCAPR.js} +10 -10
  8. package/dist/{chunk-JBLBDHOW.js → chunk-6JDBJO7N.js} +4 -4
  9. package/dist/{chunk-UMICLEEK.js → chunk-7TWS65XL.js} +3 -3
  10. package/dist/chunk-A4LJDRY7.js +227 -0
  11. package/dist/chunk-A4LJDRY7.js.map +1 -0
  12. package/dist/{chunk-CV2K4JWL.js → chunk-ASEDGRDA.js} +30 -19
  13. package/dist/{chunk-CV2K4JWL.js.map → chunk-ASEDGRDA.js.map} +1 -1
  14. package/dist/{chunk-S7HZ4DRO.js → chunk-DUCHVCCB.js} +4 -4
  15. package/dist/{chunk-WUSO67N4.js → chunk-DVPTF7E2.js} +2 -2
  16. package/dist/{chunk-K42B7HPT.js → chunk-DW4QUBLP.js} +8 -8
  17. package/dist/{chunk-PWGPRLDG.js → chunk-F4PEUZ4X.js} +2 -2
  18. package/dist/{chunk-2BPXUVJM.js → chunk-FYMHYIMX.js} +520 -53
  19. package/dist/chunk-FYMHYIMX.js.map +1 -0
  20. package/dist/{chunk-3MGZBCTX.js → chunk-G32F24ON.js} +2 -2
  21. package/dist/{chunk-GZGKTVSJ.js → chunk-GZISUG3E.js} +2 -2
  22. package/dist/{chunk-3C755RVV.js → chunk-IFZVEZHU.js} +258 -232
  23. package/dist/chunk-IFZVEZHU.js.map +1 -0
  24. package/dist/{chunk-GOA3QXKE.js → chunk-JM2CABHD.js} +2 -2
  25. package/dist/{chunk-LUQEEZU2.js → chunk-JMLDWBNB.js} +18 -18
  26. package/dist/{chunk-SZKCWXR4.js → chunk-JT3B4XMV.js} +4 -4
  27. package/dist/{chunk-BIKYXRH2.js → chunk-KIJY44AB.js} +3 -3
  28. package/dist/{chunk-MNSD55T5.js → chunk-LBDXYMXS.js} +2 -2
  29. package/dist/{chunk-LU4RNF7J.js → chunk-MQKHFDCM.js} +2 -2
  30. package/dist/{chunk-UJPK3LK3.js → chunk-NQMKCTX6.js} +2 -2
  31. package/dist/{chunk-KOQV76YH.js → chunk-OXJBQRYD.js} +3 -3
  32. package/dist/{chunk-2767DZTS.js → chunk-PRX4ERTK.js} +4 -4
  33. package/dist/{chunk-KU6YFABH.js → chunk-R6K2MRFJ.js} +2 -2
  34. package/dist/{chunk-Y2MLZFUZ.js → chunk-RIJFSLQ2.js} +14 -11
  35. package/dist/chunk-RIJFSLQ2.js.map +1 -0
  36. package/dist/{chunk-XRJNV25W.js → chunk-SRRECWT6.js} +6 -6
  37. package/dist/{chunk-GRPGABD4.js → chunk-TPBQT2VG.js} +3 -3
  38. package/dist/{chunk-YC63RO3B.js → chunk-U7VICPNO.js} +5 -5
  39. package/dist/{chunk-3P5E7X73.js → chunk-UYIXU4DF.js} +81 -73
  40. package/dist/{chunk-3P5E7X73.js.map → chunk-UYIXU4DF.js.map} +1 -1
  41. package/dist/{chunk-JLD57JRQ.js → chunk-VUCDRYGE.js} +27 -14
  42. package/dist/chunk-VUCDRYGE.js.map +1 -0
  43. package/dist/{chunk-3JUZTVTP.js → chunk-Y7ZQ2FXW.js} +2 -2
  44. package/dist/{chunk-7PBAI2ZR.js → chunk-YKW32JWJ.js} +2 -2
  45. package/dist/{chunk-XPWXLRHT.js → chunk-Z2T54LTR.js} +2 -2
  46. package/dist/{cli-circuit-breaker-PDO5XCIR.js → cli-circuit-breaker-WIQOCIV3.js} +4 -4
  47. package/dist/{cli-readiness-HH7FY4IG.js → cli-readiness-AMPWLQCT.js} +8 -8
  48. package/dist/cli.js +63 -63
  49. package/dist/{composite-router-W6RBM4TI.js → composite-router-WAJXYCCX.js} +3 -3
  50. package/dist/{consensus-vote-XXN2SUC2.js → consensus-vote-VDY2EEUI.js} +20 -20
  51. package/dist/{context-retriever-HIPIKJ53.js → context-retriever-MCPOXBLT.js} +9 -9
  52. package/dist/{doctor-deep-O5E7R5XQ.js → doctor-deep-R6LOSA7S.js} +4 -4
  53. package/dist/{doctor-gateway-report-LJOBL5LD.js → doctor-gateway-report-AJCXLLBP.js} +9 -9
  54. package/dist/{doctor-live-B7D7M6DR.js → doctor-live-24G6DWUF.js} +14 -14
  55. package/dist/{expert-bridge-ZPJ6MYFJ.js → expert-bridge-ZIK2FIR3.js} +5 -5
  56. package/dist/{factory-V7HIMUES.js → factory-NDYEOO6R.js} +12 -12
  57. package/dist/{factory-ZOH7BYG6.js → factory-QRL47DUV.js} +6 -6
  58. package/dist/{improvement-review-SRNLTQ2I.js → improvement-review-X237AHZN.js} +7 -7
  59. package/dist/index.d.ts +9 -2
  60. package/dist/index.js +35 -35
  61. package/dist/{init-opencode-MZKB4N4T.js → init-opencode-QMIGCOL6.js} +7 -7
  62. package/dist/{issue-triage-DCNKAFAI.js → issue-triage-BYJM6NLT.js} +7 -7
  63. package/dist/{model-config-helpers-HXZSDJH3.js → model-config-helpers-JMW2UUV2.js} +3 -3
  64. package/dist/{openai-compat-adapter-7YR5I2AX.js → openai-compat-adapter-KXLQWNMR.js} +7 -7
  65. package/dist/{outcome-store-adapter-I52ZLOJD.js → outcome-store-adapter-SOXHKXH7.js} +3 -3
  66. package/dist/{pr-reviewer-helpers-PQFSTKLB.js → pr-reviewer-helpers-7VD2TIXW.js} +5 -5
  67. package/dist/{registry-command-EUYY5IML.js → registry-command-UB6XFR7W.js} +5 -5
  68. package/dist/{repo-security-plan-FM7ECHOP.js → repo-security-plan-JHXDYI7I.js} +4 -4
  69. package/dist/{research-helpers-synthesize-Q3K2O37N.js → research-helpers-synthesize-3XVMWIDK.js} +5 -5
  70. package/dist/{routing-memory-SKNJ4ES7.js → routing-memory-AMB3K7VB.js} +3 -3
  71. package/dist/{session-memory-Q4H52X6B.js → session-memory-IN2M5V56.js} +4 -4
  72. package/dist/{setup-config-QYRQOWM3.js → setup-config-BHTIRLV3.js} +4 -4
  73. package/dist/{setup-custom-api-BEH7IG7U.js → setup-custom-api-RGPES2HW.js} +5 -5
  74. package/dist/setup-data-dir-AG5DVDDT.js +36 -0
  75. package/dist/{tool-memory-5MBNC755.js → tool-memory-IFCSNEA6.js} +6 -6
  76. package/dist/{unified-registry-A3IQJ53B.js → unified-registry-NZPESKZQ.js} +13 -13
  77. package/dist/{weather-report-B6KTTCRE.js → weather-report-7FN3OUJ2.js} +3 -3
  78. package/package.json +1 -1
  79. package/dist/chunk-2BPXUVJM.js.map +0 -1
  80. package/dist/chunk-3C755RVV.js.map +0 -1
  81. package/dist/chunk-JILYBR2Z.js +0 -617
  82. package/dist/chunk-JILYBR2Z.js.map +0 -1
  83. package/dist/chunk-JLD57JRQ.js.map +0 -1
  84. package/dist/chunk-Y2MLZFUZ.js.map +0 -1
  85. package/dist/setup-data-dir-JJD47YU3.js +0 -36
  86. /package/dist/{ast-rule-runner-TAYUN6EA.js.map → ast-rule-runner-3ILUYP2S.js.map} +0 -0
  87. /package/dist/{child-mcp-config-22JSAQEB.js.map → child-mcp-config-ZAVMFMHC.js.map} +0 -0
  88. /package/dist/{chunk-WZRHDRV4.js.map → chunk-26YUABXD.js.map} +0 -0
  89. /package/dist/{chunk-QNQPBSCF.js.map → chunk-37PFBRXG.js.map} +0 -0
  90. /package/dist/{chunk-3AF4P6MX.js.map → chunk-3RVR6TNF.js.map} +0 -0
  91. /package/dist/{chunk-YTLV5RA7.js.map → chunk-4LOCKA6Z.js.map} +0 -0
  92. /package/dist/{chunk-DXA6KCY4.js.map → chunk-5TIVCAPR.js.map} +0 -0
  93. /package/dist/{chunk-JBLBDHOW.js.map → chunk-6JDBJO7N.js.map} +0 -0
  94. /package/dist/{chunk-UMICLEEK.js.map → chunk-7TWS65XL.js.map} +0 -0
  95. /package/dist/{chunk-S7HZ4DRO.js.map → chunk-DUCHVCCB.js.map} +0 -0
  96. /package/dist/{chunk-WUSO67N4.js.map → chunk-DVPTF7E2.js.map} +0 -0
  97. /package/dist/{chunk-K42B7HPT.js.map → chunk-DW4QUBLP.js.map} +0 -0
  98. /package/dist/{chunk-PWGPRLDG.js.map → chunk-F4PEUZ4X.js.map} +0 -0
  99. /package/dist/{chunk-3MGZBCTX.js.map → chunk-G32F24ON.js.map} +0 -0
  100. /package/dist/{chunk-GZGKTVSJ.js.map → chunk-GZISUG3E.js.map} +0 -0
  101. /package/dist/{chunk-GOA3QXKE.js.map → chunk-JM2CABHD.js.map} +0 -0
  102. /package/dist/{chunk-LUQEEZU2.js.map → chunk-JMLDWBNB.js.map} +0 -0
  103. /package/dist/{chunk-SZKCWXR4.js.map → chunk-JT3B4XMV.js.map} +0 -0
  104. /package/dist/{chunk-BIKYXRH2.js.map → chunk-KIJY44AB.js.map} +0 -0
  105. /package/dist/{chunk-MNSD55T5.js.map → chunk-LBDXYMXS.js.map} +0 -0
  106. /package/dist/{chunk-LU4RNF7J.js.map → chunk-MQKHFDCM.js.map} +0 -0
  107. /package/dist/{chunk-UJPK3LK3.js.map → chunk-NQMKCTX6.js.map} +0 -0
  108. /package/dist/{chunk-KOQV76YH.js.map → chunk-OXJBQRYD.js.map} +0 -0
  109. /package/dist/{chunk-2767DZTS.js.map → chunk-PRX4ERTK.js.map} +0 -0
  110. /package/dist/{chunk-KU6YFABH.js.map → chunk-R6K2MRFJ.js.map} +0 -0
  111. /package/dist/{chunk-XRJNV25W.js.map → chunk-SRRECWT6.js.map} +0 -0
  112. /package/dist/{chunk-GRPGABD4.js.map → chunk-TPBQT2VG.js.map} +0 -0
  113. /package/dist/{chunk-YC63RO3B.js.map → chunk-U7VICPNO.js.map} +0 -0
  114. /package/dist/{chunk-3JUZTVTP.js.map → chunk-Y7ZQ2FXW.js.map} +0 -0
  115. /package/dist/{chunk-7PBAI2ZR.js.map → chunk-YKW32JWJ.js.map} +0 -0
  116. /package/dist/{chunk-XPWXLRHT.js.map → chunk-Z2T54LTR.js.map} +0 -0
  117. /package/dist/{cli-circuit-breaker-PDO5XCIR.js.map → cli-circuit-breaker-WIQOCIV3.js.map} +0 -0
  118. /package/dist/{cli-readiness-HH7FY4IG.js.map → cli-readiness-AMPWLQCT.js.map} +0 -0
  119. /package/dist/{composite-router-W6RBM4TI.js.map → composite-router-WAJXYCCX.js.map} +0 -0
  120. /package/dist/{consensus-vote-XXN2SUC2.js.map → consensus-vote-VDY2EEUI.js.map} +0 -0
  121. /package/dist/{context-retriever-HIPIKJ53.js.map → context-retriever-MCPOXBLT.js.map} +0 -0
  122. /package/dist/{doctor-deep-O5E7R5XQ.js.map → doctor-deep-R6LOSA7S.js.map} +0 -0
  123. /package/dist/{doctor-gateway-report-LJOBL5LD.js.map → doctor-gateway-report-AJCXLLBP.js.map} +0 -0
  124. /package/dist/{doctor-live-B7D7M6DR.js.map → doctor-live-24G6DWUF.js.map} +0 -0
  125. /package/dist/{expert-bridge-ZPJ6MYFJ.js.map → expert-bridge-ZIK2FIR3.js.map} +0 -0
  126. /package/dist/{factory-V7HIMUES.js.map → factory-NDYEOO6R.js.map} +0 -0
  127. /package/dist/{factory-ZOH7BYG6.js.map → factory-QRL47DUV.js.map} +0 -0
  128. /package/dist/{improvement-review-SRNLTQ2I.js.map → improvement-review-X237AHZN.js.map} +0 -0
  129. /package/dist/{init-opencode-MZKB4N4T.js.map → init-opencode-QMIGCOL6.js.map} +0 -0
  130. /package/dist/{issue-triage-DCNKAFAI.js.map → issue-triage-BYJM6NLT.js.map} +0 -0
  131. /package/dist/{model-config-helpers-HXZSDJH3.js.map → model-config-helpers-JMW2UUV2.js.map} +0 -0
  132. /package/dist/{openai-compat-adapter-7YR5I2AX.js.map → openai-compat-adapter-KXLQWNMR.js.map} +0 -0
  133. /package/dist/{outcome-store-adapter-I52ZLOJD.js.map → outcome-store-adapter-SOXHKXH7.js.map} +0 -0
  134. /package/dist/{pr-reviewer-helpers-PQFSTKLB.js.map → pr-reviewer-helpers-7VD2TIXW.js.map} +0 -0
  135. /package/dist/{registry-command-EUYY5IML.js.map → registry-command-UB6XFR7W.js.map} +0 -0
  136. /package/dist/{repo-security-plan-FM7ECHOP.js.map → repo-security-plan-JHXDYI7I.js.map} +0 -0
  137. /package/dist/{research-helpers-synthesize-Q3K2O37N.js.map → research-helpers-synthesize-3XVMWIDK.js.map} +0 -0
  138. /package/dist/{routing-memory-SKNJ4ES7.js.map → routing-memory-AMB3K7VB.js.map} +0 -0
  139. /package/dist/{session-memory-Q4H52X6B.js.map → session-memory-IN2M5V56.js.map} +0 -0
  140. /package/dist/{setup-config-QYRQOWM3.js.map → setup-config-BHTIRLV3.js.map} +0 -0
  141. /package/dist/{setup-custom-api-BEH7IG7U.js.map → setup-custom-api-RGPES2HW.js.map} +0 -0
  142. /package/dist/{setup-data-dir-JJD47YU3.js.map → setup-data-dir-AG5DVDDT.js.map} +0 -0
  143. /package/dist/{tool-memory-5MBNC755.js.map → tool-memory-IFCSNEA6.js.map} +0 -0
  144. /package/dist/{unified-registry-A3IQJ53B.js.map → unified-registry-NZPESKZQ.js.map} +0 -0
  145. /package/dist/{weather-report-B6KTTCRE.js.map → weather-report-7FN3OUJ2.js.map} +0 -0
@@ -9,12 +9,12 @@ import {
9
9
  getBuiltInAstRulesPath,
10
10
  loadRules,
11
11
  runAstQaRules
12
- } from "./chunk-WZRHDRV4.js";
13
- import "./chunk-2BPXUVJM.js";
12
+ } from "./chunk-26YUABXD.js";
13
+ import "./chunk-FYMHYIMX.js";
14
14
  import "./chunk-XBEKMUTO.js";
15
- import "./chunk-4PN3UVZV.js";
16
15
  import "./chunk-UE7A2XHM.js";
17
16
  import "./chunk-LWOX65CP.js";
17
+ import "./chunk-4PN3UVZV.js";
18
18
  import "./chunk-PX6F3LHL.js";
19
19
  export {
20
20
  AST_RULE_LANGUAGES,
@@ -28,4 +28,4 @@ export {
28
28
  loadRules,
29
29
  runAstQaRules
30
30
  };
31
- //# sourceMappingURL=ast-rule-runner-TAYUN6EA.js.map
31
+ //# sourceMappingURL=ast-rule-runner-3ILUYP2S.js.map
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-JPFRRNRR.js";
4
4
  import {
5
5
  createLogger
6
- } from "./chunk-2BPXUVJM.js";
6
+ } from "./chunk-FYMHYIMX.js";
7
7
  import "./chunk-XBEKMUTO.js";
8
- import "./chunk-4PN3UVZV.js";
9
8
  import "./chunk-UE7A2XHM.js";
10
9
  import "./chunk-LWOX65CP.js";
10
+ import "./chunk-4PN3UVZV.js";
11
11
  import "./chunk-PX6F3LHL.js";
12
12
 
13
13
  // src/cli-adapters/child-mcp-config.ts
@@ -75,4 +75,4 @@ async function generateMcpConfig(options) {
75
75
  export {
76
76
  generateMcpConfig
77
77
  };
78
- //# sourceMappingURL=child-mcp-config-22JSAQEB.js.map
78
+ //# sourceMappingURL=child-mcp-config-ZAVMFMHC.js.map
@@ -4,7 +4,7 @@ import {
4
4
  createLogger,
5
5
  formatZodError,
6
6
  resolveInsideRoot
7
- } from "./chunk-2BPXUVJM.js";
7
+ } from "./chunk-FYMHYIMX.js";
8
8
 
9
9
  // src/security/ast-rule-runner.ts
10
10
  import { existsSync } from "node:fs";
@@ -241,4 +241,4 @@ export {
241
241
  collectAstQaFindings,
242
242
  runAstQaRules
243
243
  };
244
- //# sourceMappingURL=chunk-WZRHDRV4.js.map
244
+ //# sourceMappingURL=chunk-26YUABXD.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  ensureGatewayDiscovered,
3
3
  gatewayDiscoveryGeneration
4
- } from "./chunk-BIKYXRH2.js";
4
+ } from "./chunk-KIJY44AB.js";
5
5
  import {
6
6
  createLogger,
7
7
  getTimeProvider,
8
8
  isRateLimitText,
9
9
  resolveCliSlot
10
- } from "./chunk-2BPXUVJM.js";
10
+ } from "./chunk-FYMHYIMX.js";
11
11
 
12
12
  // src/pipeline/expert-access-mode.ts
13
13
  var logger = createLogger({ component: "expert-bridge" });
@@ -78,7 +78,7 @@ async function dispatchWithMcpConfig(router, content, expertType, start, options
78
78
  let config;
79
79
  if (requestedAccessModeOf(options) === "default") {
80
80
  try {
81
- const { generateMcpConfig } = await import("./child-mcp-config-22JSAQEB.js");
81
+ const { generateMcpConfig } = await import("./child-mcp-config-ZAVMFMHC.js");
82
82
  config = await generateMcpConfig();
83
83
  activeMcpConfigs.add(config);
84
84
  } catch (error) {
@@ -167,8 +167,8 @@ async function getRouter() {
167
167
  }
168
168
  if (cachedRouter !== null) return cachedRouter;
169
169
  routerInitPromise ??= (async () => {
170
- const { createAllAdapters } = await import("./factory-V7HIMUES.js");
171
- const { createCompositeRouter } = await import("./composite-router-W6RBM4TI.js");
170
+ const { createAllAdapters } = await import("./factory-NDYEOO6R.js");
171
+ const { createCompositeRouter } = await import("./composite-router-WAJXYCCX.js");
172
172
  const adapters = createAllAdapters();
173
173
  const superseded = generation !== routerGeneration;
174
174
  if (adapters.size === 0) {
@@ -179,7 +179,7 @@ async function getRouter() {
179
179
  if (superseded) return router;
180
180
  cachedRouter = router;
181
181
  try {
182
- const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-PDO5XCIR.js");
182
+ const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-WIQOCIV3.js");
183
183
  cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
184
184
  } catch (error) {
185
185
  const msg = error instanceof Error ? error.message : String(error);
@@ -320,4 +320,4 @@ export {
320
320
  tokenSplitFromUsage,
321
321
  executeExpert
322
322
  };
323
- //# sourceMappingURL=chunk-QNQPBSCF.js.map
323
+ //# sourceMappingURL=chunk-37PFBRXG.js.map
@@ -7,7 +7,7 @@ import {
7
7
  toSdkCallback,
8
8
  toolStructuredError,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-K42B7HPT.js";
10
+ } from "./chunk-DW4QUBLP.js";
11
11
  import {
12
12
  JsonlStore,
13
13
  SECURITY_KEYWORDS,
@@ -21,7 +21,7 @@ import {
21
21
  hasMeasuredCategory,
22
22
  isDeclaredNeverDeprecate,
23
23
  isRegisteredToolName
24
- } from "./chunk-2BPXUVJM.js";
24
+ } from "./chunk-FYMHYIMX.js";
25
25
  import {
26
26
  getNexusDataDir,
27
27
  nexusDataPath
@@ -2431,4 +2431,4 @@ export {
2431
2431
  runImprovementReview,
2432
2432
  registerImprovementReviewTool
2433
2433
  };
2434
- //# sourceMappingURL=chunk-3AF4P6MX.js.map
2434
+ //# sourceMappingURL=chunk-3RVR6TNF.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-KU6YFABH.js";
4
+ } from "./chunk-R6K2MRFJ.js";
5
5
  import {
6
6
  ReputationCache,
7
7
  assessReputation,
@@ -9,10 +9,10 @@ import {
9
9
  resolveEnvMode,
10
10
  resolveReputationGatingMode,
11
11
  sanitizeInput
12
- } from "./chunk-XPWXLRHT.js";
12
+ } from "./chunk-Z2T54LTR.js";
13
13
  import {
14
14
  hasToken
15
- } from "./chunk-WUSO67N4.js";
15
+ } from "./chunk-DVPTF7E2.js";
16
16
  import {
17
17
  toContentTrustProvenanceRecord
18
18
  } from "./chunk-ZO6ZKR7L.js";
@@ -27,7 +27,7 @@ import {
27
27
  getErrorMessage,
28
28
  getTimeProvider,
29
29
  ok
30
- } from "./chunk-2BPXUVJM.js";
30
+ } from "./chunk-FYMHYIMX.js";
31
31
  import {
32
32
  CLI_SUBPROCESS_TIMEOUTS
33
33
  } from "./chunk-4PN3UVZV.js";
@@ -2663,4 +2663,4 @@ export {
2663
2663
  IssueTriage,
2664
2664
  createIssueTriage
2665
2665
  };
2666
- //# sourceMappingURL=chunk-YTLV5RA7.js.map
2666
+ //# sourceMappingURL=chunk-4LOCKA6Z.js.map
@@ -4,10 +4,10 @@ import {
4
4
  loadPapersRegistry,
5
5
  loadTechniquesRegistry,
6
6
  savePapersRegistry
7
- } from "./chunk-3MGZBCTX.js";
7
+ } from "./chunk-G32F24ON.js";
8
8
  import {
9
9
  resolveToken
10
- } from "./chunk-WUSO67N4.js";
10
+ } from "./chunk-DVPTF7E2.js";
11
11
  import {
12
12
  getTsMorph
13
13
  } from "./chunk-W654ME6B.js";
@@ -18,7 +18,7 @@ import {
18
18
  rankedItemTrustTier,
19
19
  trustTierLabel,
20
20
  withoutUntrustedMemory
21
- } from "./chunk-JBLBDHOW.js";
21
+ } from "./chunk-6JDBJO7N.js";
22
22
  import {
23
23
  extractSystemPrompt,
24
24
  generateCacheKey,
@@ -43,12 +43,7 @@ import {
43
43
  sigmoidConfidence,
44
44
  tokenizeFiltered,
45
45
  truncateSentence
46
- } from "./chunk-2BPXUVJM.js";
47
- import {
48
- API_TIMEOUTS,
49
- CLI_NAMES,
50
- CLI_SUBPROCESS_TIMEOUTS
51
- } from "./chunk-4PN3UVZV.js";
46
+ } from "./chunk-FYMHYIMX.js";
52
47
  import {
53
48
  ensureLearningDir,
54
49
  getRulesFile
@@ -57,6 +52,11 @@ import {
57
52
  nexusDataPath,
58
53
  parseBoolEnv
59
54
  } from "./chunk-LWOX65CP.js";
55
+ import {
56
+ API_TIMEOUTS,
57
+ CLI_NAMES,
58
+ CLI_SUBPROCESS_TIMEOUTS
59
+ } from "./chunk-4PN3UVZV.js";
60
60
 
61
61
  // src/learning/strategy-distiller-persistence.ts
62
62
  import { writeFileSync, readFileSync, renameSync, unlinkSync, existsSync } from "node:fs";
@@ -4289,4 +4289,4 @@ export {
4289
4289
  DEFAULT_CONTEXT_BUDGET_TOKENS,
4290
4290
  getContextPromptPrefix
4291
4291
  };
4292
- //# sourceMappingURL=chunk-DXA6KCY4.js.map
4292
+ //# sourceMappingURL=chunk-5TIVCAPR.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-ZO6ZKR7L.js";
4
4
  import {
5
5
  SessionMemory
6
- } from "./chunk-GZGKTVSJ.js";
6
+ } from "./chunk-GZISUG3E.js";
7
7
  import {
8
8
  TRUST_TIER_NUMERIC,
9
9
  TrustTierSchema
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-ROYGBFVE.js";
18
18
  import {
19
19
  generateId
20
- } from "./chunk-LU4RNF7J.js";
20
+ } from "./chunk-MQKHFDCM.js";
21
21
  import {
22
22
  ErrorCode,
23
23
  NexusError,
@@ -34,7 +34,7 @@ import {
34
34
  stringifyValue,
35
35
  tokenize,
36
36
  tokenizeFiltered
37
- } from "./chunk-2BPXUVJM.js";
37
+ } from "./chunk-FYMHYIMX.js";
38
38
  import {
39
39
  nexusDataPath
40
40
  } from "./chunk-LWOX65CP.js";
@@ -5841,4 +5841,4 @@ export {
5841
5841
  shutdownToolMemory,
5842
5842
  ToolMemoryManager
5843
5843
  };
5844
- //# sourceMappingURL=chunk-JBLBDHOW.js.map
5844
+ //# sourceMappingURL=chunk-6JDBJO7N.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadPapersRegistry
3
- } from "./chunk-3MGZBCTX.js";
3
+ } from "./chunk-G32F24ON.js";
4
4
  import {
5
5
  getErrorMessage
6
- } from "./chunk-2BPXUVJM.js";
6
+ } from "./chunk-FYMHYIMX.js";
7
7
 
8
8
  // src/cli/research-helpers-synthesize.ts
9
9
  import { z } from "zod";
@@ -876,4 +876,4 @@ export {
876
876
  AttributedInsightSchema,
877
877
  synthesizeResearch
878
878
  };
879
- //# sourceMappingURL=chunk-UMICLEEK.js.map
879
+ //# sourceMappingURL=chunk-7TWS65XL.js.map
@@ -0,0 +1,227 @@
1
+ import {
2
+ CircuitBreakerRegistry,
3
+ CircuitError,
4
+ CircuitErrorCode,
5
+ breakerKeys,
6
+ createLogger,
7
+ err,
8
+ gatewayServedSlotOf,
9
+ getErrorMessage,
10
+ getFallbackChainForCategory,
11
+ getTimeProvider,
12
+ isCallerCancelled,
13
+ isCallerInputCliError,
14
+ mapCliErrorToCategory,
15
+ ok,
16
+ resolveGatewayServedSlot,
17
+ unenforcedAccessModeRefusal
18
+ } from "./chunk-FYMHYIMX.js";
19
+
20
+ // src/cli-adapters/cli-circuit-breaker.ts
21
+ var CATEGORY_TO_FALLBACK = {
22
+ code_generation: "code",
23
+ code_review: "code",
24
+ testing: "code",
25
+ research: "research",
26
+ exploration: "research",
27
+ documentation: "documentation",
28
+ architecture: "analysis",
29
+ security_review: "analysis",
30
+ planning: "analysis",
31
+ devops: "general"
32
+ };
33
+ var DEFAULT_FALLBACK_CHAIN = ["claude", "gemini", "codex", "opencode"];
34
+ var DEFAULT_CONFIG = {
35
+ perCliConfig: {},
36
+ fallbackChain: DEFAULT_FALLBACK_CHAIN,
37
+ enableFallback: true,
38
+ maxFallbackAttempts: 2
39
+ };
40
+ var defaultCliCircuitBreakerRegistry = new CircuitBreakerRegistry();
41
+ var registryLogger = createLogger({ component: "cli-circuit-breaker" });
42
+ defaultCliCircuitBreakerRegistry.addGlobalStateChangeListener((event) => {
43
+ registryLogger.warn("CLI circuit state changed", {
44
+ cli: event.cliName,
45
+ previousState: event.previousState,
46
+ newState: event.newState,
47
+ failureCount: event.failureCount,
48
+ reason: event.reason
49
+ });
50
+ });
51
+ function getDefaultCliCircuitBreakerRegistry() {
52
+ return defaultCliCircuitBreakerRegistry;
53
+ }
54
+ function getCliCircuitBreakerSnapshot(cliName) {
55
+ return defaultCliCircuitBreakerRegistry.getAllSnapshots().get(cliName);
56
+ }
57
+ var CliCircuitBreakerIntegration = class {
58
+ registry;
59
+ adapters = /* @__PURE__ */ new Map();
60
+ config;
61
+ logger;
62
+ constructor(adapters, config, logger) {
63
+ this.config = { ...DEFAULT_CONFIG, ...config };
64
+ this.logger = logger ?? createLogger({ component: "cli-circuit-breaker-integration" });
65
+ this.registry = config === void 0 ? defaultCliCircuitBreakerRegistry : new CircuitBreakerRegistry();
66
+ for (const adapter of adapters) {
67
+ this.adapters.set(adapter.name, adapter);
68
+ this.breakerFor(adapter);
69
+ }
70
+ }
71
+ async execute(adapter, task, taskCategory) {
72
+ const primaryCli = adapter.name;
73
+ const fallbackAttempts = [];
74
+ let lastError;
75
+ const primaryResult = await this.executeWithBreaker(adapter, task);
76
+ if (primaryResult.ok) {
77
+ return ok({ response: primaryResult.value, executedBy: primaryCli, usedFallback: false });
78
+ }
79
+ lastError = primaryResult.error;
80
+ if (!this.config.enableFallback || !(lastError instanceof CircuitError)) {
81
+ return err(lastError);
82
+ }
83
+ for (const cli of this.getFallbackClis(primaryCli, taskCategory, task).slice(
84
+ 0,
85
+ this.config.maxFallbackAttempts
86
+ )) {
87
+ const fallbackAdapter = this.adapters.get(cli);
88
+ if (!fallbackAdapter) continue;
89
+ fallbackAttempts.push(cli);
90
+ this.logger.info("Attempting fallback", { from: primaryCli, to: cli });
91
+ const result = await this.executeWithBreaker(fallbackAdapter, task);
92
+ if (result.ok) {
93
+ return ok({
94
+ response: result.value,
95
+ executedBy: cli,
96
+ usedFallback: true,
97
+ fallbackAttempts
98
+ });
99
+ }
100
+ lastError = result.error;
101
+ }
102
+ this.logger.warn("All fallback attempts failed", { primaryCli, fallbackAttempts });
103
+ return err(lastError);
104
+ }
105
+ getHealthStatus() {
106
+ const clis = [];
107
+ let healthyCount = 0;
108
+ for (const [name, adapter] of this.adapters) {
109
+ const snapshot = this.breakerFor(adapter).breaker.getSnapshot();
110
+ const healthy = snapshot.state === "closed";
111
+ if (healthy) healthyCount++;
112
+ clis.push({
113
+ name,
114
+ healthy,
115
+ circuitState: snapshot.state,
116
+ failureCount: snapshot.failureCount,
117
+ lastFailureTime: snapshot.lastFailureTime
118
+ });
119
+ }
120
+ return {
121
+ clis,
122
+ systemHealthy: healthyCount > 0,
123
+ healthyCount,
124
+ timestamp: getTimeProvider().now()
125
+ };
126
+ }
127
+ getCircuitSnapshots() {
128
+ const snapshots = /* @__PURE__ */ new Map();
129
+ for (const [name, adapter] of this.adapters) {
130
+ snapshots.set(name, this.breakerFor(adapter).breaker.getSnapshot());
131
+ }
132
+ return snapshots;
133
+ }
134
+ resetCircuit(cliName) {
135
+ const adapter = this.adapters.get(cliName);
136
+ this.registry.resetArm(adapter === void 0 ? cliName : this.breakerFor(adapter).key);
137
+ this.logger.info("Circuit reset", { cliName });
138
+ }
139
+ resetAllCircuits() {
140
+ this.registry.resetAll();
141
+ this.logger.info("All circuits reset");
142
+ }
143
+ addStateChangeListener(listener) {
144
+ this.registry.addGlobalStateChangeListener(listener);
145
+ }
146
+ async executeWithBreaker(adapter, task) {
147
+ let { key, breaker } = this.breakerFor(adapter, task);
148
+ let execResult;
149
+ let targetResolved = false;
150
+ try {
151
+ await resolveGatewayServedSlot(adapter);
152
+ const refusal = await this.prepareImplicitRoute(adapter, task);
153
+ if (refusal !== void 0) return err(refusal);
154
+ targetResolved = true;
155
+ ({ key, breaker } = this.breakerFor(adapter, task));
156
+ const canRun = breaker.canExecute();
157
+ if (!canRun.ok) return canRun;
158
+ execResult = await adapter.execute(task);
159
+ } catch (error) {
160
+ if (targetResolved) breaker.recordFailure("unknown");
161
+ return err(
162
+ new CircuitError(`CLI execution threw unexpectedly: ${getErrorMessage(error)}`, {
163
+ circuitErrorCode: CircuitErrorCode.EXECUTION_FAILED,
164
+ cliName: adapter.name,
165
+ armId: key,
166
+ circuitState: breaker.getState(),
167
+ cause: error instanceof Error ? error : new Error(String(error))
168
+ })
169
+ );
170
+ }
171
+ return this.recordOutcome(adapter, breaker, execResult);
172
+ }
173
+ /** Resolve an implicit OpenCode route before gating, preserving access refusals. */
174
+ async prepareImplicitRoute(adapter, task) {
175
+ if (adapter.name !== "opencode" || task.model !== void 0) return void 0;
176
+ const refusal = unenforcedAccessModeRefusal(adapter, task);
177
+ if (refusal !== void 0) return refusal;
178
+ await adapter.initialize();
179
+ return void 0;
180
+ }
181
+ recordOutcome(adapter, breaker, execResult) {
182
+ const recordsOutcome = this.ownsBreakerOutcome(adapter);
183
+ if (!execResult.ok) {
184
+ if (isCallerInputCliError(execResult.error) || isCallerCancelled(execResult.error)) {
185
+ breaker.releaseHalfOpenProbe();
186
+ return err(execResult.error);
187
+ }
188
+ if (recordsOutcome) breaker.recordFailure(mapCliErrorToCategory(execResult.error.code));
189
+ return err(execResult.error);
190
+ }
191
+ if (recordsOutcome) breaker.recordSuccess();
192
+ return ok(execResult.value);
193
+ }
194
+ breakerFor(adapter, task) {
195
+ const key = breakerKeys.forArm({
196
+ name: adapter.name,
197
+ model: task?.model ?? adapter.getModelInfo?.().id,
198
+ gatewayArm: gatewayServedSlotOf(adapter)?.arm
199
+ });
200
+ return {
201
+ key,
202
+ breaker: this.registry.getArmBreaker(key, this.config.perCliConfig[adapter.name])
203
+ };
204
+ }
205
+ /** Marked gateway slots record in the shared registry; private registries own their records. */
206
+ ownsBreakerOutcome(adapter) {
207
+ return this.registry !== defaultCliCircuitBreakerRegistry || gatewayServedSlotOf(adapter)?.arm === void 0;
208
+ }
209
+ getFallbackClis(excludeCli, taskCategory, task) {
210
+ const chain = taskCategory !== void 0 ? getFallbackChainForCategory(taskCategory, CATEGORY_TO_FALLBACK[taskCategory]) : this.config.fallbackChain;
211
+ return [...chain].filter((cli) => {
212
+ const adapter = this.adapters.get(cli);
213
+ return cli !== excludeCli && adapter !== void 0 && !this.registry.isArmOpen(this.breakerFor(adapter, task).key);
214
+ });
215
+ }
216
+ };
217
+ function createCliCircuitBreakerIntegration(adapters, config, logger) {
218
+ return new CliCircuitBreakerIntegration(adapters, config, logger);
219
+ }
220
+
221
+ export {
222
+ getDefaultCliCircuitBreakerRegistry,
223
+ getCliCircuitBreakerSnapshot,
224
+ CliCircuitBreakerIntegration,
225
+ createCliCircuitBreakerIntegration
226
+ };
227
+ //# sourceMappingURL=chunk-A4LJDRY7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-adapters/cli-circuit-breaker.ts"],"sourcesContent":["/**\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 {\n ICliAdapter,\n CliName,\n CliTask,\n CliResponse,\n CliError,\n ObservedArmId,\n} from './types.js';\nimport { breakerKeys } from './breaker-key.js';\nimport { gatewayServedSlotOf, resolveGatewayServedSlot } from './gateway-slot-arm.js';\nimport {\n CircuitBreakerRegistry,\n CircuitError,\n CircuitErrorCode,\n mapCliErrorToCategory,\n type CliCircuitBreaker,\n type CircuitBreakerConfig,\n type CircuitBreakerSnapshot,\n type CircuitStateChangeListener,\n} from './circuit-breaker.js';\nimport { isCallerInputCliError } from './cli-error-helpers.js';\nimport { isCallerCancelled } from '../adapters/abort-utils.js';\nimport { unenforcedAccessModeRefusal } from './access-mode.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.breakerFor(adapter);\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, task).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 clis: CliCircuitHealthStatus['clis'][number][] = [];\n let healthyCount = 0;\n for (const [name, adapter] of this.adapters) {\n const snapshot = this.breakerFor(adapter).breaker.getSnapshot();\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 snapshots = new Map<CliName, CircuitBreakerSnapshot>();\n for (const [name, adapter] of this.adapters) {\n snapshots.set(name, this.breakerFor(adapter).breaker.getSnapshot());\n }\n return snapshots;\n }\n\n resetCircuit(cliName: CliName): void {\n const adapter = this.adapters.get(cliName);\n this.registry.resetArm(adapter === undefined ? cliName : this.breakerFor(adapter).key);\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 let { key, breaker } = this.breakerFor(adapter, task);\n let execResult: Result<CliResponse, CliError>;\n let targetResolved = false;\n try {\n await resolveGatewayServedSlot(adapter);\n const refusal = await this.prepareImplicitRoute(adapter, task);\n if (refusal !== undefined) return err(refusal);\n targetResolved = true;\n ({ key, breaker } = this.breakerFor(adapter, task));\n const canRun = breaker.canExecute();\n if (!canRun.ok) return canRun;\n execResult = await adapter.execute(task);\n } catch (error) {\n // A rejected availability probe has not selected a failure domain.\n // Never charge the provisional plain CLI breaker for that probe.\n if (targetResolved) 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: key,\n circuitState: breaker.getState(),\n cause: error instanceof Error ? error : new Error(String(error)),\n })\n );\n }\n\n return this.recordOutcome(adapter, breaker, execResult);\n }\n\n /** Resolve an implicit OpenCode route before gating, preserving access refusals. */\n private async prepareImplicitRoute(\n adapter: ICliAdapter,\n task: CliTask\n ): Promise<CliError | undefined> {\n if (adapter.name !== 'opencode' || task.model !== undefined) return undefined;\n const refusal = unenforcedAccessModeRefusal(adapter, task);\n if (refusal !== undefined) return refusal;\n // A missing/cooled configured model omits --model and runs the default.\n await adapter.initialize();\n return undefined;\n }\n\n private recordOutcome(\n adapter: ICliAdapter,\n breaker: CliCircuitBreaker,\n execResult: Result<CliResponse, CliError>\n ): Result<CliResponse, CliError> {\n const recordsOutcome = this.ownsBreakerOutcome(adapter);\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. #6691: nor\n // must a call its caller cancelled.\n if (isCallerInputCliError(execResult.error) || isCallerCancelled(execResult.error)) {\n breaker.releaseHalfOpenProbe();\n return err(execResult.error);\n }\n if (recordsOutcome) breaker.recordFailure(mapCliErrorToCategory(execResult.error.code));\n return err(execResult.error);\n }\n\n if (recordsOutcome) breaker.recordSuccess();\n return ok(execResult.value);\n }\n\n private breakerFor(\n adapter: Pick<ICliAdapter, 'name'> & Partial<Pick<ICliAdapter, 'getModelInfo'>>,\n task?: CliTask\n ): {\n key: ObservedArmId;\n breaker: CliCircuitBreaker;\n } {\n const key = breakerKeys.forArm({\n name: adapter.name,\n model: task?.model ?? adapter.getModelInfo?.().id,\n gatewayArm: gatewayServedSlotOf(adapter)?.arm,\n });\n return {\n key,\n breaker: this.registry.getArmBreaker(key, this.config.perCliConfig[adapter.name]),\n };\n }\n\n /** Marked gateway slots record in the shared registry; private registries own their records. */\n private ownsBreakerOutcome(adapter: ICliAdapter): boolean {\n return (\n this.registry !== defaultCliCircuitBreakerRegistry ||\n gatewayServedSlotOf(adapter)?.arm === undefined\n );\n }\n\n private getFallbackClis(\n excludeCli: CliName,\n taskCategory?: TaskCategory,\n task?: CliTask\n ): CliName[] {\n const chain =\n taskCategory !== undefined\n ? getFallbackChainForCategory(taskCategory, CATEGORY_TO_FALLBACK[taskCategory])\n : this.config.fallbackChain;\n return [...chain].filter((cli) => {\n const adapter = this.adapters.get(cli);\n return (\n cli !== excludeCli &&\n adapter !== undefined &&\n !this.registry.isArmOpen(this.breakerFor(adapter, task).key)\n );\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,19 +2,16 @@ import {
2
2
  ensureGatewayDiscovered,
3
3
  gatewayDiscoveryStatus,
4
4
  getAvailabilityCache
5
- } from "./chunk-BIKYXRH2.js";
5
+ } from "./chunk-KIJY44AB.js";
6
6
  import {
7
7
  extractSystemPrompt
8
8
  } from "./chunk-QZUG667L.js";
9
9
  import {
10
10
  CUSTOM_API_DEFAULT_MODEL
11
- } from "./chunk-2767DZTS.js";
11
+ } from "./chunk-PRX4ERTK.js";
12
12
  import {
13
13
  nexusMkdtempSync
14
14
  } from "./chunk-JPFRRNRR.js";
15
- import {
16
- probeCli
17
- } from "./chunk-TW6PJYTP.js";
18
15
  import {
19
16
  AdapterModelError,
20
17
  BaseAdapter,
@@ -25,7 +22,7 @@ import {
25
22
  requireApiKey,
26
23
  validateApiKeyPresence,
27
24
  withGatewayUsageRecording
28
- } from "./chunk-7PBAI2ZR.js";
25
+ } from "./chunk-YKW32JWJ.js";
29
26
  import {
30
27
  assertCustomApiHostResolvesPublic,
31
28
  hostnameOf,
@@ -34,7 +31,10 @@ import {
34
31
  readGatewayEnv,
35
32
  redactApiKey,
36
33
  validateCustomApiBaseUrl
37
- } from "./chunk-MNSD55T5.js";
34
+ } from "./chunk-LBDXYMXS.js";
35
+ import {
36
+ probeCli
37
+ } from "./chunk-TW6PJYTP.js";
38
38
  import {
39
39
  BaseCliAdapter,
40
40
  ClaudeCliAdapter,
@@ -46,16 +46,16 @@ import {
46
46
  getTimeoutForTask,
47
47
  listModelsForCli,
48
48
  spawnCwd
49
- } from "./chunk-Y2MLZFUZ.js";
49
+ } from "./chunk-RIJFSLQ2.js";
50
+ import {
51
+ getCliCircuitBreakerSnapshot
52
+ } from "./chunk-A4LJDRY7.js";
50
53
  import {
51
54
  sanitizeOutput
52
- } from "./chunk-3JUZTVTP.js";
55
+ } from "./chunk-Y7ZQ2FXW.js";
53
56
  import {
54
57
  CliCircuitBreaker,
55
58
  DEFAULT_CIRCUIT_BREAKER_CONFIG,
56
- getCliCircuitBreakerSnapshot
57
- } from "./chunk-JILYBR2Z.js";
58
- import {
59
59
  ErrorCode,
60
60
  FALLBACK_CONTEXT_WINDOW,
61
61
  FALLBACK_MAX_OUTPUT,
@@ -106,7 +106,7 @@ import {
106
106
  unenforcedAccessModeRefusal,
107
107
  warnIfGatewayCostUndeclared,
108
108
  withEnforcedAccessMode
109
- } from "./chunk-2BPXUVJM.js";
109
+ } from "./chunk-FYMHYIMX.js";
110
110
  import {
111
111
  CLI_NAMES,
112
112
  CLI_SUBPROCESS_TIMEOUTS,
@@ -3729,14 +3729,16 @@ var OpenCodeCliAdapter = class extends SubprocessCliAdapter {
3729
3729
  this.model = options?.model ?? getCliModelName(getDefaultModelForCli("opencode"));
3730
3730
  }
3731
3731
  /**
3732
- * Gets OpenCode model information from canonical registry.
3732
+ * Gets the implicit route's model information from the canonical registry.
3733
+ * After inventory probing, an unusable configured model runs the default.
3733
3734
  */
3734
3735
  getModelInfo() {
3735
- const fromRegistry = buildModelInfo("opencode", this.model);
3736
+ const model = this.availableModels !== void 0 && !this.isModelUsable(resolveOpenCodeModel(this.model)) ? getCliModelName(getDefaultModelForCli("opencode")) : this.model;
3737
+ const fromRegistry = buildModelInfo("opencode", model);
3736
3738
  if (fromRegistry !== void 0) return fromRegistry;
3737
3739
  return {
3738
- id: this.model,
3739
- name: `OpenCode (${this.model})`,
3740
+ id: model,
3741
+ name: `OpenCode (${model})`,
3740
3742
  contextWindow: FALLBACK_CONTEXT_WINDOW,
3741
3743
  maxOutput: FALLBACK_MAX_OUTPUT,
3742
3744
  // OpenCode pricing fallback is adapter-specific (not the Claude 5/25).
@@ -3749,6 +3751,7 @@ var OpenCodeCliAdapter = class extends SubprocessCliAdapter {
3749
3751
  * Warns if Anthropic provider is configured (#1429 — API key boundaries).
3750
3752
  */
3751
3753
  async initialize() {
3754
+ if (this.initialized) return;
3752
3755
  this.availableModels = await probeAvailableModels();
3753
3756
  warnIfAnthropicProvider(this.availableModels);
3754
3757
  await super.initialize();
@@ -3813,8 +3816,16 @@ var OpenCodeCliAdapter = class extends SubprocessCliAdapter {
3813
3816
  * model the path is unchanged.
3814
3817
  */
3815
3818
  async execute(task, options) {
3816
- if (task.model === void 0) return super.execute(task, options);
3819
+ if (task.model === void 0) {
3820
+ const refusal = await this.accessModeRefusal(task);
3821
+ if (refusal !== void 0) return err(refusal);
3822
+ }
3817
3823
  if (!this.initialized) await this.initialize();
3824
+ if (task.model === void 0) {
3825
+ const cliModel = resolveOpenCodeModel(this.model);
3826
+ const effectiveTask = this.isModelUsable(cliModel) ? { ...task, model: cliModel } : task;
3827
+ return super.execute(effectiveTask, options);
3828
+ }
3818
3829
  const resolved = this.resolveRequestedModel(task.model);
3819
3830
  if (!resolved.ok) return resolved;
3820
3831
  const { cliId, reportedAs } = resolved.value;
@@ -4115,4 +4126,4 @@ export {
4115
4126
  SdkAdapter,
4116
4127
  createAutoAdapter
4117
4128
  };
4118
- //# sourceMappingURL=chunk-CV2K4JWL.js.map
4129
+ //# sourceMappingURL=chunk-ASEDGRDA.js.map