nexus-agents 2.102.7 → 2.103.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 (118) hide show
  1. package/dist/{child-mcp-config-NBELOYYZ.js → child-mcp-config-IPPKT47T.js} +2 -2
  2. package/dist/{chunk-FRAMV5DJ.js → chunk-3TOHOAB2.js} +360 -212
  3. package/dist/chunk-3TOHOAB2.js.map +1 -0
  4. package/dist/{chunk-SBYFWB6J.js → chunk-3VSLKTD6.js} +4 -4
  5. package/dist/{chunk-QYE6GEPY.js → chunk-4FIY62UC.js} +3 -3
  6. package/dist/{chunk-FLUC27DF.js → chunk-6XWIR6JJ.js} +2 -2
  7. package/dist/{chunk-VJR46M7L.js → chunk-ANHBUWOI.js} +3 -3
  8. package/dist/{chunk-FVWKAEYH.js → chunk-AO2SCUPO.js} +2 -2
  9. package/dist/{chunk-FZCB2P3F.js → chunk-BUZ62ZOK.js} +2 -2
  10. package/dist/{chunk-4RW6OONY.js → chunk-CNQZ6BJE.js} +2 -2
  11. package/dist/{chunk-PWDIIS7L.js → chunk-F6X6UH6D.js} +7 -7
  12. package/dist/{chunk-SXWJ7IUF.js → chunk-FESEHMBN.js} +21 -2
  13. package/dist/{chunk-SXWJ7IUF.js.map → chunk-FESEHMBN.js.map} +1 -1
  14. package/dist/{chunk-6CIEBFDV.js → chunk-FPY53SSC.js} +7 -7
  15. package/dist/{chunk-LXBWH5XP.js → chunk-FSXN5GGJ.js} +3 -3
  16. package/dist/{chunk-E47LOV6Y.js → chunk-H6QEJT56.js} +2 -2
  17. package/dist/{chunk-4L7FH53H.js → chunk-IEFH53RH.js} +2 -2
  18. package/dist/{chunk-3GF52QPA.js → chunk-K4H5LCSU.js} +77 -30
  19. package/dist/chunk-K4H5LCSU.js.map +1 -0
  20. package/dist/{chunk-LVGYWJDX.js → chunk-M6QD4H7S.js} +2 -2
  21. package/dist/{chunk-GDY23NDK.js → chunk-NO66DOR2.js} +2 -2
  22. package/dist/{chunk-NAKDVIXS.js → chunk-Q5DDXJWJ.js} +3 -3
  23. package/dist/{chunk-KLYBJUTK.js → chunk-Q732LOXE.js} +325 -64
  24. package/dist/{chunk-KLYBJUTK.js.map → chunk-Q732LOXE.js.map} +1 -1
  25. package/dist/{chunk-ECZLYZCI.js → chunk-QA5IABQ4.js} +5 -5
  26. package/dist/{chunk-MNFEZIRI.js → chunk-QSTVUC2C.js} +2 -2
  27. package/dist/{chunk-ABGRFLJ6.js → chunk-RJ2FCK5T.js} +4 -4
  28. package/dist/{chunk-TDXLS2TY.js → chunk-S5LL7Y77.js} +4 -4
  29. package/dist/{chunk-Z7IQUUTZ.js → chunk-STLETCQJ.js} +2 -2
  30. package/dist/{chunk-MNWYIYEZ.js → chunk-TJVGB4OE.js} +2 -2
  31. package/dist/{chunk-W65C5VVJ.js → chunk-TNX3SEBY.js} +2 -2
  32. package/dist/{chunk-EKO6XAAZ.js → chunk-TQLSHKPJ.js} +3 -3
  33. package/dist/{chunk-T32MGJMA.js → chunk-TY2M7UQD.js} +10 -12
  34. package/dist/{chunk-T32MGJMA.js.map → chunk-TY2M7UQD.js.map} +1 -1
  35. package/dist/{chunk-3QFQG5QT.js → chunk-VOGIG42V.js} +2 -2
  36. package/dist/{chunk-5PZIMHNA.js → chunk-VU252OUC.js} +3 -3
  37. package/dist/{chunk-S7R72HUB.js → chunk-YMBG7LCM.js} +2 -2
  38. package/dist/{cli-circuit-breaker-L647V6BR.js → cli-circuit-breaker-KSNJ2KWP.js} +4 -4
  39. package/dist/cli.js +40 -39
  40. package/dist/cli.js.map +1 -1
  41. package/dist/{composite-router-NOTUOXFI.js → composite-router-5BO2RU4R.js} +2 -2
  42. package/dist/{consensus-vote-7CE4JOMK.js → consensus-vote-4W2MOXL2.js} +12 -13
  43. package/dist/{context-retriever-SHT7J6BT.js → context-retriever-EFEWHU3Z.js} +6 -6
  44. package/dist/{doctor-deep-REMLGFXP.js → doctor-deep-AWSHPMB3.js} +3 -3
  45. package/dist/{expert-bridge-2TYPRNEE.js → expert-bridge-P4NWKKOI.js} +4 -4
  46. package/dist/{factory-PPAK3TVG.js → factory-BSWATZK3.js} +5 -5
  47. package/dist/{factory-CYUNYEMU.js → factory-OHAMFHSF.js} +5 -5
  48. package/dist/{improvement-review-YFQ5T7I3.js → improvement-review-5ZWAZUB6.js} +4 -4
  49. package/dist/index.d.ts +15 -4
  50. package/dist/index.js +30 -32
  51. package/dist/index.js.map +1 -1
  52. package/dist/{init-opencode-WXY4DUFU.js → init-opencode-7O6XN2QB.js} +5 -5
  53. package/dist/{issue-triage-4YJQU3HW.js → issue-triage-MBNGFPVS.js} +5 -5
  54. package/dist/{pr-reviewer-helpers-2YJG6XJM.js → pr-reviewer-helpers-L5KOZXJO.js} +4 -4
  55. package/dist/{registry-command-ZFOGLBKF.js → registry-command-F565N7EI.js} +2 -2
  56. package/dist/{repo-security-plan-L47DDTAU.js → repo-security-plan-JRL6NQKO.js} +3 -3
  57. package/dist/{research-helpers-synthesize-IABO7LB4.js → research-helpers-synthesize-KJ7H75QA.js} +3 -3
  58. package/dist/{routing-memory-2YWEWRMQ.js → routing-memory-YECWDSDV.js} +2 -2
  59. package/dist/{session-memory-YWOMPCLZ.js → session-memory-AG4IM3JY.js} +3 -3
  60. package/dist/{setup-command-G3Q3UKI5.js → setup-command-WAUXPMOU.js} +10 -11
  61. package/dist/{setup-config-PYFK2GIC.js → setup-config-2GDDU5CV.js} +3 -3
  62. package/dist/{setup-custom-api-A4IZQ2Q4.js → setup-custom-api-6N2BTUGY.js} +4 -4
  63. package/dist/{tool-memory-ABPSCFIH.js → tool-memory-3ZWQVJX3.js} +5 -5
  64. package/dist/{weather-report-GXD6KGDS.js → weather-report-WAOVQRGI.js} +2 -2
  65. package/package.json +1 -1
  66. package/dist/chunk-3GF52QPA.js.map +0 -1
  67. package/dist/chunk-FRAMV5DJ.js.map +0 -1
  68. package/dist/chunk-L2NPJRZZ.js +0 -153
  69. package/dist/chunk-L2NPJRZZ.js.map +0 -1
  70. /package/dist/{child-mcp-config-NBELOYYZ.js.map → child-mcp-config-IPPKT47T.js.map} +0 -0
  71. /package/dist/{chunk-SBYFWB6J.js.map → chunk-3VSLKTD6.js.map} +0 -0
  72. /package/dist/{chunk-QYE6GEPY.js.map → chunk-4FIY62UC.js.map} +0 -0
  73. /package/dist/{chunk-FLUC27DF.js.map → chunk-6XWIR6JJ.js.map} +0 -0
  74. /package/dist/{chunk-VJR46M7L.js.map → chunk-ANHBUWOI.js.map} +0 -0
  75. /package/dist/{chunk-FVWKAEYH.js.map → chunk-AO2SCUPO.js.map} +0 -0
  76. /package/dist/{chunk-FZCB2P3F.js.map → chunk-BUZ62ZOK.js.map} +0 -0
  77. /package/dist/{chunk-4RW6OONY.js.map → chunk-CNQZ6BJE.js.map} +0 -0
  78. /package/dist/{chunk-PWDIIS7L.js.map → chunk-F6X6UH6D.js.map} +0 -0
  79. /package/dist/{chunk-6CIEBFDV.js.map → chunk-FPY53SSC.js.map} +0 -0
  80. /package/dist/{chunk-LXBWH5XP.js.map → chunk-FSXN5GGJ.js.map} +0 -0
  81. /package/dist/{chunk-E47LOV6Y.js.map → chunk-H6QEJT56.js.map} +0 -0
  82. /package/dist/{chunk-4L7FH53H.js.map → chunk-IEFH53RH.js.map} +0 -0
  83. /package/dist/{chunk-LVGYWJDX.js.map → chunk-M6QD4H7S.js.map} +0 -0
  84. /package/dist/{chunk-GDY23NDK.js.map → chunk-NO66DOR2.js.map} +0 -0
  85. /package/dist/{chunk-NAKDVIXS.js.map → chunk-Q5DDXJWJ.js.map} +0 -0
  86. /package/dist/{chunk-ECZLYZCI.js.map → chunk-QA5IABQ4.js.map} +0 -0
  87. /package/dist/{chunk-MNFEZIRI.js.map → chunk-QSTVUC2C.js.map} +0 -0
  88. /package/dist/{chunk-ABGRFLJ6.js.map → chunk-RJ2FCK5T.js.map} +0 -0
  89. /package/dist/{chunk-TDXLS2TY.js.map → chunk-S5LL7Y77.js.map} +0 -0
  90. /package/dist/{chunk-Z7IQUUTZ.js.map → chunk-STLETCQJ.js.map} +0 -0
  91. /package/dist/{chunk-MNWYIYEZ.js.map → chunk-TJVGB4OE.js.map} +0 -0
  92. /package/dist/{chunk-W65C5VVJ.js.map → chunk-TNX3SEBY.js.map} +0 -0
  93. /package/dist/{chunk-EKO6XAAZ.js.map → chunk-TQLSHKPJ.js.map} +0 -0
  94. /package/dist/{chunk-3QFQG5QT.js.map → chunk-VOGIG42V.js.map} +0 -0
  95. /package/dist/{chunk-5PZIMHNA.js.map → chunk-VU252OUC.js.map} +0 -0
  96. /package/dist/{chunk-S7R72HUB.js.map → chunk-YMBG7LCM.js.map} +0 -0
  97. /package/dist/{cli-circuit-breaker-L647V6BR.js.map → cli-circuit-breaker-KSNJ2KWP.js.map} +0 -0
  98. /package/dist/{composite-router-NOTUOXFI.js.map → composite-router-5BO2RU4R.js.map} +0 -0
  99. /package/dist/{consensus-vote-7CE4JOMK.js.map → consensus-vote-4W2MOXL2.js.map} +0 -0
  100. /package/dist/{context-retriever-SHT7J6BT.js.map → context-retriever-EFEWHU3Z.js.map} +0 -0
  101. /package/dist/{doctor-deep-REMLGFXP.js.map → doctor-deep-AWSHPMB3.js.map} +0 -0
  102. /package/dist/{expert-bridge-2TYPRNEE.js.map → expert-bridge-P4NWKKOI.js.map} +0 -0
  103. /package/dist/{factory-CYUNYEMU.js.map → factory-BSWATZK3.js.map} +0 -0
  104. /package/dist/{factory-PPAK3TVG.js.map → factory-OHAMFHSF.js.map} +0 -0
  105. /package/dist/{improvement-review-YFQ5T7I3.js.map → improvement-review-5ZWAZUB6.js.map} +0 -0
  106. /package/dist/{init-opencode-WXY4DUFU.js.map → init-opencode-7O6XN2QB.js.map} +0 -0
  107. /package/dist/{issue-triage-4YJQU3HW.js.map → issue-triage-MBNGFPVS.js.map} +0 -0
  108. /package/dist/{pr-reviewer-helpers-2YJG6XJM.js.map → pr-reviewer-helpers-L5KOZXJO.js.map} +0 -0
  109. /package/dist/{registry-command-ZFOGLBKF.js.map → registry-command-F565N7EI.js.map} +0 -0
  110. /package/dist/{repo-security-plan-L47DDTAU.js.map → repo-security-plan-JRL6NQKO.js.map} +0 -0
  111. /package/dist/{research-helpers-synthesize-IABO7LB4.js.map → research-helpers-synthesize-KJ7H75QA.js.map} +0 -0
  112. /package/dist/{routing-memory-2YWEWRMQ.js.map → routing-memory-YECWDSDV.js.map} +0 -0
  113. /package/dist/{session-memory-YWOMPCLZ.js.map → session-memory-AG4IM3JY.js.map} +0 -0
  114. /package/dist/{setup-command-G3Q3UKI5.js.map → setup-command-WAUXPMOU.js.map} +0 -0
  115. /package/dist/{setup-config-PYFK2GIC.js.map → setup-config-2GDDU5CV.js.map} +0 -0
  116. /package/dist/{setup-custom-api-A4IZQ2Q4.js.map → setup-custom-api-6N2BTUGY.js.map} +0 -0
  117. /package/dist/{tool-memory-ABPSCFIH.js.map → tool-memory-3ZWQVJX3.js.map} +0 -0
  118. /package/dist/{weather-report-GXD6KGDS.js.map → weather-report-WAOVQRGI.js.map} +0 -0
