nexus-agents 2.81.2 → 2.81.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.
Files changed (103) hide show
  1. package/dist/{child-mcp-config-LLLRMOTQ.js → child-mcp-config-HVGU73XG.js} +2 -2
  2. package/dist/{chunk-SVKH6ASN.js → chunk-2GW2FZXY.js} +7 -7
  3. package/dist/{chunk-V2KWEIV5.js → chunk-2HBQ6XXA.js} +2 -2
  4. package/dist/{chunk-LIEFKEAO.js → chunk-5TM5VL23.js} +2 -2
  5. package/dist/{chunk-WZGCVCRQ.js → chunk-6M44ZXB4.js} +2 -2
  6. package/dist/{chunk-73K7575Z.js → chunk-7JLSKX3U.js} +2 -2
  7. package/dist/{chunk-M66MYHBT.js → chunk-AMFVUDWI.js} +2 -2
  8. package/dist/{chunk-PV3OEDLO.js → chunk-B3MCX46I.js} +2 -2
  9. package/dist/{chunk-Q27M6KHP.js → chunk-BZVYU4YD.js} +4 -4
  10. package/dist/{chunk-ERWTZSAR.js → chunk-EGK4RZV5.js} +2 -2
  11. package/dist/{chunk-6KO6LO3L.js → chunk-F7N2T53R.js} +7 -7
  12. package/dist/{chunk-MRCURXAX.js → chunk-FAU7LVIG.js} +5 -5
  13. package/dist/{chunk-LJIB6TNE.js → chunk-HFSSADUV.js} +3 -3
  14. package/dist/{chunk-LJIB6TNE.js.map → chunk-HFSSADUV.js.map} +1 -1
  15. package/dist/{chunk-RLQZOEMX.js → chunk-ITMLH7TF.js} +3 -3
  16. package/dist/{chunk-PZEE6T5Y.js → chunk-JSQV2EOZ.js} +3 -3
  17. package/dist/{chunk-PKBKWWPK.js → chunk-K7WUEKCD.js} +3 -3
  18. package/dist/{chunk-6YQCLEHL.js → chunk-M3KVQK54.js} +2 -2
  19. package/dist/{chunk-YLYT7GSG.js → chunk-M5ABED6T.js} +2 -2
  20. package/dist/{chunk-37ZXD5B6.js → chunk-M6KXR4LO.js} +450 -117
  21. package/dist/{chunk-37ZXD5B6.js.map → chunk-M6KXR4LO.js.map} +1 -1
  22. package/dist/{chunk-UTL2SFIN.js → chunk-PPV23O3J.js} +2 -2
  23. package/dist/{chunk-P4W7PV6L.js → chunk-R2VJY7Z4.js} +9 -9
  24. package/dist/{chunk-SZ7VPIRA.js → chunk-RGKUBFTE.js} +2 -2
  25. package/dist/{chunk-4OPS2AUD.js → chunk-S5HMID6I.js} +3 -3
  26. package/dist/{chunk-BMNWUPJO.js → chunk-WVSQGGAH.js} +3 -3
  27. package/dist/{chunk-T7RGD5JW.js → chunk-XZECNG2Q.js} +3 -3
  28. package/dist/{chunk-PUSFT342.js → chunk-YW72ORKM.js} +3 -3
  29. package/dist/{chunk-UZCDHAY3.js → chunk-ZAY5M2AN.js} +2 -2
  30. package/dist/{chunk-S77SLJ2J.js → chunk-ZBABWKEA.js} +2 -2
  31. package/dist/{cli-circuit-breaker-O5RV47BO.js → cli-circuit-breaker-NUZGOAVD.js} +4 -4
  32. package/dist/cli.js +54 -35
  33. package/dist/cli.js.map +1 -1
  34. package/dist/{composite-router-SKHVZ4UF.js → composite-router-4CF3P5D4.js} +2 -2
  35. package/dist/{consensus-vote-VBXLXVFF.js → consensus-vote-7PLEGFWZ.js} +11 -11
  36. package/dist/{context-retriever-KLJ5X4TL.js → context-retriever-R5W4I4IB.js} +5 -5
  37. package/dist/{doctor-deep-IH4FG5YZ.js → doctor-deep-7JTGI33O.js} +3 -3
  38. package/dist/expert-bridge-J5ZKCYL5.js +11 -0
  39. package/dist/{factory-FTE7TDCT.js → factory-DD2FPM3H.js} +5 -5
  40. package/dist/{factory-CQUDIMIG.js → factory-E2CKCYIK.js} +4 -4
  41. package/dist/index.d.ts +27 -1
  42. package/dist/index.js +30 -26
  43. package/dist/index.js.map +1 -1
  44. package/dist/{init-opencode-MXZJKG32.js → init-opencode-2BZWAACW.js} +5 -5
  45. package/dist/{issue-triage-H5VLNGWU.js → issue-triage-CRUJLWFY.js} +4 -4
  46. package/dist/{registry-command-ALVYOGQY.js → registry-command-OHIJNUZJ.js} +2 -2
  47. package/dist/{repo-security-plan-VJCWWPWO.js → repo-security-plan-I4FZP7QA.js} +3 -3
  48. package/dist/{research-helpers-synthesize-XUTBDVI7.js → research-helpers-synthesize-NMYYERCP.js} +3 -3
  49. package/dist/{routing-memory-QKQ3OGWW.js → routing-memory-7DA6WNSA.js} +2 -2
  50. package/dist/{session-memory-N76TNRSK.js → session-memory-LV35VSBK.js} +3 -3
  51. package/dist/{setup-command-JBTK3LGD.js → setup-command-2OUPZSU7.js} +10 -10
  52. package/dist/{setup-config-Y7KZSFX3.js → setup-config-TMXG3O7K.js} +3 -3
  53. package/dist/{setup-custom-api-QEKHNYQJ.js → setup-custom-api-N5VE2YPO.js} +4 -4
  54. package/dist/{tool-memory-MFDLIJOB.js → tool-memory-JL5TF5BI.js} +4 -4
  55. package/dist/{weather-report-IXPYIYE4.js → weather-report-CCOWOPFG.js} +2 -2
  56. package/package.json +1 -1
  57. package/dist/expert-bridge-EKPDZKMD.js +0 -11
  58. /package/dist/{child-mcp-config-LLLRMOTQ.js.map → child-mcp-config-HVGU73XG.js.map} +0 -0
  59. /package/dist/{chunk-SVKH6ASN.js.map → chunk-2GW2FZXY.js.map} +0 -0
  60. /package/dist/{chunk-V2KWEIV5.js.map → chunk-2HBQ6XXA.js.map} +0 -0
  61. /package/dist/{chunk-LIEFKEAO.js.map → chunk-5TM5VL23.js.map} +0 -0
  62. /package/dist/{chunk-WZGCVCRQ.js.map → chunk-6M44ZXB4.js.map} +0 -0
  63. /package/dist/{chunk-73K7575Z.js.map → chunk-7JLSKX3U.js.map} +0 -0
  64. /package/dist/{chunk-M66MYHBT.js.map → chunk-AMFVUDWI.js.map} +0 -0
  65. /package/dist/{chunk-PV3OEDLO.js.map → chunk-B3MCX46I.js.map} +0 -0
  66. /package/dist/{chunk-Q27M6KHP.js.map → chunk-BZVYU4YD.js.map} +0 -0
  67. /package/dist/{chunk-ERWTZSAR.js.map → chunk-EGK4RZV5.js.map} +0 -0
  68. /package/dist/{chunk-6KO6LO3L.js.map → chunk-F7N2T53R.js.map} +0 -0
  69. /package/dist/{chunk-MRCURXAX.js.map → chunk-FAU7LVIG.js.map} +0 -0
  70. /package/dist/{chunk-RLQZOEMX.js.map → chunk-ITMLH7TF.js.map} +0 -0
  71. /package/dist/{chunk-PZEE6T5Y.js.map → chunk-JSQV2EOZ.js.map} +0 -0
  72. /package/dist/{chunk-PKBKWWPK.js.map → chunk-K7WUEKCD.js.map} +0 -0
  73. /package/dist/{chunk-6YQCLEHL.js.map → chunk-M3KVQK54.js.map} +0 -0
  74. /package/dist/{chunk-YLYT7GSG.js.map → chunk-M5ABED6T.js.map} +0 -0
  75. /package/dist/{chunk-UTL2SFIN.js.map → chunk-PPV23O3J.js.map} +0 -0
  76. /package/dist/{chunk-P4W7PV6L.js.map → chunk-R2VJY7Z4.js.map} +0 -0
  77. /package/dist/{chunk-SZ7VPIRA.js.map → chunk-RGKUBFTE.js.map} +0 -0
  78. /package/dist/{chunk-4OPS2AUD.js.map → chunk-S5HMID6I.js.map} +0 -0
  79. /package/dist/{chunk-BMNWUPJO.js.map → chunk-WVSQGGAH.js.map} +0 -0
  80. /package/dist/{chunk-T7RGD5JW.js.map → chunk-XZECNG2Q.js.map} +0 -0
  81. /package/dist/{chunk-PUSFT342.js.map → chunk-YW72ORKM.js.map} +0 -0
  82. /package/dist/{chunk-UZCDHAY3.js.map → chunk-ZAY5M2AN.js.map} +0 -0
  83. /package/dist/{chunk-S77SLJ2J.js.map → chunk-ZBABWKEA.js.map} +0 -0
  84. /package/dist/{cli-circuit-breaker-O5RV47BO.js.map → cli-circuit-breaker-NUZGOAVD.js.map} +0 -0
  85. /package/dist/{composite-router-SKHVZ4UF.js.map → composite-router-4CF3P5D4.js.map} +0 -0
  86. /package/dist/{consensus-vote-VBXLXVFF.js.map → consensus-vote-7PLEGFWZ.js.map} +0 -0
  87. /package/dist/{context-retriever-KLJ5X4TL.js.map → context-retriever-R5W4I4IB.js.map} +0 -0
  88. /package/dist/{doctor-deep-IH4FG5YZ.js.map → doctor-deep-7JTGI33O.js.map} +0 -0
  89. /package/dist/{expert-bridge-EKPDZKMD.js.map → expert-bridge-J5ZKCYL5.js.map} +0 -0
  90. /package/dist/{factory-CQUDIMIG.js.map → factory-DD2FPM3H.js.map} +0 -0
  91. /package/dist/{factory-FTE7TDCT.js.map → factory-E2CKCYIK.js.map} +0 -0
  92. /package/dist/{init-opencode-MXZJKG32.js.map → init-opencode-2BZWAACW.js.map} +0 -0
  93. /package/dist/{issue-triage-H5VLNGWU.js.map → issue-triage-CRUJLWFY.js.map} +0 -0
  94. /package/dist/{registry-command-ALVYOGQY.js.map → registry-command-OHIJNUZJ.js.map} +0 -0
  95. /package/dist/{repo-security-plan-VJCWWPWO.js.map → repo-security-plan-I4FZP7QA.js.map} +0 -0
  96. /package/dist/{research-helpers-synthesize-XUTBDVI7.js.map → research-helpers-synthesize-NMYYERCP.js.map} +0 -0
  97. /package/dist/{routing-memory-QKQ3OGWW.js.map → routing-memory-7DA6WNSA.js.map} +0 -0
  98. /package/dist/{session-memory-N76TNRSK.js.map → session-memory-LV35VSBK.js.map} +0 -0
  99. /package/dist/{setup-command-JBTK3LGD.js.map → setup-command-2OUPZSU7.js.map} +0 -0
  100. /package/dist/{setup-config-Y7KZSFX3.js.map → setup-config-TMXG3O7K.js.map} +0 -0
  101. /package/dist/{setup-custom-api-QEKHNYQJ.js.map → setup-custom-api-N5VE2YPO.js.map} +0 -0
  102. /package/dist/{tool-memory-MFDLIJOB.js.map → tool-memory-JL5TF5BI.js.map} +0 -0
  103. /package/dist/{weather-report-IXPYIYE4.js.map → weather-report-CCOWOPFG.js.map} +0 -0
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  getTokenEnvVars,
9
9
  resolveToken
