nexus-agents 8.53.4 → 8.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/{ast-rule-runner-PELERN3O.js → ast-rule-runner-O662YIWH.js} +3 -3
  2. package/dist/{child-mcp-config-RYQSABJT.js → child-mcp-config-TAVB7ICF.js} +2 -2
  3. package/dist/{chunk-XYK2GPUF.js → chunk-2DFG2IDE.js} +2 -2
  4. package/dist/{chunk-WAVAOSH5.js → chunk-2LTE4FRY.js} +7 -7
  5. package/dist/{chunk-33RHZITC.js → chunk-2NKV7GWF.js} +2 -2
  6. package/dist/{chunk-JIUX35FD.js → chunk-34T342GH.js} +3 -3
  7. package/dist/{chunk-R4ITN2N2.js → chunk-35U4M4YF.js} +4 -4
  8. package/dist/{chunk-SKUCBZI5.js → chunk-3BTD6HDP.js} +151 -40
  9. package/dist/chunk-3BTD6HDP.js.map +1 -0
  10. package/dist/{chunk-TS4GGKYN.js → chunk-3FAK4CZI.js} +2 -2
  11. package/dist/{chunk-2WCWSJES.js → chunk-3VIEHYNH.js} +5 -5
  12. package/dist/{chunk-NBQ457TC.js → chunk-42XZ33YH.js} +6 -6
  13. package/dist/{chunk-2RLHE2AN.js → chunk-4C4BKY35.js} +9 -9
  14. package/dist/{chunk-WWZKWC2Z.js → chunk-AMPKDK4X.js} +3 -3
  15. package/dist/{chunk-M6VNZD43.js → chunk-BAH7SLHC.js} +36 -36
  16. package/dist/{chunk-XBSPEJ23.js → chunk-C5VV4BYU.js} +2 -2
  17. package/dist/{chunk-YKCVPCLR.js → chunk-EQMBAF6Y.js} +2 -2
  18. package/dist/{chunk-54YTICHC.js → chunk-EZTD6X3P.js} +2 -2
  19. package/dist/{chunk-5EEP73OA.js → chunk-FL5QS2FN.js} +2 -2
  20. package/dist/{chunk-3IYEZ2PK.js → chunk-GNBK6OCF.js} +2 -2
  21. package/dist/{chunk-NGXHFMA6.js → chunk-I3C4CMEA.js} +5 -3
  22. package/dist/{chunk-NGXHFMA6.js.map → chunk-I3C4CMEA.js.map} +1 -1
  23. package/dist/{chunk-X5R6QOF2.js → chunk-PLAU4ZYK.js} +2 -2
  24. package/dist/{chunk-XMMRINZK.js → chunk-QOXO4PHO.js} +2 -2
  25. package/dist/{chunk-J45ABSJ6.js → chunk-RPHVUPZ7.js} +2 -2
  26. package/dist/{chunk-THPZO2XW.js → chunk-RWMWQGPI.js} +4 -4
  27. package/dist/{chunk-USHZGWDJ.js → chunk-SNOZB4FU.js} +20 -11
  28. package/dist/chunk-SNOZB4FU.js.map +1 -0
  29. package/dist/{chunk-XM5MYAMC.js → chunk-SO5VA6XR.js} +2 -2
  30. package/dist/{chunk-X5IOLM33.js → chunk-UGBSTL7K.js} +2 -2
  31. package/dist/{chunk-SKUIP3ER.js → chunk-UQ5QN6ML.js} +2 -2
  32. package/dist/{chunk-GE4KNPPO.js → chunk-UVN7V7WQ.js} +2 -2
  33. package/dist/{chunk-CTLBZ33K.js → chunk-WAUP2RBW.js} +5 -5
  34. package/dist/{chunk-3PLSFD3D.js → chunk-WFZIQMCH.js} +2 -2
  35. package/dist/{chunk-ELBJDCC7.js → chunk-WGN2GCQE.js} +2 -2
  36. package/dist/{chunk-ECVWK52H.js → chunk-WKTC37PV.js} +2 -2
  37. package/dist/{chunk-3JFRPAYE.js → chunk-YB74LXLF.js} +4 -4
  38. package/dist/{chunk-N6NHQWQR.js → chunk-YC3TZ5N2.js} +2 -2
  39. package/dist/{chunk-QMHL5IYT.js → chunk-YDJQBOYE.js} +3 -3
  40. package/dist/{chunk-6GLEQDA7.js → chunk-ZOJWE5AB.js} +4 -4
  41. package/dist/{cli-circuit-breaker-D7NZ7YF3.js → cli-circuit-breaker-IEAKDBEX.js} +3 -3
  42. package/dist/cli.d.ts +1 -1
  43. package/dist/cli.js +68 -53
  44. package/dist/cli.js.map +1 -1
  45. package/dist/{composite-router-JRFBB5YP.js → composite-router-A7LIM76Z.js} +2 -2
  46. package/dist/{consensus-vote-I5CZQNJV.js → consensus-vote-RBJKBRHH.js} +17 -17
  47. package/dist/{consensus-vote-types-CA7Xuzl3.d.ts → consensus-vote-types-CXSFJkat.d.ts} +91 -0
  48. package/dist/{context-retriever-BIAAVT6X.js → context-retriever-766P6Q5N.js} +8 -8
  49. package/dist/{doctor-deep-PLJHEYWB.js → doctor-deep-O4H5EHJU.js} +3 -3
  50. package/dist/{doctor-live-JTSQWZ2L.js → doctor-live-EEJFWBO3.js} +10 -10
  51. package/dist/{expert-bridge-VLEDZGPA.js → expert-bridge-5WFR7CU7.js} +4 -4
  52. package/dist/{factory-EUZWJNFU.js → factory-DRAOHRNW.js} +9 -9
  53. package/dist/{factory-KBUTXBHE.js → factory-QMGXR4O3.js} +5 -5
  54. package/dist/{improvement-review-MD3UPWNW.js → improvement-review-SYSTVQ5V.js} +6 -6
  55. package/dist/index.d.ts +10 -2
  56. package/dist/index.js +32 -32
  57. package/dist/{init-opencode-WMDH2ZUK.js → init-opencode-2M52KWAW.js} +6 -6
  58. package/dist/issue-triage-YMGSB67V.js +17 -0
  59. package/dist/{pr-reviewer-helpers-JWJ4HVPW.js → pr-reviewer-helpers-7Z4YCH7M.js} +4 -4
  60. package/dist/{registry-command-IFZYXY5Y.js → registry-command-BFIP4H5K.js} +2 -2
  61. package/dist/{repo-security-plan-JKXJSVP2.js → repo-security-plan-YTH6WX2D.js} +3 -3
  62. package/dist/{research-helpers-synthesize-QI2V4GS6.js → research-helpers-synthesize-3F2V3UT4.js} +4 -4
  63. package/dist/{routing-memory-EFMYS572.js → routing-memory-BXPT2NGR.js} +2 -2
  64. package/dist/{session-memory-XO5T3PJD.js → session-memory-EMQDHMCG.js} +3 -3
  65. package/dist/{setup-config-JRFZ5LM3.js → setup-config-X2LBKED3.js} +3 -3
  66. package/dist/{setup-custom-api-FH2EM46D.js → setup-custom-api-SPNYKU3G.js} +4 -4
  67. package/dist/setup-data-dir-TB7MYUX2.js +31 -0
  68. package/dist/{tool-memory-JHJKFFIX.js → tool-memory-WOIZTLSM.js} +5 -5
  69. package/dist/{unified-registry-DPL6V77X.js → unified-registry-KPTDXCLT.js} +10 -10
  70. package/dist/{weather-report-CAHU2PCR.js → weather-report-HXMGZBOD.js} +2 -2
  71. package/package.json +1 -1
  72. package/dist/chunk-SKUCBZI5.js.map +0 -1
  73. package/dist/chunk-USHZGWDJ.js.map +0 -1
  74. package/dist/issue-triage-UNLRUO2O.js +0 -17
  75. package/dist/setup-data-dir-ZX2ZRKIW.js +0 -31
  76. /package/dist/{ast-rule-runner-PELERN3O.js.map → ast-rule-runner-O662YIWH.js.map} +0 -0
  77. /package/dist/{child-mcp-config-RYQSABJT.js.map → child-mcp-config-TAVB7ICF.js.map} +0 -0
  78. /package/dist/{chunk-XYK2GPUF.js.map → chunk-2DFG2IDE.js.map} +0 -0
  79. /package/dist/{chunk-WAVAOSH5.js.map → chunk-2LTE4FRY.js.map} +0 -0
  80. /package/dist/{chunk-33RHZITC.js.map → chunk-2NKV7GWF.js.map} +0 -0
  81. /package/dist/{chunk-JIUX35FD.js.map → chunk-34T342GH.js.map} +0 -0
  82. /package/dist/{chunk-R4ITN2N2.js.map → chunk-35U4M4YF.js.map} +0 -0
  83. /package/dist/{chunk-TS4GGKYN.js.map → chunk-3FAK4CZI.js.map} +0 -0
  84. /package/dist/{chunk-2WCWSJES.js.map → chunk-3VIEHYNH.js.map} +0 -0
  85. /package/dist/{chunk-NBQ457TC.js.map → chunk-42XZ33YH.js.map} +0 -0
  86. /package/dist/{chunk-2RLHE2AN.js.map → chunk-4C4BKY35.js.map} +0 -0
  87. /package/dist/{chunk-WWZKWC2Z.js.map → chunk-AMPKDK4X.js.map} +0 -0
  88. /package/dist/{chunk-M6VNZD43.js.map → chunk-BAH7SLHC.js.map} +0 -0
  89. /package/dist/{chunk-XBSPEJ23.js.map → chunk-C5VV4BYU.js.map} +0 -0
  90. /package/dist/{chunk-YKCVPCLR.js.map → chunk-EQMBAF6Y.js.map} +0 -0
  91. /package/dist/{chunk-54YTICHC.js.map → chunk-EZTD6X3P.js.map} +0 -0
  92. /package/dist/{chunk-5EEP73OA.js.map → chunk-FL5QS2FN.js.map} +0 -0
  93. /package/dist/{chunk-3IYEZ2PK.js.map → chunk-GNBK6OCF.js.map} +0 -0
  94. /package/dist/{chunk-X5R6QOF2.js.map → chunk-PLAU4ZYK.js.map} +0 -0
  95. /package/dist/{chunk-XMMRINZK.js.map → chunk-QOXO4PHO.js.map} +0 -0
  96. /package/dist/{chunk-J45ABSJ6.js.map → chunk-RPHVUPZ7.js.map} +0 -0
  97. /package/dist/{chunk-THPZO2XW.js.map → chunk-RWMWQGPI.js.map} +0 -0
  98. /package/dist/{chunk-XM5MYAMC.js.map → chunk-SO5VA6XR.js.map} +0 -0
  99. /package/dist/{chunk-X5IOLM33.js.map → chunk-UGBSTL7K.js.map} +0 -0
  100. /package/dist/{chunk-SKUIP3ER.js.map → chunk-UQ5QN6ML.js.map} +0 -0
  101. /package/dist/{chunk-GE4KNPPO.js.map → chunk-UVN7V7WQ.js.map} +0 -0
  102. /package/dist/{chunk-CTLBZ33K.js.map → chunk-WAUP2RBW.js.map} +0 -0
  103. /package/dist/{chunk-3PLSFD3D.js.map → chunk-WFZIQMCH.js.map} +0 -0
  104. /package/dist/{chunk-ELBJDCC7.js.map → chunk-WGN2GCQE.js.map} +0 -0
  105. /package/dist/{chunk-ECVWK52H.js.map → chunk-WKTC37PV.js.map} +0 -0
  106. /package/dist/{chunk-3JFRPAYE.js.map → chunk-YB74LXLF.js.map} +0 -0
  107. /package/dist/{chunk-N6NHQWQR.js.map → chunk-YC3TZ5N2.js.map} +0 -0
  108. /package/dist/{chunk-QMHL5IYT.js.map → chunk-YDJQBOYE.js.map} +0 -0
  109. /package/dist/{chunk-6GLEQDA7.js.map → chunk-ZOJWE5AB.js.map} +0 -0
  110. /package/dist/{cli-circuit-breaker-D7NZ7YF3.js.map → cli-circuit-breaker-IEAKDBEX.js.map} +0 -0
  111. /package/dist/{composite-router-JRFBB5YP.js.map → composite-router-A7LIM76Z.js.map} +0 -0
  112. /package/dist/{consensus-vote-I5CZQNJV.js.map → consensus-vote-RBJKBRHH.js.map} +0 -0
  113. /package/dist/{context-retriever-BIAAVT6X.js.map → context-retriever-766P6Q5N.js.map} +0 -0
  114. /package/dist/{doctor-deep-PLJHEYWB.js.map → doctor-deep-O4H5EHJU.js.map} +0 -0
  115. /package/dist/{doctor-live-JTSQWZ2L.js.map → doctor-live-EEJFWBO3.js.map} +0 -0
  116. /package/dist/{expert-bridge-VLEDZGPA.js.map → expert-bridge-5WFR7CU7.js.map} +0 -0
  117. /package/dist/{factory-EUZWJNFU.js.map → factory-DRAOHRNW.js.map} +0 -0
  118. /package/dist/{factory-KBUTXBHE.js.map → factory-QMGXR4O3.js.map} +0 -0
  119. /package/dist/{improvement-review-MD3UPWNW.js.map → improvement-review-SYSTVQ5V.js.map} +0 -0
  120. /package/dist/{init-opencode-WMDH2ZUK.js.map → init-opencode-2M52KWAW.js.map} +0 -0
  121. /package/dist/{issue-triage-UNLRUO2O.js.map → issue-triage-YMGSB67V.js.map} +0 -0
  122. /package/dist/{pr-reviewer-helpers-JWJ4HVPW.js.map → pr-reviewer-helpers-7Z4YCH7M.js.map} +0 -0
  123. /package/dist/{registry-command-IFZYXY5Y.js.map → registry-command-BFIP4H5K.js.map} +0 -0
  124. /package/dist/{repo-security-plan-JKXJSVP2.js.map → repo-security-plan-YTH6WX2D.js.map} +0 -0
  125. /package/dist/{research-helpers-synthesize-QI2V4GS6.js.map → research-helpers-synthesize-3F2V3UT4.js.map} +0 -0
  126. /package/dist/{routing-memory-EFMYS572.js.map → routing-memory-BXPT2NGR.js.map} +0 -0
  127. /package/dist/{session-memory-XO5T3PJD.js.map → session-memory-EMQDHMCG.js.map} +0 -0
  128. /package/dist/{setup-config-JRFZ5LM3.js.map → setup-config-X2LBKED3.js.map} +0 -0
  129. /package/dist/{setup-custom-api-FH2EM46D.js.map → setup-custom-api-SPNYKU3G.js.map} +0 -0
  130. /package/dist/{setup-data-dir-ZX2ZRKIW.js.map → setup-data-dir-TB7MYUX2.js.map} +0 -0
  131. /package/dist/{tool-memory-JHJKFFIX.js.map → tool-memory-WOIZTLSM.js.map} +0 -0
  132. /package/dist/{unified-registry-DPL6V77X.js.map → unified-registry-KPTDXCLT.js.map} +0 -0
  133. /package/dist/{weather-report-CAHU2PCR.js.map → weather-report-HXMGZBOD.js.map} +0 -0