@@ -1907,14 +1907,14 @@ var ManifestSchema = z2.object({
1907
1907
  models: z2.array(z2.unknown())
1908
1908
  });
1909
1909
  function loadManifestOverlay(options) {
1910
- const logger11 = options?.logger ?? createLogger({ component: "manifest-overlay" });
1910
+ const logger14 = options?.logger ?? createLogger({ component: "manifest-overlay" });
1911
1911
  if (options?.path !== void 0) {
1912
- return loadManifestFile(options.path, logger11);
1912
+ return loadManifestFile(options.path, logger14);
1913
1913
  }
1914
1914
  const userPath = resolveUserManifestPath(options?.env);
1915
1915
  const operatorPath = resolveManifestPath(options?.env);
1916
- const user = loadManifestFile(userPath, logger11);
1917
- const operator = loadManifestFile(operatorPath, logger11);
1916
+ const user = loadManifestFile(userPath, logger14);
1917
+ const operator = loadManifestFile(operatorPath, logger14);
1918
1918
  return mergeOverlays(user, operator);
1919
1919
  }
1920
1920
  function mergeOverlays(lower, higher) {
@@ -1931,11 +1931,11 @@ function mergeOverlays(lower, higher) {
1931
1931
  return merged;
1932
1932
  }
1933
1933
  function loadUserManifestOverlay(options) {
1934
- const logger11 = options?.logger ?? createLogger({ component: "manifest-overlay" });
1934
+ const logger14 = options?.logger ?? createLogger({ component: "manifest-overlay" });
1935
1935
  const path2 = options?.path ?? resolveUserManifestPath(options?.env);
1936
- return loadManifestFile(path2, logger11);
1936
+ return loadManifestFile(path2, logger14);
1937
1937
  }
1938
- function loadManifestFile(path2, logger11) {
1938
+ function loadManifestFile(path2, logger14) {
1939
1939
  let exists = false;
1940
1940
  try {
1941
1941
  exists = existsSync(path2);
@@ -1950,7 +1950,7 @@ function loadManifestFile(path2, logger11) {
1950
1950
  return { entries: [], rejections: [], path: path2, status: "empty" };
1951
1951
  }
1952
1952
  if (stat.size > MANIFEST_MAX_BYTES) {
1953
- logger11.warn("Manifest overlay too large; skipping", {
1953
+ logger14.warn("Manifest overlay too large; skipping", {
1954
1954
  path: path2,
1955
1955
  size: stat.size,
1956
1956
  max: MANIFEST_MAX_BYTES
@@ -1958,9 +1958,9 @@ function loadManifestFile(path2, logger11) {
1958
1958
  return { entries: [], rejections: [], path: path2, status: "too-large" };
1959
1959
  }
1960
1960
  const raw = readFileSync(path2, "utf-8");
1961
- return parseManifest(raw, path2, logger11);
1961
+ return parseManifest(raw, path2, logger14);
1962
1962
  }
1963
- function parseManifest(raw, path2, logger11) {
1963
+ function parseManifest(raw, path2, logger14) {
1964
1964
  let parsed;
1965
1965
  try {
1966
1966
  if (path2.endsWith(".json")) {
@@ -1969,7 +1969,7 @@ function parseManifest(raw, path2, logger11) {
1969
1969
  parsed = parseYaml(raw);
1970
1970
  }
1971
1971
  } catch (e) {
1972
- logger11.warn("Manifest overlay parse failure; skipping", {
1972
+ logger14.warn("Manifest overlay parse failure; skipping", {
1973
1973
  path: path2,
1974
1974
  error: e instanceof Error ? e.message : String(e)
1975
1975
  });
@@ -1977,7 +1977,7 @@ function parseManifest(raw, path2, logger11) {
1977
1977
  }
1978
1978
  const shape = ManifestSchema.safeParse(parsed);
1979
1979
  if (!shape.success) {
1980
- logger11.warn("Manifest overlay schema mismatch at root; skipping", {
1980
+ logger14.warn("Manifest overlay schema mismatch at root; skipping", {
1981
1981
  path: path2,
1982
1982
  issues: shape.error.issues.slice(0, 5).map((i) => i.message)
1983
1983
  });
@@ -2052,7 +2052,7 @@ function defaultSnapshotPath() {
2052
2052
  return join(here, "models-dev-snapshot.json");
2053
2053
  }
2054
2054
  function loadModelsDevSnapshot(options) {
2055
- const logger11 = createLogger({ component: "models-dev-snapshot" });
2055
+ const logger14 = createLogger({ component: "models-dev-snapshot" });
2056
2056
  const path2 = options?.path ?? defaultSnapshotPath();
2057
2057
  let exists = false;
2058
2058
  try {
@@ -2067,21 +2067,21 @@ function loadModelsDevSnapshot(options) {
2067
2067
  try {
2068
2068
  parsed = JSON.parse(readFileSync2(path2, "utf-8"));
2069
2069
  } catch (e) {
2070
- logger11.warn("models.dev snapshot parse failure; skipping", {
2070
+ logger14.warn("models.dev snapshot parse failure; skipping", {
2071
2071
  path: path2,
2072
2072
  error: e instanceof Error ? e.message : String(e)
2073
2073
  });
2074
2074
  return { entries: [], path: path2, status: "malformed" };
2075
2075
  }
2076
2076
  if (parsed.version !== 1) {
2077
- logger11.warn("models.dev snapshot version unsupported; skipping", {
2077
+ logger14.warn("models.dev snapshot version unsupported; skipping", {
2078
2078
  path: path2,
2079
2079
  version: parsed.version
2080
2080
  });
2081
2081
  return { entries: [], path: path2, status: "malformed" };
2082
2082
  }
2083
2083
  if (!Array.isArray(parsed.entries)) {
2084
- logger11.warn("models.dev snapshot missing entries array; skipping", { path: path2 });
2084
+ logger14.warn("models.dev snapshot missing entries array; skipping", { path: path2 });
2085
2085
  return { entries: [], path: path2, status: "malformed" };
2086
2086
  }
2087
2087
  const entries = parsed.entries;
@@ -2116,7 +2116,7 @@ function toModelEntry(rec) {
2116
2116
  };
2117
2117
  }
2118
2118
  function loadGeneratedRegistryEntries(options) {
2119
- const logger11 = createLogger({ component: "models-generated" });
2119
+ const logger14 = createLogger({ component: "models-generated" });
2120
2120
  const path2 = options?.path ?? defaultGeneratedPath();
2121
2121
  let exists = false;
2122
2122
  try {
@@ -2129,14 +2129,14 @@ function loadGeneratedRegistryEntries(options) {
2129
2129
  try {
2130
2130
  parsed = JSON.parse(readFileSync3(path2, "utf-8"));
2131
2131
  } catch (e) {
2132
- logger11.warn("generated registry parse failure; skipping", {
2132
+ logger14.warn("generated registry parse failure; skipping", {
2133
2133
  path: path2,
2134
2134
  error: e instanceof Error ? e.message : String(e)
2135
2135
  });
2136
2136
  return { entries: [], path: path2, status: "malformed" };
2137
2137
  }
2138
2138
  if (!Array.isArray(parsed.entries)) {
2139
- logger11.warn("generated registry missing entries array; skipping", { path: path2 });
2139
+ logger14.warn("generated registry missing entries array; skipping", { path: path2 });
2140
2140
  return { entries: [], path: path2, status: "malformed" };
2141
2141
  }
2142
2142
  const entries = [];
@@ -4737,9 +4737,9 @@ var DEFAULT_OUTPUT_TOKENS = 500;
4737
4737
  var TopsisRouter = class {
4738
4738
  config;
4739
4739
  logger;
4740
- constructor(config = {}, logger11) {
4740
+ constructor(config = {}, logger14) {
4741
4741
  this.config = { ...DEFAULT_TOPSIS_CONFIG, ...config };
4742
- this.logger = logger11 ?? createLogger({ component: "TopsisRouter" });
4742
+ this.logger = logger14 ?? createLogger({ component: "TopsisRouter" });
4743
4743
  this.validateWeights();
4744
4744
  }
4745
4745
  /**
@@ -6096,9 +6096,9 @@ var ZeroRouter = class {
6096
6096
  logger;
6097
6097
  outcomes = [];
6098
6098
  calibrationBias = 0;
6099
- constructor(config, logger11) {
6099
+ constructor(config, logger14) {
6100
6100
  this.config = ZeroRouterConfigSchema.parse(config ?? {});
6101
- this.logger = logger11 ?? createLogger({ component: "ZeroRouter" });
6101
+ this.logger = logger14 ?? createLogger({ component: "ZeroRouter" });
6102
6102
  this.logger.debug("ZeroRouter initialized", {
6103
6103
  thresholds: this.config.thresholds,
6104
6104
  enableCalibration: this.config.enableCalibration
@@ -6618,9 +6618,9 @@ var ConfidenceCascadeStage = class {
6618
6618
  routingsCount = 0;
6619
6619
  escalationCount = 0;
6620
6620
  complexityDistribution = { simple: 0, moderate: 0, complex: 0 };
6621
- constructor(config = {}, logger11) {
6621
+ constructor(config = {}, logger14) {
6622
6622
  this.config = { ...DEFAULT_CONFIG, ...config };
6623
- this.logger = logger11 ?? createLogger({ component: "ConfidenceCascadeStage" });
6623
+ this.logger = logger14 ?? createLogger({ component: "ConfidenceCascadeStage" });
6624
6624
  }
6625
6625
  canHandle(ctx) {
6626
6626
  return getRemainingCandidates(ctx).length > 0;
@@ -6961,9 +6961,9 @@ var CapabilityMatchStage = class {
6961
6961
  creative: 0,
6962
6962
  general: 0
6963
6963
  };
6964
- constructor(config = {}, logger11) {
6964
+ constructor(config = {}, logger14) {
6965
6965
  this.config = { ...DEFAULT_CONFIG2, ...config };
6966
- this.logger = logger11 ?? createLogger({ component: "CapabilityMatchStage" });
6966
+ this.logger = logger14 ?? createLogger({ component: "CapabilityMatchStage" });
6967
6967
  }
6968
6968
  canHandle(ctx) {
6969
6969
  return getRemainingCandidates(ctx).length > 0;
@@ -7119,9 +7119,9 @@ var QualityConstraintStage = class {
7119
7119
  filteredCount = 0;
7120
7120
  fallbackCount = 0;
7121
7121
  constraintViolations = { quality: 0, cost: 0, latency: 0 };
7122
- constructor(config = {}, logger11) {
7122
+ constructor(config = {}, logger14) {
7123
7123
  this.config = { ...DEFAULT_CONFIG3, ...config };
7124
- this.logger = logger11 ?? createLogger({ component: "QualityConstraintStage" });
7124
+ this.logger = logger14 ?? createLogger({ component: "QualityConstraintStage" });
7125
7125
  }
7126
7126
  canHandle(ctx) {
7127
7127
  return getRemainingCandidates(ctx).length > 0;
@@ -7329,9 +7329,9 @@ var ResourceStrategyStage = class {
7329
7329
  logger;
7330
7330
  routingsCount = 0;
7331
7331
  tierHistory = [];
7332
- constructor(config = {}, logger11) {
7332
+ constructor(config = {}, logger14) {
7333
7333
  this.config = { ...DEFAULT_CONFIG4, ...config };
7334
- this.logger = logger11 ?? createLogger({ component: "ResourceStrategyStage" });
7334
+ this.logger = logger14 ?? createLogger({ component: "ResourceStrategyStage" });
7335
7335
  }
7336
7336
  canHandle(ctx) {
7337
7337
  return getRemainingCandidates(ctx).length > 1;
@@ -7440,10 +7440,10 @@ var DistilledRuleStage = class {
7440
7440
  config;
7441
7441
  logger;
7442
7442
  rulesAppliedCount = 0;
7443
- constructor(distiller, config, logger11) {
7443
+ constructor(distiller, config, logger14) {
7444
7444
  this.distiller = distiller;
7445
7445
  this.config = { ...DEFAULT_CONFIG5, ...config };
7446
- this.logger = logger11 ?? createLogger({ component: "DistilledRuleStage" });
7446
+ this.logger = logger14 ?? createLogger({ component: "DistilledRuleStage" });
7447
7447
  }
7448
7448
  canHandle(ctx) {
7449
7449
  const candidates = getRemainingCandidates(ctx);
@@ -7582,10 +7582,10 @@ var KnnRoutingStage = class {
7582
7582
  memory;
7583
7583
  routingsCount = 0;
7584
7584
  matchCount = 0;
7585
- constructor(memory, config = {}, logger11) {
7585
+ constructor(memory, config = {}, logger14) {
7586
7586
  this.config = { ...DEFAULT_CONFIG6, ...config };
7587
7587
  this.memory = memory;
7588
- this.logger = logger11 ?? createLogger({ component: "KnnRoutingStage" });
7588
+ this.logger = logger14 ?? createLogger({ component: "KnnRoutingStage" });
7589
7589
  }
7590
7590
  canHandle(ctx) {
7591
7591
  return getRemainingCandidates(ctx).length > 0;
@@ -7800,10 +7800,10 @@ var StrategyDistiller = class {
7800
7800
  rules = /* @__PURE__ */ new Map();
7801
7801
  outcomeCounter = 0;
7802
7802
  lastDistillAt;
7803
- constructor(outcomeStore, logger11, config) {
7803
+ constructor(outcomeStore, logger14, config) {
7804
7804
  this.outcomeStore = outcomeStore;
7805
7805
  this.config = { ...DEFAULT_DISTILLER_CONFIG, ...config };
7806
- this.logger = logger11 ?? createLogger({ component: "StrategyDistiller" });
7806
+ this.logger = logger14 ?? createLogger({ component: "StrategyDistiller" });
7807
7807
  }
7808
7808
  /** Called for each processed outcome. Triggers distillation at threshold. */
7809
7809
  onOutcome() {
@@ -7967,18 +7967,18 @@ var StrategyDistiller = class {
7967
7967
  };
7968
7968
  }
7969
7969
  };
7970
- function createStrategyDistiller(outcomeStore, logger11, config) {
7971
- return new StrategyDistiller(outcomeStore, logger11, config);
7970
+ function createStrategyDistiller(outcomeStore, logger14, config) {
7971
+ return new StrategyDistiller(outcomeStore, logger14, config);
7972
7972
  }
7973
7973
  var persistentDistillerFactory;
7974
7974
  function registerPersistentDistillerFactory(factory) {
7975
7975
  persistentDistillerFactory = factory;
7976
7976
  }
7977
- function createPersistentDistillerOrFallback(outcomeStore, logger11) {
7977
+ function createPersistentDistillerOrFallback(outcomeStore, logger14) {
7978
7978
  if (persistentDistillerFactory !== void 0) {
7979
- return persistentDistillerFactory(outcomeStore, logger11);
7979
+ return persistentDistillerFactory(outcomeStore, logger14);
7980
7980
  }
7981
- return new StrategyDistiller(outcomeStore, logger11);
7981
+ return new StrategyDistiller(outcomeStore, logger14);
7982
7982
  }
7983
7983
 
7984
7984
  // src/orchestration/outcomes/outcome-types.ts
@@ -8659,8 +8659,8 @@ function generateSyntheticPriors() {
8659
8659
  }
8660
8660
  return priors;
8661
8661
  }
8662
- function runWarmUp(logger11) {
8663
- const log = logger11 ?? createLogger({ component: "warm-up" });
8662
+ function runWarmUp(logger14) {
8663
+ const log = logger14 ?? createLogger({ component: "warm-up" });
8664
8664
  const store = getOutcomeStore();
8665
8665
  const existing = store.query();
8666
8666
  const hasSynthetic = existing.some((o) => o.qualitySignals?.includes(SYNTHETIC_MARKER) === true);
@@ -11141,6 +11141,256 @@ function selectWithMemoryInfluence(linucbSelection, memoryResult, deps) {
11141
11141
  return linucbSelection;
11142
11142
  }
11143
11143
 
11144
+ // src/config/available-models-cache.ts
11145
+ var logger10 = createLogger({ component: "available-models-cache" });
11146
+ var DEFAULT_TTL_MS = 5 * 60 * 1e3;
11147
+ var DEFAULT_STALE_TTL_MS = 25 * 60 * 1e3;
11148
+ var AvailableModelsCache = class {
11149
+ sources;
11150
+ ttlMs;
11151
+ staleTtlMs;
11152
+ now;
11153
+ states;
11154
+ constructor(options) {
11155
+ this.sources = [...options.sources];
11156
+ this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
11157
+ this.staleTtlMs = options.staleTtlMs ?? DEFAULT_STALE_TTL_MS;
11158
+ this.now = options.now ?? Date.now;
11159
+ this.states = /* @__PURE__ */ new Map();
11160
+ for (const s of this.sources) {
11161
+ this.states.set(s.name, { value: null, fetchedAt: 0, inFlight: null });
11162
+ }
11163
+ }
11164
+ /**
11165
+ * Register a source after construction. Used by adapter factories that
11166
+ * wire themselves into the default cache lazily as they're built.
11167
+ * Duplicate names are ignored (first registration wins, on the
11168
+ * assumption that the same factory might run twice in a test session).
11169
+ */
11170
+ addSource(source) {
11171
+ if (this.states.has(source.name)) return;
11172
+ this.sources.push(source);
11173
+ this.states.set(source.name, { value: null, fetchedAt: 0, inFlight: null });
11174
+ }
11175
+ /**
11176
+ * Remove a previously-registered source. Used by tests + by factories
11177
+ * that want to drop a probe when an adapter is being disposed.
11178
+ */
11179
+ removeSource(name) {
11180
+ this.sources = this.sources.filter((s) => s.name !== name);
11181
+ this.states.delete(name);
11182
+ }
11183
+ /**
11184
+ * Returns the union of every source's available models. Stale-while-
11185
+ * revalidate: serve fresh-or-stale immediately, refresh stale entries
11186
+ * in the background. First call (no cache yet) blocks on every source.
11187
+ */
11188
+ async getAll() {
11189
+ const probes = this.sources.map((s) => this.probeOne(s));
11190
+ const results = await Promise.all(probes);
11191
+ const out = [];
11192
+ for (const r of results) {
11193
+ for (const m of r) out.push(m);
11194
+ }
11195
+ return out;
11196
+ }
11197
+ /** Models reported by one named source (subset of getAll). */
11198
+ async byProvider(sourceName) {
11199
+ const all = await this.getAll();
11200
+ return all.filter((m) => m.source === sourceName);
11201
+ }
11202
+ /** True iff some source currently reports the given model id. */
11203
+ async has(modelId) {
11204
+ const all = await this.getAll();
11205
+ return all.some((m) => m.id === modelId);
11206
+ }
11207
+ /** Force a synchronous refresh of every source — used after a 404. */
11208
+ async refresh() {
11209
+ for (const s of this.sources) {
11210
+ const state = this.states.get(s.name);
11211
+ if (state === void 0) continue;
11212
+ state.fetchedAt = 0;
11213
+ state.value = null;
11214
+ }
11215
+ return this.getAll();
11216
+ }
11217
+ /**
11218
+ * Probe one source. Returns:
11219
+ * - cached value if still fresh
11220
+ * - cached value AND kicks a background refresh if stale-but-not-expired
11221
+ * - blocks on the source if no cache or fully expired
11222
+ *
11223
+ * Source errors yield an empty list (logged) so one bad source can't
11224
+ * poison the union.
11225
+ */
11226
+ async probeOne(source) {
11227
+ const state = this.getState(source.name);
11228
+ const age = this.now() - state.fetchedAt;
11229
+ if (state.value !== null && age < this.ttlMs) {
11230
+ return state.value;
11231
+ }
11232
+ if (state.value !== null && age < this.staleTtlMs) {
11233
+ state.inFlight ??= this.fetchSource(source).finally(() => {
11234
+ state.inFlight = null;
11235
+ });
11236
+ return state.value;
11237
+ }
11238
+ if (state.inFlight !== null) return state.inFlight;
11239
+ state.inFlight = this.fetchSource(source).finally(() => {
11240
+ state.inFlight = null;
11241
+ });
11242
+ return state.inFlight;
11243
+ }
11244
+ async fetchSource(source) {
11245
+ const state = this.getState(source.name);
11246
+ try {
11247
+ const raw = await source.listModels();
11248
+ const value = raw.map((m) => normaliseEntry(m, source));
11249
+ state.value = value;
11250
+ state.fetchedAt = this.now();
11251
+ return value;
11252
+ } catch (e) {
11253
+ logger10.warn("AvailableModelsCache source probe failed", {
11254
+ source: source.name,
11255
+ error: e instanceof Error ? e.message : String(e)
11256
+ });
11257
+ return state.value ?? [];
11258
+ }
11259
+ }
11260
+ getState(name) {
11261
+ const state = this.states.get(name);
11262
+ if (state === void 0) {
11263
+ throw new Error(`AvailableModelsCache: unknown source "${name}"`);
11264
+ }
11265
+ return state;
11266
+ }
11267
+ };
11268
+ function normaliseEntry(raw, source) {
11269
+ const slash = raw.id.indexOf("/");
11270
+ if (slash > 0 && slash < raw.id.length - 1) {
11271
+ return { id: raw.id, source: source.name, provider: raw.id.slice(0, slash) };
11272
+ }
11273
+ if (source.providerHint !== void 0) {
11274
+ return { id: raw.id, source: source.name, provider: source.providerHint };
11275
+ }
11276
+ return { id: raw.id, source: source.name };
11277
+ }
11278
+ var defaultCache = null;
11279
+ function getDefaultAvailableModelsCache() {
11280
+ defaultCache ??= new AvailableModelsCache({ sources: [] });
11281
+ return defaultCache;
11282
+ }
11283
+ function setDefaultAvailableModelsCache(cache) {
11284
+ defaultCache = cache;
11285
+ }
11286
+
11287
+ // src/config/openrouter-models-source.ts
11288
+ import { z as z15 } from "zod";
11289
+ var OPENROUTER_MODELS_URL = "https://openrouter.ai/api/v1/models";
11290
+ var DEFAULT_TIMEOUT_MS = 8e3;
11291
+ var MAX_MODELS = 5e3;
11292
+ var MAX_BYTES = 8e6;
11293
+ var OpenRouterModelSchema = z15.object({ id: z15.string().min(1).max(256) });
11294
+ var OpenRouterModelsResponseSchema = z15.object({ data: z15.array(OpenRouterModelSchema) });
11295
+ var logger11 = createLogger({ component: "openrouter-models-source" });
11296
+ function parseCatalog(text) {
11297
+ if (text.length > MAX_BYTES) {
11298
+ logger11.warn("OpenRouter catalog exceeds byte cap; ignoring", { bytes: text.length });
11299
+ return [];
11300
+ }
11301
+ const parsed = OpenRouterModelsResponseSchema.safeParse(JSON.parse(text));
11302
+ if (!parsed.success) {
11303
+ logger11.warn("OpenRouter catalog failed schema validation; treating as empty", {
11304
+ error: parsed.error.message
11305
+ });
11306
+ return [];
11307
+ }
11308
+ return parsed.data.data.slice(0, MAX_MODELS).map((m) => ({ id: m.id }));
11309
+ }
11310
+ async function fetchCatalog(url, timeoutMs, doFetch) {
11311
+ const controller = new AbortController();
11312
+ const timer = setTimeout(() => {
11313
+ controller.abort();
11314
+ }, timeoutMs);
11315
+ try {
11316
+ const res = await doFetch(url, {
11317
+ signal: controller.signal,
11318
+ headers: { accept: "application/json" }
11319
+ });
11320
+ if (!res.ok) {
11321
+ logger11.warn("OpenRouter catalog fetch returned non-OK; treating as empty", {
11322
+ status: res.status
11323
+ });
11324
+ return [];
11325
+ }
11326
+ const declaredLen = res.headers.get("content-length");
11327
+ if (declaredLen !== null && Number(declaredLen) > MAX_BYTES) {
11328
+ logger11.warn("OpenRouter catalog Content-Length exceeds byte cap; ignoring", {
11329
+ bytes: declaredLen
11330
+ });
11331
+ return [];
11332
+ }
11333
+ const ids = parseCatalog(await res.text());
11334
+ logger11.debug("OpenRouter catalog loaded", { count: ids.length });
11335
+ return ids;
11336
+ } catch (error) {
11337
+ logger11.warn("OpenRouter catalog fetch failed; treating as empty", {
11338
+ error: error instanceof Error ? error.message : String(error)
11339
+ });
11340
+ return [];
11341
+ } finally {
11342
+ clearTimeout(timer);
11343
+ }
11344
+ }
11345
+ function createOpenRouterModelsSource(opts = {}) {
11346
+ const url = opts.url ?? OPENROUTER_MODELS_URL;
11347
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
11348
+ const doFetch = opts.fetchImpl ?? fetch;
11349
+ return {
11350
+ name: "openrouter",
11351
+ providerHint: "openrouter",
11352
+ listModels: () => fetchCatalog(url, timeoutMs, doFetch)
11353
+ };
11354
+ }
11355
+
11356
+ // src/config/register-model-sources.ts
11357
+ var logger12 = createLogger({ component: "register-model-sources" });
11358
+ function isDynamicModelsEnabled() {
11359
+ return process.env["NEXUS_DYNAMIC_MODELS"] === "true";
11360
+ }
11361
+ function hasListModels(adapter) {
11362
+ return typeof adapter === "object" && adapter !== null && typeof adapter.listModels === "function";
11363
+ }
11364
+ function adapterSource(cliName, adapter) {
11365
+ return {
11366
+ name: cliName,
11367
+ listModels: () => adapter.listModels().then((models) => models.map((m) => ({ id: m.id }))).catch((error) => {
11368
+ logger12.debug("adapter listModels failed; treating as empty", {
11369
+ cli: cliName,
11370
+ error: error instanceof Error ? error.message : String(error)
11371
+ });
11372
+ return [];
11373
+ })
11374
+ };
11375
+ }
11376
+ function buildDefaultModelSources(adapters, opts = {}) {
11377
+ const sources = [];
11378
+ if (opts.includeOpenRouter !== false) {
11379
+ sources.push(createOpenRouterModelsSource());
11380
+ }
11381
+ for (const [cliName, adapter] of adapters) {
11382
+ if (hasListModels(adapter)) {
11383
+ sources.push(adapterSource(cliName, adapter));
11384
+ }
11385
+ }
11386
+ return sources;
11387
+ }
11388
+ function registerDefaultModelSources(cache, adapters, opts = {}) {
11389
+ for (const source of buildDefaultModelSources(adapters, opts)) {
11390
+ cache.addSource(source);
11391
+ }
11392
+ }
11393
+
11144
11394
  // src/cli-adapters/composite-router-outcome.ts
11145
11395
  var sharedAnalyzer3 = createSharedTaskAnalyzer();
11146
11396
  function recordBanditOutcome(cliName, task, reward, deps) {
@@ -11346,7 +11596,7 @@ var CompositeRouter = class _CompositeRouter {
11346
11596
  lastRoutedTask;
11347
11597
  // Track last traceId for metrics correlation (Issue #559)
11348
11598
  lastTraceId;
11349
- constructor(adapters, config, logger11) {
11599
+ constructor(adapters, config, logger14) {
11350
11600
  const {
11351
11601
  preferenceRouterConfig,
11352
11602
  zeroRouterConfig,
@@ -11363,7 +11613,7 @@ var CompositeRouter = class _CompositeRouter {
11363
11613
  ...baseConfig
11364
11614
  } = config ?? {};
11365
11615
  this.config = CompositeRouterConfigSchema.parse(baseConfig);
11366
- this.logger = logger11 ?? createLogger({ component: "CompositeRouter" });
11616
+ this.logger = logger14 ?? createLogger({ component: "CompositeRouter" });
11367
11617
  this.adapters = adapters;
11368
11618
  this.cliNames = Array.from(adapters.keys());
11369
11619
  if (metricsCollector !== void 0) {
@@ -11522,7 +11772,7 @@ var CompositeRouter = class _CompositeRouter {
11522
11772
  */
11523
11773
  async consultUnifiedContext(task) {
11524
11774
  try {
11525
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-SHT7J6BT.js");
11775
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-EFEWHU3Z.js");
11526
11776
  const ctx = await getContextForTask({
11527
11777
  task: task.content,
11528
11778
  category: inferTaskCategory(task.content),
@@ -11858,8 +12108,14 @@ var CompositeRouter = class _CompositeRouter {
11858
12108
  return this.routingMemory;
11859
12109
  }
11860
12110
  };
11861
- function createCompositeRouter(adapters, config, logger11) {
11862
- return new CompositeRouter(adapters, config, logger11);
12111
+ function createCompositeRouter(adapters, config, logger14) {
12112
+ let resolved = config;
12113
+ if (isDynamicModelsEnabled() && config?.availableModelsCache === void 0) {
12114
+ const cache = getDefaultAvailableModelsCache();
12115
+ registerDefaultModelSources(cache, adapters);
12116
+ resolved = { ...config, availableModelsCache: cache };
12117
+ }
12118
+ return new CompositeRouter(adapters, resolved, logger14);
11863
12119
  }
11864
12120
 
11865
12121
  // src/core/types/model.ts
@@ -11914,7 +12170,7 @@ import { dirname as dirname4 } from "path";
11914
12170
  import { mkdirSync as mkdirSync2 } from "fs";
11915
12171
 
11916
12172
  // src/context/mobimem-types.ts
11917
- import { z as z15 } from "zod";
12173
+ import { z as z16 } from "zod";
11918
12174
  var DEFAULT_MOBIMEM_CONFIG = {
11919
12175
  dbPath: ":memory:",
11920
12176
  maxProfileEntries: 100,
@@ -11926,15 +12182,15 @@ var DEFAULT_MOBIMEM_CONFIG = {
11926
12182
  minExperienceSuccessRate: 0.7,
11927
12183
  autoEviction: true
11928
12184
  };
11929
- var MobiMemConfigSchema = z15.object({
11930
- dbPath: z15.string(),
11931
- maxProfileEntries: z15.number().int().positive().default(100),
11932
- maxExperiencePatterns: z15.number().int().positive().default(500),
11933
- maxActionCacheEntries: z15.number().int().positive().default(1e3),
11934
- actionCacheTtlMs: z15.number().int().positive().default(36e5),
11935
- minProfileConfidence: z15.number().min(0).max(1).default(0.6),
11936
- minExperienceSuccessRate: z15.number().min(0).max(1).default(0.7),
11937
- autoEviction: z15.boolean().default(true)
12185
+ var MobiMemConfigSchema = z16.object({
12186
+ dbPath: z16.string(),
12187
+ maxProfileEntries: z16.number().int().positive().default(100),
12188
+ maxExperiencePatterns: z16.number().int().positive().default(500),
12189
+ maxActionCacheEntries: z16.number().int().positive().default(1e3),
12190
+ actionCacheTtlMs: z16.number().int().positive().default(36e5),
12191
+ minProfileConfidence: z16.number().min(0).max(1).default(0.6),
12192
+ minExperienceSuccessRate: z16.number().min(0).max(1).default(0.7),
12193
+ autoEviction: z16.boolean().default(true)
11938
12194
  });
11939
12195
 
11940
12196
  // src/context/mobimem-impl.ts
@@ -12385,7 +12641,7 @@ var ActionCacheImpl = class {
12385
12641
  };
12386
12642
 
12387
12643
  // src/context/mobimem.ts
12388
- var logger10 = createLogger({ component: "MobiMem" });
12644
+ var logger13 = createLogger({ component: "MobiMem" });
12389
12645
  var MobiMem = class {
12390
12646
  profile;
12391
12647
  experience;
@@ -12406,7 +12662,7 @@ var MobiMem = class {
12406
12662
  this.profile = new ProfileMemoryImpl(this.config, this.db);
12407
12663
  this.experience = new ExperienceMemoryImpl(this.config, this.db);
12408
12664
  this.action = new ActionCacheImpl(this.config, this.db);
12409
- logger10.info("MobiMem initialized", {
12665
+ logger13.info("MobiMem initialized", {
12410
12666
  dbPath: validated.dbPath,
12411
12667
  persisted: this.db !== null,
12412
12668
  maxProfileEntries: this.config.maxProfileEntries,
@@ -12439,13 +12695,13 @@ var MobiMem = class {
12439
12695
  if (this.config.autoEviction) {
12440
12696
  const evicted = this.action.evictExpired();
12441
12697
  if (evicted > 0) {
12442
- logger10.debug("Evicted expired action cache entries", { count: evicted });
12698
+ logger13.debug("Evicted expired action cache entries", { count: evicted });
12443
12699
  }
12444
12700
  }
12445
12701
  }
12446
12702
  close() {
12447
12703
  if (this.db !== null) this.db.close();
12448
- logger10.info("MobiMem closed");
12704
+ logger13.info("MobiMem closed");
12449
12705
  }
12450
12706
  };
12451
12707
  var sharedInstance = null;
@@ -12707,6 +12963,7 @@ export {
12707
12963
  MANIFEST_MAX_BYTES,
12708
12964
  defaultUserManifestPath,
12709
12965
  loadUserManifestOverlay,
12966
+ loadModelsDevSnapshot,
12710
12967
  loadGeneratedRegistryEntries,
12711
12968
  ModelRegistry,
12712
12969
  getDefaultRegistry,
@@ -12851,6 +13108,10 @@ export {
12851
13108
  getAdaptiveBonus,
12852
13109
  shouldExplore,
12853
13110
  getFallbackChainForCategory,
13111
+ AvailableModelsCache,
13112
+ getDefaultAvailableModelsCache,
13113
+ setDefaultAvailableModelsCache,
13114
+ buildDefaultModelSources,
12854
13115
  CompositeRouter,
12855
13116
  createCompositeRouter,
12856
13117
  ModelCapability,
@@ -12858,4 +13119,4 @@ export {
12858
13119
  ParseError,
12859
13120
  OrchestratorError
12860
13121
  };
12861
- //# sourceMappingURL=chunk-KLYBJUTK.js.map
13122
+ //# sourceMappingURL=chunk-Q732LOXE.js.map