nexus-agents 8.67.0 → 8.69.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.
@@ -11,7 +11,7 @@ import {
11
11
  NODE_ENGINE_RANGE,
12
12
  VERSION,
13
13
  isNodeVersionSupported
14
- } from "./chunk-H5WLZNF5.js";
14
+ } from "./chunk-YDBWWICY.js";
15
15
  import {
16
16
  claimGlobalRegistry
17
17
  } from "./chunk-WQWC52E7.js";
@@ -1314,7 +1314,7 @@ async function runDoctorFix(result) {
1314
1314
  writeLine2("\u2500".repeat(40));
1315
1315
  let fixCount = 0;
1316
1316
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
1317
- const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-ZU3MRHWV.js");
1317
+ const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-E372AVMR.js");
1318
1318
  const outcome = describeDataDirFix2(initDataDirectories2());
1319
1319
  writeLine2(outcome.line);
1320
1320
  if (outcome.counted) fixCount++;
@@ -1416,4 +1416,4 @@ export {
1416
1416
  startStdioServer,
1417
1417
  closeServer
1418
1418
  };
1419
- //# sourceMappingURL=chunk-Z3D2LFRH.js.map
1419
+ //# sourceMappingURL=chunk-AMZEALD7.js.map
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  DEFAULT_TASK_TTL_MS,
23
23
  clampTaskTtl
24
- } from "./chunk-Z3D2LFRH.js";
24
+ } from "./chunk-AMZEALD7.js";
25
25
  import {
26
26
  executeExpert
27
27
  } from "./chunk-QO6S3VMQ.js";
