nexus-agents 2.93.0 → 2.95.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-NW7JMSDK.js} +2 -2
  2. package/dist/{chunk-XVY3I7JT.js → chunk-2X24T4ZD.js} +9 -12
  3. package/dist/chunk-2X24T4ZD.js.map +1 -0
  4. package/dist/{chunk-BHA6V7GK.js → chunk-3H6Q3RZM.js} +4 -4
  5. package/dist/{chunk-T73G67GT.js → chunk-3HXWI34V.js} +3 -3
  6. package/dist/{chunk-RTUZSR4R.js → chunk-47Z3YPOK.js} +2 -2
  7. package/dist/{chunk-G5IDRWWI.js → chunk-4NVYN2MB.js} +4 -4
  8. package/dist/{chunk-5BTRDVWC.js → chunk-55G7KQ7F.js} +5 -5
  9. package/dist/{chunk-WU3SUA35.js → chunk-5HBDXW44.js} +2 -2
  10. package/dist/{chunk-JCETWDU7.js → chunk-6IWPN5UB.js} +2 -2
  11. package/dist/{chunk-4A4WPM75.js → chunk-7GUP6KQQ.js} +8 -10
  12. package/dist/{chunk-4A4WPM75.js.map → chunk-7GUP6KQQ.js.map} +1 -1
  13. package/dist/{chunk-ULBKFMVO.js → chunk-BSHDI4BH.js} +2 -2
  14. package/dist/{chunk-JEBWSHSU.js → chunk-D3JSXVX3.js} +2 -2
  15. package/dist/{chunk-HKISF2E7.js → chunk-ECBH5INZ.js} +259 -8
  16. package/dist/chunk-ECBH5INZ.js.map +1 -0
  17. package/dist/{chunk-ZOAU7RE4.js → chunk-ECZW5FXN.js} +4 -6
  18. package/dist/{chunk-ZOAU7RE4.js.map → chunk-ECZW5FXN.js.map} +1 -1
  19. package/dist/{chunk-ZYHHDPFW.js → chunk-FTDVA33Z.js} +4 -4
  20. package/dist/{chunk-2T4NV6QT.js → chunk-FXVJLJUF.js} +2 -2
  21. package/dist/{chunk-IJ2AZZVH.js → chunk-FYGZ4MEQ.js} +141 -28
  22. package/dist/chunk-FYGZ4MEQ.js.map +1 -0
  23. package/dist/{chunk-SORBJPRA.js → chunk-G42N55ZR.js} +2 -2
  24. package/dist/{chunk-SHSKW5ML.js → chunk-GC5FH2IA.js} +7 -7
  25. package/dist/{chunk-FTCU55O6.js → chunk-KHZGMF2W.js} +4 -4
  26. package/dist/{chunk-2IBJC2EP.js → chunk-LXROEQAO.js} +2 -2
  27. package/dist/{chunk-CPH6LKXO.js → chunk-LZOTH2GI.js} +2 -2
  28. package/dist/{chunk-DTFMYM3V.js → chunk-O4LVC4MQ.js} +2 -2
  29. package/dist/{chunk-AZP66FIA.js → chunk-PFOY5ML6.js} +3 -3
  30. package/dist/{chunk-SMGH2B3A.js → chunk-QUPPV6UO.js} +20 -3
  31. package/dist/chunk-QUPPV6UO.js.map +1 -0
  32. package/dist/{chunk-K7VGX37L.js → chunk-TEKWQNQ2.js} +3 -3
  33. package/dist/{chunk-LJMO5P6O.js → chunk-VTMQND6B.js} +23 -13
  34. package/dist/chunk-VTMQND6B.js.map +1 -0
  35. package/dist/{chunk-BNHBZRU7.js → chunk-WGA4VGIR.js} +3 -3
  36. package/dist/{chunk-57OH2O2U.js → chunk-Y3OOHHKQ.js} +2 -2
  37. package/dist/{chunk-VSG6RSE6.js → chunk-YYXJ6RTO.js} +3 -3
  38. package/dist/{chunk-E3QWWP67.js → chunk-ZICVVBDW.js} +2 -2
  39. package/dist/{cli-circuit-breaker-6E4E2IU7.js → cli-circuit-breaker-LNU5DQSB.js} +4 -4
  40. package/dist/cli.js +131 -54
  41. package/dist/cli.js.map +1 -1
  42. package/dist/{composite-router-MQOPXLVV.js → composite-router-DJ54ND5X.js} +2 -2
  43. package/dist/{consensus-vote-ZRADOLXH.js → consensus-vote-XLEQFVE7.js} +12 -13
  44. package/dist/{context-retriever-TZGIETJO.js → context-retriever-6O6TREXH.js} +6 -6
  45. package/dist/{doctor-deep-OU2WC55V.js → doctor-deep-PSNJPELP.js} +3 -3
  46. package/dist/{expert-bridge-WP5ZWXFY.js → expert-bridge-Q3OWPD4L.js} +4 -4
  47. package/dist/{factory-RJTRVII5.js → factory-43RVPRT5.js} +5 -5
  48. package/dist/{factory-2TN2VZTR.js → factory-PSMTMC7V.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-25AUARJH.js} +5 -5
  53. package/dist/{issue-triage-QIVZN3PJ.js → issue-triage-KZTENUDH.js} +5 -5
  54. package/dist/{pr-reviewer-helpers-P24OBKVM.js → pr-reviewer-helpers-XENJ4E2T.js} +4 -4
  55. package/dist/{registry-command-KWWOKJ5C.js → registry-command-X3O34FAK.js} +2 -2
  56. package/dist/{repo-security-plan-KZNEXDCI.js → repo-security-plan-XCX7EFJR.js} +3 -3
  57. package/dist/{research-helpers-synthesize-DH5PPX7A.js → research-helpers-synthesize-CGVR6M4S.js} +3 -4
  58. package/dist/{routing-memory-AGHJQTRH.js → routing-memory-YZRYGXQC.js} +2 -2
  59. package/dist/{session-memory-O24IVZAW.js → session-memory-SXQAA2EN.js} +3 -3
  60. package/dist/{setup-command-NBXZ4NGV.js → setup-command-VG7JZI6O.js} +11 -12
  61. package/dist/{setup-config-Y4JA5QWO.js → setup-config-VJAK6AA2.js} +3 -3
  62. package/dist/{setup-custom-api-UNX4OJEX.js → setup-custom-api-KSF2JMTS.js} +4 -5
  63. package/dist/{setup-custom-api-UNX4OJEX.js.map → setup-custom-api-KSF2JMTS.js.map} +1 -1
  64. package/dist/{tool-memory-UEQNXIGC.js → tool-memory-L7SDFSF5.js} +5 -5
  65. package/dist/{weather-report-S5YXRY7G.js → weather-report-D6HFOK7S.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-NW7JMSDK.js.map} +0 -0
  75. /package/dist/{chunk-BHA6V7GK.js.map → chunk-3H6Q3RZM.js.map} +0 -0
  76. /package/dist/{chunk-T73G67GT.js.map → chunk-3HXWI34V.js.map} +0 -0
  77. /package/dist/{chunk-RTUZSR4R.js.map → chunk-47Z3YPOK.js.map} +0 -0
  78. /package/dist/{chunk-G5IDRWWI.js.map → chunk-4NVYN2MB.js.map} +0 -0
  79. /package/dist/{chunk-5BTRDVWC.js.map → chunk-55G7KQ7F.js.map} +0 -0
  80. /package/dist/{chunk-WU3SUA35.js.map → chunk-5HBDXW44.js.map} +0 -0
  81. /package/dist/{chunk-JCETWDU7.js.map → chunk-6IWPN5UB.js.map} +0 -0
  82. /package/dist/{chunk-ULBKFMVO.js.map → chunk-BSHDI4BH.js.map} +0 -0
  83. /package/dist/{chunk-JEBWSHSU.js.map → chunk-D3JSXVX3.js.map} +0 -0
  84. /package/dist/{chunk-ZYHHDPFW.js.map → chunk-FTDVA33Z.js.map} +0 -0
  85. /package/dist/{chunk-2T4NV6QT.js.map → chunk-FXVJLJUF.js.map} +0 -0
  86. /package/dist/{chunk-SORBJPRA.js.map → chunk-G42N55ZR.js.map} +0 -0
  87. /package/dist/{chunk-SHSKW5ML.js.map → chunk-GC5FH2IA.js.map} +0 -0
  88. /package/dist/{chunk-FTCU55O6.js.map → chunk-KHZGMF2W.js.map} +0 -0
  89. /package/dist/{chunk-2IBJC2EP.js.map → chunk-LXROEQAO.js.map} +0 -0
  90. /package/dist/{chunk-CPH6LKXO.js.map → chunk-LZOTH2GI.js.map} +0 -0
  91. /package/dist/{chunk-DTFMYM3V.js.map → chunk-O4LVC4MQ.js.map} +0 -0
  92. /package/dist/{chunk-AZP66FIA.js.map → chunk-PFOY5ML6.js.map} +0 -0
  93. /package/dist/{chunk-K7VGX37L.js.map → chunk-TEKWQNQ2.js.map} +0 -0
  94. /package/dist/{chunk-BNHBZRU7.js.map → chunk-WGA4VGIR.js.map} +0 -0
  95. /package/dist/{chunk-57OH2O2U.js.map → chunk-Y3OOHHKQ.js.map} +0 -0
  96. /package/dist/{chunk-VSG6RSE6.js.map → chunk-YYXJ6RTO.js.map} +0 -0
  97. /package/dist/{chunk-E3QWWP67.js.map → chunk-ZICVVBDW.js.map} +0 -0
  98. /package/dist/{cli-circuit-breaker-6E4E2IU7.js.map → cli-circuit-breaker-LNU5DQSB.js.map} +0 -0
  99. /package/dist/{composite-router-MQOPXLVV.js.map → composite-router-DJ54ND5X.js.map} +0 -0
  100. /package/dist/{consensus-vote-ZRADOLXH.js.map → consensus-vote-XLEQFVE7.js.map} +0 -0
  101. /package/dist/{context-retriever-TZGIETJO.js.map → context-retriever-6O6TREXH.js.map} +0 -0
  102. /package/dist/{doctor-deep-OU2WC55V.js.map → doctor-deep-PSNJPELP.js.map} +0 -0
  103. /package/dist/{expert-bridge-WP5ZWXFY.js.map → expert-bridge-Q3OWPD4L.js.map} +0 -0
  104. /package/dist/{factory-2TN2VZTR.js.map → factory-43RVPRT5.js.map} +0 -0
  105. /package/dist/{factory-RJTRVII5.js.map → factory-PSMTMC7V.js.map} +0 -0
  106. /package/dist/{init-opencode-AYMNMWU7.js.map → init-opencode-25AUARJH.js.map} +0 -0
  107. /package/dist/{issue-triage-QIVZN3PJ.js.map → issue-triage-KZTENUDH.js.map} +0 -0
  108. /package/dist/{pr-reviewer-helpers-P24OBKVM.js.map → pr-reviewer-helpers-XENJ4E2T.js.map} +0 -0
  109. /package/dist/{registry-command-KWWOKJ5C.js.map → registry-command-X3O34FAK.js.map} +0 -0
  110. /package/dist/{repo-security-plan-KZNEXDCI.js.map → repo-security-plan-XCX7EFJR.js.map} +0 -0
  111. /package/dist/{research-helpers-synthesize-DH5PPX7A.js.map → research-helpers-synthesize-CGVR6M4S.js.map} +0 -0
  112. /package/dist/{routing-memory-AGHJQTRH.js.map → routing-memory-YZRYGXQC.js.map} +0 -0
  113. /package/dist/{session-memory-O24IVZAW.js.map → session-memory-SXQAA2EN.js.map} +0 -0
  114. /package/dist/{setup-command-NBXZ4NGV.js.map → setup-command-VG7JZI6O.js.map} +0 -0
  115. /package/dist/{setup-config-Y4JA5QWO.js.map → setup-config-VJAK6AA2.js.map} +0 -0
  116. /package/dist/{tool-memory-UEQNXIGC.js.map → tool-memory-L7SDFSF5.js.map} +0 -0
  117. /package/dist/{weather-report-S5YXRY7G.js.map → weather-report-D6HFOK7S.js.map} +0 -0
