nexus-agents 2.72.1 → 2.74.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 (112) hide show
  1. package/dist/{adaptive-memory-UPE76IP6.js → adaptive-memory-OJY3IVNM.js} +3 -3
  2. package/dist/{child-mcp-config-5HRJGLCR.js → child-mcp-config-KMCKKPNY.js} +2 -2
  3. package/dist/{chunk-TF3GROMO.js → chunk-2SVS5WRV.js} +2 -2
  4. package/dist/{chunk-QECRZ3YA.js → chunk-3ESCBV47.js} +2 -2
  5. package/dist/{chunk-QL4HCYRD.js → chunk-3SZBDLFX.js} +3 -3
  6. package/dist/{chunk-VTVKC4FS.js → chunk-44MVIL3F.js} +4 -4
  7. package/dist/{chunk-BVETPIOQ.js → chunk-4K6L7RKC.js} +3 -3
  8. package/dist/chunk-4K6L7RKC.js.map +1 -0
  9. package/dist/{chunk-C3JGKBL2.js → chunk-65R32U3M.js} +4 -4
  10. package/dist/{chunk-3FIDMWFC.js → chunk-BK54O5J5.js} +2 -2
  11. package/dist/chunk-BK54O5J5.js.map +1 -0
  12. package/dist/{chunk-J4VR2WNI.js → chunk-BYKS53GW.js} +1086 -1709
  13. package/dist/chunk-BYKS53GW.js.map +1 -0
  14. package/dist/{chunk-L6N2S3UB.js → chunk-CCODJRS6.js} +2 -2
  15. package/dist/{chunk-DA5UDQYW.js → chunk-DGELGUZF.js} +2 -2
  16. package/dist/{chunk-2KB63QGE.js → chunk-EQHYXT56.js} +2 -2
  17. package/dist/{chunk-VPC3YNFR.js → chunk-G5VE2DZS.js} +2 -2
  18. package/dist/{chunk-2MD5MWCK.js → chunk-GS3GW7C7.js} +2 -2
  19. package/dist/{chunk-ES6GFP35.js → chunk-NC2LECY6.js} +26 -9
  20. package/dist/chunk-NC2LECY6.js.map +1 -0
  21. package/dist/{chunk-5MHIWRKB.js → chunk-NQR7QAZX.js} +21 -2
  22. package/dist/chunk-NQR7QAZX.js.map +1 -0
  23. package/dist/{chunk-5WQ3SRSE.js → chunk-PAFH336F.js} +2 -2
  24. package/dist/{chunk-O4KUCF5S.js → chunk-Q3RFPJYK.js} +1325 -441
  25. package/dist/chunk-Q3RFPJYK.js.map +1 -0
  26. package/dist/{chunk-P5OFZWDW.js → chunk-Q6JDV36D.js} +13 -6
  27. package/dist/chunk-Q6JDV36D.js.map +1 -0
  28. package/dist/{chunk-A35XORXU.js → chunk-Q7FTNKPO.js} +2 -2
  29. package/dist/chunk-QON7LR7J.js +153 -0
  30. package/dist/chunk-QON7LR7J.js.map +1 -0
  31. package/dist/{chunk-53K3KEKT.js → chunk-T5VPZZYX.js} +1564 -848
  32. package/dist/chunk-T5VPZZYX.js.map +1 -0
  33. package/dist/{chunk-TQFRPFMG.js → chunk-TBRNRW2Q.js} +2 -2
  34. package/dist/{chunk-345KMHWH.js → chunk-UWJKMBPL.js} +6 -6
  35. package/dist/{chunk-V7ATY4BG.js → chunk-VJD5LANR.js} +14 -16
  36. package/dist/chunk-VJD5LANR.js.map +1 -0
  37. package/dist/{chunk-YOREAPF6.js → chunk-WCCTIRSB.js} +11 -10
  38. package/dist/chunk-WCCTIRSB.js.map +1 -0
  39. package/dist/{cli-circuit-breaker-GFF2RLBZ.js → cli-circuit-breaker-STXIH563.js} +4 -4
  40. package/dist/cli.d.ts +5 -2
  41. package/dist/cli.js +138 -106
  42. package/dist/cli.js.map +1 -1
  43. package/dist/{composite-router-33F3F74I.js → composite-router-7AHZN3VI.js} +2 -2
  44. package/dist/{consensus-vote-5V4KVHBE.js → consensus-vote-XY55C7WQ.js} +11 -10
  45. package/dist/consensus-vote-types-CoGbAEjf.d.ts +195 -0
  46. package/dist/{doctor-deep-AHDTNURD.js → doctor-deep-ONHJTGR4.js} +3 -3
  47. package/dist/{expert-bridge-DMDHHDEU.js → expert-bridge-3AWQHR65.js} +3 -3
  48. package/dist/{factory-FVD7PZ6S.js → factory-E5NMAMZC.js} +5 -5
  49. package/dist/{factory-VQS3HJ7V.js → factory-HWHQ44BB.js} +4 -4
  50. package/dist/index.d.ts +4089 -3693
  51. package/dist/index.js +85 -73
  52. package/dist/index.js.map +1 -1
  53. package/dist/{init-opencode-EIOIPVWL.js → init-opencode-Z7OQ5RCB.js} +5 -5
  54. package/dist/{issue-triage-HJUJWGAD.js → issue-triage-UWBHMQHC.js} +4 -4
  55. package/dist/{mobimem-BOJFXQ7B.js → mobimem-G4UXJTCV.js} +2 -2
  56. package/dist/{registry-command-NCWUJKAF.js → registry-command-HYWVRAHE.js} +5 -6
  57. package/dist/registry-command-HYWVRAHE.js.map +1 -0
  58. package/dist/{repo-security-plan-3J45VAD6.js → repo-security-plan-W35CXK3T.js} +3 -3
  59. package/dist/{research-helpers-synthesize-UGQHZZJN.js → research-helpers-synthesize-GUQORWL4.js} +3 -3
  60. package/dist/{routing-memory-NO7QEH7T.js → routing-memory-VOJBOX3X.js} +2 -2
  61. package/dist/{session-memory-DOXLEWEU.js → session-memory-B6LQMF4N.js} +3 -3
  62. package/dist/{setup-command-BWUFMZ7U.js → setup-command-CTC5YNA4.js} +9 -8
  63. package/dist/{setup-config-E3JZYSLR.js → setup-config-53MHJA7S.js} +3 -3
  64. package/dist/{setup-custom-api-DHJ5DRH2.js → setup-custom-api-VD5W754A.js} +4 -4
  65. package/dist/{weather-report-FNN4OX3N.js → weather-report-APASTJDQ.js} +2 -2
  66. package/package.json +1 -1
  67. package/dist/chunk-3FIDMWFC.js.map +0 -1
  68. package/dist/chunk-53K3KEKT.js.map +0 -1
  69. package/dist/chunk-5MHIWRKB.js.map +0 -1
  70. package/dist/chunk-BVETPIOQ.js.map +0 -1
  71. package/dist/chunk-ES6GFP35.js.map +0 -1
  72. package/dist/chunk-J4VR2WNI.js.map +0 -1
  73. package/dist/chunk-O4KUCF5S.js.map +0 -1
  74. package/dist/chunk-P5OFZWDW.js.map +0 -1
  75. package/dist/chunk-V7ATY4BG.js.map +0 -1
  76. package/dist/chunk-YOREAPF6.js.map +0 -1
  77. package/dist/model-capabilities-types-B57GZryc.d.ts +0 -18
  78. package/dist/registry-command-NCWUJKAF.js.map +0 -1
  79. /package/dist/{adaptive-memory-UPE76IP6.js.map → adaptive-memory-OJY3IVNM.js.map} +0 -0
  80. /package/dist/{child-mcp-config-5HRJGLCR.js.map → child-mcp-config-KMCKKPNY.js.map} +0 -0
  81. /package/dist/{chunk-TF3GROMO.js.map → chunk-2SVS5WRV.js.map} +0 -0
  82. /package/dist/{chunk-QECRZ3YA.js.map → chunk-3ESCBV47.js.map} +0 -0
  83. /package/dist/{chunk-QL4HCYRD.js.map → chunk-3SZBDLFX.js.map} +0 -0
  84. /package/dist/{chunk-VTVKC4FS.js.map → chunk-44MVIL3F.js.map} +0 -0
  85. /package/dist/{chunk-C3JGKBL2.js.map → chunk-65R32U3M.js.map} +0 -0
  86. /package/dist/{chunk-L6N2S3UB.js.map → chunk-CCODJRS6.js.map} +0 -0
  87. /package/dist/{chunk-DA5UDQYW.js.map → chunk-DGELGUZF.js.map} +0 -0
  88. /package/dist/{chunk-2KB63QGE.js.map → chunk-EQHYXT56.js.map} +0 -0
  89. /package/dist/{chunk-VPC3YNFR.js.map → chunk-G5VE2DZS.js.map} +0 -0
  90. /package/dist/{chunk-2MD5MWCK.js.map → chunk-GS3GW7C7.js.map} +0 -0
  91. /package/dist/{chunk-5WQ3SRSE.js.map → chunk-PAFH336F.js.map} +0 -0
  92. /package/dist/{chunk-A35XORXU.js.map → chunk-Q7FTNKPO.js.map} +0 -0
  93. /package/dist/{chunk-TQFRPFMG.js.map → chunk-TBRNRW2Q.js.map} +0 -0
  94. /package/dist/{chunk-345KMHWH.js.map → chunk-UWJKMBPL.js.map} +0 -0
  95. /package/dist/{cli-circuit-breaker-GFF2RLBZ.js.map → cli-circuit-breaker-STXIH563.js.map} +0 -0
  96. /package/dist/{composite-router-33F3F74I.js.map → composite-router-7AHZN3VI.js.map} +0 -0
  97. /package/dist/{consensus-vote-5V4KVHBE.js.map → consensus-vote-XY55C7WQ.js.map} +0 -0
  98. /package/dist/{doctor-deep-AHDTNURD.js.map → doctor-deep-ONHJTGR4.js.map} +0 -0
  99. /package/dist/{expert-bridge-DMDHHDEU.js.map → expert-bridge-3AWQHR65.js.map} +0 -0
  100. /package/dist/{factory-FVD7PZ6S.js.map → factory-E5NMAMZC.js.map} +0 -0
  101. /package/dist/{factory-VQS3HJ7V.js.map → factory-HWHQ44BB.js.map} +0 -0
  102. /package/dist/{init-opencode-EIOIPVWL.js.map → init-opencode-Z7OQ5RCB.js.map} +0 -0
  103. /package/dist/{issue-triage-HJUJWGAD.js.map → issue-triage-UWBHMQHC.js.map} +0 -0
  104. /package/dist/{mobimem-BOJFXQ7B.js.map → mobimem-G4UXJTCV.js.map} +0 -0
  105. /package/dist/{repo-security-plan-3J45VAD6.js.map → repo-security-plan-W35CXK3T.js.map} +0 -0
  106. /package/dist/{research-helpers-synthesize-UGQHZZJN.js.map → research-helpers-synthesize-GUQORWL4.js.map} +0 -0
  107. /package/dist/{routing-memory-NO7QEH7T.js.map → routing-memory-VOJBOX3X.js.map} +0 -0
  108. /package/dist/{session-memory-DOXLEWEU.js.map → session-memory-B6LQMF4N.js.map} +0 -0
  109. /package/dist/{setup-command-BWUFMZ7U.js.map → setup-command-CTC5YNA4.js.map} +0 -0
  110. /package/dist/{setup-config-E3JZYSLR.js.map → setup-config-53MHJA7S.js.map} +0 -0
  111. /package/dist/{setup-custom-api-DHJ5DRH2.js.map → setup-custom-api-VD5W754A.js.map} +0 -0
  112. /package/dist/{weather-report-FNN4OX3N.js.map → weather-report-APASTJDQ.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -12,18 +12,18 @@ import {
12
12
  parseFindings,
13
13
  sumFindings
14
14
  } from "./chunk-6E3NMMEY.js";
15
- import "./chunk-VPC3YNFR.js";
15
+ import "./chunk-G5VE2DZS.js";
16
16
  import {
17
17
  buildOpenAICompatAdapters,
18
18
  loadUsageEvents,
19
19
  readOpenAICompatEnv,
20
20
  rollupByModel
21
- } from "./chunk-P5OFZWDW.js";
21
+ } from "./chunk-Q6JDV36D.js";
22
22
  import {
23
23
  setupCommandAsync,
24
24
  verifyCommand
25
- } from "./chunk-C3JGKBL2.js";
26
- import "./chunk-DA5UDQYW.js";
25
+ } from "./chunk-65R32U3M.js";
26
+ import "./chunk-DGELGUZF.js";
27
27
  import {
28
28
  AuthHandler,
29
29
  DEFAULT_EXPERTS,
@@ -35,10 +35,10 @@ import {
35
35
  OrchestratorFactory,
36
36
  PuppeteerOrchestrator,
37
37
  READONLY_POLICY,
38
+ ResearchDiscoverInputSchema,
38
39
  SwarmObserver,
39
40
  ValidationDashboard,
40
41
  WorkflowDefinitionSchema,
41
- addResearchPaper,
42
42
  analyzeTools,
43
43
  calculateFitnessScore,
44
44
  createAgentStages,
@@ -72,6 +72,8 @@ import {
72
72
  discoverOpenAlex,
73
73
  discoverPapersWithCode,
74
74
  discoverSemanticScholar,
75
+ executeDiscovery,
76
+ executeResearchAdd,
75
77
  findOverlaps,
76
78
  flushPipelineMemory,
77
79
  formatOverlapResult,
@@ -150,47 +152,48 @@ import {
150
152
  validateCommand,
151
153
  validateWorkflow,
152
154
  wrapInMarkdownFence
153
- } from "./chunk-J4VR2WNI.js";
155
+ } from "./chunk-BYKS53GW.js";
154
156
  import "./chunk-ED6VQWNG.js";
155
157
  import {
156
158
  resolveToken
157
- } from "./chunk-TF3GROMO.js";
159
+ } from "./chunk-2SVS5WRV.js";
158
160
  import {
159
161
  CATEGORY_DISPLAY_NAMES,
160
162
  DEFAULT_PR_REVIEW_CONFIG
161
163
  } from "./chunk-X2M7OF27.js";
162
- import "./chunk-BVETPIOQ.js";
163
- import "./chunk-345KMHWH.js";
164
+ import "./chunk-4K6L7RKC.js";
165
+ import "./chunk-UWJKMBPL.js";
164
166
  import {
165
167
  DEFAULT_VOTE_TIMEOUT_MS,
166
- THRESHOLD_MAP,
168
+ ErrorPolicySchema,
167
169
  VOTER_ROLES,
168
- collectRealVotes,
169
- createConsensusEngine,
170
+ VoteThresholdSchema,
170
171
  createDefaultPolicyFirewall,
171
172
  createUnifiedRegistry,
173
+ executeVoting,
174
+ getToolAnnotations,
172
175
  registerConsensusVoteTool,
173
176
  shutdownToolMemory,
174
- validateTimeout,
177
+ toolStructuredError,
175
178
  warnIfSimulatedOutsideTests
176
- } from "./chunk-53K3KEKT.js";
177
- import "./chunk-5MHIWRKB.js";
178
- import "./chunk-5WQ3SRSE.js";
179
+ } from "./chunk-T5VPZZYX.js";
180
+ import "./chunk-NQR7QAZX.js";
181
+ import "./chunk-PAFH336F.js";
179
182
  import {
180
183
  loadPapersRegistry,
181
184
  loadTechniquesRegistry,
182
185
  savePapersRegistry,
183
186
  synthesizeResearch
184
- } from "./chunk-A35XORXU.js";
187
+ } from "./chunk-Q7FTNKPO.js";
185
188
  import {
186
189
  classifyTrust,
187
190
  createFullGitHubProvider,
188
191
  evaluatePolicy,
189
192
  parsePRUrl,
190
193
  sanitizeInput
191
- } from "./chunk-V7ATY4BG.js";
192
- import "./chunk-3FIDMWFC.js";
193
- import "./chunk-L6N2S3UB.js";
194
+ } from "./chunk-VJD5LANR.js";
195
+ import "./chunk-BK54O5J5.js";
196
+ import "./chunk-CCODJRS6.js";
194
197
  import "./chunk-BC3M4VLP.js";
