llm-relay 0.72.2 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/accounting-store.js +0 -2
  2. package/dist/accounting-store.js.map +1 -1
  3. package/dist/backend/envelope-validator.d.ts +22 -0
  4. package/dist/backend/envelope-validator.js +70 -0
  5. package/dist/backend/envelope-validator.js.map +1 -0
  6. package/dist/backend/health-prober.d.ts +59 -0
  7. package/dist/backend/health-prober.js +145 -0
  8. package/dist/backend/health-prober.js.map +1 -0
  9. package/dist/backend.js +2 -210
  10. package/dist/backend.js.map +1 -1
  11. package/dist/config/routing-parser.d.ts +33 -0
  12. package/dist/config/routing-parser.js +578 -0
  13. package/dist/config/routing-parser.js.map +1 -0
  14. package/dist/config.d.ts +3 -13
  15. package/dist/config.js +5 -584
  16. package/dist/config.js.map +1 -1
  17. package/dist/keystore.js +10 -16
  18. package/dist/keystore.js.map +1 -1
  19. package/dist/ping/ping.d.ts +1 -6
  20. package/dist/ping/ping.js +1 -5
  21. package/dist/ping/ping.js.map +1 -1
  22. package/dist/routes/messages.js +3 -3
  23. package/dist/routes/messages.js.map +1 -1
  24. package/dist/routes/openai-front.js +3 -3
  25. package/dist/routes/openai-front.js.map +1 -1
  26. package/dist/spec.d.ts +35 -0
  27. package/dist/spec.js +9 -0
  28. package/dist/spec.js.map +1 -0
  29. package/dist/sse-frames.d.ts +43 -0
  30. package/dist/sse-frames.js +39 -0
  31. package/dist/sse-frames.js.map +1 -1
  32. package/dist/stream-commit.d.ts +29 -0
  33. package/dist/stream-commit.js +5 -0
  34. package/dist/stream-commit.js.map +1 -1
  35. package/dist/think-tags.js +14 -45
  36. package/dist/think-tags.js.map +1 -1
  37. package/dist/tool-dialects.js +3 -4
  38. package/dist/tool-dialects.js.map +1 -1
  39. package/dist/tool-use-ids.js +32 -62
  40. package/dist/tool-use-ids.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,578 @@
