nexus-agents 2.93.0 → 2.94.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.
Files changed (117) hide show
  1. package/dist/{child-mcp-config-WNISXFYD.js → child-mcp-config-PPFHJZSO.js} +2 -2
  2. package/dist/{chunk-RTUZSR4R.js → chunk-24WC4XO2.js} +2 -2
  3. package/dist/{chunk-XVY3I7JT.js → chunk-2YMRRZRM.js} +9 -12
  4. package/dist/chunk-2YMRRZRM.js.map +1 -0
  5. package/dist/{chunk-4A4WPM75.js → chunk-43UDRX3N.js} +8 -10
  6. package/dist/{chunk-4A4WPM75.js.map → chunk-43UDRX3N.js.map} +1 -1
  7. package/dist/{chunk-BHA6V7GK.js → chunk-4QESFYGV.js} +4 -4
  8. package/dist/{chunk-AZP66FIA.js → chunk-5B4VLSMP.js} +3 -3
  9. package/dist/{chunk-VSG6RSE6.js → chunk-5ZB3MTA7.js} +3 -3
  10. package/dist/{chunk-FTCU55O6.js → chunk-63OGXDHS.js} +4 -4
  11. package/dist/{chunk-G5IDRWWI.js → chunk-76535ZNP.js} +4 -4
  12. package/dist/{chunk-SHSKW5ML.js → chunk-77JUKFTG.js} +7 -7
  13. package/dist/{chunk-ZYHHDPFW.js → chunk-ADRTAUJA.js} +4 -4
  14. package/dist/{chunk-DTFMYM3V.js → chunk-EB43BGAR.js} +2 -2
  15. package/dist/{chunk-T73G67GT.js → chunk-EDPDH5YT.js} +3 -3
  16. package/dist/{chunk-CPH6LKXO.js → chunk-EJR6U67L.js} +2 -2
  17. package/dist/{chunk-ULBKFMVO.js → chunk-FUGPKYEJ.js} +2 -2
  18. package/dist/{chunk-ZOAU7RE4.js → chunk-G5EBHQ2L.js} +4 -6
  19. package/dist/{chunk-ZOAU7RE4.js.map → chunk-G5EBHQ2L.js.map} +1 -1
  20. package/dist/{chunk-SMGH2B3A.js → chunk-GMZDRTVJ.js} +20 -3
  21. package/dist/chunk-GMZDRTVJ.js.map +1 -0
  22. package/dist/{chunk-57OH2O2U.js → chunk-KSJPDQSG.js} +2 -2
  23. package/dist/{chunk-JEBWSHSU.js → chunk-L7I55FAN.js} +2 -2
  24. package/dist/{chunk-JCETWDU7.js → chunk-LCLVSNST.js} +2 -2
  25. package/dist/{chunk-K7VGX37L.js → chunk-OKGHHCS5.js} +3 -3
  26. package/dist/{chunk-WU3SUA35.js → chunk-OSSGG7KW.js} +2 -2
  27. package/dist/{chunk-HKISF2E7.js → chunk-OT6V5ROA.js} +225 -8
  28. package/dist/chunk-OT6V5ROA.js.map +1 -0
  29. package/dist/{chunk-BNHBZRU7.js → chunk-Q3NUA7CW.js} +3 -3
  30. package/dist/{chunk-E3QWWP67.js → chunk-R2NKJPUX.js} +2 -2
  31. package/dist/{chunk-2T4NV6QT.js → chunk-ROAANOOB.js} +2 -2
  32. package/dist/{chunk-LJMO5P6O.js → chunk-TNBWHOPY.js} +23 -13
  33. package/dist/chunk-TNBWHOPY.js.map +1 -0
  34. package/dist/{chunk-IJ2AZZVH.js → chunk-UC3PVIN4.js} +141 -28
  35. package/dist/chunk-UC3PVIN4.js.map +1 -0
  36. package/dist/{chunk-SORBJPRA.js → chunk-XBPFVWA2.js} +2 -2
  37. package/dist/{chunk-2IBJC2EP.js → chunk-YDXGYKZJ.js} +2 -2
  38. package/dist/{chunk-5BTRDVWC.js → chunk-ZY2EMD72.js} +5 -5
  39. package/dist/{cli-circuit-breaker-6E4E2IU7.js → cli-circuit-breaker-BAERQZ3H.js} +4 -4
  40. package/dist/cli.js +68 -42
  41. package/dist/cli.js.map +1 -1
  42. package/dist/{composite-router-MQOPXLVV.js → composite-router-EONKFRDD.js} +2 -2
  43. package/dist/{consensus-vote-ZRADOLXH.js → consensus-vote-TO5575P3.js} +12 -13
  44. package/dist/{context-retriever-TZGIETJO.js → context-retriever-JM564MOV.js} +6 -6
  45. package/dist/{doctor-deep-OU2WC55V.js → doctor-deep-VFBQ7TY4.js} +3 -3
  46. package/dist/{expert-bridge-WP5ZWXFY.js → expert-bridge-OXME7FES.js} +4 -4
  47. package/dist/{factory-RJTRVII5.js → factory-FVZLVIYH.js} +5 -5
  48. package/dist/{factory-2TN2VZTR.js → factory-MDT5CFA5.js} +5 -5
  49. package/dist/index.d.ts +215 -207
  50. package/dist/index.js +26 -27
  51. package/dist/index.js.map +1 -1
  52. package/dist/{init-opencode-AYMNMWU7.js → init-opencode-Y6XKR6WS.js} +5 -5
  53. package/dist/{issue-triage-QIVZN3PJ.js → issue-triage-2XVD4JQ7.js} +5 -5
  54. package/dist/{pr-reviewer-helpers-P24OBKVM.js → pr-reviewer-helpers-JLWEQIN6.js} +4 -4
  55. package/dist/{registry-command-KWWOKJ5C.js → registry-command-FYVOMCBG.js} +2 -2
  56. package/dist/{repo-security-plan-KZNEXDCI.js → repo-security-plan-JRDHWI2R.js} +3 -3
  57. package/dist/{research-helpers-synthesize-DH5PPX7A.js → research-helpers-synthesize-F7L7M7FJ.js} +3 -4
  58. package/dist/{routing-memory-AGHJQTRH.js → routing-memory-JAV2ICXR.js} +2 -2
  59. package/dist/{session-memory-O24IVZAW.js → session-memory-2XAGY3PX.js} +3 -3
  60. package/dist/{setup-command-NBXZ4NGV.js → setup-command-6WVEOE4Q.js} +11 -12
  61. package/dist/{setup-config-Y4JA5QWO.js → setup-config-KUZU2GFI.js} +3 -3
  62. package/dist/{setup-custom-api-UNX4OJEX.js → setup-custom-api-3M7CU3TF.js} +4 -5
  63. package/dist/{setup-custom-api-UNX4OJEX.js.map → setup-custom-api-3M7CU3TF.js.map} +1 -1
  64. package/dist/{tool-memory-UEQNXIGC.js → tool-memory-YWX4FTIQ.js} +5 -5
  65. package/dist/{weather-report-S5YXRY7G.js → weather-report-ZZM5EU7N.js} +2 -2
  66. package/package.json +1 -1
  67. package/dist/chunk-HKISF2E7.js.map +0 -1
  68. package/dist/chunk-IJ2AZZVH.js.map +0 -1
  69. package/dist/chunk-LJMO5P6O.js.map +0 -1
  70. package/dist/chunk-NESW2TTD.js +0 -134
  71. package/dist/chunk-NESW2TTD.js.map +0 -1
  72. package/dist/chunk-SMGH2B3A.js.map +0 -1
  73. package/dist/chunk-XVY3I7JT.js.map +0 -1
  74. /package/dist/{child-mcp-config-WNISXFYD.js.map → child-mcp-config-PPFHJZSO.js.map} +0 -0
  75. /package/dist/{chunk-RTUZSR4R.js.map → chunk-24WC4XO2.js.map} +0 -0
  76. /package/dist/{chunk-BHA6V7GK.js.map → chunk-4QESFYGV.js.map} +0 -0
  77. /package/dist/{chunk-AZP66FIA.js.map → chunk-5B4VLSMP.js.map} +0 -0
  78. /package/dist/{chunk-VSG6RSE6.js.map → chunk-5ZB3MTA7.js.map} +0 -0
  79. /package/dist/{chunk-FTCU55O6.js.map → chunk-63OGXDHS.js.map} +0 -0
  80. /package/dist/{chunk-G5IDRWWI.js.map → chunk-76535ZNP.js.map} +0 -0
  81. /package/dist/{chunk-SHSKW5ML.js.map → chunk-77JUKFTG.js.map} +0 -0
  82. /package/dist/{chunk-ZYHHDPFW.js.map → chunk-ADRTAUJA.js.map} +0 -0
  83. /package/dist/{chunk-DTFMYM3V.js.map → chunk-EB43BGAR.js.map} +0 -0
  84. /package/dist/{chunk-T73G67GT.js.map → chunk-EDPDH5YT.js.map} +0 -0
  85. /package/dist/{chunk-CPH6LKXO.js.map → chunk-EJR6U67L.js.map} +0 -0
  86. /package/dist/{chunk-ULBKFMVO.js.map → chunk-FUGPKYEJ.js.map} +0 -0
  87. /package/dist/{chunk-57OH2O2U.js.map → chunk-KSJPDQSG.js.map} +0 -0
  88. /package/dist/{chunk-JEBWSHSU.js.map → chunk-L7I55FAN.js.map} +0 -0
  89. /package/dist/{chunk-JCETWDU7.js.map → chunk-LCLVSNST.js.map} +0 -0
  90. /package/dist/{chunk-K7VGX37L.js.map → chunk-OKGHHCS5.js.map} +0 -0
  91. /package/dist/{chunk-WU3SUA35.js.map → chunk-OSSGG7KW.js.map} +0 -0
  92. /package/dist/{chunk-BNHBZRU7.js.map → chunk-Q3NUA7CW.js.map} +0 -0
  93. /package/dist/{chunk-E3QWWP67.js.map → chunk-R2NKJPUX.js.map} +0 -0
  94. /package/dist/{chunk-2T4NV6QT.js.map → chunk-ROAANOOB.js.map} +0 -0
  95. /package/dist/{chunk-SORBJPRA.js.map → chunk-XBPFVWA2.js.map} +0 -0
  96. /package/dist/{chunk-2IBJC2EP.js.map → chunk-YDXGYKZJ.js.map} +0 -0
  97. /package/dist/{chunk-5BTRDVWC.js.map → chunk-ZY2EMD72.js.map} +0 -0
  98. /package/dist/{cli-circuit-breaker-6E4E2IU7.js.map → cli-circuit-breaker-BAERQZ3H.js.map} +0 -0
  99. /package/dist/{composite-router-MQOPXLVV.js.map → composite-router-EONKFRDD.js.map} +0 -0
  100. /package/dist/{consensus-vote-ZRADOLXH.js.map → consensus-vote-TO5575P3.js.map} +0 -0
  101. /package/dist/{context-retriever-TZGIETJO.js.map → context-retriever-JM564MOV.js.map} +0 -0
  102. /package/dist/{doctor-deep-OU2WC55V.js.map → doctor-deep-VFBQ7TY4.js.map} +0 -0
  103. /package/dist/{expert-bridge-WP5ZWXFY.js.map → expert-bridge-OXME7FES.js.map} +0 -0
  104. /package/dist/{factory-2TN2VZTR.js.map → factory-FVZLVIYH.js.map} +0 -0
  105. /package/dist/{factory-RJTRVII5.js.map → factory-MDT5CFA5.js.map} +0 -0
  106. /package/dist/{init-opencode-AYMNMWU7.js.map → init-opencode-Y6XKR6WS.js.map} +0 -0
  107. /package/dist/{issue-triage-QIVZN3PJ.js.map → issue-triage-2XVD4JQ7.js.map} +0 -0
  108. /package/dist/{pr-reviewer-helpers-P24OBKVM.js.map → pr-reviewer-helpers-JLWEQIN6.js.map} +0 -0
  109. /package/dist/{registry-command-KWWOKJ5C.js.map → registry-command-FYVOMCBG.js.map} +0 -0
  110. /package/dist/{repo-security-plan-KZNEXDCI.js.map → repo-security-plan-JRDHWI2R.js.map} +0 -0
  111. /package/dist/{research-helpers-synthesize-DH5PPX7A.js.map → research-helpers-synthesize-F7L7M7FJ.js.map} +0 -0
  112. /package/dist/{routing-memory-AGHJQTRH.js.map → routing-memory-JAV2ICXR.js.map} +0 -0
  113. /package/dist/{session-memory-O24IVZAW.js.map → session-memory-2XAGY3PX.js.map} +0 -0
  114. /package/dist/{setup-command-NBXZ4NGV.js.map → setup-command-6WVEOE4Q.js.map} +0 -0
  115. /package/dist/{setup-config-Y4JA5QWO.js.map → setup-config-KUZU2GFI.js.map} +0 -0
  116. /package/dist/{tool-memory-UEQNXIGC.js.map → tool-memory-YWX4FTIQ.js.map} +0 -0
  117. /package/dist/{weather-report-S5YXRY7G.js.map → weather-report-ZZM5EU7N.js.map} +0 -0
