nexus-agents 2.102.8 → 2.103.1

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 (115) hide show
  1. package/dist/{child-mcp-config-3FIENOGY.js → child-mcp-config-I7VKSEW2.js} +2 -2
  2. package/dist/{chunk-UXBZ346L.js → chunk-3GUCNISD.js} +2 -2
  3. package/dist/{chunk-CPGZRXY3.js → chunk-3UOFGQ2K.js} +3 -3
  4. package/dist/{chunk-IS2OUYGR.js → chunk-3VMTQCEH.js} +2 -2
  5. package/dist/{chunk-J524D5GA.js → chunk-4PWBF3NC.js} +2 -2
  6. package/dist/{chunk-HAKXSIBS.js → chunk-4VTJA7FE.js} +2 -2
  7. package/dist/{chunk-TLTWQAHI.js → chunk-5L5REFGE.js} +3 -3
  8. package/dist/{chunk-L3RP7STR.js → chunk-5ZK25ZWD.js} +4 -4
  9. package/dist/{chunk-ER6YMAZU.js → chunk-6E6MOJYY.js} +2 -2
  10. package/dist/{chunk-ZW6NKOXT.js → chunk-7P3FALEV.js} +2 -2
  11. package/dist/{chunk-WVZT4JGL.js → chunk-CB66XOZQ.js} +360 -212
  12. package/dist/chunk-CB66XOZQ.js.map +1 -0
  13. package/dist/{chunk-OIFFZHSV.js → chunk-DAOUGMA5.js} +4 -4
  14. package/dist/{chunk-47YAIGCP.js → chunk-FXPDPPYR.js} +2 -2
  15. package/dist/{chunk-ODN2O3XZ.js → chunk-G2FTEZDY.js} +123 -32
  16. package/dist/chunk-G2FTEZDY.js.map +1 -0
  17. package/dist/{chunk-EYIIQ7KE.js → chunk-GA2ZZERU.js} +15 -5
  18. package/dist/{chunk-EYIIQ7KE.js.map → chunk-GA2ZZERU.js.map} +1 -1
  19. package/dist/{chunk-WPGVI2F2.js → chunk-KSMYBMM6.js} +2 -2
  20. package/dist/{chunk-RHH75VON.js → chunk-L32OQDWK.js} +3 -3
  21. package/dist/{chunk-4CPPYUBW.js → chunk-MHVGM6NQ.js} +2 -2
  22. package/dist/{chunk-GUHVV3Q4.js → chunk-MMZ5IKQ3.js} +2 -2
  23. package/dist/{chunk-74QFV5ON.js → chunk-N35KBA5P.js} +3 -3
  24. package/dist/{chunk-2NSCF4PI.js → chunk-OMFKL3FZ.js} +7 -7
  25. package/dist/{chunk-JEOFSMRI.js → chunk-QQNM4YAL.js} +2 -2
  26. package/dist/{chunk-NBAARQC6.js → chunk-RDNEALPS.js} +7 -7
  27. package/dist/{chunk-VJFUIP6N.js → chunk-RWSRBLSA.js} +21 -2
  28. package/dist/{chunk-VJFUIP6N.js.map → chunk-RWSRBLSA.js.map} +1 -1
  29. package/dist/{chunk-P6TYLTER.js → chunk-TZ2YMIQV.js} +9 -9
  30. package/dist/{chunk-THUENUJA.js → chunk-U3GOPZIA.js} +2 -2
  31. package/dist/{chunk-GAX6YG5E.js → chunk-UB5S4II3.js} +2 -2
  32. package/dist/{chunk-PF7GV22M.js → chunk-ULKXWKNZ.js} +5 -5
  33. package/dist/{chunk-Q7FINCKE.js → chunk-VPPZ45IZ.js} +2 -2
  34. package/dist/{chunk-FYQ36FP3.js → chunk-WORMJT4K.js} +3 -3
  35. package/dist/{chunk-G3QQOU4H.js → chunk-XISM6YBY.js} +4 -4
  36. package/dist/{chunk-B73SAOST.js → chunk-Y5D6P5JV.js} +3 -3
  37. package/dist/{cli-circuit-breaker-VHAHRE2J.js → cli-circuit-breaker-M4LZW4RB.js} +4 -4
  38. package/dist/cli.js +40 -38
  39. package/dist/cli.js.map +1 -1
  40. package/dist/{composite-router-NQMFTZ6B.js → composite-router-CYGVTMW6.js} +2 -2
  41. package/dist/{consensus-vote-VGQW6LCB.js → consensus-vote-2ODNLCSS.js} +12 -12
  42. package/dist/{context-retriever-BE4DNAPM.js → context-retriever-VZ5HKPWX.js} +6 -6
  43. package/dist/{doctor-deep-7PN77HHM.js → doctor-deep-A3FHG7A7.js} +3 -3
  44. package/dist/{expert-bridge-HLSKV3PK.js → expert-bridge-GNHXRQEZ.js} +4 -4
  45. package/dist/{factory-PTEIJ2H2.js → factory-6PU24HFM.js} +5 -5
  46. package/dist/{factory-2A2CZPQR.js → factory-7ENY4JOE.js} +5 -5
  47. package/dist/{improvement-review-6EV2FWXI.js → improvement-review-6377XBPE.js} +4 -4
  48. package/dist/index.d.ts +14 -3
  49. package/dist/index.js +27 -27
  50. package/dist/{init-opencode-GZD26YXM.js → init-opencode-6UJPLOHE.js} +5 -5
  51. package/dist/{issue-triage-JGQTQVQI.js → issue-triage-YOFAEUGC.js} +5 -5
  52. package/dist/{pr-reviewer-helpers-SEA7L3XT.js → pr-reviewer-helpers-MK2ZFEEI.js} +4 -4
  53. package/dist/{registry-command-O5G5VII2.js → registry-command-JLAE6RAW.js} +2 -2
  54. package/dist/{repo-security-plan-6QUW6JW5.js → repo-security-plan-IGX7AS5P.js} +3 -3
  55. package/dist/{research-helpers-synthesize-2HHHQP5I.js → research-helpers-synthesize-B5KL3S4T.js} +3 -3
  56. package/dist/{routing-memory-SCPATSY6.js → routing-memory-7RKYQEHM.js} +2 -2
  57. package/dist/{session-memory-O77ISZYP.js → session-memory-S4SBPBP4.js} +3 -3
  58. package/dist/{setup-command-VZEAQM27.js → setup-command-KMGJM4V4.js} +10 -10
  59. package/dist/{setup-config-AKLJPGHL.js → setup-config-2DS2V65J.js} +3 -3
  60. package/dist/{setup-custom-api-PK5OLVW5.js → setup-custom-api-JVYDKH6Y.js} +4 -4
  61. package/dist/{tool-memory-KQ5N6GRC.js → tool-memory-4LVVNSVD.js} +5 -5
  62. package/dist/{weather-report-BUPURZ6J.js → weather-report-FUVJJPE4.js} +2 -2
  63. package/package.json +1 -1
  64. package/dist/chunk-ODN2O3XZ.js.map +0 -1
  65. package/dist/chunk-WVZT4JGL.js.map +0 -1
  66. /package/dist/{child-mcp-config-3FIENOGY.js.map → child-mcp-config-I7VKSEW2.js.map} +0 -0
  67. /package/dist/{chunk-UXBZ346L.js.map → chunk-3GUCNISD.js.map} +0 -0
  68. /package/dist/{chunk-CPGZRXY3.js.map → chunk-3UOFGQ2K.js.map} +0 -0
  69. /package/dist/{chunk-IS2OUYGR.js.map → chunk-3VMTQCEH.js.map} +0 -0
  70. /package/dist/{chunk-J524D5GA.js.map → chunk-4PWBF3NC.js.map} +0 -0
  71. /package/dist/{chunk-HAKXSIBS.js.map → chunk-4VTJA7FE.js.map} +0 -0
  72. /package/dist/{chunk-TLTWQAHI.js.map → chunk-5L5REFGE.js.map} +0 -0
  73. /package/dist/{chunk-L3RP7STR.js.map → chunk-5ZK25ZWD.js.map} +0 -0
  74. /package/dist/{chunk-ER6YMAZU.js.map → chunk-6E6MOJYY.js.map} +0 -0
  75. /package/dist/{chunk-ZW6NKOXT.js.map → chunk-7P3FALEV.js.map} +0 -0
  76. /package/dist/{chunk-OIFFZHSV.js.map → chunk-DAOUGMA5.js.map} +0 -0
  77. /package/dist/{chunk-47YAIGCP.js.map → chunk-FXPDPPYR.js.map} +0 -0
  78. /package/dist/{chunk-WPGVI2F2.js.map → chunk-KSMYBMM6.js.map} +0 -0
  79. /package/dist/{chunk-RHH75VON.js.map → chunk-L32OQDWK.js.map} +0 -0
  80. /package/dist/{chunk-4CPPYUBW.js.map → chunk-MHVGM6NQ.js.map} +0 -0
  81. /package/dist/{chunk-GUHVV3Q4.js.map → chunk-MMZ5IKQ3.js.map} +0 -0
  82. /package/dist/{chunk-74QFV5ON.js.map → chunk-N35KBA5P.js.map} +0 -0
  83. /package/dist/{chunk-2NSCF4PI.js.map → chunk-OMFKL3FZ.js.map} +0 -0
  84. /package/dist/{chunk-JEOFSMRI.js.map → chunk-QQNM4YAL.js.map} +0 -0
  85. /package/dist/{chunk-NBAARQC6.js.map → chunk-RDNEALPS.js.map} +0 -0
  86. /package/dist/{chunk-P6TYLTER.js.map → chunk-TZ2YMIQV.js.map} +0 -0
  87. /package/dist/{chunk-THUENUJA.js.map → chunk-U3GOPZIA.js.map} +0 -0
  88. /package/dist/{chunk-GAX6YG5E.js.map → chunk-UB5S4II3.js.map} +0 -0
  89. /package/dist/{chunk-PF7GV22M.js.map → chunk-ULKXWKNZ.js.map} +0 -0
  90. /package/dist/{chunk-Q7FINCKE.js.map → chunk-VPPZ45IZ.js.map} +0 -0
  91. /package/dist/{chunk-FYQ36FP3.js.map → chunk-WORMJT4K.js.map} +0 -0
  92. /package/dist/{chunk-G3QQOU4H.js.map → chunk-XISM6YBY.js.map} +0 -0
  93. /package/dist/{chunk-B73SAOST.js.map → chunk-Y5D6P5JV.js.map} +0 -0
  94. /package/dist/{cli-circuit-breaker-VHAHRE2J.js.map → cli-circuit-breaker-M4LZW4RB.js.map} +0 -0
  95. /package/dist/{composite-router-NQMFTZ6B.js.map → composite-router-CYGVTMW6.js.map} +0 -0
  96. /package/dist/{consensus-vote-VGQW6LCB.js.map → consensus-vote-2ODNLCSS.js.map} +0 -0
  97. /package/dist/{context-retriever-BE4DNAPM.js.map → context-retriever-VZ5HKPWX.js.map} +0 -0
  98. /package/dist/{doctor-deep-7PN77HHM.js.map → doctor-deep-A3FHG7A7.js.map} +0 -0
  99. /package/dist/{expert-bridge-HLSKV3PK.js.map → expert-bridge-GNHXRQEZ.js.map} +0 -0
  100. /package/dist/{factory-2A2CZPQR.js.map → factory-6PU24HFM.js.map} +0 -0
  101. /package/dist/{factory-PTEIJ2H2.js.map → factory-7ENY4JOE.js.map} +0 -0
  102. /package/dist/{improvement-review-6EV2FWXI.js.map → improvement-review-6377XBPE.js.map} +0 -0
  103. /package/dist/{init-opencode-GZD26YXM.js.map → init-opencode-6UJPLOHE.js.map} +0 -0
  104. /package/dist/{issue-triage-JGQTQVQI.js.map → issue-triage-YOFAEUGC.js.map} +0 -0
  105. /package/dist/{pr-reviewer-helpers-SEA7L3XT.js.map → pr-reviewer-helpers-MK2ZFEEI.js.map} +0 -0
  106. /package/dist/{registry-command-O5G5VII2.js.map → registry-command-JLAE6RAW.js.map} +0 -0
  107. /package/dist/{repo-security-plan-6QUW6JW5.js.map → repo-security-plan-IGX7AS5P.js.map} +0 -0
  108. /package/dist/{research-helpers-synthesize-2HHHQP5I.js.map → research-helpers-synthesize-B5KL3S4T.js.map} +0 -0
  109. /package/dist/{routing-memory-SCPATSY6.js.map → routing-memory-7RKYQEHM.js.map} +0 -0
  110. /package/dist/{session-memory-O77ISZYP.js.map → session-memory-S4SBPBP4.js.map} +0 -0
  111. /package/dist/{setup-command-VZEAQM27.js.map → setup-command-KMGJM4V4.js.map} +0 -0
  112. /package/dist/{setup-config-AKLJPGHL.js.map → setup-config-2DS2V65J.js.map} +0 -0
  113. /package/dist/{setup-custom-api-PK5OLVW5.js.map → setup-custom-api-JVYDKH6Y.js.map} +0 -0
  114. /package/dist/{tool-memory-KQ5N6GRC.js.map → tool-memory-4LVVNSVD.js.map} +0 -0
  115. /package/dist/{weather-report-BUPURZ6J.js.map → weather-report-FUVJJPE4.js.map} +0 -0