@@ -9,8 +9,8 @@ import {
9
9
  getBuiltInAstRulesPath,
10
10
  loadRules,
11
11
  runAstQaRules
12
- } from "./chunk-33RHZITC.js";
13
- import "./chunk-NGXHFMA6.js";
12
+ } from "./chunk-2NKV7GWF.js";
13
+ import "./chunk-I3C4CMEA.js";
14
14
  import "./chunk-MTYJPPIG.js";
15
15
  import "./chunk-BTYRPZON.js";
16
16
  import "./chunk-ZPWHCABL.js";
@@ -26,4 +26,4 @@ export {
26
26
  loadRules,
27
27
  runAstQaRules
28
28
  };
29
- //# sourceMappingURL=ast-rule-runner-PELERN3O.js.map
29
+ //# sourceMappingURL=ast-rule-runner-O662YIWH.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-T46RV7Y7.js";
4
4
  import {
5
5
  createLogger
6
- } from "./chunk-NGXHFMA6.js";
6
+ } from "./chunk-I3C4CMEA.js";
7
7
  import "./chunk-MTYJPPIG.js";
8
8
  import "./chunk-BTYRPZON.js";
9
9
  import "./chunk-ZPWHCABL.js";
@@ -60,4 +60,4 @@ export {
60
60
  generateMcpConfig,
61
61
  getDefaultAllowedTools
62
62
  };
