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.
- package/README.md +13 -13
- package/dist/agent-sdk/src/register.d.ts +23 -7
- package/dist/agent-sdk/src/register.d.ts.map +1 -1
- package/dist/agent-sdk/src/register.js +159 -5
- package/dist/agent-sdk/src/register.js.map +1 -1
- package/dist/agent-sdk/src/scaffold.d.ts +1 -1
- package/dist/agent-sdk/src/scaffold.js +1 -1
- package/dist/cli/agent.d.ts.map +1 -1
- package/dist/cli/agent.js +16 -3
- package/dist/cli/agent.js.map +1 -1
- package/dist/cli/chat.d.ts +202 -6
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +805 -34
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/config.d.ts +10 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +39 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +18 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/duties.d.ts +11 -0
- package/dist/cli/duties.d.ts.map +1 -1
- package/dist/cli/duties.js +31 -0
- package/dist/cli/duties.js.map +1 -1
- package/dist/cli/mcp.d.ts +50 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +496 -49
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/memory.d.ts.map +1 -1
- package/dist/cli/memory.js +3 -2
- package/dist/cli/memory.js.map +1 -1
- package/dist/cli/models.d.ts.map +1 -1
- package/dist/cli/models.js +55 -0
- package/dist/cli/models.js.map +1 -1
- package/dist/cli/plugins.d.ts.map +1 -1
- package/dist/cli/plugins.js +26 -9
- package/dist/cli/plugins.js.map +1 -1
- package/dist/cli/sdk.d.ts.map +1 -1
- package/dist/cli/sdk.js +10 -3
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli/tool-install-prompt.d.ts.map +1 -1
- package/dist/cli/tool-install-prompt.js +23 -1
- package/dist/cli/tool-install-prompt.js.map +1 -1
- package/dist/cli/tools.d.ts +16 -0
- package/dist/cli/tools.d.ts.map +1 -1
- package/dist/cli/tools.js +101 -1
- package/dist/cli/tools.js.map +1 -1
- package/dist/config/manager.d.ts +6 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +66 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/config/types.d.ts +18 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/learning/auto-router.d.ts +28 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +84 -5
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/duty-lease.d.ts +163 -0
- package/dist/learning/duty-lease.d.ts.map +1 -0
- package/dist/learning/duty-lease.js +301 -0
- package/dist/learning/duty-lease.js.map +1 -0
- package/dist/learning/exhaustion-report.d.ts +12 -0
- package/dist/learning/exhaustion-report.d.ts.map +1 -1
- package/dist/learning/exhaustion-report.js +3 -1
- package/dist/learning/exhaustion-report.js.map +1 -1
- package/dist/learning/model-capability.d.ts +33 -0
- package/dist/learning/model-capability.d.ts.map +1 -1
- package/dist/learning/model-capability.js +51 -0
- package/dist/learning/model-capability.js.map +1 -1
- package/dist/learning/model-first-router.d.ts +21 -22
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +61 -54
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-selection.d.ts +27 -0
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +46 -0
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/model-warmup.d.ts +92 -0
- package/dist/learning/model-warmup.d.ts.map +1 -1
- package/dist/learning/model-warmup.js +137 -2
- package/dist/learning/model-warmup.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +1 -1
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resilient-call.d.ts +15 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +38 -22
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/retry-patience.d.ts +139 -0
- package/dist/learning/retry-patience.d.ts.map +1 -0
- package/dist/learning/retry-patience.js +169 -0
- package/dist/learning/retry-patience.js.map +1 -0
- package/dist/learning/working-state.d.ts +7 -0
- package/dist/learning/working-state.d.ts.map +1 -1
- package/dist/learning/working-state.js +23 -1
- package/dist/learning/working-state.js.map +1 -1
- package/dist/mcp/catalog.d.ts +206 -26
- package/dist/mcp/catalog.d.ts.map +1 -1
- package/dist/mcp/catalog.js +664 -52
- package/dist/mcp/catalog.js.map +1 -1
- package/dist/mcp/client.d.ts +6 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +35 -5
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/custom-server.d.ts +120 -0
- package/dist/mcp/custom-server.d.ts.map +1 -0
- package/dist/mcp/custom-server.js +330 -0
- package/dist/mcp/custom-server.js.map +1 -0
- package/dist/mcp/manager.d.ts +9 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +15 -2
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/mcp-oauth.d.ts +28 -0
- package/dist/mcp/mcp-oauth.d.ts.map +1 -1
- package/dist/mcp/mcp-oauth.js +63 -8
- package/dist/mcp/mcp-oauth.js.map +1 -1
- package/dist/mcp/oauth-authorize.d.ts +51 -0
- package/dist/mcp/oauth-authorize.d.ts.map +1 -0
- package/dist/mcp/oauth-authorize.js +133 -0
- package/dist/mcp/oauth-authorize.js.map +1 -0
- package/dist/mcp/oauth-connect.d.ts +53 -0
- package/dist/mcp/oauth-connect.d.ts.map +1 -0
- package/dist/mcp/oauth-connect.js +103 -0
- package/dist/mcp/oauth-connect.js.map +1 -0
- package/dist/mcp/pin-verifier.d.ts +44 -0
- package/dist/mcp/pin-verifier.d.ts.map +1 -0
- package/dist/mcp/pin-verifier.js +102 -0
- package/dist/mcp/pin-verifier.js.map +1 -0
- package/dist/mcp/prereqs.d.ts +145 -0
- package/dist/mcp/prereqs.d.ts.map +1 -0
- package/dist/mcp/prereqs.js +245 -0
- package/dist/mcp/prereqs.js.map +1 -0
- package/dist/mcp/runtime.d.ts +59 -0
- package/dist/mcp/runtime.d.ts.map +1 -0
- package/dist/mcp/runtime.js +77 -0
- package/dist/mcp/runtime.js.map +1 -0
- package/dist/mcp/server.d.ts +21 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +29 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/settings.d.ts +164 -0
- package/dist/mcp/settings.d.ts.map +1 -0
- package/dist/mcp/settings.js +358 -0
- package/dist/mcp/settings.js.map +1 -0
- package/dist/mcp/types.d.ts +62 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/memory/vector-store.d.ts +12 -0
- package/dist/memory/vector-store.d.ts.map +1 -1
- package/dist/memory/vector-store.js +23 -0
- package/dist/memory/vector-store.js.map +1 -1
- package/dist/plugins/agent-plugin.d.ts +35 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -1
- package/dist/plugins/agent-plugin.js +142 -24
- package/dist/plugins/agent-plugin.js.map +1 -1
- package/dist/sandbox/manager.d.ts +12 -0
- package/dist/sandbox/manager.d.ts.map +1 -1
- package/dist/sandbox/manager.js +43 -2
- package/dist/sandbox/manager.js.map +1 -1
- package/dist/tools/modality/browser.d.ts +39 -3
- package/dist/tools/modality/browser.d.ts.map +1 -1
- package/dist/tools/modality/browser.js +113 -16
- package/dist/tools/modality/browser.js.map +1 -1
- package/dist/tools/optional-deps.d.ts +48 -0
- package/dist/tools/optional-deps.d.ts.map +1 -0
- package/dist/tools/optional-deps.js +42 -0
- package/dist/tools/optional-deps.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +68 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/remediation-ladder.d.ts.map +1 -1
- package/dist/tools/remediation-ladder.js +9 -1
- package/dist/tools/remediation-ladder.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +41 -3
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +317 -9
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/web-dashboard/chat-retry.d.ts +11 -1
- package/dist/web-dashboard/chat-retry.d.ts.map +1 -1
- package/dist/web-dashboard/chat-retry.js +18 -4
- package/dist/web-dashboard/chat-retry.js.map +1 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +349 -2
- package/dist/web-dashboard/server.js.map +1 -1
- package/package.json +6 -2
- package/src/web-dashboard/public/assets/{index-DeD3L0kG.js → index-Bik91KJh.js} +115 -89
- package/src/web-dashboard/public/assets/index-Bik91KJh.js.map +1 -0
- package/src/web-dashboard/public/index.html +1 -1
- 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,
|
|
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:
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;
|
|
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
|
-
*
|
|
76
|
-
* model id
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAA+C,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAAsB,KAAK,oBAAoB,EAAwB,MAAM,kCAAkC,CAAC;AACvH,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"model-first-router.d.ts","sourceRoot":"","sources":["../../src/learning/model-first-router.ts"],"names":[],"mappings":"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"}
|