10
- } from "./chunk-UZCDHAY3.js";
10
+ } from "./chunk-ZAY5M2AN.js";
11
11
  import {
12
12
  executeExpert
13
- } from "./chunk-SVKH6ASN.js";
13
+ } from "./chunk-2GW2FZXY.js";
14
14
  import {
15
15
  EventTopics,
16
16
  NOOP_NOTIFIER,
@@ -36,7 +36,7 @@ import {
36
36
  withAccessPolicy,
37
37
  withProgressHeartbeat,
38
38
  wrapToolWithTimeout
39
- } from "./chunk-P4W7PV6L.js";
39
+ } from "./chunk-R2VJY7Z4.js";
40
40
  import {
41
41
  REGISTRY_PATH,
42
42
  getProjectRoot,
@@ -45,14 +45,14 @@ import {
45
45
  normalizeTopicToCanonical,
46
46
  savePapersRegistry,
47
47
  synthesizeResearch
48
- } from "./chunk-ERWTZSAR.js";
48
+ } from "./chunk-EGK4RZV5.js";
49
49
  import {
50
50
  IssueTriage,
51
51
  sanitizeInput
52
- } from "./chunk-RLQZOEMX.js";
52
+ } from "./chunk-ITMLH7TF.js";
53
53
  import {
54
54
  generateSecurityPlan
55
- } from "./chunk-SZ7VPIRA.js";
55
+ } from "./chunk-RGKUBFTE.js";
56
56
  import {
57
57
  analyzeGitHubRepo
58
58
  } from "./chunk-7J7PNOJQ.js";