@@ -5,13 +5,13 @@ import {
5
5
  } from "./chunk-6T3EPABN.js";
6
6
  import {
7
7
  generateId
8
- } from "./chunk-WPGVI2F2.js";
8
+ } from "./chunk-KSMYBMM6.js";
9
9
  import {
10
10
  getMemoryRegistry
11
11
  } from "./chunk-PQHVC4BD.js";
12
12
  import {
13
13
  SessionMemory
14
- } from "./chunk-JEOFSMRI.js";
14
+ } from "./chunk-QQNM4YAL.js";
15
15
  import {
16
16
  ErrorCode,
17
17
  NexusError,
@@ -24,7 +24,7 @@ import {
24
24
  getTimeProvider,
25
25
  ok,
26
26
  setSharedMobiMemDbPathResolver
27
- } from "./chunk-EYIIQ7KE.js";
27
+ } from "./chunk-GA2ZZERU.js";
28
28
  import {
29
29
  nexusDataPath
30
30
  } from "./chunk-CH7QIDHQ.js";
@@ -5612,4 +5612,4 @@ export {
5612
5612
  reinitializeMemoryBackends,
5613
5613
  ToolMemoryManager
5614
5614
  };
5615
- //# sourceMappingURL=chunk-OIFFZHSV.js.map
5615
+ //# sourceMappingURL=chunk-DAOUGMA5.js.map
@@ -2,7 +2,7 @@ import {
2
2
  ConfigError,
3
3
  err,
4
4
  ok
5
- } from "./chunk-EYIIQ7KE.js";
5
+ } from "./chunk-GA2ZZERU.js";
6
6
 
