nexus-agents 8.131.3 → 8.131.5

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 (136) hide show
  1. package/dist/{ast-rule-runner-3M77VFHJ.js → ast-rule-runner-OK5SP2SI.js} +3 -3
  2. package/dist/{child-mcp-config-NHSUFBNN.js → child-mcp-config-Y3IZNZDM.js} +2 -2
  3. package/dist/{chunk-JJU2GHK7.js → chunk-2L3IWNNW.js} +9 -9
  4. package/dist/{chunk-AAE7F4CB.js → chunk-2LLIATHO.js} +3 -3
  5. package/dist/{chunk-ERHQVKRC.js → chunk-2TZENGN3.js} +5 -5
  6. package/dist/{chunk-TRIA7Q2H.js → chunk-3EFUVKRE.js} +2 -2
  7. package/dist/{chunk-5XMXBSPY.js → chunk-6BGTOBJV.js} +12 -12
  8. package/dist/{chunk-HDDXP26H.js → chunk-6C4D4MOD.js} +3 -3
  9. package/dist/{chunk-QQH3KA5T.js → chunk-72DJDZNB.js} +2 -2
  10. package/dist/{chunk-ZXMZMMBV.js → chunk-7GFZNDCZ.js} +4 -4
  11. package/dist/{chunk-M7FO5W7A.js → chunk-ABYYNREH.js} +5 -5
  12. package/dist/{chunk-TN5SDJYU.js → chunk-AKO22BIS.js} +5 -5
  13. package/dist/{chunk-GZM746JQ.js → chunk-B3MCT453.js} +6 -6
  14. package/dist/{chunk-CYATMZW7.js → chunk-BBCR7MP5.js} +2 -2
  15. package/dist/{chunk-B2LLOTB2.js → chunk-BWCAK56M.js} +5 -5
  16. package/dist/{chunk-EQTKZHO6.js → chunk-CPLMJP53.js} +2 -2
  17. package/dist/{chunk-PS7ZNSC6.js → chunk-DN4X2ZDO.js} +2 -2
  18. package/dist/{chunk-VL65KGVM.js → chunk-EKMH7ECT.js} +7 -7
  19. package/dist/{chunk-3MWUYHEE.js → chunk-EKRCJEA5.js} +2 -2
  20. package/dist/{chunk-UQPHTTMO.js → chunk-HFKQXKP3.js} +3 -3
  21. package/dist/{chunk-Q4JD3ZZP.js → chunk-HK4JMKUH.js} +4 -4
  22. package/dist/{chunk-VVQXRBA7.js → chunk-LRD7TNMD.js} +116 -65
  23. package/dist/chunk-LRD7TNMD.js.map +1 -0
  24. package/dist/{chunk-G5F44YKP.js → chunk-MN5YUEEJ.js} +2 -2
  25. package/dist/{chunk-CGKENW3F.js → chunk-OCD5QFUN.js} +4 -4
  26. package/dist/{chunk-2MWL47YX.js → chunk-OGAFETBY.js} +2 -2
  27. package/dist/{chunk-YN6EO4QO.js → chunk-OONBTXWQ.js} +2 -2
  28. package/dist/{chunk-P7F52452.js → chunk-SFGBHVKV.js} +2 -2
  29. package/dist/{chunk-4FYLSRZJ.js → chunk-SLRTWAQY.js} +4 -4
  30. package/dist/{chunk-ERHP5N36.js → chunk-TYLCUUSS.js} +2 -2
  31. package/dist/{chunk-R4AH6LIE.js → chunk-UO22VHII.js} +2 -2
  32. package/dist/{chunk-FB4ZIOYS.js → chunk-UXG3TE3G.js} +11 -11
  33. package/dist/{chunk-RWWPMTJK.js → chunk-VZVTHZPY.js} +3 -3
  34. package/dist/{chunk-T4WUK562.js → chunk-XN4Y3ALJ.js} +2 -2
  35. package/dist/{chunk-UETCXCAS.js → chunk-XRHQVWJC.js} +57 -44
  36. package/dist/{chunk-UETCXCAS.js.map → chunk-XRHQVWJC.js.map} +1 -1
  37. package/dist/{chunk-4AP64XCN.js → chunk-YOL6VN3A.js} +2 -2
  38. package/dist/{chunk-HVVZSJEY.js → chunk-ZRQFTVOQ.js} +3 -3
  39. package/dist/{chunk-N3PSIMXT.js → chunk-ZTTJUML2.js} +2 -2
  40. package/dist/{cli-circuit-breaker-EP7H2ZTN.js → cli-circuit-breaker-P463NR3T.js} +3 -3
  41. package/dist/cli.js +119 -57
  42. package/dist/cli.js.map +1 -1
  43. package/dist/{composite-router-VJVHYM2O.js → composite-router-V4ZLX3XA.js} +2 -2
  44. package/dist/{consensus-vote-6ISHSQ73.js → consensus-vote-AO5355WA.js} +17 -17
  45. package/dist/{context-retriever-TG2SH7CT.js → context-retriever-ZSQKNX33.js} +8 -8
  46. package/dist/{doctor-deep-IYUHW6T2.js → doctor-deep-WLR7DTZ5.js} +3 -3
  47. package/dist/{doctor-gateway-report-XOX6GIEL.js → doctor-gateway-report-CXXHUZBY.js} +8 -8
  48. package/dist/{doctor-live-GCXBUEPY.js → doctor-live-M52L6M2X.js} +11 -11
  49. package/dist/{expert-bridge-REZ6NY76.js → expert-bridge-SJ6NYJYS.js} +4 -4
  50. package/dist/{factory-35OY5YJ7.js → factory-6D76CHVA.js} +10 -10
  51. package/dist/{factory-7ETXZOGV.js → factory-U2CSSHJM.js} +5 -5
  52. package/dist/{improvement-review-S65JP2NY.js → improvement-review-XRUFNUJ5.js} +6 -6
  53. package/dist/index.d.ts +3 -7
  54. package/dist/index.js +32 -32
  55. package/dist/{init-opencode-SJZINN4S.js → init-opencode-NJAG467M.js} +6 -6
  56. package/dist/{issue-triage-SZRBPDAR.js → issue-triage-EK4IJ47O.js} +6 -6
  57. package/dist/{openai-compat-adapter-UW2Z4HF7.js → openai-compat-adapter-YNSNL2BR.js} +6 -6
  58. package/dist/{outcome-store-adapter-DZRQ77YG.js → outcome-store-adapter-BJVVKO2N.js} +2 -2
  59. package/dist/{pr-reviewer-helpers-5CGBGREQ.js → pr-reviewer-helpers-XO5GFVHN.js} +4 -4
  60. package/dist/{registry-command-NI3LIWQA.js → registry-command-RLUQMC4O.js} +2 -2
  61. package/dist/registry-command-RLUQMC4O.js.map +1 -0
  62. package/dist/{repo-security-plan-SKVL27H3.js → repo-security-plan-2CJOCQFD.js} +3 -3
  63. package/dist/{research-helpers-synthesize-UADXNMID.js → research-helpers-synthesize-B2ZNHO23.js} +4 -4
  64. package/dist/{routing-memory-B5HYTZC7.js → routing-memory-7ZB2WATF.js} +2 -2
  65. package/dist/{session-memory-SWTWLYGY.js → session-memory-OL5G7ODY.js} +3 -3
  66. package/dist/{setup-config-37EXEYOM.js → setup-config-HMJTMNKL.js} +3 -3
  67. package/dist/{setup-custom-api-CVI7NLPW.js → setup-custom-api-23RWZLDV.js} +4 -4
  68. package/dist/setup-data-dir-K76VIPTJ.js +33 -0
  69. package/dist/{tool-memory-AJIAJ2CN.js → tool-memory-ZKUDRRLA.js} +5 -5
  70. package/dist/{unified-registry-JHQ7UIS4.js → unified-registry-VQGN3IEU.js} +11 -11
  71. package/dist/{weather-report-KJ4X3HVU.js → weather-report-TV75JPE3.js} +2 -2
  72. package/package.json +1 -1
  73. package/dist/chunk-VVQXRBA7.js.map +0 -1
  74. package/dist/registry-command-NI3LIWQA.js.map +0 -1
  75. package/dist/setup-data-dir-EVVWRHY2.js +0 -33
  76. /package/dist/{ast-rule-runner-3M77VFHJ.js.map → ast-rule-runner-OK5SP2SI.js.map} +0 -0
  77. /package/dist/{child-mcp-config-NHSUFBNN.js.map → child-mcp-config-Y3IZNZDM.js.map} +0 -0
  78. /package/dist/{chunk-JJU2GHK7.js.map → chunk-2L3IWNNW.js.map} +0 -0
  79. /package/dist/{chunk-AAE7F4CB.js.map → chunk-2LLIATHO.js.map} +0 -0
  80. /package/dist/{chunk-ERHQVKRC.js.map → chunk-2TZENGN3.js.map} +0 -0
  81. /package/dist/{chunk-TRIA7Q2H.js.map → chunk-3EFUVKRE.js.map} +0 -0
  82. /package/dist/{chunk-5XMXBSPY.js.map → chunk-6BGTOBJV.js.map} +0 -0
  83. /package/dist/{chunk-HDDXP26H.js.map → chunk-6C4D4MOD.js.map} +0 -0
  84. /package/dist/{chunk-QQH3KA5T.js.map → chunk-72DJDZNB.js.map} +0 -0
  85. /package/dist/{chunk-ZXMZMMBV.js.map → chunk-7GFZNDCZ.js.map} +0 -0
  86. /package/dist/{chunk-M7FO5W7A.js.map → chunk-ABYYNREH.js.map} +0 -0
  87. /package/dist/{chunk-TN5SDJYU.js.map → chunk-AKO22BIS.js.map} +0 -0
  88. /package/dist/{chunk-GZM746JQ.js.map → chunk-B3MCT453.js.map} +0 -0
  89. /package/dist/{chunk-CYATMZW7.js.map → chunk-BBCR7MP5.js.map} +0 -0
  90. /package/dist/{chunk-B2LLOTB2.js.map → chunk-BWCAK56M.js.map} +0 -0
  91. /package/dist/{chunk-EQTKZHO6.js.map → chunk-CPLMJP53.js.map} +0 -0
  92. /package/dist/{chunk-PS7ZNSC6.js.map → chunk-DN4X2ZDO.js.map} +0 -0
  93. /package/dist/{chunk-VL65KGVM.js.map → chunk-EKMH7ECT.js.map} +0 -0
  94. /package/dist/{chunk-3MWUYHEE.js.map → chunk-EKRCJEA5.js.map} +0 -0
  95. /package/dist/{chunk-UQPHTTMO.js.map → chunk-HFKQXKP3.js.map} +0 -0
  96. /package/dist/{chunk-Q4JD3ZZP.js.map → chunk-HK4JMKUH.js.map} +0 -0
  97. /package/dist/{chunk-G5F44YKP.js.map → chunk-MN5YUEEJ.js.map} +0 -0
  98. /package/dist/{chunk-CGKENW3F.js.map → chunk-OCD5QFUN.js.map} +0 -0
  99. /package/dist/{chunk-2MWL47YX.js.map → chunk-OGAFETBY.js.map} +0 -0
  100. /package/dist/{chunk-YN6EO4QO.js.map → chunk-OONBTXWQ.js.map} +0 -0
  101. /package/dist/{chunk-P7F52452.js.map → chunk-SFGBHVKV.js.map} +0 -0
  102. /package/dist/{chunk-4FYLSRZJ.js.map → chunk-SLRTWAQY.js.map} +0 -0
  103. /package/dist/{chunk-ERHP5N36.js.map → chunk-TYLCUUSS.js.map} +0 -0
  104. /package/dist/{chunk-R4AH6LIE.js.map → chunk-UO22VHII.js.map} +0 -0
  105. /package/dist/{chunk-FB4ZIOYS.js.map → chunk-UXG3TE3G.js.map} +0 -0
  106. /package/dist/{chunk-RWWPMTJK.js.map → chunk-VZVTHZPY.js.map} +0 -0
  107. /package/dist/{chunk-T4WUK562.js.map → chunk-XN4Y3ALJ.js.map} +0 -0
  108. /package/dist/{chunk-4AP64XCN.js.map → chunk-YOL6VN3A.js.map} +0 -0
  109. /package/dist/{chunk-HVVZSJEY.js.map → chunk-ZRQFTVOQ.js.map} +0 -0
  110. /package/dist/{chunk-N3PSIMXT.js.map → chunk-ZTTJUML2.js.map} +0 -0
  111. /package/dist/{cli-circuit-breaker-EP7H2ZTN.js.map → cli-circuit-breaker-P463NR3T.js.map} +0 -0
  112. /package/dist/{composite-router-VJVHYM2O.js.map → composite-router-V4ZLX3XA.js.map} +0 -0
  113. /package/dist/{consensus-vote-6ISHSQ73.js.map → consensus-vote-AO5355WA.js.map} +0 -0
  114. /package/dist/{context-retriever-TG2SH7CT.js.map → context-retriever-ZSQKNX33.js.map} +0 -0
  115. /package/dist/{doctor-deep-IYUHW6T2.js.map → doctor-deep-WLR7DTZ5.js.map} +0 -0
  116. /package/dist/{doctor-gateway-report-XOX6GIEL.js.map → doctor-gateway-report-CXXHUZBY.js.map} +0 -0
  117. /package/dist/{doctor-live-GCXBUEPY.js.map → doctor-live-M52L6M2X.js.map} +0 -0
  118. /package/dist/{expert-bridge-REZ6NY76.js.map → expert-bridge-SJ6NYJYS.js.map} +0 -0
  119. /package/dist/{factory-35OY5YJ7.js.map → factory-6D76CHVA.js.map} +0 -0
  120. /package/dist/{factory-7ETXZOGV.js.map → factory-U2CSSHJM.js.map} +0 -0
  121. /package/dist/{improvement-review-S65JP2NY.js.map → improvement-review-XRUFNUJ5.js.map} +0 -0
  122. /package/dist/{init-opencode-SJZINN4S.js.map → init-opencode-NJAG467M.js.map} +0 -0
  123. /package/dist/{issue-triage-SZRBPDAR.js.map → issue-triage-EK4IJ47O.js.map} +0 -0
  124. /package/dist/{openai-compat-adapter-UW2Z4HF7.js.map → openai-compat-adapter-YNSNL2BR.js.map} +0 -0
  125. /package/dist/{outcome-store-adapter-DZRQ77YG.js.map → outcome-store-adapter-BJVVKO2N.js.map} +0 -0
  126. /package/dist/{pr-reviewer-helpers-5CGBGREQ.js.map → pr-reviewer-helpers-XO5GFVHN.js.map} +0 -0
  127. /package/dist/{repo-security-plan-SKVL27H3.js.map → repo-security-plan-2CJOCQFD.js.map} +0 -0
  128. /package/dist/{research-helpers-synthesize-UADXNMID.js.map → research-helpers-synthesize-B2ZNHO23.js.map} +0 -0
  129. /package/dist/{routing-memory-B5HYTZC7.js.map → routing-memory-7ZB2WATF.js.map} +0 -0
  130. /package/dist/{session-memory-SWTWLYGY.js.map → session-memory-OL5G7ODY.js.map} +0 -0
  131. /package/dist/{setup-config-37EXEYOM.js.map → setup-config-HMJTMNKL.js.map} +0 -0
  132. /package/dist/{setup-custom-api-CVI7NLPW.js.map → setup-custom-api-23RWZLDV.js.map} +0 -0
  133. /package/dist/{setup-data-dir-EVVWRHY2.js.map → setup-data-dir-K76VIPTJ.js.map} +0 -0
  134. /package/dist/{tool-memory-AJIAJ2CN.js.map → tool-memory-ZKUDRRLA.js.map} +0 -0
  135. /package/dist/{unified-registry-JHQ7UIS4.js.map → unified-registry-VQGN3IEU.js.map} +0 -0
  136. /package/dist/{weather-report-KJ4X3HVU.js.map → weather-report-TV75JPE3.js.map} +0 -0