195
198
  import "./chunk-AP2FD37C.js";
196
199
  import "./chunk-BQ4YXGGQ.js";
@@ -213,28 +216,29 @@ import {
213
216
  probeAllClis,
214
217
  runDoctor,
215
218
  validateNexusEnv
216
- } from "./chunk-YOREAPF6.js";
219
+ } from "./chunk-WCCTIRSB.js";
220
+ import "./chunk-QON7LR7J.js";
217
221
  import {
218
222
  DEFAULTS
219
- } from "./chunk-2MD5MWCK.js";
223
+ } from "./chunk-GS3GW7C7.js";
220
224
  import "./chunk-NUBSJGQZ.js";
221
225
  import {
222
226
  createAllAdapters,
223
227
  getAvailableClis,
224
228
  isRecord
225
- } from "./chunk-ES6GFP35.js";
229
+ } from "./chunk-NC2LECY6.js";
226
230
  import "./chunk-ZM4O442V.js";
227
- import "./chunk-2KB63QGE.js";
231
+ import "./chunk-EQHYXT56.js";
228
232
  import {
229
233
  MemoryError
230
- } from "./chunk-QECRZ3YA.js";
234
+ } from "./chunk-3ESCBV47.js";
231
235
  import {
232
236
  capitalize,
233
237
  capitalizeKebab,
234
238
  truncateSentence
235
239
  } from "./chunk-633WH2ML.js";