7
7
  // src/adapters/sdk/types.ts
8
8
  var PROVIDER_ENV_KEYS = {
@@ -117,4 +117,4 @@ export {
117
117
  CUSTOM_API_ALLOW_PRIVATE_ENV,
118
118
  validateCustomApiBaseUrl
119
119
  };
120
- //# sourceMappingURL=chunk-47YAIGCP.js.map
120
+ //# sourceMappingURL=chunk-FXPDPPYR.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  CliCircuitBreaker,
3
3
  DEFAULT_CIRCUIT_BREAKER_CONFIG
4
- } from "./chunk-J524D5GA.js";
4
+ } from "./chunk-4PWBF3NC.js";
5
5
  import {
6
6
  generateHyphenId
7
- } from "./chunk-WPGVI2F2.js";
7
+ } from "./chunk-KSMYBMM6.js";
8
8
  import {
9
9
  CLI_SUBPROCESS_TIMEOUTS,
10
10
  CLI_TIMEOUTS,
@@ -25,9 +25,11 @@ import {
25
25
  getOutcomeStore,
26
26
  getRandomProvider,
27
27
  getTimeProvider,
28
+ isDynamicModelsEnabled,
28
29
  isRateLimitText,
30
+ loadModelsDevSnapshot,
29
31
  ok
30
- } from "./chunk-EYIIQ7KE.js";
32
+ } from "./chunk-GA2ZZERU.js";
31
33
 
