nexus-agents 8.110.0 → 8.111.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.
@@ -19,10 +19,10 @@ import {
19
19
  toolSuccessStructured,
20
20
  withProgressHeartbeat,
21
21
  wrapToolWithTimeout
22
- } from "./chunk-SWHKENEB.js";
22
+ } from "./chunk-6ECPHGKC.js";
23
23
  import {
24
24
  VERSION
25
- } from "./chunk-PLNSFL2K.js";
25
+ } from "./chunk-J2JGTORM.js";
26
26
  import {
27
27
  allOf
28
28
  } from "./chunk-EZNIYU5T.js";
@@ -10061,4 +10061,4 @@ export {
10061
10061
  CONSENSUS_VOTE_TOOL_SCHEMA,
10062
10062
  registerConsensusVoteTool
10063
10063
  };
10064
- //# sourceMappingURL=chunk-FOBWXDHO.js.map
10064
+ //# sourceMappingURL=chunk-52T77E5J.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-PLNSFL2K.js";
3
+ } from "./chunk-J2JGTORM.js";
4
4
  import {
5
5
  resolveInsideRoot
6
6
  } from "./chunk-XEPZSDN5.js";
@@ -2329,4 +2329,4 @@ export {
2329
2329
  DEFAULT_CONSENSUS_CONFIG,
2330
2330
  ConsensusMetricsSchema
2331
2331
  };