1
+ import { EFFORT_LEVELS, } from "../config-types.js";
2
+ import { AUTO_MODEL, POOL_PREFIX, splitSpec } from "../spec.js";
3
+ const EFFORT_LEVEL_SET = new Set(EFFORT_LEVELS);
4
+ function parseQuotaEnforcement(raw) {
5
+ if (raw === undefined || raw === null)
6
+ return undefined;
7
+ if (typeof raw !== "object" || Array.isArray(raw)) {
8
+ throw new Error("config.routing.quota must be an object");
9
+ }
10
+ const value = raw;
11
+ const out = {};
12
+ if (value.enforce !== undefined) {
13
+ if (typeof value.enforce !== "boolean")
14
+ throw new Error("config.routing.quota.enforce must be a boolean");
15
+ out.enforce = value.enforce;
16
+ }
17
+ if (value.enforceLearned !== undefined) {
18
+ if (typeof value.enforceLearned !== "boolean") {
19
+ throw new Error("config.routing.quota.enforceLearned must be a boolean");
20
+ }
21
+ out.enforceLearned = value.enforceLearned;
22
+ }
23
+ if (value.hardCaps !== undefined) {
24
+ if (typeof value.hardCaps !== "boolean") {
25
+ throw new Error("config.routing.quota.hardCaps must be a boolean");
26
+ }
27
+ out.hardCaps = value.hardCaps;
28
+ }
29
+ return out;
30
+ }
31
+ function parseLatencyDemotion(raw) {
32
+ if (raw === undefined || raw === null)
33
+ return {};
34
+ if (typeof raw === "boolean")
35
+ return { enabled: raw };
36
+ if (typeof raw !== "object" || Array.isArray(raw)) {
37
+ throw new Error("config.routing.latency must be an object or a boolean");
38
+ }
39
+ const value = raw;
40
+ const known = new Set(["enabled", "p95Ms", "msPerToken", "minSamples"]);
41
+ for (const key of Object.keys(value)) {
42
+ if (!known.has(key)) {
43
+ throw new Error(`config.routing.latency has an unknown key "${key}"`);
44
+ }
45
+ }
46
+ const out = {};
47
+ if (value.enabled !== undefined) {
48
+ if (typeof value.enabled !== "boolean")
49
+ throw new Error("config.routing.latency.enabled must be a boolean");
50
+ out.enabled = value.enabled;
51
+ }
52
+ for (const key of ["p95Ms", "msPerToken", "minSamples"]) {
53
+ const n = value[key];
54
+ if (n === undefined)
55
+ continue;
56
+ if (typeof n !== "number" || !Number.isFinite(n) || n <= 0) {
57
+ throw new Error(`config.routing.latency.${key} must be a positive finite number`);
58
+ }
59
+ out[key] = n;
60
+ }
61
+ return out;
62
+ }
63
+ function parseHedge(raw) {
64
+ if (raw === undefined || raw === null)
65
+ return {};
66
+ if (typeof raw === "boolean")
67
+ return { enabled: raw };
68
+ if (typeof raw !== "object" || Array.isArray(raw)) {
69
+ throw new Error("config.routing.hedge must be an object or a boolean");
70
+ }
71
+ const value = raw;
72
+ const known = new Set(["enabled", "floorMs", "minFloorMs", "msPerInputToken", "margin", "minSamples"]);
73
+ for (const key of Object.keys(value)) {
74
+ if (!known.has(key)) {
75
+ throw new Error(`config.routing.hedge has an unknown key "${key}"`);
76
+ }
77
+ }
78
+ const out = {};
79
+ if (value.enabled !== undefined) {
80
+ if (typeof value.enabled !== "boolean")
81
+ throw new Error("config.routing.hedge.enabled must be a boolean");
82
+ out.enabled = value.enabled;
83
+ }
84
+ for (const key of ["floorMs", "minFloorMs", "msPerInputToken", "margin", "minSamples"]) {
85
+ const n = value[key];
86
+ if (n === undefined)
87
+ continue;
88
+ if (typeof n !== "number" || !Number.isFinite(n) || n <= 0) {
89
+ throw new Error(`config.routing.hedge.${key} must be a positive finite number`);
90
+ }
91
+ out[key] = n;
92
+ }
93
+ return out;
94
+ }
95
+ export function parseRouting(raw, providers, overrideDefault, warnings = [], disabledProviders = new Set()) {
96
+ const r = (typeof raw === "object" && raw !== null ? raw : {});
97
+ if (providers[POOL_PREFIX]) {
98
+ throw new Error(`config.providers."${POOL_PREFIX}" is reserved — it would shadow "pool/<name>" routing`);
99
+ }
100
+ if (providers[AUTO_MODEL]) {
101
+ throw new Error(`config.providers."${AUTO_MODEL}" is reserved — it would shadow "${AUTO_MODEL}" routing`);
102
+ }
103
+ const dfltRaw = overrideDefault !== undefined ? overrideDefault : r.default;
104
+ let dflt;
105
+ if (Array.isArray(dfltRaw)) {
106
+ dflt = dfltRaw.filter((s) => typeof s === "string" && s.length > 0);
107
+ if (dflt.length === 0) {
108
+ throw new Error(`config.routing.default array must contain at least one valid spec string`);
109
+ }
110
+ }
111
+ else if (typeof dfltRaw === "string" && dfltRaw.length > 0) {
112
+ dflt = dfltRaw;
113
+ }
114
+ else {
115
+ throw new Error(`config.routing.default ("provider/model") is required`);
116
+ }
117
+ const tiers = {};
118
+ if (typeof r.tiers === "object" && r.tiers !== null) {
119
+ for (const [k, v] of Object.entries(r.tiers)) {
120
+ if (Array.isArray(v)) {
121
+ const arr = v.filter((s) => typeof s === "string" && s.length > 0);
122
+ if (arr.length > 0)
123
+ tiers[k] = arr;
124
+ }
125
+ else if (typeof v === "string" && v.length > 0) {
126
+ tiers[k] = v;
127
+ }
128
+ }
129
+ }
130
+ const pools = {};
131
+ const poolPolicies = {};
132
+ if (typeof r.pools === "object" && r.pools !== null) {
133
+ for (const [k, v] of Object.entries(r.pools)) {
134
+ let declared;
135
+ if (Array.isArray(v)) {
136
+ declared = v.filter((s) => typeof s === "string" && s.length > 0);
137
+ }
138
+ else if (typeof v === "object" && v !== null) {
139
+ const policy = v;
140
+ if (!Array.isArray(policy.preferred) || policy.preferred.some((s) => typeof s !== "string" || s.length === 0)) {
141
+ throw new Error(`config.routing.pools.${k}.preferred must be an array of non-empty "provider/model" specs`);
142
+ }
143
+ if (policy.include !== "free") {
144
+ throw new Error(`config.routing.pools.${k}.include must be "free"`);
145
+ }
146
+ if (policy.exclude !== undefined &&
147
+ (!Array.isArray(policy.exclude) ||
148
+ policy.exclude.some((s) => typeof s !== "string" ||
149
+ !/^\S+\/\S+$/.test(s) ||
150
+ s.startsWith(`${POOL_PREFIX}/`)))) {
151
+ throw new Error(`config.routing.pools.${k}.exclude must be an array of "provider/model" specs`);
152
+ }
153
+ if (policy.effort !== undefined && !EFFORT_LEVEL_SET.has(policy.effort)) {
154
+ throw new Error(`config.routing.pools.${k}.effort must be low, medium, high, or xhigh`);
155
+ }
156
+ const exclude = [...(policy.exclude ?? [])];
157
+ const excluded = new Set(exclude);
158
+ declared = policy.preferred.filter((spec) => !excluded.has(spec));
159
+ poolPolicies[k] = {
160
+ preferred: declared,
161
+ include: "free",
162
+ ...(exclude.length > 0 ? { exclude } : {}),
163
+ ...(policy.effort ? { effort: policy.effort } : {}),
164
+ };
165
+ }
166
+ else {
167
+ throw new Error(`config.routing.pools.${k} must be an array of specs or {"preferred":[...],"include":"free"}`);
168
+ }
169
+ const arr = declared.filter((s) => {
170
+ const { provider } = splitSpec(s);
171
+ if (!disabledProviders.has(provider))
172
+ return true;
173
+ warnings.push(`routing.pools.${k}: dropped "${s}" — provider "${provider}" is disabled`);
174
+ return false;
175
+ });
176
+ if (arr.length === 0 && !poolPolicies[k]) {
177
+ throw new Error(`config.routing.pools.${k} must contain at least one valid spec string`);
178
+ }
179
+ const nested = arr.find((s) => s.startsWith(`${POOL_PREFIX}/`));
180
+ if (nested) {
181
+ throw new Error(`config.routing.pools.${k} member "${nested}" — a pool cannot reference another pool`);
182
+ }
183
+ pools[k] = arr;
184
+ if (poolPolicies[k])
185
+ poolPolicies[k] = { ...poolPolicies[k], preferred: arr, include: "free" };
186
+ }
187
+ }
188
+ const subagents = {};
189
+ if (typeof r.subagents === "object" && r.subagents !== null) {
190
+ for (const [k, v] of Object.entries(r.subagents)) {
191
+ if (typeof v === "string" && v.length > 0)
192
+ subagents[k] = v;
193
+ }
194
+ }
195
+ const benchmarkSort = typeof r.benchmarkSort === "boolean" ? r.benchmarkSort : true;
196
+ const offload = parseOffload(r.offload);
197
+ const routing = { default: dflt, tiers, benchmarkSort, offload };
198
+ const sticky = parseSticky(r.sticky);
199
+ if (sticky)
200
+ routing.sticky = sticky;
201
+ const quota = parseQuotaEnforcement(r.quota);
202
+ if (quota)
203
+ routing.quota = quota;
204
+ routing.latency = parseLatencyDemotion(r.latency);
205
+ routing.hedge = parseHedge(r.hedge);
206
+ routing.laneProbe = parseLaneProbe(r.laneProbe);
207
+ const mcpSettings = parseMcpSettings(r.mcp);
208
+ if (mcpSettings)
209
+ routing.mcp = mcpSettings;
210
+ if (Object.keys(pools).length > 0)
211
+ routing.pools = pools;
212
+ if (Object.keys(poolPolicies).length > 0)
213
+ routing.poolPolicies = poolPolicies;
214
+ if (Object.keys(subagents).length > 0)
215
+ routing.subagents = subagents;
216
+ const ladder = parseLadder(r.ladder, "config.routing.ladder");
217
+ if (ladder.length > 0)
218
+ routing.ladder = ladder;
219
+ if (r.ladders !== undefined && (typeof r.ladders !== "object" || r.ladders === null || Array.isArray(r.ladders))) {
220
+ throw new Error(`config.routing.ladders must be an object of named ladder arrays`);
221
+ }
222
+ const ladders = {};
223
+ for (const [tier, rawLadder] of Object.entries((r.ladders ?? {}))) {
224
+ const parsed = parseLadder(rawLadder, `config.routing.ladders.${tier}`);
225
+ if (parsed.length === 0)
226
+ throw new Error(`config.routing.ladders.${tier} must contain at least one rung`);
227
+ ladders[tier] = parsed;
228
+ }
229
+ if (Object.keys(ladders).length > 0)
230
+ routing.ladders = ladders;
231
+ const cliLane = parseCliLane(r.cliLane, "config.routing.cliLane");
232
+ if (cliLane)
233
+ routing.cliLane = cliLane;
234
+ for (const [tier, spec] of Object.entries(tiers)) {
235
+ const kept = dropDisabledSpecs(spec, disabledProviders, warnings, `routing.tiers.${tier}`);
236
+ if (kept === null)
237
+ delete tiers[tier];
238
+ else
239
+ tiers[tier] = kept;
240
+ }
241
+ for (const [tier, spec] of Object.entries(subagents)) {
242
+ const kept = dropDisabledSpecs(spec, disabledProviders, warnings, `routing.subagents.${tier}`);
243
+ if (kept === null)
244
+ delete subagents[tier];
245
+ else
246
+ subagents[tier] = kept;
247
+ }
248
+ if (Array.isArray(routing.default)) {
249
+ const kept = dropDisabledSpecs(routing.default, disabledProviders, warnings, "routing.default");
250
+ if (kept !== null)
251
+ routing.default = kept;
252
+ }
253
+ routing.ladder = ladder.filter((rung) => {
254
+ if (rung.kind !== "relay" || !rung.spec)
255
+ return true;
256
+ return dropDisabledSpecs(rung.spec, disabledProviders, warnings, `routing.ladder[${rung.id}].spec`) !== null;
257
+ });
258
+ if (routing.ladder.length === 0)
259
+ delete routing.ladder;
260
+ for (const [tier, tierLadder] of Object.entries(routing.ladders ?? {})) {
261
+ const kept = tierLadder.filter((rung) => {
262
+ if (rung.kind !== "relay" || !rung.spec)
263
+ return true;
264
+ return dropDisabledSpecs(rung.spec, disabledProviders, warnings, `routing.ladders.${tier}[${rung.id}].spec`) !== null;
265
+ });
266
+ if (kept.length === 0)
267
+ delete routing.ladders[tier];
268
+ else
269
+ routing.ladders[tier] = kept;
270
+ }
271
+ if (routing.ladders && Object.keys(routing.ladders).length === 0)
272
+ delete routing.ladders;
273
+ assertSpecResolvable(routing.default, providers, pools, "routing.default", disabledProviders);
274
+ for (const [tier, spec] of Object.entries(tiers)) {
275
+ assertSpecResolvable(spec, providers, pools, `routing.tiers.${tier}`);
276
+ }
277
+ for (const [pool, specs] of Object.entries(pools)) {
278
+ assertSpecResolvable(specs, providers, {}, `routing.pools.${pool}`);
279
+ }
280
+ for (const [tier, spec] of Object.entries(subagents)) {
281
+ assertSpecResolvable(spec, providers, pools, `routing.subagents.${tier}`);
282
+ }
283
+ for (const rung of routing.ladder ?? []) {
284
+ if (rung.kind === "relay" && rung.spec) {
285
+ assertSpecResolvable(rung.spec, providers, pools, `routing.ladder[${rung.id}].spec`);
286
+ }
287
+ }
288
+ for (const [tier, tierLadder] of Object.entries(routing.ladders ?? {})) {
289
+ for (const rung of tierLadder) {
290
+ if (rung.kind === "relay" && rung.spec) {
291
+ assertSpecResolvable(rung.spec, providers, pools, `routing.ladders.${tier}[${rung.id}].spec`);
292
+ }
293
+ }
294
+ }
295
+ return routing;
296
+ }
297
+ function parseMcpSettings(raw) {
298
+ if (raw === undefined || raw === null)
299
+ return undefined;
300
+ if (typeof raw !== "object" || Array.isArray(raw)) {
301
+ throw new Error(`config.routing.mcp must be an object`);
302
+ }
303
+ const o = raw;
304
+ for (const key of Object.keys(o)) {
305
+ if (key !== "allowedRoots") {
306
+ throw new Error(`config.routing.mcp.${key} is not a recognized key (allowedRoots)`);
307
+ }
308
+ }
309
+ if (o.allowedRoots === undefined)
310
+ return {};
311
+ if (!Array.isArray(o.allowedRoots) || o.allowedRoots.some((r) => typeof r !== "string" || r.length === 0)) {
312
+ throw new Error(`config.routing.mcp.allowedRoots must be an array of non-empty strings`);
313
+ }
314
+ return { allowedRoots: [...o.allowedRoots] };
315
+ }
316
+ export const DEFAULT_LANE_PROBE = {
317
+ enabled: true,
318
+ quotaIntervalMs: 6 * 60 * 60 * 1000,
319
+ catalogIntervalMs: 24 * 60 * 60 * 1000,
320
+ };
321
+ function parseLaneProbe(raw) {
322
+ if (raw === undefined || raw === null)
323
+ return { ...DEFAULT_LANE_PROBE };
324
+ if (typeof raw === "boolean")
325
+ return { ...DEFAULT_LANE_PROBE, enabled: raw };
326
+ if (typeof raw !== "object" || Array.isArray(raw)) {
327
+ throw new Error(`config.routing.laneProbe must be a boolean or an object`);
328
+ }
329
+ const o = raw;
330
+ for (const key of Object.keys(o)) {
331
+ if (key !== "enabled" && key !== "quotaIntervalMs" && key !== "catalogIntervalMs") {
332
+ throw new Error(`config.routing.laneProbe.${key} is not a recognized key (enabled, quotaIntervalMs, catalogIntervalMs)`);
333
+ }
334
+ }
335
+ if (typeof o.enabled !== "boolean") {
336
+ throw new Error(`config.routing.laneProbe.enabled must be a boolean`);
337
+ }
338
+ const interval = (name, value, fallback) => {
339
+ if (value === undefined)
340
+ return fallback;
341
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 60_000 || value > 2_592_000_000) {
342
+ throw new Error(`config.routing.laneProbe.${name} must be between 60000 (1m) and 2592000000 ms (30d)`);
343
+ }
344
+ return Math.floor(value);
345
+ };
346
+ return {
347
+ enabled: o.enabled,
348
+ quotaIntervalMs: interval("quotaIntervalMs", o.quotaIntervalMs, DEFAULT_LANE_PROBE.quotaIntervalMs),
349
+ catalogIntervalMs: interval("catalogIntervalMs", o.catalogIntervalMs, DEFAULT_LANE_PROBE.catalogIntervalMs),
350
+ };
351
+ }
352
+ function parseSticky(raw) {
353
+ if (raw === undefined || raw === null)
354
+ return undefined;
355
+ if (typeof raw === "boolean") {
356
+ return { enabled: raw, ttlMs: 1_800_000, maxSessions: 1000 };
357
+ }
358
+ if (typeof raw !== "object" || Array.isArray(raw)) {
359
+ throw new Error(`config.routing.sticky must be a boolean or an object`);
360
+ }
361
+ const sticky = raw;
362
+ if (typeof sticky.enabled !== "boolean") {
363
+ throw new Error(`config.routing.sticky.enabled must be a boolean`);
364
+ }
365
+ let ttlMs = 1_800_000;
366
+ if (sticky.ttlMs !== undefined) {
367
+ if (typeof sticky.ttlMs !== "number" ||
368
+ !Number.isFinite(sticky.ttlMs) ||
369
+ sticky.ttlMs < 1000 ||
370
+ sticky.ttlMs > 86_400_000) {
371
+ throw new Error(`config.routing.sticky.ttlMs must be between 1000 and 86400000 ms (1s to 24h)`);
372
+ }
373
+ ttlMs = Math.floor(sticky.ttlMs);
374
+ }
375
+ let maxSessions = 1000;
376
+ if (sticky.maxSessions !== undefined) {
377
+ if (typeof sticky.maxSessions !== "number" ||
378
+ !Number.isFinite(sticky.maxSessions) ||
379
+ sticky.maxSessions < 10 ||
380
+ sticky.maxSessions > 100_000) {
381
+ throw new Error(`config.routing.sticky.maxSessions must be an integer between 10 and 100000`);
382
+ }
383
+ maxSessions = Math.floor(sticky.maxSessions);
384
+ }
385
+ return { enabled: sticky.enabled, ttlMs, maxSessions };
386
+ }
387
+ export function parseOffload(raw) {
388
+ let out = false;
389
+ if (typeof raw === "boolean") {
390
+ out = raw;
391
+ }
392
+ else if (raw !== undefined) {
393
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
394
+ throw new Error(`config.routing.offload must be a boolean or an object keyed by client`);
395
+ }
396
+ const parsed = {};
397
+ for (const [client, value] of Object.entries(raw)) {
398
+ if (client.length === 0)
399
+ throw new Error(`config.routing.offload client name must not be empty`);
400
+ if (typeof value === "boolean") {
401
+ parsed[client] = { enabled: value, scope: "subagents" };
402
+ continue;
403
+ }
404
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
405
+ throw new Error(`config.routing.offload.${client} must be a boolean or {"enabled":bool,"scope":...}`);
406
+ }
407
+ const rule = value;
408
+ if (typeof rule.enabled !== "boolean") {
409
+ throw new Error(`config.routing.offload.${client}.enabled must be true or false`);
410
+ }
411
+ const scope = rule.scope === undefined ? "subagents" : rule.scope;
412
+ if (scope !== "subagents" && scope !== "all") {
413
+ throw new Error(`config.routing.offload.${client}.scope must be "subagents" or "all"`);
414
+ }
415
+ if (rule.freeOnly !== undefined && typeof rule.freeOnly !== "boolean") {
416
+ throw new Error(`config.routing.offload.${client}.freeOnly must be true or false`);
417
+ }
418
+ parsed[client] = { enabled: rule.enabled, scope, ...(rule.freeOnly !== undefined ? { freeOnly: rule.freeOnly } : {}) };
419
+ }
420
+ out = parsed;
421
+ }
422
+ return out;
423
+ }
424
+ function hasAsciiControl(value) {
425
+ for (let i = 0; i < value.length; i++) {
426
+ const code = value.charCodeAt(i);
427
+ if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
428
+ return true;
429
+ }
430
+ return false;
431
+ }
432
+ function dropDisabledSpecs(spec, disabled, warnings, where) {
433
+ if (disabled.size === 0)
434
+ return spec;
435
+ const specs = Array.isArray(spec) ? spec : [spec];
436
+ const kept = specs.filter((s) => {
437
+ const { provider } = splitSpec(s);
438
+ if (provider === POOL_PREFIX || !disabled.has(provider))
439
+ return true;
440
+ warnings.push(`config.${where}: dropped "${s}" — provider "${provider}" is disabled. ` +
441
+ `That routing now falls through to routing.default, which for a passthrough default ` +
442
+ `means primary quota.`);
443
+ return false;
444
+ });
445
+ if (kept.length === 0)
446
+ return null;
447
+ return Array.isArray(spec) ? kept : kept[0];
448
+ }
449
+ const LADDER_TASK_TOKEN = "{task}";
450
+ const LADDER_SPEC_TOKEN = "{spec}";
451
+ const LADDER_CONTEXT_TOKEN = "{contextWindow}";
452
+ function parseSpawnEnv(raw, where) {
453
+ if (raw === undefined)
454
+ return undefined;
455
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
456
+ throw new Error(`${where}.env must be an object mapping variable names to a string (set) or null (unset)`);
457
+ }
458
+ const env = {};
459
+ for (const [name, value] of Object.entries(raw)) {
460
+ if (name.length === 0 || name.includes("=") || /\s/.test(name) || hasAsciiControl(name)) {
461
+ throw new Error(`${where}.env has an invalid variable name ${JSON.stringify(name)}`);
462
+ }
463
+ if (typeof value !== "string" && value !== null) {
464
+ throw new Error(`${where}.env.${name} must be a string (set) or null (unset)`);
465
+ }
466
+ env[name] = value;
467
+ }
468
+ return Object.keys(env).length > 0 ? env : undefined;
469
+ }
470
+ function parseCliLane(raw, root) {
471
+ if (raw === undefined || raw === null)
472
+ return undefined;
473
+ if (typeof raw !== "object" || Array.isArray(raw))
474
+ throw new Error(`${root} must be an object`);
475
+ const e = raw;
476
+ if (typeof e.command !== "string" || e.command.length === 0) {
477
+ throw new Error(`${root}.command must be a non-empty string`);
478
+ }
479
+ if (!Array.isArray(e.args) || e.args.some((a) => typeof a !== "string")) {
480
+ throw new Error(`${root}.args must be an array of strings`);
481
+ }
482
+ const args = e.args;
483
+ if (!args.some((a) => a.includes(LADDER_SPEC_TOKEN))) {
484
+ throw new Error(`${root}.args must contain "${LADDER_SPEC_TOKEN}" in one argument — otherwise every transposed rung ` +
485
+ `invokes ${e.command} with the same model and the ladder only appears to fail over`);
486
+ }
487
+ if (!args.some((a) => a.includes(LADDER_TASK_TOKEN))) {
488
+ throw new Error(`${root}.args must contain "${LADDER_TASK_TOKEN}" in one argument — otherwise the task is never passed to ${e.command}`);
489
+ }
490
+ const lane = { command: e.command, args };
491
+ const env = parseSpawnEnv(e.env, root);
492
+ if (env) {
493
+ for (const [name, value] of Object.entries(env)) {
494
+ if (typeof value === "string" && value.includes(LADDER_TASK_TOKEN)) {
495
+ throw new Error(`${root}.env.${name} must not contain "${LADDER_TASK_TOKEN}" — task text is never placed in a spawned ` +
496
+ `process's environment (use args for the task; "${LADDER_CONTEXT_TOKEN}" is available here)`);
497
+ }
498
+ }
499
+ lane.env = env;
500
+ }
501
+ return lane;
502
+ }
503
+ function parseLadder(raw, root) {
504
+ if (raw === undefined || raw === null)
505
+ return [];
506
+ if (!Array.isArray(raw))
507
+ throw new Error(`${root} must be an array of rungs`);
508
+ const out = [];
509
+ const seen = new Set();
510
+ for (const [i, entry] of raw.entries()) {
511
+ const where = `${root}[${i}]`;
512
+ if (typeof entry !== "object" || entry === null)
513
+ throw new Error(`${where} must be an object`);
514
+ const e = entry;
515
+ const id = e.id;
516
+ if (typeof id !== "string" || id.length === 0)
517
+ throw new Error(`${where}.id must be a non-empty string`);
518
+ if (seen.has(id))
519
+ throw new Error(`${where}.id "${id}" is already used by an earlier rung`);
520
+ seen.add(id);
521
+ const kind = e.kind;
522
+ if (kind !== "cli" && kind !== "relay")
523
+ throw new Error(`${where}.kind must be "cli" or "relay" (got ${JSON.stringify(kind)})`);
524
+ const rung = { id, kind, enabled: e.enabled !== false };
525
+ if (typeof e.quota === "string" && e.quota.length > 0)
526
+ rung.quota = e.quota;
527
+ if (typeof e.note === "string" && e.note.length > 0)
528
+ rung.note = e.note;
529
+ if (kind === "cli") {
530
+ if (typeof e.command !== "string" || e.command.length === 0) {
531
+ throw new Error(`${where}.command must be a non-empty string for a "cli" rung`);
532
+ }
533
+ if (!Array.isArray(e.args) || e.args.some((a) => typeof a !== "string")) {
534
+ throw new Error(`${where}.args must be an array of strings for a "cli" rung`);
535
+ }
536
+ const args = e.args;
537
+ if (!args.some((a) => a.includes(LADDER_TASK_TOKEN))) {
538
+ throw new Error(`${where}.args must contain "${LADDER_TASK_TOKEN}" in one argument — otherwise the task is never passed to ${e.command}`);
539
+ }
540
+ rung.command = e.command;
541
+ rung.args = args;
542
+ const env = parseSpawnEnv(e.env, where);
543
+ if (env)
544
+ rung.env = env;
545
+ }
546
+ else {
547
+ if (typeof e.spec !== "string" || e.spec.length === 0) {
548
+ throw new Error(`${where}.spec must be a non-empty string for a "relay" rung`);
549
+ }
550
+ rung.spec = e.spec;
551
+ }
552
+ out.push(rung);
553
+ }
554
+ return out;
555
+ }
556
+ function assertSpecResolvable(spec, providers, pools, where, disabled = new Set()) {
557
+ const specs = Array.isArray(spec) ? spec : [spec];
558
+ for (const s of specs) {
559
+ const { provider, model } = splitSpec(s);
560
+ if (provider === POOL_PREFIX) {
561
+ if (!model || !pools[model]) {
562
+ throw new Error(`config.${where} "${s}" names unknown pool "${model ?? ""}" (available: ${Object.keys(pools).join(", ") || "none"})`);
563
+ }
564
+ continue;
565
+ }
566
+ const p = providers[provider];
567
+ if (!p && disabled.has(provider)) {
568
+ throw new Error(`config.${where} "${s}" names provider "${provider}", which is DISABLED because its ` +
569
+ `base references an unset \${ENV} (see the warning above). Set the variable, or point ` +
570
+ `${where} somewhere else.`);
571
+ }
572
+ if (!p)
573
+ throw new Error(`config.${where} "${s}" names unknown provider "${provider}"`);
574
+ if (p.kind === "openai" && !model)
575
+ throw new Error(`config.${where} "${s}" needs a model id for openai provider "${provider}"`);
576
+ }
577
+ }
578
+ //# sourceMappingURL=routing-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-parser.js","sourceRoot":"","sources":["../../src/config/routing-parser.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { type KeystoreOptions } from "./keystore.js";
2
- import { type OffloadRule, type OffloadConfig, type ReshaperConfig, type ToolCallIdMode, type ThoughtSignatureMode, type ProviderCompatConfig, type RequestHeaders, type ResolvedTarget, type Config, type LaneProbeSettings } from "./config-types.js";
2
+ import { type OffloadRule, type ReshaperConfig, type ToolCallIdMode, type ThoughtSignatureMode, type ProviderCompatConfig, type RequestHeaders, type ResolvedTarget, type Config } from "./config-types.js";
3
+ export { AUTO_MODEL, POOL_PREFIX, splitSpec } from "./spec.js";
4
+ export { DEFAULT_LANE_PROBE, parseOffload, parseRouting } from "./config/routing-parser.js";
3
5
  export { EFFORT_LEVELS, CLAUDE_TIER_NAMES, type Mode, type AuthHeader, type Kind, type ProviderTierType, type EffortLevel, type ClaudeTierName, type OffloadScope, type OffloadRule, type OffloadConfig, type ReshaperConfig, type CredentialMode, type ToolCallIdMode, type ThoughtSignatureMode, type ProviderCompatConfig, type ProviderConfig, type Routing, type StickyRoutingConfig, type StickyConfig, type QuotaEnforcementConfig, type LatencyDemotionConfig, type HedgeConfig, type CliLaneTemplate, type PoolPolicy, type LadderRung, type RequestHeaders, type ResolvedTarget, type Config, type LaneProbeSettings, type McpSettings, } from "./config-types.js";
