llm-relay 0.52.0 → 0.53.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.
@@ -278,6 +278,7 @@ export class CircuitBreaker {
278
278
  if (state.pings.length > MAX_PING_HISTORY)
279
279
  state.pings.shift();
280
280
  if (outcome.ok) {
281
+ const wasCooling = state.cooldownUntil > now;
281
282
  state.consecutiveFailures = 0;
282
283
  state.cooldownUntil = 0;
283
284
  state.cooldownSource = null;
@@ -286,6 +287,10 @@ export class CircuitBreaker {
286
287
  state.credentialFailures = 0;
287
288
  state.credentialFaultUntil = 0;
288
289
  delete state.lastCredentialStatus;
290
+ // A success RETRACTS a persisted cooldown, so the file must be rewritten too. Skipping the
291
+ // notify when nothing was cooling keeps a healthy relay from writing on every request.
292
+ if (wasCooling)
293
+ this.notifyCoolingChanged();
289
294
  return;
290
295
  }
291
296
  state.consecutiveFailures += 1;
@@ -322,6 +327,10 @@ export class CircuitBreaker {
322
327
  state.cooldownUntil = now + DEFAULT_COOLDOWN_MS;
323
328
  state.cooldownSource = "default";
324
329
  }
330
+ // One notify for the whole ladder above, whichever branch set the cooldown. A failure that
331
+ // set none (below the trip threshold, no Retry-After) leaves nothing new to persist.
332
+ if (state.cooldownUntil > now)
333
+ this.notifyCoolingChanged();
325
334
  }
326
335
  /** Retain a fresh axis/period tuple without discarding another axis from an earlier response. */
327
336
  recordQuotaObservations(target, observations) {
@@ -402,6 +411,10 @@ export class CircuitBreaker {
402
411
  }
403
412
  breakerCells.sort(compareClearedCells);
404
413
  credentialFaults.sort(compareClearedCells);
414
+ // `llm-relay cooldowns clear` must reach the FILE too. Without this a cleared cooldown would
415
+ // come back on the next restart, which is exactly the state the operator just retracted.
416
+ if (breakerCells.length > 0)
417
+ this.notifyCoolingChanged();
405
418
  return { breakerCells, credentialFaults };
406
419
  }
407
420
  /** Exact-cell credential fault only. */
@@ -429,6 +442,7 @@ export class CircuitBreaker {
429
442
  return; // an existing longer cooldown keeps its own source
430
443
  state.cooldownUntil = until;
431
444
  state.cooldownSource = "quota";
445
+ this.notifyCoolingChanged();
432
446
  }
433
447
  /** Active backend attempts for one credential slot across all of its deployments. */
434
448
  inFlightCredential(credentialId) {
@@ -442,6 +456,83 @@ export class CircuitBreaker {
442
456
  getAllStates() {
443
457
  return this.states;
444
458
  }
459
+ /**
460
+ * The cooling half of every cell that is still cooling, for `breaker-persistence.ts`.
461
+ *
462
+ * Pure and IO-free on purpose: this module holds no file handles, so persistence stays a
463
+ * separate concern that a bare programmatic proxy can simply not install. Cells that are not
464
+ * cooling are omitted rather than written as empty rows.
465
+ */
466
+ exportCooldowns(now = Date.now()) {
467
+ const rows = [];
468
+ for (const state of this.states.values()) {
469
+ if (state.cooldownUntil <= now)
470
+ continue;
471
+ rows.push({
472
+ provider: state.target.provider,
473
+ model: state.target.model,
474
+ kind: state.target.kind,
475
+ credentialId: state.target.credentialId,
476
+ ...(state.target.base === undefined ? {} : { base: state.target.base }),
477
+ cooldownUntil: state.cooldownUntil,
478
+ cooldownSource: state.cooldownSource,
479
+ unexplained429s: state.unexplained429s,
480
+ ...(state.lastStatus === undefined ? {} : { lastStatus: state.lastStatus }),
481
+ });
482
+ }
483
+ return rows;
484
+ }
485
+ /**
486
+ * Re-apply persisted cooling rows, returning how many were applied.
487
+ *
488
+ * ⚠ NEVER overwrites a cooldown this process has already learned. A restore runs at startup, but
489
+ * making it defensive costs nothing and means a late or repeated call cannot shorten or extend
490
+ * live state — the same rule `recordQuotaCooldown` follows ("a quota demotion never SHORTENS
491
+ * someone else's cooldown"). Rows at or before `now` are already excluded by
492
+ * `loadBreakerCooldowns`; the check is repeated here so a direct caller cannot bypass it.
493
+ */
494
+ restoreCooldowns(rows, now = Date.now()) {
495
+ let applied = 0;
496
+ for (const row of rows) {
497
+ if (row.cooldownUntil <= now)
498
+ continue;
499
+ const target = {
500
+ provider: row.provider,
501
+ model: row.model,
502
+ kind: row.kind,
503
+ credentialId: row.credentialId,
504
+ ...(row.base === undefined ? {} : { base: row.base }),
505
+ };
506
+ const state = this.getOrCreate(target);
507
+ if (state.cooldownUntil > now)
508
+ continue;
509
+ state.cooldownUntil = row.cooldownUntil;
510
+ state.cooldownSource = row.cooldownSource;
511
+ state.unexplained429s = row.unexplained429s;
512
+ if (row.lastStatus !== undefined)
513
+ state.lastStatus = row.lastStatus;
514
+ applied += 1;
515
+ }
516
+ return applied;
517
+ }
518
+ /**
519
+ * Register the persistence listener. At most one: a second install would double every write,
520
+ * and there is exactly one file.
521
+ */
522
+ onCoolingChanged(listener) {
523
+ this.#coolingChanged = listener;
524
+ }
525
+ /** Fired wherever cooling state changes; a no-op until persistence is installed. */
526
+ #coolingChanged = null;
527
+ notifyCoolingChanged() {
528
+ // Never let a persistence failure reach the request path — this runs inside outcome recording.
529
+ try {
530
+ this.#coolingChanged?.();
531
+ }
532
+ catch {
533
+ /* best-effort persistence */
534
+ }
535
+ }
445
536
  /** Deployment measurement merges timestamp-sorted pings without inflating confidence. */
446
537
  getDeploymentMeasurement(deployment) {
447
538
  const cells = [...this.states.values()].filter((state) => sameDeployment(state.target, deployment) && state.pings.length > 0);
@@ -1 +1 @@
1
- {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAa3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAsGhC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,8BAA8B,GAAuC;IACzE,UAAU,EAAE,IAAI;IAChB,2BAA2B,EAAE,IAAI;IACjC,UAAU,EAAE,IAAI;IAChB,qBAAqB,EAAE,IAAI;IAC3B,qBAAqB,EAAE,KAAK;CACyB,CAAC;AAExD,MAAM,wBAAwB,GAAG;IAC/B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU;CAC/B,CAAC;AACX,MAAM,+BAA+B,GAAG,KAAK,CAAC;AAC9C,MAAM,2BAA2B,GAAG,SAAS,CAAC;AAC9C,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,uBAAuB,GAAG,OAAO,CAAC;AACxC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,SAAS,WAAW,CAAC,OAGpB;IACC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,OAAO,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;QAClD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA8B;IACtD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC7D,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,MAA8B,EAC9B,UAAsC;IAEtC,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAA8B,EAC9B,QAA+B;IAE/B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;QAC1C,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;QACjE,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,WAAW,CAAC,MAA8B;IACjD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAqB,EAAE,CAAqB;IACvE,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5C,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAE1D,MAAM,OAAO,cAAc;IACjB,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,8EAA8E;IACtE,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,WAAW,GAAG,CAAC,CAAC;IAChB,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpD,SAAS,GAAG,IAAI,OAAO,EAAgC,CAAC;IAExD,oFAAoF;IAC5E,MAAM,CAAC,MAA8B;QAC3C,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI;YAC1B,CAAC,CAAC,MAAM,CAAC,YAAY;YACrB,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IAEO,WAAW,CAAC,MAA8B;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,KAAK,GAAiB;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;YACpC,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,CAAC;YAClB,KAAK,EAAE,EAAE;YACT,iBAAiB,EAAE,EAAE;YACrB,kBAAkB,EAAE,CAAC;YACrB,oBAAoB,EAAE,CAAC;SACxB,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,CACV,MAA8B;QAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAgB,EAAE;YACnC,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACzB,MAAM,CAAC,YAAY,EACnB,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAC5D,CAAC;QACF,mBAAmB,CAAC,GAAG,CAAC,MAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc,CACZ,MAAqB,EACrB,WAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YACxC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;aACtE,CAAC;QACJ,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBAC7B,QAAQ,EAAE,WAAW,CAAC,MAAM;iBAC7B;aACF,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,CAAC;QACjE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;YACtC,GAAG,WAAW;YACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YAChD,iBAAiB,EACf,WAAW,CAAC,iBAAiB,KAAK,SAAS;gBACzC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM,CAAC,MAAM,CACX,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE,CACrD,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC,CACvC,CACF;SACR,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,iBAAiB,CAAC;QAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAChD,CAAC;IAED,eAAe,CACb,MAAqB,EACrB,OAAuB;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YACxC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;aACtE,CAAC;QACJ,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7D,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBAC7B,QAAQ,EAAE,OAAO,CAAC,MAAM;iBACzB;aACF,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACpF,IAAI,QAAQ,IAAI,CAAC;YAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;;YAC/E,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,oBAAoB,CACvB,MAAM,CAAC,KAAK,CAAC,MAAM,EACnB,OAAO,EACP,MAAM,CAAC,KAAK,CAAC,WAAW,CACzB,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,gBAAgB,CACtB,MAAqB;QAErB,IAAI,OAAQ,MAAkB,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,YAAY,GAAG,MAAgB,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EACF,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;wBACrC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,MAAM;wBACnD,CAAC,CAAC,gBAAgB;wBAClB,CAAC,CAAC,cAAc;iBACrB;aACF,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,WAAW;YACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAEO,oBAAoB,CAC1B,MAA8B,EAC9B,OAAuB,EACvB,WAA+B;QAE/B,IAAI,OAAO,CAAC,QAAQ,KAAK,WAAW;YAAE,OAAO;QAC7C,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACrE,yFAAyF;QACzF,0FAA0F;QAC1F,4FAA4F;QAC5F,2BAA2B;QAC3B,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,OAAO;QAChE,IAAI,OAAO,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,EAAE,EAAE,OAAO,CAAC,WAAW;aACxB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACrD,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,IACE,OAAO,CAAC,MAAM,KAAK,IAAI;YACvB,OAAO,CAAC,MAAM,IAAI,GAAG;YACrB,OAAO,CAAC,MAAM,GAAG,GAAG;YACpB,OAAO,CAAC,MAAM,KAAK,GAAG;YACtB,OAAO,CAAC,MAAM,KAAK,GAAG;YACtB,OAAO,CAAC,MAAM,KAAK,GAAG;YACtB,OAAO,CAAC,MAAM,KAAK,GAAG;YAEtB,OAAO;QACT,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC9B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,EAAE,EAAE,OAAO,CAAC,WAAW;YACvB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,WAAW,EAAE,YAAY;SAChE,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,SAAS,CAAC,MAA8B,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC;IAC3D,CAAC;IAED,6DAA6D;IAC7D,aAAa,CACX,MAA8B,EAC9B,OAOC;QAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC9B,GAAG,OAAO;YACV,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB,CACxB,MAA8B,EAC9B,OAAsB;QAEtB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAChE,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACf,EAAE,EAAE,OAAO,CAAC,SAAS;YACrB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC;YAC1B,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB;YAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/D,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;YAC7C,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC9B,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;YACxB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;YAC5B,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC;YAC1B,kEAAkE;YAClE,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC7B,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC,oBAAoB,CAAC;YAClC,2FAA2F;YAC3F,uFAAuF;YACvF,IAAI,UAAU;gBAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAC/B,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC;QAC5B,MAAM,KAAK,GACT,OAAO,CAAC,YAAY,KAAK,SAAS;YAChC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,kBAAkB,EAClB,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,YAAY,CAAC,CACnD,CAAC;QACR,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,KAAK,CAAC,aAAa,GAAG,GAAG,GAAG,KAAK,CAAC;gBAClC,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC;YACvC,CAAC;iBAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,aAAa,GAAG,GAAG,GAAG,+BAA+B,CAAC;gBAC5D,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,KAAK,CAAC,eAAe,GAAG,CAAC,EACzB,wBAAwB,CAAC,MAAM,GAAG,CAAC,CACpC,CAAC;gBACF,KAAK,CAAC,aAAa,GAAG,GAAG,GAAG,wBAAwB,CAAC,KAAK,CAAE,CAAC;gBAC7D,KAAK,CAAC,cAAc;oBAClB,KAAK,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;YAC3D,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClC,KAAK,CAAC,aAAa,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,2BAA2B,CAAC,CAAC;YACnE,KAAK,CAAC,cAAc,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;QACpE,CAAC;aAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,aAAa,GAAG,GAAG,GAAG,KAAK,CAAC;YAClC,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC;QACvC,CAAC;aAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,wBAAwB,EAAE,CAAC;YACjE,KAAK,CAAC,aAAa,GAAG,GAAG,GAAG,mBAAmB,CAAC;YAChD,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;QACnC,CAAC;QACD,2FAA2F;QAC3F,qFAAqF;QACrF,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG;YAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC7D,CAAC;IAED,iGAAiG;IACzF,uBAAuB,CAC7B,MAA8B,EAC9B,YAAqD;QAErD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,CAAC,iBAAiB,GAAG,sBAAsB,CAC9C,KAAK,CAAC,iBAAiB,EACvB,YAAY,CACb,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,qBAAqB,CACnB,MAA8B,EAC9B,MAAc,EACd,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QAEf,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,oBAAoB,CAC1B,MAA8B,EAC9B,MAAc,EACd,EAAU;QAEV,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAC9B,KAAK,CAAC,oBAAoB,GAAG,MAAM,CAAC;QACpC,KAAK,CAAC,oBAAoB,GAAG,EAAE,GAAG,uBAAuB,CAAC;IAC5D,CAAC;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,YAAoB;QACxC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,YAAY;gBAAE,SAAS;YACzD,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC;gBACpE,SAAS;YACX,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC/B,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC,oBAAoB,CAAC;YAClC,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,iFAAiF;IACjF,yBAAyB,CAAC,QAA+B;QACvD,MAAM,gBAAgB,GAAyB,EAAE,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;gBAAE,SAAS;YAC5D,IACE,KAAK,CAAC,oBAAoB,KAAK,CAAC;gBAChC,KAAK,CAAC,kBAAkB,KAAK,CAAC;gBAC9B,KAAK,CAAC,oBAAoB,KAAK,SAAS;gBACxC,SAAS;YACX,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC/B,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC,oBAAoB,CAAC;YAClC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAA+B;QAChD,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAyB,EAAE,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;gBAAE,SAAS;YAE5D,IACE,KAAK,CAAC,aAAa,KAAK,CAAC;gBACzB,KAAK,CAAC,cAAc,KAAK,IAAI;gBAC7B,KAAK,CAAC,eAAe,KAAK,CAAC,EAC3B,CAAC;gBACD,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;gBACxB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC5B,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC;gBAC1B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,IACE,KAAK,CAAC,oBAAoB,KAAK,CAAC;gBAChC,KAAK,CAAC,kBAAkB,KAAK,CAAC;gBAC9B,KAAK,CAAC,oBAAoB,KAAK,SAAS,EACxC,CAAC;gBACD,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;gBAC/B,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC,oBAAoB,CAAC;gBAClC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,6FAA6F;QAC7F,yFAAyF;QACzF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;IAC5C,CAAC;IAED,wCAAwC;IACxC,kBAAkB,CAChB,MAA8B,EAC9B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC;IACjE,CAAC;IAED;;;;;;;;;;;OAWG;IACH,mBAAmB,CACjB,MAA8B,EAC9B,KAAa,EACb,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QAEf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK;YAAE,OAAO,CAAC,mDAAmD;QAC7F,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC5B,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,qFAAqF;IACrF,kBAAkB,CAAC,YAAoB;QACrC,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B;IAC7B,QAAQ,CAAC,MAA8B;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,yFAAyF;IACzF,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;QACtC,MAAM,IAAI,GAAyB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG;gBAAE,SAAS;YACzC,IAAI,CAAC,IAAI,CAAC;gBACR,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;gBAC/B,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;gBACzB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;gBACvB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY;gBACvC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACvE,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;aAC5E,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,gBAAgB,CAAC,IAAmC,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QAC5E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG;gBAAE,SAAS;YACvC,MAAM,MAAM,GAA2B;gBACrC,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAsC;gBAChD,YAAY,EAAE,GAAG,CAAC,YAAsD;gBACxE,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;aACtD,CAAC;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG;gBAAE,SAAS;YACxC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;YACxC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;YAC1C,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;YAC5C,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;gBAAE,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YACpE,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,QAAoB;QACnC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED,oFAAoF;IACpF,eAAe,GAAwB,IAAI,CAAC;IAEpC,oBAAoB;QAC1B,+FAA+F;QAC/F,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,yFAAyF;IACzF,wBAAwB,CACtB,UAAsC;QAEtC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC5C,CAAC,KAAK,EAAE,EAAE,CACR,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CACrE,CAAC;QACF,MAAM,KAAK,GAAG,KAAK;aAChB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;aAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO;YACL,KAAK;YACL,cAAc,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;YAC1D,UAAU,EACR,KAAK,CAAC,MAAM,KAAK,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC5D,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,gBAAgB,CACd,OAAqB,EACrB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAEhB,MAAM,KAAK,GAAQ,EAAE,CAAC;QACtB,MAAM,iBAAiB,GAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,MAAM,iBAAiB,GAAQ,EAAE,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC7D,IAAI,OAAO,IAAI,CAAC,eAAe;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC/C,IAAI,OAAO;gBAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC5C,IAAI,CAAC,eAAe;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBAC3C,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,iBAAiB,EAAE,GAAG,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,cAAc,EAAE,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -9,8 +9,31 @@ export declare function argValue(...flags: string[]): string | undefined;
9
9
  export declare function hasFlag(...flags: string[]): boolean;
10
10
  /** Extract non-flag positional arguments from an argv array, skipping flags and their values. */
11
11
  export declare function getPositionalArgs(argv?: string[]): string[];
12
+ /**
13
+ * The shipped template, exposed for `test/first-run.test.ts`.
14
+ *
15
+ * A test that rebuilt this object would be testing itself: the defect being pinned was that the
16
+ * SHIPPED bytes routed `claude-*` to a free pool while three user-facing documents said Anthropic.
17
+ * Only the real constant can observe that.
18
+ */
19
+ export declare const DEFAULT_CONFIG_TEMPLATE_FOR_TEST: string;
12
20
  export { splitSpec };
13
21
  export declare function resolveConfigPath(): string;
22
+ /** The first-run marker file, beside `config.json` in whichever config dir won. */
23
+ export declare const FIRST_RUN_MARKER = "first-run";
24
+ /** Is the first-run routing question still unanswered? Absent file ⇒ no. Never throws. */
25
+ export declare function firstRunPending(configDir?: string): boolean;
26
+ /**
27
+ * Tell whoever is reading that the first-run routing question is still open.
28
+ *
29
+ * ⚠ STDERR, never stdout. `routing show` and `offload status` are JSON surfaces that scripts and
30
+ * agents parse; a synthetic key inside `cfg.routing` would also be a lie about the config, since
31
+ * nothing in the file says this. A notice beside the JSON reaches a human and an agent both,
32
+ * and breaks no parser.
33
+ */
34
+ export declare function printFirstRunNotice(configDir?: string): void;
35
+ /** Record that the operator has been asked and has answered. Idempotent; never throws. */
36
+ export declare function clearFirstRun(configDir?: string): boolean;
14
37
  /**
15
38
  * Merge every credential source into the environment, once per process, before anything reads a
16
39
  * key or expands a `${ENV}` in the config. Already-set variables always win, at every layer.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { relayStatePath } from "./state-paths.js";
3
3
  import { isRecord } from "./json-shape.js";
4
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
4
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
5
5
  import { join } from "node:path";
6
6
  import { tmpdir } from "node:os";
7
7
  import { spawn } from "node:child_process";
@@ -178,7 +178,9 @@ ${formatTextTable([
178
178
  ["llm-relay keys <action> ...", "action: add|list|rotate|revoke|remove|disable|enable|export|import|unlock."],
179
179
  ["llm-relay pools [--probe]", "List members; --probe tests each deployment once."],
180
180
  ["llm-relay pools <action> <name> [<spec>...]", "action: set|add|remove|delete."],
181
- ["llm-relay routing <action> ...", "action: show|get|default|tier|subagent|sort|benchmark|set|unset."],
181
+ ["llm-relay routing <action> ...", "action: show|get|default|tier|subagent|sort|benchmark|set|unset|answered."],
182
+ ["llm-relay route <action> ...", "Alias for routing."],
183
+ ["llm-relay lanes [--probe]", "What each cli dispatch lane's own tool says it serves."],
182
184
  ["llm-relay config <action> [<path>] [<value>]", "action: show|get|set|unset."],
183
185
  ["llm-relay models [-p <name>] [-r]", "List provider models."],
184
186
  ["llm-relay ping [-p <name>]", "Probe providers."],
@@ -291,9 +293,35 @@ Control reads (/registry, /candidates, /ping, /health) and control writes requir
291
293
  capability token; the CLI attaches it automatically. /telemetry stays provider-aggregate, and
292
294
  /health strips nested credential details.
293
295
  `;
296
+ /**
297
+ * The config written on a FIRST RUN, when no config exists anywhere.
298
+ *
299
+ * ⚠ It declares the Anthropic passthrough and points every tier at it, and that is load-bearing
300
+ * rather than a preference. It used to declare no `anthropic` provider at all and set
301
+ * `routing.default: "pool/medium"`, so a `claude-opus-5` request resolved to a FREE POOL — and
302
+ * with no free keys yet configured, to nothing at all (`resolveTargets` returned `[]` on a clean
303
+ * HOME). Meanwhile `README.md` promised "Claude traffic keeps your own credentials and reaches
304
+ * real Anthropic untouched", `docs/QUICKSTART.md` said "At this point everything still goes to
305
+ * Anthropic. Nothing is saved yet — but nothing is broken either", and `skills/llm-relay/SKILL.md`
306
+ * said a Claude model id reaches the Anthropic passthrough. All three were false for a stranger
307
+ * following README plus `llm-relay onboard`, which `docs/project-goals.md` makes an explicit goal.
308
+ *
309
+ * The safe default is the one where nothing changes until the operator asks for it: install the
310
+ * relay, keep working exactly as before, then move traffic deliberately. `pools`, `subagents` and
311
+ * the offload switches are all still here and still off, so turning offload on is one command.
312
+ *
313
+ * ⚠ `credentialMode: "passthrough"` is stated rather than left to omission. Omitting it forwards
314
+ * too, but "needs no key of its own" and "may be sent the user's subscription credential" are
315
+ * different intentions and only the first should follow from silence.
316
+ */
294
317
  const DEFAULT_CONFIG_TEMPLATE = JSON.stringify({
295
318
  listen: "127.0.0.1:8791",
296
319
  providers: {
320
+ anthropic: {
321
+ base: "https://api.anthropic.com",
322
+ kind: "anthropic",
323
+ credentialMode: "passthrough",
324
+ },
297
325
  nim: {
298
326
  base: "https://integrate.api.nvidia.com/v1",
299
327
  kind: "openai",
@@ -321,12 +349,14 @@ const DEFAULT_CONFIG_TEMPLATE = JSON.stringify({
321
349
  },
322
350
  },
323
351
  routing: {
324
- default: "pool/medium",
352
+ // Nothing moves until the operator asks. Claude ids reach real Anthropic, exactly as the
353
+ // README, QUICKSTART and skill all describe; `pool/*` is addressable from day one.
354
+ default: "anthropic",
325
355
  tiers: {
326
- opus: "pool/xhigh",
327
- fable: "pool/xhigh",
328
- sonnet: "pool/high",
329
- haiku: "pool/medium",
356
+ opus: "anthropic",
357
+ fable: "anthropic",
358
+ sonnet: "anthropic",
359
+ haiku: "anthropic",
330
360
  },
331
361
  // Addressable as `model: pool/<name>` — including from subagent frontmatter, which only
332
362
  // accepts a single string and so cannot express a candidate list on its own.
@@ -352,12 +382,27 @@ const DEFAULT_CONFIG_TEMPLATE = JSON.stringify({
352
382
  },
353
383
  },
354
384
  mode: "repair",
385
+ // ⚠ Required once an `anthropic`-kind provider is declared: `mode: "repair"` needs somewhere
386
+ // to reshape a malformed tool call, and an anthropic passthrough has no fixed model of its
387
+ // own to do it on, so `loadConfig` refuses to start without this. A POOL rather than a fixed
388
+ // {base, model, authEnv} for the reason the error message itself gives — ranked candidates
389
+ // that survive a de-listed model. Adding the passthrough without this line made every fresh
390
+ // install fail to load; `test/first-run.test.ts` caught it.
391
+ reshaper: { pool: "medium" },
355
392
  repair: {
356
393
  maxAttempts: 2,
357
394
  destructiveTools: [...DEFAULT_DESTRUCTIVE],
358
395
  },
359
396
  log: { level: "metadata", file: null },
360
397
  }, null, 2);
398
+ /**
399
+ * The shipped template, exposed for `test/first-run.test.ts`.
400
+ *
401
+ * A test that rebuilt this object would be testing itself: the defect being pinned was that the
402
+ * SHIPPED bytes routed `claude-*` to a free pool while three user-facing documents said Anthropic.
403
+ * Only the real constant can observe that.
404
+ */
405
+ export const DEFAULT_CONFIG_TEMPLATE_FOR_TEST = DEFAULT_CONFIG_TEMPLATE;
361
406
  export { splitSpec };
362
407
  export function resolveConfigPath() {
363
408
  const explicit = argValue("--config", "-c");
@@ -383,12 +428,87 @@ export function resolveConfigPath() {
383
428
  mkdirSync(userConfigDir, { recursive: true });
384
429
  writeFileSync(userConfig, DEFAULT_CONFIG_TEMPLATE, "utf8");
385
430
  process.stderr.write(`llm-relay: initialized global config at ${userConfig}\n`);
431
+ markFirstRun(userConfigDir);
386
432
  return userConfig;
387
433
  }
388
434
  catch {
389
435
  return "config.json";
390
436
  }
391
437
  }
438
+ /** The first-run marker file, beside `config.json` in whichever config dir won. */
439
+ export const FIRST_RUN_MARKER = "first-run";
440
+ function firstRunDir(configDir) {
441
+ if (configDir !== undefined)
442
+ return configDir;
443
+ // ⚠ Under vitest, share the same temp root the config resolver uses, so a test never reads or
444
+ // writes the developer's real marker. Guarded here, at the resolver, per CLAUDE.md.
445
+ return process.env.VITEST ? join(tmpdir(), "llm-relay-vitest") : relayStatePath("config");
446
+ }
447
+ /**
448
+ * Record that this install has never been steered.
449
+ *
450
+ * The shipped default deliberately changes nothing — every Claude id still reaches real Anthropic
451
+ * — which is the right SAFE default and the wrong FINAL state for somebody who installed a traffic
452
+ * router. Nobody reads a config file they did not write, so the relay leaves one flag, and
453
+ * `skills/llm-relay/SKILL.md` tells the agent to ASK the operator what they want the first time it
454
+ * is used, apply the answer with the ordinary verbs, and clear the flag.
455
+ *
456
+ * ⚠ A flag, not a prompt. `resolveConfigPath` runs inside every CLI command and inside the proxy
457
+ * itself, usually with no terminal attached, so asking here would block a headless start. The
458
+ * agent holds the conversation; the relay only records that the question is unanswered.
459
+ *
460
+ * ⚠ Best-effort: failing to write it must never stop a first run, and its absence simply means
461
+ * "no question pending" — the same fail-open direction as every other optional file here.
462
+ */
463
+ function markFirstRun(configDir) {
464
+ try {
465
+ writeFileSync(join(configDir, FIRST_RUN_MARKER), `${new Date().toISOString()}\n`, "utf8");
466
+ }
467
+ catch {
468
+ /* best-effort: a missing marker only means no question is pending */
469
+ }
470
+ }
471
+ /** Is the first-run routing question still unanswered? Absent file ⇒ no. Never throws. */
472
+ export function firstRunPending(configDir) {
473
+ try {
474
+ return existsSync(join(firstRunDir(configDir), FIRST_RUN_MARKER));
475
+ }
476
+ catch {
477
+ return false;
478
+ }
479
+ }
480
+ /**
481
+ * Tell whoever is reading that the first-run routing question is still open.
482
+ *
483
+ * ⚠ STDERR, never stdout. `routing show` and `offload status` are JSON surfaces that scripts and
484
+ * agents parse; a synthetic key inside `cfg.routing` would also be a lie about the config, since
485
+ * nothing in the file says this. A notice beside the JSON reaches a human and an agent both,
486
+ * and breaks no parser.
487
+ */
488
+ export function printFirstRunNotice(configDir) {
489
+ if (!firstRunPending(configDir))
490
+ return;
491
+ process.stderr.write("\nllm-relay: first run — this install has never been steered.\n" +
492
+ " Every Claude model id currently reaches real Anthropic, which is the safe default and\n" +
493
+ " probably not why you installed a traffic router. Ask the operator what they want, then:\n" +
494
+ " llm-relay offload claude on # marked subagents to the free pools\n" +
495
+ " llm-relay routing subagent <tier> <spec> # choose where each tier lands\n" +
496
+ " llm-relay routing default <spec> # move the MAIN conversation (deliberate)\n" +
497
+ " Then run `llm-relay routing answered` to stop showing this.\n");
498
+ }
499
+ /** Record that the operator has been asked and has answered. Idempotent; never throws. */
500
+ export function clearFirstRun(configDir) {
501
+ try {
502
+ const marker = join(firstRunDir(configDir), FIRST_RUN_MARKER);
503
+ if (!existsSync(marker))
504
+ return false;
505
+ rmSync(marker, { force: true });
506
+ return true;
507
+ }
508
+ catch {
509
+ return false;
510
+ }
511
+ }
392
512
  let envFileLoaded = false;
393
513
  /**
394
514
  * Merge every credential source into the environment, once per process, before anything reads a
@@ -1943,6 +2063,10 @@ export async function runOffload(arg, nextArg) {
1943
2063
  // and the relay-routed CLI children this ladder spawns. What it cannot do is affect the session
1944
2064
  // running this command, when that session's traffic never arrives. Saying so here is the point:
1945
2065
  // the switch reporting ON while nothing changes is precisely how the no-op went unnoticed.
2066
+ // The other surface an agent reaches for when it is about to steer traffic. Stderr, so the
2067
+ // stdout report stays exactly what it was for anything parsing it.
2068
+ if (want === null)
2069
+ printFirstRunNotice();
1946
2070
  const hostRouting = detectHostRouting();
1947
2071
  if (hostRouting.state === "bypassed" && state.enabled) {
1948
2072
  process.stdout.write(` ⚠ ${hostRouting.reason}\n`);
@@ -2578,6 +2702,7 @@ export function runRoutingCommand() {
2578
2702
  const action = positionals[1] ?? "show";
2579
2703
  if (action === "show" || action === "get") {
2580
2704
  outputJson(cfg.routing);
2705
+ printFirstRunNotice();
2581
2706
  return;
2582
2707
  }
2583
2708
  if (action === "default") {
@@ -2645,6 +2770,15 @@ export function runRoutingCommand() {
2645
2770
  changedConfig(path);
2646
2771
  return;
2647
2772
  }
2773
+ if (action === "answered") {
2774
+ // Retires the first-run notice without touching routing. Separate from the steering verbs on
2775
+ // purpose: "I have decided to change nothing" is a real answer, and forcing an edit to silence
2776
+ // a prompt is how a default gets changed for the wrong reason.
2777
+ process.stdout.write(clearFirstRun()
2778
+ ? "llm-relay: first-run question marked answered.\n"
2779
+ : "llm-relay: no first-run question was pending.\n");
2780
+ return;
2781
+ }
2648
2782
  configCommandError(`routing: unknown action "${action}"`);
2649
2783
  }
2650
2784
  /**
@@ -3009,9 +3143,16 @@ export function main() {
3009
3143
  const res = setupClaudeDesktop();
3010
3144
  process.stdout.write(`${res.message}\n`);
3011
3145
  }
3012
- else {
3146
+ else if (arg3 === undefined || arg3 === "claude-cli" || arg3 === "cli" || arg3 === "claude") {
3013
3147
  setupClaudeCli();
3014
3148
  }
3149
+ else {
3150
+ // ⚠ This used to be a bare `else`, so `setup clade-desktop` (a typo) silently ran the CLI
3151
+ // setup and exited 0 — the user believed they had configured Desktop. HELP has always
3152
+ // documented `claude-cli`, which matched no branch and only worked by that fall-through;
3153
+ // it is a real target now, and anything else is named and refused.
3154
+ configCommandError(`setup: unknown target "${arg3}" (targets: claude-cli, claude-desktop)`);
3155
+ }
3015
3156
  return;
3016
3157
  }
3017
3158
  if (arg2 === "telemetry") {
@@ -3235,8 +3376,10 @@ export function classifyCommand(argv) {
3235
3376
  return arg3 === "set" || arg3 === "unset" ? "mutating" : "read-only";
3236
3377
  case "routing":
3237
3378
  case "route":
3379
+ // `answered` writes too — it removes the first-run marker. It touches no routing, but a
3380
+ // command that deletes a file the relay wrote is not a read.
3238
3381
  return arg3 === "set" || arg3 === "unset" || arg3 === "default" || arg3 === "tier" ||
3239
- arg3 === "subagent" || arg3 === "sort" || arg3 === "benchmark"
3382
+ arg3 === "subagent" || arg3 === "sort" || arg3 === "benchmark" || arg3 === "answered"
3240
3383
  ? "mutating"
3241
3384
  : "read-only";
3242
3385
  case "pools":