2332
- //# sourceMappingURL=chunk-SWHKENEB.js.map
2332
+ //# sourceMappingURL=chunk-6ECPHGKC.js.map
@@ -7,7 +7,7 @@ import {
7
7
  toolStructuredError,
8
8
  toolSuccessStructured,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-SWHKENEB.js";
10
+ } from "./chunk-6ECPHGKC.js";
11
11
  import {
12
12
  JsonlStore,
13
13
  SECURITY_KEYWORDS,
@@ -2293,4 +2293,4 @@ export {
2293
2293
  runImprovementReview,
2294
2294
  registerImprovementReviewTool
2295
2295
  };
2296
- //# sourceMappingURL=chunk-AG2XK7CQ.js.map
2296
+ //# sourceMappingURL=chunk-AQZHRX7L.js.map
@@ -1,6 +1,6 @@
1
1
  // src/version.ts
2
2
  import semver from "semver";
3
- var VERSION = true ? "8.110.0" : "dev";
3
+ var VERSION = true ? "8.111.0" : "dev";
4
4
  var NODE_ENGINE_RANGE = ">=22.5.0";
5
5
  function isNodeVersionSupported(version) {
6
6
  return semver.satisfies(version, NODE_ENGINE_RANGE);
@@ -11,4 +11,4 @@ export {
11
11
  NODE_ENGINE_RANGE,
12
12
  isNodeVersionSupported
13
13
  };
14
- //# sourceMappingURL=chunk-PLNSFL2K.js.map
14
+ //# sourceMappingURL=chunk-J2JGTORM.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-GCQLEDCY.js";
10
10
  import {
11
11
  withPrerequisite
12
- } from "./chunk-AG2XK7CQ.js";
12
+ } from "./chunk-AQZHRX7L.js";
13
13
  import {
14
14
  generateSecurityPlan
15
15
  } from "./chunk-U5TT4C5O.js";
@@ -36,7 +36,7 @@ import {
36
36
  import {
37
37
  DEFAULT_TASK_TTL_MS,
38
38
  clampTaskTtl
39
- } from "./chunk-OTIVROWE.js";
39
+ } from "./chunk-UPVOYMYO.js";
40
40
  import {
41
41
  executeExpert
42
42
  } from "./chunk-CX3YZ4S6.js";
@@ -92,7 +92,7 @@ import {
92
92
  withFileLock,
93
93
  withWarnings,
94
94
  writeJobCancelled
95
- } from "./chunk-FOBWXDHO.js";
95
+ } from "./chunk-52T77E5J.js";
96
96
  import {
97
97
  NOOP_NOTIFIER,
98
98
  RateLimiter,
@@ -120,10 +120,10 @@ import {
120
120
  toolSuccessStructured,
121
121
  withProgressHeartbeat,
122
122
  wrapToolWithTimeout
123
- } from "./chunk-SWHKENEB.js";
123
+ } from "./chunk-6ECPHGKC.js";
124
124
  import {
125
125
  VERSION
126
- } from "./chunk-PLNSFL2K.js";
126
+ } from "./chunk-J2JGTORM.js";
127
127
  import {
128
128
  allOf,
129
129
  anyOf
@@ -266,6 +266,7 @@ import {
266
266
  } from "./chunk-5O4KT2WO.js";
267
267
  import {
268
268
  AbortError,
269
+ getDefaultCliCircuitBreakerRegistry,
269
270
  isTimeoutAbortReason,
270
271
  raceAbort,
271
272
  throwIfAborted
@@ -369,6 +370,7 @@ import {
369
370
  getTokenEstimator,
370
371
  hasGatewaySlotCatalog,
371
372
  isBanditInterceptFeature,
373
+ isCliName,
372
374
  isDisabledSlotUnserved,
373
375
  isErr,
374
376
  isRateLimitLikeError,
@@ -46963,7 +46965,7 @@ function buildVotingInput(plan, config) {
46963
46965
  }
46964
46966
  async function executeSingleVote(plan, config, log) {
46965
46967
  try {
46966
- const { executeVoting } = await import("./consensus-vote-OIQKDL5M.js");
46968
+ const { executeVoting } = await import("./consensus-vote-YUVLW5S4.js");
46967
46969
  const input = buildVotingInput(plan, config);
46968
46970
  const result = await executeVoting(input, log);
46969
46971
  return parseVotingResult(result);
@@ -48010,7 +48012,7 @@ function createVoteStage({ config, startStage }) {
48010
48012
  const strategy = config.votingStrategy ?? "higher_order";
48011
48013
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
48012
48014
  try {
48013
- const { executeVoting } = await import("./consensus-vote-OIQKDL5M.js");
48015
+ const { executeVoting } = await import("./consensus-vote-YUVLW5S4.js");
48014
48016
  const votingResult = await executeVoting(
48015
48017
  {
48016
48018
  proposal: buildVoteProposal(plan, research),
@@ -48920,13 +48922,31 @@ function parseTasksFromResponse(response, fallbackPlan) {
48920
48922
  }
48921
48923
  ];
48922
48924
  }
48923
- function parseQaFromResponse(response) {
48924
- const l = response.toLowerCase();
48925
- if (l.includes("reject"))
48926
- return { verdict: "reject", feedback: response, issues: extractIssues(response) };
48927
- if (l.includes("needs_work") || l.includes("needs work"))
48928
- return { verdict: "needs_work", feedback: response, issues: extractIssues(response) };
48929
- return { verdict: "pass", feedback: response, issues: [] };
48925
+ var VERDICT_LINE = /^[\s#>*_`-]*(?:(?:final\s+)?(?:verdict|assessment|decision|result|status)[*_`]*\s*[:-][\s*_`]*)?(pass|needs[_ ]work|reject)[*_`]*\s*(?:[:.,;)—–-]|$)/i;
48926
+ var VERDICT_SEVERITY = {
48927
+ pass: 0,
48928
+ needs_work: 1,
48929
+ reject: 2
48930
+ };
48931
+ function toVerdict(token) {
48932
+ const t = token.toLowerCase();
48933
+ if (t === "pass") return "pass";
48934
+ if (t === "reject") return "reject";
48935
+ return "needs_work";
48936
+ }
48937
+ function parseQaVerdict(response) {
48938
+ let found;
48939
+ for (const line of response.split("\n")) {
48940
+ const token = VERDICT_LINE.exec(line)?.[1];
48941
+ if (token === void 0) continue;
48942
+ const verdict = toVerdict(token);
48943
+ if (found === void 0 || VERDICT_SEVERITY[verdict] > VERDICT_SEVERITY[found]) {
48944
+ found = verdict;
48945
+ }
48946
+ }
48947
+ if (found === void 0) return void 0;
48948
+ const issues = found === "pass" ? [] : extractIssues(response);
48949
+ return { verdict: found, feedback: response, issues };
48930
48950
  }
48931
48951
  function extractIssues(text) {
48932
48952
  return text.split("\n").filter((l) => /^\s*[-*]/.test(l)).map((l) => l.trim().replace(/^[-*]\s*/, "")).filter((l) => l.length > 5).slice(0, 10);
@@ -49114,6 +49134,25 @@ ${task.description}${fb}`,
49114
49134
  return `[Implementation failed: ${r.error ?? "unknown error"}]`;
49115
49135
  };
49116
49136
  }
49137
+ function readQaReview(r) {
49138
+ if (!r.success) {
49139
+ const reason2 = `QA review unmeasured: the QA expert call failed (${r.error ?? "unknown error"}); no verdict was produced.`;
49140
+ return {
49141
+ review: { verdict: "needs_work", feedback: reason2, issues: [reason2] },
49142
+ unmeasured: "call-failed"
49143
+ };
49144
+ }
49145
+ const parsed = parseQaVerdict(r.text);
49146
+ if (parsed !== void 0) return { review: parsed };
49147
+ const excerpt = r.text.trim() === "" ? "(empty reply)" : r.text.slice(0, 500);
49148
+ const reason = "QA review unmeasured: no PASS / NEEDS_WORK / REJECT verdict could be read from the reviewer reply.";
49149
+ return {
49150
+ review: { verdict: "needs_work", feedback: `${reason}
49151
+
49152
+ ${excerpt}`, issues: [reason] },
49153
+ unmeasured: "unreadable"
49154
+ };
49155
+ }
49117
49156
  function createQaReviewStage({
49118
49157
  config,
49119
49158
  guard,
@@ -49124,7 +49163,7 @@ function createQaReviewStage({
49124
49163
  await postProgress(config, `QA [${task.id}]`, "QA expert reviewing...");
49125
49164
  const { prompt, coverage } = buildQaPrompt(task.title, implementation);
49126
49165
  const r = await runExpert(guard, "qa", prompt, task.id, signal);
49127
- const parsed = parseQaFromResponse(r.text);
49166
+ const { review: parsed, unmeasured } = readQaReview(r);
49128
49167
  const review = coverage !== void 0 ? { ...parsed, coverage } : parsed;
49129
49168
  emitStageEvent2(`qa-${task.id}`, review.verdict === "pass" ? "completed" : "failed", {
49130
49169
  durationMs: r.durationMs,
@@ -49137,10 +49176,18 @@ function createQaReviewStage({
49137
49176
  // #6521 I2: the row scores the reviewer's CALL; the verdict judges the
49138
49177
  // implementation, so it rides as a signal, not as `success`.
49139
49178
  ...outcomeFieldsFromBridge(r),
49140
- qualitySignals: [`qa-verdict:${review.verdict}`]
49179
+ qualitySignals: [
49180
+ `qa-verdict:${review.verdict}`,
49181
+ ...unmeasured !== void 0 ? [`qa-unmeasured:${unmeasured}`] : []
49182
+ ]
49141
49183
  });
49142
49184
  if (review.verdict === "pass") {
49143
49185
  recordLearning(`Task "${task.title}" passed QA`, 0.8, "pipeline-qa");
49186
+ } else if (unmeasured !== void 0) {
49187
+ recordMemoryError(
49188
+ `QA review of "${task.title}" unmeasured (${unmeasured})`,
49189
+ "QA produced no verdict"
49190
+ );
49144
49191
  } else {
49145
49192
  recordMemoryError(
49146
49193
  `QA rejected "${task.title}": ${review.feedback.slice(0, 150)}`,
@@ -51354,6 +51401,44 @@ function mapStatusPageStatus(raw) {
51354
51401
  if (raw === "partial_outage" || raw === "major_outage") return "outage";
51355
51402
  return "unknown";
51356
51403
  }
51404
+ var ACTIONS_COMPONENT_ID = "br0l2tvcx85d";
51405
+ var ACTIONS_COMPONENT_NAMES = ["Actions", "GitHub Actions"];
51406
+ function findActionsComponent(components) {
51407
+ return components.find((c) => c.id === ACTIONS_COMPONENT_ID) ?? components.find((c) => c.name !== void 0 && ACTIONS_COMPONENT_NAMES.includes(c.name));
51408
+ }
51409
+ function componentNotFoundEvidence(components) {
51410
+ const names = components.map((c) => c.name ?? "(unnamed)").join(", ");
51411
+ return `Actions component not found in status feed (looked for id ${ACTIONS_COMPONENT_ID} or name ${ACTIONS_COMPONENT_NAMES.map((n) => `'${n}'`).join(" / ")}); feed listed ${String(components.length)} components: ${names}`;
51412
+ }
51413
+ function signalFromComponents(payload) {
51414
+ if (!Array.isArray(payload.components)) {
51415
+ return {
51416
+ source: "github-status",
51417
+ status: "unknown",
51418
+ evidence: "status feed response has no components array"
51419
+ };
51420
+ }
51421
+ const actions = findActionsComponent(payload.components);
51422
+ if (actions === void 0) {
51423
+ return {
51424
+ source: "github-status",
51425
+ status: "unknown",
51426
+ evidence: componentNotFoundEvidence(payload.components)
51427
+ };
51428
+ }
51429
+ if (actions.status === void 0) {
51430
+ return {
51431
+ source: "github-status",
51432
+ status: "unknown",
51433
+ evidence: `Actions component '${actions.name ?? ACTIONS_COMPONENT_ID}' is in the status feed but has no status`
51434
+ };
51435
+ }
51436
+ return {
51437
+ source: "github-status",
51438
+ status: mapStatusPageStatus(actions.status),
51439
+ evidence: `Actions component reports: ${actions.status}`
51440
+ };
51441
+ }
51357
51442
  async function checkGithubStatus(logger58) {
51358
51443
  try {
51359
51444
  const res = await fetch(STATUS_PAGE_URL, {
@@ -51368,19 +51453,7 @@ async function checkGithubStatus(logger58) {
51368
51453
  };
51369
51454
  }
51370
51455
  const payload = await res.json();
51371
- const actions = payload.components?.find((c) => c.name === "GitHub Actions");
51372
- if (actions?.status === void 0) {
51373
- return {
51374
- source: "github-status",
51375
- status: "unknown",
51376
- evidence: "GitHub Actions component not found in status page response"
51377
- };
51378
- }
51379
- return {
51380
- source: "github-status",
51381
- status: mapStatusPageStatus(actions.status),
51382
- evidence: `GitHub Actions component reports: ${actions.status}`
51383
- };
51456
+ return signalFromComponents(payload);
51384
51457
  } catch (err2) {
51385
51458
  logger58.warn("Status page fetch failed", {
51386
51459
  error: err2 instanceof Error ? err2.message : String(err2)
@@ -54092,7 +54165,7 @@ function registerRunTool(server, deps) {
54092
54165
 
54093
54166
  // src/mcp/tools/list-available-models-tool.ts
54094
54167
  import { z as z117 } from "zod";
54095
- var DESCRIPTION5 = "Probe every model-discovery transport (OpenRouter API, the configured gateway, and the opencode/claude/codex/gemini CLIs) and report a per-transport health summary: probe ok/failed, model count, and a sample of ids. Use it to validate the CLIs and APIs are wired and reachable. Read-only; does not change routing.";
54168
+ var DESCRIPTION5 = "Probe every model-discovery transport (OpenRouter API, the configured gateway, and the opencode/claude/codex/gemini CLIs) and report a per-transport health summary: probe ok/failed, model count, a sample of ids, and for each CLI whether its shared circuit breaker is open (the router refuses it while open). Use it to validate the CLIs and APIs are wired and reachable. Read-only; does not change routing.";
54096
54169
  var PROBE_TIMEOUT_MS = 12e3;
54097
54170
  var ListAvailableModelsInputSchema = z117.object({
54098
54171
  includeModelIds: z117.boolean().optional().describe("Include the full model-id list per transport (default false \u2192 sample of 5 only)."),
@@ -54129,6 +54202,13 @@ async function probeSource(source, includeModelIds) {
54129
54202
  if (timer !== void 0) clearTimeout(timer);
54130
54203
  }
54131
54204
  }
54205
+ function withBreakerState(report) {
54206
+ if (!isCliName(report.transport)) return report;
54207
+ return {
54208
+ ...report,
54209
+ breakerOpen: getDefaultCliCircuitBreakerRegistry().isOpen(report.transport)
54210
+ };
54211
+ }
54132
54212
  var GATEWAY_TRANSPORT = "gateway";
54133
54213
  var GATEWAY_API_ARM = "api:custom-openai";
54134
54214
  async function gatewaySource(apiArm) {
@@ -54170,14 +54250,16 @@ async function listAvailableModelsHandler(args, deps, logger58) {
54170
54250
  const includeModelIds = parsed.data.includeModelIds ?? false;
54171
54251
  const includeOpenRouter = parsed.data.includeOpenRouter ?? true;
54172
54252
  const sources = deps.sourcesFactory !== void 0 ? deps.sourcesFactory(includeOpenRouter) : await defaultSources(includeOpenRouter, deps.adaptersFactory);
54173
- const transports = await Promise.all(sources.map((s) => probeSource(s, includeModelIds)));
54253
+ const probed = await Promise.all(sources.map((s) => probeSource(s, includeModelIds)));
54254
+ const transports = probed.map(withBreakerState);
54174
54255
  const response = {
54175
54256
  transports,
54176
54257
  healthyTransports: transports.filter((t) => t.servesModels).length,
54177
54258
  reachableTransports: transports.filter((t) => t.ok).length,
54178
54259
  totalTransports: transports.length,
54179
54260
  totalModels: transports.reduce((sum, t) => sum + t.modelCount, 0),
54180
- note: "Probe results \u2014 existence only; the in-tree registry remains authoritative for pricing/capability. healthyTransports counts transports that can serve a model; reachableTransports counts probes that merely succeeded."
54261
+ breakerOpenTransports: transports.filter((t) => t.breakerOpen === true).map((t) => t.transport),
54262
+ note: "Probe results \u2014 existence only; the in-tree registry remains authoritative for pricing/capability. healthyTransports counts transports that can serve a model; reachableTransports counts probes that merely succeeded. breakerOpen marks a CLI transport the router is currently refusing (shared circuit breaker open), whatever its probe said."
54181
54263
  };
54182
54264
  logger58.debug("list_available_models probed transports", {
54183
54265
  healthy: response.healthyTransports,
@@ -57434,4 +57516,4 @@ export {
57434
57516
  startPipelineEventBridge,
57435
57517
  shutdownPipelineEventBridge
57436
57518
  };
57437
- //# sourceMappingURL=chunk-33OFW2GU.js.map
57519
+ //# sourceMappingURL=chunk-JFTSRUO3.js.map