agent-nuvira 3.4.0 → 3.5.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 (194) hide show
  1. package/README.md +13 -13
  2. package/dist/agent-sdk/src/register.d.ts +23 -7
  3. package/dist/agent-sdk/src/register.d.ts.map +1 -1
  4. package/dist/agent-sdk/src/register.js +159 -5
  5. package/dist/agent-sdk/src/register.js.map +1 -1
  6. package/dist/agent-sdk/src/scaffold.d.ts +1 -1
  7. package/dist/agent-sdk/src/scaffold.js +1 -1
  8. package/dist/cli/agent.d.ts.map +1 -1
  9. package/dist/cli/agent.js +16 -3
  10. package/dist/cli/agent.js.map +1 -1
  11. package/dist/cli/chat.d.ts +202 -6
  12. package/dist/cli/chat.d.ts.map +1 -1
  13. package/dist/cli/chat.js +805 -34
  14. package/dist/cli/chat.js.map +1 -1
  15. package/dist/cli/config.d.ts +10 -0
  16. package/dist/cli/config.d.ts.map +1 -1
  17. package/dist/cli/config.js +39 -0
  18. package/dist/cli/config.js.map +1 -1
  19. package/dist/cli/doctor.d.ts.map +1 -1
  20. package/dist/cli/doctor.js +18 -3
  21. package/dist/cli/doctor.js.map +1 -1
  22. package/dist/cli/duties.d.ts +11 -0
  23. package/dist/cli/duties.d.ts.map +1 -1
  24. package/dist/cli/duties.js +31 -0
  25. package/dist/cli/duties.js.map +1 -1
  26. package/dist/cli/mcp.d.ts +50 -0
  27. package/dist/cli/mcp.d.ts.map +1 -1
  28. package/dist/cli/mcp.js +496 -49
  29. package/dist/cli/mcp.js.map +1 -1
  30. package/dist/cli/memory.d.ts.map +1 -1
  31. package/dist/cli/memory.js +3 -2
  32. package/dist/cli/memory.js.map +1 -1
  33. package/dist/cli/models.d.ts.map +1 -1
  34. package/dist/cli/models.js +55 -0
  35. package/dist/cli/models.js.map +1 -1
  36. package/dist/cli/plugins.d.ts.map +1 -1
  37. package/dist/cli/plugins.js +26 -9
  38. package/dist/cli/plugins.js.map +1 -1
  39. package/dist/cli/sdk.d.ts.map +1 -1
  40. package/dist/cli/sdk.js +10 -3
  41. package/dist/cli/sdk.js.map +1 -1
  42. package/dist/cli/tool-install-prompt.d.ts.map +1 -1
  43. package/dist/cli/tool-install-prompt.js +23 -1
  44. package/dist/cli/tool-install-prompt.js.map +1 -1
  45. package/dist/cli/tools.d.ts +16 -0
  46. package/dist/cli/tools.d.ts.map +1 -1
  47. package/dist/cli/tools.js +101 -1
  48. package/dist/cli/tools.js.map +1 -1
  49. package/dist/config/manager.d.ts +6 -0
  50. package/dist/config/manager.d.ts.map +1 -1
  51. package/dist/config/manager.js +66 -0
  52. package/dist/config/manager.js.map +1 -1
  53. package/dist/config/types.d.ts +18 -0
  54. package/dist/config/types.d.ts.map +1 -1
  55. package/dist/index.d.ts +2 -2
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +4 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/learning/auto-router.d.ts +28 -0
  60. package/dist/learning/auto-router.d.ts.map +1 -1
  61. package/dist/learning/auto-router.js +84 -5
  62. package/dist/learning/auto-router.js.map +1 -1
  63. package/dist/learning/duty-lease.d.ts +163 -0
  64. package/dist/learning/duty-lease.d.ts.map +1 -0
  65. package/dist/learning/duty-lease.js +301 -0
  66. package/dist/learning/duty-lease.js.map +1 -0
  67. package/dist/learning/exhaustion-report.d.ts +12 -0
  68. package/dist/learning/exhaustion-report.d.ts.map +1 -1
  69. package/dist/learning/exhaustion-report.js +3 -1
  70. package/dist/learning/exhaustion-report.js.map +1 -1
  71. package/dist/learning/model-capability.d.ts +33 -0
  72. package/dist/learning/model-capability.d.ts.map +1 -1
  73. package/dist/learning/model-capability.js +51 -0
  74. package/dist/learning/model-capability.js.map +1 -1
  75. package/dist/learning/model-first-router.d.ts +21 -22
  76. package/dist/learning/model-first-router.d.ts.map +1 -1
  77. package/dist/learning/model-first-router.js +61 -54
  78. package/dist/learning/model-first-router.js.map +1 -1
  79. package/dist/learning/model-selection.d.ts +27 -0
  80. package/dist/learning/model-selection.d.ts.map +1 -1
  81. package/dist/learning/model-selection.js +46 -0
  82. package/dist/learning/model-selection.js.map +1 -1
  83. package/dist/learning/model-warmup.d.ts +92 -0
  84. package/dist/learning/model-warmup.d.ts.map +1 -1
  85. package/dist/learning/model-warmup.js +137 -2
  86. package/dist/learning/model-warmup.js.map +1 -1
  87. package/dist/learning/reasoning-trace.d.ts +1 -1
  88. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  89. package/dist/learning/reasoning-trace.js.map +1 -1
  90. package/dist/learning/resilient-call.d.ts +15 -1
  91. package/dist/learning/resilient-call.d.ts.map +1 -1
  92. package/dist/learning/resilient-call.js +38 -22
  93. package/dist/learning/resilient-call.js.map +1 -1
  94. package/dist/learning/retry-patience.d.ts +139 -0
  95. package/dist/learning/retry-patience.d.ts.map +1 -0
  96. package/dist/learning/retry-patience.js +169 -0
  97. package/dist/learning/retry-patience.js.map +1 -0
  98. package/dist/learning/working-state.d.ts +7 -0
  99. package/dist/learning/working-state.d.ts.map +1 -1
  100. package/dist/learning/working-state.js +23 -1
  101. package/dist/learning/working-state.js.map +1 -1
  102. package/dist/mcp/catalog.d.ts +206 -26
  103. package/dist/mcp/catalog.d.ts.map +1 -1
  104. package/dist/mcp/catalog.js +664 -52
  105. package/dist/mcp/catalog.js.map +1 -1
  106. package/dist/mcp/client.d.ts +6 -0
  107. package/dist/mcp/client.d.ts.map +1 -1
  108. package/dist/mcp/client.js +35 -5
  109. package/dist/mcp/client.js.map +1 -1
  110. package/dist/mcp/custom-server.d.ts +120 -0
  111. package/dist/mcp/custom-server.d.ts.map +1 -0
  112. package/dist/mcp/custom-server.js +330 -0
  113. package/dist/mcp/custom-server.js.map +1 -0
  114. package/dist/mcp/manager.d.ts +9 -1
  115. package/dist/mcp/manager.d.ts.map +1 -1
  116. package/dist/mcp/manager.js +15 -2
  117. package/dist/mcp/manager.js.map +1 -1
  118. package/dist/mcp/mcp-oauth.d.ts +28 -0
  119. package/dist/mcp/mcp-oauth.d.ts.map +1 -1
  120. package/dist/mcp/mcp-oauth.js +63 -8
  121. package/dist/mcp/mcp-oauth.js.map +1 -1
  122. package/dist/mcp/oauth-authorize.d.ts +51 -0
  123. package/dist/mcp/oauth-authorize.d.ts.map +1 -0
  124. package/dist/mcp/oauth-authorize.js +133 -0
  125. package/dist/mcp/oauth-authorize.js.map +1 -0
  126. package/dist/mcp/oauth-connect.d.ts +53 -0
  127. package/dist/mcp/oauth-connect.d.ts.map +1 -0
  128. package/dist/mcp/oauth-connect.js +103 -0
  129. package/dist/mcp/oauth-connect.js.map +1 -0
  130. package/dist/mcp/pin-verifier.d.ts +44 -0
  131. package/dist/mcp/pin-verifier.d.ts.map +1 -0
  132. package/dist/mcp/pin-verifier.js +102 -0
  133. package/dist/mcp/pin-verifier.js.map +1 -0
  134. package/dist/mcp/prereqs.d.ts +145 -0
  135. package/dist/mcp/prereqs.d.ts.map +1 -0
  136. package/dist/mcp/prereqs.js +245 -0
  137. package/dist/mcp/prereqs.js.map +1 -0
  138. package/dist/mcp/runtime.d.ts +59 -0
  139. package/dist/mcp/runtime.d.ts.map +1 -0
  140. package/dist/mcp/runtime.js +77 -0
  141. package/dist/mcp/runtime.js.map +1 -0
  142. package/dist/mcp/server.d.ts +21 -0
  143. package/dist/mcp/server.d.ts.map +1 -1
  144. package/dist/mcp/server.js +29 -1
  145. package/dist/mcp/server.js.map +1 -1
  146. package/dist/mcp/settings.d.ts +164 -0
  147. package/dist/mcp/settings.d.ts.map +1 -0
  148. package/dist/mcp/settings.js +358 -0
  149. package/dist/mcp/settings.js.map +1 -0
  150. package/dist/mcp/types.d.ts +62 -0
  151. package/dist/mcp/types.d.ts.map +1 -1
  152. package/dist/mcp/types.js.map +1 -1
  153. package/dist/memory/vector-store.d.ts +12 -0
  154. package/dist/memory/vector-store.d.ts.map +1 -1
  155. package/dist/memory/vector-store.js +23 -0
  156. package/dist/memory/vector-store.js.map +1 -1
  157. package/dist/plugins/agent-plugin.d.ts +35 -0
  158. package/dist/plugins/agent-plugin.d.ts.map +1 -1
  159. package/dist/plugins/agent-plugin.js +142 -24
  160. package/dist/plugins/agent-plugin.js.map +1 -1
  161. package/dist/sandbox/manager.d.ts +12 -0
  162. package/dist/sandbox/manager.d.ts.map +1 -1
  163. package/dist/sandbox/manager.js +43 -2
  164. package/dist/sandbox/manager.js.map +1 -1
  165. package/dist/tools/modality/browser.d.ts +39 -3
  166. package/dist/tools/modality/browser.d.ts.map +1 -1
  167. package/dist/tools/modality/browser.js +113 -16
  168. package/dist/tools/modality/browser.js.map +1 -1
  169. package/dist/tools/optional-deps.d.ts +48 -0
  170. package/dist/tools/optional-deps.d.ts.map +1 -0
  171. package/dist/tools/optional-deps.js +42 -0
  172. package/dist/tools/optional-deps.js.map +1 -0
  173. package/dist/tools/registry.d.ts.map +1 -1
  174. package/dist/tools/registry.js +68 -11
  175. package/dist/tools/registry.js.map +1 -1
  176. package/dist/tools/remediation-ladder.d.ts.map +1 -1
  177. package/dist/tools/remediation-ladder.js +9 -1
  178. package/dist/tools/remediation-ladder.js.map +1 -1
  179. package/dist/tools/tool-loop.d.ts +41 -3
  180. package/dist/tools/tool-loop.d.ts.map +1 -1
  181. package/dist/tools/tool-loop.js +317 -9
  182. package/dist/tools/tool-loop.js.map +1 -1
  183. package/dist/web-dashboard/chat-retry.d.ts +11 -1
  184. package/dist/web-dashboard/chat-retry.d.ts.map +1 -1
  185. package/dist/web-dashboard/chat-retry.js +18 -4
  186. package/dist/web-dashboard/chat-retry.js.map +1 -1
  187. package/dist/web-dashboard/server.d.ts.map +1 -1
  188. package/dist/web-dashboard/server.js +349 -2
  189. package/dist/web-dashboard/server.js.map +1 -1
  190. package/package.json +6 -2
  191. package/src/web-dashboard/public/assets/{index-DeD3L0kG.js → index-Bik91KJh.js} +115 -89
  192. package/src/web-dashboard/public/assets/index-Bik91KJh.js.map +1 -0
  193. package/src/web-dashboard/public/index.html +1 -1
  194. package/src/web-dashboard/public/assets/index-DeD3L0kG.js.map +0 -1
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Duty leases — one holder per named background duty, across processes, with no
3
+ * daemon and no supervisor.
4
+ *
5
+ * THE PROBLEM. The background duties (the warmup sweep, the verify-next run,
6
+ * session-start checks) are all "one of these should happen periodically", and
7
+ * every process that starts is willing to do it. So two CLI runs, or a CLI run
8
+ * plus the dashboard, or a long-lived gateway plus a manual `models warm`, each
9
+ * spend the SAME free-tier budget on the SAME candidates — and a spot-check is a
10
+ * real generation, so the waste is measured in a provider's rate limit, not in
11
+ * CPU. In-process guards (`isRunning`) cannot see the other process at all.
12
+ *
13
+ * WHY A LEASE AND NOT A DAEMON. A daemon is the obvious shape and the wrong
14
+ * first step: it needs a supervisor, a way to be started, restarted, discovered
15
+ * and stopped, and it becomes a thing that can be RUNNING AND WRONG. A lease is
16
+ * the smallest primitive that removes the actual waste: exactly one process
17
+ * wins the exclusive create, everyone else steps aside, and the loser has a
18
+ * perfectly good fallback (do nothing — the work is throttled anyway). It is
19
+ * also the piece a daemon would need FIRST, so this is not throwaway work.
20
+ *
21
+ * HOW EXCLUSION WORKS. `open(path, 'wx')` is the atomic primitive: exactly one
22
+ * caller anywhere can win it. That is the whole mechanism — no pid liveness
23
+ * check, no registry service, no lock daemon.
24
+ *
25
+ * HOW CRASH RECOVERY WORKS, AND WHY IT IS THE mtime. A holder that is killed
26
+ * mid-duty leaves its lease file behind, and a lease that can never be taken is
27
+ * worse than no lease at all. So a lease whose mtime is older than `staleMs` is
28
+ * STOLEN: the stealer removes it and takes it, and reports `stole: true` so the
29
+ * event is visible rather than silent. `renewDutyLease` re-writes the file, which
30
+ * bumps that mtime, which is how a legitimately long duty (a warmup cycle can
31
+ * take minutes) keeps its lease while still being stealable if it dies.
32
+ *
33
+ * The pid is written for DIAGNOSTICS ONLY — "who held this" is the first
34
+ * question when a duty mysteriously stops running, and it is a question the
35
+ * user can answer from disk. It is deliberately NOT a correctness input: pid
36
+ * reuse makes "is this pid alive" an unsafe test (a fresh, unrelated process can
37
+ * hold the number), and the mtime is what actually decides.
38
+ *
39
+ * HONEST BOUNDS. Steal-after-stale means a crashed holder blocks its duty for at
40
+ * most `staleMs` — hence the default is minutes, not hours. Clock skew between
41
+ * two machines sharing a config dir shifts that window; it cannot make the
42
+ * exclusion unsafe, only early or late. Nothing here is a distributed lock:
43
+ * the config dir is one machine's, and the dashboard sidecar sharing it is the
44
+ * case this exists for.
45
+ */
46
+ import { closeSync, mkdirSync, openSync, readFileSync, rmSync, statSync, writeSync } from 'node:fs';
47
+ import { hostname } from 'node:os';
48
+ import { dirname, join } from 'node:path';
49
+ import { envBuff, resolveNuviraHome } from '../config/paths.js';
50
+ /**
51
+ * How long a lease may go un-renewed before it counts as a DEAD holder's and may
52
+ * be stolen (ms).
53
+ *
54
+ * Minutes, not hours, on purpose: this is the worst-case delay before a duty
55
+ * resumes after a crash, and the alternative — a lease that outlives its holder
56
+ * by hours — silently switches the duty off for the rest of the afternoon.
57
+ */
58
+ export const DEFAULT_DUTY_LEASE_STALE_MS = 5 * 60 * 1000;
59
+ /**
60
+ * Env override for {@link DEFAULT_DUTY_LEASE_STALE_MS}
61
+ * (`NUVIRA_DUTY_LEASE_STALE_MS`) — the same rule the warmup bounds follow: a
62
+ * test or an operator tunes the window without a source edit, and nonsense is
63
+ * ignored rather than arming a zero-second lease that would be stolen instantly.
64
+ */
65
+ export function dutyLeaseStaleMs(env = process.env) {
66
+ const raw = env.NUVIRA_DUTY_LEASE_STALE_MS;
67
+ if (raw === undefined || raw.trim() === '')
68
+ return DEFAULT_DUTY_LEASE_STALE_MS;
69
+ const n = Number(raw);
70
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : DEFAULT_DUTY_LEASE_STALE_MS;
71
+ }
72
+ /**
73
+ * Where leases live: `<memory dir>/duties/`.
74
+ *
75
+ * THE MEMORY DIR, NOT THE CONFIG DIR, and not by accident:
76
+ *
77
+ * 1. **The lease travels with the state it protects.** The duties this guards
78
+ * (warmup, verify-next, session checks) mutate the model registry and the
79
+ * verified pool, and those live in the memory dir. An isolated profile — a
80
+ * test, a CI run, a sandbox — therefore gets its OWN leases instead of
81
+ * contending with the developer's real CLI over one file in `~/.nuvira`.
82
+ * 2. **It cannot leak into a real profile from a test.**
83
+ * `tests/setup/hermetic-env.ts` gives every test file a throwaway
84
+ * `NUVIRA_MEMORY_DIR` and deliberately does NOT isolate the config dir (a
85
+ * test that needs real credentials must keep working). A lease under the
86
+ * memory dir is isolated by construction; one under the config dir would
87
+ * have let `chat.ts`'s warmup start write `~/.nuvira/duties/*.lease` on
88
+ * every chat test, which is exactly the leak class that harness exists to
89
+ * stop — and worse, a real CLI holding that lease would have made the
90
+ * test's daemon silently skip.
91
+ *
92
+ * `NUVIRA_DUTY_DIR` overrides it for a caller that wants its own namespace.
93
+ */
94
+ export function dutyLeaseDir() {
95
+ return envBuff('DUTY_DIR') || join(envBuff('MEMORY_DIR') || join(resolveNuviraHome(), 'memory'), 'duties');
96
+ }
97
+ /** `<duty dir>/<name>.lease`. */
98
+ export function dutyLeasePath(name) {
99
+ return join(dutyLeaseDir(), `${safeName(name)}.lease`);
100
+ }
101
+ /**
102
+ * Keep a duty name path-safe. The names are internal constants, but a lease
103
+ * whose path was derived from an arbitrary string could be pointed anywhere.
104
+ */
105
+ function safeName(name) {
106
+ return name.replace(/[^a-zA-Z0-9._-]/g, '_');
107
+ }
108
+ function leaseDir(name) {
109
+ return dirname(dutyLeasePath(name));
110
+ }
111
+ /**
112
+ * This machine's label, defensively.
113
+ *
114
+ * `hostname()` is diagnostics, so it must never be able to fail an acquisition —
115
+ * and it CAN be absent: a test that mocks `node:os` for `homedir()` (the duties
116
+ * suite does exactly that) replaces the whole module, and a bare `hostname()`
117
+ * then throws inside the take and reads as "someone else holds it". The lease
118
+ * would go silently unused, which is the failure mode this module exists to
119
+ * prevent. A missing host therefore degrades to a shared label, and same-process
120
+ * detection still works off the pid.
121
+ */
122
+ function hostLabel() {
123
+ try {
124
+ return hostname() || 'unknown';
125
+ }
126
+ catch {
127
+ return 'unknown';
128
+ }
129
+ }
130
+ /** Read the lease without taking it (diagnostics/dashboard). Never throws. */
131
+ export function readDutyLease(name) {
132
+ try {
133
+ const parsed = JSON.parse(readFileSync(dutyLeasePath(name), 'utf-8'));
134
+ if (!parsed || typeof parsed !== 'object')
135
+ return undefined;
136
+ return parsed;
137
+ }
138
+ catch {
139
+ // Absent or corrupt: from a reader's point of view both mean "no lease".
140
+ return undefined;
141
+ }
142
+ }
143
+ /** Age of a lease file (ms), or `undefined` when there is no readable file. */
144
+ function leaseAgeMs(name, now) {
145
+ try {
146
+ return Math.max(0, now - statSync(dutyLeasePath(name)).mtimeMs);
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ /**
153
+ * Try to take a duty lease. Returns `owned: false` (with the holder, when it
154
+ * could be read) rather than throwing or waiting: every caller's correct
155
+ * response to a busy lease is "someone else has this", and waiting would make a
156
+ * background duty block a foreground command.
157
+ *
158
+ * Re-acquiring a lease THIS process already holds is idempotent and does NOT
159
+ * steal — a duty that runs twice in one process must not look like a crash
160
+ * recovery in the logs.
161
+ */
162
+ export function acquireDutyLease(name, opts = {}) {
163
+ const now = opts.now ?? Date.now();
164
+ const staleMs = opts.staleMs ?? dutyLeaseStaleMs();
165
+ // 1. The atomic take: exactly one caller can win an exclusive create.
166
+ if (tryCreate(name, opts.purpose, now))
167
+ return { owned: true, stole: false };
168
+ // 2. Someone holds it. Is it the SAME process? Then this is not a contention,
169
+ // it is us asking twice.
170
+ const existing = readDutyLease(name);
171
+ if (existing && existing.host === hostLabel() && existing.pid === process.pid) {
172
+ return { owned: true, stole: false };
173
+ }
174
+ // 3. Is it too old to belong to a live call? Then it is a dead holder's, and
175
+ // a lease nobody can take would switch the duty off forever.
176
+ const age = leaseAgeMs(name, now);
177
+ if (age !== undefined && age > staleMs) {
178
+ try {
179
+ rmSync(dutyLeasePath(name), { force: true });
180
+ }
181
+ catch {
182
+ // Lost the race to break it — fall through to the retry and let the
183
+ // exclusive create decide the winner.
184
+ }
185
+ if (tryCreate(name, opts.purpose, now))
186
+ return { owned: true, stole: true };
187
+ // Another process re-took it between the break and our retry: respect it.
188
+ return { owned: false, stole: false, holder: readDutyLease(name) };
189
+ }
190
+ return { owned: false, stole: false, holder: existing };
191
+ }
192
+ /** The exclusive-create step, in one place so both callers share it. */
193
+ function tryCreate(name, purpose, now) {
194
+ try {
195
+ mkdirSync(leaseDir(name), { recursive: true });
196
+ }
197
+ catch {
198
+ // A failing mkdir surfaces as a failing create below, which is the honest
199
+ // "we do not own the lease" answer.
200
+ }
201
+ try {
202
+ const fd = openSync(dutyLeasePath(name), 'wx');
203
+ try {
204
+ const info = {
205
+ name,
206
+ pid: process.pid,
207
+ host: hostLabel(),
208
+ startedAt: now,
209
+ renewedAt: now,
210
+ ...(purpose ? { purpose } : {}),
211
+ };
212
+ writeSync(fd, `${JSON.stringify(info, null, 2)}\n`);
213
+ }
214
+ finally {
215
+ closeSync(fd);
216
+ }
217
+ return true;
218
+ }
219
+ catch {
220
+ // EEXIST (someone else won it) or an unusable directory — either way, not ours.
221
+ return false;
222
+ }
223
+ }
224
+ /**
225
+ * Push a held lease's staleness window out. In-place write (NOT an atomic
226
+ * rename), so the file never blinks out of existence for a competing stealer,
227
+ * and the mtime bump is what a stealer actually reads.
228
+ *
229
+ * Returns false when this process does not hold the lease — a renewed lease it
230
+ * does not own would be a lie, and a long duty that quietly continued after
231
+ * being stolen would defeat the exclusion.
232
+ */
233
+ export function renewDutyLease(name, opts = {}) {
234
+ const existing = readDutyLease(name);
235
+ if (!existing || existing.host !== hostLabel() || existing.pid !== process.pid)
236
+ return false;
237
+ try {
238
+ const renewed = { ...existing, renewedAt: opts.now ?? Date.now() };
239
+ writeFileInPlace(dutyLeasePath(name), `${JSON.stringify(renewed, null, 2)}\n`);
240
+ return true;
241
+ }
242
+ catch {
243
+ return false;
244
+ }
245
+ }
246
+ /** Truncate-and-write in place, so the path is never absent mid-renewal. */
247
+ function writeFileInPlace(path, content) {
248
+ const fd = openSync(path, 'w');
249
+ try {
250
+ writeSync(fd, content);
251
+ }
252
+ finally {
253
+ closeSync(fd);
254
+ }
255
+ }
256
+ /**
257
+ * Give the lease up. Best-effort and never throws — a lease left behind expires
258
+ * by `staleMs`, which is exactly why that window exists.
259
+ *
260
+ * Refuses to release a lease this process does NOT hold: otherwise a process
261
+ * whose lease was stolen (because it hung) could finish and delete the new
262
+ * holder's lease, and two processes would then run the duty at once.
263
+ */
264
+ export function releaseDutyLease(name) {
265
+ const existing = readDutyLease(name);
266
+ if (existing && !(existing.host === hostLabel() && existing.pid === process.pid))
267
+ return;
268
+ try {
269
+ rmSync(dutyLeasePath(name), { force: true });
270
+ }
271
+ catch {
272
+ /* a lock left behind expires by `staleMs` */
273
+ }
274
+ }
275
+ /**
276
+ * Run `fn` while holding `name`, or return `undefined` and run nothing when
277
+ * someone else holds it.
278
+ *
279
+ * The lease is released in a `finally`, so a throwing duty does not block the
280
+ * next one; a duty that CRASHES the process leaves the file behind, which is the
281
+ * case `staleMs` covers.
282
+ */
283
+ export async function withDutyLease(name, fn, opts = {}) {
284
+ const taken = acquireDutyLease(name, opts);
285
+ if (!taken.owned) {
286
+ try {
287
+ opts.onWait?.(taken.holder);
288
+ }
289
+ catch {
290
+ // Diagnostics must never break the caller.
291
+ }
292
+ return undefined;
293
+ }
294
+ try {
295
+ return await fn();
296
+ }
297
+ finally {
298
+ releaseDutyLease(name);
299
+ }
300
+ }
301
+ //# sourceMappingURL=duty-lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duty-lease.js","sourceRoot":"","sources":["../../src/learning/duty-lease.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,18 @@ export interface ExhaustionInput {
66
66
  poolProviders?: number;
67
67
  /** What the user asked for, for the header. */
68
68
  task?: string;
69
+ /**
70
+ * The model the user PINNED for this turn, when there was one.
71
+ *
72
+ * WHY THIS IS AN INPUT. The report's levers must respect the user's own
73
+ * contract: a pinned turn carries an explicit quality bar, so offering "allow a
74
+ * weaker or cheaper model" as though it were free advice contradicts the choice
75
+ * the user just made — and the machine reading is worse, because the turn may
76
+ * already have been handed to a small local model whose "answer" for an agentic
77
+ * ask is fabricated rather than merely weaker. With the pin known, the lever
78
+ * says what releasing it would actually mean.
79
+ */
80
+ pinnedModel?: string;
69
81
  /**
70
82
  * The underlying failure line, when there is one (e.g. the provider's own
71
83
  * rejection text). Rendered as a `Reason:` line so a specific, actionable
@@ -1 +1 @@
1
- {"version":3,"file":"exhaustion-report.d.ts","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kFAAkF;IAClF,WAAW,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBxD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAuJ9E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAQjF"}
1
+ {"version":3,"file":"exhaustion-report.d.ts","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kFAAkF;IAClF,WAAW,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBxD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAyJ9E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAQjF"}
@@ -194,7 +194,9 @@ export function buildExhaustionReport(input) {
194
194
  }
195
195
  options.push({
196
196
  code: 'weaker-model',
197
- text: 'Allow a weaker or cheaper model for this task and accept that its answer may need more checking.',
197
+ text: input.pinnedModel
198
+ ? `You pinned ${input.pinnedModel}, so nothing was run on a weaker model — say so explicitly if you would rather allow a weaker or cheaper one for this task.`
199
+ : 'Allow a weaker or cheaper model for this task and accept that its answer may need more checking.',
198
200
  });
199
201
  options.push({
200
202
  code: 'narrow',
@@ -1 +1 @@
1
- {"version":3,"file":"exhaustion-report.js","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exhaustion-report.js","sourceRoot":"","sources":["../../src/learning/exhaustion-report.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,39 @@ export declare function estimateModelCapability(modelId: string | undefined): nu
51
51
  export declare function capabilityBand(score: number): CapabilityBand;
52
52
  /** True when the model id implies a high-reasoning model. */
53
53
  export declare function isHighCapabilityModel(modelId: string | undefined): boolean;
54
+ /** The numeric rank of a band (higher = more capable). */
55
+ export declare function bandRank(band: CapabilityBand): number;
56
+ /** The capability CLASS of a model id — `high`/`medium`/`low`. */
57
+ export declare function capabilityClassOf(modelId: string | undefined): CapabilityBand;
58
+ /**
59
+ * Order candidates STRONGEST-FIRST, stable within a band (ties keep their
60
+ * incoming order, so a curated/health order still decides among equals).
61
+ *
62
+ * Used wherever a candidate list is offered to a user or chosen for a fallback:
63
+ * "which of these can hold the task" is a capability question and must be asked
64
+ * before the health ranking, which a small/fast model always wins (see this
65
+ * module's header).
66
+ */
67
+ export declare function strongestFirst(candidates: readonly string[]): string[];
68
+ /**
69
+ * Choose the fallback model for a provider under a PIN, staying in the pin's own
70
+ * capability class whenever that provider can.
71
+ *
72
+ * THE RULE (user-set, from the pinned-model contract): a user who pins a strong
73
+ * model and leaves auto-fallback on has said "keep me in this class". So:
74
+ * 1. a candidate in the pin's OWN class wins `strongestFirst` (never a
75
+ * health-first pick, which is how a ≤4B toy outranked a 120B);
76
+ * 2. otherwise a HIGHER class is acceptable — it is not a compromise;
77
+ * 3. only when neither exists does the list drop a class, and then the caller
78
+ * is TOLD (`crossClass: true`) so it can say so in the answer.
79
+ *
80
+ * Returning `false`/`undefined` for an empty list is deliberate: the caller must
81
+ * not invent a model name (a fabricated pair is the issue-#9 class of bug).
82
+ */
83
+ export declare function sameClassFallback(requestedModel: string | undefined, candidates: readonly string[]): {
84
+ model: string;
85
+ crossClass: boolean;
86
+ } | undefined;
54
87
  /**
55
88
  * Filter a HEALTH-ORDERED candidate list down to the models that are at least
56
89
  * as capable as `requestedModel` (same band or higher), preserving the input
@@ -1 +1 @@
1
- {"version":3,"file":"model-capability.d.ts","sourceRoot":"","sources":["../../src/learning/model-capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,OAAO,CAAC;AA0CvC;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAmB3E;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAI5D;AAED,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1E;AAKD;;;;;;;;;;;;;;;GAeG;AACH;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,EAAE,CAGV;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,EAAE,CAIV"}
1
+ {"version":3,"file":"model-capability.d.ts","sourceRoot":"","sources":["../../src/learning/model-capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,OAAO,CAAC;AA0CvC;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAmB3E;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAI5D;AAED,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1E;AAKD,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAErD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAE7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKtE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CASpD;AAED;;;;;;;;;;;;;;;GAeG;AACH;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,EAAE,CAGV;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,EAAE,CAIV"}
@@ -121,6 +121,57 @@ export function isHighCapabilityModel(modelId) {
121
121
  }
122
122
  /** Ordered rank of a band, for "at least as capable as" comparisons. */
123
123
  const BAND_ORDER = { low: 0, medium: 1, high: 2 };
124
+ /** The numeric rank of a band (higher = more capable). */
125
+ export function bandRank(band) {
126
+ return BAND_ORDER[band];
127
+ }
128
+ /** The capability CLASS of a model id — `high`/`medium`/`low`. */
129
+ export function capabilityClassOf(modelId) {
130
+ return capabilityBand(estimateModelCapability(modelId));
131
+ }
132
+ /**
133
+ * Order candidates STRONGEST-FIRST, stable within a band (ties keep their
134
+ * incoming order, so a curated/health order still decides among equals).
135
+ *
136
+ * Used wherever a candidate list is offered to a user or chosen for a fallback:
137
+ * "which of these can hold the task" is a capability question and must be asked
138
+ * before the health ranking, which a small/fast model always wins (see this
139
+ * module's header).
140
+ */
141
+ export function strongestFirst(candidates) {
142
+ return candidates
143
+ .map((model, index) => ({ model, index, score: estimateModelCapability(model) }))
144
+ .sort((a, b) => b.score - a.score || a.index - b.index)
145
+ .map((x) => x.model);
146
+ }
147
+ /**
148
+ * Choose the fallback model for a provider under a PIN, staying in the pin's own
149
+ * capability class whenever that provider can.
150
+ *
151
+ * THE RULE (user-set, from the pinned-model contract): a user who pins a strong
152
+ * model and leaves auto-fallback on has said "keep me in this class". So:
153
+ * 1. a candidate in the pin's OWN class wins `strongestFirst` (never a
154
+ * health-first pick, which is how a ≤4B toy outranked a 120B);
155
+ * 2. otherwise a HIGHER class is acceptable — it is not a compromise;
156
+ * 3. only when neither exists does the list drop a class, and then the caller
157
+ * is TOLD (`crossClass: true`) so it can say so in the answer.
158
+ *
159
+ * Returning `false`/`undefined` for an empty list is deliberate: the caller must
160
+ * not invent a model name (a fabricated pair is the issue-#9 class of bug).
161
+ */
162
+ export function sameClassFallback(requestedModel, candidates) {
163
+ const usable = candidates.filter((m) => typeof m === 'string' && m.trim() !== '');
164
+ if (usable.length === 0)
165
+ return undefined;
166
+ const want = capabilityClassOf(requestedModel);
167
+ const same = usable.filter((m) => capabilityClassOf(m) === want);
168
+ if (same.length > 0)
169
+ return { model: strongestFirst(same)[0], crossClass: false };
170
+ const better = usable.filter((m) => bandRank(capabilityClassOf(m)) > bandRank(want));
171
+ if (better.length > 0)
172
+ return { model: strongestFirst(better)[0], crossClass: false };
173
+ return { model: strongestFirst(usable)[0], crossClass: true };
174
+ }
124
175
  /**
125
176
  * Filter a HEALTH-ORDERED candidate list down to the models that are at least
126
177
  * as capable as `requestedModel` (same band or higher), preserving the input
@@ -1 +1 @@
1
- {"version":3,"file":"model-capability.js","sourceRoot":"","sources":["../../src/learning/model-capability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-capability.js","sourceRoot":"","sources":["../../src/learning/model-capability.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ import { type ModelRegistryEntry } from './model-registry.js';
19
19
  import { type PairEntitlement } from './pair-entitlement.js';
20
20
  import { type CatalogProviderEntry } from '../inference/provider-catalog.js';
21
21
  import { type ComplexityLevel } from './hybrid-router.js';
22
+ import { isPairPlausible } from './model-selection.js';
23
+ export { isPairPlausible };
22
24
  import type { ConfigManager } from '../config/manager.js';
23
25
  /** A model candidate across all providers. */
24
26
  export interface ModelCandidate {
@@ -72,29 +74,12 @@ export interface TaskRequirements {
72
74
  */
73
75
  export declare function estimateTaskRequirements(taskDescription: string, complexity: ComplexityLevel, estimatedInputTokens?: number): TaskRequirements;
74
76
  /**
75
- * P6 (fix_model_routing) — POOL HYGIENE: could this provider really serve this
76
- * model id?
77
- *
78
- * The registry can hold pairs that are syntactically fine and physically
79
- * impossible, and a `verified` status on one of them is worse than useless — it
80
- * spends a fallback slot, a round trip, and (as an "eligible model") credibility
81
- * on a call that cannot succeed. Observed on disk: `gemini/qwen2.5:0.5b` and
82
- * `groq/wire-stub-model` marked verified.
83
- *
84
- * Deliberately CONSERVATIVE — only two rules, both of which are decidable from
85
- * the id alone:
86
- *
87
- * 1. An Ollama-style TAGGED id (`name:tag`) is a LOCAL runner's naming
88
- * scheme. A hosted provider does not serve `qwen2.5:0.5b`; the `:tag` form
89
- * belongs to the local-ops providers (see KEYLESS_PROVIDERS).
90
- * 2. Stub/fixture ids (`wire-stub-model`, `test-…`, `…-stub`) come from test
91
- * harnesses and must never be routed to.
92
- *
93
- * Anything needing a catalog to adjudicate (a vendor that does not serve a
94
- * family) is NOT guessed at here: a wrong exclusion silently removes a working
95
- * model, which is the more expensive mistake.
77
+ * `isPairPlausible` lives in `model-selection.ts` (re-exported above): that
78
+ * module is where a ranked model id actually reaches an adapter request
79
+ * (`resolveAdapterDefault`), so the filter has to sit on THAT ranking too — not
80
+ * only on this router's candidate list. See its doc for the measured case
81
+ * (trace-1791732980335-omkv62).
96
82
  */
97
- export declare function isPairPlausible(provider: string, model: string): boolean;
98
83
  /**
99
84
  * Build the full model candidate list across all providers.
100
85
  * This is the core of model-first routing: instead of scoring providers,
@@ -140,6 +125,20 @@ export declare function buildFailoverChain(bestCandidate: ModelCandidate, allCan
140
125
  export type CapabilityTier = 'high' | 'medium' | 'low' | 'local';
141
126
  /**
142
127
  * Classify a model into a capability tier.
128
+ *
129
+ * TWO AXES, and they are different questions:
130
+ * 1. WHERE the model runs — a keyless local runner (`local`, `lmstudio`,
131
+ * `vllm`) is the LAST resort whatever its size, so it keeps its own tier.
132
+ * 2. HOW MUCH it can do — `model-capability` bands, name-derived and
133
+ * deterministic, the SAME bands the pinned-handoff repair, the local
134
+ * last-resort pick and the router's capability floors already use.
135
+ *
136
+ * The band used to come from this module's own `capabilityFit` dimension, a
137
+ * task-relative score: a fast small model fits a trivial task well, so it read
138
+ * `high` HERE and `low` to everything else — two taxonomies for one fact, and
139
+ * the reason a 0.5B and a 120B could land in the same tier. `capabilityFit`
140
+ * still decides the candidate ORDER (it is the task fit); it no longer decides
141
+ * the BAND.
143
142
  */
144
143
  export declare function classifyTier(candidate: ModelCandidate): CapabilityTier;
145
144
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"model-first-router.d.ts","sourceRoot":"","sources":["../../src/learning/model-first-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-first-router.d.ts","sourceRoot":"","sources":["../../src/learning/model-first-router.ts"],"names":[],"mappings":"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"}