nexus-agents 2.158.1 → 2.160.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 (122) hide show
  1. package/dist/{child-mcp-config-ODAUXUWE.js → child-mcp-config-XEXFG3LA.js} +2 -2
  2. package/dist/{chunk-YQRP5NST.js → chunk-3QIXGEY7.js} +2 -2
  3. package/dist/{chunk-2O63LDYB.js → chunk-4AXOISAP.js} +3 -3
  4. package/dist/{chunk-J2JP35S3.js → chunk-5NVU25BA.js} +4 -4
  5. package/dist/{chunk-Q7TALELN.js → chunk-7XISTLQP.js} +8 -8
  6. package/dist/{chunk-4IXC6V6O.js → chunk-AMY4S4VD.js} +2 -2
  7. package/dist/{chunk-OOGGQ2NA.js → chunk-B23GFISN.js} +3 -3
  8. package/dist/{chunk-Q4JNYY2Y.js → chunk-E7LG7L4O.js} +144 -13
  9. package/dist/chunk-E7LG7L4O.js.map +1 -0
  10. package/dist/{chunk-KS622JST.js → chunk-ED6B55WK.js} +3 -3
  11. package/dist/{chunk-R76LLKT2.js → chunk-FYQSTNG6.js} +5 -5
  12. package/dist/{chunk-S3H4VWN5.js → chunk-HBLVOFLL.js} +2 -2
  13. package/dist/{chunk-7J3AAPH5.js → chunk-HT3B6ZWV.js} +2 -2
  14. package/dist/{chunk-FWW5GCEH.js → chunk-I2DK3KSH.js} +2 -2
  15. package/dist/{chunk-55ZDYUBT.js → chunk-I6NTUVGW.js} +2 -2
  16. package/dist/{chunk-LSWGHIJK.js → chunk-ICYEG7T4.js} +7 -7
  17. package/dist/{chunk-6MCSD37T.js → chunk-IG2SIC2E.js} +2 -2
  18. package/dist/{chunk-VKVJSPHJ.js → chunk-JYV5MZC6.js} +4 -4
  19. package/dist/{chunk-K6HJLOPA.js → chunk-MXNIOTDY.js} +3 -3
  20. package/dist/{chunk-CSHFTQA7.js → chunk-O27ZG7BL.js} +3 -3
  21. package/dist/{chunk-HANP6FHM.js → chunk-OQUELE4L.js} +54 -40
  22. package/dist/{chunk-HANP6FHM.js.map → chunk-OQUELE4L.js.map} +1 -1
  23. package/dist/{chunk-XLJCXM7L.js → chunk-Q6EGZKLE.js} +2 -2
  24. package/dist/{chunk-S7PFS6PX.js → chunk-QD653D5O.js} +7 -7
  25. package/dist/{chunk-42ZSRIEX.js → chunk-QVIQAIOK.js} +2 -2
  26. package/dist/{chunk-YH5U3XCP.js → chunk-RNCBSF6I.js} +2 -2
  27. package/dist/{chunk-RI3BFANI.js → chunk-RU336IEH.js} +2 -2
  28. package/dist/{chunk-I32MYAT5.js → chunk-SHFCJJTY.js} +2 -2
  29. package/dist/{chunk-UQOJ2KGW.js → chunk-SN4Q7TZT.js} +2 -2
  30. package/dist/{chunk-CTL5HUZZ.js → chunk-SNKSSSAR.js} +4 -4
  31. package/dist/{chunk-5CMDYYNC.js → chunk-VKUP2PG5.js} +7 -7
  32. package/dist/{chunk-6B5VQ2SY.js → chunk-VWX75FKD.js} +5 -5
  33. package/dist/{chunk-GG7MGRQ6.js → chunk-WP6UBBNJ.js} +4 -4
  34. package/dist/{chunk-U5KSLUZ6.js → chunk-WRISLYLK.js} +2 -2
  35. package/dist/{chunk-DSUFV2ZN.js → chunk-XLEZBTQG.js} +2 -2
  36. package/dist/{chunk-HHNBKTII.js → chunk-ZBEJITR6.js} +5 -5
  37. package/dist/{chunk-YMMX6ELC.js → chunk-ZO54JW4V.js} +3 -3
  38. package/dist/{cli-circuit-breaker-MLVJXLK6.js → cli-circuit-breaker-SAHRY3BI.js} +4 -4
  39. package/dist/cli.js +41 -41
  40. package/dist/{composite-router-FTECAR4U.js → composite-router-MFJNLR3O.js} +2 -2
  41. package/dist/{consensus-vote-MMZTCPL7.js → consensus-vote-Z55357CP.js} +15 -15
  42. package/dist/{context-retriever-MPZ7T4VA.js → context-retriever-Z474PNZ4.js} +8 -8
  43. package/dist/{doctor-deep-KUB4HPCS.js → doctor-deep-IESAJDVW.js} +3 -3
  44. package/dist/{expert-bridge-EK362QGQ.js → expert-bridge-JW4DJPH3.js} +4 -4
  45. package/dist/{factory-GOO7MH5G.js → factory-6JIXPGRH.js} +8 -8
  46. package/dist/{factory-XBUQP3UB.js → factory-Z7GGTUK2.js} +5 -5
  47. package/dist/{improvement-review-XXRDVOJT.js → improvement-review-5DRIOL5K.js} +5 -5
  48. package/dist/index.d.ts +78 -2
  49. package/dist/index.js +30 -30
  50. package/dist/index.js.map +1 -1
  51. package/dist/{init-opencode-RNSCHZIW.js → init-opencode-T2F5WSLT.js} +6 -6
  52. package/dist/{issue-triage-7TWTN6LI.js → issue-triage-RC5VVUAV.js} +6 -6
  53. package/dist/{pr-reviewer-helpers-VT4DR5BC.js → pr-reviewer-helpers-G35TGA7R.js} +4 -4
  54. package/dist/{registry-command-QVBYBBWR.js → registry-command-47UO65SV.js} +2 -2
  55. package/dist/{repo-security-plan-VSQWMONM.js → repo-security-plan-CGXT5CIP.js} +3 -3
  56. package/dist/{research-helpers-synthesize-VCUOMHPD.js → research-helpers-synthesize-37WHCE5I.js} +4 -4
  57. package/dist/{routing-memory-PP4UJVH4.js → routing-memory-YWPM45FH.js} +2 -2
  58. package/dist/{session-memory-TVV2IOGB.js → session-memory-ENUULCNK.js} +3 -3
  59. package/dist/{setup-command-D5PU6XXA.js → setup-command-T6I5TRFR.js} +11 -11
  60. package/dist/{setup-config-HZHL4QMD.js → setup-config-AMGGWQHX.js} +3 -3
  61. package/dist/{setup-custom-api-H6FJ5VWL.js → setup-custom-api-UNAPYLEX.js} +3 -3
  62. package/dist/{tool-memory-YLCJZVMV.js → tool-memory-QH3DN2SU.js} +5 -5
  63. package/dist/{unified-registry-ZUPTC7OR.js → unified-registry-YXQGTU3P.js} +9 -9
  64. package/dist/{weather-report-XPDW6LGI.js → weather-report-BUKQ7YPV.js} +6 -2
  65. package/package.json +1 -1
  66. package/dist/chunk-Q4JNYY2Y.js.map +0 -1
  67. /package/dist/{child-mcp-config-ODAUXUWE.js.map → child-mcp-config-XEXFG3LA.js.map} +0 -0
  68. /package/dist/{chunk-YQRP5NST.js.map → chunk-3QIXGEY7.js.map} +0 -0
  69. /package/dist/{chunk-2O63LDYB.js.map → chunk-4AXOISAP.js.map} +0 -0
  70. /package/dist/{chunk-J2JP35S3.js.map → chunk-5NVU25BA.js.map} +0 -0
  71. /package/dist/{chunk-Q7TALELN.js.map → chunk-7XISTLQP.js.map} +0 -0
  72. /package/dist/{chunk-4IXC6V6O.js.map → chunk-AMY4S4VD.js.map} +0 -0
  73. /package/dist/{chunk-OOGGQ2NA.js.map → chunk-B23GFISN.js.map} +0 -0
  74. /package/dist/{chunk-KS622JST.js.map → chunk-ED6B55WK.js.map} +0 -0
  75. /package/dist/{chunk-R76LLKT2.js.map → chunk-FYQSTNG6.js.map} +0 -0
  76. /package/dist/{chunk-S3H4VWN5.js.map → chunk-HBLVOFLL.js.map} +0 -0
  77. /package/dist/{chunk-7J3AAPH5.js.map → chunk-HT3B6ZWV.js.map} +0 -0
  78. /package/dist/{chunk-FWW5GCEH.js.map → chunk-I2DK3KSH.js.map} +0 -0
  79. /package/dist/{chunk-55ZDYUBT.js.map → chunk-I6NTUVGW.js.map} +0 -0
  80. /package/dist/{chunk-LSWGHIJK.js.map → chunk-ICYEG7T4.js.map} +0 -0
  81. /package/dist/{chunk-6MCSD37T.js.map → chunk-IG2SIC2E.js.map} +0 -0
  82. /package/dist/{chunk-VKVJSPHJ.js.map → chunk-JYV5MZC6.js.map} +0 -0
  83. /package/dist/{chunk-K6HJLOPA.js.map → chunk-MXNIOTDY.js.map} +0 -0
  84. /package/dist/{chunk-CSHFTQA7.js.map → chunk-O27ZG7BL.js.map} +0 -0
  85. /package/dist/{chunk-XLJCXM7L.js.map → chunk-Q6EGZKLE.js.map} +0 -0
  86. /package/dist/{chunk-S7PFS6PX.js.map → chunk-QD653D5O.js.map} +0 -0
  87. /package/dist/{chunk-42ZSRIEX.js.map → chunk-QVIQAIOK.js.map} +0 -0
  88. /package/dist/{chunk-YH5U3XCP.js.map → chunk-RNCBSF6I.js.map} +0 -0
  89. /package/dist/{chunk-RI3BFANI.js.map → chunk-RU336IEH.js.map} +0 -0
  90. /package/dist/{chunk-I32MYAT5.js.map → chunk-SHFCJJTY.js.map} +0 -0
  91. /package/dist/{chunk-UQOJ2KGW.js.map → chunk-SN4Q7TZT.js.map} +0 -0
  92. /package/dist/{chunk-CTL5HUZZ.js.map → chunk-SNKSSSAR.js.map} +0 -0
  93. /package/dist/{chunk-5CMDYYNC.js.map → chunk-VKUP2PG5.js.map} +0 -0
  94. /package/dist/{chunk-6B5VQ2SY.js.map → chunk-VWX75FKD.js.map} +0 -0
  95. /package/dist/{chunk-GG7MGRQ6.js.map → chunk-WP6UBBNJ.js.map} +0 -0
  96. /package/dist/{chunk-U5KSLUZ6.js.map → chunk-WRISLYLK.js.map} +0 -0
  97. /package/dist/{chunk-DSUFV2ZN.js.map → chunk-XLEZBTQG.js.map} +0 -0
  98. /package/dist/{chunk-HHNBKTII.js.map → chunk-ZBEJITR6.js.map} +0 -0
  99. /package/dist/{chunk-YMMX6ELC.js.map → chunk-ZO54JW4V.js.map} +0 -0
  100. /package/dist/{cli-circuit-breaker-MLVJXLK6.js.map → cli-circuit-breaker-SAHRY3BI.js.map} +0 -0
  101. /package/dist/{composite-router-FTECAR4U.js.map → composite-router-MFJNLR3O.js.map} +0 -0
  102. /package/dist/{consensus-vote-MMZTCPL7.js.map → consensus-vote-Z55357CP.js.map} +0 -0
  103. /package/dist/{context-retriever-MPZ7T4VA.js.map → context-retriever-Z474PNZ4.js.map} +0 -0
  104. /package/dist/{doctor-deep-KUB4HPCS.js.map → doctor-deep-IESAJDVW.js.map} +0 -0
  105. /package/dist/{expert-bridge-EK362QGQ.js.map → expert-bridge-JW4DJPH3.js.map} +0 -0
  106. /package/dist/{factory-GOO7MH5G.js.map → factory-6JIXPGRH.js.map} +0 -0
  107. /package/dist/{factory-XBUQP3UB.js.map → factory-Z7GGTUK2.js.map} +0 -0
  108. /package/dist/{improvement-review-XXRDVOJT.js.map → improvement-review-5DRIOL5K.js.map} +0 -0
  109. /package/dist/{init-opencode-RNSCHZIW.js.map → init-opencode-T2F5WSLT.js.map} +0 -0
  110. /package/dist/{issue-triage-7TWTN6LI.js.map → issue-triage-RC5VVUAV.js.map} +0 -0
  111. /package/dist/{pr-reviewer-helpers-VT4DR5BC.js.map → pr-reviewer-helpers-G35TGA7R.js.map} +0 -0
  112. /package/dist/{registry-command-QVBYBBWR.js.map → registry-command-47UO65SV.js.map} +0 -0
  113. /package/dist/{repo-security-plan-VSQWMONM.js.map → repo-security-plan-CGXT5CIP.js.map} +0 -0
  114. /package/dist/{research-helpers-synthesize-VCUOMHPD.js.map → research-helpers-synthesize-37WHCE5I.js.map} +0 -0
  115. /package/dist/{routing-memory-PP4UJVH4.js.map → routing-memory-YWPM45FH.js.map} +0 -0
  116. /package/dist/{session-memory-TVV2IOGB.js.map → session-memory-ENUULCNK.js.map} +0 -0
  117. /package/dist/{setup-command-D5PU6XXA.js.map → setup-command-T6I5TRFR.js.map} +0 -0
  118. /package/dist/{setup-config-HZHL4QMD.js.map → setup-config-AMGGWQHX.js.map} +0 -0
  119. /package/dist/{setup-custom-api-H6FJ5VWL.js.map → setup-custom-api-UNAPYLEX.js.map} +0 -0
  120. /package/dist/{tool-memory-YLCJZVMV.js.map → tool-memory-QH3DN2SU.js.map} +0 -0
  121. /package/dist/{unified-registry-ZUPTC7OR.js.map → unified-registry-YXQGTU3P.js.map} +0 -0
  122. /package/dist/{weather-report-XPDW6LGI.js.map → weather-report-BUKQ7YPV.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLogger
3
- } from "./chunk-Q4JNYY2Y.js";
3
+ } from "./chunk-E7LG7L4O.js";
4
4
  import "./chunk-NL7SZQPW.js";