236
- import "./chunk-QL4HCYRD.js";
237
- import "./chunk-TQFRPFMG.js";
240
+ import "./chunk-3SZBDLFX.js";
241
+ import "./chunk-TBRNRW2Q.js";
238
242
  import {
239
243
  API_TIMEOUTS,
240
244
  AgentCapability,
@@ -242,10 +246,10 @@ import {
242
246
  CLI_NAMES,
243
247
  CLI_SUBPROCESS_TIMEOUTS,
244
248
  DEFAULT_CLI,
245
- DEFAULT_MODEL_CAPABILITIES,
246
249
  DEFAULT_MODEL_PROFILES,
247
250
  ErrorCode,
248
251
  INPUT_MODALITIES,
252
+ INTERNAL_TIMEOUTS,
249
253
  LinUCBBandit,
250
254
  MCP_TIMEOUTS,
251
255
  NexusError,
@@ -281,12 +285,13 @@ import {
281
285
  getCliModelName,
282
286
  getDefaultModelForCli,
283
287
  getErrorMessage,
284
- getModelCapabilities,
288
+ getInTreeCapabilitiesMatrix,
285
289
  getOutcomeStore,
286
290
  getPipelineEventBus,
287
291
  getRandomProvider,
288
292
  getTimeProvider,
289
293
  logger,
294
+ lookupInTreeCapability,
290
295
  ok,
291
296
  parseTierOverrides,
292
297
  resetOutcomeStore,
@@ -298,9 +303,10 @@ import {
298
303
  symbols,
299
304
  taskAnalysisResultToTaskProfile,
300
305
  toError,
306
+ validateTimeout,
301
307
  writeEmptyLine,
302
308
  writeLine
303
- } from "./chunk-O4KUCF5S.js";
309
+ } from "./chunk-Q3RFPJYK.js";
304
310
  import "./chunk-I7ORMAO7.js";
305
311
  import {
306
312
  detectSandbox,
@@ -519,7 +525,7 @@ function qualifiesBalanced(m) {
519
525
  return (m.qualityScores?.reasoning ?? 0) >= 7;
520
526
  }
521
527
  function bucketModels() {
522
- const all = DEFAULT_MODEL_CAPABILITIES.models;
528
+ const all = getInTreeCapabilitiesMatrix().models;
523
529
  const seenProvider = /* @__PURE__ */ new Set();
524
530
  const sortedByReasoning = [...all].sort(
525
531
  (a, b) => (b.qualityScores?.reasoning ?? 0) - (a.qualityScores?.reasoning ?? 0)
@@ -551,7 +557,7 @@ function pickOnePerProvider(models, tier, qualifies, seenProvider) {
551
557
  return out;
552
558
  }
553
559
  function pickDefaultModel() {
554
- const sorted = [...DEFAULT_MODEL_CAPABILITIES.models].sort(
560
+ const sorted = [...getInTreeCapabilitiesMatrix().models].sort(
555
561
  (a, b) => (b.qualityScores?.reasoning ?? 0) - (a.qualityScores?.reasoning ?? 0)
556
562
  );
557
563
  const sonnet = sorted.find((m) => m.id === "claude-sonnet");
@@ -569,7 +575,7 @@ function renderConfigTemplate() {
569
575
  # Documentation: https://github.com/williamzujkowski/nexus-agents
570
576
  #
571
577
  # Model identifiers below are derived from the canonical registry at
572
- # config/model-capabilities.ts. Update there to change defaults; this
578
+ # config/in-tree-data.ts. Update there to change defaults; this
573
579
  # template is regenerated each time config init runs.
574
580
 
575
581
  # Model configuration
@@ -4242,7 +4248,7 @@ function createPolicyEngine(options, logger17) {
4242
4248
  return createRuleBasedPolicy();
4243
4249
  }
4244
4250
  function createOrchestrator(policyEngine, agents, options) {
4245
- const config = { maxSteps: options.maxSteps ?? 5, timeoutMs: 3e5 };
4251
+ const config = { maxSteps: options.maxSteps ?? 5, timeoutMs: INTERNAL_TIMEOUTS.puppeteerMs };
4246
4252
  return options.learn === true ? new PuppeteerOrchestrator({
4247
4253
  policyEngine,
4248
4254
  agents,
@@ -5943,14 +5949,6 @@ function generateVoteHash(role, vote) {
5943
5949
  const hash = crypto.createHash("sha256").update(data).digest("hex").slice(0, 16);
5944
5950
  return { role, hash, timestamp: getTimeProvider().nowIso() };
5945
5951
  }
5946
- async function collectVotes(proposal, roles, simulateVotes, timeoutMs) {
5947
- return collectRealVotes({
5948
- roles,
5949
- proposal,
5950
- simulate: simulateVotes,
5951
- ...timeoutMs !== void 0 && { timeoutMs }
5952
- });
5953
- }
5954
5952
  function printVoteDetails(votes) {
5955
5953
  writeLine(`${colors.cyan}Votes${colors.reset}
5956
5954
  `);
@@ -6083,10 +6081,6 @@ function recordVoteToGitHub(issueNumber, result) {
6083
6081
  }
6084
6082
  }
6085
6083
  async function runVote(options) {
6086
- const threshold = THRESHOLD_MAP[options.threshold ?? "supermajority"] ?? "supermajority";
6087
- const useQuick = options.quick === true;
6088
- const roles = useQuick ? ["architect", "security", "scope_steward"] : ["architect", "security", "devex", "ai_ml", "pm", "catfish", "scope_steward"];
6089
- const start = getTimeProvider().now();
6090
6084
  const requestedTimeoutMs = options.timeoutMs ?? DEFAULT_VOTE_TIMEOUT_MS;
6091
6085
  const { value: timeoutMs, clamped } = validateTimeout(requestedTimeoutMs);
6092
6086
  const timeoutSec = timeoutMs / 1e3;
@@ -6096,33 +6090,28 @@ async function runVote(options) {
6096
6090
  `
6097
6091
  );
6098
6092
  }
6093
+ const useQuick = options.quick === true;
6094
+ const roleCount = useQuick ? 3 : 7;
6099
6095
  writeLine(
6100
- `${colors.dim}Collecting votes from ${String(roles.length)} agents (timeout: ${String(timeoutSec)}s each)...${colors.reset}
6096
+ `${colors.dim}Collecting votes from ${String(roleCount)} agents (timeout: ${String(timeoutSec)}s each)...${colors.reset}
6101
6097
  `
6102
6098
  );
6103
- const votes = await collectVotes(options.proposal, roles, options.dryRun === true, timeoutMs);
6104
- const validVotes = votes.filter((v) => v.source !== "error");
6105
- const engine = createConsensusEngine();
6106
- const proposal = {
6107
- title: "CLI Vote",
6108
- description: options.proposal,
6109
- algorithm: threshold
6099
+ const input = {
6100
+ proposal: options.proposal,
6101
+ quickMode: useQuick,
6102
+ simulateVotes: options.dryRun === true,
6103
+ ...options.threshold !== void 0 && { threshold: options.threshold },
6104
+ ...options.errorPolicy !== void 0 && { errorPolicy: options.errorPolicy }
6110
6105
  };
6111
- const proposalResult = await engine.propose(proposal);
6112
- if (!proposalResult.ok) throw new Error(proposalResult.error.message);
6113
- const proposalId = proposalResult.value;
6114
- for (const { role, vote } of validVotes) {
6115
- await engine.vote(proposalId, role, vote);
6116
- }
6117
- const resultRes = await engine.close(proposalId);
6118
- if (!resultRes.ok) throw new Error(resultRes.error.message);
6106
+ const logger17 = createLogger({ component: "cli-vote" });
6107
+ const result = await executeVoting(input, logger17, { voteTimeoutMs: timeoutMs });
6119
6108
  return {
6120
- proposal: options.proposal,
6121
- threshold,
6122
- result: resultRes.value,
6123
- votes,
6124
- totalTimeMs: getTimeProvider().now() - start,
6125
- simulateVotes: options.dryRun === true
6109
+ proposal: result.proposal,
6110
+ threshold: result.threshold,
6111
+ result: result.result,
6112
+ votes: result.votes,
6113
+ totalTimeMs: result.totalTimeMs,
6114
+ simulateVotes: result.simulateVotes
6126
6115
  };
6127
6116
  }
6128
6117
  function printDryRunBanner() {
@@ -8523,13 +8512,16 @@ async function handleAddCommand(args, options) {
8523
8512
  if (arxivId === void 0 || arxivId === "") {
8524
8513
  return "Error: arxiv-id is required for add command";
8525
8514
  }
8526
- const addOptions = {
8515
+ const topic = optString(options, "topic");
8516
+ const priority = optString(options, "priority");
8517
+ const input = {
8527
8518
  arxivId,
8528
- topic: optString(options, "topic"),
8529
- priority: optString(options, "priority"),
8530
- dryRun: optBoolean(options, "dryRun")
8519
+ dryRun: optBoolean(options, "dryRun"),
8520
+ ...topic !== void 0 && { topic },
8521
+ ...priority !== void 0 && { priority }
8531
8522
  };
8532
- const result = await addResearchPaper(addOptions);
8523
+ const logger17 = createLogger({ component: "cli-research-add" });
8524
+ const result = await executeResearchAdd(input, logger17);
8533
8525
  return result.message;
8534
8526
  }
8535
8527
  var SOURCE_PROVIDERS = [
@@ -8553,25 +8545,29 @@ async function queryDiscoverSources(topic, source, maxResults) {
8553
8545
  }
8554
8546
  return { results, errors };
8555
8547
  }
8556
- function formatDiscoverResults(topic, items, errors, maxResults) {
8548
+ function renderDiscoverResponse(response) {
8557
8549
  const lines = [];
8558
- lines.push(`Discovery Results: "${topic}"`);
8550
+ lines.push(`Discovery Results: "${response.topic}"`);
8559
8551
  lines.push("=".repeat(60));
8560
- lines.push(`Found ${String(items.length)} items`);
8552
+ lines.push(
8553
+ `Found ${String(response.totalFound)} items (${String(response.newItems)} new, ${String(response.alreadyInRegistry)} already in registry, ${String(response.filteredByRelevance)} filtered by relevance)`
8554
+ );
8561
8555
  lines.push("");
8562
- for (const item of items.slice(0, maxResults)) {
8556
+ for (const item of response.items) {
8563
8557
  lines.push(` [${item.source}] ${item.title}`);
8564
8558
  lines.push(` URL: ${item.url}`);
8565
- lines.push(` Relevance: ${item.relevance}`);
8559
+ if (item.relevanceScore !== void 0) {
8560
+ lines.push(` Relevance: ${item.relevanceScore.toFixed(2)}`);
8561
+ }
8566
8562
  if (item.description !== "") {
8567
8563
  const desc = item.description.length > 100 ? item.description.slice(0, 97) + "..." : item.description;
8568
8564
  lines.push(` ${desc}`);
8569
8565
  }
8570
8566
  lines.push("");
8571
8567
  }
8572
- if (errors.length > 0) {
8573
- lines.push("Errors:");
8574
- for (const err2 of errors) lines.push(` - ${err2}`);
8568
+ if (response.failedSources.length > 0) {
8569
+ lines.push("Failed sources:");
8570
+ for (const src of response.failedSources) lines.push(` - ${src}`);
8575
8571
  }
8576
8572
  return lines.join("\n");
8577
8573
  }
@@ -8580,10 +8576,19 @@ async function handleDiscoverCommand(args, options) {
8580
8576
  if (topic === void 0 || topic === "") {
8581
8577
  return "Error: --topic is required for discover command";
8582
8578
  }
8583
- const source = optString(options, "source") ?? "all";
8584
- const maxResults = optNumber(options, "maxResults") ?? 10;
8585
- const { results, errors } = await queryDiscoverSources(topic, source, maxResults);
8586
- return formatDiscoverResults(topic, results, errors, maxResults);
8579
+ const parsed = ResearchDiscoverInputSchema.safeParse({
8580
+ topic,
8581
+ ...optString(options, "source") !== void 0 && { source: optString(options, "source") },
8582
+ ...optNumber(options, "maxResults") !== void 0 && {
8583
+ maxResults: optNumber(options, "maxResults")
8584
+ }
8585
+ });
8586
+ if (!parsed.success) {
8587
+ return `Error: ${parsed.error.issues.map((i) => i.message).join("; ")}`;
8588
+ }
8589
+ const logger17 = createLogger({ component: "cli-research-discover" });
8590
+ const response = await executeDiscovery(parsed.data, logger17);
8591
+ return renderDiscoverResponse(response);
8587
8592
  }
8588
8593
  async function handleReviewCommand(args, options) {
8589
8594
  const topic = args[0] ?? optString(options, "topic");
@@ -16066,6 +16071,10 @@ var PARSE_ARGS_CONFIG = {
16066
16071
  type: "string",
16067
16072
  default: "90"
16068
16073
  },
16074
+ // #2630 — error policy for the vote command.
16075
+ "error-policy": {
16076
+ type: "string"
16077
+ },
16069
16078
  // SWE-bench command options
16070
16079
  variant: {
16071
16080
  type: "string",
@@ -16927,7 +16936,11 @@ var RUN_DEV_PIPELINE_DESCRIPTION = "Run the multi-agent development pipeline. Ac
16927
16936
  function registerDevPipelineTool(server, _deps) {
16928
16937
  server.registerTool(
16929
16938
  "run_dev_pipeline",
16930
- { description: RUN_DEV_PIPELINE_DESCRIPTION, inputSchema: DevPipelineInputSchema.shape },
16939
+ {
16940
+ description: RUN_DEV_PIPELINE_DESCRIPTION,
16941
+ inputSchema: DevPipelineInputSchema.shape,
16942
+ annotations: getToolAnnotations("run_dev_pipeline")
16943
+ },
16931
16944
  async (args) => {
16932
16945
  const input = DevPipelineInputSchema.parse(args);
16933
16946
  if (input.simulateVotes) {
@@ -16955,8 +16968,10 @@ function registerDevPipelineTool(server, _deps) {
16955
16968
  };
16956
16969
  } catch (error) {
16957
16970
  return {
16958
- content: [{ type: "text", text: `Pipeline error: ${getErrorMessage(error)}` }],
16959
- isError: true
16971
+ ...toolStructuredError({
16972
+ errorCategory: "internal",
16973
+ message: `Pipeline error: ${getErrorMessage(error)}`
16974
+ })
16960
16975
  };
16961
16976
  }
16962
16977
  }
@@ -19472,7 +19487,10 @@ function isValidOrchestrateModel(value) {
19472
19487
  return CLI_NAMES.includes(value);
19473
19488
  }
19474
19489
  function isValidThreshold(value) {
19475
- return ["majority", "supermajority", "unanimous"].includes(value);
19490
+ return VoteThresholdSchema.safeParse(value).success;
19491
+ }
19492
+ function isValidErrorPolicy(value) {
19493
+ return ErrorPolicySchema.safeParse(value).success;
19476
19494
  }
19477
19495
  function isValidIndexSubcommand(value) {
19478
19496
  const validSubcommands = [
@@ -19761,9 +19779,12 @@ async function handleVoteCommand(args) {
19761
19779
  }
19762
19780
  const threshold = args.options.threshold;
19763
19781
  const validThreshold = threshold !== void 0 && isValidThreshold(threshold) ? threshold : void 0;
19782
+ const errorPolicy = args.options.errorPolicy;
19783
+ const validErrorPolicy = errorPolicy !== void 0 && isValidErrorPolicy(errorPolicy) ? errorPolicy : void 0;
19764
19784
  const exitCode = await voteCommand({
19765
19785
  proposal,
19766
19786
  ...validThreshold !== void 0 && { threshold: validThreshold },
19787
+ ...validErrorPolicy !== void 0 && { errorPolicy: validErrorPolicy },
19767
19788
  dryRun: args.options.dryRun,
19768
19789
  quick: args.options.quick,
19769
19790
  verbose: args.options.verbose
@@ -19813,7 +19834,7 @@ async function handleResearchCommand(args) {
19813
19834
  }
19814
19835
  }
19815
19836
  async function handleRegistryCommand(args) {
19816
- const { registryCommand, isValidRegistrySubcommand, formatRegistryUsage } = await import("./registry-command-NCWUJKAF.js");
19837
+ const { registryCommand, isValidRegistrySubcommand, formatRegistryUsage } = await import("./registry-command-HYWVRAHE.js");
19817
19838
  const subcommand = args.subcommand;
19818
19839
  if (!isValidRegistrySubcommand(subcommand)) {
19819
19840
  process.stdout.write(`${formatRegistryUsage()}
@@ -19861,7 +19882,7 @@ async function handleVerifyCommand(args) {
19861
19882
  async function handleDoctorCommand(args) {
19862
19883
  const exitCode = await doctorCommand({ fix: args.options.fix });
19863
19884
  if (args.options.deep) {
19864
- const { runDeepDiagnostics: runDeepDiagnostics2, formatDeepDiagnostics: formatDeepDiagnostics2 } = await import("./doctor-deep-AHDTNURD.js");
19885
+ const { runDeepDiagnostics: runDeepDiagnostics2, formatDeepDiagnostics: formatDeepDiagnostics2 } = await import("./doctor-deep-ONHJTGR4.js");
19865
19886
  const diag = runDeepDiagnostics2();
19866
19887
  process.stdout.write(formatDeepDiagnostics2(diag) + "\n");
19867
19888
  }
@@ -19905,7 +19926,7 @@ async function handleInitCommand(args) {
19905
19926
  process.exit(result.success ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED);
19906
19927
  }
19907
19928
  async function runInitOpencodeFlow(args) {
19908
- const { runInitOpencode } = await import("./init-opencode-EIOIPVWL.js");
19929
+ const { runInitOpencode } = await import("./init-opencode-Z7OQ5RCB.js");
19909
19930
  const opencodePath = args.options.opencode;
19910
19931
  if (opencodePath === void 0 || opencodePath === "") {
19911
19932
  process.stderr.write("Error: --opencode requires a path argument.\n");
@@ -19932,7 +19953,7 @@ async function runInitOpencodeFlow(args) {
19932
19953
  process.exit(EXIT_CODES.SUCCESS);
19933
19954
  }
19934
19955
  async function renderOpencodeValidate(opencodePath) {
19935
- const { runOpencodeValidate } = await import("./init-opencode-EIOIPVWL.js");
19956
+ const { runOpencodeValidate } = await import("./init-opencode-Z7OQ5RCB.js");
19936
19957
  const result = await runOpencodeValidate(opencodePath);
19937
19958
  if (!result.ok) {
19938
19959
  process.stderr.write(`init --opencode --validate: ${result.reason ?? "failed"}
@@ -19972,7 +19993,7 @@ async function handleSetupCommandAsync(args) {
19972
19993
  process.exit(exitCode === 0 ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED);
19973
19994
  }
19974
19995
  async function runCustomApiSetup(args) {
19975
- const { configureCustomApi } = await import("./setup-custom-api-DHJ5DRH2.js");
19996
+ const { configureCustomApi } = await import("./setup-custom-api-VD5W754A.js");
19976
19997
  const baseUrl = args.options.customApi;
19977
19998
  if (baseUrl === void 0) return EXIT_CODES.SERVER_START_FAILED;
19978
19999
  const input = {
@@ -20696,8 +20717,9 @@ function fmtContext(tokens) {
20696
20717
  return String(tokens / 1e3) + "K";
20697
20718
  }
20698
20719
  function renderListTable() {
20699
- const models = DEFAULT_MODEL_CAPABILITIES.models;
20700
- const ver = String(DEFAULT_MODEL_CAPABILITIES.version);
20720
+ const matrix = getInTreeCapabilitiesMatrix();
20721
+ const models = matrix.models;
20722
+ const ver = String(matrix.version);
20701
20723
  write(`
20702
20724
  ${C.bold}Model Capabilities Matrix${C.reset} (v${ver})
20703
20725
  `);
@@ -20713,10 +20735,10 @@ ${C.bold}Model Capabilities Matrix${C.reset} (v${ver})
20713
20735
  write("");
20714
20736
  }
20715
20737
  function renderListJson() {
20716
- write(JSON.stringify(DEFAULT_MODEL_CAPABILITIES, null, 2));
20738
+ write(JSON.stringify(getInTreeCapabilitiesMatrix(), null, 2));
20717
20739
  }
20718
20740
  function renderListMarkdown() {
20719
- const models = DEFAULT_MODEL_CAPABILITIES.models;
20741
+ const models = getInTreeCapabilitiesMatrix().models;
20720
20742
  write("# Model Capabilities Matrix\n");
20721
20743
  write("| Model | Provider | Context | Image Out | Audio | MCP | Sandbox | Thinking | Research |");
20722
20744
  write("|-------|----------|---------|-----------|-------|-----|---------|----------|----------|");
@@ -20831,11 +20853,11 @@ function handleCompare(args) {
20831
20853
  write(`${C.red}Usage: nexus-agents capabilities compare <model1> <model2>${C.reset}`);
20832
20854
  process.exit(EXIT_CODES.INVALID_ARGS);
20833
20855
  }
20834
- const m1 = getModelCapabilities(id1);
20835
- const m2 = getModelCapabilities(id2);
20856
+ const m1 = lookupInTreeCapability(id1);
20857
+ const m2 = lookupInTreeCapability(id2);
20836
20858
  if (m1 === void 0 || m2 === void 0) {
20837
20859
  const missing = m1 === void 0 ? id1 : id2;
20838
- const ids = DEFAULT_MODEL_CAPABILITIES.models.map((m) => m.id).join(", ");
20860
+ const ids = getInTreeCapabilitiesMatrix().models.map((m) => m.id).join(", ");
20839
20861
  write(`${C.red}Unknown model: ${missing}${C.reset}`);
20840
20862
  write(`Valid models: ${ids}`);
20841
20863
  process.exit(EXIT_CODES.INVALID_ARGS);
@@ -22440,6 +22462,10 @@ var VOTE_HELP = {
22440
22462
  { flag: "--quick", description: "Use 3 agents instead of 6 for faster votes" },
22441
22463
  { flag: "--dry-run", description: "Simulate votes without agent execution" },
22442
22464
  { flag: "--timeout=<seconds>", description: "Timeout per vote in seconds", defaultValue: "90" },
22465
+ {
22466
+ flag: "--error-policy <p>",
22467
+ description: "How to count errored/timed-out voters: reduce_denominator | count_as_abstain | fail_closed (default: fail_closed for unanimous, reduce_denominator otherwise)"
22468
+ },
22443
22469
  { flag: "--verbose", description: "Show vote verification hashes" }
22444
22470
  ],
22445
22471
  requiresApiKey: ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GOOGLE_AI_API_KEY"]
@@ -22666,19 +22692,25 @@ function buildOrchestrateOptions(values) {
22666
22692
  };
22667
22693
  }
22668
22694
  function parseThreshold(value) {
22669
- if (value === "majority" || value === "supermajority" || value === "unanimous") {
22670
- return value;
22671
- }
22672
- return void 0;
22695
+ if (value === void 0) return void 0;
22696
+ const parsed = VoteThresholdSchema.safeParse(value);
22697
+ return parsed.success ? parsed.data : void 0;
22698
+ }
22699
+ function parseErrorPolicy(value) {
22700
+ if (value === void 0) return void 0;
22701
+ const parsed = ErrorPolicySchema.safeParse(value);
22702
+ return parsed.success ? parsed.data : void 0;
22673
22703
  }
22674
22704
  function buildVoteOptions(values) {
22675
22705
  const threshold = parseThreshold(values.threshold);
22676
22706
  const timeoutSec = parseNumericOption(values.timeout);
22677
22707
  const timeoutMs = timeoutSec !== void 0 ? timeoutSec * 1e3 : void 0;
22708
+ const errorPolicy = parseErrorPolicy(values["error-policy"]);
22678
22709
  return {
22679
22710
  ...values.proposal !== void 0 && { proposal: values.proposal },
22680
22711
  ...threshold !== void 0 && { threshold },
22681
- ...timeoutMs !== void 0 && { timeoutMs }
22712
+ ...timeoutMs !== void 0 && { timeoutMs },
22713
+ ...errorPolicy !== void 0 && { errorPolicy }
22682
22714
  };
22683
22715
  }
22684
22716
  function parseSweBenchVariant(value) {