@@ -64,7 +64,7 @@ import {
64
64
  getContextForTask,
65
65
  inferTaskCategory,
66
66
  summarizeContextForPrompt
67
- } from "./chunk-4OPS2AUD.js";
67
+ } from "./chunk-S5HMID6I.js";
68
68
  import {
69
69
  DEFAULT_RELEVANCE_CONFIG,
70
70
  MemoryImportance,
@@ -72,19 +72,19 @@ import {
72
72
  generateHyphenId,
73
73
  generateUUID,
74
74
  getToolMemory
75
- } from "./chunk-PZEE6T5Y.js";
75
+ } from "./chunk-JSQV2EOZ.js";
76
76
  import {
77
77
  DEFAULT_TASK_TTL_MS,
78
78
  DEFAULT_TOOL_RATE_LIMITS,
79
79
  clampTaskTtl
80
- } from "./chunk-6KO6LO3L.js";
80
+ } from "./chunk-F7N2T53R.js";
81
81
  import {
82
82
  getAvailabilityCache,
83
83
  resolveFallback
84
- } from "./chunk-WZGCVCRQ.js";
84
+ } from "./chunk-6M44ZXB4.js";
85
85
  import {
86
86
  DEFAULTS
87
- } from "./chunk-V2KWEIV5.js";
87
+ } from "./chunk-2HBQ6XXA.js";
88
88
  import {
89
89
  resolveInsideRoot
90
90
  } from "./chunk-NUBSJGQZ.js";