5
5
  import "./chunk-DHVMSIT5.js";
6
6
  import "./chunk-ZPWHCABL.js";
@@ -60,4 +60,4 @@ export {
60
60
  generateMcpConfig,
61
61
  getDefaultAllowedTools
62
62
  };
63
- //# sourceMappingURL=child-mcp-config-ODAUXUWE.js.map
63
+ //# sourceMappingURL=child-mcp-config-XEXFG3LA.js.map
@@ -5,7 +5,7 @@ import {
5
5
  getErrorMessage,
6
6
  getTimeProvider,
7
7
  ok
8
- } from "./chunk-Q4JNYY2Y.js";
8
+ } from "./chunk-E7LG7L4O.js";
9
9
 
10
10
  // src/cli-adapters/circuit-breaker-types.ts
11
11
  var CircuitErrorCode = {
@@ -375,4 +375,4 @@ export {
375
375
  mapCliErrorToCategory,
376
376
  mapModelErrorToCategory
377
377
  };
378
- //# sourceMappingURL=chunk-YQRP5NST.js.map
378
+ //# sourceMappingURL=chunk-3QIXGEY7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  emitClawGuardViolation
3
- } from "./chunk-42ZSRIEX.js";
3
+ } from "./chunk-QVIQAIOK.js";
4
4
  import {
5
5
  CACHE_TIMEOUTS,
6
6
  MCP_TIMEOUTS,
@@ -16,7 +16,7 @@ import {
16
16
  getTimeProvider,
17
17
  ok,
18
18
  resolveToolClassGuardMs
19
- } from "./chunk-Q4JNYY2Y.js";
19
+ } from "./chunk-E7LG7L4O.js";
20
20
  import {
21
21
  getNexusDataDir
22
22
  } from "./chunk-DHVMSIT5.js";
