nexus-agents 4.29.3 → 4.29.4

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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-FXUZW7IY.js";
3
+ } from "./chunk-FCCDE2MC.js";
4
4
  import {
5
5
  emitClawGuardViolation
6
6
  } from "./chunk-RV57MIQU.js";
@@ -2116,4 +2116,4 @@ export {
2116
2116
  VOTING_THRESHOLDS,
2117
2117
  ConsensusMetricsSchema
2118
2118
  };
2119
- //# sourceMappingURL=chunk-JKLMPBSL.js.map
2119
+ //# sourceMappingURL=chunk-4AIIPSOD.js.map
@@ -23,7 +23,7 @@ import {
23
23
  toolSuccessStructured,
24
24
  withProgressHeartbeat,
25
25
  wrapToolWithTimeout
26
- } from "./chunk-JKLMPBSL.js";
26
+ } from "./chunk-4AIIPSOD.js";
27
27
  import {
28
28
  assessPanelIndependence,
29
29
  countDistinctModels,
@@ -6720,6 +6720,7 @@ function registerConsensusVoteTool(server, deps) {
6720
6720
  }
6721
6721
 
6722
6722
  export {
6723
+ VOTER_ROLES,
6723
6724
  JobStatusSchema,
6724
6725
  isAbandonedJob,
6725
6726
  writeJobCancelled,
@@ -6737,7 +6738,6 @@ export {
6737
6738
  DEFAULT_VOTE_TIMEOUT_MS,
6738
6739
  isRateLimitError,
6739
6740
  PersistentOutcomeStore,
6740
- VOTER_ROLES,
6741
6741
  NoAdapterError,
6742
6742
  collectRealVotes,
6743
6743
  VotingRoundPhaseSchema,
@@ -6803,4 +6803,4 @@ export {
6803
6803
  CONSENSUS_VOTE_TOOL_SCHEMA,
6804
6804
  registerConsensusVoteTool
6805
6805
  };
6806
- //# sourceMappingURL=chunk-MEU6YH4G.js.map
6806
+ //# sourceMappingURL=chunk-DTKGR6NY.js.map
@@ -0,0 +1,7 @@
1
+ // src/version.ts
2
+ var VERSION = true ? "4.29.4" : "dev";
3
+
4
+ export {
5
+ VERSION
6
+ };
7
+ //# sourceMappingURL=chunk-FCCDE2MC.js.map
@@ -7,7 +7,7 @@ import {
7
7
  toolStructuredError,
8
8
  toolSuccessStructured,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-JKLMPBSL.js";
10
+ } from "./chunk-4AIIPSOD.js";
11
11
  import {
12
12
  JsonlStore,
13
13
  SECURITY_KEYWORDS,
@@ -2133,4 +2133,4 @@ export {
2133
2133
  runImprovementReview,
2134
2134
  registerImprovementReviewTool
2135
2135
  };
2136
- //# sourceMappingURL=chunk-IFL7MZQT.js.map
2136
+ //# sourceMappingURL=chunk-JL52FIXV.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-OQB3XC5O.js";
7
7
  import {
8
8
  VERSION
9
- } from "./chunk-FXUZW7IY.js";
9
+ } from "./chunk-FCCDE2MC.js";
10
10
  import {
11
11
  capitalize
12
12
  } from "./chunk-6T3EPABN.js";
@@ -1201,7 +1201,7 @@ async function runDoctorFix(result) {
1201
1201
  writeLine2("\u2500".repeat(40));
1202
1202
  let fixCount = 0;
1203
1203
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
1204
- const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-R26GPW7G.js");
1204
+ const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-2PDBROZJ.js");
1205
1205
  const outcome = describeDataDirFix2(initDataDirectories2());
1206
1206
  writeLine2(outcome.line);
1207
1207
  if (outcome.counted) fixCount++;
@@ -1303,4 +1303,4 @@ export {
1303
1303
  startStdioServer,
1304
1304
  closeServer
1305
1305
  };
1306
- //# sourceMappingURL=chunk-DDE4TLD6.js.map
1306
+ //# sourceMappingURL=chunk-NIEIQARS.js.map
@@ -21,12 +21,13 @@ import {
21
21
  import {
22
22
  DEFAULT_TASK_TTL_MS,
23
23
  clampTaskTtl
24
- } from "./chunk-DDE4TLD6.js";
24
+ } from "./chunk-NIEIQARS.js";
25
25
  import {
26
26
  executeExpert
27
27
  } from "./chunk-XEGZYUPX.js";
28
28
  import {
29
29
  JobStatusSchema,
30
+ VOTER_ROLES,
30
31
  abortJob,
31
32
  checkSimulationAllowed,
32
33
  collectRealVotes,
@@ -46,7 +47,7 @@ import {
46
47
  simulationDeniedResult,
47
48
  toJobSummary,
48
49
  writeJobCancelled
49
- } from "./chunk-MEU6YH4G.js";
50
+ } from "./chunk-DTKGR6NY.js";
50
51
  import {
51
52
  allOf
52
53
  } from "./chunk-OQB3XC5O.js";
@@ -63,7 +64,7 @@ import {
63
64
  } from "./chunk-UBWHBW7S.js";
64
65
  import {
65
66
  withPrerequisite
66
- } from "./chunk-IFL7MZQT.js";
67
+ } from "./chunk-JL52FIXV.js";
67
68
  import {
68
69
  NOOP_NOTIFIER,
69
70
  RateLimiter,
@@ -87,7 +88,7 @@ import {
87
88
  withAuditTrail,
88
89
  withProgressHeartbeat,
89
90
  wrapToolWithTimeout
90
- } from "./chunk-JKLMPBSL.js";
91
+ } from "./chunk-4AIIPSOD.js";
91
92
  import {
92
93
  createAuditTrail,
93
94
  createGraphAuditBridge,
@@ -871,6 +872,9 @@ function levenshtein(a, b) {
871
872
  var positiveIntStr = z10.string().regex(/^\d+$/, "Must be a positive integer string");
872
873
  var boolStr = z10.enum(["true", "false"]);
873
874
  var floatStr = z10.string().regex(/^\d+(\.\d+)?$/, "Must be a non-negative number string");
875
+ var boolLooseStr = z10.string().refine((v) => ["true", "1", "false", "0"].includes(v.toLowerCase()), {
876
+ message: "Must be one of: true, false, 1, 0"
877
+ });
874
878
  var NexusEnvSchema = z10.object({
875
879
  // --- Timeouts ---
876
880
  NEXUS_TIMEOUT_CLI: positiveIntStr.optional(),
@@ -996,9 +1000,77 @@ var NexusEnvSchema = z10.object({
996
1000
  NEXUS_HOOK_VERBOSE: boolStr.optional(),
997
1001
  NEXUS_SESSIONS_DB: z10.string().optional(),
998
1002
  NEXUS_DISABLE_SESSIONS: boolStr.optional(),
999
- NEXUS_DISABLE_METRICS: boolStr.optional()
1003
+ NEXUS_DISABLE_METRICS: boolStr.optional(),
1004
+ // --- Read by production code but previously unregistered (#5142) ---
1005
+ // Each type below was verified against the consuming call site, not inferred
1006
+ // from the name. Registering with a wrong type would replace "unknown
1007
+ // variable" with "invalid value" on a value that actually works — trading one
1008
+ // misreport for a worse one. Variables whose accepted set needed a judgement
1009
+ // call are tracked in docs/ops/env-schema-coverage-baseline.json instead.
1010
+ // Paths, URLs, tokens and term lists: any non-empty string is legal, so
1011
+ // z.string() is the accurate type rather than a permissive stand-in.
1012
+ NEXUS_CODEPR_TOKEN: z10.string().optional(),
1013
+ NEXUS_CUSTOM_API_BASE_URL: z10.string().optional(),
1014
+ NEXUS_CUSTOM_API_KEY: z10.string().optional(),
1015
+ NEXUS_CUSTOM_MODEL: z10.string().optional(),
1016
+ NEXUS_MODEL_REGISTRY_OVERLAY: z10.string().optional(),
1017
+ NEXUS_OPENAI_COMPAT_KEY: z10.string().optional(),
1018
+ NEXUS_OPENAI_COMPAT_URL: z10.string().optional(),
1019
+ NEXUS_OPENCODE_CONFIG: z10.string().optional(),
1020
+ NEXUS_PR_REVIEW_RECORDS_PATH: z10.string().optional(),
1021
+ NEXUS_SENSITIVE_REFS: z10.string().optional(),
1022
+ NEXUS_SUBPROCESS_EXTRA_ENV: z10.string().optional(),
1023
+ NEXUS_VOTE_RECORDS_PATH: z10.string().optional(),
1024
+ // parseIntEnv / parseInt consumers: a non-integer is discarded in favour of
1025
+ // the default, so reporting it as invalid tells the user their setting was
1026
+ // ignored rather than letting it fail silently.
1027
+ NEXUS_CI_HEALTH_MAX_BYTES: positiveIntStr.optional(),
1028
+ NEXUS_IMPROVEMENT_REVIEW_INTERVAL_MS: positiveIntStr.optional(),
1029
+ NEXUS_MCP_DEPTH: positiveIntStr.optional(),
1030
+ NEXUS_SUBPROCESS_DEPTH: positiveIntStr.optional(),
1031
+ // `0` is meaningful here — it disables async job dispatch entirely — so this
1032
+ // is non-negative, not positive (job-concurrency.ts:106 accepts `>= 0`).
1033
+ NEXUS_JOB_MAX_CONCURRENT_TOTAL: z10.string().regex(/^\d+$/, "Must be a non-negative integer string").optional(),
1034
+ // parseBoolEnv consumers (config/defaults-env.ts:50). The helper accepts
1035
+ // exactly true|1|false|0, case-insensitively — NOT yes/no/on/off, which fall
1036
+ // through to the default. Accepting a wider set here would tell the user
1037
+ // `yes` works when the code silently ignores it.
1038
+ NEXUS_IMPROVEMENT_REVIEW_FILE_ISSUES: boolLooseStr.optional(),
1039
+ NEXUS_NO_SCAFFOLD: boolLooseStr.optional(),
1040
+ NEXUS_TUNE_ENFORCE: boolLooseStr.optional(),
1041
+ NEXUS_VERSION_CHECK: boolLooseStr.optional(),
1042
+ // Lowercased before parsing, so mixed case is genuinely accepted.
1043
+ NEXUS_REPUTATION_GATING: z10.string().refine((v) => ["off", "audit", "enforce"].includes(v.toLowerCase()), {
1044
+ message: "Must be one of: off, audit, enforce"
1045
+ }).optional()
1000
1046
  });
1001
1047
  var KNOWN_NAMES = Object.keys(NexusEnvSchema.shape);
1048
+ var DYNAMIC_FAMILIES = [
1049
+ {
1050
+ // cli/voter-model-overrides.ts:24 — `NEXUS_VOTER_MODEL_${role.toUpperCase()}`
1051
+ prefix: "NEXUS_VOTER_MODEL_",
1052
+ suffixes: Object.keys(VOTER_ROLES).map((r) => r.toUpperCase())
1053
+ },
1054
+ {
1055
+ // mcp/jobs/job-concurrency.ts:85 — `NEXUS_JOB_MAX_CONCURRENT_${tool.toUpperCase()}`
1056
+ // The suffix is an arbitrary MCP tool name. Importing the tool registry here
1057
+ // would couple config to MCP and risk an import cycle, so the suffix is
1058
+ // matched structurally. The cost is honest and bounded: a misspelt TOOL name
1059
+ // in this one family is not flagged. The alternative — leaving the whole
1060
+ // family unregistered — misreports every CORRECT use, which is worse.
1061
+ prefix: "NEXUS_JOB_MAX_CONCURRENT_",
1062
+ suffixes: "any-identifier"
1063
+ }
1064
+ ];
1065
+ function isDynamicFamilyMember(name) {
1066
+ return DYNAMIC_FAMILIES.some((family) => {
1067
+ if (!name.startsWith(family.prefix)) return false;
1068
+ const suffix = name.slice(family.prefix.length);
1069
+ if (suffix === "") return false;
1070
+ if (family.suffixes === "any-identifier") return /^[A-Z][A-Z0-9_]*$/.test(suffix);
1071
+ return family.suffixes.includes(suffix);
1072
+ });
1073
+ }
1002
1074
  function suggestSimilar(name, known) {
1003
1075
  let best = null;
1004
1076
  let bestDist = 4;
@@ -1015,6 +1087,9 @@ function classifyEnvKeys(nexusKeys, env) {
1015
1087
  const knownRecord = {};
1016
1088
  const unknownVars = [];
1017
1089
  for (const key of nexusKeys) {
1090
+ if (isDynamicFamilyMember(key)) {
1091
+ continue;
1092
+ }
1018
1093
  if (KNOWN_NAMES.includes(key)) {
1019
1094
  const value = env[key];
1020
1095
  if (value !== void 0) {
@@ -47448,7 +47523,7 @@ ${contextBlock}`;
47448
47523
  const strategy = config.votingStrategy ?? "higher_order";
47449
47524
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
47450
47525
  try {
47451
- const { executeVoting } = await import("./consensus-vote-X7GYVWC7.js");
47526
+ const { executeVoting } = await import("./consensus-vote-4BCQ4GRD.js");
47452
47527
  const votingResult = await executeVoting(
47453
47528
  {
47454
47529
  proposal: buildVoteProposal(plan, research),
@@ -51985,6 +52060,7 @@ async function probeSource(source, includeModelIds) {
51985
52060
  return {
51986
52061
  transport: source.name,
51987
52062
  ok: true,
52063
+ servesModels: ids.length > 0,
51988
52064
  modelCount: ids.length,
51989
52065
  sampleModelIds: ids.slice(0, 5),
51990
52066
  ...includeModelIds ? { modelIds: ids } : {}
@@ -51993,6 +52069,7 @@ async function probeSource(source, includeModelIds) {
51993
52069
  return {
51994
52070
  transport: source.name,
51995
52071
  ok: false,
52072
+ servesModels: false,
51996
52073
  modelCount: 0,
51997
52074
  sampleModelIds: [],
51998
52075
  error: error instanceof Error ? error.message : String(error)
@@ -52020,10 +52097,11 @@ async function listAvailableModelsHandler(args, deps, logger59) {
52020
52097
  const transports = await Promise.all(sources.map((s) => probeSource(s, includeModelIds)));
52021
52098
  const response = {
52022
52099
  transports,
52023
- healthyTransports: transports.filter((t) => t.ok).length,
52100
+ healthyTransports: transports.filter((t) => t.servesModels).length,
52101
+ reachableTransports: transports.filter((t) => t.ok).length,
52024
52102
  totalTransports: transports.length,
52025
52103
  totalModels: transports.reduce((sum, t) => sum + t.modelCount, 0),
52026
- note: "Probe results \u2014 existence only; the in-tree registry remains authoritative for pricing/capability."
52104
+ 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."
52027
52105
  };
52028
52106
  logger59.debug("list_available_models probed transports", {
52029
52107
  healthy: response.healthyTransports,
@@ -56073,4 +56151,4 @@ export {
56073
56151
  shutdownFeedbackSubscriber,
56074
56152
  createEventBusBridge
56075
56153
  };
56076
- //# sourceMappingURL=chunk-F3E6ZZO3.js.map
56154
+ //# sourceMappingURL=chunk-XKVMHHAI.js.map