@@ -509,6 +509,98 @@ 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 STAT_REASON_MAX = 512;
517
+ var TuneAdjustmentStore = class {
518
+ adjustments = /* @__PURE__ */ new Map();
519
+ /** Cumulative telemetry — never evicted (bounded by CLI cardinality). */
520
+ stats = /* @__PURE__ */ new Map();
521
+ /** Increment a CLI's cumulative demotion counter. Pure telemetry. */
522
+ bumpStat(cli, kind, reason) {
523
+ let stat = this.stats.get(cli);
524
+ if (stat === void 0) {
525
+ stat = { cli, applied: 0, intended: 0, lastReason: "", lastAt: 0 };
526
+ this.stats.set(cli, stat);
527
+ }
528
+ stat[kind] += 1;
529
+ stat.lastReason = reason.length > STAT_REASON_MAX ? reason.slice(0, STAT_REASON_MAX) : reason;
530
+ stat.lastAt = getTimeProvider().now();
531
+ }
532
+ /**
533
+ * Apply a bounded demotion to `cli`. `magnitude` is the requested reduction
534
+ * (capped to {@link TUNE_MAX_STEP}); compounds on any current (decayed) value
535
+ * but never below {@link TUNE_DEMOTION_FLOOR}. Non-positive magnitudes are a
536
+ * no-op. Returns the resulting adjustment (or undefined for a no-op).
537
+ */
538
+ demote(cli, magnitude, reason) {
539
+ if (magnitude <= 0) return void 0;
540
+ const step = Math.min(TUNE_MAX_STEP, magnitude);
541
+ const current = this.effectiveMultiplier(cli);
542
+ const next = Math.max(TUNE_DEMOTION_FLOOR, current - step);
543
+ const adjustment = {
544
+ cli,
545
+ multiplier: next,
546
+ appliedAt: getTimeProvider().now(),
547
+ reason
548
+ };
549
+ this.adjustments.set(cli, adjustment);
550
+ this.bumpStat(cli, "applied", reason);
551
+ return adjustment;
552
+ }
553
+ /**
554
+ * Record a demotion the loop WOULD have applied, for shadow-soak telemetry
555
+ * (#3323) — increments the `intended` counter ONLY and does NOT touch the
556
+ * routing adjustments. Lets an operator observe what enabling the loop would
557
+ * do (via {@link demotionStats}) while `effectiveMultiplier` stays 1.0 and
558
+ * routing is untouched. Non-empty `reason` required; otherwise a no-op.
559
+ */
560
+ recordIntended(cli, reason) {
561
+ if (reason === "") return;
562
+ this.bumpStat(cli, "intended", reason);
563
+ }
564
+ /**
565
+ * Current effective multiplier for `cli` — the stored multiplier decayed
566
+ * linearly back toward 1.0 over {@link TUNE_DECAY_WINDOW_MS}. Returns 1.0
567
+ * (no effect) when there is no active adjustment. Fully-decayed entries are
568
+ * evicted lazily.
569
+ */
570
+ effectiveMultiplier(cli) {
571
+ const adjustment = this.adjustments.get(cli);
572
+ if (adjustment === void 0) return 1;
573
+ const elapsed = getTimeProvider().now() - adjustment.appliedAt;
574
+ if (elapsed >= TUNE_DECAY_WINDOW_MS || elapsed < 0) {
575
+ this.adjustments.delete(cli);
576
+ return 1;
577
+ }
578
+ const decayFraction = elapsed / TUNE_DECAY_WINDOW_MS;
579
+ return adjustment.multiplier + (1 - adjustment.multiplier) * decayFraction;
580
+ }
581
+ /** Snapshot of active (non-evicted) adjustments — for observability/audit. */
582
+ list() {
583
+ return [...this.adjustments.values()];
584
+ }
585
+ /**
586
+ * Cumulative demotion telemetry per CLI (#3323) — survives decay, so a shadow
587
+ * soak shows how often each CLI is (or would be) demoted. Read-only snapshot.
588
+ */
589
+ demotionStats() {
590
+ return [...this.stats.values()].map((s) => ({ ...s })).sort((a, b) => a.cli.localeCompare(b.cli));
591
+ }
592
+ /** Remove all adjustments and telemetry. */
593
+ clear() {
594
+ this.adjustments.clear();
595
+ this.stats.clear();
596
+ }
597
+ };
598
+ var singleton;
599
+ function getTuneAdjustmentStore() {
600
+ singleton ??= new TuneAdjustmentStore();
601
+ return singleton;
602
+ }
603
+
512
604
  // src/core/step-events.ts