63
- //# sourceMappingURL=child-mcp-config-RYQSABJT.js.map
63
+ //# sourceMappingURL=child-mcp-config-TAVB7ICF.js.map
@@ -2,7 +2,7 @@ import {
2
2
  CACHE_TIMEOUTS,
3
3
  createLogger,
4
4
  getTimeProvider
5
- } from "./chunk-NGXHFMA6.js";
5
+ } from "./chunk-I3C4CMEA.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-XYK2GPUF.js.map
613
+ //# sourceMappingURL=chunk-2DFG2IDE.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  resolveCliSlot
3
- } from "./chunk-TS4GGKYN.js";
3
+ } from "./chunk-3FAK4CZI.js";
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider,
7
7
  isRateLimitText
8
- } from "./chunk-NGXHFMA6.js";
8
+ } from "./chunk-I3C4CMEA.js";
9
9
 
10
10
  // src/pipeline/expert-bridge.ts
11
11
  function resolveCliFromModelString(model) {
@@ -21,7 +21,7 @@ async function getMcpConfigPath() {
21
21
  if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;
22
22
  mcpConfigInitPromise ??= (async () => {
23
23
  try {
24
- const { generateMcpConfig } = await import("./child-mcp-config-RYQSABJT.js");
24
+ const { generateMcpConfig } = await import("./child-mcp-config-TAVB7ICF.js");
25
25
  const config = await generateMcpConfig();
26
26
  cachedMcpConfigPath = config.configPath;
27
27
  cachedMcpConfigCleanup = config.cleanup;
@@ -93,8 +93,8 @@ var routerInitPromise = null;
93
93
  async function getRouter() {
94
94
  if (cachedRouter !== null) return cachedRouter;
95
95
  routerInitPromise ??= (async () => {
96
- const { createAllAdapters } = await import("./factory-EUZWJNFU.js");
97
- const { createCompositeRouter } = await import("./composite-router-JRFBB5YP.js");
96
+ const { createAllAdapters } = await import("./factory-DRAOHRNW.js");
97
+ const { createCompositeRouter } = await import("./composite-router-A7LIM76Z.js");
98
98
  const adapters = createAllAdapters();
99
99
  if (adapters.size === 0) {
100
100
  routerInitPromise = null;
@@ -102,7 +102,7 @@ async function getRouter() {
102
102
  }
103
103
  cachedRouter = adaptCompositeRouter(createCompositeRouter(adapters));
104
104
  try {
105
- const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-D7NZ7YF3.js");
105
+ const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-IEAKDBEX.js");
106
106
  cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
107
107
  } catch (error) {
108
108
  const msg = error instanceof Error ? error.message : String(error);
@@ -213,4 +213,4 @@ export {
213
213
  tokenSplitFromUsage,
214
214
  executeExpert
215
215
  };
216
- //# sourceMappingURL=chunk-WAVAOSH5.js.map
216
+ //# sourceMappingURL=chunk-2LTE4FRY.js.map
@@ -3,7 +3,7 @@ import {
3
3
  ValidationError,
4
4
  createLogger,
5
5
  formatZodError
6
- } from "./chunk-NGXHFMA6.js";
6
+ } from "./chunk-I3C4CMEA.js";
7
7
 
8
8
  // src/security/ast-rule-runner.ts
9
9
  import { existsSync } from "node:fs";
@@ -241,4 +241,4 @@ export {
241
241
  collectAstQaFindings,
242
242
  runAstQaRules
243
243
  };
244
- //# sourceMappingURL=chunk-33RHZITC.js.map
244
+ //# sourceMappingURL=chunk-2NKV7GWF.js.map
@@ -10,13 +10,13 @@ import {
10
10
  import {
11
11
  assessReputation,
12
12
  sanitizeInput
13
- } from "./chunk-XYK2GPUF.js";
13
+ } from "./chunk-2DFG2IDE.js";
14
14
  import {
15
15
  createLogger,
16
16
  err,
17
17
  getTimeProvider,
18
18
  ok
19
- } from "./chunk-NGXHFMA6.js";
19
+ } from "./chunk-I3C4CMEA.js";
20
20
 
21
21
  // src/dogfooding/pr-reviewer-helpers.ts
22
22
  import { randomUUID } from "node:crypto";
@@ -416,4 +416,4 @@ export {
416
416
  createFailedReview,
417
417
  reviewPostingBlock
418
418
  };
419
- //# sourceMappingURL=chunk-JIUX35FD.js.map
419
+ //# sourceMappingURL=chunk-34T342GH.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-54YTICHC.js";
4
+ } from "./chunk-EZTD6X3P.js";
5
5
  import {
6
6
  resolveToken
7
- } from "./chunk-3PLSFD3D.js";
7
+ } from "./chunk-WFZIQMCH.js";
8
8
  import {
9
9
  err,
10
10
  ok
11
- } from "./chunk-NGXHFMA6.js";
11
+ } from "./chunk-I3C4CMEA.js";
12
12
 
13
13
  // src/scm/factory.ts
14
14
  async function createScmProvider(config) {
@@ -41,4 +41,4 @@ export {
41
41
  createScmProvider,
42
42
  createGitHubProvider
43
43
  };
44
- //# sourceMappingURL=chunk-R4ITN2N2.js.map
44
+ //# sourceMappingURL=chunk-35U4M4YF.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  computeCostDetail,
3
3
  priceBasisOf
4
- } from "./chunk-ELBJDCC7.js";
4
+ } from "./chunk-WGN2GCQE.js";
5
5
  import {
6
6
  allOf
7
7
  } from "./chunk-OQB3XC5O.js";
@@ -23,27 +23,29 @@ import {
23
23
  toolSuccessStructured,
24
24
  withProgressHeartbeat,
25
25
  wrapToolWithTimeout
26
- } from "./chunk-6GLEQDA7.js";
26
+ } from "./chunk-ZOJWE5AB.js";
27
27
  import {
28
28
  VERSION
29
- } from "./chunk-3IYEZ2PK.js";
29
+ } from "./chunk-GNBK6OCF.js";
30
30
  import {
31
31
  UNRESOLVED_MODEL_ID,
32
32
  assessPanelIndependence,
33
33
  countDistinctModels,
34
34
  createEvent,
35
35
  getGlobalRegistry
36
- } from "./chunk-3JFRPAYE.js";
36
+ } from "./chunk-YB74LXLF.js";
37
37
  import {
38
38
  getToolMemory
39
- } from "./chunk-THPZO2XW.js";
39
+ } from "./chunk-RWMWQGPI.js";
40
40
  import {
41
41
  authRemediation,
42
+ classifyExtractedError,
42
43
  delay,
43
44
  getAvailableClis,
45
+ isTimeoutText,
44
46
  sleep,
45
47
  withTimeout
46
- } from "./chunk-USHZGWDJ.js";
48
+ } from "./chunk-SNOZB4FU.js";
47
49
  import {
48
50
  AgentError,
49
51
  CLI_NAMES,
@@ -68,11 +70,12 @@ import {
68
70
  getTimeProvider,
69
71
  isDurableCapacityText,
70
72
  isRateLimitLikeError,
73
+ isRateLimitText,
71
74
  ok,
72
75
  registerPersistentOutcomeStoreFactory,
73
76
  resolveClassGuardMs,
74
77
  resolveVoteTimeout
75
- } from "./chunk-NGXHFMA6.js";
78
+ } from "./chunk-I3C4CMEA.js";
76
79
  import {
77
80
  ensureLearningDir,
78
81
  getOutcomesFile
@@ -142,13 +145,6 @@ var VOTER_ROLES = {
142
145
  scope_steward: "Scope Steward - asks whether to build at all; checks existing tools, biases toward kill-the-feature (#2185)"
143
146
  };
144
147
 
145
- // src/cli-adapters/codex-limits.ts
146
- var CODEX_DEFAULT_MAX_THREADS = 6;
147
- function checkCodexConcurrency(codexBoundConcurrency) {
148
- if (codexBoundConcurrency <= CODEX_DEFAULT_MAX_THREADS) return null;
149
- return `${String(codexBoundConcurrency)} parallel calls are bound for Codex, exceeding its default max_threads=${String(CODEX_DEFAULT_MAX_THREADS)}. Codex may queue or drop the excess. Raise [agents] max_threads in ~/.codex/config.toml, or spread the panel across more CLIs (claude/gemini) so fewer roles land on Codex.`;
150
- }
151
-
152
148
  // src/cli/panel-independence.ts
153
149
  function reportPanelIndependence(adapters, roleCount, phase, logger11) {
154
150
  reportPanelModelIndependence(
@@ -265,6 +261,13 @@ async function retryErroredRoles(first, relaunch, logger11, backoffMs) {
265
261
  return first.map((v) => recovered.get(v.role) ?? v);
266
262
  }
267
263
 
264
+ // src/cli-adapters/codex-limits.ts
265
+ var CODEX_DEFAULT_MAX_THREADS = 6;
266
+ function checkCodexConcurrency(codexBoundConcurrency) {
267
+ if (codexBoundConcurrency <= CODEX_DEFAULT_MAX_THREADS) return null;
268
+ return `${String(codexBoundConcurrency)} parallel calls are bound for Codex, exceeding its default max_threads=${String(CODEX_DEFAULT_MAX_THREADS)}. Codex may queue or drop the excess. Raise [agents] max_threads in ~/.codex/config.toml, or spread the panel across more CLIs (claude/gemini) so fewer roles land on Codex.`;
269
+ }
270
+
268
271
  // src/cli/voter-adapter-resolve.ts
269
272
  var NoAdapterError = class extends Error {
270
273
  constructor(message) {
@@ -297,6 +300,50 @@ function resolveAdapterOrFail(options, logger11, allowSimulation) {
297
300
  `No adapter available for voting: ${resolved.error}. Install a CLI (claude/gemini/codex) or set ANTHROPIC_API_KEY.`
298
301
  );
299
302
  }
303
+ function warnIfCodexConcurrencyExceeded(roleAdapters, logger11) {
304
+ const codexBound = [...roleAdapters.values()].filter(
305
+ (a) => a.name === "codex"
306
+ ).length;
307
+ const warning = checkCodexConcurrency(codexBound);
308
+ if (warning !== null) {
309
+ logger11.warn("Codex concurrency limit may be exceeded", { detail: warning });
310
+ }
311
+ }
312
+
313
+ // src/cli/voter-fallback.ts
314
+ function bareCliName(id) {
315
+ return id.startsWith("cli-") ? id.slice("cli-".length) : id;
316
+ }
317
+ function classifyFallbackReason(message) {
318
+ if (isDurableCapacityText(message)) return "capacity";
319
+ if (isRateLimitText(message)) return "rate-limit";
320
+ if (classifyExtractedError(message, "unknown").code === "NOT_AUTHENTICATED") return "auth";
321
+ if (UNVERIFIABLE_STDERR_RE.test(message)) return "sandbox";
322
+ if (isTimeoutText(message)) return "timeout";
323
+ return "unknown";
324
+ }
325
+ function detectedModel(adapter) {
326
+ const id = adapter.modelId;
327
+ return typeof id === "string" && id !== "" && id !== UNRESOLVED_MODEL_ID ? id : void 0;
328
+ }
329
+ function assignedCliOf(key) {
330
+ return typeof key === "string" && key !== "" ? bareCliName(key) : void 0;
331
+ }
332
+ function crossCliFallback(assigned, assignedKey, error) {
333
+ const fromModel = detectedModel(assigned);
334
+ return {
335
+ fromCli: assignedCliOf(assignedKey) ?? "unknown",
336
+ ...fromModel !== void 0 ? { fromModel } : {},
337
+ reason: classifyFallbackReason(error)
338
+ };
339
+ }
340
+ function inFamilyFallback(cli, fromModel) {
341
+ return { fromCli: bareCliName(cli), fromModel, reason: "capacity" };
342
+ }
343
+ function withAssignedCli(result, assignedKey) {
344
+ const assignedCli = assignedCliOf(assignedKey);
345
+ return assignedCli === void 0 ? result : { ...result, assignedCli };
346
+ }
300
347
 
301
348
  // src/cli/voter-prompts.ts
302
349
  var DEFAULT_VOTER_PROJECT = "nexus-agents";
@@ -1081,7 +1128,10 @@ async function runVoteCompletion(args) {
1081
1128
  // #6094: the transport's captured stderr rides up with the vote so the
1082
1129
  // caller can classify a seat that could not read the artifact from the
1083
1130
  // structured signal rather than from its prose.
1084
- cliStderr: response.value.cliStderr
1131
+ cliStderr: response.value.cliStderr,
1132
+ // #6115: the alias the seat asked for, when the CLI answered on another
1133
+ // one of its family (#6120) — the seat's result discloses it as a fallback.
1134
+ fallbackFrom: response.value.fallbackFrom
1085
1135
  };
1086
1136
  }
1087
1137
  async function executeSingleVoteAttempt(role, proposal, adapter, timeoutMs, context = {}) {
@@ -1099,7 +1149,8 @@ async function executeSingleVoteAttempt(role, proposal, adapter, timeoutMs, cont
1099
1149
  vote,
1100
1150
  output: completion.output,
1101
1151
  usage: completion.usage,
1102
- cliStderr: completion.cliStderr
1152
+ cliStderr: completion.cliStderr,
1153
+ fallbackFrom: completion.fallbackFrom
1103
1154
  };
1104
1155
  } catch (error) {
1105
1156
  if (error instanceof SyntheticVoteError) {
@@ -1139,7 +1190,8 @@ async function executeWithRetries(opts) {
1139
1190
  attemptMs,
1140
1191
  succeeded: true
1141
1192
  });
1142
- return { vote: result.vote, usage: result.usage, cliStderr: result.cliStderr, ok: true };
1193
+ const { vote, usage, cliStderr, fallbackFrom } = result;
1194
+ return { vote, usage, cliStderr, fallbackFrom, ok: true };
1143
1195
  }
1144
1196
  lastError = result.error;
1145
1197
  if (logFailedAttempt(logger11, { role, attempt, maxRetries, attemptMs, error: lastError })) {
@@ -1180,8 +1232,8 @@ function shouldRetryOnFallback(result, used, fallback) {
1180
1232
  function adapterCliKey(adapter) {
1181
1233
  return adapter.name ?? adapter.providerId;
1182
1234
  }
1183
- function withPinnedModel(result, pinnedModel) {
1184
- return { ...result, pinnedModel };
1235
+ function withAssignment(result, pinnedModel, assignedKey) {
1236
+ return withAssignedCli({ ...result, pinnedModel }, assignedKey);
1185
1237
  }
1186
1238
  function createKeyedSerializer() {
1187
1239
  const tails = /* @__PURE__ */ new Map();
@@ -1216,21 +1268,24 @@ async function launchRoleVote(role, index, input, voteOnAdapter) {
1216
1268
  if (index > 0 && input.interDelay > 0) await delay(input.interDelay);
1217
1269
  const adapter = input.roleAdapters.get(role) ?? input.fallbackAdapter;
1218
1270
  const pinnedModel = adapter.modelId;
1271
+ const assignedKey = adapterCliKey(adapter);
1272
+ const stamp = (r) => withAssignment(r, pinnedModel, assignedKey);
1219
1273
  if (cancelled(input.signal)) {
1220
- return withPinnedModel(createErrorVoteResult(role, CANCELLED_MESSAGE, 0), pinnedModel);
1274
+ return stamp(createErrorVoteResult(role, CANCELLED_MESSAGE, 0));
1221
1275
  }
1222
1276
  const primary = await voteOnAdapter(role, adapter);
1223
- if (!shouldRetryOnFallback(primary, adapter, input.fallbackAdapter)) {
1224
- return withPinnedModel(primary, pinnedModel);
1225
- }
1226
- if (cancelled(input.signal)) return withPinnedModel(primary, pinnedModel);
1277
+ if (!shouldRetryOnFallback(primary, adapter, input.fallbackAdapter)) return stamp(primary);
1278
+ if (cancelled(input.signal)) return stamp(primary);
1227
1279
  input.logger.warn("Voter failed on diverse adapter; retrying on fallback (#3587)", {
1228
1280
  role,
1229
- failedCli: adapterCliKey(adapter),
1281
+ failedCli: assignedKey,
1230
1282
  fallbackCli: adapterCliKey(input.fallbackAdapter),
1231
1283
  error: primary.error
1232
1284
  });
1233
- return withPinnedModel(await voteOnAdapter(role, input.fallbackAdapter), pinnedModel);
1285
+ const recovered = await voteOnAdapter(role, input.fallbackAdapter);
1286
+ if (recovered.source === "error") return stamp(recovered);
1287
+ const fallback = crossCliFallback(adapter, assignedKey, primary.error ?? "");
1288
+ return stamp({ ...recovered, fallback });
1234
1289
  }
1235
1290
  async function launchVotesWithOverallDeadline(input) {
1236
1291
  const { roles, proposal, logger: logger11, voteOptions, overallDeadlineMs, voteFn } = input;
@@ -1270,7 +1325,7 @@ function computeOverallConsensusDeadlineMs(timeoutMs, maxRetries, roleCount, int
1270
1325
  }
1271
1326
  var DEFAULT_INTER_AGENT_DELAY_MS = 2e3;
1272
1327
  var defaultLogger = createLogger({ component: "voter-agents" });
1273
- function buildLlmVoteResult(role, vote, usage, adapter, processingTimeMs) {
1328
+ function buildLlmVoteResult(role, { vote, usage, fallbackFrom }, adapter, processingTimeMs) {
1274
1329
  return {
1275
1330
  role,
1276
1331
  vote,
@@ -1278,6 +1333,9 @@ function buildLlmVoteResult(role, vote, usage, adapter, processingTimeMs) {
1278
1333
  source: "llm",
1279
1334
  cli: adapter.providerId,
1280
1335
  model: adapter.modelId,
1336
+ // #6115: the CLI answered on another model of its family (#6120) — a
1337
+ // capacity fallback by construction, disclosed on the seat.
1338
+ ...fallbackFrom !== void 0 ? { fallback: inFamilyFallback(adapter.providerId, fallbackFrom) } : {},
1281
1339
  // #4472: surface the voter's choice at the result level, where the tally
1282
1340
  // and the record read it. Absent when no options were declared or the
1283
1341
  // selection matched none of them.
@@ -1326,7 +1384,7 @@ async function executeAgentVote(role, proposal, adapter, logger11, options) {
1326
1384
  const result = await executeWithRetries({ ...retryOptions, options: declaredOptions });
1327
1385
  const processingTimeMs = getTimeProvider().now() - start;
1328
1386
  if (result.ok) {
1329
- const built = buildLlmVoteResult(role, result.vote, result.usage, adapter, processingTimeMs);
1387
+ const built = buildLlmVoteResult(role, result, adapter, processingTimeMs);
1330
1388
  return finalizeParsedVote(built, result.cliStderr, logger11);
1331
1389
  }
1332
1390
  logger11.error("Vote execution failed after all retries", void 0, {
@@ -1344,15 +1402,6 @@ async function executeAgentVote(role, proposal, adapter, logger11, options) {
1344
1402
  ${remediation}`;
1345
1403
  return createErrorVoteResult(role, errorText, processingTimeMs, adapter.providerId);
1346
1404
  }
1347
- function warnIfCodexConcurrencyExceeded(roleAdapters, logger11) {
1348
- const codexBound = [...roleAdapters.values()].filter(
1349
- (a) => a.name === "codex"
1350
- ).length;
1351
- const warning = checkCodexConcurrency(codexBound);
1352
- if (warning !== null) {
1353
- logger11.warn("Codex concurrency limit may be exceeded", { detail: warning });
1354
- }
1355
- }
1356
1405
  function assignUniformAdapter(roles, adapter) {
1357
1406
  const adapters = /* @__PURE__ */ new Map();
1358
1407
  for (const role of roles) adapters.set(role, adapter);
@@ -5032,6 +5081,46 @@ function createPersistentCorrelationTracker(config) {
5032
5081
  // src/mcp/tools/consensus-vote-types.ts
5033
5082
  import { z as z7 } from "zod";
5034
5083
 
5084
+ // src/cli/vote-diversity.ts
5085
+ function answeringSeats(votes) {
5086
+ return votes.filter((v) => v.source === "llm");
5087
+ }
5088
+ function resolvedModel(v) {
5089
+ return v.model === void 0 || v.model === "" || v.model === UNRESOLVED_MODEL_ID ? void 0 : v.model;
5090
+ }
5091
+ function seatFallbacks(votes) {
5092
+ const out = [];
5093
+ for (const v of answeringSeats(votes)) {
5094
+ if (v.fallback === void 0) continue;
5095
+ out.push({
5096
+ role: v.role,
5097
+ fallback: v.fallback,
5098
+ toCli: v.cli === void 0 ? "?" : bareCliName(v.cli),
5099
+ toModel: resolvedModel(v)
5100
+ });
5101
+ }
5102
+ return out;
5103
+ }
5104
+ function panelDiversityOf(votes) {
5105
+ const models = answeringSeats(votes).map(resolvedModel).filter((m) => m !== void 0);
5106
+ return {
5107
+ distinctModels: countDistinctModels(models),
5108
+ fallbacks: seatFallbacks(votes).length
5109
+ };
5110
+ }
5111
+ var MIN_PANEL_FOR_DIVERSITY_WARNING = 3;
5112
+ function singleModelPanelWarning(votes) {
5113
+ if (votes.length < MIN_PANEL_FOR_DIVERSITY_WARNING) return void 0;
5114
+ const answered = answeringSeats(votes);
5115
+ const models = answered.map(resolvedModel);
5116
+ const model = models[0];
5117
+ if (model === void 0 || models.includes(void 0)) return void 0;
5118
+ if (panelDiversityOf(votes).distinctModels !== 1) return void 0;
5119
+ const silent = votes.length - answered.length;
5120
+ const missing = silent > 0 ? ` (${String(silent)} did not answer)` : "";
5121
+ return `All ${String(answered.length)} seats answered on ${model}${missing}; independence is weaker than assigned.`;
5122
+ }
5123
+
5035
5124
  // src/mcp/tools/consensus-vote-option-detection.ts
5036
5125
  var MULTI_OPTION_PATTERNS = Object.freeze([
5037
5126
  // `Option A` and `OPTION A`, but NOT `option a` — the lowercase form appears
@@ -5183,7 +5272,9 @@ function toAgentVoteSummary(result) {
5183
5272
  // Present only when true, so a clean panel's response is unchanged.
5184
5273
  ...result.retried === true ? { retried: true } : {},
5185
5274
  // #6094: same rule for a seat that could not read the artifact.
5186
- ...result.source === "unverifiable" ? { unverifiable: true } : {}
5275
+ ...result.source === "unverifiable" ? { unverifiable: true } : {},
5276
+ // #6115: and for a seat that answered elsewhere.
5277
+ ...result.fallback !== void 0 ? { fallback: result.fallback } : {}
5187
5278
  };
5188
5279
  }
5189
5280
  function mapOutcomeToDecision(outcome) {
@@ -5339,6 +5430,8 @@ function buildResponse(input, result, costSummary, voteRecord) {
5339
5430
  durationMs: result.totalTimeMs,
5340
5431
  simulateVotes: result.simulateVotes,
5341
5432
  project: disclosedProject(input, result),
5433
+ // #6115: always present — a panel nobody answered is explicit zeros.
5434
+ panelDiversity: panelDiversityOf(result.votes),
5342
5435
  // #3991: surface the authentic-vote-record persistence outcome so a skipped
5343
5436
  // or failed persist is visible to the MCP caller (was WARN-only).
5344
5437
  voteRecordPersisted: voteRecord?.persisted ?? false
@@ -5378,6 +5471,7 @@ function applyOptionalResponseFields(response, input, result, errorCount, costSu
5378
5471
  response,
5379
5472
  unverifiableSeatsWarning(response.voteCounts.unverifiable, result.votes.length)
5380
5473
  );
5474
+ appendPanelWarning(response, singleModelPanelWarning(result.votes));
5381
5475
  const engaged = result.votes.length - errorCount;
5382
5476
  const undeclared = checkUndeclaredOptions(
5383
5477
  input.proposal,
@@ -6281,6 +6375,8 @@ function votesToCostInputs(votes) {
6281
6375
  const input = {
6282
6376
  role: v.role,
6283
6377
  model: v.model,
6378
+ // #6115: the assignment beside the model that answered.
6379
+ ...v.assignedCli !== void 0 ? { assignedCli: v.assignedCli } : {},
6284
6380
  ...reportedTokenFields(v),
6285
6381
  ...detail?.priced === true ? { costUsd: detail.costUsd } : {},
6286
6382
  // #4406 — state what kind of rate the cost rests on, but only when we
@@ -7690,7 +7786,7 @@ function logPartialProposal(bounded, log) {
7690
7786
  }
7691
7787
  async function runContrarianCheck(proposal, log) {
7692
7788
  try {
7693
- const { executeExpert } = await import("./expert-bridge-VLEDZGPA.js");
7789
+ const { executeExpert } = await import("./expert-bridge-5WFR7CU7.js");
7694
7790
  const bounded = boundArtifactForReview(proposal, CONTRARIAN_PROPOSAL_BUDGET, "proposal");
7695
7791
  logPartialProposal(bounded, log);
7696
7792
  const result = await executeExpert("architecture", buildContrarianPrompt(bounded));
@@ -8134,6 +8230,12 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
8134
8230
  error: z12.boolean(),
8135
8231
  /** #6094: present only when the seat could not read the artifact. */
8136
8232
  unverifiable: z12.literal(true).optional(),
8233
+ /** #6115: present only when the seat answered elsewhere than assigned. */
8234
+ fallback: z12.object({
8235
+ fromCli: z12.string().max(100),
8236
+ fromModel: z12.string().max(100).optional(),
8237
+ reason: z12.enum(["rate-limit", "capacity", "auth", "timeout", "sandbox", "unknown"])
8238
+ }).optional(),
8137
8239
  modelUsed: z12.string().max(100).optional(),
8138
8240
  rejectionCategories: z12.array(
8139
8241
  z12.enum([
@@ -8183,6 +8285,13 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
8183
8285
  // omitted from this schema until #4032 — its absence made a strict MCP client
8184
8286
  // reject any degraded-panel vote (`-32602 additional properties`).
8185
8287
  panelWarning: z12.string().optional(),
8288
+ // #6115: distinct answering models and seats that answered elsewhere than
8289
+ // assigned. Always on the response (explicit zeros); optional here only
8290
+ // because the async `pending` envelope shares this schema.
8291
+ panelDiversity: z12.object({
8292
+ distinctModels: z12.number().int().nonnegative(),
8293
+ fallbacks: z12.number().int().nonnegative()
8294
+ }).optional(),
8186
8295
  // #3855: per-decision cost rollup. Same omission as panelWarning (#4032) — it
8187
8296
  // is present on the response whenever cost recording succeeds (common in `api`
8188
8297
  // billing mode). Shared schema lives with the type (single source of truth).
@@ -8307,6 +8416,8 @@ export {
8307
8416
  createWeightedVoting,
8308
8417
  CorrelationTracker,
8309
8418
  createCorrelationTracker,
8419
+ seatFallbacks,
8420
+ panelDiversityOf,
8310
8421
  VotingStrategySchema,
8311
8422
  ErrorPolicySchema,
8312
8423
  VoteThresholdSchema,
@@ -8330,4 +8441,4 @@ export {
8330
8441
  CONSENSUS_VOTE_TOOL_SCHEMA,
8331
8442
  registerConsensusVoteTool
8332
8443
  };
8333
- //# sourceMappingURL=chunk-SKUCBZI5.js.map
8444
+ //# sourceMappingURL=chunk-3BTD6HDP.js.map