instar 1.3.727 → 1.3.728

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.
@@ -80,6 +80,37 @@ export interface IntelligenceRouterOptions {
80
80
  * (legacy unbounded behavior, for callers that build the router without the policy).
81
81
  */
82
82
  swapAttemptTimeoutMs?: number;
83
+ /**
84
+ * Per-TARGET-framework swap-attempt caps in ms (per-target-swap-timeout-spec.md).
85
+ * Resolution per swap target: `byFramework[target]` (if valid: finite number > 0)
86
+ * → the global `swapAttemptTimeoutMs` (if valid) → undefined (no cap). An INVALID
87
+ * per-framework value (0, negative, NaN, Infinity, non-number) FALLS THROUGH to
88
+ * the global — never "no cap", never an immediate-0ms kill (FD5). DEFAULT UNSET ⇒
89
+ * the global cap applies to every target — byte-identical routing behavior to today.
90
+ */
91
+ swapAttemptTimeoutMsByFramework?: Partial<Record<IntelligenceFramework, number>>;
92
+ /**
93
+ * Clamp (ms) on any single resolved swap-attempt cap, so a huge/typo'd value
94
+ * cannot create an effectively unbounded subprocess that pins a host spawn-cap
95
+ * slot (FD7). The value is itself validated (finite > 0); invalid/unset ⇒ 120000.
96
+ */
97
+ swapAttemptTimeoutMsMax?: number;
98
+ /**
99
+ * Wall-clock TOTAL budget (ms) over the WHOLE failure-swap tail (FD6). UNSET ⇒ no
100
+ * budget enforcement — semantics unchanged from today (the dark default). When set,
101
+ * each attempt's effective cap is `min(resolvedCap, budgetRemaining)` — measured on
102
+ * a MONOTONIC clock, never Date.now() — and the loop stops and falls closed once
103
+ * `budgetRemaining ≤ 250ms`, so worst-case swap-tail latency is literally ≤ this
104
+ * value (the budget clamps each IN-FLIGHT attempt, not just the loop gate). An
105
+ * invalid value (0, negative, NaN, non-number) is treated as unset.
106
+ */
107
+ swapTotalBudgetMs?: number;
108
+ /**
109
+ * Test seam: the monotonic clock used for the total-budget elapsed measurement.
110
+ * Defaults to `performance.now()` — a wall-clock jump (NTP step, DST) must not
111
+ * make the budget spuriously short or long (round-3 external finding).
112
+ */
113
+ monotonicNow?: () => number;
83
114
  /**
84
115
  * Build a provider for a non-default framework, with its OWN circuit breaker.
85
116
  * Returns null when that framework's binary isn't available. Called at most
@@ -127,10 +158,36 @@ export interface IntelligenceRouterOptions {
127
158
  queueAttemptTimeoutMs?: number;
128
159
  };
129
160
  }
161
+ /**
162
+ * resolveSwapCap — per-TARGET swap-attempt cap resolution
163
+ * (docs/specs/per-target-swap-timeout-spec.md, `resolveCap` contract).
164
+ *
165
+ * Resolution: `byFramework[target]` (if valid) → `globalCap` (if valid) →
166
+ * `undefined` (no cap — today's behavior when the global is ≤0/unset). An
167
+ * INVALID per-framework value (0, negative, NaN, Infinity, non-number) FALLS
168
+ * THROUGH to the global — it NEVER means "no cap" and NEVER produces an
169
+ * immediate-0ms kill (FD5: per-framework config cannot express "unbounded";
170
+ * only the global's ≤0/unset does — closes the accidental-uncap footgun).
171
+ * The resolved cap is clamped to `maxCap` (itself validated; invalid → 120s
172
+ * default) so a huge/typo'd value cannot pin a host spawn-cap slot unbounded.
173
+ *
174
+ * Exported for direct unit testing (pure function, no router state).
175
+ */
176
+ export declare function resolveSwapCap(target: IntelligenceFramework, globalCap: number | undefined, byFramework: Partial<Record<IntelligenceFramework, number>> | undefined, maxCap: number | undefined): number | undefined;
130
177
  export declare class IntelligenceRouter implements IntelligenceProvider {
131
178
  private readonly opts;
132
179
  private readonly cache;
180
+ /** Unknown byFramework keys already warned about (warn ONCE per key, never per call). */
181
+ private warnedUnknownCapKeys?;
133
182
  constructor(opts: IntelligenceRouterOptions);
183
+ /**
184
+ * Unknown-key hygiene (per-target-swap-timeout-spec.md, change surface): a stray/
185
+ * misspelled key arriving from raw JSON config has NO effect (that target simply
186
+ * falls through to the global cap) — but it is logged once so the typo is visible
187
+ * instead of silently ignored. Type-level the map is keyed to the framework union;
188
+ * this is the runtime backstop.
189
+ */
190
+ private warnUnknownSwapCapKeys;
134
191
  /**
135
192
  * The framework the default (shared, global-breaker) provider speaks — i.e. the
136
193
  * framework a component routes to when nothing routes it elsewhere. The
@@ -1 +1 @@
1
- {"version":3,"file":"IntelligenceRouter.d.ts","sourceRoot":"","sources":["../../src/core/IntelligenceRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IntelligenceRouter.d.ts","sourceRoot":"","sources":["../../src/core/IntelligenceRouter.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,78 @@
24
24
  * outage's worth of calls onto Claude all at once.
25
25
  */
26
26
  import { isComponentCategory, categoryForComponent, } from './componentCategories.js';
27
+ /**
28
+ * Runtime framework ids for the unknown-key hygiene warning on
29
+ * `swapAttemptTimeoutMsByFramework` (per-target-swap-timeout-spec.md, change
30
+ * surface). The TYPE is the compile-time guard; this set catches a stray key
31
+ * arriving from raw JSON config at runtime (no effect — warn once, ignore).
32
+ */
33
+ const KNOWN_FRAMEWORKS = new Set(['claude-code', 'codex-cli', 'gemini-cli', 'pi-cli']);
34
+ /** Default clamp on any single resolved swap-attempt cap (per-target-swap-timeout-spec.md FD7). */
35
+ const DEFAULT_SWAP_ATTEMPT_TIMEOUT_MAX_MS = 120_000;
36
+ /**
37
+ * Below this much remaining total budget (ms), a swap attempt is not worth
38
+ * admitting — the loop stops and falls closed (per-target-swap-timeout-spec.md
39
+ * FD6, fixed floor). A configured `swapTotalBudgetMs` below this value passes
40
+ * validation but simply disables swapping on the first attempt (fail-SAFE).
41
+ */
42
+ const SWAP_BUDGET_MIN_REMAINING_MS = 250;
43
+ /**
44
+ * The spec's uniform validity contract for every timeout/budget value:
45
+ * `typeof x === 'number' && Number.isFinite(x) && x > 0`. `0`, negatives, NaN,
46
+ * Infinity, and non-numbers are all INVALID — selection never uses `||` (the
47
+ * zero-is-falsy lesson).
48
+ */
49
+ function isValidMs(x) {
50
+ return typeof x === 'number' && Number.isFinite(x) && x > 0;
51
+ }
52
+ /**
53
+ * resolveSwapCap — per-TARGET swap-attempt cap resolution
54
+ * (docs/specs/per-target-swap-timeout-spec.md, `resolveCap` contract).
55
+ *
56
+ * Resolution: `byFramework[target]` (if valid) → `globalCap` (if valid) →
57
+ * `undefined` (no cap — today's behavior when the global is ≤0/unset). An
58
+ * INVALID per-framework value (0, negative, NaN, Infinity, non-number) FALLS
59
+ * THROUGH to the global — it NEVER means "no cap" and NEVER produces an
60
+ * immediate-0ms kill (FD5: per-framework config cannot express "unbounded";
61
+ * only the global's ≤0/unset does — closes the accidental-uncap footgun).
62
+ * The resolved cap is clamped to `maxCap` (itself validated; invalid → 120s
63
+ * default) so a huge/typo'd value cannot pin a host spawn-cap slot unbounded.
64
+ *
65
+ * Exported for direct unit testing (pure function, no router state).
66
+ */
67
+ export function resolveSwapCap(target, globalCap, byFramework, maxCap) {
68
+ const perTarget = byFramework?.[target];
69
+ const candidate = isValidMs(perTarget) ? perTarget : isValidMs(globalCap) ? globalCap : undefined;
70
+ if (candidate === undefined)
71
+ return undefined;
72
+ const effMax = isValidMs(maxCap) ? maxCap : DEFAULT_SWAP_ATTEMPT_TIMEOUT_MAX_MS;
73
+ return Math.min(candidate, effMax);
74
+ }
75
+ /**
76
+ * withSwapTimeout — the shipped Promise.race crash-safe pattern (per-input
77
+ * settlement handlers; a late reject/resolve from the abandoned attempt is
78
+ * handled/ignored), PLUS timer hygiene: the pending timeout timer is CLEARED
79
+ * on settle in a `finally` so a fast success does not leak a timer per call
80
+ * (per-target-swap-timeout-spec.md FD7 / codex-review finding). The rejection
81
+ * message format (`swap-attempt-timeout: <target> (<cap>ms)`) is load-bearing —
82
+ * the swap loop's degrade-reason detection prefix-matches it.
83
+ */
84
+ async function withSwapTimeout(promise, capMs, target) {
85
+ let timer;
86
+ try {
87
+ return await Promise.race([
88
+ promise,
89
+ new Promise((_, reject) => {
90
+ timer = setTimeout(() => reject(new Error(`swap-attempt-timeout: ${target} (${capMs}ms)`)), capMs);
91
+ }),
92
+ ]);
93
+ }
94
+ finally {
95
+ if (timer !== undefined)
96
+ clearTimeout(timer);
97
+ }
98
+ }
27
99
  /**
28
100
  * Is this a rate-limit / usage-limit / 429 error? The circuit-breaking provider wraps these as a
29
101
  * `RateLimitError` (name-checked, no import needed); we also duck-type the message so a provider
@@ -38,9 +110,33 @@ function isRateLimitError(e) {
38
110
  export class IntelligenceRouter {
39
111
  opts;
40
112
  cache = new Map();
113
+ /** Unknown byFramework keys already warned about (warn ONCE per key, never per call). */
114
+ warnedUnknownCapKeys;
41
115
  constructor(opts) {
42
116
  this.opts = opts;
43
117
  }
118
+ /**
119
+ * Unknown-key hygiene (per-target-swap-timeout-spec.md, change surface): a stray/
120
+ * misspelled key arriving from raw JSON config has NO effect (that target simply
121
+ * falls through to the global cap) — but it is logged once so the typo is visible
122
+ * instead of silently ignored. Type-level the map is keyed to the framework union;
123
+ * this is the runtime backstop.
124
+ */
125
+ warnUnknownSwapCapKeys(byFramework) {
126
+ if (!byFramework)
127
+ return;
128
+ for (const key of Object.keys(byFramework)) {
129
+ if (KNOWN_FRAMEWORKS.has(key))
130
+ continue;
131
+ if (!this.warnedUnknownCapKeys)
132
+ this.warnedUnknownCapKeys = new Set();
133
+ if (this.warnedUnknownCapKeys.has(key))
134
+ continue;
135
+ this.warnedUnknownCapKeys.add(key);
136
+ console.warn(`IntelligenceRouter: unknown framework key '${key}' in swapAttemptTimeoutMsByFramework — ` +
137
+ `ignored (that key has no effect; targets fall through to the global cap)`);
138
+ }
139
+ }
44
140
  /**
45
141
  * The framework the default (shared, global-breaker) provider speaks — i.e. the
46
142
  * framework a component routes to when nothing routes it elsewhere. The
@@ -180,18 +276,23 @@ export class IntelligenceRouter {
180
276
  this.opts.onHeuristicFallthrough?.(component ?? '(none)', framework);
181
277
  throw err; // not gating/deferrable, or no swap configured ⇒ today's behavior
182
278
  }
183
- // §4.5 bounded per-attempt swap timeout: a positive cap races each attempt so a
184
- // slow-but-not-erroring provider is abandoned at the cap (total swap latency ≤
185
- // cap × (1 + tail.length)) instead of stacking long waits and re-creating the
186
- // very stall this policy exists to prevent. The cap also flows through to the
279
+ // §4.5 bounded per-attempt swap timeout, now resolved PER TARGET
280
+ // (docs/specs/per-target-swap-timeout-spec.md): each attempt's cap resolves
281
+ // `byFramework[target]` global undefined, clamped to `maxCap`, so a
282
+ // slow-but-honest target (gemini p50 8.5s) can be GIVEN its measured time
283
+ // instead of being killed at a one-size-fits-all 5s. When a TOTAL budget is
284
+ // set, each attempt is additionally clamped to the remaining budget (monotonic
285
+ // clock) and the loop falls closed once < 250ms remains — so the whole tail is
286
+ // literally ≤ swapTotalBudgetMs. All three knobs default UNSET ⇒ byte-identical
287
+ // routing behavior to the single global cap. The cap also flows through to the
187
288
  // provider as `timeoutMs` so the CLI subprocess SIGTERMs itself at the same bound.
188
- const capMs = this.opts.swapAttemptTimeoutMs;
189
- const cap = typeof capMs === 'number' && capMs > 0 ? capMs : undefined;
190
- // Pass the cap through as the provider's per-call timeout so the subprocess
191
- // self-terminates at the bound (no AbortSignal exists on IntelligenceOptions).
192
- const attemptOptions = cap
193
- ? { ...(options ?? {}), timeoutMs: cap }
194
- : options;
289
+ const globalCapMs = this.opts.swapAttemptTimeoutMs;
290
+ const byFramework = this.opts.swapAttemptTimeoutMsByFramework;
291
+ this.warnUnknownSwapCapKeys(byFramework);
292
+ const maxCapMs = this.opts.swapAttemptTimeoutMsMax;
293
+ const budgetMs = isValidMs(this.opts.swapTotalBudgetMs) ? this.opts.swapTotalBudgetMs : undefined;
294
+ const monotonicNow = this.opts.monotonicNow ?? (() => performance.now());
295
+ const swapStartedAt = monotonicNow();
195
296
  for (const target of swapTargets) {
196
297
  // GATING budget: if the awaited gate's total wall-clock budget is consumed, stop swapping
197
298
  // and fail closed now (responsiveness over completeness — spec §3a). Deferrable calls have
@@ -203,16 +304,30 @@ export class IntelligenceRouter {
203
304
  const tp = this.resolveProvider(target);
204
305
  if (!tp)
205
306
  continue; // target binary missing → skip
307
+ let cap = resolveSwapCap(target, globalCapMs, byFramework, maxCapMs);
308
+ if (budgetMs !== undefined) {
309
+ const remaining = budgetMs - (monotonicNow() - swapStartedAt);
310
+ // Too little budget left to be worth an attempt → stop, fall closed (FD6).
311
+ if (remaining <= SWAP_BUDGET_MIN_REMAINING_MS)
312
+ break;
313
+ // The budget clamps each IN-FLIGHT attempt, not just the loop gate — an
314
+ // attempt admitted at budget−ε must NOT run its full per-target cap
315
+ // (worst case would be budget + maxCap, not ≤ budget). It also bounds an
316
+ // otherwise-UNcapped attempt (no per-target cap, global ≤0/unset).
317
+ cap = cap === undefined ? remaining : Math.min(cap, remaining);
318
+ }
319
+ // Pass the cap through as the provider's per-call timeout so the subprocess
320
+ // self-terminates at the bound (no AbortSignal exists on IntelligenceOptions).
321
+ const attemptOptions = cap !== undefined ? { ...(options ?? {}), timeoutMs: cap } : options;
206
322
  try {
207
- // Promise.race is the shipped, crash-safe pattern (InputGuard precedent):
208
- // it attaches a settlement handler to EACH input, so a late rejection from
209
- // an abandoned attempt is already handled (no unhandledRejection) and a late
210
- // resolve is ignored. NEVER a detached/awaited handle.
211
- const result = cap
212
- ? await Promise.race([
213
- tp.evaluate(prompt, attemptOptions),
214
- new Promise((_, reject) => setTimeout(() => reject(new Error(`swap-attempt-timeout: ${target} (${cap}ms)`)), cap)),
215
- ])
323
+ // withSwapTimeout keeps the shipped, crash-safe Promise.race pattern
324
+ // (InputGuard precedent): it attaches a settlement handler to EACH input,
325
+ // so a late rejection from an abandoned attempt is already handled (no
326
+ // unhandledRejection) and a late resolve is ignored. NEVER a detached/
327
+ // awaited handle. It additionally CLEARS the timer on settle (FD7) so a
328
+ // fast success does not leak a pending timer.
329
+ const result = cap !== undefined
330
+ ? await withSwapTimeout(tp.evaluate(prompt, attemptOptions), cap, target)
216
331
  : await tp.evaluate(prompt, attemptOptions);
217
332
  this.opts.onDegrade?.({
218
333
  component: component ?? '(none)',
@@ -1 +1 @@
1
- {"version":3,"file":"IntelligenceRouter.js","sourceRoot":"","sources":["../../src/core/IntelligenceRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IntelligenceRouter.js","sourceRoot":"","sources":["../../src/core/IntelligenceRouter.ts"],"names":[],"mappings":"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"}
@@ -3066,6 +3066,45 @@ export interface InstarConfig {
3066
3066
  * so absence is the default state, never a persisted block.
3067
3067
  */
3068
3068
  swapAttemptTimeoutMs?: number;
3069
+ /**
3070
+ * Per-TARGET-framework swap-attempt caps in ms for the failure-swap loop
3071
+ * (docs/specs/per-target-swap-timeout-spec.md). Resolution per swap target:
3072
+ * `byFramework[target]` (if a valid finite number > 0) → the global
3073
+ * `swapAttemptTimeoutMs` → no cap. An INVALID per-framework value (0, negative,
3074
+ * NaN, non-number) FALLS THROUGH to the global — it never means "no cap" and
3075
+ * never produces an immediate-0ms kill (FD5: per-framework config cannot
3076
+ * express "unbounded"; only the global's ≤0/unset does). DEFAULT UNSET ⇒ the
3077
+ * global cap applies to every target, byte-identical to today (dark ship;
3078
+ * deliberately kept out of ConfigDefaults/migrateConfig like
3079
+ * swapAttemptTimeoutMs, so absence is the default state).
3080
+ * Recommended opt-in package (set TOGETHER with swapTotalBudgetMs — FD8, so
3081
+ * the caps and their reachability ceiling arrive as one package):
3082
+ * `{ "claude-code": 8000, "pi-cli": 9000, "gemini-cli": 18000, "codex-cli": 45000 }`
3083
+ * with `swapTotalBudgetMs: 40000` (each cap ≥ the framework's measured p95 with
3084
+ * margin — llm-pathway-bench N=30). NOTE: the swap loop is sequential, so
3085
+ * `failureSwap` target ORDER is latency-load-bearing — order fastest-first
3086
+ * (cap ≠ priority), and keep caps ≤ the circuit breaker's failure sensitivity
3087
+ * so a chronically-slow target still trips the breaker.
3088
+ */
3089
+ swapAttemptTimeoutMsByFramework?: Partial<Record<'claude-code' | 'codex-cli' | 'gemini-cli' | 'pi-cli', number>>;
3090
+ /**
3091
+ * Clamp (ms) on any single resolved swap-attempt cap, so a huge/typo'd
3092
+ * per-framework value cannot create an effectively unbounded subprocess that
3093
+ * pins a host spawn-cap slot (per-target-swap-timeout-spec.md FD7). The value
3094
+ * is itself validated (finite > 0); invalid/unset ⇒ 120000 (120s).
3095
+ */
3096
+ swapAttemptTimeoutMsMax?: number;
3097
+ /**
3098
+ * Wall-clock TOTAL budget (ms) over the WHOLE failure-swap tail
3099
+ * (per-target-swap-timeout-spec.md FD6). UNSET ⇒ no total-budget enforcement —
3100
+ * semantics unchanged from today (the dark default). When set, each swap
3101
+ * attempt's effective cap is `min(resolvedCap, budgetRemaining)` on a MONOTONIC
3102
+ * clock and the loop stops and falls closed once ≤ 250ms remains — so the
3103
+ * worst-case swap-tail latency is literally ≤ this value. An invalid value
3104
+ * (0, negative, NaN, non-number) is treated as unset (no enforcement).
3105
+ * Recommended alongside the per-framework caps: 40000.
3106
+ */
3107
+ swapTotalBudgetMs?: number;
3069
3108
  /**
3070
3109
  * Pinned-callsite model overrides (docs/LLM-ROUTING-REGISTRY.md "Risk items"
3071
3110
  * #3/#5/#6/#7 — the hardcoded-model callsites that bypass the router).