513
605
  var STEP_SUMMARY_MAX_LEN = 120;
514
606
  function truncateSummary(s) {
@@ -8840,6 +8932,130 @@ async function fetchCapacityData(adapters) {
8840
8932
  return result;
8841
8933
  }
8842
8934
 
8935
+ // src/config/defaults-env.ts
8936
+ function parseIntEnv(envKey, fallback) {
8937
+ const envValue = process.env[envKey];
8938
+ if (envValue === void 0) {
8939
+ return fallback;
8940
+ }
8941
+ const parsed = parseInt(envValue, 10);
8942
+ return isNaN(parsed) || parsed <= 0 ? fallback : parsed;
8943
+ }
8944
+ function parseFloatEnv(envKey, fallback) {
8945
+ const envValue = process.env[envKey];
8946
+ if (envValue === void 0) {
8947
+ return fallback;
8948
+ }
8949
+ const parsed = parseFloat(envValue);
8950
+ return isNaN(parsed) || !isFinite(parsed) ? fallback : parsed;
8951
+ }
8952
+ function parseBoolEnv(envKey, fallback) {
8953
+ const envValue = process.env[envKey]?.toLowerCase();
8954
+ if (envValue === void 0) {
8955
+ return fallback;
8956
+ }
8957
+ if (envValue === "true" || envValue === "1") return true;
8958
+ if (envValue === "false" || envValue === "0") return false;
8959
+ return fallback;
8960
+ }
8961
+ function createGetTimeout(timeoutDefaults) {
8962
+ return (key) => {
8963
+ const envKey = `NEXUS_TIMEOUT_${key.replace(/Ms$/, "").toUpperCase()}`;
8964
+ return parseIntEnv(envKey, timeoutDefaults[key]);
8965
+ };
8966
+ }
8967
+ function createGetRetryConfig(retryDefaults) {
8968
+ return () => {
8969
+ return {
8970
+ maxRetries: parseIntEnv("NEXUS_RETRY_MAX_RETRIES", retryDefaults.maxRetries),
8971
+ baseDelayMs: parseIntEnv("NEXUS_RETRY_BASE_DELAY", retryDefaults.baseDelayMs),
8972
+ maxDelayMs: parseIntEnv("NEXUS_RETRY_MAX_DELAY", retryDefaults.maxDelayMs),
8973
+ jitterFactor: parseFloatEnv("NEXUS_RETRY_JITTER", retryDefaults.jitterFactor)
8974
+ };
8975
+ };
8976
+ }
8977
+ function createGetRateLimitConfig(rateLimitDefaults) {
8978
+ return () => {
8979
+ return {
8980
+ requestsPerMinute: parseIntEnv("NEXUS_RATE_LIMIT_RPM", rateLimitDefaults.requestsPerMinute),
8981
+ enabled: parseBoolEnv("NEXUS_RATE_LIMIT_ENABLED", rateLimitDefaults.enabled),
8982
+ maxConcurrent: parseIntEnv(
8983
+ "NEXUS_RATE_LIMIT_MAX_CONCURRENT",
8984
+ rateLimitDefaults.maxConcurrent
8985
+ ),
8986
+ capacity: parseIntEnv("NEXUS_RATE_LIMIT_CAPACITY", rateLimitDefaults.capacity),
8987
+ refillRate: parseIntEnv("NEXUS_RATE_LIMIT_REFILL_RATE", rateLimitDefaults.refillRate),
8988
+ refillIntervalMs: parseIntEnv(
8989
+ "NEXUS_RATE_LIMIT_REFILL_INTERVAL",
8990
+ rateLimitDefaults.refillIntervalMs
8991
+ )
8992
+ };
8993
+ };
8994
+ }
8995
+ function createGetCircuitBreakerConfig(cbDefaults) {
8996
+ return () => {
8997
+ return {
8998
+ failureThreshold: parseIntEnv("NEXUS_CIRCUIT_BREAKER_THRESHOLD", cbDefaults.failureThreshold),
8999
+ resetTimeoutMs: parseIntEnv("NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT", cbDefaults.resetTimeoutMs),
9000
+ halfOpenSuccessThreshold: cbDefaults.halfOpenSuccessThreshold,
9001
+ countTimeoutsAsFailures: cbDefaults.countTimeoutsAsFailures,
9002
+ countAuthFailuresAsFailures: cbDefaults.countAuthFailuresAsFailures,
9003
+ countRateLimitsAsFailures: cbDefaults.countRateLimitsAsFailures,
9004
+ halfOpenMaxRequests: cbDefaults.halfOpenMaxRequests
9005
+ };
9006
+ };
9007
+ }
9008
+ function createGetToolRateLimit(toolRateLimits) {
9009
+ return (tool) => {
9010
+ return toolRateLimits[tool];
9011
+ };
9012
+ }
9013
+ function createGetEnvVarDocumentation(defaults) {
9014
+ return () => {
9015
+ const t = defaults.TIMEOUT_DEFAULTS;
9016
+ const r = defaults.RATE_LIMIT_DEFAULTS;
9017
+ const rt = defaults.RETRY_DEFAULTS;
9018
+ const cb = defaults.CIRCUIT_BREAKER_DEFAULTS;
9019
+ return `# Environment Variable Overrides
9020
+
9021
+ All defaults can be overridden via environment variables using the NEXUS_ prefix.
9022
+
9023
+ ## Timeouts
9024
+
9025
+ | Variable | Default | Description |
9026
+ | -------- | ------- | ----------- |
9027
+ | NEXUS_TIMEOUT_CLI | ${String(t.cliMs)} | CLI execution timeout (ms) |
9028
+ | NEXUS_TIMEOUT_API | ${String(t.apiMs)} | API request timeout (ms) |
9029
+ | NEXUS_TIMEOUT_WORKFLOW | ${String(t.workflowMs)} | Workflow timeout (ms) |
9030
+ | NEXUS_TIMEOUT_MCP | ${String(t.mcpMs)} | MCP operation timeout (ms) |
9031
+
9032
+ ## Rate Limits
9033
+
9034
+ | Variable | Default | Description |
9035
+ | -------- | ------- | ----------- |
9036
+ | NEXUS_RATE_LIMIT_RPM | ${String(r.requestsPerMinute)} | Requests per minute |
9037
+ | NEXUS_RATE_LIMIT_ENABLED | ${String(r.enabled)} | Enable rate limiting |
9038
+ | NEXUS_RATE_LIMIT_CAPACITY | ${String(r.capacity)} | Token bucket capacity |
9039
+
9040
+ ## Retries
9041
+
9042
+ | Variable | Default | Description |
9043
+ | -------- | ------- | ----------- |
9044
+ | NEXUS_RETRY_MAX_RETRIES | ${String(rt.maxRetries)} | Maximum retry attempts |
9045
+ | NEXUS_RETRY_BASE_DELAY | ${String(rt.baseDelayMs)} | Base delay (ms) |
9046
+ | NEXUS_RETRY_MAX_DELAY | ${String(rt.maxDelayMs)} | Maximum delay (ms) |
9047
+ | NEXUS_RETRY_JITTER | ${String(rt.jitterFactor)} | Jitter factor (0-1) |
9048
+
9049
+ ## Circuit Breaker
9050
+
9051
+ | Variable | Default | Description |
9052
+ | -------- | ------- | ----------- |
9053
+ | NEXUS_CIRCUIT_BREAKER_THRESHOLD | ${String(cb.failureThreshold)} | Failure threshold |
9054
+ | NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT | ${String(cb.resetTimeoutMs)} | Reset timeout (ms) |
9055
+ `;
9056
+ };
9057
+ }
9058
+
8843
9059
  // src/mcp/tools/weather-report-types.ts
8844
9060
  import { z as z12 } from "zod";
8845
9061
  var WeatherReportInputSchema = z12.object({
@@ -10645,7 +10861,7 @@ async function runScoringStages(task, candidates, stagesExecuted, deps) {
10645
10861
  candidates: filtered
10646
10862
  };
10647
10863
  }
10648
- function aggregateStageScores(scoring, taskContent) {
10864
+ function aggregateStageScores(scoring, taskContent, candidates) {
10649
10865
  const weatherScores = getWeatherBonusForTask(taskContent);
10650
10866
  return mergeScoreMaps(
10651
10867
  scoring.cascadeResult.scores,
@@ -10653,9 +10869,23 @@ function aggregateStageScores(scoring, taskContent) {
10653
10869
  scoring.knnResult.scores,
10654
10870
  scoring.distilledResult.scores,
10655
10871
  scoring.resourceResult.scores,
10656
- weatherScores
10872
+ weatherScores,
10873
+ getTuneAdjustmentScores(candidates)
10657
10874
  );
10658
10875
  }
10876
+ var TUNE_ENFORCE_ENV = "NEXUS_TUNE_ENFORCE";
10877
+ function getTuneAdjustmentScores(candidates) {
10878
+ const scores = /* @__PURE__ */ new Map();
10879
+ if (!parseBoolEnv(TUNE_ENFORCE_ENV, false)) return scores;
10880
+ const store = getTuneAdjustmentStore();
10881
+ for (const cli of candidates) {
10882
+ const multiplier = store.effectiveMultiplier(cli);
10883
+ if (multiplier < 1) {
10884
+ scores.set(cli, -(1 - multiplier) * 10);
10885
+ }
10886
+ }
10887
+ return scores;
10888
+ }
10659
10889
  function getWeatherBonusForTask(taskContent) {
10660
10890
  try {
10661
10891
  const match = detectTaskCategory(taskContent);
@@ -10733,7 +10963,7 @@ async function runPipeline(task, taskProfile, stagesExecuted, cliNames, deps) {
10733
10963
  const overrideResult = applyCategoryOverride(task, candidates, stagesExecuted);
10734
10964
  if (!overrideResult.ok) return overrideResult;
10735
10965
  candidates = overrideResult.value;
10736
- const stageScores = aggregateStageScores(scoring, task.content);
10966
+ const stageScores = aggregateStageScores(scoring, task.content, candidates);
10737
10967
  const topsisOpts = {
10738
10968
  performanceData: getPerformanceDataForCategory(task.content)
10739
10969
  };
@@ -10878,13 +11108,26 @@ function hasMinimumPreferenceData(deps) {
10878
11108
  }
10879
11109
  var QUALITY_HISTORY_LIMIT = 20;
10880
11110
  var MAX_LATENCY_MS = 3e4;
11111
+ var QUALITY_RATE_CACHE_TTL_MS = 15e3;
11112
+ var qualityRateCache = /* @__PURE__ */ new Map();
11113
+ function getCachedCliSuccessRate(cli) {
11114
+ const now = getTimeProvider().now();
11115
+ const cached = qualityRateCache.get(cli);
11116
+ if (cached !== void 0 && now - cached.computedAt < QUALITY_RATE_CACHE_TTL_MS) {
11117
+ return cached.rate;
11118
+ }
11119
+ const recent = getOutcomeStore().query({ cli, limit: QUALITY_HISTORY_LIMIT });
11120
+ if (recent.length === 0) return void 0;
11121
+ const rate = recent.filter((o) => o.success).length / recent.length;
11122
+ qualityRateCache.set(cli, { rate, computedAt: now });
11123
+ return rate;
11124
+ }
10881
11125
  function computeQualityReward(cli, success, durationMs2) {
10882
11126
  if (!success) return 0.1;
10883
11127
  let reward = 0.5;
10884
11128
  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;
11129
+ const rate = getCachedCliSuccessRate(cli);
11130
+ if (rate !== void 0) {
10888
11131
  reward += rate * 0.3;
10889
11132
  }
10890
11133
  } catch (error) {
@@ -11179,7 +11422,7 @@ var CompositeRouter = class _CompositeRouter {
11179
11422
  */
11180
11423
  async consultUnifiedContext(task) {
11181
11424
  try {
11182
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-TZGIETJO.js");
11425
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-6O6TREXH.js");
11183
11426
  const ctx = await getContextForTask({
11184
11427
  task: task.content,
11185
11428
  category: inferTaskCategory(task.content),
@@ -12328,6 +12571,7 @@ export {
12328
12571
  CircularBuffer,
12329
12572
  BoundedLRUCache,
12330
12573
  getTimeProvider,
12574
+ getTuneAdjustmentStore,
12331
12575
  withStep,
12332
12576
  sanitize,
12333
12577
  setGlobalLogLevel,
@@ -12452,6 +12696,13 @@ export {
12452
12696
  CompositeRouterConfigSchema,
12453
12697
  DEFAULT_COMPOSITE_CONFIG,
12454
12698
  CompositeRoutingError,
12699
+ parseBoolEnv,
12700
+ createGetTimeout,
12701
+ createGetRetryConfig,
12702
+ createGetRateLimitConfig,
12703
+ createGetCircuitBreakerConfig,
12704
+ createGetToolRateLimit,
12705
+ createGetEnvVarDocumentation,
12455
12706
  WeatherReportInputSchema,
12456
12707
  SECURITY_KEYWORDS,
12457
12708
  ARCHITECTURE_KEYWORDS,
@@ -12502,4 +12753,4 @@ export {
12502
12753
  ParseError,
12503
12754
  OrchestratorError
12504
12755
  };
12505
- //# sourceMappingURL=chunk-HKISF2E7.js.map
12756
+ //# sourceMappingURL=chunk-ECBH5INZ.js.map