32
34
  // src/cli-adapters/subprocess-adapter.ts
33
35
  import { spawn } from "child_process";
@@ -382,8 +384,8 @@ var BaseCliAdapter = class {
382
384
  initialized = false;
383
385
  lastHealthCheck;
384
386
  cachedVersion;
385
- constructor(logger5) {
386
- this.logger = logger5 ?? createLogger({ component: "cli-adapter" });
387
+ constructor(logger6) {
388
+ this.logger = logger6 ?? createLogger({ component: "cli-adapter" });
387
389
  }
388
390
  /**
389
391
  * Initializes the capacity tracker.
@@ -1403,6 +1405,36 @@ var ClaudeResponseParser = class {
1403
1405
  }
1404
1406
  };
1405
1407
 
1408
+ // src/config/models-dev-by-vendor.ts
1409
+ var logger2 = createLogger({ component: "models-dev-by-vendor" });
1410
+ var CLI_TO_MODELSDEV_VENDOR = {
1411
+ claude: "anthropic",
1412
+ codex: "openai",
1413
+ gemini: "google"
1414
+ };
1415
+ var cached = null;
1416
+ function loadEntries() {
1417
+ if (cached !== null) return cached;
1418
+ try {
1419
+ const { entries } = loadModelsDevSnapshot();
1420
+ cached = entries.map((e) => ({ id: e.id, vendor: e.vendor }));
1421
+ } catch (error) {
1422
+ logger2.debug("models.dev snapshot load failed; enumeration empty", {
1423
+ error: error instanceof Error ? error.message : String(error)
1424
+ });
1425
+ cached = [];
1426
+ }
1427
+ return cached;
1428
+ }
1429
+ function listModelsByVendor(vendor) {
1430
+ return loadEntries().filter((e) => e.vendor === vendor).map((e) => ({ id: e.id }));
1431
+ }
1432
+ function listModelsForCli(cliName) {
1433
+ const vendor = CLI_TO_MODELSDEV_VENDOR[cliName];
1434
+ if (vendor === void 0) return [];
1435
+ return listModelsByVendor(vendor).map((m) => ({ id: m.id, provider: vendor }));
1436
+ }
1437
+
1406
1438
  // src/cli-adapters/adapters/claude-adapter.ts
1407
1439
  var MODEL_TO_CLI_ALIAS = buildClaudeAliasMap();
1408
1440
  function buildClaudeAliasMap() {
@@ -1428,6 +1460,14 @@ var ClaudeCliAdapter = class extends SubprocessCliAdapter {
1428
1460
  super(options?.logger);
1429
1461
  this.model = options?.model ?? getCliModelName(getDefaultModelForCli("claude"));
1430
1462
  }
1463
+ /**
1464
+ * Key-free model enumeration (#3405): the claude CLI has no list-models
1465
+ * command and its OAuth token can't call /v1/models, so we enumerate the
1466
+ * vendor's models from the models.dev snapshot. Existence only.
1467
+ */
1468
+ listModels() {
1469
+ return Promise.resolve(listModelsForCli(this.name));
1470
+ }
1431
1471
  /**
1432
1472
  * Gets Claude model information.
1433
1473
  * `buildModelInfo` matches `cliModelName`, `cliAlias`, and `aliases[]` —
@@ -1502,10 +1542,10 @@ function aggregateModelTokens(models) {
1502
1542
  if (tokens === null) continue;
1503
1543
  const input = extractNumberField(tokens, "input");
1504
1544
  const candidates = extractNumberField(tokens, "candidates");
1505
- const cached = extractNumberField(tokens, "cached");
1545
+ const cached2 = extractNumberField(tokens, "cached");
1506
1546
  if (input !== null) totalInput += input;
1507
1547
  if (candidates !== null) totalOutput += candidates;
1508
- if (cached !== null) totalCached += cached;
1548
+ if (cached2 !== null) totalCached += cached2;
1509
1549
  }
1510
1550
  return { input: totalInput, output: totalOutput, cached: totalCached };
1511
1551
  }
@@ -1797,6 +1837,10 @@ var GeminiCliAdapter = class extends SubprocessCliAdapter {
1797
1837
  this.circuitBreaker = null;
1798
1838
  }
1799
1839
  }
1840
+ /** Key-free model enumeration via the models.dev snapshot (#3405). */
1841
+ listModels() {
1842
+ return Promise.resolve(listModelsForCli(this.name));
1843
+ }
1800
1844
  /**
1801
1845
  * Gets Gemini model information.
1802
1846
  * Resolves from canonical registry when possible, falls back to legacy lookup.
@@ -1933,7 +1977,7 @@ import { tmpdir as tmpdir2 } from "os";
1933
1977
  import { join as join2 } from "path";
1934
1978
 
1935
1979
  // src/cli-adapters/parsers/codex-parser.ts
1936
- var logger2 = createLogger({ component: "codex-parser" });
1980
+ var logger3 = createLogger({ component: "codex-parser" });
1937
1981
  var CodexResponseParser = class {
1938
1982
  name = "codex-parser";
1939
1983
  supportedVersionRange = ">=0.70.0 <1.0.0";
@@ -1985,7 +2029,7 @@ var CodexResponseParser = class {
1985
2029
  if (usage !== null) setUsage(usage);
1986
2030
  }
1987
2031
  } catch {
1988
- logger2.debug("Skipped malformed NDJSON line", { snippet: line.slice(0, 100) });
2032
+ logger3.debug("Skipped malformed NDJSON line", { snippet: line.slice(0, 100) });
1989
2033
  }
1990
2034
  }
1991
2035
  /**
@@ -2014,7 +2058,7 @@ var CodexResponseParser = class {
2014
2058
  return this.extractUsageFromEvent(record);
2015
2059
  }
2016
2060
  } catch {
2017
- logger2.debug("Skipped malformed NDJSON line", { snippet: line.slice(0, 100) });
2061
+ logger3.debug("Skipped malformed NDJSON line", { snippet: line.slice(0, 100) });
2018
2062
  continue;
2019
2063
  }
2020
2064
  }
@@ -2038,7 +2082,7 @@ var CodexResponseParser = class {
2038
2082
  }
2039
2083
  }
2040
2084
  } catch {
2041
- logger2.debug("Skipped malformed NDJSON line", { snippet: line.slice(0, 100) });
2085
+ logger3.debug("Skipped malformed NDJSON line", { snippet: line.slice(0, 100) });
2042
2086
  continue;
2043
2087
  }
2044
2088
  }
@@ -2112,6 +2156,10 @@ var CodexCliAdapter = class extends SubprocessCliAdapter {
2112
2156
  super(options?.logger);
2113
2157
  this.model = options?.model ?? getCliModelName(getDefaultModelForCli("codex"));
2114
2158
  }
2159
+ /** Key-free model enumeration via the models.dev snapshot (#3405). */
2160
+ listModels() {
2161
+ return Promise.resolve(listModelsForCli(this.name));
2162
+ }
2115
2163
  /**
2116
2164
  * Gets Codex model information.
2117
2165
  * Resolves from canonical registry when possible, falls back to legacy lookup.
@@ -2365,7 +2413,7 @@ var CodexMcpAdapter = class extends BaseCliAdapter {
2365
2413
  import { execFile } from "child_process";
2366
2414
 
2367
2415
  // src/cli-adapters/parsers/opencode-parser.ts
2368
- var logger3 = createLogger({ component: "opencode-parser" });
2416
+ var logger4 = createLogger({ component: "opencode-parser" });
2369
2417
  var PLAINTEXT_MIN_LENGTH = 10;
2370
2418
  function looksLikeNdjson(text) {
2371
2419
  const lines = text.split("\n").filter((l) => l.trim() !== "");
@@ -2435,7 +2483,7 @@ var OpenCodeResponseParser = class {
2435
2483
  state.usage
2436
2484
  );
2437
2485
  }
2438
- logger3.debug("No NDJSON content extracted, trying JSON fallback", {
2486
+ logger4.debug("No NDJSON content extracted, trying JSON fallback", {
2439
2487
  rawLength: raw.length,
2440
2488
  lineCount,
2441
2489
  hasStepEvents: state.hasStepEvents,
@@ -2458,7 +2506,7 @@ var OpenCodeResponseParser = class {
2458
2506
  extractResponse(raw) {
2459
2507
  const parsed = this.parse(raw);
2460
2508
  if (parsed === null || parsed.content === "") {
2461
- logger3.debug("extractResponse returned null", {
2509
+ logger4.debug("extractResponse returned null", {
2462
2510
  rawLength: raw.length,
2463
2511
  snippet: raw.slice(0, 100),
2464
2512
  parsedNull: parsed === null
@@ -2532,7 +2580,7 @@ var OpenCodeResponseParser = class {
2532
2580
  this.processLegacyEvent(record, collectors.contentParts, setSessionId, setUsage);
2533
2581
  return false;
2534
2582
  } catch {
2535
- logger3.debug("Skipped malformed NDJSON line", {
2583
+ logger4.debug("Skipped malformed NDJSON line", {
2536
2584
  lineNumber: lineIndex + 1,
2537
2585
  snippet: line.slice(0, 100)
2538
2586
  });
@@ -2573,7 +2621,7 @@ var OpenCodeResponseParser = class {
2573
2621
  if (errorObj === null) return;
2574
2622
  const data = asRecord(errorObj.data);
2575
2623
  const message = data !== null && typeof data.message === "string" ? data.message : typeof errorObj.name === "string" ? errorObj.name : "Unknown error";
2576
- logger3.warn("OpenCode returned error event", { message });
2624
+ logger4.warn("OpenCode returned error event", { message });
2577
2625
  errorMessages.push(message);
2578
2626
  }
2579
2627
  /** Processes legacy assumed event types. */
@@ -2685,17 +2733,17 @@ var OpenCodeResponseParser = class {
2685
2733
  parsePlaintext(raw, hasAnyRecognizedEvent) {
2686
2734
  const trimmed = raw.trim();
2687
2735
  if (trimmed.length < PLAINTEXT_MIN_LENGTH) {
2688
- logger3.debug("Plaintext fallback rejected: too short", { length: trimmed.length });
2736
+ logger4.debug("Plaintext fallback rejected: too short", { length: trimmed.length });
2689
2737
  return null;
2690
2738
  }
2691
2739
  if (looksLikeNdjson(trimmed)) {
2692
2740
  if (hasAnyRecognizedEvent) {
2693
- logger3.debug("Plaintext fallback rejected: recognized NDJSON with no content", {
2741
+ logger4.debug("Plaintext fallback rejected: recognized NDJSON with no content", {
2694
2742
  length: trimmed.length
2695
2743
  });
2696
2744
  return null;
2697
2745
  }
2698
- logger3.debug("Plaintext fallback: accepting malformed NDJSON as text", {
2746
+ logger4.debug("Plaintext fallback: accepting malformed NDJSON as text", {
2699
2747
  length: trimmed.length
2700
2748
  });
2701
2749
  }
@@ -2718,8 +2766,41 @@ var OpenCodeResponseParser = class {
2718
2766
  }
2719
2767
  };
2720
2768
 
2769
+ // src/config/resolve-live-model.ts
2770
+ function splitTier(id) {
2771
+ const colon = id.indexOf(":");
2772
+ return colon >= 0 ? { base: id.slice(0, colon), tier: id.slice(colon) } : { base: id, tier: "" };
2773
+ }
2774
+ function isTokenBoundaryPrefix(prefix, full) {
2775
+ if (prefix.length > full.length || !full.startsWith(prefix)) return false;
2776
+ if (full.length === prefix.length) return true;
2777
+ const next = full[prefix.length];
2778
+ return next === "-" || next === "/";
2779
+ }
2780
+ function resolveLiveModelId(configured, available) {
2781
+ const set = available instanceof Set ? available : new Set(available);
2782
+ if (set.size === 0 || set.has(configured)) return configured;
2783
+ const slash = configured.indexOf("/");
2784
+ const providerPrefix = slash > 0 ? configured.slice(0, slash + 1) : "";
2785
+ const cfg = splitTier(configured);
2786
+ const candidates = [...set].filter((c) => providerPrefix === "" || c.startsWith(providerPrefix)).map((c) => splitTier(c)).filter((cand) => isTokenBoundaryPrefix(cand.base, cfg.base)).map((cand) => ({
2787
+ id: cand.base + cand.tier,
2788
+ baseLen: cand.base.length,
2789
+ tierMatch: cand.tier === cfg.tier
2790
+ }));
2791
+ if (candidates.length === 0) return configured;
2792
+ candidates.sort(
2793
+ (a, b) => b.baseLen - a.baseLen || // most-specific simplification (closest to configured)
2794
+ Number(b.tierMatch) - Number(a.tierMatch) || // matching :free / paid tier
2795
+ a.id.length - b.id.length || // shorter overall
2796
+ (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)
2797
+ // lexicographic — fully deterministic
2798
+ );
2799
+ return candidates[0]?.id ?? configured;
2800
+ }
2801
+
2721
2802
  // src/cli-adapters/adapters/opencode-adapter.ts
2722
- var logger4 = createLogger({ component: "opencode-adapter" });
2803
+ var logger5 = createLogger({ component: "opencode-adapter" });
2723
2804
  var ALLOWED_VARIANTS = ["high", "max", "minimal"];
2724
2805
  var MODEL_TO_CLI_NAME = buildOpenCodeAliasMap();
2725
2806
  function buildOpenCodeAliasMap() {
@@ -2746,7 +2827,7 @@ function probeAvailableModels() {
2746
2827
  probePromise = new Promise((resolve) => {
2747
2828
  execFile("opencode", ["models"], { timeout: PROBE_TIMEOUT_MS }, (error, stdout) => {
2748
2829
  if (error !== null || stdout.trim() === "") {
2749
- logger4.debug("Failed to probe OpenCode models, will omit --model flag", {
2830
+ logger5.debug("Failed to probe OpenCode models, will omit --model flag", {
2750
2831
  error: error?.message
2751
2832
  });
2752
2833
  cachedModels = /* @__PURE__ */ new Set();
@@ -2756,7 +2837,7 @@ function probeAvailableModels() {
2756
2837
  const models = new Set(
2757
2838
  stdout.trim().split("\n").map((l) => l.trim()).filter((l) => l.length > 0)
2758
2839
  );
2759
- logger4.debug("Probed OpenCode models", { count: models.size });
2840
+ logger5.debug("Probed OpenCode models", { count: models.size });
2760
2841
  cachedModels = models;
2761
2842
  resolve(cachedModels);
2762
2843
  });
@@ -2771,7 +2852,7 @@ function warnIfAnthropicProvider(models) {
2771
2852
  (m) => ANTHROPIC_MODEL_PATTERNS.some((p) => m.toLowerCase().includes(p))
2772
2853
  );
2773
2854
  if (anthropicModels.length > 0) {
2774
- logger4.warn(
2855
+ logger5.warn(
2775
2856
  "OpenCode has Anthropic/Claude models configured. Ensure these use a SEPARATE API key from console.anthropic.com, NOT a Claude Code subscription key (which is restricted to Claude Code only).",
2776
2857
  { detectedModels: anthropicModels }
2777
2858
  );
@@ -2817,14 +2898,24 @@ var OpenCodeCliAdapter = class extends SubprocessCliAdapter {
2817
2898
  if (this.availableModels === void 0 || this.availableModels.size === 0) return false;
2818
2899
  return this.availableModels.has(cliModel);
2819
2900
  }
2820
- /** Appends --model if the resolved model is available (#1402). */
2901
+ /** Appends --model if the resolved model is available (#1402, #3407). */
2821
2902
  appendModelArg(args, task) {
2822
2903
  const internalModel = task.model ?? this.model;
2823
- const cliModel = resolveOpenCodeModel(internalModel);
2904
+ let cliModel = resolveOpenCodeModel(internalModel);
2905
+ if (!this.isModelAvailable(cliModel) && isDynamicModelsEnabled() && this.availableModels !== void 0) {
2906
+ const resolved = resolveLiveModelId(cliModel, this.availableModels);
2907
+ if (resolved !== cliModel) {
2908
+ logger5.debug("Resolved stale model to live alias (#3407)", {
2909
+ from: cliModel,
2910
+ to: resolved
2911
+ });
2912
+ cliModel = resolved;
2913
+ }
2914
+ }
2824
2915
  if (this.isModelAvailable(cliModel)) {
2825
2916
  args.push("--model", cliModel);
2826
2917
  } else {
2827
- logger4.debug("Model not available, using OpenCode default", {
2918
+ logger5.debug("Model not available, using OpenCode default", {
2828
2919
  requested: cliModel,
2829
2920
  available: this.availableModels?.size ?? 0
2830
2921
  });
@@ -3229,9 +3320,9 @@ function createCodexAdapter(transport, options) {
3229
3320
  }
3230
3321
  return new CodexMcpAdapter(options);
3231
3322
  }
3232
- function createAllAdapters(logger5, codexTransport = "mcp") {
3323
+ function createAllAdapters(logger6, codexTransport = "mcp") {
3233
3324
  const adapters = /* @__PURE__ */ new Map();
3234
- const options = logger5 !== void 0 ? { logger: logger5 } : void 0;
3325
+ const options = logger6 !== void 0 ? { logger: logger6 } : void 0;
3235
3326
  adapters.set("claude", new ClaudeCliAdapter(options));
3236
3327
  adapters.set("gemini", new GeminiCliAdapter(options));
3237
3328
  adapters.set("codex", createCodexAdapter(codexTransport, options ?? {}));
@@ -3240,9 +3331,9 @@ function createAllAdapters(logger5, codexTransport = "mcp") {
3240
3331
  }
3241
3332
  async function isCliAvailable(cli, cache) {
3242
3333
  if (cache !== void 0) {
3243
- const cached = cache.get(cli);
3244
- if (cached !== void 0) {
3245
- return cached.healthy;
3334
+ const cached2 = cache.get(cli);
3335
+ if (cached2 !== void 0) {
3336
+ return cached2.healthy;
3246
3337
  }
3247
3338
  }
3248
3339
  try {
@@ -3327,4 +3418,4 @@ export {
3327
3418
  isCliAvailable,
3328
3419
  getAvailableClis
3329
3420
  };
3330
- //# sourceMappingURL=chunk-ODN2O3XZ.js.map
3421
+ //# sourceMappingURL=chunk-G2FTEZDY.js.map