@@ -100,7 +100,7 @@ import {
100
100
  getAvailableClis,
101
101
  sleep,
102
102
  withTimeout
103
- } from "./chunk-BMNWUPJO.js";
103
+ } from "./chunk-WVSQGGAH.js";
104
104
  import {
105
105
  BUILT_IN_EXPERTS,
106
106
  BuiltInExpertTypeSchema,
@@ -112,7 +112,7 @@ import {
112
112
  } from "./chunk-PQHVC4BD.js";
113
113
  import {
114
114
  createSessionMemory
115
- } from "./chunk-PV3OEDLO.js";
115
+ } from "./chunk-B3MCX46I.js";
116
116
  import {
117
117
  AGENT_ROUTER_TIMEOUTS,
118
118
  API_TIMEOUTS,
@@ -182,7 +182,7 @@ import {
182
182
  resolveModelIdentitySync,
183
183
  toExpertTaskAnalysisResult,
184
184
  withStep
185
- } from "./chunk-LJIB6TNE.js";
185
+ } from "./chunk-HFSSADUV.js";
186
186
  import {
187
187
  getNexusDataDir,
188
188
  nexusDataPath
@@ -17713,7 +17713,7 @@ var ExperienceBuffer = class _ExperienceBuffer {
17713
17713
  }
17714
17714
  const totalReward = this.computeTotalReward(steps);
17715
17715
  const episode = {
17716
- id: crypto.randomUUID(),
17716
+ id: getRandomProvider().uuid(),
17717
17717
  sessionId,
17718
17718
  steps: [...steps],
17719
17719
  totalReward,
@@ -26699,7 +26699,7 @@ async function populateUnifiedContextOnState(state) {
26699
26699
  try {
26700
26700
  const taskCandidate = state["task"];
26701
26701
  if (typeof taskCandidate !== "string" || taskCandidate === "") return;
26702
- const { getContextForTask: getContextForTask2, inferTaskCategory: inferTaskCategory2 } = await import("./context-retriever-KLJ5X4TL.js");
26702
+ const { getContextForTask: getContextForTask2, inferTaskCategory: inferTaskCategory2 } = await import("./context-retriever-R5W4I4IB.js");
26703
26703
  const ctx = await getContextForTask2({
26704
26704
  task: taskCandidate,
26705
26705
  category: inferTaskCategory2(taskCandidate),
@@ -28246,15 +28246,12 @@ var PolicyEngine = class {
28246
28246
  return matched.sort((a, b) => b.priority - a.priority);
28247
28247
  }
28248
28248
  };
28249
- var DEFAULT_MAX_ATTEMPTS = 3;
28250
- var COST_WARNING_THRESHOLD = 0.8;
28251
28249
  var trustTierRule = {
28252
28250
  id: "trust-tier",
28253
28251
  priority: 100,
28254
28252
  evaluate(context) {
28255
- const state = context.pipelineState;
28256
- const tierVal = state["trustTier"];
28257
- const numericTier = typeof tierVal === "number" ? tierVal : typeof tierVal === "string" ? Number(tierVal) : Number.NaN;
28253
+ const tierVal = context.pipelineState.trustTier;
28254
+ const numericTier = tierVal === void 0 ? Number.NaN : Number(tierVal);
28258
28255
  const tier = Number.isFinite(numericTier) ? numericTier : void 0;
28259
28256
  if (tier !== void 0 && tier >= 3 && context.stageType === "execute") {
28260
28257
  return {
@@ -28266,83 +28263,7 @@ var trustTierRule = {
28266
28263
  return { allow: true };
28267
28264
  }
28268
28265
  };
28269
- var securityReviewRule = {
28270
- id: "security-review",
28271
- priority: 90,
28272
- evaluate(context) {
28273
- const state = context.pipelineState;
28274
- const needsReview = state["securityReviewRequired"] === true;
28275
- const hasReview = state["securityReviewComplete"] === true;
28276
- if (needsReview && !hasReview && context.stageType === "execute") {
28277
- return {
28278
- allow: false,
28279
- reason: "Security review required before implementation"
28280
- };
28281
- }
28282
- return { allow: true };
28283
- }
28284
- };
28285
- var boundedIterationRule = {
28286
- id: "bounded-iteration",
28287
- priority: 80,
28288
- evaluate(context) {
28289
- const state = context.pipelineState;
28290
- const attemptsVal = state["stageAttempts"];
28291
- const attempts = typeof attemptsVal === "number" ? attemptsVal : void 0;
28292
- if (attempts !== void 0 && attempts >= DEFAULT_MAX_ATTEMPTS) {
28293
- return {
28294
- allow: false,
28295
- reason: `Stage "${context.stageId}" exceeded max retries`
28296
- };
28297
- }
28298
- return { allow: true };
28299
- }
28300
- };
28301
- var costBudgetRule = {
28302
- id: "cost-budget",
28303
- priority: 70,
28304
- evaluate(context) {
28305
- const state = context.pipelineState;
28306
- const spentVal = state["costAccumulator"];
28307
- const spent = typeof spentVal === "number" ? spentVal : void 0;
28308
- const budgetVal = state["costBudget"];
28309
- const budget = typeof budgetVal === "number" ? budgetVal : void 0;
28310
- if (spent !== void 0 && budget !== void 0) {
28311
- if (spent > budget * COST_WARNING_THRESHOLD) {
28312
- return {
28313
- allow: false,
28314
- reason: "Approaching cost budget limit",
28315
- escalateTo: "user"
28316
- };
28317
- }
28318
- }
28319
- return { allow: true };
28320
- }
28321
- };
28322
- var highRiskApprovalRule = {
28323
- id: "high-risk-approval",
28324
- priority: 60,
28325
- evaluate(context) {
28326
- const state = context.pipelineState;
28327
- const isHighRisk = state["highRisk"] === true;
28328
- const approved = state["userApproved"] === true;
28329
- if (isHighRisk && !approved) {
28330
- return {
28331
- allow: false,
28332
- reason: "High-risk action requires user approval",
28333
- escalateTo: "user"
28334
- };
28335
- }
28336
- return { allow: true };
28337
- }
28338
- };
28339
- var BUILT_IN_RULES = [
28340
- trustTierRule,
28341
- securityReviewRule,
28342
- boundedIterationRule,
28343
- costBudgetRule,
28344
- highRiskApprovalRule
28345
- ];
28266
+ var BUILT_IN_RULES = [trustTierRule];
28346
28267
  function createDefaultPolicyEngine() {
28347
28268
  const engine = new PolicyEngine();
28348
28269
  for (const rule of BUILT_IN_RULES) {
@@ -28482,6 +28403,10 @@ function buildBaseTaskContract(input) {
28482
28403
  }
28483
28404
 
28484
28405
  // src/pipeline/v2-delegate.ts
28406
+ function toPipelineStateSnapshot(metadata) {
28407
+ const trustTier = metadata["trustTier"];
28408
+ return typeof trustTier === "string" ? { trustTier } : {};
28409
+ }
28485
28410
  var logger22 = createLogger({ component: "V2Delegate" });
28486
28411
  function createDelegatePipeline(task) {
28487
28412
  const plan = buildPlan(task);
@@ -28541,7 +28466,10 @@ function checkPipelinePolicy(task, stageType) {
28541
28466
  taskId: task.id,
28542
28467
  stageId: `pre-execution-${stageType}`,
28543
28468
  stageType,
28544
- pipelineState: task.metadata
28469
+ // #2932: typed extraction. The untyped `task.metadata` is the producer
28470
+ // surface — we narrow to the policy snapshot here so adding a new rule
28471
+ // forces an explicit producer wire-up at this single chokepoint.
28472
+ pipelineState: toPipelineStateSnapshot(task.metadata)
28545
28473
  };
28546
28474
  const result = evaluatePolicy2({ engine, mode }, context);
28547
28475
  if (!result.allowed) {
@@ -34255,6 +34183,8 @@ function instrumentV2Pipeline(input, logger52) {
34255
34183
  const tc = delegateInputToTaskContract(input);
34256
34184
  void executeDelegatePipeline(tc).then((m) => {
34257
34185
  logger52.info("V2 delegate pipeline", { ...m });
34186
+ }).catch((error) => {
34187
+ logger52.warn("V2 delegate instrumentation failed", { error: getErrorMessage(error) });
34258
34188
  });
34259
34189
  }
34260
34190
  function notifyAndRecord(opts) {
@@ -41342,10 +41272,10 @@ var FileAuditStorage = class _FileAuditStorage {
41342
41272
  };
41343
41273
 
41344
41274
  // src/audit/audit-logger.ts
41345
- import * as crypto2 from "crypto";
41275
+ import * as crypto from "crypto";
41346
41276
  function generateEventId() {
41347
41277
  const timestamp = getTimeProvider().now().toString(36);
41348
- const random = crypto2.randomBytes(6).toString("hex");
41278
+ const random = crypto.randomBytes(6).toString("hex");
41349
41279
  return `aud_${timestamp}_${random}`;
41350
41280
  }
41351
41281
  function computeEventHash(event) {
@@ -41358,7 +41288,7 @@ function computeEventHash(event) {
41358
41288
  actor: event.actor,
41359
41289
  previousHash: event.previousHash
41360
41290
  });
41361
- return crypto2.createHash("sha256").update(data).digest("hex");
41291
+ return crypto.createHash("sha256").update(data).digest("hex");
41362
41292
  }
41363
41293
  function verifyEvent(event, index, priorHash) {
41364
41294
  if (event.hash === void 0) {
@@ -41988,7 +41918,7 @@ async function tryIssueTriage(task) {
41988
41918
  try {
41989
41919
  const issueMatch = task.match(/github\.com\/([^/]+\/[^/]+)\/issues\/(\d+)/);
41990
41920
  if (issueMatch === null) return null;
41991
- const { createIssueTriage } = await import("./issue-triage-H5VLNGWU.js");
41921
+ const { createIssueTriage } = await import("./issue-triage-CRUJLWFY.js");
41992
41922
  const triage = createIssueTriage();
41993
41923
  const owner = issueMatch[1] ?? "";
41994
41924
  const num = issueMatch[2] ?? "";
@@ -42016,7 +41946,7 @@ var VALID_TEMPLATES = /* @__PURE__ */ new Set([
42016
41946
  ]);
42017
41947
  async function classifyWithLLM(task) {
42018
41948
  try {
42019
- const { executeExpert: executeExpert2 } = await import("./expert-bridge-EKPDZKMD.js");
41949
+ const { executeExpert: executeExpert2 } = await import("./expert-bridge-J5ZKCYL5.js");
42020
41950
  const prompt = [
42021
41951
  "Classify this task into exactly one pipeline template.",
42022
41952
  "Templates: dev (implementation/bug fix/refactor), research (investigate/evaluate/compare),",
@@ -42776,14 +42706,15 @@ function recordOutcome(args) {
42776
42706
  return;
42777
42707
  }
42778
42708
  try {
42709
+ const nowMs = getTimeProvider().now();
42779
42710
  getOutcomeStore().append({
42780
- id: `pipeline-${args.taskId}-${String(Date.now())}`,
42711
+ id: `pipeline-${args.taskId}-${String(nowMs)}`,
42781
42712
  cli: args.cli,
42782
42713
  category: args.category,
42783
42714
  model: "pipeline",
42784
42715
  success: args.success,
42785
42716
  durationMs: args.durationMs,
42786
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
42717
+ timestamp: new Date(nowMs).toISOString(),
42787
42718
  source: "delegate",
42788
42719
  routingStage: args.routingStage,
42789
42720
  retryCount: args.retryCount
@@ -42797,10 +42728,10 @@ var memoryInitPromise = null;
42797
42728
  async function initPipelineMemory() {
42798
42729
  if (cachedMemory !== null) return cachedMemory;
42799
42730
  try {
42800
- const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-N76TNRSK.js");
42731
+ const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-LV35VSBK.js");
42801
42732
  const { getLearningDir } = await import("./learning-persistence-NX2KHL5T.js");
42802
42733
  const mem = createSessionMemory2(getLearningDir());
42803
- mem.startSession(`pipeline-${String(Date.now())}`);
42734
+ mem.startSession(`pipeline-${String(getTimeProvider().now())}`);
42804
42735
  cachedMemory = {
42805
42736
  recordLearning: (l) => {
42806
42737
  try {
@@ -42853,7 +42784,7 @@ function recordRoutingExperience(category, success, durationMs) {
42853
42784
  callRecord(routingMemoryCache);
42854
42785
  return;
42855
42786
  }
42856
- void import("./routing-memory-QKQ3OGWW.js").then(({ createRoutingMemory }) => {
42787
+ void import("./routing-memory-7DA6WNSA.js").then(({ createRoutingMemory }) => {
42857
42788
  routingMemoryCache = createRoutingMemory();
42858
42789
  callRecord(routingMemoryCache);
42859
42790
  }).catch((error) => {
@@ -42882,7 +42813,7 @@ ${text}` : "";
42882
42813
  }
42883
42814
  async function getWeatherContext() {
42884
42815
  try {
42885
- const { generateWeatherReport: generateWeatherReport2 } = await import("./weather-report-IXPYIYE4.js");
42816
+ const { generateWeatherReport: generateWeatherReport2 } = await import("./weather-report-CCOWOPFG.js");
42886
42817
  const report = generateWeatherReport2({ includeAdaptive: true });
42887
42818
  const mappings = "recommendedMappings" in report ? report.recommendedMappings : [];
42888
42819
  if (!Array.isArray(mappings) || mappings.length === 0) return "";
@@ -42900,7 +42831,7 @@ ${lines}
42900
42831
  }
42901
42832
  async function getMemoryContext(task) {
42902
42833
  try {
42903
- const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-N76TNRSK.js");
42834
+ const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-LV35VSBK.js");
42904
42835
  const { getLearningDir } = await import("./learning-persistence-NX2KHL5T.js");
42905
42836
  const memory = createSessionMemory2(getLearningDir(), { maxLearningsInContext: 10 });
42906
42837
  const learnings = memory.searchLearnings(task.slice(0, 200));
@@ -43006,7 +42937,7 @@ ${contextBlock}`;
43006
42937
  const strategy = config.votingStrategy ?? "higher_order";
43007
42938
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
43008
42939
  try {
43009
- const { executeVoting } = await import("./consensus-vote-VBXLXVFF.js");
42940
+ const { executeVoting } = await import("./consensus-vote-7PLEGFWZ.js");
43010
42941
  const votingResult = await executeVoting(
43011
42942
  {
43012
42943
  proposal: plan.slice(0, 4e3),
@@ -43428,7 +43359,9 @@ function reinforcePlanBeliefs(bm, task, iterations) {
43428
43359
  function applyPipelineHindsight(bm, task, sessionId, result) {
43429
43360
  if (bm === void 0) return;
43430
43361
  const record = {
43431
- hindsightId: `pipeline-${sessionId ?? "ephemeral"}-${Date.now().toString(36)}`,
43362
+ // #2961: hindsightId is the persisted belief-store key — must go
43363
+ // through the time provider so replay/snapshot tests reproduce.
43364
+ hindsightId: `pipeline-${sessionId ?? "ephemeral"}-${getTimeProvider().now().toString(36)}`,
43432
43365
  taskId: sessionId ?? task.slice(0, 40),
43433
43366
  priorBeliefs: [],
43434
43367
  expectedOutcome: "Pipeline completes with all gates passed",
@@ -43900,7 +43833,7 @@ async function extractSymbolsForTask(task) {
43900
43833
  }
43901
43834
  async function queryResearchRegistry(task) {
43902
43835
  try {
43903
- const { synthesizeResearch: synthesizeResearch2 } = await import("./research-helpers-synthesize-XUTBDVI7.js");
43836
+ const { synthesizeResearch: synthesizeResearch2 } = await import("./research-helpers-synthesize-NMYYERCP.js");
43904
43837
  const topic = task.split(/[.!?\n]/).filter((s) => s.trim().length > 10)[0]?.trim();
43905
43838
  if (topic === void 0) return null;
43906
43839
  const result = await synthesizeResearch2(topic.slice(0, 50));
@@ -43985,7 +43918,7 @@ function createScanStageWrapper() {
43985
43918
  try {
43986
43919
  const slug = ctx.task.match(/([a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+)/)?.[1];
43987
43920
  if (slug !== void 0) {
43988
- const { generateSecurityPlan: generateSecurityPlan2 } = await import("./repo-security-plan-VJCWWPWO.js");
43921
+ const { generateSecurityPlan: generateSecurityPlan2 } = await import("./repo-security-plan-I4FZP7QA.js");
43989
43922
  const plan = await generateSecurityPlan2({ repo: slug, maxScanners: 10 });
43990
43923
  const recs = plan.recommendations.slice(0, 5).map((r) => `${r.priority}: ${r.displayName} (${r.category})`).join("; ");
43991
43924
  ctx.sharedMemory.write("scan", "decision", { recommendations: recs });
@@ -46049,6 +45982,16 @@ var MAX_AXES = 6;
46049
45982
  var MAX_AXIS_NAME_LENGTH = 64;
46050
45983
  var MAX_PROPOSAL_LENGTH = 4e3;
46051
45984
  var MAX_CONTEXT_LENGTH = 4e3;
45985
+ var FULL_PANEL = [
45986
+ "architect",
45987
+ "security",
45988
+ "devex",
45989
+ "ai_ml",
45990
+ "pm",
45991
+ "catfish",
45992
+ "scope_steward"
45993
+ ];
45994
+ var QUICK_PANEL = ["architect", "security", "scope_steward"];
46052
45995
  var SupplyChainTradeoffPanelInputSchema = z98.object({
46053
45996
  proposal: z98.string().min(1).max(MAX_PROPOSAL_LENGTH).describe('The proposal under tradeoff review (e.g. "Should aegis-boot adopt cargo-nextest?")'),
46054
45997
  axes: z98.array(z98.string().min(1).max(MAX_AXIS_NAME_LENGTH)).min(1).max(MAX_AXES).optional().describe(
@@ -46060,6 +46003,249 @@ var SupplyChainTradeoffPanelInputSchema = z98.object({
46060
46003
  quickMode: z98.boolean().optional().default(false).describe("Use 3 voters (architect, security, scope_steward) instead of 7"),
46061
46004
  simulate: z98.boolean().optional().default(false).describe("Use simulated voters (testing only)")
46062
46005
  });
46006
+ function buildTradeoffProposal(input) {
46007
+ const axes = input.axes ?? DEFAULT_AXES;
46008
+ const parts = [];
46009
+ parts.push(`# Supply-Chain Tradeoff Review
46010
+
46011
+ `);
46012
+ parts.push(`**Proposal:** ${input.proposal}
46013
+ `);
46014
+ if (input.context !== void 0 && input.context !== "") {
46015
+ parts.push(`
46016
+ **Context:**
46017
+ ${input.context}
46018
+ `);
46019
+ }
46020
+ parts.push(`
46021
+ ## Axes
46022
+
46023
+ Evaluate the proposal along EACH of these axes independently:
46024
+ `);
46025
+ for (const axis of axes) parts.push(`- \`${axis}\`
46026
+ `);
46027
+ parts.push(`
46028
+ ## Your task
46029
+
46030
+ `);
46031
+ parts.push(
46032
+ `For each axis, decide approve / reject / abstain with a one-line reason. It is normal \u2014 and expected \u2014 for the verdict to differ across axes (a proposal can be a win on update cadence and a loss on supply-chain risk).
46033
+
46034
+ `
46035
+ );
46036
+ parts.push(`After your reasoning, emit a JSON block with this exact shape:
46037
+
46038
+ `);
46039
+ parts.push("```json\n");
46040
+ parts.push('{\n "axes": {\n');
46041
+ axes.forEach((axis, idx) => {
46042
+ const comma = idx < axes.length - 1 ? "," : "";
46043
+ parts.push(` "${axis}": {"decision": "approve|reject|abstain", "reason": "..."}${comma}
46044
+ `);
46045
+ });
46046
+ parts.push(" }\n}\n");
46047
+ parts.push("```\n\n");
46048
+ parts.push(
46049
+ `Your overall vote (approve/reject/abstain) should reflect: approve if MOST axes are approve; reject if any axis is a strong reject; abstain otherwise.
46050
+ `
46051
+ );
46052
+ return parts.join("");
46053
+ }
46054
+ function extractJsonBlock(reasoning) {
46055
+ const fenced = /```json\s*\n([\s\S]*?)\n```/.exec(reasoning);
46056
+ if (fenced !== null) return fenced[1];
46057
+ const start = reasoning.indexOf("{");
46058
+ if (start === -1) return void 0;
46059
+ let depth = 0;
46060
+ for (let i = start; i < reasoning.length; i++) {
46061
+ if (reasoning[i] === "{") depth++;
46062
+ else if (reasoning[i] === "}") {
46063
+ depth--;
46064
+ if (depth === 0) {
46065
+ const candidate = reasoning.slice(start, i + 1);
46066
+ if (candidate.includes("axes") || candidate.includes("axis")) return candidate;
46067
+ }
46068
+ }
46069
+ }
46070
+ return void 0;
46071
+ }
46072
+ function isValidAxisDecision(d) {
46073
+ return d === "approve" || d === "reject" || d === "abstain";
46074
+ }
46075
+ function safeJsonParse2(raw) {
46076
+ try {
46077
+ return JSON.parse(raw);
46078
+ } catch {
46079
+ return void 0;
46080
+ }
46081
+ }
46082
+ function resolveAxesContainer(parsed) {
46083
+ if (typeof parsed !== "object" || parsed === null) return void 0;
46084
+ const root = parsed;
46085
+ const axesObj = root.axes ?? parsed;
46086
+ if (typeof axesObj !== "object") return void 0;
46087
+ return axesObj;
46088
+ }
46089
+ function parseSingleAxisEntry(entry) {
46090
+ if (typeof entry !== "object" || entry === null) return void 0;
46091
+ const e = entry;
46092
+ if (!isValidAxisDecision(e.decision)) return void 0;
46093
+ return { decision: e.decision, reason: typeof e.reason === "string" ? e.reason : "" };
46094
+ }
46095
+ function parseAxisVerdicts(reasoning, axes) {
46096
+ const block = extractJsonBlock(reasoning);
46097
+ if (block === void 0) return {};
46098
+ const parsed = safeJsonParse2(block);
46099
+ const container = resolveAxesContainer(parsed);
46100
+ if (container === void 0) return {};
46101
+ const out = {};
46102
+ for (const axis of axes) {
46103
+ const entry = parseSingleAxisEntry(container[axis]);
46104
+ if (entry !== void 0) out[axis] = entry;
46105
+ }
46106
+ return out;
46107
+ }
46108
+ function aggregateAxis(axis, votes) {
46109
+ const valid = votes.filter((v) => v.source !== "error" && axis in v.axisVotes);
46110
+ let approveCount = 0;
46111
+ let rejectCount = 0;
46112
+ let abstainCount = 0;
46113
+ const supporters = [];
46114
+ const reasons = [];
46115
+ for (const v of valid) {
46116
+ const entry = v.axisVotes[axis];
46117
+ if (entry === void 0) continue;
46118
+ if (entry.decision === "approve") {
46119
+ approveCount++;
46120
+ supporters.push(v.role);
46121
+ } else if (entry.decision === "reject") {
46122
+ rejectCount++;
46123
+ } else {
46124
+ abstainCount++;
46125
+ }
46126
+ if (entry.reason !== "") reasons.push(`${v.role}: ${entry.reason}`);
46127
+ }
46128
+ const decision = decideAxis(approveCount, rejectCount, abstainCount);
46129
+ const total = approveCount + rejectCount + abstainCount;
46130
+ const confidence = total === 0 ? 0 : Math.max(approveCount, rejectCount) / total;
46131
+ return {
46132
+ axis,
46133
+ decision,
46134
+ confidence,
46135
+ approveCount,
46136
+ rejectCount,
46137
+ abstainCount,
46138
+ summary: reasons.slice(0, 3).join(" | "),
46139
+ supportingVoters: supporters
46140
+ };
46141
+ }
46142
+ function decideAxis(approve, reject, abstain) {
46143
+ const total = approve + reject + abstain;
46144
+ if (total === 0) return "unknown";
46145
+ if (approve > reject && approve > abstain) return "approve";
46146
+ if (reject > approve && reject > abstain) return "reject";
46147
+ if (approve === reject && approve > 0) return "mixed";
46148
+ return "mixed";
46149
+ }
46150
+ function aggregatePanel(verdicts) {
46151
+ if (verdicts.length === 0) return "mixed";
46152
+ const allApprove = verdicts.every((v) => v.decision === "approve");
46153
+ if (allApprove) return "approve";
46154
+ const anyReject = verdicts.some((v) => v.decision === "reject");
46155
+ if (anyReject) return "reject";
46156
+ return "mixed";
46157
+ }
46158
+ function buildRecommendation(decision, verdicts) {
46159
+ if (decision === "approve") {
46160
+ return `Approve: all ${String(verdicts.length)} axes approve.`;
46161
+ }
46162
+ if (decision === "reject") {
46163
+ const blockers = verdicts.filter((v) => v.decision === "reject").map((v) => v.axis).join(", ");
46164
+ return `Reject: blocking concerns on ${blockers}.`;
46165
+ }
46166
+ const wins = verdicts.filter((v) => v.decision === "approve").map((v) => v.axis);
46167
+ const losses = verdicts.filter((v) => v.decision === "reject" || v.decision === "mixed" || v.decision === "unknown").map((v) => v.axis);
46168
+ return `Mixed: wins on ${wins.join(", ") || "(none)"}; concerns on ${losses.join(", ") || "(none)"}. Apply judgment.`;
46169
+ }
46170
+ function toPanelVote(result, axes) {
46171
+ const axisVotes = parseAxisVerdicts(result.vote.reasoning, axes);
46172
+ return {
46173
+ role: result.role,
46174
+ overallDecision: result.vote.decision,
46175
+ axisVotes,
46176
+ reasoning: result.vote.reasoning,
46177
+ source: result.source,
46178
+ cli: result.cli,
46179
+ ...result.error !== void 0 && { errorMessage: result.error }
46180
+ };
46181
+ }
46182
+ async function tradeoffPanelHandler(args, ctx) {
46183
+ const parsed = SupplyChainTradeoffPanelInputSchema.safeParse(args);
46184
+ if (!parsed.success) {
46185
+ return toolStructuredError({
46186
+ errorCategory: "validation",
46187
+ message: `Validation error: ${formatZodError(parsed.error)}`
46188
+ });
46189
+ }
46190
+ const input = parsed.data;
46191
+ const axes = input.axes ?? DEFAULT_AXES;
46192
+ const roles = input.quickMode ? QUICK_PANEL : FULL_PANEL;
46193
+ const start = Date.now();
46194
+ try {
46195
+ const proposal = buildTradeoffProposal(input);
46196
+ const voteResults = await collectRealVotes({
46197
+ roles,
46198
+ proposal,
46199
+ simulate: input.simulate,
46200
+ logger: ctx.logger
46201
+ });
46202
+ const votes = voteResults.map((r) => toPanelVote(r, axes));
46203
+ const axisVerdicts = axes.map((a) => aggregateAxis(a, votes));
46204
+ const decision = aggregatePanel(axisVerdicts);
46205
+ const recommendation = buildRecommendation(decision, axisVerdicts);
46206
+ const voterErrors = votes.filter((v) => v.source === "error").length;
46207
+ const response = {
46208
+ proposal: input.proposal,
46209
+ axes,
46210
+ decision,
46211
+ axisVerdicts,
46212
+ recommendation,
46213
+ votes,
46214
+ voterErrors,
46215
+ durationMs: Date.now() - start
46216
+ };
46217
+ return toolSuccess(JSON.stringify(response, null, 2));
46218
+ } catch (error) {
46219
+ return toolStructuredError({
46220
+ errorCategory: "internal",
46221
+ message: `Tradeoff panel failed: ${getErrorMessage(error)}`
46222
+ });
46223
+ }
46224
+ }
46225
+ function registerSupplyChainTradeoffPanelTool(server, deps) {
46226
+ const logger52 = deps.logger ?? createLogger({ tool: "supply_chain_tradeoff_panel" });
46227
+ const description2 = "Run a structured per-axis tradeoff vote on an engineering proposal (#2294). Default axes: build_time_determinism / supply_chain_risk / update_cadence. Voters answer EACH axis independently; aggregator surfaces per-axis verdicts so legitimate tradeoffs are not masked by a single approve/reject.";
46228
+ const secureHandler = createSecureHandler(tradeoffPanelHandler, {
46229
+ toolName: "supply_chain_tradeoff_panel",
46230
+ rateLimiter: deps.rateLimiter,
46231
+ logger: logger52
46232
+ });
46233
+ const timeoutMs = getToolTimeout("supply_chain_tradeoff_panel", deps.security);
46234
+ const wrappedHandler = wrapToolWithTimeout("supply_chain_tradeoff_panel", secureHandler, {
46235
+ timeoutMs,
46236
+ logger: logger52
46237
+ });
46238
+ server.registerTool(
46239
+ "supply_chain_tradeoff_panel",
46240
+ {
46241
+ description: description2,
46242
+ inputSchema: SupplyChainTradeoffPanelInputSchema.shape,
46243
+ annotations: getToolAnnotations("supply_chain_tradeoff_panel")
46244
+ },
46245
+ toSdkCallback(wrappedHandler)
46246
+ );
46247
+ logger52.info("Registered supply_chain_tradeoff_panel tool");
46248
+ }
46063
46249
 
46064
46250
  // src/mcp/tools/tool-annotations.ts
46065
46251
  var TOOL_ANNOTATIONS = {
@@ -46415,6 +46601,152 @@ var TOOL_ANNOTATIONS = {
46415
46601
  },
46416
46602
  { category: "implicit", description: "Consumes rate limit quota" }
46417
46603
  ]
46604
+ },
46605
+ research_add_source: {
46606
+ annotations: {
46607
+ title: "Research Add Source",
46608
+ readOnlyHint: false,
46609
+ destructiveHint: false,
46610
+ idempotentHint: false,
46611
+ openWorldHint: true
46612
+ },
46613
+ sideEffects: [
46614
+ { category: "explicit", description: "Adds a non-paper source to the research registry" },
46615
+ { category: "coupling", description: "New entries affect research_discover/research_query" }
46616
+ ]
46617
+ },
46618
+ research_synthesize: {
46619
+ annotations: {
46620
+ title: "Research Synthesize",
46621
+ readOnlyHint: true,
46622
+ destructiveHint: false,
46623
+ idempotentHint: true,
46624
+ openWorldHint: false
46625
+ },
46626
+ sideEffects: [{ category: "implicit", description: "Reads research catalog + alignment map" }]
46627
+ },
46628
+ query_task_state: {
46629
+ annotations: {
46630
+ title: "Query Task State",
46631
+ readOnlyHint: true,
46632
+ destructiveHint: false,
46633
+ idempotentHint: true,
46634
+ openWorldHint: false
46635
+ },
46636
+ sideEffects: [
46637
+ { category: "implicit", description: "Reads the structured task-state log (#2278)" }
46638
+ ]
46639
+ },
46640
+ verify_audit_chain: {
46641
+ annotations: {
46642
+ title: "Verify Audit Chain",
46643
+ readOnlyHint: true,
46644
+ destructiveHint: false,
46645
+ idempotentHint: true,
46646
+ openWorldHint: false
46647
+ },
46648
+ sideEffects: [
46649
+ {
46650
+ category: "implicit",
46651
+ description: "Reads the immutable audit log and verifies the hash chain"
46652
+ }
46653
+ ]
46654
+ },
46655
+ extract_symbols: {
46656
+ annotations: {
46657
+ title: "Extract Symbols",
46658
+ readOnlyHint: true,
46659
+ destructiveHint: false,
46660
+ idempotentHint: true,
46661
+ openWorldHint: false
46662
+ },
46663
+ sideEffects: [{ category: "implicit", description: "Reads source files and walks their ASTs" }]
46664
+ },
46665
+ search_codebase: {
46666
+ annotations: {
46667
+ title: "Search Codebase",
46668
+ readOnlyHint: true,
46669
+ destructiveHint: false,
46670
+ idempotentHint: true,
46671
+ openWorldHint: false
46672
+ },
46673
+ sideEffects: [
46674
+ {
46675
+ category: "implicit",
46676
+ description: "Reads source files and builds an in-memory symbol index"
46677
+ }
46678
+ ]
46679
+ },
46680
+ run_dev_pipeline: {
46681
+ annotations: {
46682
+ title: "Run Dev Pipeline",
46683
+ readOnlyHint: false,
46684
+ destructiveHint: false,
46685
+ idempotentHint: false,
46686
+ openWorldHint: true
46687
+ },
46688
+ sideEffects: [
46689
+ {
46690
+ category: "explicit",
46691
+ description: "Executes the V2 dev pipeline (delegates to CLI adapters)"
46692
+ },
46693
+ {
46694
+ category: "implicit",
46695
+ description: "Consumes API tokens; persists outcomes and checkpoints"
46696
+ },
46697
+ {
46698
+ category: "coupling",
46699
+ description: "Writes routing/learning state consumed by future runs"
46700
+ }
46701
+ ]
46702
+ },
46703
+ run_pipeline: {
46704
+ annotations: {
46705
+ title: "Run Pipeline",
46706
+ readOnlyHint: false,
46707
+ destructiveHint: false,
46708
+ idempotentHint: false,
46709
+ openWorldHint: true
46710
+ },
46711
+ sideEffects: [
46712
+ { category: "explicit", description: "Executes a generic V2 pipeline TaskContract" },
46713
+ { category: "implicit", description: "Consumes API tokens; emits pipeline events" },
46714
+ { category: "coupling", description: "Writes policy/audit state consumed by other tools" }
46715
+ ]
46716
+ },
46717
+ pr_review: {
46718
+ annotations: {
46719
+ title: "PR Review",
46720
+ readOnlyHint: false,
46721
+ destructiveHint: false,
46722
+ idempotentHint: false,
46723
+ openWorldHint: true
46724
+ },
46725
+ sideEffects: [
46726
+ {
46727
+ category: "explicit",
46728
+ description: "Runs multi-voter PR review with verification gate (#2233)"
46729
+ },
46730
+ { category: "implicit", description: "Consumes API tokens across voter CLIs" },
46731
+ { category: "coupling", description: "Records voter outcomes for weather report" }
46732
+ ]
46733
+ },
46734
+ supply_chain_tradeoff_panel: {
46735
+ annotations: {
46736
+ title: "Supply-chain Tradeoff Panel",
46737
+ readOnlyHint: false,
46738
+ destructiveHint: false,
46739
+ idempotentHint: false,
46740
+ openWorldHint: true
46741
+ },
46742
+ sideEffects: [
46743
+ {
46744
+ category: "explicit",
46745
+ description: "Runs per-axis tradeoff vote (build_time_determinism / supply_chain_risk / update_cadence) (#2294)"
46746
+ },
46747
+ { category: "implicit", description: "Consumes API tokens across voter CLIs" },
46748
+ { category: "coupling", description: "Records voter outcomes for weather report" }
46749
+ ]
46418
46750
  }
46419
46751
  };
46420
46752
  function getMcpAnnotations(toolName) {
@@ -49596,7 +49928,7 @@ var GitHubTaskTracker = class {
49596
49928
  cachedProvider = null;
49597
49929
  async getProvider() {
49598
49930
  if (this.cachedProvider !== null) return this.cachedProvider;
49599
- const { createScmProvider } = await import("./factory-FTE7TDCT.js");
49931
+ const { createScmProvider } = await import("./factory-DD2FPM3H.js");
49600
49932
  const result = await createScmProvider({ repo: this.config.repo ?? "" });
49601
49933
  if (!result.ok) throw new Error(`SCM provider error: ${result.error.message}`);
49602
49934
  this.cachedProvider = result.value;
@@ -50267,6 +50599,7 @@ export {
50267
50599
  aggregatePrDecisions,
50268
50600
  buildPrReviewProposal,
50269
50601
  registerPrReviewTool,
50602
+ registerSupplyChainTradeoffPanelTool,
50270
50603
  createAnnotationsProxy,
50271
50604
  createToolObservabilityProxy,
50272
50605
  registerTools,
@@ -50301,4 +50634,4 @@ export {
50301
50634
  detectBackend,
50302
50635
  createTaskTracker
50303
50636
  };
50304
- //# sourceMappingURL=chunk-37ZXD5B6.js.map
50637
+ //# sourceMappingURL=chunk-M6KXR4LO.js.map