nexus-agents 3.12.1 → 3.13.2

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.
@@ -22,7 +22,7 @@ import {
22
22
  DEFAULT_TASK_TTL_MS,
23
23
  DEFAULT_TOOL_RATE_LIMITS,
24
24
  clampTaskTtl
25
- } from "./chunk-TRZTLCL4.js";
25
+ } from "./chunk-YRLE2SZI.js";
26
26
  import {
27
27
  executeExpert
28
28
  } from "./chunk-TPU5DT74.js";
@@ -22474,11 +22474,22 @@ function extractErrorMessage2(error) {
22474
22474
  }
22475
22475
  return error.message;
22476
22476
  }
22477
- function isNonRetryableError(error) {
22477
+ var NON_RETRYABLE_CODES = /* @__PURE__ */ new Set([
22478
+ ErrorCode.VALIDATION_ERROR,
22479
+ ErrorCode.WORKFLOW_PARSE_ERROR,
22480
+ ErrorCode.INVALID_INPUT
22481
+ ]);
22482
+ function isNonRetryableSelf(error) {
22478
22483
  if (error.name === "ValidationError") return true;
22479
- if (error instanceof WorkflowError) {
22480
- const code = error.code;
22481
- return code === ErrorCode.VALIDATION_ERROR || code === ErrorCode.WORKFLOW_PARSE_ERROR || code === ErrorCode.INVALID_INPUT;
22484
+ return error instanceof NexusError && NON_RETRYABLE_CODES.has(error.code);
22485
+ }
22486
+ function isNonRetryableError(error) {
22487
+ const seen = /* @__PURE__ */ new Set();
22488
+ let current = error;
22489
+ while (current instanceof Error && !seen.has(current)) {
22490
+ seen.add(current);
22491
+ if (isNonRetryableSelf(current)) return true;
22492
+ current = current.cause;
22482
22493
  }
22483
22494
  return false;
22484
22495
  }
@@ -45711,6 +45722,7 @@ function classifyVoteStageResult(votingResult) {
45711
45722
  }
45712
45723
  return { vote: { kind: "approved", approvalPercentage: pct }, label: "Approved" };
45713
45724
  }
45725
+ var UNMEASURED_TRUST_TIER = "unmeasured";
45714
45726
  function emitStageEvent2(stage, status, details) {
45715
45727
  emitPipelineStageEvent("dev-pipeline", stage, status, details);
45716
45728
  }
@@ -45929,9 +45941,13 @@ function getTrendContext() {
45929
45941
  }
45930
45942
  function createAgentStages(config = {}) {
45931
45943
  const guard = createBudgetGuard(config.budget);
45944
+ const trustTier = config.trustTier ?? UNMEASURED_TRUST_TIER;
45945
+ const startStage = (stage) => {
45946
+ emitStageEvent2(stage, "started", { trustTier });
45947
+ };
45932
45948
  return {
45933
45949
  research: async (task) => {
45934
- emitStageEvent2("research", "started");
45950
+ startStage("research");
45935
45951
  await postProgress(config, "Research", "Querying research tools (structured)...");
45936
45952
  const start = getTimeProvider().now();
45937
45953
  const topic = task.slice(0, 200);
@@ -45974,7 +45990,7 @@ function createAgentStages(config = {}) {
45974
45990
  }
45975
45991
  },
45976
45992
  plan: async (task, research, feedback) => {
45977
- emitStageEvent2("plan", "started");
45993
+ startStage("plan");
45978
45994
  const outcomeCtx = getOutcomeContext();
45979
45995
  const trendCtx = getTrendContext();
45980
45996
  const weatherCtx = await getWeatherContext();
@@ -46007,7 +46023,7 @@ ${contextBlock}`;
46007
46023
  return r.text || prompt;
46008
46024
  },
46009
46025
  vote: async (plan, research) => {
46010
- emitStageEvent2("vote", "started");
46026
+ startStage("vote");
46011
46027
  const start = getTimeProvider().now();
46012
46028
  const strategy = config.votingStrategy ?? "higher_order";
46013
46029
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
@@ -46061,7 +46077,7 @@ ${contextBlock}`;
46061
46077
  }
46062
46078
  },
46063
46079
  decompose: async (plan) => {
46064
- emitStageEvent2("decompose", "started");
46080
+ startStage("decompose");
46065
46081
  await postProgress(config, "PM", "PM expert decomposing...");
46066
46082
  const r = await runExpert(
46067
46083
  guard,
@@ -46085,7 +46101,7 @@ ${plan}`,
46085
46101
  return tasks;
46086
46102
  },
46087
46103
  implement: async (task) => {
46088
- emitStageEvent2(`impl-${task.id}`, "started");
46104
+ startStage(`impl-${task.id}`);
46089
46105
  await postProgress(config, `Code [${task.id}]`, task.title);
46090
46106
  const fb = task.feedback !== void 0 ? `
46091
46107
 
@@ -46122,7 +46138,7 @@ ${task.description}${fb}`,
46122
46138
  return r.text || `[Implementation failed: ${r.error}]`;
46123
46139
  },
46124
46140
  qaReview: async (task, implementation) => {
46125
- emitStageEvent2(`qa-${task.id}`, "started");
46141
+ startStage(`qa-${task.id}`);
46126
46142
  await postProgress(config, `QA [${task.id}]`, "QA expert reviewing...");
46127
46143
  const r = await runExpert(
46128
46144
  guard,
@@ -46162,7 +46178,7 @@ Verdict: PASS/NEEDS_WORK/REJECT`,
46162
46178
  return review;
46163
46179
  },
46164
46180
  qualityGate: async () => {
46165
- emitStageEvent2("quality-gate", "started");
46181
+ startStage("quality-gate");
46166
46182
  const start = getTimeProvider().now();
46167
46183
  const target = config.scanTarget ?? process.cwd();
46168
46184
  await postProgress(config, "QualityGate", `Typecheck/lint/tests on ${target}...`);
@@ -46186,7 +46202,7 @@ Verdict: PASS/NEEDS_WORK/REJECT`,
46186
46202
  return { passed, feedback: result.feedback };
46187
46203
  },
46188
46204
  securityScan: async () => {
46189
- emitStageEvent2("security", "started");
46205
+ startStage("security");
46190
46206
  const start = getTimeProvider().now();
46191
46207
  const target = config.scanTarget ?? process.cwd();
46192
46208
  await postProgress(config, "Security", `Scanning ${target}...`);
@@ -49822,11 +49838,12 @@ async function resolveTaskInput(input) {
49822
49838
  }
49823
49839
  throw new Error("Either task or planFile must be provided");
49824
49840
  }
49825
- async function createStages(input) {
49841
+ async function createStages(input, trustTier) {
49826
49842
  const backendChoice = input.trackerBackend;
49827
49843
  const backend = backendChoice === "json" && input.repo !== void 0 ? await detectBackend() : backendChoice;
49828
49844
  const tracker = input.repo !== void 0 ? createTaskTracker({ backend, repo: input.repo, labels: input.labels }) : void 0;
49829
49845
  return createAgentStages({
49846
+ ...trustTier !== void 0 ? { trustTier } : {},
49830
49847
  scanTarget: input.workingDir,
49831
49848
  simulateVotes: input.simulateVotes,
49832
49849
  votingStrategy: input.votingStrategy,
@@ -49842,7 +49859,7 @@ async function createStages(input) {
49842
49859
  }
49843
49860
  async function runDevPipelineForGoal(goal, trustTier) {
49844
49861
  const input = DevPipelineInputSchema.parse({ task: goal });
49845
- const stages = await createStages(input);
49862
+ const stages = await createStages(input, trustTier);
49846
49863
  return runDevPipeline(goal, stages, trustTier !== void 0 ? { trustTier } : void 0);
49847
49864
  }
49848
49865
  function buildStructuredOutput(result, simulated) {
@@ -49899,7 +49916,7 @@ async function runDevPipelineHandler(args, logger59, trustTier, auditLogger) {
49899
49916
  }
49900
49917
  try {
49901
49918
  const taskText = await resolveTaskInput(input);
49902
- const stages = await createStages(input);
49919
+ const stages = await createStages(input, trustTier);
49903
49920
  const pipelineOptions = buildPipelineOptions(input, trustTier, auditLogger);
49904
49921
  const hasOptions = Object.keys(pipelineOptions).length > 0;
49905
49922
  const resolvedOptions = hasOptions ? pipelineOptions : void 0;
@@ -50106,7 +50123,7 @@ async function executePipelineBody(task, stages, templateId, dryRun, simulated)
50106
50123
  }
50107
50124
  return toolSuccessStructured(output2);
50108
50125
  }
50109
- async function runPipelineHandler(args, logger59) {
50126
+ async function runPipelineHandler(args, logger59, trustTier) {
50110
50127
  const parsed = PipelineInputSchema.safeParse(args);
50111
50128
  if (!parsed.success) {
50112
50129
  return toolStructuredError({
@@ -50127,6 +50144,9 @@ async function runPipelineHandler(args, logger59) {
50127
50144
  simulateVotes: input.simulateVotes,
50128
50145
  votingStrategy: input.votingStrategy,
50129
50146
  quickMode: input.quickMode,
50147
+ // #4694: record-only. Absent stays absent — createAgentStages stamps
50148
+ // UNMEASURED_TRUST_TIER rather than inventing a trusted default.
50149
+ ...trustTier !== void 0 ? { trustTier } : {},
50130
50150
  budget: resolveRunBudget(task, input.template, logger59)
50131
50151
  });
50132
50152
  const stages = selectStageRegistry(input.template, task, agentStages);
@@ -50149,11 +50169,13 @@ async function runPipelineHandler(args, logger59) {
50149
50169
  }
50150
50170
  function registerPipelineTool(server, deps) {
50151
50171
  const logger59 = deps.logger ?? createLogger({ tool: "run_pipeline" });
50152
- const secureHandler = createSecureHandler((args) => runPipelineHandler(args, logger59), {
50153
- toolName: "run_pipeline",
50154
- rateLimiter: deps.rateLimiter,
50155
- logger: logger59
50156
- });
50172
+ const secureHandler = createSecureHandler(
50173
+ // Optional chaining is deliberate, not defensive noise: a handler invoked
50174
+ // without a context has genuinely NOT measured a tier, and that flows to
50175
+ // UNMEASURED_TRUST_TIER rather than to a default. Absence stays absence.
50176
+ (args, ctx) => runPipelineHandler(args, logger59, ctx?.requestContext.trustTier),
50177
+ { toolName: "run_pipeline", rateLimiter: deps.rateLimiter, logger: logger59 }
50178
+ );
50157
50179
  const timeoutMs = getToolTimeout("run_pipeline", deps.security);
50158
50180
  const wrapped = wrapToolWithTimeout("run_pipeline", secureHandler, { timeoutMs, logger: logger59 });
50159
50181
  server.registerTool(
@@ -52458,6 +52480,10 @@ function createTaskOutcome(params) {
52458
52480
 
52459
52481
  // src/learning/outcome-feedback.ts
52460
52482
  var logger53 = createLogger({ component: "OutcomeFeedback" });
52483
+ function ratioBonus(target, actual, weight) {
52484
+ if (!Number.isFinite(actual) || actual <= 0) return 0;
52485
+ return Math.min(1, target / actual) * weight;
52486
+ }
52461
52487
  var OutcomeFeedbackCollector = class {
52462
52488
  config;
52463
52489
  pendingDecisions = /* @__PURE__ */ new Map();
@@ -52555,10 +52581,16 @@ var OutcomeFeedbackCollector = class {
52555
52581
  baseReward = signals.completionRatio;
52556
52582
  }
52557
52583
  const qualityBonus = outcome.qualityScore * this.config.qualityWeight;
52558
- const speedRatio = Math.min(1, this.config.targetDurationMs / outcome.durationMs);
52559
- const speedBonus = speedRatio * this.config.speedWeight;
52560
- const efficiencyRatio = Math.min(1, this.config.targetTokenUsage / outcome.tokenUsage);
52561
- const efficiencyBonus = efficiencyRatio * this.config.efficiencyWeight;
52584
+ const speedBonus = ratioBonus(
52585
+ this.config.targetDurationMs,
52586
+ outcome.durationMs,
52587
+ this.config.speedWeight
52588
+ );
52589
+ const efficiencyBonus = ratioBonus(
52590
+ this.config.targetTokenUsage,
52591
+ outcome.tokenUsage,
52592
+ this.config.efficiencyWeight
52593
+ );
52562
52594
  const retryPenalty = signals.retryCount * this.config.retryPenalty;
52563
52595
  const rawReward = baseReward + qualityBonus + speedBonus + efficiencyBonus - retryPenalty;
52564
52596
  const reward = clamp01(rawReward);
@@ -54487,4 +54519,4 @@ export {
54487
54519
  shutdownFeedbackSubscriber,
54488
54520
  createEventBusBridge
54489
54521
  };
54490
- //# sourceMappingURL=chunk-Q4E6MPAW.js.map
54522
+ //# sourceMappingURL=chunk-A6VFBC4F.js.map