@@ -509,6 +509,64 @@ var BoundedLRUCache = class {
509
509
  }
510
510
  };
511
511
 
512
+ // src/core/tune-adjustment-store.ts
513
+ var TUNE_DEMOTION_FLOOR = 0.5;
514
+ var TUNE_MAX_STEP = 0.2;
515
+ var TUNE_DECAY_WINDOW_MS = 30 * 6e4;
516
+ var TuneAdjustmentStore = class {
517
+ adjustments = /* @__PURE__ */ new Map();
518
+ /**
519
+ * Apply a bounded demotion to `cli`. `magnitude` is the requested reduction
520
+ * (capped to {@link TUNE_MAX_STEP}); compounds on any current (decayed) value
521
+ * but never below {@link TUNE_DEMOTION_FLOOR}. Non-positive magnitudes are a
522
+ * no-op. Returns the resulting adjustment (or undefined for a no-op).
523
+ */
524
+ demote(cli, magnitude, reason) {
525
+ if (magnitude <= 0) return void 0;
526
+ const step = Math.min(TUNE_MAX_STEP, magnitude);
527
+ const current = this.effectiveMultiplier(cli);
528
+ const next = Math.max(TUNE_DEMOTION_FLOOR, current - step);
529
+ const adjustment = {
530
+ cli,
531
+ multiplier: next,
532
+ appliedAt: getTimeProvider().now(),
533
+ reason
534
+ };
535
+ this.adjustments.set(cli, adjustment);
536
+ return adjustment;
537
+ }
538
+ /**
539
+ * Current effective multiplier for `cli` — the stored multiplier decayed
540
+ * linearly back toward 1.0 over {@link TUNE_DECAY_WINDOW_MS}. Returns 1.0
541
+ * (no effect) when there is no active adjustment. Fully-decayed entries are
542
+ * evicted lazily.
543
+ */
544
+ effectiveMultiplier(cli) {
545
+ const adjustment = this.adjustments.get(cli);
546
+ if (adjustment === void 0) return 1;
547
+ const elapsed = getTimeProvider().now() - adjustment.appliedAt;
548
+ if (elapsed >= TUNE_DECAY_WINDOW_MS || elapsed < 0) {
549
+ this.adjustments.delete(cli);
550
+ return 1;
551
+ }
552
+ const decayFraction = elapsed / TUNE_DECAY_WINDOW_MS;
553
+ return adjustment.multiplier + (1 - adjustment.multiplier) * decayFraction;
554
+ }
555
+ /** Snapshot of active (non-evicted) adjustments — for observability/audit. */
556
+ list() {
557
+ return [...this.adjustments.values()];
558
+ }
559
+ /** Remove all adjustments. */
560
+ clear() {
561
+ this.adjustments.clear();
562
+ }
563
+ };
564
+ var singleton;
565
+ function getTuneAdjustmentStore() {
566
+ singleton ??= new TuneAdjustmentStore();
567
+ return singleton;
568
+ }
569
+
512
570
  // src/core/step-events.ts