@@ -2365,7 +2365,12 @@ function loadManifestFile(path, logger16) {
2365
2365
  if (!exists) {
2366
2366
  return { entries: [], rejections: [], path, status: "missing" };
2367
2367
  }
2368
- const stat = statSync(path);
2368
+ let stat;
2369
+ try {
2370
+ stat = statSync(path);
2371
+ } catch (e) {
2372
+ return unreadableOrMissing(path, e, logger16);
2373
+ }
2369
2374
  if (stat.size === 0) {
2370
2375
  return { entries: [], rejections: [], path, status: "empty" };
2371
2376
  }
@@ -2377,9 +2382,23 @@ function loadManifestFile(path, logger16) {
2377
2382
  });
2378
2383
  return { entries: [], rejections: [], path, status: "too-large" };
2379
2384
  }
2380
- const raw = readFileSync(path, "utf-8");
2385
+ let raw;
2386
+ try {
2387
+ raw = readFileSync(path, "utf-8");
2388
+ } catch (e) {
2389
+ return unreadableOrMissing(path, e, logger16);
2390
+ }
2381
2391
  return parseManifest(raw, path, logger16);
2382
2392
  }
2393
+ function unreadableOrMissing(path, e, logger16) {
2394
+ const code = e instanceof Error && "code" in e ? e.code : void 0;
2395
+ if (code === "ENOENT") return { entries: [], rejections: [], path, status: "missing" };
2396
+ logger16.warn("Manifest overlay unreadable; skipping", {
2397
+ path,
2398
+ error: e instanceof Error ? e.message : String(e)
2399
+ });
2400
+ return { entries: [], rejections: [], path, status: "unreadable" };
2401
+ }
2383
2402
  function parseManifest(raw, path, logger16) {
2384
2403
  let parsed;
2385
2404
  try {
@@ -2819,7 +2838,7 @@ function setDefaultRegistry(registry) {
2819
2838
  }
2820
2839
  async function reloadDefaultRegistry() {
2821
2840
  globalRegistry = buildDefaultRegistry();
2822
- const { resetGlobalRegistry } = await import("./unified-registry-JHQ7UIS4.js");
2841
+ const { resetGlobalRegistry } = await import("./unified-registry-VQGN3IEU.js");
2823
2842
  resetGlobalRegistry();
2824
2843
  return globalRegistry;
2825
2844
  }
@@ -13248,7 +13267,7 @@ function getOutcomeStore() {
13248
13267
  async function attachOutcomeStoreToRegistry(store) {
13249
13268
  try {
13250
13269
  const { getMemoryRegistry } = await import("./dist-RRRU2OKU.js");
13251
- const { OutcomeStoreAdapter } = await import("./outcome-store-adapter-DZRQ77YG.js");
13270
+ const { OutcomeStoreAdapter } = await import("./outcome-store-adapter-BJVVKO2N.js");
13252
13271
  const { ensureSharedMemoryRegistry } = await import("./tool-memory-registry-adapters-FO6JVQSX.js");
13253
13272
  ensureSharedMemoryRegistry();
13254
13273
  getMemoryRegistry().attach("outcomes", new OutcomeStoreAdapter(store));
@@ -13482,18 +13501,8 @@ function generateSyntheticPriors() {
13482
13501
  }
13483
13502
  return priors;
13484
13503
  }
13485
- function runWarmUp(logger16) {
13486
- const log = logger16 ?? createLogger({ component: "warm-up" });
13487
- const store = getOutcomeStore();
13488
- const existing = store.query();
13489
- const hasSynthetic = existing.some((o) => o.qualitySignals?.includes(SYNTHETIC_MARKER) === true);
13490
- if (hasSynthetic) {
13491
- log.info("Warm-up skipped: synthetic outcomes already exist");
13492
- return { seeded: 0, skipped: true, reason: "synthetic outcomes already exist" };
13493
- }
13494
- const priors = generateSyntheticPriors();
13495
- const now = (/* @__PURE__ */ new Date()).toISOString();
13496
- let seeded = 0;
13504
+ function buildSyntheticOutcomes(timestamp) {
13505
+ const outcomes = [];
13497
13506
  for (const spec of TASK_SPECIALIZATION_MATRIX) {
13498
13507
  for (const cli of CLI_NAMES2) {
13499
13508
  let reward;
@@ -13504,21 +13513,34 @@ function runWarmUp(logger16) {
13504
13513
  } else {
13505
13514
  reward = OTHER_REWARD;
13506
13515
  }
13507
- const outcome = {
13516
+ outcomes.push({
13508
13517
  id: `synthetic-${cli}-${spec.category}`,
13509
13518
  cli,
13510
13519
  category: spec.category,
13511
13520
  model: `${cli}-default`,
13512
13521
  success: reward >= 0.5,
13513
13522
  durationMs: 0,
13514
- timestamp: now,
13523
+ timestamp,
13515
13524
  qualitySignals: [SYNTHETIC_MARKER],
13516
13525
  source: "manual"
13517
- };
13518
- store.append(outcome);
13519
- seeded++;
13526
+ });
13520
13527
  }
13521
13528
  }
13529
+ return outcomes;
13530
+ }
13531
+ function runWarmUp(logger16) {
13532
+ const log = logger16 ?? createLogger({ component: "warm-up" });
13533
+ const store = getOutcomeStore();
13534
+ const existing = store.query();
13535
+ const hasSynthetic = existing.some((o) => o.qualitySignals?.includes(SYNTHETIC_MARKER) === true);
13536
+ if (hasSynthetic) {
13537
+ log.info("Warm-up skipped: synthetic outcomes already exist");
13538
+ return { seeded: 0, skipped: true, reason: "synthetic outcomes already exist" };
13539
+ }
13540
+ const priors = generateSyntheticPriors();
13541
+ const outcomes = buildSyntheticOutcomes((/* @__PURE__ */ new Date()).toISOString());
13542
+ for (const outcome of outcomes) store.append(outcome);
13543
+ const seeded = outcomes.length;
13522
13544
  log.info("LinUCB warm-up complete", {
13523
13545
  seeded,
13524
13546
  priors: Object.fromEntries(priors)
@@ -13526,6 +13548,75 @@ function runWarmUp(logger16) {
13526
13548
  return { seeded, skipped: false };
13527
13549
  }
13528
13550
 
13551
+ // src/cli-adapters/bandit-warm-start.ts
13552
+ var LOOKBACK_DAYS = 30;
13553
+ var LOOKBACK_MS = LOOKBACK_DAYS * 24 * 60 * 60 * 1e3;
13554
+ function warmStartBandit(bandit, logger16, options = {}) {
13555
+ const reconstructedAt = getTimeProvider().nowIso();
13556
+ let replayed = 0;
13557
+ let empiricalOutcomesReplayed = 0;
13558
+ let fallbackUsed = false;
13559
+ let fallbackOutcomesReplayed = 0;
13560
+ let status = "complete";
13561
+ try {
13562
+ if (isPersistenceEnabled()) {
13563
+ const since = new Date(getTimeProvider().now() - LOOKBACK_MS).toISOString();
13564
+ const outcomes = getOutcomeStore().query({ since, excludeQualitySignals: ["e2e-eval"] });
13565
+ if (outcomes.length > 0) {
13566
+ replayed = bandit.warmStart(outcomes);
13567
+ empiricalOutcomesReplayed = countEmpiricalOutcomes(outcomes, bandit.getArmNames());
13568
+ logger16.info("LinUCB warm-started from recent outcomes", {
13569
+ outcomesAvailable: outcomes.length,
13570
+ outcomesReplayed: replayed,
13571
+ lookbackDays: 30
13572
+ });
13573
+ }
13574
+ }
13575
+ bandit.seedPriors(generateSyntheticPriors(), replayed === 0 ? 3 : 1);
13576
+ if (replayed === 0) {
13577
+ fallbackUsed = true;
13578
+ const fallback = options.persist === false ? memoryFallback() : persistedFallback(logger16);
13579
+ if (fallback.outcomes !== void 0) {
13580
+ fallbackOutcomesReplayed = bandit.warmStart(fallback.outcomes);
13581
+ }
13582
+ logger16.info("LinUCB cold-start seeded from specialization matrix", {
13583
+ syntheticOutcomes: fallback.seeded
13584
+ });
13585
+ }
13586
+ } catch (error) {
13587
+ status = "failed";
13588
+ logger16.warn("LinUCB warm-start failed, starting cold", { error: getErrorMessage(error) });
13589
+ }
13590
+ return {
13591
+ reconstructedAt,
13592
+ outcomesReplayed: replayed,
13593
+ empiricalOutcomesReplayed,
13594
+ lookbackDays: LOOKBACK_DAYS,
13595
+ fallbackUsed,
13596
+ fallbackOutcomesReplayed,
13597
+ status
13598
+ };
13599
+ }
13600
+ function persistedFallback(logger16) {
13601
+ const result = runWarmUp(logger16);
13602
+ if (result.skipped) return { outcomes: void 0, seeded: result.seeded };
13603
+ const outcomes = getOutcomeStore().query({ excludeQualitySignals: ["e2e-eval"] });
13604
+ return { outcomes, seeded: result.seeded };
13605
+ }
13606
+ function memoryFallback() {
13607
+ const store = getOutcomeStore();
13608
+ const hasSynthetic = store.query().some((o) => o.qualitySignals?.includes(SYNTHETIC_MARKER) === true);
13609
+ if (hasSynthetic) return { outcomes: void 0, seeded: 0 };
13610
+ const synthetic = buildSyntheticOutcomes((/* @__PURE__ */ new Date()).toISOString());
13611
+ const stored = store.query({ excludeQualitySignals: ["e2e-eval"] });
13612
+ return { outcomes: [...stored, ...synthetic], seeded: synthetic.length };
13613
+ }
13614
+ function countEmpiricalOutcomes(outcomes, arms) {
13615
+ return outcomes.filter(
13616
+ (outcome) => arms.includes(outcome.cli) && outcome.qualitySignals?.includes(SYNTHETIC_MARKER) !== true
13617
+ ).length;
13618
+ }
13619
+
13529
13620
  // src/cli-adapters/composite-router-budget-feature.ts
13530
13621
  function toBudgetConstraint(raw) {
13531
13622
  const constraint = {};
@@ -19875,7 +19966,7 @@ var CompositeRouter = class _CompositeRouter {
19875
19966
  if (this.config.enableTopsisRanking) this.topsisRouter = new TopsisRouter(topsisConfig);
19876
19967
  if (this.config.enableLinUCBSelection && this.cliNames.length > 0) {
19877
19968
  this.linucbBandit = new LinUCBBandit(this.cliNames, { alpha: this.config.linucbAlpha });
19878
- this.warmStartBandit();
19969
+ warmStartBandit(this.linucbBandit, this.logger);
19879
19970
  }
19880
19971
  if (this.config.enableLatencyTracking) this.latencyTracker = new LatencyTracker(latencyConfig);
19881
19972
  }
@@ -19938,47 +20029,6 @@ var CompositeRouter = class _CompositeRouter {
19938
20029
  decisionPath: decision.stagesExecuted
19939
20030
  });
19940
20031
  }
19941
- /** Warm-start LinUCB bandit from persisted outcomes (Issue #1015).
19942
- * Uses a 30-day lookback window so stale outcomes don't override
19943
- * routing changes like primaryCli specialization (#1667). */
19944
- warmStartBandit() {
19945
- if (this.linucbBandit === void 0) return;
19946
- try {
19947
- let replayed = 0;
19948
- if (isPersistenceEnabled()) {
19949
- const WARM_START_LOOKBACK_MS = 30 * 24 * 60 * 60 * 1e3;
19950
- const since = new Date(getTimeProvider().now() - WARM_START_LOOKBACK_MS).toISOString();
19951
- const outcomes = getOutcomeStore().query({
19952
- since,
19953
- excludeQualitySignals: ["e2e-eval"]
19954
- });
19955
- if (outcomes.length > 0) {
19956
- replayed = this.linucbBandit.warmStart(outcomes);
19957
- this.logger.info("LinUCB warm-started from recent outcomes", {
19958
- outcomesAvailable: outcomes.length,
19959
- outcomesReplayed: replayed,
19960
- lookbackDays: 30
19961
- });
19962
- }
19963
- }
19964
- const priors = generateSyntheticPriors();
19965
- this.linucbBandit.seedPriors(priors, replayed === 0 ? 3 : 1);
19966
- if (replayed === 0) {
19967
- const result = runWarmUp(this.logger);
19968
- if (!result.skipped) {
19969
- const outcomes = getOutcomeStore().query({ excludeQualitySignals: ["e2e-eval"] });
19970
- this.linucbBandit.warmStart(outcomes);
19971
- }
19972
- this.logger.info("LinUCB cold-start seeded from specialization matrix", {
19973
- syntheticOutcomes: result.seeded
19974
- });
19975
- }
19976
- } catch (error) {
19977
- this.logger.warn("LinUCB warm-start failed, starting cold", {
19978
- error: getErrorMessage(error)
19979
- });
19980
- }
19981
- }
19982
20032
  logInitialization(adapterCount) {
19983
20033
  this.logger.info("CompositeRouter initialized", {
19984
20034
  adapterCount,
@@ -20010,7 +20060,7 @@ var CompositeRouter = class _CompositeRouter {
20010
20060
  */
20011
20061
  async consultUnifiedContext(task) {
20012
20062
  try {
20013
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-TG2SH7CT.js");
20063
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-ZSQKNX33.js");
20014
20064
  const ctx = await getContextForTask({
20015
20065
  task: task.content,
20016
20066
  category: inferTaskCategory(task.content),
@@ -21695,6 +21745,7 @@ export {
21695
21745
  EventBus,
21696
21746
  getPipelineEventBus,
21697
21747
  runWarmUp,
21748
+ warmStartBandit,
21698
21749
  taskProfileToBanditContext,
21699
21750
  WeatherReportInputSchema,
21700
21751
  SECURITY_KEYWORDS,
@@ -21763,4 +21814,4 @@ export {
21763
21814
  AgentCapability,
21764
21815
  OrchestratorError
21765
21816
  };
21766
- //# sourceMappingURL=chunk-VVQXRBA7.js.map
21817
+ //# sourceMappingURL=chunk-LRD7TNMD.js.map