@@ -71,7 +71,7 @@ import {
71
71
  updateStage,
72
72
  withWarnings,
73
73
  writeJobCancelled
74
- } from "./chunk-Z2572SMU.js";
74
+ } from "./chunk-OQYN33KF.js";
75
75
  import {
76
76
  allOf,
77
77
  anyOf
@@ -93,7 +93,7 @@ import {
93
93
  } from "./chunk-CNOQ7NRP.js";
94
94
  import {
95
95
  withPrerequisite
96
- } from "./chunk-5CCKE7VV.js";
96
+ } from "./chunk-J3KPS6LF.js";
97
97
  import {
98
98
  NOOP_NOTIFIER,
99
99
  RateLimiter,
@@ -116,7 +116,7 @@ import {
116
116
  toolSuccessStructured,
117
117
  withProgressHeartbeat,
118
118
  wrapToolWithTimeout
119
- } from "./chunk-Y73X72N4.js";
119
+ } from "./chunk-HLOBTLXA.js";
120
120
  import {
121
121
  EventTopics,
122
122
  UNRESOLVED_MODEL_ID,
@@ -1113,7 +1113,8 @@ var NexusEnvSchema = z11.object({
1113
1113
  NEXUS_VOTE_RECORDS_PATH: z11.string().optional(),
1114
1114
  // #3927 item 4: the SSH key `scripts/append-ratification-record.ts` signs a
1115
1115
  // committed vote record's hash with (`--signing-key` overrides it). A path;
1116
- // unset ⇒ the record is appended unsigned and the script says so.
1116
+ // unset ⇒ the agent key at `<dataDir>/auth/vote-record-signing.key` when it
1117
+ // exists (#6257), else the record is appended unsigned and the script says so.
1117
1118
  NEXUS_VOTE_SIGNING_KEY: z11.string().optional(),
1118
1119
  // parseIntEnv / parseInt consumers: a non-integer is discarded in favour of
1119
1120
  // the default, so reporting it as invalid tells the user their setting was
@@ -45844,7 +45845,7 @@ function buildVotingInput(plan, config) {
45844
45845
  }
45845
45846
  async function executeSingleVote(plan, config, log) {
45846
45847
  try {
45847
- const { executeVoting } = await import("./consensus-vote-32WOIXIO.js");
45848
+ const { executeVoting } = await import("./consensus-vote-IZRLUOXF.js");
45848
45849
  const input = buildVotingInput(plan, config);
45849
45850
  const result = await executeVoting(input, log);
45850
45851
  return parseVotingResult(result);
@@ -47555,9 +47556,15 @@ function getTrendContext() {
47555
47556
  }
47556
47557
  function createAgentStages(config = {}) {
47557
47558
  const guard = createBudgetGuard(config.budget);
47558
- const trustTier = config.trustTier ?? UNMEASURED_TRUST_TIER;
47559
+ const callerTrustTier = config.callerTrustTier ?? config.trustTier ?? UNMEASURED_TRUST_TIER;
47560
+ const inputSanitization = config.inputSanitization ?? "unmeasured";
47559
47561
  const startStage = (stage) => {
47560
- emitStageEvent2(stage, "started", { trustTier });
47562
+ emitStageEvent2(stage, "started", {
47563
+ callerTrustTier,
47564
+ trustTier: callerTrustTier,
47565
+ inputSanitization,
47566
+ ...inputSanitization === "modified" && config.inputSanitizationCounts !== void 0 ? { inputSanitizationCounts: config.inputSanitizationCounts } : {}
47567
+ });
47561
47568
  };
47562
47569
  return {
47563
47570
  research: async (task) => {
@@ -47642,7 +47649,7 @@ ${contextBlock}`;
47642
47649
  const strategy = config.votingStrategy ?? "higher_order";
47643
47650
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
47644
47651
  try {
47645
- const { executeVoting } = await import("./consensus-vote-32WOIXIO.js");
47652
+ const { executeVoting } = await import("./consensus-vote-IZRLUOXF.js");
47646
47653
  const votingResult = await executeVoting(
47647
47654
  {
47648
47655
  proposal: buildVoteProposal(plan, research),
@@ -51962,6 +51969,20 @@ function createTaskTracker(config) {
51962
51969
  }
51963
51970
  }
51964
51971
 
51972
+ // src/mcp/tools/pipeline-input-sanitization.ts
51973
+ function measureInputSanitization(ctx) {
51974
+ const observation = ctx?.sanitization;
51975
+ if (observation === void 0) return { inputSanitization: "unmeasured" };
51976
+ const { wasModified, tagsRemoved, commentsRemoved, fieldsModified } = observation;
51977
+ if (!wasModified && tagsRemoved === 0 && commentsRemoved === 0) {
51978
+ return { inputSanitization: "unmodified" };
51979
+ }
51980
+ return {
51981
+ inputSanitization: "modified",
51982
+ inputSanitizationCounts: { tagsRemoved, commentsRemoved, fieldsModified }
51983
+ };
51984
+ }
51985
+
51965
51986
  // src/mcp/tools/dev-pipeline-tool.ts
51966
51987
  var DEV_PIPELINE_ASYNC_HINT = "A full run_dev_pipeline run can exceed the 900s synchronous MCP timeout. Retry with `dispatch: 'async'` to get a jobId immediately, then poll get_job_result({ jobId }) for the result.";
51967
51988
  var DEV_PIPELINE_DRY_RUN_NOTE = "This was a dry run (plan+vote), which always runs synchronously; async dispatch is ignored for dry runs, so retrying with it changes nothing.";
@@ -52057,12 +52078,13 @@ async function resolveTaskInput(input) {
52057
52078
  }
52058
52079
  throw new Error("Either task or planFile must be provided");
52059
52080
  }
52060
- async function createStages(input, trustTier) {
52081
+ async function createStages(input, trustTier, inputSanitization) {
52061
52082
  const backendChoice = input.trackerBackend;
52062
52083
  const backend = backendChoice === "json" && input.repo !== void 0 ? await detectBackend() : backendChoice;
52063
52084
  const tracker = input.repo !== void 0 ? createTaskTracker({ backend, repo: input.repo, labels: input.labels }) : void 0;
52064
52085
  return createAgentStages({
52065
- ...trustTier !== void 0 ? { trustTier } : {},
52086
+ ...trustTier !== void 0 ? { callerTrustTier: trustTier, trustTier } : {},
52087
+ ...inputSanitization,
52066
52088
  scanTarget: input.workingDir,
52067
52089
  simulateVotes: input.simulateVotes,
52068
52090
  votingStrategy: input.votingStrategy,
@@ -52081,7 +52103,7 @@ async function runDevPipelineForGoal(goal, trustTier, dryRun) {
52081
52103
  task: goal,
52082
52104
  ...dryRun !== void 0 ? { dryRun } : {}
52083
52105
  });
52084
- const stages = await createStages(input, trustTier);
52106
+ const stages = await createStages(input, trustTier, { inputSanitization: "unmeasured" });
52085
52107
  return runDevPipeline(goal, stages, {
52086
52108
  ...trustTier !== void 0 ? { trustTier } : {},
52087
52109
  // #4806 said `dryRun` is the one pipeline option `run` forwards. It parsed
@@ -52170,7 +52192,9 @@ function describeIncompleteRun(result) {
52170
52192
  }
52171
52193
  return "Pipeline did not complete";
52172
52194
  }
52173
- async function runDevPipelineHandler(args, logger57, trustTier, auditLogger) {
52195
+ async function runDevPipelineHandler(args, logger57, trustTier, auditLogger, inputSanitization = {
52196
+ inputSanitization: "unmeasured"
52197
+ }) {
52174
52198
  const parsed = DevPipelineInputSchema.safeParse(args);
52175
52199
  if (!parsed.success) {
52176
52200
  return toolStructuredError({
@@ -52187,7 +52211,7 @@ async function runDevPipelineHandler(args, logger57, trustTier, auditLogger) {
52187
52211
  }
52188
52212
  try {
52189
52213
  const taskText = await resolveTaskInput(input);
52190
- const stages = await createStages(input, trustTier);
52214
+ const stages = await createStages(input, trustTier, inputSanitization);
52191
52215
  const pipelineOptions = buildPipelineOptions(input, trustTier, auditLogger);
52192
52216
  const hasOptions = Object.keys(pipelineOptions).length > 0;
52193
52217
  const resolvedOptions = hasOptions ? pipelineOptions : void 0;
@@ -52242,7 +52266,13 @@ function dispatchAsyncDevPipeline(input, run, logger57) {
52242
52266
  function registerDevPipelineTool(server, deps) {
52243
52267
  const logger57 = deps.logger ?? createLogger({ tool: "run_dev_pipeline" });
52244
52268
  const secureHandler = createSecureHandler(
52245
- (args, ctx) => runDevPipelineHandler(args, logger57, measuredTrustTier(ctx.requestContext), deps.auditLogger),
52269
+ (args, ctx) => runDevPipelineHandler(
52270
+ args,
52271
+ logger57,
52272
+ ctx && measuredTrustTier(ctx.requestContext),
52273
+ deps.auditLogger,
52274
+ measureInputSanitization(ctx)
52275
+ ),
52246
52276
  { toolName: "run_dev_pipeline", rateLimiter: deps.rateLimiter, logger: logger57 }
52247
52277
  );
52248
52278
  const timeoutMs = getToolTimeout("run_dev_pipeline", deps.security);
@@ -52382,7 +52412,11 @@ function selectStageRegistry(template, task, agentStages) {
52382
52412
  var RUN_PIPELINE_DESCRIPTION = `Single unified entry point for all pipeline templates (${listTemplateIds().join("/")}). Auto-detects template from task content or accepts an explicit override. Supports dispatch: 'async' (non-dryRun runs) \u2014 returns a jobId immediately; poll get_job_result.`;
52383
52413
  async function runPipelineForGoal(goal, logger57 = createLogger({ tool: "run_pipeline" })) {
52384
52414
  const budget = resolveRunBudget(goal, void 0, logger57);
52385
- const agentStages = createAgentStages(budget !== void 0 ? { budget } : {});
52415
+ const agentStages = createAgentStages({
52416
+ budget,
52417
+ // Plain-goal pipeline/research strategies have no HandlerContext.
52418
+ inputSanitization: "unmeasured"
52419
+ });
52386
52420
  const stages = selectStageRegistry(void 0, goal, agentStages);
52387
52421
  return runAdaptiveOrchestrator(goal, { stages });
52388
52422
  }
@@ -52402,7 +52436,7 @@ async function executePipelineBody(task, stages, templateId, dryRun, simulated)
52402
52436
  }
52403
52437
  return toolSuccessStructured(output2);
52404
52438
  }
52405
- async function runPipelineHandler(args, logger57, trustTier) {
52439
+ async function runPipelineHandler(args, logger57, callerTrustTier, sanitization) {
52406
52440
  const parsed = PipelineInputSchema.safeParse(args);
52407
52441
  if (!parsed.success) {
52408
52442
  return toolStructuredError({
@@ -52423,9 +52457,9 @@ async function runPipelineHandler(args, logger57, trustTier) {
52423
52457
  simulateVotes: input.simulateVotes,
52424
52458
  votingStrategy: input.votingStrategy,
52425
52459
  quickMode: input.quickMode,
52426
- // #4694: record-only. Absent stays absent — createAgentStages stamps
52427
- // UNMEASURED_TRUST_TIER rather than inventing a trusted default.
52428
- ...trustTier !== void 0 ? { trustTier } : {},
52460
+ callerTrustTier,
52461
+ trustTier: callerTrustTier,
52462
+ ...sanitization,
52429
52463
  budget: resolveRunBudget(task, input.template, logger57)
52430
52464
  });
52431
52465
  const stages = selectStageRegistry(input.template, task, agentStages);
@@ -52455,7 +52489,12 @@ function registerPipelineTool(server, deps) {
52455
52489
  // Optional chaining is deliberate, not defensive noise: a handler invoked
52456
52490
  // without a context has genuinely NOT measured a tier, and that flows to
52457
52491
  // UNMEASURED_TRUST_TIER rather than to a default. Absence stays absence.
52458
- (args, ctx) => runPipelineHandler(args, logger57, ctx && measuredTrustTier(ctx.requestContext)),
52492
+ (args, ctx) => runPipelineHandler(
52493
+ args,
52494
+ logger57,
52495
+ ctx && measuredTrustTier(ctx.requestContext),
52496
+ measureInputSanitization(ctx)
52497
+ ),
52459
52498
  { toolName: "run_pipeline", rateLimiter: deps.rateLimiter, logger: logger57 }
52460
52499
  );
52461
52500
  const timeoutMs = getToolTimeout("run_pipeline", deps.security);
@@ -56855,4 +56894,4 @@ export {
56855
56894
  startPipelineEventBridge,
56856
56895
  shutdownPipelineEventBridge
56857
56896
  };
56858
- //# sourceMappingURL=chunk-2BAFNUJO.js.map
56897
+ //# sourceMappingURL=chunk-BO6BL2H7.js.map