4
6
  /**
5
7
  * The resolved outbound tool-call-id shape for one provider.
@@ -28,10 +30,6 @@ export declare function resolveThoughtSignatureMode(p: {
28
30
  base: string;
29
31
  compat?: ProviderCompatConfig;
30
32
  }): ThoughtSignatureMode;
31
- /** Reserved provider-namespace prefix for `pool/<name>` routing. */
32
- export declare const POOL_PREFIX = "pool";
33
- /** Reserved model name for auto-dispatch to the ladder's first ready relay rung. */
34
- export declare const AUTO_MODEL = "auto";
35
33
  /** True when this request is a marked Claude Code or local Codex child turn. */
36
34
  export declare function isSubagentRequest(reqJson: unknown, headers?: RequestHeaders): boolean;
37
35
  /**
@@ -118,11 +116,6 @@ export declare class RoutingError extends Error {
118
116
  * "succeeded against a much weaker model than you asked for" failure. Fail loudly instead.
119
117
  */
120
118
  export declare function expandPoolSpecs(specs: string[], cfg: Config): string[];
121
- /** Split a "provider/model" spec into its parts (model may contain further slashes). */
122
- export declare function splitSpec(spec: string): {
123
- provider: string;
124
- model?: string;
125
- };
126
119
  /**
127
120
  * Resolve an inbound `model` to an array of concrete targets (primary + fallbacks).
128
121
  */
@@ -142,6 +135,3 @@ export interface ConfigOverrides {
142
135
  }
143
136
  /** Load + validate a config file, failing loudly on anything unusable. */
144
137
  export declare function loadConfig(path: string, overrides?: ConfigOverrides, keystoreOptions?: KeystoreOptions): Config;
145
- export declare const DEFAULT_LANE_PROBE: LaneProbeSettings;
146
- /** Parse the legacy global switch or the independently keyed client-rule form. */
147
- export declare function parseOffload(raw: unknown): OffloadConfig;