513
571
  var STEP_SUMMARY_MAX_LEN = 120;
514
572
  function truncateSummary(s) {
@@ -8840,6 +8898,130 @@ async function fetchCapacityData(adapters) {
8840
8898
  return result;
8841
8899
  }
8842
8900
 
8901
+ // src/config/defaults-env.ts
8902
+ function parseIntEnv(envKey, fallback) {
8903
+ const envValue = process.env[envKey];
8904
+ if (envValue === void 0) {
8905
+ return fallback;
8906
+ }
8907
+ const parsed = parseInt(envValue, 10);
8908
+ return isNaN(parsed) || parsed <= 0 ? fallback : parsed;
8909
+ }
8910
+ function parseFloatEnv(envKey, fallback) {
8911
+ const envValue = process.env[envKey];
8912
+ if (envValue === void 0) {
8913
+ return fallback;
8914
+ }
8915
+ const parsed = parseFloat(envValue);
8916
+ return isNaN(parsed) || !isFinite(parsed) ? fallback : parsed;
8917
+ }
8918
+ function parseBoolEnv(envKey, fallback) {
8919
+ const envValue = process.env[envKey]?.toLowerCase();
8920
+ if (envValue === void 0) {
8921
+ return fallback;
8922
+ }
8923
+ if (envValue === "true" || envValue === "1") return true;
8924
+ if (envValue === "false" || envValue === "0") return false;
8925
+ return fallback;
8926
+ }
8927
+ function createGetTimeout(timeoutDefaults) {
8928
+ return (key) => {
8929
+ const envKey = `NEXUS_TIMEOUT_${key.replace(/Ms$/, "").toUpperCase()}`;
8930
+ return parseIntEnv(envKey, timeoutDefaults[key]);
8931
+ };
8932
+ }
8933
+ function createGetRetryConfig(retryDefaults) {
8934
+ return () => {
8935
+ return {
8936
+ maxRetries: parseIntEnv("NEXUS_RETRY_MAX_RETRIES", retryDefaults.maxRetries),
8937
+ baseDelayMs: parseIntEnv("NEXUS_RETRY_BASE_DELAY", retryDefaults.baseDelayMs),
8938
+ maxDelayMs: parseIntEnv("NEXUS_RETRY_MAX_DELAY", retryDefaults.maxDelayMs),
8939
+ jitterFactor: parseFloatEnv("NEXUS_RETRY_JITTER", retryDefaults.jitterFactor)
8940
+ };
8941
+ };
8942
+ }
8943
+ function createGetRateLimitConfig(rateLimitDefaults) {
8944
+ return () => {
8945
+ return {
8946
+ requestsPerMinute: parseIntEnv("NEXUS_RATE_LIMIT_RPM", rateLimitDefaults.requestsPerMinute),
8947
+ enabled: parseBoolEnv("NEXUS_RATE_LIMIT_ENABLED", rateLimitDefaults.enabled),
8948
+ maxConcurrent: parseIntEnv(
8949
+ "NEXUS_RATE_LIMIT_MAX_CONCURRENT",
8950
+ rateLimitDefaults.maxConcurrent
8951
+ ),
8952
+ capacity: parseIntEnv("NEXUS_RATE_LIMIT_CAPACITY", rateLimitDefaults.capacity),
8953
+ refillRate: parseIntEnv("NEXUS_RATE_LIMIT_REFILL_RATE", rateLimitDefaults.refillRate),
8954
+ refillIntervalMs: parseIntEnv(
8955
+ "NEXUS_RATE_LIMIT_REFILL_INTERVAL",
8956
+ rateLimitDefaults.refillIntervalMs
8957
+ )
8958
+ };
8959
+ };
8960
+ }
8961
+ function createGetCircuitBreakerConfig(cbDefaults) {
8962
+ return () => {
8963
+ return {
8964
+ failureThreshold: parseIntEnv("NEXUS_CIRCUIT_BREAKER_THRESHOLD", cbDefaults.failureThreshold),
8965
+ resetTimeoutMs: parseIntEnv("NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT", cbDefaults.resetTimeoutMs),
8966
+ halfOpenSuccessThreshold: cbDefaults.halfOpenSuccessThreshold,
8967
+ countTimeoutsAsFailures: cbDefaults.countTimeoutsAsFailures,
8968
+ countAuthFailuresAsFailures: cbDefaults.countAuthFailuresAsFailures,
8969
+ countRateLimitsAsFailures: cbDefaults.countRateLimitsAsFailures,
8970
+ halfOpenMaxRequests: cbDefaults.halfOpenMaxRequests
8971
+ };
8972
+ };
8973
+ }
8974
+ function createGetToolRateLimit(toolRateLimits) {
8975
+ return (tool) => {
8976
+ return toolRateLimits[tool];
8977
+ };
8978
+ }
8979
+ function createGetEnvVarDocumentation(defaults) {
8980
+ return () => {
8981
+ const t = defaults.TIMEOUT_DEFAULTS;
8982
+ const r = defaults.RATE_LIMIT_DEFAULTS;
8983
+ const rt = defaults.RETRY_DEFAULTS;
8984
+ const cb = defaults.CIRCUIT_BREAKER_DEFAULTS;
8985
+ return `# Environment Variable Overrides
8986
+
8987
+ All defaults can be overridden via environment variables using the NEXUS_ prefix.
8988
+
8989
+ ## Timeouts
8990
+
8991
+ | Variable | Default | Description |
8992
+ | -------- | ------- | ----------- |
8993
+ | NEXUS_TIMEOUT_CLI | ${String(t.cliMs)} | CLI execution timeout (ms) |
8994
+ | NEXUS_TIMEOUT_API | ${String(t.apiMs)} | API request timeout (ms) |
8995
+ | NEXUS_TIMEOUT_WORKFLOW | ${String(t.workflowMs)} | Workflow timeout (ms) |
8996
+ | NEXUS_TIMEOUT_MCP | ${String(t.mcpMs)} | MCP operation timeout (ms) |
8997
+
8998
+ ## Rate Limits
8999
+
9000
+ | Variable | Default | Description |
9001
+ | -------- | ------- | ----------- |
9002
+ | NEXUS_RATE_LIMIT_RPM | ${String(r.requestsPerMinute)} | Requests per minute |
9003
+ | NEXUS_RATE_LIMIT_ENABLED | ${String(r.enabled)} | Enable rate limiting |
9004
+ | NEXUS_RATE_LIMIT_CAPACITY | ${String(r.capacity)} | Token bucket capacity |
9005
+
9006
+ ## Retries
9007
+
9008
+ | Variable | Default | Description |
9009
+ | -------- | ------- | ----------- |
9010
+ | NEXUS_RETRY_MAX_RETRIES | ${String(rt.maxRetries)} | Maximum retry attempts |
9011
+ | NEXUS_RETRY_BASE_DELAY | ${String(rt.baseDelayMs)} | Base delay (ms) |
9012
+ | NEXUS_RETRY_MAX_DELAY | ${String(rt.maxDelayMs)} | Maximum delay (ms) |
9013
+ | NEXUS_RETRY_JITTER | ${String(rt.jitterFactor)} | Jitter factor (0-1) |
9014
+
9015
+ ## Circuit Breaker
9016
+
9017
+ | Variable | Default | Description |
9018
+ | -------- | ------- | ----------- |
9019
+ | NEXUS_CIRCUIT_BREAKER_THRESHOLD | ${String(cb.failureThreshold)} | Failure threshold |
9020
+ | NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT | ${String(cb.resetTimeoutMs)} | Reset timeout (ms) |
9021
+ `;
9022
+ };
9023
+ }
9024
+
8843
9025
  // src/mcp/tools/weather-report-types.ts
8844
9026
  import { z as z12 } from "zod";
8845
9027
  var WeatherReportInputSchema = z12.object({
@@ -10645,7 +10827,7 @@ async function runScoringStages(task, candidates, stagesExecuted, deps) {
10645
10827
  candidates: filtered
10646
10828
  };
10647
10829
  }
10648
- function aggregateStageScores(scoring, taskContent) {
10830
+ function aggregateStageScores(scoring, taskContent, candidates) {
10649
10831
  const weatherScores = getWeatherBonusForTask(taskContent);
10650
10832
  return mergeScoreMaps(
10651
10833
  scoring.cascadeResult.scores,
@@ -10653,9 +10835,23 @@ function aggregateStageScores(scoring, taskContent) {
10653
10835
  scoring.knnResult.scores,
10654
10836
  scoring.distilledResult.scores,
10655
10837
  scoring.resourceResult.scores,
10656
- weatherScores
10838
+ weatherScores,
10839
+ getTuneAdjustmentScores(candidates)
10657
10840
  );
10658
10841
  }
10842
+ var TUNE_ENFORCE_ENV = "NEXUS_TUNE_ENFORCE";
10843
+ function getTuneAdjustmentScores(candidates) {
10844
+ const scores = /* @__PURE__ */ new Map();
10845
+ if (!parseBoolEnv(TUNE_ENFORCE_ENV, false)) return scores;
10846
+ const store = getTuneAdjustmentStore();
10847
+ for (const cli of candidates) {
10848
+ const multiplier = store.effectiveMultiplier(cli);
10849
+ if (multiplier < 1) {
10850
+ scores.set(cli, -(1 - multiplier) * 10);
10851
+ }
10852
+ }
10853
+ return scores;
10854
+ }
10659
10855
  function getWeatherBonusForTask(taskContent) {
10660
10856
  try {
10661
10857
  const match = detectTaskCategory(taskContent);
@@ -10733,7 +10929,7 @@ async function runPipeline(task, taskProfile, stagesExecuted, cliNames, deps) {
10733
10929
  const overrideResult = applyCategoryOverride(task, candidates, stagesExecuted);
10734
10930
  if (!overrideResult.ok) return overrideResult;
10735
10931
  candidates = overrideResult.value;
10736
- const stageScores = aggregateStageScores(scoring, task.content);
10932
+ const stageScores = aggregateStageScores(scoring, task.content, candidates);
10737
10933
  const topsisOpts = {
10738
10934
  performanceData: getPerformanceDataForCategory(task.content)
10739
10935
  };
@@ -10878,13 +11074,26 @@ function hasMinimumPreferenceData(deps) {
10878
11074
  }
10879
11075
  var QUALITY_HISTORY_LIMIT = 20;
10880
11076
  var MAX_LATENCY_MS = 3e4;
11077
+ var QUALITY_RATE_CACHE_TTL_MS = 15e3;
11078
+ var qualityRateCache = /* @__PURE__ */ new Map();
11079
+ function getCachedCliSuccessRate(cli) {
11080
+ const now = getTimeProvider().now();
11081
+ const cached = qualityRateCache.get(cli);
11082
+ if (cached !== void 0 && now - cached.computedAt < QUALITY_RATE_CACHE_TTL_MS) {
11083
+ return cached.rate;
11084
+ }
11085
+ const recent = getOutcomeStore().query({ cli, limit: QUALITY_HISTORY_LIMIT });
11086
+ if (recent.length === 0) return void 0;
11087
+ const rate = recent.filter((o) => o.success).length / recent.length;
11088
+ qualityRateCache.set(cli, { rate, computedAt: now });
11089
+ return rate;
11090
+ }
10881
11091
  function computeQualityReward(cli, success, durationMs2) {
10882
11092
  if (!success) return 0.1;
10883
11093
  let reward = 0.5;
10884
11094
  try {
10885
- const recent = getOutcomeStore().query({ cli, limit: QUALITY_HISTORY_LIMIT });
10886
- if (recent.length > 0) {
10887
- const rate = recent.filter((o) => o.success).length / recent.length;
11095
+ const rate = getCachedCliSuccessRate(cli);
11096
+ if (rate !== void 0) {
10888
11097
  reward += rate * 0.3;
10889
11098
  }
10890
11099
  } catch (error) {
@@ -11179,7 +11388,7 @@ var CompositeRouter = class _CompositeRouter {
11179
11388
  */
11180
11389
  async consultUnifiedContext(task) {
11181
11390
  try {
11182
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-TZGIETJO.js");
11391
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-JM564MOV.js");
11183
11392
  const ctx = await getContextForTask({
11184
11393
  task: task.content,
11185
11394
  category: inferTaskCategory(task.content),
@@ -12328,6 +12537,7 @@ export {
12328
12537
  CircularBuffer,
12329
12538
  BoundedLRUCache,
12330
12539
  getTimeProvider,
12540
+ getTuneAdjustmentStore,
12331
12541
  withStep,
12332
12542
  sanitize,
12333
12543
  setGlobalLogLevel,
@@ -12452,6 +12662,13 @@ export {
12452
12662
  CompositeRouterConfigSchema,
12453
12663
  DEFAULT_COMPOSITE_CONFIG,
12454
12664
  CompositeRoutingError,
12665
+ parseBoolEnv,
12666
+ createGetTimeout,
12667
+ createGetRetryConfig,
12668
+ createGetRateLimitConfig,
12669
+ createGetCircuitBreakerConfig,
12670
+ createGetToolRateLimit,
12671
+ createGetEnvVarDocumentation,
12455
12672
  WeatherReportInputSchema,
12456
12673
  SECURITY_KEYWORDS,
12457
12674
  ARCHITECTURE_KEYWORDS,
@@ -12502,4 +12719,4 @@ export {
12502
12719
  ParseError,
12503
12720
  OrchestratorError
12504
12721
  };
12505
- //# sourceMappingURL=chunk-HKISF2E7.js.map
12722
+ //# sourceMappingURL=chunk-OT6V5ROA.js.map