@@ -2023,4 +2023,4 @@ export {
2023
2023
  VOTING_THRESHOLDS,
2024
2024
  ConsensusMetricsSchema
2025
2025
  };
2026
- //# sourceMappingURL=chunk-2O63LDYB.js.map
2026
+ //# sourceMappingURL=chunk-4AXOISAP.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-7J3AAPH5.js";
4
+ } from "./chunk-HT3B6ZWV.js";
5
5
  import {
6
6
  resolveToken
7
- } from "./chunk-XLJCXM7L.js";
7
+ } from "./chunk-Q6EGZKLE.js";
8
8
  import {
9
9
  err,
10
10
  ok
11
- } from "./chunk-Q4JNYY2Y.js";
11
+ } from "./chunk-E7LG7L4O.js";
12
12
 
13
13
  // src/scm/factory.ts
14
14
  async function createScmProvider(config) {
@@ -41,4 +41,4 @@ export {
41
41
  createScmProvider,
42
42
  createGitHubProvider
43
43
  };
44
- //# sourceMappingURL=chunk-J2JP35S3.js.map
44
+ //# sourceMappingURL=chunk-5NVU25BA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  computeCostDetail
3
- } from "./chunk-UQOJ2KGW.js";
3
+ } from "./chunk-SN4Q7TZT.js";
4
4
  import {
5
5
  DEFAULT_CONSENSUS_CONFIG,
6
6
  DEFAULT_INCREMENTAL_QUORUM_CONFIG,
@@ -18,20 +18,20 @@ import {
18
18
  toolSuccess,
19
19
  withProgressHeartbeat,
20
20
  wrapToolWithTimeout
21
- } from "./chunk-2O63LDYB.js";
21
+ } from "./chunk-4AXOISAP.js";
22
22
  import {
23
23
  getToolMemory
24
- } from "./chunk-GG7MGRQ6.js";
24
+ } from "./chunk-WP6UBBNJ.js";
25
25
  import {
26
26
  createEvent,
27
27
  getGlobalRegistry
28
- } from "./chunk-VKVJSPHJ.js";
28
+ } from "./chunk-JYV5MZC6.js";
29
29
  import {
30
30
  authRemediation,
31
31
  delay,
32
32
  getAvailableClis,
33
33
  withTimeout
34
- } from "./chunk-S7PFS6PX.js";
34
+ } from "./chunk-QD653D5O.js";
35
35
  import {
36
36
  AgentError,
37
37
  CLI_NAMES,
@@ -59,7 +59,7 @@ import {
59
59
  registerPersistentOutcomeStoreFactory,
60
60
  resolveClassGuardMs,
61
61
  resolveVoteTimeout
62
- } from "./chunk-Q4JNYY2Y.js";
62
+ } from "./chunk-E7LG7L4O.js";
63
63
  import {
64
64
  ensureLearningDir,
65
65
  getOutcomesFile
@@ -5866,7 +5866,7 @@ async function processVotesWithCascade(engineVotes, opts) {
5866
5866
  var CONTRARIAN_ESCALATION_THRESHOLD = 0.8;
5867
5867
  async function runContrarianCheck(proposal, log) {
5868
5868
  try {
5869
- const { executeExpert } = await import("./expert-bridge-EK362QGQ.js");
5869
+ const { executeExpert } = await import("./expert-bridge-JW4DJPH3.js");
5870
5870
  const prompt = [
5871
5871
  "You are a contrarian analyst. Your job is to find reasons this proposal should be REJECTED.",
5872
5872
  "Look for: YAGNI (not needed), MISALIGNED (wrong tech/architecture), SECURITY_RISK, SCOPE_CREEP.",
@@ -6382,4 +6382,4 @@ export {
6382
6382
  CONSENSUS_VOTE_OUTPUT_SCHEMA,
6383
6383
  registerConsensusVoteTool
6384
6384
  };
6385
- //# sourceMappingURL=chunk-Q7TALELN.js.map
6385
+ //# sourceMappingURL=chunk-7XISTLQP.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-Q4JNYY2Y.js";
3
+ } from "./chunk-E7LG7L4O.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-4IXC6V6O.js.map
80
+ //# sourceMappingURL=chunk-AMY4S4VD.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadPapersRegistry
3
- } from "./chunk-YH5U3XCP.js";
3
+ } from "./chunk-RNCBSF6I.js";
4
4
  import {
5
5
  getErrorMessage
6
- } from "./chunk-Q4JNYY2Y.js";
6
+ } from "./chunk-E7LG7L4O.js";
7
7
 
8
8
  // src/cli/research-helpers-synthesize.ts
9
9
  import { z } from "zod";
@@ -876,4 +876,4 @@ export {
876
876
  AttributedInsightSchema,
877
877
  synthesizeResearch
878
878
  };
879
- //# sourceMappingURL=chunk-OOGGQ2NA.js.map
879
+ //# sourceMappingURL=chunk-B23GFISN.js.map
@@ -1841,6 +1841,35 @@ function selectIdentityCandidate(candidates) {
1841
1841
  if (authoritative.length > 0) return uniqueCandidate(authoritative);
1842
1842
  return uniqueCandidate(ranked.filter((e) => BREADTH_SOURCES.has(e.source)));
1843
1843
  }
1844
+ var TRAILING_DATE_SEGMENT = /-\d{6,8}$/;
1845
+ var DATE_SEGMENT = /(?:^|-)(?:\d{6,8}|\d{4}-\d{2}(?:-\d{2})?)(?:-|$)/;
1846
+ var SIZE_TIER_QUIRKS = /* @__PURE__ */ new Set(["small", "large", "sized-suffix"]);
1847
+ function matchIdentityCandidate(index, identity) {
1848
+ const key = identityKeyFor(identity);
1849
+ if (key === void 0 || identity.version === void 0) return void 0;
1850
+ const matched = selectIdentityCandidate(index.get(key)) ?? selectDateStripped(index, identity, identity.version);
1851
+ if (matched === void 0) return void 0;
1852
+ return blockedBySizeQuirk(identity, matched) ? void 0 : matched;
1853
+ }
1854
+ function selectDateStripped(index, identity, version) {
1855
+ const vk = versionKey(version);
1856
+ if (!TRAILING_DATE_SEGMENT.test(vk)) return void 0;
1857
+ const stripped = vk.replace(TRAILING_DATE_SEGMENT, "");
1858
+ if (stripped.length === 0 || DATE_SEGMENT.test(stripped)) return void 0;
1859
+ const strippedKey = identityKeyFor({
1860
+ vendor: identity.vendor,
1861
+ family: identity.family,
1862
+ version: stripped
1863
+ });
1864
+ if (strippedKey === void 0) return void 0;
1865
+ return selectIdentityCandidate(index.get(strippedKey));
1866
+ }
1867
+ function blockedBySizeQuirk(identity, matched) {
1868
+ const sizeQuirks = identity.quirks.filter((q) => SIZE_TIER_QUIRKS.has(q));
1869
+ if (sizeQuirks.length === 0) return false;
1870
+ const canonicalQuirks = resolveModelIdentitySync(matched.id).quirks;
1871
+ return sizeQuirks.some((q) => !canonicalQuirks.includes(q));
1872
+ }
1844
1873
 
1845
1874
  // src/config/manifest-overlay.ts
1846
1875
  import { existsSync, readFileSync, statSync } from "fs";
@@ -2348,15 +2377,17 @@ var ModelRegistry = class {
2348
2377
  return direct;
2349
2378
  }
2350
2379
  if (direct === void 0) {
2351
- const fuzzy = this.lookupFuzzy(modelId, hints);
2380
+ const identity2 = resolveModelIdentitySync(modelId, hints);
2381
+ const fuzzy = this.lookupFuzzy(modelId, identity2, hints);
2352
2382
  if (fuzzy !== void 0) return fuzzy;
2383
+ return deriveEntry(modelId, identity2);
2353
2384
  }
2354
2385
  const identity = resolveModelIdentitySync(modelId, augmentHints(hints, direct));
2355
2386
  const derived = deriveEntry(modelId, identity);
2356
- if (direct !== void 0 && identity.vendor !== "unknown") {
2387
+ if (identity.vendor !== "unknown") {
2357
2388
  return mergeSnapshotWithDerived(direct, derived);
2358
2389
  }
2359
- return direct ?? derived;
2390
+ return direct;
2360
2391
  }
2361
2392
  /**
2362
2393
  * Has the registry got an authoritative entry for this id?
@@ -2390,21 +2421,23 @@ var ModelRegistry = class {
2390
2421
  * (a) retry `lookupExact` with the `normaliseModelId`-normalized id so
2391
2422
  * aliases + alias-shadow (#3293) keep working;
2392
2423
  * (b) identity-match {vendor, family, version} against the load-time
2393
- * index — version required on both sides, tier-ordered uniqueness,
2394
- * fail closed on ambiguity (see model-fuzzy-resolution.ts).
2424
+ * index — version required on both sides (ONE trailing date segment
2425
+ * tolerated on the decorated side, #4183), tier-ordered uniqueness,
2426
+ * fail closed on ambiguity and on sub-SKU size markers (see
2427
+ * model-fuzzy-resolution.ts).
2395
2428
  * Over-long ids skip the tier entirely (straight to derivation).
2429
+ * `identity` is the caller's already-resolved identity for `modelId`
2430
+ * (#4183 perf: resolved once per getEntry call).
2396
2431
  */
2397
- lookupFuzzy(modelId, hints) {
2432
+ lookupFuzzy(modelId, identity, hints) {
2398
2433
  if (modelId.length > MAX_FUZZY_ID_LENGTH) return void 0;
2399
2434
  const normalized = normaliseModelId(modelId);
2400
2435
  const byNormalized = normalized === modelId ? void 0 : this.lookupExact(normalized);
2401
2436
  if (byNormalized !== void 0) {
2402
2437
  return this.resolveMatched(byNormalized, modelId, hints, "normalized");
2403
2438
  }
2404
- const key = identityKeyFor(resolveModelIdentitySync(modelId, hints));
2405
- if (key === void 0) return void 0;
2406
2439
  this.identityIndex ??= buildIdentityIndex(this.byId.values());
2407
- const matched = selectIdentityCandidate(this.identityIndex.get(key));
2440
+ const matched = matchIdentityCandidate(this.identityIndex, identity);
2408
2441
  if (matched === void 0) return void 0;
2409
2442
  return this.resolveMatched(matched, modelId, hints, "identity");
2410
2443
  }
@@ -2501,7 +2534,7 @@ function setDefaultRegistry(registry) {
2501
2534
  }
2502
2535
  async function reloadDefaultRegistry() {
2503
2536
  globalRegistry = buildDefaultRegistry();
2504
- const { resetGlobalRegistry } = await import("./unified-registry-ZUPTC7OR.js");
2537
+ const { resetGlobalRegistry } = await import("./unified-registry-YXQGTU3P.js");
2505
2538
  resetGlobalRegistry();
2506
2539
  return globalRegistry;
2507
2540
  }
@@ -6142,6 +6175,8 @@ var LinUCBBandit = class {
6142
6175
  config;
6143
6176
  arms;
6144
6177
  armNames;
6178
+ /** Warm-start replay ledger keyed `arm model` (#4194). Telemetry only. */
6179
+ warmStartModelLedger = /* @__PURE__ */ new Map();
6145
6180
  constructor(armNames, config) {
6146
6181
  this.armNames = armNames;
6147
6182
  this.config = LinUCBConfigSchema.parse({
@@ -6332,10 +6367,33 @@ var LinUCBBandit = class {
6332
6367
  if (armIndex < 0) continue;
6333
6368
  const reward = outcome.success ? SUCCESS_REWARD : FAILURE_REWARD;
6334
6369
  this.update(armIndex, neutralContext, reward);
6370
+ this.recordWarmStartModelStat(outcome.cli, outcome.model, outcome.success);
6335
6371
  replayed++;
6336
6372
  }
6337
6373
  return replayed;
6338
6374
  }
6375
+ /** Accumulate the per-arm × per-model warm-start ledger (#4194). */
6376
+ recordWarmStartModelStat(arm, model, success) {
6377
+ const key = `${arm} ${model}`;
6378
+ const entry = this.warmStartModelLedger.get(key) ?? {
6379
+ arm,
6380
+ model,
6381
+ replayedCount: 0,
6382
+ successCount: 0
6383
+ };
6384
+ entry.replayedCount++;
6385
+ if (success) entry.successCount++;
6386
+ this.warmStartModelLedger.set(key, entry);
6387
+ }
6388
+ /**
6389
+ * Per-arm × per-model grouping of the outcomes replayed through
6390
+ * {@link warmStart} (#4194). A telemetry surface for per-model outcome
6391
+ * evaluation — arm structure and selection behavior are unchanged.
6392
+ * Sorted by arm, then model, for stable output.
6393
+ */
6394
+ getWarmStartModelStats() {
6395
+ return [...this.warmStartModelLedger.values()].map((s) => ({ ...s })).sort((a, b) => a.arm.localeCompare(b.arm) || a.model.localeCompare(b.model));
6396
+ }
6339
6397
  /**
6340
6398
  * Reset all arm statistics.
6341
6399
  */
@@ -6347,6 +6405,7 @@ var LinUCBBandit = class {
6347
6405
  arm.pullCount = 0;
6348
6406
  arm.cumulativeReward = 0;
6349
6407
  }
6408
+ this.warmStartModelLedger.clear();
6350
6409
  }
6351
6410
  };
6352
6411
 
@@ -12027,7 +12086,10 @@ function buildOptionalSections(input, cfg) {
12027
12086
  expertPerformance,
12028
12087
  swarmHealth: buildSwarmHealth(expertPerformance),
12029
12088
  triageStats: buildTriageStats(input),
12030
- recentWindow: buildRecentWindow(cfg)
12089
+ recentWindow: buildRecentWindow(cfg),
12090
+ // Per-model telemetry lens (#4194) — additive optional section; the
12091
+ // routing-visible adaptiveBonuses above stay CLI×category.
12092
+ modelWeather: getModelWeatherSummary(input, cfg)
12031
12093
  });
12032
12094
  }
12033
12095
  function generateWeatherReport(input, config, deps) {
@@ -12126,6 +12188,73 @@ function queryWithLookback(store, cli, category, cfg) {
12126
12188
  }
12127
12189
  return store.query({ cli, category, excludeQualitySignals: exclude });
12128
12190
  }
12191
+ var MODEL_WEATHER_MIN_SAMPLES = 5;
12192
+ var NON_MODEL_PLACEHOLDER_IDS = /* @__PURE__ */ new Set(["unknown", "pipeline"]);
12193
+ function isRealModelId(model) {
12194
+ return !NON_MODEL_PLACEHOLDER_IDS.has(model) && !model.startsWith(WORKER_MODEL_PREFIX);
12195
+ }
12196
+ function buildModelLensFilter(options) {
12197
+ return {
12198
+ ...options?.cli !== void 0 && { cli: options.cli },
12199
+ ...options?.category !== void 0 && { category: options.category },
12200
+ excludeQualitySignals: ["e2e-eval"]
12201
+ };
12202
+ }
12203
+ function getModelWeatherSummary(options, config) {
12204
+ const cfg = { ...createDefaultWeatherConfig(), ...config };
12205
+ const store = getOutcomeStore();
12206
+ const filter = buildModelLensFilter(options);
12207
+ const entries = [];
12208
+ for (const model of collectObservedModelIds(store, filter)) {
12209
+ const entry = buildModelWeatherEntry(store, model, filter, cfg);
12210
+ if (entry !== void 0) entries.push(entry);
12211
+ }
12212
+ return entries.sort((a, b) => b.sampleCount - a.sampleCount || a.model.localeCompare(b.model));
12213
+ }
12214
+ function collectObservedModelIds(store, filter) {
12215
+ const ids = /* @__PURE__ */ new Set();
12216
+ for (const o of store.query(filter)) {
12217
+ if (isRealModelId(o.model)) ids.add(o.model);
12218
+ }
12219
+ return [...ids];
12220
+ }
12221
+ function queryModelWithLookback(store, model, filter, cfg) {
12222
+ if (cfg.outcomeLookbackMs > 0) {
12223
+ const since = new Date(Date.now() - cfg.outcomeLookbackMs).toISOString();
12224
+ const windowed = store.queryByModelWithFamilyFallback(model, {
12225
+ threshold: MODEL_WEATHER_MIN_SAMPLES,
12226
+ extraFilter: { ...filter, since }
12227
+ });
12228
+ if (windowed.outcomes.length >= MODEL_WEATHER_MIN_SAMPLES) return windowed;
12229
+ }
12230
+ return store.queryByModelWithFamilyFallback(model, {
12231
+ threshold: MODEL_WEATHER_MIN_SAMPLES,
12232
+ extraFilter: filter
12233
+ });
12234
+ }
12235
+ function restrictFallbackScope(model, result) {
12236
+ if (result.scope !== "family") return { outcomes: result.outcomes, scope: "literal" };
12237
+ if (result.vendor !== "unknown" && result.family !== "unknown") {
12238
+ return { outcomes: result.outcomes, scope: "family" };
12239
+ }
12240
+ return { outcomes: result.outcomes.filter((o) => o.model === model), scope: "literal" };
12241
+ }
12242
+ function buildModelWeatherEntry(store, model, filter, cfg) {
12243
+ const result = queryModelWithLookback(store, model, filter, cfg);
12244
+ const { outcomes, scope } = restrictFallbackScope(model, result);
12245
+ if (outcomes.length < MODEL_WEATHER_MIN_SAMPLES) return void 0;
12246
+ const successes = outcomes.filter((o) => o.success).length;
12247
+ const totalDuration = outcomes.reduce((s, o) => s + o.durationMs, 0);
12248
+ return {
12249
+ model,
12250
+ vendor: result.vendor ?? "unknown",
12251
+ family: result.family ?? "unknown",
12252
+ scope,
12253
+ sampleCount: outcomes.length,
12254
+ successRate: round3(successes / outcomes.length),
12255
+ avgDurationMs: Math.round(totalDuration / outcomes.length)
12256
+ };
12257
+ }
12129
12258
  function getAdaptiveBonus(cli, category, config) {
12130
12259
  const cfg = { ...createDefaultWeatherConfig(), ...config };
12131
12260
  const store = getOutcomeStore();
@@ -13785,7 +13914,7 @@ var CompositeRouter = class _CompositeRouter {
13785
13914
  */
13786
13915
  async consultUnifiedContext(task) {
13787
13916
  try {
13788
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-MPZ7T4VA.js");
13917
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-Z474PNZ4.js");
13789
13918
  const ctx = await getContextForTask({
13790
13919
  task: task.content,
13791
13920
  category: inferTaskCategory(task.content),
@@ -15278,6 +15407,8 @@ export {
15278
15407
  rankStrategiesByManifest,
15279
15408
  generateWeatherReport,
15280
15409
  queryWithLookback,
15410
+ MODEL_WEATHER_MIN_SAMPLES,
15411
+ getModelWeatherSummary,
15281
15412
  getAdaptiveBonus,
15282
15413
  shouldExplore,
15283
15414
  getFallbackChainForCategory,
@@ -15288,4 +15419,4 @@ export {
15288
15419
  AgentCapability,
15289
15420
  OrchestratorError
15290
15421
  };
15291
- //# sourceMappingURL=chunk-Q4JNYY2Y.js.map
15422
+ //# sourceMappingURL=chunk-E7LG7L4O.js.map