omnigateway 0.13.3 → 0.13.5

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 CHANGED
@@ -329,7 +329,7 @@ that output was captured; it does not redirect it — see
329
329
  Everything else lives in the database rather than the environment, so it can be
330
330
  changed without a restart: the six routing weights, `maxAttempts`,
331
331
  `requestDeadlineMs`, the circuit breaker's `breakerThreshold` and
332
- `breakerCooldownMs`, `logRetentionDays`, `quotaPollIntervalMs`, `rtkEnabled`,
332
+ `breakerCooldownMs`, `logRetentionDays`, `bodyRetentionDays`, `quotaPollIntervalMs`, `rtkEnabled`,
333
333
  `ponytailMode` (`off` | `lite` | `full` | `ultra`),
334
334
  and the two body-capture switches. Edit them with `omni settings set` or in the
335
335
  console. `quotaPollIntervalMs` is the one exception: the poller reads it once at
@@ -397,6 +397,11 @@ Worth knowing before you deploy it:
397
397
  - **The gateway does not know which model accepts which request shape.** An
398
398
  unsupported combination surfaces as the provider's own 400 rather than being
399
399
  caught earlier.
400
+ - **Thinking controls retain their wire intent.** Anthropic `between_tools` passes
401
+ through; other providers treat it as off and report a degradation. Unparsed
402
+ Anthropic thinking fields (including beta controls) pass through only to
403
+ Anthropic; supply any required beta header yourself. Hidden adaptive display
404
+ omits generated Responses reasoning summaries, without inventing a default.
400
405
  - Not in scope: semantic caching, billing.
401
406
 
402
407
  What is missing on purpose, what is missing for now, and what is designed but not
package/bin/omni.js CHANGED
@@ -6358,8 +6358,10 @@ function memoryCoord(options = {}) {
6358
6358
  }
6359
6359
 
6360
6360
  // packages/store/src/bodies/artifact.ts
6361
- import { mkdir, readdir, readFile, rmdir, unlink, writeFile } from "fs/promises";
6361
+ import { mkdir, open as open2, readdir, rmdir, unlink, writeFile } from "fs/promises";
6362
6362
  import { dirname, join, sep } from "path";
6363
+ import { promisify } from "util";
6364
+ import { gunzip, gzip } from "zlib";
6363
6365
 
6364
6366
  // packages/store/src/encryption.ts
6365
6367
  var PREFIX = "enc:v1";
@@ -6584,27 +6586,171 @@ async function sealArtifact(key, json) {
6584
6586
  const bytes = encoder2.encode(await encrypt(key, json));
6585
6587
  return { bytes, sha256: await sha256Hex(bytes) };
6586
6588
  }
6589
+ var MAX_ENVELOPE_BYTES = 2 * MAX_ARTIFACT_BYTES + 65;
6590
+ var BINARY_MAGIC = encoder2.encode("OGBA");
6591
+ var LEGACY_PREFIX = encoder2.encode("enc:v1:");
6592
+ var BINARY_VERSION = 1;
6593
+ var BINARY_HEADER_BYTES = 10;
6594
+ var BINARY_IV_BYTES = 12;
6595
+ var BINARY_TAG_BYTES = 16;
6596
+ var BINARY_OVERHEAD = BINARY_HEADER_BYTES + BINARY_IV_BYTES + BINARY_TAG_BYTES;
6597
+ var MAX_BINARY_ENVELOPE_BYTES = MAX_ARTIFACT_BYTES + BINARY_OVERHEAD;
6598
+ var CODEC_RAW = 0;
6599
+ var CODEC_GZIP = 1;
6600
+ var GZIP_FRAME_BYTES = 18;
6601
+ var gzipAsync = promisify(gzip);
6602
+ var gunzipAsync = promisify(gunzip);
6603
+ function own2(bytes, start, end) {
6604
+ return bytes.slice(start, end);
6605
+ }
6587
6606
  async function readArtifact(key, dir, relPath, expectedSha256) {
6588
- let bytes;
6607
+ const acquired = await acquireArtifact(join(dir, relPath));
6608
+ if (!(acquired instanceof Uint8Array))
6609
+ return { ok: false, failure: acquired };
6610
+ return decodeArtifact(key, acquired, expectedSha256);
6611
+ }
6612
+ async function acquireArtifact(path) {
6613
+ let handle;
6614
+ try {
6615
+ handle = await open2(path, "r");
6616
+ } catch {
6617
+ return "missing";
6618
+ }
6589
6619
  try {
6590
- bytes = new Uint8Array(await readFile(join(dir, relPath)));
6620
+ const { size } = await handle.stat();
6621
+ if (size > MAX_ENVELOPE_BYTES)
6622
+ return "corrupt";
6623
+ const buffer = new Uint8Array(size + 1);
6624
+ let filled = 0;
6625
+ while (filled < buffer.length) {
6626
+ const { bytesRead } = await handle.read(buffer, filled, buffer.length - filled, filled);
6627
+ if (bytesRead === 0)
6628
+ break;
6629
+ filled += bytesRead;
6630
+ }
6631
+ return filled > size ? "corrupt" : buffer.subarray(0, filled);
6591
6632
  } catch {
6592
- return { ok: false, failure: "missing" };
6633
+ return "missing";
6634
+ } finally {
6635
+ await handle.close().catch(() => {});
6636
+ }
6637
+ }
6638
+ var LEGACY_HEX = /^(?:[0-9a-f]{2})*$/;
6639
+ var LEGACY_IV_HEX_CHARS = 24;
6640
+ var LEGACY_TAG_HEX_CHARS = 32;
6641
+ function isLegacyStructure(text) {
6642
+ const parts = text.split(":");
6643
+ const [scheme, version, iv, body, tag] = parts;
6644
+ return parts.length === 5 && scheme === "enc" && version === "v1" && iv !== undefined && body !== undefined && tag !== undefined && iv.length === LEGACY_IV_HEX_CHARS && tag.length === LEGACY_TAG_HEX_CHARS && LEGACY_HEX.test(iv) && LEGACY_HEX.test(body) && LEGACY_HEX.test(tag);
6645
+ }
6646
+ function payloadFits(codec, payloadBytes, claimed) {
6647
+ switch (codec) {
6648
+ case CODEC_RAW:
6649
+ return payloadBytes === claimed;
6650
+ case CODEC_GZIP:
6651
+ return payloadBytes >= GZIP_FRAME_BYTES;
6652
+ default:
6653
+ return false;
6593
6654
  }
6594
- return decodeArtifact(key, bytes, expectedSha256);
6655
+ }
6656
+ async function expand(codec, payload, claimed) {
6657
+ switch (codec) {
6658
+ case CODEC_RAW:
6659
+ return payload;
6660
+ case CODEC_GZIP:
6661
+ return gunzipArtifact(payload, claimed);
6662
+ default:
6663
+ throw new Error("unsupported artifact codec");
6664
+ }
6665
+ }
6666
+ async function gunzipArtifact(payload, claimed) {
6667
+ const result = await gunzipAsync(payload, {
6668
+ maxOutputLength: MAX_ARTIFACT_BYTES,
6669
+ info: true
6670
+ });
6671
+ const inflated = inflateResult(result);
6672
+ if (inflated === null)
6673
+ throw new Error("gzip result has an unexpected shape");
6674
+ if (inflated.consumed !== payload.length)
6675
+ throw new Error("bytes follow the gzip stream");
6676
+ if (inflated.output.length !== claimed)
6677
+ throw new Error("gzip output is not the claimed length");
6678
+ return inflated.output;
6679
+ }
6680
+ function inflateResult(result) {
6681
+ if (typeof result !== "object" || result === null)
6682
+ return null;
6683
+ if (!("buffer" in result) || !("engine" in result))
6684
+ return null;
6685
+ const { buffer, engine } = result;
6686
+ if (!(buffer instanceof Uint8Array) || typeof engine !== "object" || engine === null)
6687
+ return null;
6688
+ if (!("bytesWritten" in engine) || typeof engine.bytesWritten !== "number")
6689
+ return null;
6690
+ return { output: buffer, consumed: engine.bytesWritten };
6691
+ }
6692
+ function parseBinary(bytes) {
6693
+ if (bytes.length < BINARY_OVERHEAD || bytes.length > MAX_BINARY_ENVELOPE_BYTES)
6694
+ return null;
6695
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
6696
+ const version = view.getUint8(4);
6697
+ const codec = view.getUint8(5);
6698
+ const claimed = view.getUint32(6, false);
6699
+ if (version !== BINARY_VERSION)
6700
+ return null;
6701
+ if (claimed < 1 || claimed > MAX_ARTIFACT_BYTES)
6702
+ return null;
6703
+ if (!payloadFits(codec, bytes.length - BINARY_OVERHEAD, claimed))
6704
+ return null;
6705
+ return {
6706
+ header: own2(bytes, 0, BINARY_HEADER_BYTES),
6707
+ codec,
6708
+ claimed,
6709
+ iv: own2(bytes, BINARY_HEADER_BYTES, BINARY_HEADER_BYTES + BINARY_IV_BYTES),
6710
+ sealed: own2(bytes, BINARY_HEADER_BYTES + BINARY_IV_BYTES)
6711
+ };
6712
+ }
6713
+ async function openBinary(key, envelope) {
6714
+ const payload = await crypto.subtle.decrypt({
6715
+ name: "AES-GCM",
6716
+ iv: envelope.iv,
6717
+ additionalData: envelope.header,
6718
+ tagLength: BINARY_TAG_BYTES * 8
6719
+ }, key, envelope.sealed);
6720
+ return new TextDecoder("utf-8", { fatal: true }).decode(await expand(envelope.codec, new Uint8Array(payload), envelope.claimed));
6721
+ }
6722
+ function startsWith(bytes, prefix) {
6723
+ if (bytes.length < prefix.length)
6724
+ return false;
6725
+ return prefix.every((byte, i) => bytes[i] === byte);
6595
6726
  }
6596
6727
  async function decodeArtifact(key, bytes, expectedSha256) {
6728
+ const corrupt = { ok: false, failure: "corrupt" };
6597
6729
  try {
6598
- if (expectedSha256 !== null && await sha256Hex(bytes) !== expectedSha256) {
6599
- return { ok: false, failure: "corrupt" };
6600
- }
6601
- const parsed = JSON.parse(await decrypt(key, new TextDecoder().decode(bytes)));
6602
- if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
6603
- return { ok: false, failure: "corrupt" };
6730
+ if (bytes.length > MAX_ENVELOPE_BYTES)
6731
+ return corrupt;
6732
+ let unseal;
6733
+ if (startsWith(bytes, BINARY_MAGIC)) {
6734
+ const envelope = parseBinary(bytes);
6735
+ if (envelope === null)
6736
+ return corrupt;
6737
+ unseal = () => openBinary(key, envelope);
6738
+ } else if (startsWith(bytes, LEGACY_PREFIX)) {
6739
+ const text = new TextDecoder().decode(bytes);
6740
+ if (!isLegacyStructure(text))
6741
+ return corrupt;
6742
+ unseal = () => decrypt(key, text);
6743
+ } else {
6744
+ return corrupt;
6604
6745
  }
6746
+ if (expectedSha256 !== null && await sha256Hex(bytes) !== expectedSha256)
6747
+ return corrupt;
6748
+ const parsed = JSON.parse(await unseal());
6749
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
6750
+ return corrupt;
6605
6751
  return { ok: true, artifact: parsed };
6606
6752
  } catch {
6607
- return { ok: false, failure: "corrupt" };
6753
+ return corrupt;
6608
6754
  }
6609
6755
  }
6610
6756
  async function writeArtifact(dir, relPath, bytes) {
@@ -7637,13 +7783,16 @@ function createBodyRepo(sql, key) {
7637
7783
  return row;
7638
7784
  },
7639
7785
  async get(requestId) {
7640
- const found = (await sql.unsafe("SELECT * FROM request_bodies WHERE request_id = $1", [requestId]))[0];
7786
+ const found = (await sql.unsafe(`SELECT ${META},
7787
+ CASE WHEN octet_length(bytes) <= $2 THEN bytes ELSE NULL END AS bytes,
7788
+ octet_length(bytes) AS encoded_size
7789
+ FROM request_bodies WHERE request_id = $1`, [requestId, MAX_ENVELOPE_BYTES]))[0];
7641
7790
  if (found === undefined)
7642
7791
  return null;
7643
7792
  const row = toRow(found);
7644
7793
  if (row.relPath === null || row.detailState === "none")
7645
7794
  return { row, artifact: null };
7646
- const read = found.bytes === null ? { ok: false, failure: "missing" } : await decodeArtifact(key, new Uint8Array(found.bytes), row.sha256);
7795
+ const read = found.encoded_size === null ? { ok: false, failure: "missing" } : found.bytes === null ? { ok: false, failure: "corrupt" } : await decodeArtifact(key, new Uint8Array(found.bytes), row.sha256);
7647
7796
  if (read.ok) {
7648
7797
  if (row.detailState !== "ready")
7649
7798
  await recordState(requestId, "ready");
@@ -7743,6 +7892,7 @@ var DEFAULT_SETTINGS = {
7743
7892
  breakerThreshold: 3,
7744
7893
  breakerCooldownMs: 30000,
7745
7894
  logRetentionDays: 30,
7895
+ bodyRetentionDays: 1,
7746
7896
  quotaPollIntervalMs: 300000,
7747
7897
  rtkEnabled: false,
7748
7898
  autoCacheEnabled: true,
@@ -7812,6 +7962,7 @@ function createConfigRepo(sql, emit) {
7812
7962
  rtkEnabled: stored.rtkEnabled === true,
7813
7963
  autoCacheEnabled: stored.autoCacheEnabled === undefined ? true : stored.autoCacheEnabled === true,
7814
7964
  ponytailMode: isPonytailMode(stored.ponytailMode) ? stored.ponytailMode : "off",
7965
+ bodyRetentionDays: Number.isInteger(stored.bodyRetentionDays) && (stored.bodyRetentionDays ?? 0) >= 1 && (stored.bodyRetentionDays ?? 0) <= 3650 ? stored.bodyRetentionDays : DEFAULT_SETTINGS.bodyRetentionDays,
7815
7966
  bodyLoggingEnabled: stored.bodyLoggingEnabled === true,
7816
7967
  bodyLoggingCaptureStreamChunks: stored.bodyLoggingCaptureStreamChunks === true,
7817
7968
  weights: knownWeights(stored.weights)
@@ -9301,6 +9452,7 @@ function createConfigRepo2(db, emit = () => {}) {
9301
9452
  rtkEnabled: stored.rtkEnabled === true,
9302
9453
  autoCacheEnabled: stored.autoCacheEnabled === undefined ? true : stored.autoCacheEnabled === true,
9303
9454
  ponytailMode: isPonytailMode(stored.ponytailMode) ? stored.ponytailMode : "off",
9455
+ bodyRetentionDays: Number.isInteger(stored.bodyRetentionDays) && (stored.bodyRetentionDays ?? 0) >= 1 && (stored.bodyRetentionDays ?? 0) <= 3650 ? stored.bodyRetentionDays : DEFAULT_SETTINGS.bodyRetentionDays,
9304
9456
  bodyLoggingEnabled: stored.bodyLoggingEnabled === true,
9305
9457
  bodyLoggingCaptureStreamChunks: stored.bodyLoggingCaptureStreamChunks === true,
9306
9458
  weights: knownWeights2(stored.weights)
@@ -13963,6 +14115,9 @@ function toWire(req, model, opts) {
13963
14115
  addAutoCacheBreakpoints(body, req, note);
13964
14116
  if (req.reasoning !== undefined) {
13965
14117
  switch (req.reasoning.mode) {
14118
+ case "betweenTools":
14119
+ body.thinking = { type: "between_tools" };
14120
+ break;
13966
14121
  case "adaptive":
13967
14122
  if (anthropicReasoningForm(model) === "budget") {
13968
14123
  body.thinking = { type: "disabled" };
@@ -14001,7 +14156,10 @@ function toWire(req, model, opts) {
14001
14156
  } else if (!nativeFormat && read.kind === "tooDeep") {
14002
14157
  note("anthropic:response-schema-too-deep");
14003
14158
  }
14004
- const vendorRaw = req.vendor?.anthropic ?? {};
14159
+ const { thinking: thinkingExtras, ...vendorRaw } = req.vendor?.anthropic ?? {};
14160
+ if (body.thinking !== undefined && isRecord2(thinkingExtras)) {
14161
+ body.thinking = { ...thinkingExtras, ...body.thinking };
14162
+ }
14005
14163
  const vendorConfig = vendorRaw.output_config;
14006
14164
  const encoderConfig = isRecord2(body.output_config) ? body.output_config : undefined;
14007
14165
  let unreadableFormat = false;
@@ -15178,6 +15336,10 @@ function toAntigravityWire(req, model, identity) {
15178
15336
  }
15179
15337
  if (req.reasoning !== undefined) {
15180
15338
  switch (req.reasoning.mode) {
15339
+ case "betweenTools":
15340
+ note("antigravity:reasoning-between-tools-as-off");
15341
+ generationConfig.thinkingConfig = { thinkingBudget: 0, includeThoughts: false };
15342
+ break;
15181
15343
  case "off":
15182
15344
  generationConfig.thinkingConfig = { thinkingBudget: 0, includeThoughts: false };
15183
15345
  break;
@@ -15195,7 +15357,7 @@ function toAntigravityWire(req, model, identity) {
15195
15357
  break;
15196
15358
  case "adaptive":
15197
15359
  generationConfig.thinkingConfig = {
15198
- includeThoughts: req.reasoning.display !== "omitted"
15360
+ includeThoughts: req.reasoning.display !== "omitted" && req.reasoning.display !== "updates"
15199
15361
  };
15200
15362
  if (req.reasoning.effort !== undefined)
15201
15363
  note("antigravity:reasoning-effort-dropped");
@@ -17070,6 +17232,8 @@ function toCustomChatWire(req, model) {
17070
17232
  }
17071
17233
  if (req.toolChoice !== undefined)
17072
17234
  body.tool_choice = encodeChatToolChoice(req.toolChoice);
17235
+ if (req.reasoning?.mode === "betweenTools")
17236
+ note("custom:reasoning-between-tools-as-off");
17073
17237
  const effort = customEffort(req.reasoning);
17074
17238
  if (effort !== undefined)
17075
17239
  body.reasoning_effort = effort;
@@ -17200,9 +17364,14 @@ function toCustomResponsesWire(req, model) {
17200
17364
  }
17201
17365
  if (req.toolChoice !== undefined)
17202
17366
  body.tool_choice = encodeResponsesToolChoice(req.toolChoice);
17367
+ if (req.reasoning?.mode === "betweenTools")
17368
+ note("custom:reasoning-between-tools-as-off");
17203
17369
  const effort = customEffort(req.reasoning);
17204
17370
  if (effort !== undefined)
17205
- body.reasoning = { effort, summary: "auto" };
17371
+ body.reasoning = {
17372
+ effort,
17373
+ ...req.reasoning?.mode === "adaptive" && (req.reasoning.display === "omitted" || req.reasoning.display === "updates") ? {} : { summary: "auto" }
17374
+ };
17206
17375
  else if (req.reasoning?.mode === "budget")
17207
17376
  note("custom:reasoning-budget-dropped");
17208
17377
  Object.assign(body, req.vendor?.openai ?? {});
@@ -17595,12 +17764,17 @@ function toGrokWire(req, model) {
17595
17764
  }
17596
17765
  if (req.toolChoice !== undefined)
17597
17766
  body.tool_choice = encodeToolChoice3(req.toolChoice);
17598
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
17767
+ if (req.reasoning?.mode === "betweenTools")
17768
+ note("grok:reasoning-between-tools-as-off");
17769
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
17599
17770
  if (req.reasoning.mode === "budget") {
17600
17771
  note("grok:reasoning-budget-dropped");
17601
17772
  } else {
17602
17773
  const effort = req.reasoning.effort ?? "medium";
17603
- body.reasoning = { effort, summary: "concise" };
17774
+ body.reasoning = {
17775
+ effort,
17776
+ ...req.reasoning.display === "omitted" || req.reasoning.display === "updates" ? {} : { summary: "concise" }
17777
+ };
17604
17778
  }
17605
17779
  }
17606
17780
  Object.assign(body, req.vendor?.grok ?? {});
@@ -18060,7 +18234,9 @@ function toKiloWire(req, model) {
18060
18234
  }
18061
18235
  if (req.toolChoice !== undefined)
18062
18236
  body.tool_choice = encodeToolChoice4(req.toolChoice);
18063
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
18237
+ if (req.reasoning?.mode === "betweenTools")
18238
+ note("kilo:reasoning-between-tools-as-off");
18239
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
18064
18240
  if (req.reasoning.mode === "budget") {
18065
18241
  body.reasoning = { max_tokens: req.reasoning.budgetTokens };
18066
18242
  } else {
@@ -18338,6 +18514,8 @@ function toChatWire(req, model, vendor = "kimi") {
18338
18514
  }
18339
18515
  if (req.toolChoice !== undefined)
18340
18516
  body.tool_choice = encodeToolChoice5(req.toolChoice);
18517
+ if (req.reasoning?.mode === "betweenTools")
18518
+ note("kimi:reasoning-between-tools-as-off");
18341
18519
  if (req.reasoning !== undefined)
18342
18520
  note("kimi:reasoning-dropped");
18343
18521
  Object.assign(body, req.vendor?.[vendor] ?? {});
@@ -18760,12 +18938,17 @@ function toMuseWire(req, model) {
18760
18938
  }
18761
18939
  if (req.toolChoice !== undefined)
18762
18940
  body.tool_choice = encodeToolChoice6(req.toolChoice);
18763
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
18941
+ if (req.reasoning?.mode === "betweenTools")
18942
+ note("muse:reasoning-between-tools-as-off");
18943
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
18764
18944
  if (req.reasoning.mode === "budget") {
18765
18945
  note("muse:reasoning-budget-dropped");
18766
18946
  } else {
18767
18947
  const effort = req.reasoning.effort ?? "medium";
18768
- body.reasoning = { effort, summary: "auto" };
18948
+ body.reasoning = {
18949
+ effort,
18950
+ ...req.reasoning.display === "omitted" || req.reasoning.display === "updates" ? {} : { summary: "auto" }
18951
+ };
18769
18952
  }
18770
18953
  }
18771
18954
  const key = suppliedKey(req) ?? cacheKey(req, instructions ?? "", input[0]);
@@ -19196,12 +19379,17 @@ function toResponsesWire(req, model, opts = { oauth: false }) {
19196
19379
  }
19197
19380
  if (req.toolChoice !== undefined)
19198
19381
  body.tool_choice = encodeToolChoice7(req.toolChoice);
19199
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
19382
+ if (req.reasoning?.mode === "betweenTools")
19383
+ degradations.push("openai:reasoning-between-tools-as-off");
19384
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
19200
19385
  if (req.reasoning.mode === "budget") {
19201
19386
  degradations.push("openai:reasoning-budget-dropped");
19202
19387
  } else {
19203
19388
  const effort = req.reasoning.effort ?? "medium";
19204
- body.reasoning = { effort, summary: "auto" };
19389
+ body.reasoning = {
19390
+ effort,
19391
+ ...req.reasoning.display === "omitted" || req.reasoning.display === "updates" ? {} : { summary: "auto" }
19392
+ };
19205
19393
  }
19206
19394
  }
19207
19395
  const key = suppliedKey2(req) ?? cacheKey2(req, instructions ?? "", input[0]);
@@ -19548,6 +19736,7 @@ var settingsSchema = object({
19548
19736
  breakerThreshold: number2().int().min(1),
19549
19737
  breakerCooldownMs: number2().int().positive(),
19550
19738
  logRetentionDays: number2().int().min(1),
19739
+ bodyRetentionDays: retentionSchema.shape.maxAgeDays.optional(),
19551
19740
  quotaPollIntervalMs: number2().int().min(0),
19552
19741
  rtkEnabled: boolean2(),
19553
19742
  autoCacheEnabled: boolean2(),
@@ -19794,7 +19983,7 @@ function requiredCapabilities(request) {
19794
19983
  return {
19795
19984
  tools: (request.tools?.length ?? 0) > 0,
19796
19985
  images,
19797
- reasoning: request.reasoning !== undefined && request.reasoning.mode !== "off"
19986
+ reasoning: request.reasoning !== undefined && request.reasoning.mode !== "off" && request.reasoning.mode !== "betweenTools"
19798
19987
  };
19799
19988
  }
19800
19989
  function cooldownMs(failures, threshold, base) {
@@ -22727,9 +22916,10 @@ async function getSettings(store) {
22727
22916
  return store.config.getSettings();
22728
22917
  }
22729
22918
  async function putSettings(store, input) {
22730
- const { snapshotKeepLatest, snapshotMaxAgeDays, ...rest } = parseOrThrow(settingsSchema, input);
22919
+ const { bodyRetentionDays, snapshotKeepLatest, snapshotMaxAgeDays, ...rest } = parseOrThrow(settingsSchema, input);
22731
22920
  const patch = {
22732
22921
  ...rest,
22922
+ ...bodyRetentionDays === undefined ? {} : { bodyRetentionDays },
22733
22923
  ...snapshotKeepLatest === undefined ? {} : { snapshotKeepLatest },
22734
22924
  ...snapshotMaxAgeDays === undefined ? {} : { snapshotMaxAgeDays }
22735
22925
  };
@@ -25073,7 +25263,7 @@ function createServiceDeps(input) {
25073
25263
  }
25074
25264
 
25075
25265
  // apps/cli/src/version.ts
25076
- var VERSION = "0.13.3";
25266
+ var VERSION = "0.13.5";
25077
25267
 
25078
25268
  // apps/cli/src/commands/service.ts
25079
25269
  function gatewayArgv(root) {
package/gateway.js CHANGED
@@ -11660,8 +11660,10 @@ function memoryCoord(options = {}) {
11660
11660
  }
11661
11661
 
11662
11662
  // packages/store/src/bodies/artifact.ts
11663
- import { mkdir, readdir, readFile, rmdir, unlink, writeFile } from "fs/promises";
11663
+ import { mkdir, open as open2, readdir, rmdir, unlink, writeFile } from "fs/promises";
11664
11664
  import { dirname, join, sep } from "path";
11665
+ import { promisify } from "util";
11666
+ import { gunzip, gzip } from "zlib";
11665
11667
 
11666
11668
  // packages/store/src/encryption.ts
11667
11669
  var PREFIX = "enc:v1";
@@ -11886,27 +11888,171 @@ async function sealArtifact(key, json) {
11886
11888
  const bytes = encoder2.encode(await encrypt(key, json));
11887
11889
  return { bytes, sha256: await sha256Hex(bytes) };
11888
11890
  }
11891
+ var MAX_ENVELOPE_BYTES = 2 * MAX_ARTIFACT_BYTES + 65;
11892
+ var BINARY_MAGIC = encoder2.encode("OGBA");
11893
+ var LEGACY_PREFIX = encoder2.encode("enc:v1:");
11894
+ var BINARY_VERSION = 1;
11895
+ var BINARY_HEADER_BYTES = 10;
11896
+ var BINARY_IV_BYTES = 12;
11897
+ var BINARY_TAG_BYTES = 16;
11898
+ var BINARY_OVERHEAD = BINARY_HEADER_BYTES + BINARY_IV_BYTES + BINARY_TAG_BYTES;
11899
+ var MAX_BINARY_ENVELOPE_BYTES = MAX_ARTIFACT_BYTES + BINARY_OVERHEAD;
11900
+ var CODEC_RAW = 0;
11901
+ var CODEC_GZIP = 1;
11902
+ var GZIP_FRAME_BYTES = 18;
11903
+ var gzipAsync = promisify(gzip);
11904
+ var gunzipAsync = promisify(gunzip);
11905
+ function own2(bytes, start, end) {
11906
+ return bytes.slice(start, end);
11907
+ }
11889
11908
  async function readArtifact(key, dir, relPath, expectedSha256) {
11890
- let bytes;
11909
+ const acquired = await acquireArtifact(join(dir, relPath));
11910
+ if (!(acquired instanceof Uint8Array))
11911
+ return { ok: false, failure: acquired };
11912
+ return decodeArtifact(key, acquired, expectedSha256);
11913
+ }
11914
+ async function acquireArtifact(path) {
11915
+ let handle;
11916
+ try {
11917
+ handle = await open2(path, "r");
11918
+ } catch {
11919
+ return "missing";
11920
+ }
11891
11921
  try {
11892
- bytes = new Uint8Array(await readFile(join(dir, relPath)));
11922
+ const { size } = await handle.stat();
11923
+ if (size > MAX_ENVELOPE_BYTES)
11924
+ return "corrupt";
11925
+ const buffer = new Uint8Array(size + 1);
11926
+ let filled = 0;
11927
+ while (filled < buffer.length) {
11928
+ const { bytesRead } = await handle.read(buffer, filled, buffer.length - filled, filled);
11929
+ if (bytesRead === 0)
11930
+ break;
11931
+ filled += bytesRead;
11932
+ }
11933
+ return filled > size ? "corrupt" : buffer.subarray(0, filled);
11893
11934
  } catch {
11894
- return { ok: false, failure: "missing" };
11935
+ return "missing";
11936
+ } finally {
11937
+ await handle.close().catch(() => {});
11938
+ }
11939
+ }
11940
+ var LEGACY_HEX = /^(?:[0-9a-f]{2})*$/;
11941
+ var LEGACY_IV_HEX_CHARS = 24;
11942
+ var LEGACY_TAG_HEX_CHARS = 32;
11943
+ function isLegacyStructure(text) {
11944
+ const parts = text.split(":");
11945
+ const [scheme, version, iv, body, tag] = parts;
11946
+ return parts.length === 5 && scheme === "enc" && version === "v1" && iv !== undefined && body !== undefined && tag !== undefined && iv.length === LEGACY_IV_HEX_CHARS && tag.length === LEGACY_TAG_HEX_CHARS && LEGACY_HEX.test(iv) && LEGACY_HEX.test(body) && LEGACY_HEX.test(tag);
11947
+ }
11948
+ function payloadFits(codec, payloadBytes, claimed) {
11949
+ switch (codec) {
11950
+ case CODEC_RAW:
11951
+ return payloadBytes === claimed;
11952
+ case CODEC_GZIP:
11953
+ return payloadBytes >= GZIP_FRAME_BYTES;
11954
+ default:
11955
+ return false;
11895
11956
  }
11896
- return decodeArtifact(key, bytes, expectedSha256);
11957
+ }
11958
+ async function expand(codec, payload, claimed) {
11959
+ switch (codec) {
11960
+ case CODEC_RAW:
11961
+ return payload;
11962
+ case CODEC_GZIP:
11963
+ return gunzipArtifact(payload, claimed);
11964
+ default:
11965
+ throw new Error("unsupported artifact codec");
11966
+ }
11967
+ }
11968
+ async function gunzipArtifact(payload, claimed) {
11969
+ const result = await gunzipAsync(payload, {
11970
+ maxOutputLength: MAX_ARTIFACT_BYTES,
11971
+ info: true
11972
+ });
11973
+ const inflated = inflateResult(result);
11974
+ if (inflated === null)
11975
+ throw new Error("gzip result has an unexpected shape");
11976
+ if (inflated.consumed !== payload.length)
11977
+ throw new Error("bytes follow the gzip stream");
11978
+ if (inflated.output.length !== claimed)
11979
+ throw new Error("gzip output is not the claimed length");
11980
+ return inflated.output;
11981
+ }
11982
+ function inflateResult(result) {
11983
+ if (typeof result !== "object" || result === null)
11984
+ return null;
11985
+ if (!("buffer" in result) || !("engine" in result))
11986
+ return null;
11987
+ const { buffer, engine } = result;
11988
+ if (!(buffer instanceof Uint8Array) || typeof engine !== "object" || engine === null)
11989
+ return null;
11990
+ if (!("bytesWritten" in engine) || typeof engine.bytesWritten !== "number")
11991
+ return null;
11992
+ return { output: buffer, consumed: engine.bytesWritten };
11993
+ }
11994
+ function parseBinary(bytes) {
11995
+ if (bytes.length < BINARY_OVERHEAD || bytes.length > MAX_BINARY_ENVELOPE_BYTES)
11996
+ return null;
11997
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
11998
+ const version = view.getUint8(4);
11999
+ const codec = view.getUint8(5);
12000
+ const claimed = view.getUint32(6, false);
12001
+ if (version !== BINARY_VERSION)
12002
+ return null;
12003
+ if (claimed < 1 || claimed > MAX_ARTIFACT_BYTES)
12004
+ return null;
12005
+ if (!payloadFits(codec, bytes.length - BINARY_OVERHEAD, claimed))
12006
+ return null;
12007
+ return {
12008
+ header: own2(bytes, 0, BINARY_HEADER_BYTES),
12009
+ codec,
12010
+ claimed,
12011
+ iv: own2(bytes, BINARY_HEADER_BYTES, BINARY_HEADER_BYTES + BINARY_IV_BYTES),
12012
+ sealed: own2(bytes, BINARY_HEADER_BYTES + BINARY_IV_BYTES)
12013
+ };
12014
+ }
12015
+ async function openBinary(key, envelope) {
12016
+ const payload = await crypto.subtle.decrypt({
12017
+ name: "AES-GCM",
12018
+ iv: envelope.iv,
12019
+ additionalData: envelope.header,
12020
+ tagLength: BINARY_TAG_BYTES * 8
12021
+ }, key, envelope.sealed);
12022
+ return new TextDecoder("utf-8", { fatal: true }).decode(await expand(envelope.codec, new Uint8Array(payload), envelope.claimed));
12023
+ }
12024
+ function startsWith(bytes, prefix) {
12025
+ if (bytes.length < prefix.length)
12026
+ return false;
12027
+ return prefix.every((byte, i) => bytes[i] === byte);
11897
12028
  }
11898
12029
  async function decodeArtifact(key, bytes, expectedSha256) {
12030
+ const corrupt = { ok: false, failure: "corrupt" };
11899
12031
  try {
11900
- if (expectedSha256 !== null && await sha256Hex(bytes) !== expectedSha256) {
11901
- return { ok: false, failure: "corrupt" };
11902
- }
11903
- const parsed = JSON.parse(await decrypt(key, new TextDecoder().decode(bytes)));
11904
- if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
11905
- return { ok: false, failure: "corrupt" };
12032
+ if (bytes.length > MAX_ENVELOPE_BYTES)
12033
+ return corrupt;
12034
+ let unseal;
12035
+ if (startsWith(bytes, BINARY_MAGIC)) {
12036
+ const envelope = parseBinary(bytes);
12037
+ if (envelope === null)
12038
+ return corrupt;
12039
+ unseal = () => openBinary(key, envelope);
12040
+ } else if (startsWith(bytes, LEGACY_PREFIX)) {
12041
+ const text = new TextDecoder().decode(bytes);
12042
+ if (!isLegacyStructure(text))
12043
+ return corrupt;
12044
+ unseal = () => decrypt(key, text);
12045
+ } else {
12046
+ return corrupt;
11906
12047
  }
12048
+ if (expectedSha256 !== null && await sha256Hex(bytes) !== expectedSha256)
12049
+ return corrupt;
12050
+ const parsed = JSON.parse(await unseal());
12051
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
12052
+ return corrupt;
11907
12053
  return { ok: true, artifact: parsed };
11908
12054
  } catch {
11909
- return { ok: false, failure: "corrupt" };
12055
+ return corrupt;
11910
12056
  }
11911
12057
  }
11912
12058
  async function writeArtifact(dir, relPath, bytes) {
@@ -13184,13 +13330,16 @@ function createBodyRepo(sql, key) {
13184
13330
  return row;
13185
13331
  },
13186
13332
  async get(requestId) {
13187
- const found = (await sql.unsafe("SELECT * FROM request_bodies WHERE request_id = $1", [requestId]))[0];
13333
+ const found = (await sql.unsafe(`SELECT ${META},
13334
+ CASE WHEN octet_length(bytes) <= $2 THEN bytes ELSE NULL END AS bytes,
13335
+ octet_length(bytes) AS encoded_size
13336
+ FROM request_bodies WHERE request_id = $1`, [requestId, MAX_ENVELOPE_BYTES]))[0];
13188
13337
  if (found === undefined)
13189
13338
  return null;
13190
13339
  const row = toRow(found);
13191
13340
  if (row.relPath === null || row.detailState === "none")
13192
13341
  return { row, artifact: null };
13193
- const read = found.bytes === null ? { ok: false, failure: "missing" } : await decodeArtifact(key, new Uint8Array(found.bytes), row.sha256);
13342
+ const read = found.encoded_size === null ? { ok: false, failure: "missing" } : found.bytes === null ? { ok: false, failure: "corrupt" } : await decodeArtifact(key, new Uint8Array(found.bytes), row.sha256);
13194
13343
  if (read.ok) {
13195
13344
  if (row.detailState !== "ready")
13196
13345
  await recordState(requestId, "ready");
@@ -13278,6 +13427,7 @@ var DEFAULT_SETTINGS = {
13278
13427
  breakerThreshold: 3,
13279
13428
  breakerCooldownMs: 30000,
13280
13429
  logRetentionDays: 30,
13430
+ bodyRetentionDays: 1,
13281
13431
  quotaPollIntervalMs: 300000,
13282
13432
  rtkEnabled: false,
13283
13433
  autoCacheEnabled: true,
@@ -13347,6 +13497,7 @@ function createConfigRepo(sql, emit) {
13347
13497
  rtkEnabled: stored.rtkEnabled === true,
13348
13498
  autoCacheEnabled: stored.autoCacheEnabled === undefined ? true : stored.autoCacheEnabled === true,
13349
13499
  ponytailMode: isPonytailMode(stored.ponytailMode) ? stored.ponytailMode : "off",
13500
+ bodyRetentionDays: Number.isInteger(stored.bodyRetentionDays) && (stored.bodyRetentionDays ?? 0) >= 1 && (stored.bodyRetentionDays ?? 0) <= 3650 ? stored.bodyRetentionDays : DEFAULT_SETTINGS.bodyRetentionDays,
13350
13501
  bodyLoggingEnabled: stored.bodyLoggingEnabled === true,
13351
13502
  bodyLoggingCaptureStreamChunks: stored.bodyLoggingCaptureStreamChunks === true,
13352
13503
  weights: knownWeights(stored.weights)
@@ -14836,6 +14987,7 @@ function createConfigRepo2(db, emit = () => {}) {
14836
14987
  rtkEnabled: stored.rtkEnabled === true,
14837
14988
  autoCacheEnabled: stored.autoCacheEnabled === undefined ? true : stored.autoCacheEnabled === true,
14838
14989
  ponytailMode: isPonytailMode(stored.ponytailMode) ? stored.ponytailMode : "off",
14990
+ bodyRetentionDays: Number.isInteger(stored.bodyRetentionDays) && (stored.bodyRetentionDays ?? 0) >= 1 && (stored.bodyRetentionDays ?? 0) <= 3650 ? stored.bodyRetentionDays : DEFAULT_SETTINGS.bodyRetentionDays,
14839
14991
  bodyLoggingEnabled: stored.bodyLoggingEnabled === true,
14840
14992
  bodyLoggingCaptureStreamChunks: stored.bodyLoggingCaptureStreamChunks === true,
14841
14993
  weights: knownWeights2(stored.weights)
@@ -19628,6 +19780,9 @@ function toWire(req, model, opts) {
19628
19780
  addAutoCacheBreakpoints(body, req, note);
19629
19781
  if (req.reasoning !== undefined) {
19630
19782
  switch (req.reasoning.mode) {
19783
+ case "betweenTools":
19784
+ body.thinking = { type: "between_tools" };
19785
+ break;
19631
19786
  case "adaptive":
19632
19787
  if (anthropicReasoningForm(model) === "budget") {
19633
19788
  body.thinking = { type: "disabled" };
@@ -19666,7 +19821,10 @@ function toWire(req, model, opts) {
19666
19821
  } else if (!nativeFormat && read.kind === "tooDeep") {
19667
19822
  note("anthropic:response-schema-too-deep");
19668
19823
  }
19669
- const vendorRaw = req.vendor?.anthropic ?? {};
19824
+ const { thinking: thinkingExtras, ...vendorRaw } = req.vendor?.anthropic ?? {};
19825
+ if (body.thinking !== undefined && isRecord2(thinkingExtras)) {
19826
+ body.thinking = { ...thinkingExtras, ...body.thinking };
19827
+ }
19670
19828
  const vendorConfig = vendorRaw.output_config;
19671
19829
  const encoderConfig = isRecord2(body.output_config) ? body.output_config : undefined;
19672
19830
  let unreadableFormat = false;
@@ -20843,6 +21001,10 @@ function toAntigravityWire(req, model, identity) {
20843
21001
  }
20844
21002
  if (req.reasoning !== undefined) {
20845
21003
  switch (req.reasoning.mode) {
21004
+ case "betweenTools":
21005
+ note("antigravity:reasoning-between-tools-as-off");
21006
+ generationConfig.thinkingConfig = { thinkingBudget: 0, includeThoughts: false };
21007
+ break;
20846
21008
  case "off":
20847
21009
  generationConfig.thinkingConfig = { thinkingBudget: 0, includeThoughts: false };
20848
21010
  break;
@@ -20860,7 +21022,7 @@ function toAntigravityWire(req, model, identity) {
20860
21022
  break;
20861
21023
  case "adaptive":
20862
21024
  generationConfig.thinkingConfig = {
20863
- includeThoughts: req.reasoning.display !== "omitted"
21025
+ includeThoughts: req.reasoning.display !== "omitted" && req.reasoning.display !== "updates"
20864
21026
  };
20865
21027
  if (req.reasoning.effort !== undefined)
20866
21028
  note("antigravity:reasoning-effort-dropped");
@@ -22735,6 +22897,8 @@ function toCustomChatWire(req, model) {
22735
22897
  }
22736
22898
  if (req.toolChoice !== undefined)
22737
22899
  body.tool_choice = encodeChatToolChoice(req.toolChoice);
22900
+ if (req.reasoning?.mode === "betweenTools")
22901
+ note("custom:reasoning-between-tools-as-off");
22738
22902
  const effort = customEffort(req.reasoning);
22739
22903
  if (effort !== undefined)
22740
22904
  body.reasoning_effort = effort;
@@ -22865,9 +23029,14 @@ function toCustomResponsesWire(req, model) {
22865
23029
  }
22866
23030
  if (req.toolChoice !== undefined)
22867
23031
  body.tool_choice = encodeResponsesToolChoice(req.toolChoice);
23032
+ if (req.reasoning?.mode === "betweenTools")
23033
+ note("custom:reasoning-between-tools-as-off");
22868
23034
  const effort = customEffort(req.reasoning);
22869
23035
  if (effort !== undefined)
22870
- body.reasoning = { effort, summary: "auto" };
23036
+ body.reasoning = {
23037
+ effort,
23038
+ ...req.reasoning?.mode === "adaptive" && (req.reasoning.display === "omitted" || req.reasoning.display === "updates") ? {} : { summary: "auto" }
23039
+ };
22871
23040
  else if (req.reasoning?.mode === "budget")
22872
23041
  note("custom:reasoning-budget-dropped");
22873
23042
  Object.assign(body, req.vendor?.openai ?? {});
@@ -23260,12 +23429,17 @@ function toGrokWire(req, model) {
23260
23429
  }
23261
23430
  if (req.toolChoice !== undefined)
23262
23431
  body.tool_choice = encodeToolChoice3(req.toolChoice);
23263
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
23432
+ if (req.reasoning?.mode === "betweenTools")
23433
+ note("grok:reasoning-between-tools-as-off");
23434
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
23264
23435
  if (req.reasoning.mode === "budget") {
23265
23436
  note("grok:reasoning-budget-dropped");
23266
23437
  } else {
23267
23438
  const effort = req.reasoning.effort ?? "medium";
23268
- body.reasoning = { effort, summary: "concise" };
23439
+ body.reasoning = {
23440
+ effort,
23441
+ ...req.reasoning.display === "omitted" || req.reasoning.display === "updates" ? {} : { summary: "concise" }
23442
+ };
23269
23443
  }
23270
23444
  }
23271
23445
  Object.assign(body, req.vendor?.grok ?? {});
@@ -23725,7 +23899,9 @@ function toKiloWire(req, model) {
23725
23899
  }
23726
23900
  if (req.toolChoice !== undefined)
23727
23901
  body.tool_choice = encodeToolChoice4(req.toolChoice);
23728
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
23902
+ if (req.reasoning?.mode === "betweenTools")
23903
+ note("kilo:reasoning-between-tools-as-off");
23904
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
23729
23905
  if (req.reasoning.mode === "budget") {
23730
23906
  body.reasoning = { max_tokens: req.reasoning.budgetTokens };
23731
23907
  } else {
@@ -24003,6 +24179,8 @@ function toChatWire(req, model, vendor = "kimi") {
24003
24179
  }
24004
24180
  if (req.toolChoice !== undefined)
24005
24181
  body.tool_choice = encodeToolChoice5(req.toolChoice);
24182
+ if (req.reasoning?.mode === "betweenTools")
24183
+ note("kimi:reasoning-between-tools-as-off");
24006
24184
  if (req.reasoning !== undefined)
24007
24185
  note("kimi:reasoning-dropped");
24008
24186
  Object.assign(body, req.vendor?.[vendor] ?? {});
@@ -24425,12 +24603,17 @@ function toMuseWire(req, model) {
24425
24603
  }
24426
24604
  if (req.toolChoice !== undefined)
24427
24605
  body.tool_choice = encodeToolChoice6(req.toolChoice);
24428
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
24606
+ if (req.reasoning?.mode === "betweenTools")
24607
+ note("muse:reasoning-between-tools-as-off");
24608
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
24429
24609
  if (req.reasoning.mode === "budget") {
24430
24610
  note("muse:reasoning-budget-dropped");
24431
24611
  } else {
24432
24612
  const effort = req.reasoning.effort ?? "medium";
24433
- body.reasoning = { effort, summary: "auto" };
24613
+ body.reasoning = {
24614
+ effort,
24615
+ ...req.reasoning.display === "omitted" || req.reasoning.display === "updates" ? {} : { summary: "auto" }
24616
+ };
24434
24617
  }
24435
24618
  }
24436
24619
  const key = suppliedKey(req) ?? cacheKey(req, instructions ?? "", input[0]);
@@ -24861,12 +25044,17 @@ function toResponsesWire(req, model, opts = { oauth: false }) {
24861
25044
  }
24862
25045
  if (req.toolChoice !== undefined)
24863
25046
  body.tool_choice = encodeToolChoice7(req.toolChoice);
24864
- if (req.reasoning !== undefined && req.reasoning.mode !== "off") {
25047
+ if (req.reasoning?.mode === "betweenTools")
25048
+ degradations.push("openai:reasoning-between-tools-as-off");
25049
+ if (req.reasoning !== undefined && req.reasoning.mode !== "off" && req.reasoning.mode !== "betweenTools") {
24865
25050
  if (req.reasoning.mode === "budget") {
24866
25051
  degradations.push("openai:reasoning-budget-dropped");
24867
25052
  } else {
24868
25053
  const effort = req.reasoning.effort ?? "medium";
24869
- body.reasoning = { effort, summary: "auto" };
25054
+ body.reasoning = {
25055
+ effort,
25056
+ ...req.reasoning.display === "omitted" || req.reasoning.display === "updates" ? {} : { summary: "auto" }
25057
+ };
24870
25058
  }
24871
25059
  }
24872
25060
  const key = suppliedKey2(req) ?? cacheKey2(req, instructions ?? "", input[0]);
@@ -25220,6 +25408,7 @@ var settingsSchema = object({
25220
25408
  breakerThreshold: number2().int().min(1),
25221
25409
  breakerCooldownMs: number2().int().positive(),
25222
25410
  logRetentionDays: number2().int().min(1),
25411
+ bodyRetentionDays: retentionSchema.shape.maxAgeDays.optional(),
25223
25412
  quotaPollIntervalMs: number2().int().min(0),
25224
25413
  rtkEnabled: boolean2(),
25225
25414
  autoCacheEnabled: boolean2(),
@@ -25383,7 +25572,7 @@ function requiredCapabilities(request) {
25383
25572
  return {
25384
25573
  tools: (request.tools?.length ?? 0) > 0,
25385
25574
  images,
25386
- reasoning: request.reasoning !== undefined && request.reasoning.mode !== "off"
25575
+ reasoning: request.reasoning !== undefined && request.reasoning.mode !== "off" && request.reasoning.mode !== "betweenTools"
25387
25576
  };
25388
25577
  }
25389
25578
  function cooldownMs(failures, threshold, base) {
@@ -27882,9 +28071,10 @@ async function getSettings(store) {
27882
28071
  return store.config.getSettings();
27883
28072
  }
27884
28073
  async function putSettings(store, input) {
27885
- const { snapshotKeepLatest, snapshotMaxAgeDays, ...rest } = parseOrThrow(settingsSchema, input);
28074
+ const { bodyRetentionDays, snapshotKeepLatest, snapshotMaxAgeDays, ...rest } = parseOrThrow(settingsSchema, input);
27886
28075
  const patch = {
27887
28076
  ...rest,
28077
+ ...bodyRetentionDays === undefined ? {} : { bodyRetentionDays },
27888
28078
  ...snapshotKeepLatest === undefined ? {} : { snapshotKeepLatest },
27889
28079
  ...snapshotMaxAgeDays === undefined ? {} : { snapshotMaxAgeDays }
27890
28080
  };
@@ -46949,10 +47139,11 @@ var schema = object({
46949
47139
  thinking: union([
46950
47140
  object({
46951
47141
  type: literal("adaptive"),
46952
- display: _enum(["summarized", "omitted"]).optional()
47142
+ display: _enum(["summarized", "omitted", "updates"]).optional()
46953
47143
  }),
46954
47144
  object({ type: literal("enabled"), budget_tokens: number2().int().positive() }),
46955
- object({ type: literal("disabled") })
47145
+ object({ type: literal("disabled") }),
47146
+ object({ type: literal("between_tools") })
46956
47147
  ]).optional(),
46957
47148
  metadata: object({ user_id: string2().max(512).nullish() }).nullish()
46958
47149
  });
@@ -47178,6 +47369,8 @@ function toIrReasoning(thinking, effort) {
47178
47369
  return { mode: "budget", budgetTokens: thinking.budget_tokens };
47179
47370
  case "disabled":
47180
47371
  return { mode: "off" };
47372
+ case "between_tools":
47373
+ return { mode: "betweenTools" };
47181
47374
  }
47182
47375
  }
47183
47376
  function readBetas(headers) {
@@ -47237,8 +47430,13 @@ function parseAnthropicRequest(body, headers) {
47237
47430
  const conversation = typeof userId === "string" && userId.length > 0 ? userId : readConversationHeader(headers ?? undefined);
47238
47431
  if (conversation !== undefined)
47239
47432
  request.conversationId = conversation;
47240
- const extras = extraFields(body, KNOWN);
47241
- if (extras !== undefined)
47433
+ const rawThinking = body.thinking;
47434
+ const thinkingExtras = parsed.thinking !== undefined && typeof rawThinking === "object" && rawThinking !== null ? extraFields(rawThinking, ["type", "display", "budget_tokens"]) : undefined;
47435
+ const extras = {
47436
+ ...extraFields(body, KNOWN),
47437
+ ...thinkingExtras === undefined ? {} : { thinking: thinkingExtras }
47438
+ };
47439
+ if (Object.keys(extras).length > 0)
47242
47440
  request.vendor = { anthropic: extras };
47243
47441
  if (named.betas.length > 0)
47244
47442
  request.betas = named.betas;
@@ -49035,7 +49233,7 @@ function createRing(limits = DEFAULT_RING_LIMITS) {
49035
49233
  }
49036
49234
 
49037
49235
  // apps/gateway/src/version.ts
49038
- var VERSION = "0.13.3";
49236
+ var VERSION = "0.13.5";
49039
49237
 
49040
49238
  // apps/gateway/src/app.ts
49041
49239
  var ADMIN_SESSION_TTL_MS = 12 * 60 * 60 * 1000;
@@ -49824,7 +50022,8 @@ async function pruneLogs(store, now) {
49824
50022
  const raw = await store.usage.prune(rawHorizon);
49825
50023
  const daily = await store.usage.pruneDaily(now - ROLLUP_RETENTION_DAYS * DAY_MS4);
49826
50024
  const quotaSamples = await store.credentials.pruneQuotaSamples(rawHorizon);
49827
- const bodies = await store.bodies.prune(rawHorizon);
50025
+ const bodyHorizon = now - Math.min(settings.bodyRetentionDays, settings.logRetentionDays) * DAY_MS4;
50026
+ const bodies = await store.bodies.prune(bodyHorizon);
49828
50027
  const bodiesOverCap = await store.bodies.pruneToCap();
49829
50028
  const bodyOrphans = await store.bodies.sweepOrphans();
49830
50029
  return { raw, daily, quotaSamples, bodies, bodiesOverCap, bodyOrphans };
@@ -50055,11 +50254,11 @@ function installPluginProviders(providers, logger, registry = OAUTH_PROVIDERS) {
50055
50254
  }
50056
50255
 
50057
50256
  // apps/gateway/src/plugins/loader.ts
50058
- import { readdir as readdir2, readFile as readFile3 } from "fs/promises";
50257
+ import { readdir as readdir2, readFile as readFile2 } from "fs/promises";
50059
50258
  import { join as join5, resolve as resolve5, sep as sep5 } from "path";
50060
50259
 
50061
50260
  // apps/gateway/src/plugins/capabilities.ts
50062
- import { mkdir as mkdir2, readFile as readFile2, realpath, writeFile as writeFile2 } from "fs/promises";
50261
+ import { mkdir as mkdir2, readFile, realpath, writeFile as writeFile2 } from "fs/promises";
50063
50262
  import { dirname as dirname4, resolve as resolve4, sep as sep4 } from "path";
50064
50263
  async function resolveInside(root, path) {
50065
50264
  const rootReal = await realpath(root);
@@ -50089,7 +50288,7 @@ function createPluginFiles(root) {
50089
50288
  async read(path) {
50090
50289
  const target = await ensureRootThen(root, () => resolveInside(root, path));
50091
50290
  try {
50092
- const data = await readFile2(target);
50291
+ const data = await readFile(target);
50093
50292
  return new Uint8Array(data);
50094
50293
  } catch {
50095
50294
  return null;
@@ -50103,7 +50302,7 @@ function createPluginFiles(root) {
50103
50302
  async exists(path) {
50104
50303
  const target = await ensureRootThen(root, () => resolveInside(root, path));
50105
50304
  try {
50106
- await readFile2(target);
50305
+ await readFile(target);
50107
50306
  return true;
50108
50307
  } catch {
50109
50308
  return false;
@@ -50210,7 +50409,7 @@ async function loadPlugins(deps) {
50210
50409
  };
50211
50410
  let manifest;
50212
50411
  try {
50213
- const raw = await readFile3(join5(home, "omni-plugin.json"), "utf8");
50412
+ const raw = await readFile2(join5(home, "omni-plugin.json"), "utf8");
50214
50413
  const parsed = safeParseManifest(JSON.parse(raw));
50215
50414
  if (!parsed.ok) {
50216
50415
  fail(parsed.reason);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnigateway",
3
- "version": "0.13.3",
3
+ "version": "0.13.5",
4
4
  "description": "Self-hosted AI gateway with Anthropic- and OpenAI-compatible APIs, an admin console, and a CLI",
5
5
  "license": "MIT",
6
6
  "author": "Harismawan <mail@harismawan.com>",
@@ -1,4 +1,4 @@
1
- import{At as e,B as t,j as n,lt as r}from"./Lamp-Dk9XrTCg.js";import{S as i,a,n as o,o as s,s as ee,t as c,x as l}from"./Panel-CsovmtxF.js";import{D as u,t as d}from"./Rack-CDUOJkS2.js";import{a as f,c as p,o as m,s as h}from"./index-Bzh27906.js";import{i as g}from"./Field-DG1317zr.js";import{useQueryClient as te}from"@tanstack/react-query";import{useLayoutEffect as ne,useMemo as _,useRef as v,useState as y}from"react";import{Fragment as b,jsx as x,jsxs as S}from"react/jsx-runtime";import C from"styled-components";var w={debug:10,info:20,warn:30,error:40};function T(e){return typeof e==`string`&&e in w}function E(e,t){return!T(t)||e.level===null||w[e.level]>=w[t]}function D(e){if(typeof e!=`object`||!e)return null;let{raw:t,at:n,level:r,msg:i}=e;return typeof t!=`string`||n!==null&&typeof n!=`number`||r!==null&&!T(r)||i!==null&&typeof i!=`string`?null:{raw:t,at:n,level:r,msg:i}}function re(e){if(typeof e!=`object`||!e)return null;let{lines:t}=e;if(!Array.isArray(t))return null;let n=[];for(let e of t){let t=D(e);if(t===null)return null;n.push(t)}return n}var O=[100,200,500],ie=[{value:``,label:`All levels`},{value:`debug`,label:`Debug and above`},{value:`info`,label:`Info and above`},{value:`warn`,label:`Warnings and errors`},{value:`error`,label:`Errors only`}],ae=C(i)`
1
+ import{At as e,B as t,j as n,lt as r}from"./Lamp-Dk9XrTCg.js";import{S as i,a,n as o,o as s,s as ee,t as c,x as l}from"./Panel-CsovmtxF.js";import{D as u,t as d}from"./Rack-CDUOJkS2.js";import{a as f,c as p,o as m,s as h}from"./index-BYDVTknB.js";import{i as g}from"./Field-DG1317zr.js";import{useQueryClient as te}from"@tanstack/react-query";import{useLayoutEffect as ne,useMemo as _,useRef as v,useState as y}from"react";import{Fragment as b,jsx as x,jsxs as S}from"react/jsx-runtime";import C from"styled-components";var w={debug:10,info:20,warn:30,error:40};function T(e){return typeof e==`string`&&e in w}function E(e,t){return!T(t)||e.level===null||w[e.level]>=w[t]}function D(e){if(typeof e!=`object`||!e)return null;let{raw:t,at:n,level:r,msg:i}=e;return typeof t!=`string`||n!==null&&typeof n!=`number`||r!==null&&!T(r)||i!==null&&typeof i!=`string`?null:{raw:t,at:n,level:r,msg:i}}function re(e){if(typeof e!=`object`||!e)return null;let{lines:t}=e;if(!Array.isArray(t))return null;let n=[];for(let e of t){let t=D(e);if(t===null)return null;n.push(t)}return n}var O=[100,200,500],ie=[{value:``,label:`All levels`},{value:`debug`,label:`Debug and above`},{value:`info`,label:`Info and above`},{value:`warn`,label:`Warnings and errors`},{value:`error`,label:`Errors only`}],ae=C(i)`
2
2
  gap: ${({theme:e})=>e.space(2)};
3
3
  flex-wrap: wrap;
4
4
  `,k=C(g)`
@@ -1,4 +1,4 @@
1
- import{jt as e}from"./Lamp-Dk9XrTCg.js";import{t}from"./preload-helper-B7KDmXJ9.js";import{T as n,a as r,d as i,m as a,o,p as s,r as c,s as l,u}from"./Panel-CsovmtxF.js";import{t as d}from"./Rack-CDUOJkS2.js";import{t as f}from"./index-Bzh27906.js";import{Component as p,Suspense as m,createContext as h,lazy as g,useContext as _,useMemo as v}from"react";import{Fragment as y,jsx as b,jsxs as x}from"react/jsx-runtime";import S from"styled-components";import{pluginApiPath as C}from"@omnigateway/dashboard-sdk";var w=new Map;function T(e){let t=w.get(e);if(t!==void 0)return t;let n={get:(t,n)=>i(C(e,t),n),post:(t,n)=>s(C(e,t),n),put:(t,n)=>a(C(e,t),n),del:t=>u(C(e,t))};return w.set(e,n),n}var E=h(e=>t(()=>import(e),[]));E.Provider;function D(){return _(E)}function O(e,t){let n=e?.default;if(n==null)throw Error(`plugin ${t} has no default export from definePluginUI`);if(typeof n.mount!=`function`)throw Error(`plugin ${t} exported a default without a mount function`);return n}function k(e,t,n){return g(async()=>{let r=O(await n(t),e);return{default:()=>r.mount({pluginId:e,api:T(e)})}})}var A=S.p`
1
+ import{jt as e}from"./Lamp-Dk9XrTCg.js";import{t}from"./preload-helper-B7KDmXJ9.js";import{T as n,a as r,d as i,m as a,o,p as s,r as c,s as l,u}from"./Panel-CsovmtxF.js";import{t as d}from"./Rack-CDUOJkS2.js";import{t as f}from"./index-BYDVTknB.js";import{Component as p,Suspense as m,createContext as h,lazy as g,useContext as _,useMemo as v}from"react";import{Fragment as y,jsx as b,jsxs as x}from"react/jsx-runtime";import S from"styled-components";import{pluginApiPath as C}from"@omnigateway/dashboard-sdk";var w=new Map;function T(e){let t=w.get(e);if(t!==void 0)return t;let n={get:(t,n)=>i(C(e,t),n),post:(t,n)=>s(C(e,t),n),put:(t,n)=>a(C(e,t),n),del:t=>u(C(e,t))};return w.set(e,n),n}var E=h(e=>t(()=>import(e),[]));E.Provider;function D(){return _(E)}function O(e,t){let n=e?.default;if(n==null)throw Error(`plugin ${t} has no default export from definePluginUI`);if(typeof n.mount!=`function`)throw Error(`plugin ${t} exported a default without a mount function`);return n}function k(e,t,n){return g(async()=>{let r=O(await n(t),e);return{default:()=>r.mount({pluginId:e,api:T(e)})}})}var A=S.p`
2
2
  font-size: 13px;
3
3
  color: ${({theme:e})=>e.color.down};
4
4
  `,j=S.p`
@@ -34,7 +34,7 @@ import{J as e,Jt as t,Qt as n,Ut as r,X as i,Z as a,kt as o,qt as s}from"./Lamp-
34
34
  display: grid;
35
35
  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
36
36
  gap: ${({theme:e})=>e.space(2)};
37
- `,oe=[{key:`defaultModel`,label:`Default model`,required:!0},{key:`fableModel`,label:`Fable model`,required:!1},{key:`opusModel`,label:`Opus model`,required:!1},{key:`sonnetModel`,label:`Sonnet model`,required:!1},{key:`haikuModel`,label:`Haiku model`,required:!1}];function V(){let[t,n]=O(`claude`),[r,i]=O(()=>({claude:{},opencode:{}})),a=o(),s=r[t],u=typeof s.defaultModel==`string`&&s.defaultModel!==``?s:void 0,_=e(t,u),v=z.find(e=>e.id===t);return k(h,{legend:`Agent setup`,children:A(l,{children:[k(c,{children:z.map(e=>k(p,{type:`button`,$variant:e.id===t?`primary`:`ghost`,onClick:()=>n(e.id),children:e.label},e.id))}),A(B,{children:[v?.where,`. The key is a placeholder — paste your own over it. Or run`,` `,A(d,{children:[`omni setup `,t]}),` to write these files directly.`]}),t===`claude`?A(B,{children:[`Claude Code cannot read a window from this gateway, so it assumes 200k for a pool id it does not recognise and auto-compacts there. For a pool whose models hold 1M, append`,` `,k(d,{children:`[1m]`}),` to the model name — `,k(d,{children:`--model 'pool[1m]'`}),` — which lifts it per invocation. The suffix is stripped before the request is sent, so the pool id arrives unchanged.`]}):null,(a.data?.length??0)>0?k(ae,{children:oe.map(e=>k(w,{label:e.label,children:n=>A(S,{...n,value:s[e.key]??``,onChange:n=>i(r=>({...r,[t]:{...r[t],[e.key]:n.target.value||void 0}})),children:[k(`option`,{value:``,children:e.required?`Choose a pool`:`Not mapped`}),a.data?.map(e=>k(`option`,{value:e.id,children:e.id},e.id))]})},e.key))}):null,a.isLoading?k(g,{rows:2}):_.isError?k(m,{error:_.error,onRetry:()=>void _.refetch()}):_.isLoading?k(g,{rows:4}):(a.data?.length??0)===0?k(B,{children:`No virtual models configured yet, so there is nothing to point a client at.`}):u===void 0?A(B,{children:[`Choose a default model to generate `,v?.label,` settings.`]}):_.data===void 0||_.data.length===0?k(B,{children:`No virtual models configured yet, so there is nothing to point a client at.`}):_.data.map(e=>A(`div`,{children:[k(ie,{children:e.path}),k(re,{as:`pre`,children:e.contents.trimEnd()})]},e.path)),_.isError?k(B,{children:f(_.error)}):null]})})}var H={off:`Off`,lite:`Lite — names the lazier option`,full:`Full — the ladder enforced`,ultra:`Ultra — challenges the requirement`},U=[{id:`tier`,label:`Tier`,blurb:`Prefers a lower tier.`},{id:`health`,label:`Health`,blurb:`Penalises recent failures and an open breaker.`},{id:`quota`,label:`Quota`,blurb:`Prefers accounts ahead of their window's burn rate.`},{id:`cost`,label:`Cost`,blurb:`Prefers the cheaper candidate.`},{id:`latency`,label:`Latency`,blurb:`Prefers the faster observed first token.`},{id:`load`,label:`Load`,blurb:`Prefers accounts with fewer requests in flight.`}],W=[{id:`maxAttempts`,label:`Attempts per request`,hint:`Candidates dispatch may try. 1 disables failover.`,unit:`attempts`,step:1,min:1},{id:`requestDeadlineMs`,label:`Request deadline`,hint:`Across all attempts. 0 disables only OmniGateway's deadline.`,unit:`ms`,step:1e3,min:0},{id:`breakerThreshold`,label:`Breaker threshold`,hint:`Consecutive failures before an account and model leaves rotation.`,unit:`failures`,step:1,min:1},{id:`breakerCooldownMs`,label:`Breaker cooldown`,hint:`Wait before a tripped account is probed. Doubles per extra failure.`,unit:`ms`,step:1e3,min:1},{id:`logRetentionDays`,label:`Log retention`,hint:`How long request rows are kept before pruning.`,unit:`days`,step:1,min:1},{id:`quotaPollIntervalMs`,label:`Quota poll interval`,hint:`How often a provider is asked for remaining quota. 0 disables. Needs a restart.`,unit:`ms`,step:6e4,min:0}],G=j.div`
37
+ `,oe=[{key:`defaultModel`,label:`Default model`,required:!0},{key:`fableModel`,label:`Fable model`,required:!1},{key:`opusModel`,label:`Opus model`,required:!1},{key:`sonnetModel`,label:`Sonnet model`,required:!1},{key:`haikuModel`,label:`Haiku model`,required:!1}];function V(){let[t,n]=O(`claude`),[r,i]=O(()=>({claude:{},opencode:{}})),a=o(),s=r[t],u=typeof s.defaultModel==`string`&&s.defaultModel!==``?s:void 0,_=e(t,u),v=z.find(e=>e.id===t);return k(h,{legend:`Agent setup`,children:A(l,{children:[k(c,{children:z.map(e=>k(p,{type:`button`,$variant:e.id===t?`primary`:`ghost`,onClick:()=>n(e.id),children:e.label},e.id))}),A(B,{children:[v?.where,`. The key is a placeholder — paste your own over it. Or run`,` `,A(d,{children:[`omni setup `,t]}),` to write these files directly.`]}),t===`claude`?A(B,{children:[`Claude Code cannot read a window from this gateway, so it assumes 200k for a pool id it does not recognise and auto-compacts there. For a pool whose models hold 1M, append`,` `,k(d,{children:`[1m]`}),` to the model name — `,k(d,{children:`--model 'pool[1m]'`}),` — which lifts it per invocation. The suffix is stripped before the request is sent, so the pool id arrives unchanged.`]}):null,(a.data?.length??0)>0?k(ae,{children:oe.map(e=>k(w,{label:e.label,children:n=>A(S,{...n,value:s[e.key]??``,onChange:n=>i(r=>({...r,[t]:{...r[t],[e.key]:n.target.value||void 0}})),children:[k(`option`,{value:``,children:e.required?`Choose a pool`:`Not mapped`}),a.data?.map(e=>k(`option`,{value:e.id,children:e.id},e.id))]})},e.key))}):null,a.isLoading?k(g,{rows:2}):_.isError?k(m,{error:_.error,onRetry:()=>void _.refetch()}):_.isLoading?k(g,{rows:4}):(a.data?.length??0)===0?k(B,{children:`No virtual models configured yet, so there is nothing to point a client at.`}):u===void 0?A(B,{children:[`Choose a default model to generate `,v?.label,` settings.`]}):_.data===void 0||_.data.length===0?k(B,{children:`No virtual models configured yet, so there is nothing to point a client at.`}):_.data.map(e=>A(`div`,{children:[k(ie,{children:e.path}),k(re,{as:`pre`,children:e.contents.trimEnd()})]},e.path)),_.isError?k(B,{children:f(_.error)}):null]})})}var H={off:`Off`,lite:`Lite — names the lazier option`,full:`Full — the ladder enforced`,ultra:`Ultra — challenges the requirement`},U=[{id:`tier`,label:`Tier`,blurb:`Prefers a lower tier.`},{id:`health`,label:`Health`,blurb:`Penalises recent failures and an open breaker.`},{id:`quota`,label:`Quota`,blurb:`Prefers accounts ahead of their window's burn rate.`},{id:`cost`,label:`Cost`,blurb:`Prefers the cheaper candidate.`},{id:`latency`,label:`Latency`,blurb:`Prefers the faster observed first token.`},{id:`load`,label:`Load`,blurb:`Prefers accounts with fewer requests in flight.`}],W=[{id:`maxAttempts`,label:`Attempts per request`,hint:`Candidates dispatch may try. 1 disables failover.`,unit:`attempts`,step:1,min:1},{id:`requestDeadlineMs`,label:`Request deadline`,hint:`Across all attempts. 0 disables only OmniGateway's deadline.`,unit:`ms`,step:1e3,min:0},{id:`breakerThreshold`,label:`Breaker threshold`,hint:`Consecutive failures before an account and model leaves rotation.`,unit:`failures`,step:1,min:1},{id:`breakerCooldownMs`,label:`Breaker cooldown`,hint:`Wait before a tripped account is probed. Doubles per extra failure.`,unit:`ms`,step:1e3,min:1},{id:`logRetentionDays`,label:`Log retention`,hint:`How long request rows are kept before pruning.`,unit:`days`,step:1,min:1},{id:`bodyRetentionDays`,label:`Body retention`,hint:`Captured bodies only. Never longer than log retention; swept hourly.`,unit:`days`,step:1,min:1,max:3650},{id:`quotaPollIntervalMs`,label:`Quota poll interval`,hint:`How often a provider is asked for remaining quota. 0 disables. Needs a restart.`,unit:`ms`,step:6e4,min:0}],G=j.div`
38
38
  display: grid;
39
39
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
40
40
  gap: ${({theme:e})=>e.space(3)};
@@ -85,4 +85,4 @@ import{J as e,Jt as t,Qt as n,Ut as r,X as i,Z as a,kt as o,qt as s}from"./Lamp-
85
85
  code {
86
86
  font-family: ${({theme:e})=>e.font.mono};
87
87
  }
88
- `;function de(e){let t={};for(let n of U)t[`w.${n.id}`]=String(e.weights[n.id]);for(let n of W)t[n.id]=String(e[n.id]);return t.rtkEnabled=String(e.rtkEnabled),t.autoCacheEnabled=String(e.autoCacheEnabled),t.ponytailMode=e.ponytailMode,t.bodyLoggingEnabled=String(e.bodyLoggingEnabled),t.bodyLoggingCaptureStreamChunks=String(e.bodyLoggingCaptureStreamChunks),t}function fe(e){let t={};for(let n of U){let r=(e[`w.${n.id}`]??``).trim(),i=Number(r);if(r.length===0||!Number.isFinite(i))return{ok:!1,problem:`${n.label} must be a number.`};t[n.id]=i}let n={};for(let t of W){let r=(e[t.id]??``).trim(),i=Number(r);if(r.length===0||!Number.isInteger(i)||i<t.min)return{ok:!1,problem:`${t.label} must be a whole number of ${t.min} or more.`};n[t.id]=i}return n.maxAttempts>10?{ok:!1,problem:`Attempts per request cannot exceed 10.`}:{ok:!0,settings:{weights:t,...n,rtkEnabled:e.rtkEnabled===`true`,autoCacheEnabled:e.autoCacheEnabled===`true`,ponytailMode:e.ponytailMode!==void 0&&Object.hasOwn(H,e.ponytailMode)?e.ponytailMode:`off`,bodyLoggingEnabled:e.bodyLoggingEnabled===`true`,bodyLoggingCaptureStreamChunks:e.bodyLoggingCaptureStreamChunks===`true`}}}function pe(){let e=t(),n=i(),a=r(),[o,s]=O({}),[u,x]=O(null),[E,D]=O(!1);ee(()=>{e.data!==void 0&&s(de(e.data))},[e.data]);let j=Math.max(1e-4,...U.map(e=>Math.abs(Number(o[`w.${e.id}`])||0)));return A(te,{children:[k(b,{legend:`Settings`,title:`Routing and retention`,summary:`Applied to every request the gateway routes. Changes take effect on the next request; nothing restarts.`,actions:k(p,{type:`button`,$variant:`primary`,disabled:a.isPending||e.isLoading,onClick:()=>{D(!1);let e=fe(o);if(!e.ok){x(e.problem);return}x(null),a.mutate(e.settings,{onSuccess:()=>D(!0),onError:e=>x(f(e))})},children:a.isPending?`Saving…`:`Save changes`})}),e.isError?k(h,{legend:`Settings`,children:k(m,{error:e.error,onRetry:()=>void e.refetch()})}):e.isLoading?k(h,{legend:`Settings`,children:k(g,{rows:6})}):A(l,{$gap:4,children:[k(h,{legend:`Scoring weights`,meta:`relative to each other`,footer:A(c,{children:[k(y,{children:`Score is the sum of each term times its weight, then multiplied by the account and target weights.`}),k(v,{})]}),children:k(G,{children:U.map(e=>{let t=Number(o[`w.${e.id}`])||0;return A(K,{children:[k(w,{label:e.label,children:t=>k(C,{...t,type:`number`,step:.5,value:o[`w.${e.id}`]??``,onChange:t=>s({...o,[`w.${e.id}`]:t.target.value})})}),k(T,{fraction:Math.abs(t)/j,height:4,tone:`var(--accent)`,label:`${e.label} weight ${t}`}),k(q,{children:e.blurb})]},e.id)})})}),k(h,{legend:`Limits`,children:k(G,{children:W.map(e=>k(K,{children:k(w,{label:e.label,hint:e.hint,children:t=>A(c,{$gap:2,children:[k(C,{...t,type:`number`,min:e.min,step:e.step,value:o[e.id]??``,onChange:t=>s({...o,[e.id]:t.target.value})}),k(y,{children:e.unit})]})})},e.id))})}),A(_,{$min:`380px`,$stretch:!0,children:[k(h,{legend:`Request handling`,meta:`applied before dispatch`,children:A(J,{children:[k(Q,{label:`Enable RTK compression`,checked:o.rtkEnabled===`true`,onCheckedChange:e=>s({...o,rtkEnabled:String(e)}),children:`Compresses recognized historical tool results. Confirmed non-shell tools are excluded; unknown-origin results may be compressed only when a detector recognizes shell output. Lossy.`}),k(Q,{label:`Add a cache breakpoint when a client sends none`,checked:o.autoCacheEnabled===`true`,onCheckedChange:e=>s({...o,autoCacheEnabled:String(e)}),children:`Marks the end of the system prompt on Anthropic requests carrying no breakpoint of their own. Requests that mark one are untouched.`}),k(ce,{label:`Lazy senior dev mode`,blurb:`Appends the ponytail ruleset, about 1,240 tokens, to every system prompt. A request already carrying it is left alone.`,children:e=>k(S,{...e,value:o.ponytailMode??`off`,onChange:e=>s({...o,ponytailMode:e.target.value}),children:Object.entries(H).map(([e,t])=>k(`option`,{value:e,children:t},e))})})]})}),k(h,{legend:`Request and response bodies`,meta:n.data===!0?`permitted by the environment`:`not permitted`,children:A(l,{$gap:2,children:[n.data===!0?null:A(ue,{children:[`This gateway started without `,k(`code`,{children:`OMNI_BODY_LOGGING_ALLOWED`}),`, so nothing below can record anything. Set it in the installation's `,k(`code`,{children:`.env`}),` and restart first.`]}),A(J,{children:[k(Q,{label:`Capture request and response bodies`,checked:o.bodyLoggingEnabled===`true`,disabled:n.data!==!0,onCheckedChange:e=>s({...o,bodyLoggingEnabled:String(e)}),children:`Stores what each client sent and each provider returned, encrypted beside the database. Tokens and keys are masked; headers are never captured. Expires on the log retention window above.`}),k(Q,{label:`Also keep raw stream frames`,checked:o.bodyLoggingCaptureStreamChunks===`true`,disabled:n.data!==!0||o.bodyLoggingEnabled!==`true`,onCheckedChange:e=>s({...o,bodyLoggingCaptureStreamChunks:String(e)}),children:`Also keeps the raw SSE frames of each attempt. The most expensive thing capture stores.`})]})]})})]}),u===null?null:k(le,{role:`alert`,children:u}),E&&u===null?k($,{role:`status`,children:`Settings saved.`}):null,A(_,{$min:`380px`,$stretch:!0,children:[k(V,{}),k(ne,{})]}),k(h,{legend:`Known limits`,children:A(l,{$gap:2,children:[A(c,{$gap:2,$align:`start`,children:[k(d,{$dim:!0,children:`rate limits`}),k(q,{children:`Counted per gateway process and reset when it restarts. Not shared across instances.`})]}),A(c,{$gap:2,$align:`start`,children:[k(d,{$dim:!0,children:`logs`}),k(q,{children:`Request rows record routing and token counts only. Prompts and responses only when body capture is on, to a separate encrypted store. Credentials to neither.`})]})]})})]})]})}var me=pe;export{me as component};
88
+ `;function de(e){let t={};for(let n of U)t[`w.${n.id}`]=String(e.weights[n.id]);for(let n of W)t[n.id]=String(e[n.id]);return t.rtkEnabled=String(e.rtkEnabled),t.autoCacheEnabled=String(e.autoCacheEnabled),t.ponytailMode=e.ponytailMode,t.bodyLoggingEnabled=String(e.bodyLoggingEnabled),t.bodyLoggingCaptureStreamChunks=String(e.bodyLoggingCaptureStreamChunks),t}function fe(e){let t={};for(let n of U){let r=(e[`w.${n.id}`]??``).trim(),i=Number(r);if(r.length===0||!Number.isFinite(i))return{ok:!1,problem:`${n.label} must be a number.`};t[n.id]=i}let n={};for(let t of W){let r=(e[t.id]??``).trim(),i=Number(r);if(r.length===0||!Number.isInteger(i)||i<t.min)return{ok:!1,problem:`${t.label} must be a whole number of ${t.min} or more.`};if(t.max!==void 0&&i>t.max)return{ok:!1,problem:`${t.label} cannot exceed ${t.max}.`};n[t.id]=i}return n.maxAttempts>10?{ok:!1,problem:`Attempts per request cannot exceed 10.`}:{ok:!0,settings:{weights:t,...n,rtkEnabled:e.rtkEnabled===`true`,autoCacheEnabled:e.autoCacheEnabled===`true`,ponytailMode:e.ponytailMode!==void 0&&Object.hasOwn(H,e.ponytailMode)?e.ponytailMode:`off`,bodyLoggingEnabled:e.bodyLoggingEnabled===`true`,bodyLoggingCaptureStreamChunks:e.bodyLoggingCaptureStreamChunks===`true`}}}function pe(){let e=t(),n=i(),a=r(),[o,s]=O({}),[u,x]=O(null),[E,D]=O(!1);ee(()=>{e.data!==void 0&&s(de(e.data))},[e.data]);let j=Math.max(1e-4,...U.map(e=>Math.abs(Number(o[`w.${e.id}`])||0)));return A(te,{children:[k(b,{legend:`Settings`,title:`Routing and retention`,summary:`Applied to every request the gateway routes. Changes take effect on the next request; nothing restarts.`,actions:k(p,{type:`button`,$variant:`primary`,disabled:a.isPending||e.isLoading,onClick:()=>{D(!1);let e=fe(o);if(!e.ok){x(e.problem);return}x(null),a.mutate(e.settings,{onSuccess:()=>D(!0),onError:e=>x(f(e))})},children:a.isPending?`Saving…`:`Save changes`})}),e.isError?k(h,{legend:`Settings`,children:k(m,{error:e.error,onRetry:()=>void e.refetch()})}):e.isLoading?k(h,{legend:`Settings`,children:k(g,{rows:6})}):A(l,{$gap:4,children:[k(h,{legend:`Scoring weights`,meta:`relative to each other`,footer:A(c,{children:[k(y,{children:`Score is the sum of each term times its weight, then multiplied by the account and target weights.`}),k(v,{})]}),children:k(G,{children:U.map(e=>{let t=Number(o[`w.${e.id}`])||0;return A(K,{children:[k(w,{label:e.label,children:t=>k(C,{...t,type:`number`,step:.5,value:o[`w.${e.id}`]??``,onChange:t=>s({...o,[`w.${e.id}`]:t.target.value})})}),k(T,{fraction:Math.abs(t)/j,height:4,tone:`var(--accent)`,label:`${e.label} weight ${t}`}),k(q,{children:e.blurb})]},e.id)})})}),k(h,{legend:`Limits`,children:k(G,{children:W.map(e=>k(K,{children:k(w,{label:e.label,hint:e.hint,children:t=>A(c,{$gap:2,children:[k(C,{...t,type:`number`,min:e.min,max:e.max,step:e.step,value:o[e.id]??``,onChange:t=>s({...o,[e.id]:t.target.value})}),k(y,{children:e.unit})]})})},e.id))})}),A(_,{$min:`380px`,$stretch:!0,children:[k(h,{legend:`Request handling`,meta:`applied before dispatch`,children:A(J,{children:[k(Q,{label:`Enable RTK compression`,checked:o.rtkEnabled===`true`,onCheckedChange:e=>s({...o,rtkEnabled:String(e)}),children:`Compresses recognized historical tool results. Confirmed non-shell tools are excluded; unknown-origin results may be compressed only when a detector recognizes shell output. Lossy.`}),k(Q,{label:`Add a cache breakpoint when a client sends none`,checked:o.autoCacheEnabled===`true`,onCheckedChange:e=>s({...o,autoCacheEnabled:String(e)}),children:`Marks the end of the system prompt on Anthropic requests carrying no breakpoint of their own. Requests that mark one are untouched.`}),k(ce,{label:`Lazy senior dev mode`,blurb:`Appends the ponytail ruleset, about 1,240 tokens, to every system prompt. A request already carrying it is left alone.`,children:e=>k(S,{...e,value:o.ponytailMode??`off`,onChange:e=>s({...o,ponytailMode:e.target.value}),children:Object.entries(H).map(([e,t])=>k(`option`,{value:e,children:t},e))})})]})}),k(h,{legend:`Request and response bodies`,meta:n.data===!0?`permitted by the environment`:`not permitted`,children:A(l,{$gap:2,children:[n.data===!0?null:A(ue,{children:[`This gateway started without `,k(`code`,{children:`OMNI_BODY_LOGGING_ALLOWED`}),`, so nothing below can record anything. Set it in the installation's `,k(`code`,{children:`.env`}),` and restart first.`]}),A(J,{children:[k(Q,{label:`Capture request and response bodies`,checked:o.bodyLoggingEnabled===`true`,disabled:n.data!==!0,onCheckedChange:e=>s({...o,bodyLoggingEnabled:String(e)}),children:`Stores what each client sent and each provider returned, encrypted beside the database. Tokens and keys are masked; headers are never captured. Expires on the body retention window above, never later than the request log.`}),k(Q,{label:`Also keep raw stream frames`,checked:o.bodyLoggingCaptureStreamChunks===`true`,disabled:n.data!==!0||o.bodyLoggingEnabled!==`true`,onCheckedChange:e=>s({...o,bodyLoggingCaptureStreamChunks:String(e)}),children:`Also keeps the raw SSE frames of each attempt. The most expensive thing capture stores.`})]})]})})]}),u===null?null:k(le,{role:`alert`,children:u}),E&&u===null?k($,{role:`status`,children:`Settings saved.`}):null,A(_,{$min:`380px`,$stretch:!0,children:[k(V,{}),k(ne,{})]}),k(h,{legend:`Known limits`,children:A(l,{$gap:2,children:[A(c,{$gap:2,$align:`start`,children:[k(d,{$dim:!0,children:`rate limits`}),k(q,{children:`Counted per gateway process and reset when it restarts. Not shared across instances.`})]}),A(c,{$gap:2,$align:`start`,children:[k(d,{$dim:!0,children:`logs`}),k(q,{children:`Request rows record routing and token counts only. Prompts and responses only when body capture is on, to a separate encrypted store. Credentials to neither.`})]})]})})]})]})}var me=pe;export{me as component};
@@ -1,4 +1,4 @@
1
- import{_ as e,i as t,y as n}from"./shared-DDpLUhCp.js";import{$ as r,$t as i,F as a,I as o,K as ee,L as s,V as te,W as ne,at as re,et as ie,g as c,it as ae,j as l,l as oe,nt as u,ot as d,r as f,rt as se,tt as p,u as ce}from"./Lamp-Dk9XrTCg.js";import{A as m,C as h,S as g,T as _,b as v,k as y,o as le,r as ue,s as de,x as b,y as x}from"./Panel-CsovmtxF.js";import{D as fe,i as pe,t as me,x as S}from"./Rack-CDUOJkS2.js";import{a as he,i as ge,n as _e,r as ve,t as ye}from"./RequestTable-i3TtCB9m.js";import{t as C}from"./chevron-down-Bb5ZGvwk.js";import{t as w}from"./chevron-right-hwF5mD6-.js";import{i as T,r as E}from"./index-Bzh27906.js";import{i as be}from"./Field-DG1317zr.js";import{t as D}from"./Meter-stpt3vQu.js";import{i as O,n as k,r as A,t as j}from"./Table-CVDZ69Zx.js";import{n as xe,r as M}from"./WindowChart-Bqbl-KFO.js";import{i as N,n as P,r as Se,t as Ce}from"./SummaryDeck-DrzTQQo5.js";import{Fragment as we,useMemo as F,useState as I}from"react";import{Fragment as Te,jsx as L,jsxs as R}from"react/jsx-runtime";import z from"styled-components";var B=z.div`
1
+ import{_ as e,i as t,y as n}from"./shared-DDpLUhCp.js";import{$ as r,$t as i,F as a,I as o,K as ee,L as s,V as te,W as ne,at as re,et as ie,g as c,it as ae,j as l,l as oe,nt as u,ot as d,r as f,rt as se,tt as p,u as ce}from"./Lamp-Dk9XrTCg.js";import{A as m,C as h,S as g,T as _,b as v,k as y,o as le,r as ue,s as de,x as b,y as x}from"./Panel-CsovmtxF.js";import{D as fe,i as pe,t as me,x as S}from"./Rack-CDUOJkS2.js";import{a as he,i as ge,n as _e,r as ve,t as ye}from"./RequestTable-i3TtCB9m.js";import{t as C}from"./chevron-down-Bb5ZGvwk.js";import{t as w}from"./chevron-right-hwF5mD6-.js";import{i as T,r as E}from"./index-BYDVTknB.js";import{i as be}from"./Field-DG1317zr.js";import{t as D}from"./Meter-stpt3vQu.js";import{i as O,n as k,r as A,t as j}from"./Table-CVDZ69Zx.js";import{n as xe,r as M}from"./WindowChart-Bqbl-KFO.js";import{i as N,n as P,r as Se,t as Ce}from"./SummaryDeck-DrzTQQo5.js";import{Fragment as we,useMemo as F,useState as I}from"react";import{Fragment as Te,jsx as L,jsxs as R}from"react/jsx-runtime";import z from"styled-components";var B=z.div`
2
2
  display: grid;
3
3
  grid-template-areas:
4
4
  "chassis"
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_app-CSru2YTE.js","assets/Panel-CsovmtxF.js","assets/client-DUhmc9Si.js","assets/shared-DDpLUhCp.js","assets/Lamp-Dk9XrTCg.js","assets/Rack-CDUOJkS2.js","assets/RequestTable-i3TtCB9m.js","assets/TokenBreakdown-BC6nqo1v.js","assets/chevron-right-hwF5mD6-.js","assets/dist-BBGxva0Y.js","assets/Chip-D0XSbQUr.js","assets/Field-DG1317zr.js","assets/Table-CVDZ69Zx.js","assets/chevron-down-Bb5ZGvwk.js","assets/Meter-stpt3vQu.js","assets/WindowChart-Bqbl-KFO.js","assets/SummaryDeck-DrzTQQo5.js","assets/Readout-DlT5oxGO.js","assets/login-DbXxdOl5.js","assets/reasons-Du1OBWAM.js","assets/_app.index-BV1kJJjA.js","assets/_app.accounts-2syjcpos.js","assets/CopyValue-DAlmkISB.js","assets/plus-BgcHxxIr.js","assets/rotate-ccw-Do43Argv.js","assets/trash-00950_yY.js","assets/Toggle-CdMD58sy.js","assets/_app.console-Dxkf_zSS.js","assets/_app.database-CqSoTi2l.js","assets/_app.keys-Dq5O0AG9.js","assets/_app.logs-PjRK5wqy.js","assets/_app.models-BfmeeB5e.js","assets/_app.settings-5i-vvT-H.js","assets/_app.usage--5qFtU1W.js","assets/_app.plugins._pluginId-BSlXzAHP.js","assets/preload-helper-B7KDmXJ9.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_app-CSru2YTE.js","assets/Panel-CsovmtxF.js","assets/client-DEALADtD.js","assets/shared-DDpLUhCp.js","assets/Lamp-Dk9XrTCg.js","assets/Rack-CDUOJkS2.js","assets/RequestTable-i3TtCB9m.js","assets/TokenBreakdown-BC6nqo1v.js","assets/chevron-right-hwF5mD6-.js","assets/dist-BBGxva0Y.js","assets/Chip-D0XSbQUr.js","assets/Field-DG1317zr.js","assets/Table-CVDZ69Zx.js","assets/chevron-down-Bb5ZGvwk.js","assets/Meter-stpt3vQu.js","assets/WindowChart-Bqbl-KFO.js","assets/SummaryDeck-DrzTQQo5.js","assets/Readout-DlT5oxGO.js","assets/login-BhkdR1f4.js","assets/reasons-Du1OBWAM.js","assets/_app.index-BV1kJJjA.js","assets/_app.accounts-2syjcpos.js","assets/CopyValue-DAlmkISB.js","assets/plus-BgcHxxIr.js","assets/rotate-ccw-Do43Argv.js","assets/trash-00950_yY.js","assets/Toggle-CdMD58sy.js","assets/_app.console-facio1_r.js","assets/_app.database-CqSoTi2l.js","assets/_app.keys-Dq5O0AG9.js","assets/_app.logs-PjRK5wqy.js","assets/_app.models-BfmeeB5e.js","assets/_app.settings-CdSQyweb.js","assets/_app.usage--5qFtU1W.js","assets/_app.plugins._pluginId-cCDDM_D_.js","assets/preload-helper-B7KDmXJ9.js"])))=>i.map(i=>d[i]);
2
2
  import{An as e,Cn as t,Dn as n,En as r,Fn as i,H as a,In as o,K as s,Mt as c,Nn as l,On as u,Pn as d,Rn as f,Tn as p,W as m,_n as h,an as g,bn as _,cn as v,dn as y,fn as b,gn as x,hn as S,jn as C,kn as w,ln as T,mn as E,sn as D,un as ee,vn as te,wn as ne,xn as re,yn as ie}from"./Lamp-Dk9XrTCg.js";import{a as ae,c as oe,i as se,n as O,o as ce,r as k,s as le,t as A}from"./preload-helper-B7KDmXJ9.js";import{M as ue,T as de,d as fe,j,k as pe,l as me,r as he,s as ge,y as _e}from"./Panel-CsovmtxF.js";import{C as ve,E as ye,T as be,n as xe}from"./Rack-CDUOJkS2.js";import{MutationCache as Se,QueryCache as Ce,QueryClient as we,QueryClientProvider as Te,useQueryClient as Ee}from"@tanstack/react-query";import*as M from"react";import{StrictMode as De,createContext as Oe,use as ke,useEffect as N,useRef as Ae,useState as je,useSyncExternalStore as Me}from"react";import{Fragment as Ne,jsx as P,jsxs as F}from"react/jsx-runtime";import{createRoot as Pe}from"react-dom/client";import Fe from"styled-components";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function I(e){return e?.isNotFound===!0}function Ie(){try{return sessionStorage}catch{return}}var Le=`tsr-scroll-restoration-v1_3`,Re=Ie();function ze(){try{return JSON.parse(Re?.getItem(`tsr-scroll-restoration-v1_3`)||`{}`)}catch{return{}}}function Be(){try{Re?.setItem(Le,JSON.stringify(L))}catch{}}var L=ze(),Ve=`data-scroll-restoration-id`,He=e=>e.state.__TSR_key||e.href;function Ue(e){let t=e.getAttribute(Ve);if(t)return`[${Ve}="${t}"]`;let n=``,r=e,i;for(;i=r.parentNode;){let e=1,t=r;for(;t=t.previousElementSibling;)e++;let a=`${r.localName}:nth-child(${e})`;n=n?`${a} > ${n}`:a,r=i}return n}var We=!1,Ge=`window`;function Ke(e){try{return typeof e==`function`?e():document.querySelector(e)}catch{}}function qe(e){let t=new Set;for(let n of e){if(n===Ge)continue;let e=Ke(n);e&&t.add(e)}return t}function Je(e,t){let n=t??e.options.scrollRestoration,r=e._scroll;n&&(r.restoring=!0);let i=e.options.getScrollRestorationKey||He,a=new Set,o=e=>{let t=L[e]||={};for(let e of a)e===document?t[Ge]={scrollX,scrollY}:e.isConnected&&(t[Ue(e)]={scrollX:e.scrollLeft,scrollY:e.scrollTop})};n&&!r.restoration&&(r.restoration=!0,We=!1,history.scrollRestoration=`manual`,document.addEventListener(`scroll`,e=>{We||a.add(e.target)},!0),e.subscribe(`onBeforeLoad`,e=>{e.fromLocation&&o(i(e.fromLocation)),a.clear()}),addEventListener(`pagehide`,()=>{o(i(e.stores.resolvedLocation.get()??e.stores.location.get())),Be()})),!r.reset&&(r.reset=!0,e.subscribe(`onRendered`,t=>{let n=e.options.scrollRestorationBehavior,o=e.options.scrollToTopSelectors,s=r.next,c=r.hash,l;if(a.clear(),r.next=!0,r.hash=!1,typeof e.options.scrollRestoration==`function`&&!e.options.scrollRestoration({location:e.latestLocation}))return;let u=i(t.toLocation),d=t.fromLocation&&i(t.fromLocation);if(r.restoring&&d&&d!==u){let e=L[d];if(e){let t=L[u];for(let n in e){if(n===Ge){if(s)continue}else{let e=Ke(n);if(!e||s&&o&&(l??=qe(o),l.has(e)))continue}t||=L[u]={},t[n]??=e[n]}}}We=!0;try{let e=t.toLocation.hash,i=t.toLocation.state.__hashScrollIntoViewOptions??!0,a=!1;if(s){!e&&o&&(l??=qe(o));let t=e&&i&&c,s=r.restoring?L[u]:void 0;if(s)for(let e in s){let{scrollX:r,scrollY:i}=s[e];if(e===Ge){if(t)continue;scrollTo({top:i,left:r,behavior:n}),a=!0}else{let t=Ke(e);t&&(t.scrollLeft=r,t.scrollTop=i,l?.delete(t))}}if(!e){let e={top:0,left:0,behavior:n};if(a||scrollTo(e),l)for(let t of l)t.scrollTo(e)}}!a&&e&&i&&document.getElementById(e)?.scrollIntoView(i)}finally{We=!1}}))}function Ye(e,t=String){let n;for(let r in e){let i=e[r];i!==void 0&&(n||=new URLSearchParams).set(r,t(i))}return n?n.toString():``}function Xe(e){return e?e===`false`?!1:e===`true`?!0:e*0==0&&+e+``===e?+e:e:``}function Ze(e){let t=new URLSearchParams(e),n=Object.create(null);for(let[e,r]of t.entries()){let t=n[e];t==null?n[e]=Xe(r):Array.isArray(t)?t.push(Xe(r)):n[e]=[t,Xe(r)]}return n}var Qe=/^(?:\s|["[{\d-]|fa|nu|tr)/,$e=tt(JSON.parse),et=nt(JSON.stringify,JSON.parse);function tt(e){let t=e===JSON.parse;return n=>{n[0]===`?`&&(n=n.substring(1));let r=Ze(n);for(let n in r){let i=r[n];if(typeof i==`string`){if(t&&!Qe.test(i))continue;try{r[n]=e(i)}catch{}}}return r}}function nt(e,t){let n=t===JSON.parse;function r(r){if(r&&typeof r==`object`)try{return e(r)}catch{}else if(t&&typeof r==`string`){if(n&&!Qe.test(r))return r;try{return t(r),e(r)}catch{}}return r}return e=>{let t=Ye(e,r);return t?`?${t}`:``}}function rt(e){return{input:({url:t})=>{for(let n of e)t=at(n,t);return t},output:({url:t})=>{for(let n=e.length-1;n>=0;n--)t=ot(e[n],t);return t}}}function it(e){let t=b(e.basepath),n=`/${t}`,r=e.caseSensitive?n:n.toLowerCase(),i=`${r}/`;return{input:({url:t})=>{let a=e.caseSensitive?t.pathname:t.pathname.toLowerCase();return a===r?t.pathname=`/`:a.startsWith(i)&&(t.pathname=t.pathname.slice(n.length)),t},output:({url:e})=>(e.pathname=ee([`/`,t,e.pathname]),e)}}function at(e,t){let n=e?.input?.({url:t});if(n){if(typeof n==`string`)return new URL(n);if(n instanceof URL)return n}return t}function ot(e,t){let n=e?.output?.({url:t});if(n){if(typeof n==`string`)return new URL(n);if(n instanceof URL)return n}return t}function st(e,t){let{createMutableStore:n,createReadonlyStore:r,batch:i}=t,a=new Map,o=n(`idle`),s=n(e),c=n(void 0),l=n([]),u=r(()=>l.get().map(e=>a.get(e).get())),d=r(()=>({status:o.get(),isLoading:o.get()===`pending`,matches:u.get(),location:s.get(),resolvedLocation:c.get()}));function f(e){let t=a.get(e);return t||(t=n(void 0),a.set(e,t)),t}let p={status:o,location:s,resolvedLocation:c,ids:l,matches:u,byRoute:a,__store:d,getMatchStore:f,setMatches:m};function m(e){let t=l.get(),n=e.map(e=>e.routeId);i(()=>{ne(t,n)||l.set(n);for(let e of t)n.includes(e)||a.get(e).set(()=>void 0);for(let t of e){let e=f(t.routeId);e.get()!==t&&e.set(t)}})}return p}var R=`__TSR_index`,ct=`popstate`,lt=`beforeunload`,ut=/^[\x00-\x20]*(?:[\\/][\t\n\r]*){2,}/;function dt(e){let t=ut.exec(e);return t?`/`+e.slice(t[0].length):e}function ft(e){return/[\x00-\x1f\x7f]/.test(e)&&(e=e.replace(/[\x00-\x1f\x7f]/g,e=>`
3
3
  \r`.includes(e)?``:encodeURIComponent(e))),dt(e)}function pt(e){let t=e.getLocation(),n=new Set,r=r=>{t=e.getLocation(),n.forEach(e=>e({location:t,action:r}))},i=n=>{e.notifyOnIndexChange??!0?r(n):t=e.getLocation()},a=async({task:n,navigateOpts:r,...i})=>{if(r?.ignoreBlocker??!1){n();return}let a=e.getBlockers?.()??[],o=i.type===`PUSH`||i.type===`REPLACE`;if(typeof document<`u`&&a.length&&o)for(let n of a){let r=gt(i.path,i.state);if(await n.blockerFn({currentLocation:t,nextLocation:r,action:i.type})){e.onBlocked?.();return}}n()};return{get location(){return t},get length(){return e.getLength()},subscribers:n,subscribe:e=>(n.add(e),()=>{n.delete(e)}),push:(n,i,o)=>{let s=t.state[R];i=mt(s+1,i),a({task:()=>{e.pushState(n,i),r({type:`PUSH`})},navigateOpts:o,type:`PUSH`,path:n,state:i})},replace:(n,i,o)=>{let s=t.state[R];i=mt(s,i),a({task:()=>{e.replaceState(n,i),r({type:`REPLACE`})},navigateOpts:o,type:`REPLACE`,path:n,state:i})},go:(t,n)=>{a({task:()=>{e.go(t,n?.ignoreBlocker??!1),i({type:`GO`,index:t})},navigateOpts:n,type:`GO`})},back:t=>{a({task:()=>{e.back(t?.ignoreBlocker??!1),i({type:`BACK`})},navigateOpts:t,type:`BACK`})},forward:t=>{a({task:()=>{e.forward(t?.ignoreBlocker??!1),i({type:`FORWARD`})},navigateOpts:t,type:`FORWARD`})},canGoBack:()=>t.state[R]!==0,createHref:t=>e.createHref(t),block:t=>{if(!e.setBlockers)return()=>{};let n=e.getBlockers?.()??[];return e.setBlockers([...n,t]),()=>{let n=e.getBlockers?.()??[];e.setBlockers?.(n.filter(e=>e!==t))}},flush:()=>e.flush?.(),destroy:()=>e.destroy?.(),notify:r,_getBlockers:()=>e.getBlockers?.()??[]}}function mt(e,t){t||={};let n=_t();return{...t,key:n,__TSR_key:n,[R]:e}}function ht(e){let t=e?.window??(typeof document<`u`?window:void 0),n=t.history.pushState,r=t.history.replaceState,i=[],a=()=>i,o=e=>i=e,s=t=>ft(e?.createHref?e.createHref(t):t),c=e?.parseLocation??(()=>gt(`${t.location.pathname}${t.location.search}${t.location.hash}`,t.history.state));if(!t.history.state?.__TSR_key&&!t.history.state?.key){let e=_t();t.history.replaceState({[R]:0,key:e,__TSR_key:e},``)}let l=c(),u,d=!1,f=!1,p=!1,m=!1,h=()=>l,g,_=()=>{g&&(S._ignoreSubscribers=!0,(g[2]?t.history.pushState:t.history.replaceState)(g[1],``,g[0]),S._ignoreSubscribers=!1,g=void 0,u=void 0)},v=(t,n,r)=>{let i=e?.createHref?s(n):void 0,a=!!g;a||(u=l),l=gt(n,r),g=[i??l.href,r,g?.[2]||t],a||queueMicrotask(()=>_())},y=e=>{l=c(),S.notify({type:e})},b=async()=>{if(m=!1,f){f=!1;return}let e=c(),n=e.state[R]-l.state[R],r=n===1,i=n===-1,o=!r&&!i||d;d=!1;let s=o?`GO`:i?`BACK`:`FORWARD`,u=o?{type:`GO`,index:n}:{type:i?`BACK`:`FORWARD`};if(p)p=!1;else{let r=a();if(typeof document<`u`&&r.length){for(let i of r)if(await i.blockerFn({currentLocation:l,nextLocation:e,action:s})){f=!0,t.history.go(-n),S.notify(u);return}}}l=c(),S.notify(u)},x=e=>{if(m){m=!1;return}let t=!1,n=a();if(typeof document<`u`&&n.length)for(let e of n){let n=e.enableBeforeUnload??!0;if(n===!0){t=!0;break}if(typeof n==`function`&&n()===!0){t=!0;break}}if(t)return e.preventDefault(),e.returnValue=``},S=pt({getLocation:h,getLength:()=>t.history.length,pushState:(e,t)=>v(!0,e,t),replaceState:(e,t)=>v(!1,e,t),back:e=>(e&&(p=!0,m=!0),t.history.back()),forward:e=>{e&&(p=!0,m=!0),t.history.forward()},go:(e,n)=>{d=!0,n&&(p=!0,m=!0),t.history.go(e)},createHref:e=>s(e),flush:_,destroy:()=>{t.history.pushState=n,t.history.replaceState=r,t.removeEventListener(lt,x,{capture:!0}),t.removeEventListener(ct,b)},onBlocked:()=>{u&&l!==u&&(l=u)},getBlockers:a,setBlockers:o,notifyOnIndexChange:!1});return S._ignoreNextBeforeUnload=e=>{m=!1;try{e=new URL(e,t.document.baseURI).href,m=/^https?:/.test(e)&&(!e.includes(`#`)||e.split(`#`)[0]!==t.location.href.split(`#`)[0])}catch{}},t.addEventListener(lt,x,{capture:!0}),t.addEventListener(ct,b),t.history.pushState=function(...e){let r=n.apply(t.history,e);return S._ignoreSubscribers||y(`PUSH`),r},t.history.replaceState=function(...e){let n=r.apply(t.history,e);return S._ignoreSubscribers||y(`REPLACE`),n},S}function gt(e,t){let n=ft(e),r=n.indexOf(`#`),i=n.indexOf(`?`),a=_t();return{href:n,pathname:n.substring(0,r>0?i>0?Math.min(r,i):r:i>0?i:n.length),hash:r>-1?n.substring(r):``,search:i>-1?n.slice(i,r===-1?void 0:r):``,state:t||{[R]:0,key:a,__TSR_key:a}}}function _t(){return(Math.random()+1).toString(36).substring(7)}function vt(e,t){return e.protocol!==`http:`&&e.protocol!==`https:`||e.origin!==t||!!e.username||!!e.password}function yt(e){return e.pathname+e.search+e.hash}function bt(e){return e.options.loader||e.options.beforeLoad||e.lazyFn||e.options.component?.preload||e.options.pendingComponent?.preload}function xt(e,t){return{fromLocation:t,toLocation:e,pathChanged:t?.pathname!==e.pathname,hrefChanged:t?.href!==e.href,hashChanged:t?.hash!==e.hash}}function St({key:e,__TSR_key:t,__TSR_index:n,__hashScrollIntoViewOptions:r,...i}){return i}function Ct(e){return e.findIndex(e=>e.status===`error`||e.status===`notFound`||e._notFound)+1}function wt(e,t,n,r,i,a){r&&(t=t.slice(0,r)),i&&(n=n.slice(0,i));for(let r of t){if(a&&e._tx!==a)return;n.some(e=>e.routeId===r.routeId)||e.routesById[r.routeId].options.onLeave?.(r)}for(let r of n){if(a&&e._tx!==a)return;e.routesById[r.routeId].options[t.some(e=>e.routeId===r.routeId)?`onStay`:`onEnter`]?.(r)}}var Tt=class{constructor(a,s){this.tempLocationKey=`${Math.round(Math.random()*1e7)}`,this._scroll={next:!0},this.subscribers=new Set,this._cache=new Map,this._committed=[],this.routeBranchCache=new WeakMap,this.lightweightCache=new WeakMap,this.startTransition=async e=>(e(),!1),this.update=e=>{let t=this.options,n=this.basepath??t?.basepath??`/`,r=this.basepath===void 0,i=t?.rewrite;if(this.options={...t,...e},this.isServer=this.options.isServer??!1??typeof document>`u`,this.protocolAllowlist=new Set(this.options.protocolAllowlist),this.options.pathParamsAllowedCharacters&&(this.pathParamsDecoder=v(this.options.pathParamsAllowedCharacters)),(!this.history||this.options.history&&this.options.history!==this.history)&&(this.history=this.options.history?this.options.history:ht()),this.origin=this.options.origin,this.origin||=window?.origin&&window.origin!==`null`?window.origin:`http://localhost`,this.history&&this.updateLatestLocation(),this.options.routeTree!==this.routeTree){this.routeTree=this.options.routeTree;let e;this.resolvePathCache=re(1e3),e=this.buildRouteTree(),this.setRoutes(e)}if(!this.stores&&this.latestLocation){let e=this.getStoreConfig(this);this.batch=e.batch,this.stores=st(this.latestLocation,e),Je(this)}let a=this.options.basepath??`/`,o=this.options.rewrite;if(r||n!==a||i!==o){this.basepath=a;let e=[],t=b(a);t&&t!==`/`&&e.push(it({basepath:a})),o&&e.push(o),this.rewrite=e.length===0?void 0:e.length===1?e[0]:rt(e),this.history&&this.updateLatestLocation(),this.stores&&this.stores.location.set(this.latestLocation)}},this.updateLatestLocation=()=>{this.latestLocation=this.parseLocation(this.history.location,this.latestLocation)},this.buildRouteTree=()=>{let e=_(this.routeTree,this.options.caseSensitive,(e,t)=>{e.init({originalIndex:t})});return this.options.routeMasks&&ie(this.options.routeMasks,e.processedTree),e},this.subscribe=(e,t)=>{let n={eventType:e,fn:t};return this.subscribers.add(n),()=>{this.subscribers.delete(n)}},this.emit=e=>{for(let t of this.subscribers)if(t.eventType===e.type)try{t.fn(e)}catch(e){console.error(e)}},this.parseLocation=(e,t)=>{let n=({pathname:e,search:n,hash:r,href:i,state:a})=>{if(!this.rewrite&&!/[ \x00-\x1f\x7f\u0080-\uffff]/.test(e)){let i=this.options.parseSearch(n),s=this.options.stringifySearch(i);return{href:e+s+r,publicHref:e+s+r,pathname:p(e),external:!1,searchStr:s,search:d(t?.search,i),hash:p(r.slice(1)),state:o(t?.state,a)}}let s=new URL(i,this.origin),c=at(this.rewrite,s),l=this.options.parseSearch(c.search),u=this.options.stringifySearch(l);return c.search=u,{href:c.href.replace(c.origin,``),publicHref:i,pathname:p(dt(c.pathname)),external:!!this.rewrite&&vt(c,this.origin),searchStr:u,search:d(t?.search,l),hash:p(c.hash.slice(1)),state:o(t?.state,a)}},r=n(e),{__tempLocation:i,__tempKey:a}=r.state;if(i&&(!a||a===this.tempLocationKey)){let e=n(i);return e.state.key=r.state.key,e.state.__TSR_key=r.state.__TSR_key,delete e.state.__tempLocation,{...e,maskedLocation:r}}return r},this.resolvePathWithBase=(e,t)=>y({base:e,to:t,trailingSlash:this.options.trailingSlash,cache:this.resolvePathCache}),this.matchRoutes=(e,t,n)=>typeof e==`string`?this.matchRoutesInternal({pathname:e,search:t},n):this.matchRoutesInternal(e,t),this.getMatchedRoutes=e=>{let t=Object.create(null),n=h(E(e),this.processedTree,!0);return n&&Object.assign(t,n.rawParams),[n?.branch||[this.routesById.__root__],t,n?.route]},this.buildLocation=t=>{let r=(r={})=>{if(r.href){let e=gt(r.href,{});r={...r,to:at(this.rewrite,new URL(e.pathname,this.origin)).pathname,search:this.options.parseSearch(e.search),hash:e.hash.slice(1)}}let i=r._fromLocation||this._pendingLocation||this.latestLocation,a=this.matchRoutesLightweight(i),s=r.unsafeRelative===`path`?i.pathname:r.from??a[1],c=a[2],l=a[3],f=this.resolvePathWithBase(s,r.to?`${r.to}`:`.`),m=Mt(r.params,l),h=this.routesByPath[E(f)],g;if(h)g=this.getRouteBranch(h);else if(f.includes(`$`))g=[];else{let[e,t,n]=this.getMatchedRoutes(f);g=e,this.options.notFoundRoute&&(!n||n.path!==`/`&&t[`**`])&&(g=[...g,this.options.notFoundRoute])}if(g.length&&e(m))for(let e of g){let t=e.options.params?.stringify??e.options.stringifyParams;if(t){m===l&&(m=Object.assign(Object.create(null),m));try{Object.assign(m,t(m))}catch{}}}let _=t.leaveParams?f:p(dt(T({path:f,params:m,decoder:this.pathParamsDecoder,server:this.isServer}).interpolatedPath)),v=c;if(t._includeValidateSearch&&this.options.search?.strict){let e={};g.forEach(t=>{if(t.options.validateSearch)try{Object.assign(e,kt(t.options.validateSearch,{...e,...v}))}catch{}}),v=e}v=At(v,r,g,t._includeValidateSearch),v=d(c,v);let y=this.options.stringifySearch(v),b=r.hash===!0?i.hash:r.hash?u(r.hash,i.hash):void 0,x=b?`#${b}`:``,S=r.state===!0?i.state:r.state?u(r.state,i.state):{};r.state&&(S=o(i.state,S));let C=`${_}${y}${x}`,w,D,ee=!1;if(this.rewrite){let e=new URL(C,this.origin),t=e.origin,n=ot(this.rewrite,e);w=yt(e),vt(n,t)?(D=n.href,ee=!0):D=dt(yt(n))}else w=n(C),D=w;return{publicHref:D,href:w,pathname:_,search:v,searchStr:y,state:S,hash:b??``,external:ee,unmaskOnReload:r.unmaskOnReload}},i=r(t);if(t.mask)i.maskedLocation=r({from:t.from,...t.mask});else if(this.options.routeMasks){let e=x(i.pathname,this.processedTree);if(e){let n=Object.assign(Object.create(null),e.rawParams),{from:a,params:o,...s}=e.route,c=Mt(o,n);i.maskedLocation=r({from:t.from,...s,params:c})}}return i},this.commitLocation=async({viewTransition:e,ignoreBlocker:t,...n})=>{let i=n.maskedLocation??n;if(i.external)return Et(this,i.publicHref,{replace:n.replace,ignoreBlocker:t});let a,o=E(this.latestLocation.href)===E(n.href)&&r(St(n.state),St(this.latestLocation.state)),s=this._commitPromise,c,l=new Promise(e=>{c=e});if(l.resolve=()=>{c(),s?.resolve()},this._commitPromise=l,o)this.load();else{let{maskedLocation:r,hashScrollIntoView:i,...o}=n;r&&(o={...r,state:{...r.state,__tempKey:void 0,__tempLocation:{...o,search:o.searchStr,state:{...o.state,__tempKey:void 0,__tempLocation:void 0,__TSR_key:void 0,key:void 0}}}},(o.unmaskOnReload??this.options.unmaskOnReload??!1)&&(o.state.__tempKey=this.tempLocationKey)),o.state.__hashScrollIntoViewOptions=i??this.options.defaultHashScrollIntoView??!0,this.shouldViewTransition=e,a=n.replace?`REPLACE`:`PUSH`,this.history[a===`REPLACE`?`replace`:`push`](o.publicHref,o.state,{ignoreBlocker:t}),this.history.subscribers.size||this.load({action:{type:a}})}return this._scroll.next=n.resetScroll??!0,this._commitPromise},this.buildAndCommitLocation=({replace:e,resetScroll:t,hashScrollIntoView:n,viewTransition:r,ignoreBlocker:i,...a}={})=>{let o=this.buildLocation({...a,_includeValidateSearch:!0});this._pendingLocation=o;let s=this.commitLocation({...o,viewTransition:r,replace:e,resetScroll:t,hashScrollIntoView:n,ignoreBlocker:i});return queueMicrotask(()=>{this._pendingLocation===o&&(this._pendingLocation=void 0)}),s},this.navigate=async({to:e,reloadDocument:t,href:n,publicHref:r,...i})=>{let a=n?w(n):void 0;if(a||t){if(e!==void 0||!n){let t=this.buildLocation({to:e,...i}),a=t.maskedLocation??t;n??=a.publicHref,r??=a.publicHref}let t=!a&&r?r:n;return Et(this,t,i)}return this.buildAndCommitLocation({...i,href:n,to:e,_isNavigate:!0})},this.load=async e=>{this.updateLatestLocation(),e?.action&&(this._scroll.hash=e.action.type===`PUSH`||e.action.type===`REPLACE`),await pn(this,e)},this.startViewTransition=e=>{let t=this.shouldViewTransition??this.options.defaultViewTransition;if(this.shouldViewTransition=void 0,t&&typeof document.startViewTransition==`function`){let n;if(typeof t==`object`&&window.CSS?.supports?.(`selector(:active-view-transition-type(a))`)){let r=this.latestLocation,i=this.stores.resolvedLocation.get(),a=typeof t.types==`function`?t.types(xt(r,i)):t.types;if(a===!1)return e();n={update:e,types:a}}else n=e;return document.startViewTransition(n).updateCallbackDone}return e()},this.invalidate=e=>{let t=this._committed,n=e?.filter,r=this._preloads,i=new Set([...t,...this._cache.values(),...[...r?.values()??[]].flat(),...this._tx?.[3]??[]].filter(e=>!n||n(e)).map(e=>e.id)),a=[];for(let[e,t]of r??[])t.some(e=>i.has(e.id))&&(r.delete(e),a.push(e));let o=t=>{if(i.has(t.id)){let n=this.routesById[t.routeId],r={...t,invalid:!0,...(e?.forcePending||t.status===`error`||t.status===`notFound`)&&bt(n)?{status:`pending`,error:void 0}:void 0};return t._flight=void 0,r}return t};this._committed=t.map(o);for(let[t,n]of this._cache)i.has(t)&&(n.invalid=!0,e?.forcePending&&(n.status=`pending`));for(let e of i)this._flights?.delete(e);for(let e of a)e.abort();return this.shouldViewTransition=!1,this.load({sync:e?.sync})},this.resolveRedirect=e=>{let t=e.options,n=e.headers.get(`Location`)||t.href;if(!n){let e=this.buildLocation(t);n=(e.maskedLocation??e).publicHref||`/`}let r;if(i.test(n)||(r=w(n))&&!this.protocolAllowlist.has(r))throw Error(`Redirect blocked: unsafe protocol`);if(r===`http:`||r===`https:`){let e=new URL(n);e.pathname.startsWith(`//`)?n=e.href:vt(e,this.origin)||(n=yt(e),r=void 0)}return r&&(t.reloadDocument=!0),t.href=n,e.headers.set(`Location`,n),e},this.clearCache=e=>{let t=this._cache,n=this._preloads,r=e?.filter,i=[],a=[];for(let[e,n]of t)(!r||r(n))&&(a.push(e),i.push(n));let o=[];for(let[e,t]of n??[])(!r||t.some(r))&&(o.push(e),i.push(...t));for(let e of a)t.delete(e);for(let e of o)n.delete(e);for(let e of i){let t=e._flight;e._flight=void 0,t&&!--t[2]&&(this._flights?.get(e.id)===t&&this._flights.delete(e.id),o.push(t[1]))}for(let e of o)e.abort()},this.loadRouteChunk=z,this.preloadRoute=e=>mn(this,e),this.matchRoute=(e,t)=>{let n={...e,to:e.to?this.resolvePathWithBase(e.from||``,e.to):void 0,params:e.params||{},leaveParams:!0},i=this.buildLocation(n),a=this.stores.status.get()===`pending`;if(t?.pending&&!a)return!1;let o=t?.pending??!a?this.latestLocation:this.stores.resolvedLocation.get()||this.stores.location.get(),s=te(i.pathname,t?.caseSensitive??!1,t?.fuzzy??!1,o.pathname,this.processedTree);return!s||e.params&&!r(s.rawParams,e.params,{partial:!0})?!1:t?.includeSearch??!0?r(o.search,i.search,{partial:!0})?s.rawParams:!1:s.rawParams},this.getStoreConfig=s,this.update({defaultPreloadDelay:50,defaultPendingMs:1e3,defaultPendingMinMs:500,context:void 0,...a,caseSensitive:a.caseSensitive??!1,notFoundMode:a.notFoundMode??`fuzzy`,stringifySearch:a.stringifySearch??et,parseSearch:a.parseSearch??$e,protocolAllowlist:a.protocolAllowlist??t}),self.__TSR_ROUTER__=this}isShell(){return!!this.options.isShell}get state(){return this.stores.__store.get()}setRoutes({routesById:e,routesByPath:t,processedTree:n}){this.routesById=e,this.routesByPath=t,this.processedTree=n;let r=this.options.notFoundRoute;r&&(r.init({originalIndex:99999999999}),this.routesById[r.id]=r)}getRouteBranch(e){let t=this.routeBranchCache.get(e);return t||(t=S(e),this.routeBranchCache.set(e,t)),t}matchRoutesInternal(e,t){let[n,r,i]=this.getMatchedRoutes(e.pathname),a=n,s=!1;(i?i.path!==`/`&&r[`**`]:E(e.pathname))&&(this.options.notFoundRoute?a=[...a,this.options.notFoundRoute]:s=!0);let c=s?jt(this.options.notFoundMode,a):void 0,l=Array(a.length),u=this._committed,f=(e,t)=>{let n=u[t];return n?.routeId===e.id?n:e===this.options.notFoundRoute?u.find(t=>t.routeId===e.id):void 0},p;for(let n=0;n<a.length;n++){let i=a[n],s=l[n-1],u,m,h;{let n=s?.search??e.search,r=s?._strictSearch??void 0;try{let e=kt(i.options.validateSearch,{...n})??void 0;u={...n,...e},m={...r,...e}}catch(e){let r=e;if(e instanceof Dt||(r=new Dt(e.message,{cause:e})),t?.throwOnError)throw r;u=n,m={},h=r}}let g=``,_=``;try{g=i.options.loaderDeps?.({search:u})??``,_=g&&JSON.stringify(g)||``}catch(e){if(t?.throwOnError)throw e;h??=e}let{interpolatedPath:v,usedParams:y}=T({path:i.fullPath,params:r,decoder:this.pathParamsDecoder,server:this.isServer}),b=i.id+v+_,x=f(i,n),S=this._cache.get(b)??(x?.id===b?x:void 0);p=S?._strictParams??Object.assign(y,p);let C;if(!S)try{Nt(i,p)}catch(e){if(C=I(e)||ce(e)?e:new Ot(e.message,{cause:e}),t?.throwOnError)throw C}let w=x?`stay`:`enter`,E;if(S)E={...S,cause:w,search:d(x?x.search:S.search,u),_strictSearch:m,searchError:h};else{let e=bt(i)?`pending`:`success`;E={id:b,ssr:i.options.ssr,index:n,routeId:i.id,params:x?.params??p,_strictParams:p,pathname:v,updatedAt:Date.now(),search:x?d(x.search,u):u,_strictSearch:m,searchError:h,status:e,isFetching:!1,error:void 0,paramsError:C,context:{},abortController:t?._controller??new AbortController,cause:w,loaderDeps:x?o(x.loaderDeps,g):g,invalid:!1,preload:!1,staticData:i.options.staticData||{},fullPath:i.fullPath}}let D=c===i.id;E._notFound&&!D&&(E.error=void 0),E._notFound=D,l[n]=E}for(let e=0;e<l.length;e++){let n=l[e];n.params=n.cause===`stay`?d(n.params,p):p,t?._controller&&(n.context={})}return l}matchRoutesLightweight(e){let t=l(this.stores.ids.get()),n=t?this.stores.byRoute.get(t).get():void 0,r=n?.id,i=this.lightweightCache.get(e);if(i&&i[0]===r)return i[1];let[a,o]=this.getMatchedRoutes(e.pathname),s=l(a),c={...e.search};for(let e of a)try{Object.assign(c,kt(e.options.validateSearch,c))}catch{}let u=n&&n.routeId===s.id&&n.pathname===e.pathname,d;if(u)d=n.params;else{let e=Object.assign(Object.create(null),o);for(let t of a)try{Nt(t,e)}catch{}d=e}let f=[a,s.fullPath,c,d];return this.lightweightCache.set(e,[r,f]),f}};async function Et(e,t,{replace:n,ignoreBlocker:r}){if(!C(t,e.protocolAllowlist)){if(!r){let t=e.history._getBlockers();for(let r of t)if(r?.blockerFn&&await r.blockerFn({currentLocation:e.history.location,nextLocation:e.history.location,action:n?`REPLACE`:`PUSH`}))return}e.history._ignoreNextBeforeUnload?.(t),n?window.location.replace(t):window.location.href=t}}var Dt=class extends Error{},Ot=class extends Error{};function kt(e,t){if(e==null)return{};if(`~standard`in e){let n=e[`~standard`].validate(t);if(n instanceof Promise)throw new Dt(`Async validation not supported`);if(n.issues)throw new Dt(JSON.stringify(n.issues,void 0,2),{cause:n});return n.value}return`parse`in e?e.parse(t):typeof e==`function`?e(t):{}}function At(e,t,n,r){let i=[];for(let e of n){let t=e.options;`search`in t?t.search?.middlewares&&i.push(...t.search.middlewares):(t.preSearchFilters||t.postSearchFilters)&&i.push(({search:e,next:n})=>{let r=n(t.preSearchFilters?t.preSearchFilters.reduce((e,t)=>t(e),e):e);return t.postSearchFilters?t.postSearchFilters.reduce((e,t)=>t(e),r):r});let n=t.validateSearch;r&&n&&i.push(({search:e,next:t,meta:r})=>{let i=t(e);try{let e=kt(n,i);if(r&&e)for(let t in e)t in i||(r.defaulted||=new Map).set(t,e[t]);return{...i,...e}}catch{}return i})}let a=(e,n,r)=>{if(e>=i.length){if(!t.search)return{};if(t.search===!0)return n;let e=u(t.search,n);return r&&(r.explicit=e),e}return i[e]({search:n,next:(t,n)=>{if(n){let n=r||{};return{search:a(e+1,t,n),meta:n}}return a(e+1,t,r)},meta:r})};return a(0,e)}function jt(e,t){if(e!==`root`){let e;for(let n=t.length-1;n>=0;n--){let r=t[n];if(r.options.notFoundComponent)return r.id;e||=r.children&&r.id}if(e)return e}return oe}function Mt(e,t){if(e===!1||e===null)return Object.create(null);if((e??!0)===!0)return t;let n=Object.assign(Object.create(null),t);return Object.assign(n,u(e,n))}function Nt(e,t){let n=e.options.params?.parse??e.options.parseParams;n&&Object.assign(t,n(t))}function Pt(e,t){return e.options[t]?.preload?.()}function Ft(e,t){let n=Pt(e,`component`),r=Pt(e,`pendingComponent`);return t&&(r?r=r.then(t):t()),n&&r?Promise.all([n,r]).then(()=>{}):n??r}function z(e,t,n){let r=()=>t===!1?void 0:t?Pt(e,t):Ft(e,n),i=e._lazy;if(i)return i===!0?r():i.then(r);if(!e.lazyFn)return r();let a=e.lazyFn().then(t=>{{let{id:n,...r}=t.options;Object.assign(e.options,r),e._lazy=!0}},t=>{throw e._lazy=void 0,t});return e._lazy=a,a.then(r)}function It(e){let t=e.findIndex(e=>e.status!==`success`||e._notFound)+1;return t&&t<e.length?e.slice(0,t):e}var B=0,V=1,Lt=2,H=3,U=[4];function W(e){return typeof e[0]==`number`}function G(e,t){return t.aborted?Promise.race([Promise.reject(t),e]):new Promise((n,r)=>{let i=()=>r(t);t.addEventListener(`abort`,i,{once:!0}),Promise.resolve(e).then(n,r).then(()=>t.removeEventListener(`abort`,i))})}function K(e,t){return e.routesById[t.routeId]}function Rt(e,t,n){return ce(e)?[H,e]:I(e)?(e.routeId||=n,[Lt,e]):t?(typeof e?.then==`function`&&(e=Error(`A Promise was thrown`,{cause:e})),[V,e]):[B,e]}function zt(e,t){let n=Rt(t,!0,e.id);if(n[0]!==V)return n;try{e.options.onError?.(n[1])}catch(t){n=Rt(t,!0,e.id)}return n}function Bt(e,t,n,r,i){return i[0].signal.aborted?U:$t(e,t,n,zt(n,r),i)}async function Vt(e,t,n,r,i,a){let[o,s]=t,c=n[0].signal,l=!!n[3];for(let i=n[6]??0;i<r;i++){let r=s[i],u=K(e,r);r.abortController=n[0];let d=s[i-1]?.context??e.options.context??{},f={params:r.params,location:o,navigate:t=>e.navigate({...t,_fromLocation:o}),buildLocation:e.buildLocation,cause:l?`preload`:r.cause,abortController:n[0],preload:l,matches:s,routeId:u.id};try{let e=r._ctx||=u.options.context?u.options.context({...f,deps:r.loaderDeps,context:d})||{}:void 0;r.context={...d,...e}}catch(a){return q(e,r),[i,Bt(e,t,u,a,n)]}if(c.aborted)return[i,U];let p=r.paramsError??r.searchError;if(p!==void 0)return q(e,r),[i,Bt(e,t,u,p,n)];let m=u.options.beforeLoad;if(!m)continue;let h=r.status;i>=a&&(r.status=`pending`,n[7]?.());try{Wt(e,r,`beforeLoad`,n[0]);let a=m({...f,search:r.search,context:r.context,...e.options.additionalContext}),o=await(typeof a?.then==`function`?G(a,c):a);if(c.aborted)return[i,U];let s=$t(e,t,u,Rt(o,!1,u.id),n);if(s[0]!==B)return q(e,r),[i,s];r.context={...r.context,...o}}catch(a){return q(e,r),[i,Bt(e,t,u,a,n)]}finally{r.status=h,Wt(e,r,!1,n[0])}}i()}function Ht(e,t,n){if(!(!n||--n[2])){if(e._flights?.get(t.id)===n){let n=e._tx;if(n&&!n[0].signal.aborted&&!n[3].includes(t)&&n[3].some(e=>e.id===t.id)&&n[3].some(e=>e.isFetching===`beforeLoad`))return;e._flights.delete(t.id)}return n[1]}}function q(e,t){let n=t._flight;t._flight=void 0,Ht(e,t,n)?.abort()}function J(e,t,n,r){let i=[];for(let a of t)if(!n?.includes(a)){let t=a._flight;if(a._flight=void 0,r&&t?.[2]===1&&e._flights?.get(a.id)===t&&n?.some(e=>e.id===a.id))t[2]=0;else{let n=Ht(e,a,t);n&&i.push(n)}}for(let e of i)e.abort()}function Ut(e){for(let t of e){let e=t._flight;e&&e[2]++}}function Wt(e,t,n,r){if(t.isFetching=n,r&&e._tx?.[0]!==r)return;let i=e.stores.byRoute.get(t.routeId),a=i?.get();a?.id===t.id&&i.set({...a,isFetching:n})}function Gt(e,t,n,r,i,a,o){let s=t[0];return{params:n.params,location:s,navigate:t=>e.navigate({...t,_fromLocation:s}),cause:o?`preload`:n.cause,abortController:i,preload:o,deps:n.loaderDeps,parentMatchPromise:a,context:n.context,route:r,...e.options.additionalContext}}async function Kt(e,t,n,r,i,a,o){let s=o[0],c=s.signal;if(c.aborted)return U;if(!i)return[B,void 0];let l=n._flight;Wt(e,n,`loader`,s);try{if(!l){let s=new AbortController;l=[Promise.resolve().then(()=>i(Gt(e,t,n,r,s,a,!!o[3]))).then(e=>Rt(e,!1,r.id),e=>Rt(e,!0,r.id)).then(t=>(t[0]!==B&&e._flights?.get(n.id)===l&&(e._flights.delete(n.id),l[2]||s.abort()),t[0]===V&&l[2]?zt(r,t[1]):t)),s,1],(e._flights??=new Map).set(n.id,l)}return n._flight=l,n.abortController=l[1],$t(e,t,r,await G(l[0],c),o)}catch(t){if(t!==c||!c.aborted)throw t;return q(e,n),U}finally{Wt(e,n,!1,s)}}function qt(e,t,n){t[0]!==H&&(e.status=`success`,e.error=void 0,t[0]===B?(e.loaderData=t[1],e.invalid=!1,e.updatedAt=Date.now(),e.preload=n):e.invalid=!0)}function Jt(e,t,n){let r=e._cache.get(t.id);if(r!==n||e._committed.some(e=>e.id===t.id&&e._flight===t._flight))return;let i={...t,_notFound:void 0,context:{}};i._flight&&i._flight[2]++,e._cache.set(t.id,i),r&&q(e,r)}function Yt(e,t){return t[0]===V||t[0]===Lt?{...e,status:t[0]===V?`error`:`notFound`,error:t[1],_flight:void 0}:e}function Xt(e,t,n,r,i,a,o){let s=t[1][n],c=K(e,s),l=!!a[3],u=e._cache.get(s.id),d,f=!1,p;try{if(s.status===`success`&&(d=c.options.shouldReload,typeof d==`function`&&(d=d(Gt(e,t,s,c,a[0],i,l))),a[0].signal.aborted&&(p=U)),!p){if(s.status!==`success`)f=!0;else{let t=l||s.preload?c.options.preloadStaleTime??e.options.defaultPreloadStaleTime??3e4:c.options.staleTime??e.options.defaultStaleTime??0;f=!!(s.invalid||d||d===void 0&&Date.now()-s.updatedAt>=t&&(a[5]||s.cause===`enter`||a[2].some(e=>e.routeId===s.routeId&&e.id!==s.id)))}}}catch(n){s.invalid=!0,q(e,s),p=Bt(e,t,c,n,a)}let m=c.options.loader,h=typeof m==`function`,g=h?m:m?.handler,_=!l||c.options.preload!==!1,v=_&&m?e._flights?.get(s.id):void 0;v===s._flight||p?v=void 0:v&&!f&&!l&&d===void 0?f=!0:f||(v=void 0);let y=!(!m||!f||s.status!==`success`||l||a[4]||((h?void 0:m.staleReloadMode)??e.options.defaultStaleReloadMode)===`blocking`),b=f&&_,x=b&&!y&&(s.status!==`success`||!!m),S=n>=o?a[7]:void 0,C=c.lazyFn&&c._lazy!==!0?S:void 0;if(b&&!m&&(s.invalid=!1,s.updatedAt=Date.now()),v&&v[2]++,x){let t=s._flight;s._flight=v,Ht(e,s,t)?.abort(),n>=o&&(s.status=`pending`),S?.()}b||(s.isFetching=!1);let w=!p&&x?Kt(e,t,s,c,g,i,a).then(t=>(qt(s,t,l),t[0]===B&&(m&&!a[0].signal.aborted&&Jt(e,s,u),n>=o&&(s.status=`pending`)),t)):Promise.resolve(p??[B,s.loaderData]),T=(async()=>{try{let e=z(c,void 0,C);e&&await G(e,a[0].signal)}catch(r){if(!t[1].some((e,t)=>t<=n&&(e.status===`error`||e.status===`notFound`||e._notFound)))return[n,Bt(e,t,c,r,a)]}let r=await w;x&&r[0]===B&&s.status===`pending`&&!a[0].signal.aborted&&(s.status=`success`,S?.())})();if(r.push([n,w,T]),!y)return w.then(e=>Yt(s,e));let E={...s,status:`pending`,preload:!1,_flight:v};s.invalid=!1,s.isFetching=`loader`;let D=Kt(e,t,E,c,g,i,a).then(e=>(s.isFetching=!1,qt(E,e,!1),e));return(t[2]??=[]).push([n,D,T,E]),D.then(e=>Yt(E,e))}async function Zt(e,t,n,r,i=0){let a=n?.[1][1],o=a?.routeId?t.findIndex(e=>e.routeId===a.routeId):n?.[0]??t.length-1;o<0&&(o=0);for(let n=o;n>=0;n--){let i=K(e,t[n]);try{let e=z(i,!1);e&&await G(e,r)}catch(e){if(e===r&&r.aborted)throw e}if(i.options.notFoundComponent)return n}return a?.routeId?o:i}function Y(e,t){t[2]&&=(J(e,t[2].map(e=>e[3])),void 0)}async function Qt(e,t,n,r){let i;try{await Promise.all(e.map(e=>e[1].then(async t=>{let a=e[0];if(!(r&&a>=await r)){if(t[0]>=H)throw[a,t];!i&&t[0]!==B&&(i=[a,t],await Promise.all((n??[]).map(e=>{if(!(e[0]<=a))return e[1].then(t=>{if(t[0]===H)throw[e[0],t]})})))}})))}catch(e){return e}return t??i}function $t(e,t,n,r,i,a){for(;r[0]===H;){let o=r[1],s=o.options;try{if((s.href||o.headers.has(`Location`))&&(e.resolveRedirect(o),s.reloadDocument)||(s.reloadDocument?i[3]:i[1]>=20))return r;let n=e.buildLocation({...s,_fromLocation:t[0],_includeValidateSearch:!0}),a=n.maskedLocation??n;if(a.external){let t=o.clone();return t.options={...s},t.headers.set(`Location`,a.publicHref),e.resolveRedirect(t),i[3]?[H,t]:[H,t,a]}return[H,o,n]}catch(e){r=a?[V,e]:zt(n,e),a=!0}}return r}async function en(e,t,n,r,i,a){let o=t[1],s=await i,c=!1,l=o.findIndex(e=>e._notFound),u=t=>t[1][0]===Lt?Zt(e,o,t,r.signal):t[0],d=l<0?o.length:l;if((s?.[1][0]??0)>=H)d=0;else if(s){d=s[2]??=await u(s);for(let e of n){if(e[0]>=d)break;let t=await e[1];if(t[0]!==B&&t[0]<H&&!(`loaderData`in o[e[0]])){s=[e[0],t],d=s[2]=await u(s);break}}}for(let e of n){if(e[0]>=d)break;let t=await e[2];if(t){s=t;break}}if((s?.[1][0]??0)>=H){let n=s[1];if(n[0]!==H||n[1].options.reloadDocument||n[2])return Y(e,t),n;c=!0,s=[0,[V,Error(`Too many redirects`)]]}let f=s?s[2]??await u(s):l;if(f>=0){let i=s?.[1],l=i?.[0],u=o[f],d=i?.[1],p=()=>{i&&(u._notFound=void 0,l===V?u.status=`error`:(d.routeId=u.routeId,u.routeId===e.routeTree.id?(u.status=`success`,u._notFound=!0):u.status=`notFound`),u.error=d,u.isFetching=!1)};p(),i||a?.();let m=K(e,u);try{await G(i?Promise.resolve().then(()=>z(m,l===V?`errorComponent`:`notFoundComponent`)):Promise.all([z(m),z(m,`notFoundComponent`)]),r.signal)}catch(n){if(n===r.signal&&r.signal.aborted)return Y(e,t),U}i?c&&(r.abort(),await Promise.all([...n.map(e=>e[1]),...n.map(e=>e[2]),...(t[2]??[]).map(e=>e[1])]),Y(e,t),J(e,o),p()):u.status=`success`}return t}async function tn(e,t,n,r=0,i=t[1].length){let a=t[1];for(let t=r;t<i;t++){let r=a[t],i=K(e,r).options;if(i.head||i.scripts)try{let t={ssr:e.options.ssr,matches:a,match:r,params:r.params,loaderData:r.loaderData},[o,s]=await G(Promise.all([i.head?.(t),i.scripts?.(t)]),n);r.meta=o?.meta,r.links=o?.links,r.headScripts=o?.scripts,r.styles=o?.styles,r.scripts=s}catch(e){if(e===n&&n.aborted)break;console.error(e)}if(r.status!==`success`||r._notFound)break}return t}async function nn(e,t,n,r){let i=[t,n],a=r[0].signal,o;try{let t=e.stores.matches.get(),s=n.findIndex(e=>e._notFound);if(e.options.notFoundMode!==`root`&&s>=0){let t=await Zt(e,n,void 0,a,s);n[s]._notFound=void 0,n[t]._notFound=!0,s=t}let c=s<0?n.length:s+1,l=0;for(;l<c&&l!==s;){let e=n[l],i=r[2][l],a=t[l];if(i?.id!==e.id||i.status!==`success`||e.preload||a?.id!==e.id||a.status!==`success`||(l++,i._notFound||a._notFound))break}let u=[],d=r[6]??0,f=d?Promise.resolve(n[d-1]):void 0,p=()=>{for(let t=d;t<c&&!a.aborted;t++)f=Xt(e,i,t,u,f,r,l)},m=await Vt(e,i,r,c,p,l);if(m){if(r[4]=!0,c=m[0],m[1][0]===Lt){let t=await Zt(e,n,m,a);m[2]=t,c=Math.min(c,t+1)}else m[1][0]>=H&&(c=0);p()}if(!a.aborted&&!r[3]){let t=[];for(let[n,r]of e._flights??[])r[2]||(e._flights.delete(n),t.push(r[1]));for(let e of t)e.abort()}let h=en(e,i,u,r[0],Qt(u,m,i[2]),r[7]);i[2]?.length&&(i[3]=Qt(i[2],void 0,void 0,h.then(e=>W(e)?0:It(n).length,()=>0))),o=await h}catch(t){if(Y(e,i),t===a&&a.aborted)return U;throw t}return W(o)?o:tn(e,o,a,r[6]===n.length?r[6]:0)}function rn(e,t){if(e._tx!==t)return;let n=t[3],r=e.stores.matches.get(),i=e._pending;for(let a=0;a<n.length;a++){let o=n[a],s=o.status===`success`&&!o._notFound,c=r[a]?.id===o.id&&r[a]?.status===`pending`;if(s&&!c)continue;let l=K(e,o),u=s||o.invalid?0:l.options.pendingMs??e.options.defaultPendingMs,d=l.options.pendingComponent??e.options.defaultPendingComponent;if(!d||typeof u!=`number`||u===1/0){i&&(i[0]=t,i[2]=0,i[4]=!0);return}let f=l.options.pendingMinMs??e.options.defaultPendingMinMs??0,p=!1;if(i?.[1]===o.id?(p=i[0]!==t,i[0]=t):(clearTimeout(i?.[3]),e._pending=i=void 0),i||(e._pending=i=[t,o.id,c?Date.now()+f:t[4]+u,void 0,c||void 0,d]),i[4]&&!p&&i[5]===d)return;if(i[5]=d,!i[4]){clearTimeout(i[3]);let n=i[2]-Date.now();if(n>0){i[3]=setTimeout(()=>rn(e,t),n);return}i[2]=0}let m=n.map(e=>({...e,_flight:void 0}));m[a].status=`pending`;let h=i[4]=e.startTransition(()=>e.stores.setMatches(m),m).then(t=>(t&&e._pending===i&&i[4]===h&&!i[2]&&(i[2]=Date.now()+f),t));return}}function an(e,t){let n=e._pending;(e._tx===t||!e._tx?.[3].some(e=>e.id===n?.[1]))&&(clearTimeout(n?.[3]),e._pending=void 0)}async function on(e,t){let n=e._pending;if(!n)return;clearTimeout(n[3]);let r=n[2]-Date.now();if(!n[4]||r<=0||!It(t[3]).some(e=>e.id===n[1]))return;let i;try{await G(new Promise(e=>{i=setTimeout(e,r)}),t[0].signal)}catch{}clearTimeout(i)}function sn(e,t){e._committed=t,e.stores.setMatches(t)}function cn(e,t,n,r){let i=e._committed,a=e._lifecycleEnd,o=e._cache;for(let e of n)e.preload=!1,r&&(e._assetEnd=void 0);let s=It(n).length,c=new Map;{let t=Date.now(),r=new Set;for(let e=0;e<n.length;e++){let t=n[e];(e<s||t.status===`success`)&&r.add(t.id)}for(let n of[...i,...o.values()]){if(n.status!==`success`||r.has(n.id))continue;let i=K(e,n);!i.options.loader||t-n.updatedAt>=(n.preload?i.options.preloadGcTime??e.options.defaultPreloadGcTime??3e5:i.options.gcTime??e.options.defaultGcTime??3e5)||c.set(n.id,o.get(n.id)===n?n:{...n,_flight:void 0,isFetching:!1,context:{}})}}t[3]=[],e._cache=c;let l=e._lifecycleEnd=Ct(n);sn(e,n),J(e,[...o.values(),...i].filter(e=>e._flight&&c.get(e.id)!==e),n),wt(e,i,n,a,l,t)}async function ln(e,t){let n=e._tx;for(;n&&n!==t;)t=n,await n[5],n=e._tx}function un(e,t,n){let r=n[1].options,i=n[2];if(!i)return e.navigate({...r,replace:!0,ignoreBlocker:!0});if(r.reloadDocument)return e.navigate({href:(i.maskedLocation??i).publicHref,reloadDocument:!0,replace:!0,ignoreBlocker:!0});i._redirects=t[1]+1,e._pendingLocation=i;let a=e.commitLocation({...i,viewTransition:r.viewTransition,replace:!0,resetScroll:r.resetScroll,hashScrollIntoView:r.hashScrollIntoView,ignoreBlocker:!0});return queueMicrotask(()=>{e._pendingLocation===i&&(e._pendingLocation=void 0)}),a}async function dn(e,t,n,r,i){let a=n.map(e=>({...e}));Ut(a);for(let t of r)q(e,a[t[0]]),a[t[0]]=t[3];let o=[t[2],a],s;try{s=await en(e,o,r,t[0],i)}catch(t){throw J(e,a),t}if(W(s)){J(e,a),s[0]===H&&e._tx===t&&e._committed===n&&await un(e,t,s);return}if(await tn(e,s,t[0].signal),e._tx!==t||e._committed!==n){J(e,a);return}for(let t of a){let n=e._cache.get(t.id);n?._flight&&n._flight===t._flight&&(e._cache.delete(t.id),q(e,n))}sn(e,a),J(e,n,a)}async function fn(e,t,n,r,i,a){let o=await nn(e,t[2],t[3],[t[0],t[1],e._committed,void 0,i,n,a,r]);if(W(o)){let n=o[0]===H&&e._tx===t;if((!n||o[1].options.reloadDocument)&&an(e,t),J(e,t[3]),t[3]=[],!n)return;if(e._tx!==t){an(e,t);return}await un(e,t,o);return}let s=o[1];if(e._tx===t&&await on(e,t),e._tx!==t){an(e,t),J(e,s),Y(e,o);return}let c=t[2],l=xt(c,e.stores.resolvedLocation.get()),u=o[2];await e.startViewTransition(async()=>{if(e._tx===t&&await on(e,t),e._tx!==t){an(e,t),J(e,s),Y(e,o);return}let n=await e.startTransition(()=>{an(e,t),cn(e,t,s,a),e._tx===t&&(e.emit({type:`onLoad`,...l}),e._tx===t&&e.emit({type:`onBeforeRouteMount`,...l}))},s);if(e._tx!==t){Y(e,o);return}u?.length&&dn(e,t,s,u,o[3]).catch(console.error),e.batch(()=>{e.stores.resolvedLocation.set(c),e.stores.status.set(`idle`),e._tx===t&&e.emit({type:`onResolved`,...l}),n&&e._tx===t&&e.emit({type:`onRendered`,...l})}),e._tx===t&&(e._commitPromise?.resolve(),e._commitPromise=void 0)})}async function pn(e,t){let n=e._tx,r=e.stores.resolvedLocation.get(),i=r??e.stores.location.get(),a=e.latestLocation,o=e._pendingLocation,s=o?.href===a.href?o._redirects??0:0,c=e._handoff,l=c?.[0](),u=new AbortController,d=e._preflight;if(e._preflight=u,l||c?.[1](),d?.abort(),!u.signal.aborted){let t=xt(a,r);e.emit({type:`onBeforeNavigate`,...t}),u.signal.aborted||e.emit({type:`onBeforeLoad`,...t})}if(u.signal.aborted){await ln(e,n);return}let f=i.href===a.href,p=u,m=e.matchRoutes(a,{_controller:u});Ut(m);let h=l?c[1](m):void 0;if(h?p=l:l?.abort(),u.signal.aborted){J(e,m),await ln(e,n);return}e._preflight=void 0;let g,_=()=>fn(e,y,f,()=>rn(e,y),t?.sync,h),v=t?.sync?new Promise(e=>g=e):Promise.resolve().then(_),y=[p,s,a,m,Date.now(),v.then(()=>ln(e,y))];if(e._tx=y,n){for(let t of e.stores.matches.get()){if(e._tx!==y)break;t.isFetching&&Wt(e,t,!1)}n[0].abort(),J(e,n[3],y[3],!0)}if(e._tx!==y){J(e,y[3]),y[3]=[],g?.(),await ln(e,y);return}e.batch(()=>{e.stores.status.set(`pending`),e.stores.location.set(a)}),(h||!e._committed.length&&m[0]?.status!==`success`&&!m.some(e=>e._notFound))&&rn(e,y),g?.(_()),await y[5]}async function mn(e,t){let n=e.buildLocation(t);for(let t=0;;t++){let r=e._committed,i=new AbortController,a,o,s;try{try{a=e.matchRoutes(n,{_controller:i}),Ut(a),o=(e._preloads??=new Map).set(i,a),s=await nn(e,n,a,[i,t,r,!0])}finally{o&&(o=o.delete(i),J(e,a)),i.abort()}if(!W(s))return s[1];if(!o||s.length<3)return;n=s[2]}catch(e){I(e)||console.error(e);return}}}var hn=class extends M.Component{constructor(...e){super(...e),this.state={error:0},this.reset=()=>{this.setState({error:0})}}static getDerivedStateFromProps(e,t){let n=e.getResetKey();return t.error&&t.resetKey!==n?{resetKey:n,error:0}:{resetKey:n}}static getDerivedStateFromError(e){return{error:[e]}}componentDidCatch(e,t){this.props.onCatch?.(e,t)}render(){let e=this.state.error;return e?M.createElement(this.props.errorComponent??gn,{error:e[0],reset:this.reset}):this.props.children}};function gn({error:e}){let[t,n]=M.useState(!1);return F(`div`,{style:{padding:`.5rem`,maxWidth:`100%`},children:[F(`div`,{style:{display:`flex`,alignItems:`center`,gap:`.5rem`},children:[P(`strong`,{style:{fontSize:`1rem`},children:`Something went wrong!`}),P(`button`,{style:{appearance:`none`,fontSize:`.6em`,border:`1px solid currentColor`,padding:`.1rem .2rem`,fontWeight:`bold`,borderRadius:`.25rem`},onClick:()=>n(e=>!e),children:t?`Hide Error`:`Show Error`})]}),P(`div`,{style:{height:`.25rem`}}),t?P(`div`,{children:P(`pre`,{style:{fontSize:`.7em`,border:`1px solid red`,borderRadius:`.25rem`,padding:`.3rem`,color:`red`,overflow:`auto`},children:e?.message?P(`code`,{children:e.message}):null})}):null]})}var X=(e=>(e[e.None=0]=`None`,e[e.Mutable=1]=`Mutable`,e[e.Watching=2]=`Watching`,e[e.RecursedCheck=4]=`RecursedCheck`,e[e.Recursed=8]=`Recursed`,e[e.Dirty=16]=`Dirty`,e[e.Pending=32]=`Pending`,e))(X||{});function _n({update:e,notify:t,unwatched:n}){return{link:r,unlink:i,propagate:a,checkDirty:o,shallowPropagate:s};function r(e,t,n){let r=t.depsTail;if(r!==void 0&&r.dep===e)return;let i=r===void 0?t.deps:r.nextDep;if(i!==void 0&&i.dep===e){i.version=n,t.depsTail=i;return}let a=e.subsTail;if(a!==void 0&&a.version===n&&a.sub===t)return;let o=t.depsTail=e.subsTail={version:n,dep:e,sub:t,prevDep:r,nextDep:i,prevSub:a,nextSub:void 0};i!==void 0&&(i.prevDep=o),r===void 0?t.deps=o:r.nextDep=o,a===void 0?e.subs=o:a.nextSub=o}function i(e,t=e.sub){let r=e.dep,i=e.prevDep,a=e.nextDep,o=e.nextSub,s=e.prevSub;return a===void 0?t.depsTail=i:a.prevDep=i,i===void 0?t.deps=a:i.nextDep=a,o===void 0?r.subsTail=s:o.prevSub=s,s===void 0?(r.subs=o)===void 0&&n(r):s.nextSub=o,a}function a(e){let n=e.nextSub,r;top:do{let i=e.sub,a=i.flags;if(a&60?a&12?a&4?!(a&48)&&c(e,i)?(i.flags=a|40,a&=1):a=0:i.flags=a&-9|32:a=0:i.flags=a|32,a&2&&t(i),a&1){let t=i.subs;if(t!==void 0){let i=(e=t).nextSub;i!==void 0&&(r={value:n,prev:r},n=i);continue}}if((e=n)!==void 0){n=e.nextSub;continue}for(;r!==void 0;)if(e=r.value,r=r.prev,e!==void 0){n=e.nextSub;continue top}break}while(1)}function o(t,n){let r,i=0,a=!1;top:do{let o=t.dep,c=o.flags;if(n.flags&16)a=!0;else if((c&17)==17){if(e(o)){let e=o.subs;e.nextSub!==void 0&&s(e),a=!0}}else if((c&33)==33){(t.nextSub!==void 0||t.prevSub!==void 0)&&(r={value:t,prev:r}),t=o.deps,n=o,++i;continue}if(!a){let e=t.nextDep;if(e!==void 0){t=e;continue}}for(;i--;){let i=n.subs,o=i.nextSub!==void 0;if(o?(t=r.value,r=r.prev):t=i,a){if(e(n)){o&&s(i),n=t.sub;continue}a=!1}else n.flags&=-33;n=t.sub;let c=t.nextDep;if(c!==void 0){t=c;continue top}}return a}while(1)}function s(e){do{let n=e.sub,r=n.flags;(r&48)==32&&(n.flags=r|16,(r&6)==2&&t(n))}while((e=e.nextSub)!==void 0)}function c(e,t){let n=t.depsTail;for(;n!==void 0;){if(n===e)return!0;n=n.prevDep}return!1}}function vn(e,t,n){let r=typeof e==`object`,i=r?e:void 0;return{next:(r?e.next:e)?.bind(i),error:(r?e.error:t)?.bind(i),complete:(r?e.complete:n)?.bind(i)}}var yn=[],bn=0,{link:xn,unlink:Sn,propagate:Cn,checkDirty:wn,shallowPropagate:Tn}=_n({update(e){return e._update()},notify(e){yn[Dn++]=e,e.flags&=~X.Watching},unwatched(e){e.depsTail!==void 0&&(e.depsTail=void 0,e.flags=X.Mutable|X.Dirty,An(e))}}),En=0,Dn=0,Z,On=0;function kn(e){try{++On,e()}finally{--On||jn()}}function An(e){let t=e.depsTail,n=t===void 0?e.deps:t.nextDep;for(;n!==void 0;)n=Sn(n,e)}function jn(){if(!(On>0)){for(;En<Dn;){let e=yn[En];yn[En++]=void 0,e.notify()}En=0,Dn=0}}function Mn(e,t){let n=typeof e==`function`,r=e,i={_snapshot:n?void 0:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:n?X.None:X.Mutable,get(){return Z!==void 0&&xn(i,Z,bn),i._snapshot},subscribe(e){let t=vn(e),n={current:!1},r=Nn(()=>{i.get(),n.current?t.next?.(i._snapshot):n.current=!0});return{unsubscribe:()=>{r.stop()}}},_update(e){let a=Z,o=t?.compare??Object.is;if(n)Z=i,++bn,i.depsTail=void 0;else if(e===void 0)return!1;n&&(i.flags=X.Mutable|X.RecursedCheck);try{let t=i._snapshot,a=typeof e==`function`?e(t):e===void 0&&n?r(t):e;return t===void 0||!o(t,a)?(i._snapshot=a,!0):!1}finally{Z=a,n&&(i.flags&=~X.RecursedCheck),An(i)}}};return n?(i.flags=X.Mutable|X.Dirty,i.get=function(){let e=i.flags;if(e&X.Dirty||e&X.Pending&&wn(i.deps,i)){if(i._update()){let e=i.subs;e!==void 0&&Tn(e)}}else e&X.Pending&&(i.flags=e&~X.Pending);return Z!==void 0&&xn(i,Z,bn),i._snapshot}):i.set=function(e){if(i._update(e)){let e=i.subs;e!==void 0&&(Cn(e),Tn(e),jn())}},i}function Nn(e){let t=()=>{let t=Z;Z=n,++bn,n.depsTail=void 0,n.flags=X.Watching|X.RecursedCheck;try{return e()}finally{Z=t,n.flags&=~X.RecursedCheck,An(n)}},n={deps:void 0,depsTail:void 0,subs:void 0,subsTail:void 0,flags:X.Watching|X.RecursedCheck,notify(){let e=this.flags;e&X.Dirty||e&X.Pending&&wn(this.deps,this)?t():this.flags=X.Watching},stop(){this.flags=X.None,this.depsTail=void 0,An(this)}};return t(),n}function Pn(e){let t=j(),n=`not-found-${g(t.stores.location,e=>e.pathname)}-${g(t.stores.status,e=>e)}`;return P(hn,{getResetKey:()=>n,onCatch:(t,n)=>{if(I(t))e.onCatch?.(t,n);else throw t},errorComponent:({error:t})=>{if(I(t))return e.fallback?.(t);throw t},children:e.children})}function Fn(){return P(`p`,{children:`Not Found`})}function Q(e){return P(Ne,{children:e.children})}function In(e,t,n){return t.options.notFoundComponent?P(t.options.notFoundComponent,{...n}):e.options.defaultNotFoundComponent?P(e.options.defaultNotFoundComponent,{...n}):P(Fn,{})}function Ln(e,t){let n=t?.options.pendingComponent??e.options.defaultPendingComponent;return n?P(n,{}):null}var Rn=(e,t)=>e[0]===t[0]&&e[1]===t[1],zn=(e,t,n)=>!t.isRoot||t.options.shellComponent||t.options.wrapInSuspense||n===!1||n===`data-only`||!e.ssr,Bn=M.memo(function({routeId:e}){let t=j();return P(Vn,{router:t,match:g(t.stores.getMatchStore(e),e=>e)})});function Vn({router:e,match:t}){let n=e.routesById[t.routeId],r=Ln(e,n),i=n.options.errorComponent??e.options.defaultErrorComponent,a=n.options.onCatch??e.options.defaultOnCatch,o=n.isRoot?n.options.notFoundComponent??e.options.notFoundRoute?.options.component:n.options.notFoundComponent,s=t.ssr===!1||t.ssr===`data-only`,c=zn(e,n,t.ssr)&&(n.options.wrapInSuspense??r??(n.options.errorComponent?.preload||s))?M.Suspense:Q,l=i?hn:Q,u=o?Pn:Q;return F(n.isRoot?n.options.shellComponent??Q:Q,{children:[P(ae.Provider,{value:t.routeId,children:P(c,{fallback:r,children:P(l,{getResetKey:()=>t,errorComponent:i,onCatch:(e,n)=>{if(I(e))throw e.routeId??=t.routeId,e;a?.(e,n)},children:P(u,{fallback:e=>{if(e.routeId??=t.routeId,e.routeId!==t.routeId)throw e;return M.createElement(o,e)},children:s?P(D,{fallback:r,children:P(Hn,{match:t})}):P(Hn,{match:t})})})})}),null]})}var Hn=M.memo(function({match:e}){let t=j(),n=e.routeId,r=t.routesById[n],i=M.useMemo(()=>{let i=(r.options.remountDeps??t.options.defaultRemountDeps)?.({routeId:n,loaderDeps:e.loaderDeps,params:e._strictParams,search:e._strictSearch});return i?JSON.stringify(i):void 0},[n,e.loaderDeps,e._strictParams,e._strictSearch,r.options.remountDeps,t.options.defaultRemountDeps]),a=M.useMemo(()=>{let e=r.options.component??t.options.defaultComponent;return e?P(e,{},i):P(Un,{})},[i,r.options.component,t.options.defaultComponent]);if(e.status===`pending`){if(t.ssr&&!zn(t,r,e.ssr))return a;if(t._tx)throw t._tx[5];return Ln(t,r)}if(e.status===`notFound`)return In(t,r,e.error);if(e.status===`error`)throw e.error;return a}),Un=M.memo(function(){let e=j(),t=M.useContext(ae),n,r,i;{let a=e.stores.getMatchStore(t);[n,r]=g(a,e=>[!!e._notFound,e.error],Rn),i=g(e.stores.ids,e=>e[e.indexOf(t)+1])}if(n)return In(e,e.routesById[t],r);if(!i)return null;let a=P(Bn,{routeId:i});return t===`__root__`?P(M.Suspense,{fallback:Ln(e),children:a}):a});function Wn(e,t){let n=e[1];e.length=0,n?.(t)}function Gn({t:e}){let t=j(),n=t._rendered??=[];return t.startTransition=(r,i)=>new Promise(a=>{Wn(n,!1),n.push(i,a),e(t),M.startTransition(r)}),f(()=>{let e=t.history.subscribe(t.load);t.updateLatestLocation();let r=t.latestLocation,i=t.buildLocation({to:r.pathname,search:!0,params:!0,hash:!0,state:!0,_includeValidateSearch:!0});if(E(r.publicHref)!==E(i.publicHref))return t.commitLocation({...i,replace:!0,ignoreBlocker:!0}),e;let a=t.stores.resolvedLocation.get();return a?.href===r.href&&a.state.__TSR_key===r.state.__TSR_key?n.push(t.stores.matches.get(),e=>{e&&t.emit({type:`onRendered`,...xt(a,a)})}):t._tx||t.load({sync:!0}).catch(console.error),e},[t,t.history]),null}function Kn(){let e=j(),t=e.routesById[oe],n=Ln(e,t),r=e.ssr?Q:M.Suspense,i=F(Ne,{children:[P(Gn,{t:M.useState()[1]}),P(r,{fallback:n,children:P(qn,{})})]});return e.options.InnerWrap?P(e.options.InnerWrap,{children:i}):i}function qn(){let e=j(),t=e._rendered,n=g(e.stores.matches,e=>t[0]??e),r=n[0],i=r?.routeId;f(()=>{t[0]===n&&Wn(t,!0)},[t,n]);let a=i?P(Bn,{routeId:i}):null;return P(ae.Provider,{value:i,children:e.options.disableGlobalCatchBoundary?a:P(hn,{getResetKey:()=>r,onCatch:void 0,children:a})})}var Jn=e=>({createMutableStore:Mn,createReadonlyStore:Mn,batch:kn}),Yn=e=>new Xn(e),Xn=class extends Tt{constructor(e){super(e,Jn)}};function Zn({router:t,children:n,...r}){e(r)&&t.update({...t.options,...r,context:{...t.options.context,...r.context}});let i=P(ue.Provider,{value:t,children:n});return t.options.Wrap?P(t.options.Wrap,{children:i}):i}function Qn({router:e,...t}){return P(Zn,{router:e,...t,children:P(Kn,{})})}var $n=Fe.div`
4
4
  display: flex;
@@ -11,4 +11,4 @@ import{An as e,Cn as t,Dn as n,En as r,Fn as i,H as a,In as o,K as s,Mt as c,Nn
11
11
  font-size: 13px;
12
12
  color: ${({theme:e})=>e.color.inkDim};
13
13
  max-width: 48ch;
14
- `,tr=se()({component:Un,notFoundComponent:()=>P($n,{children:F(de,{$gap:3,style:{alignItems:`center`},children:[P(_e,{children:`Not found`}),P(er,{children:`This console has no screen at that address.`}),P(pe,{as:`a`,href:`/`,$variant:`primary`,$size:`sm`,children:`Back to the rack`})]})})}),nr=`stream:console`,rr={"res:usage":{predicate:e=>e.queryKey[0]===`usage`||e.queryKey[0]===`client`&&(e.queryKey[1]===`usage`||e.queryKey[1]===`summary`)},"res:logs":{predicate:e=>e.queryKey[0]===`logs`&&e.queryKey[1]!==`body`||e.queryKey[0]===`client`&&e.queryKey[1]===`logs`||(e.queryKey[0]===`logPages`||e.queryKey[0]===`client`&&e.queryKey[1]===`logPages`)&&m(e.state.data)},"res:credentials":{queryKey:s.credentials},"res:keys":{queryKey:s.keys},"res:settings":{queryKey:s.settings},"res:models":{queryKey:s.models},"res:quota":{predicate:e=>e.queryKey[0]===`quota-history`||e.queryKey[0]===`credentials`&&e.queryKey[1]===`health`},[nr]:{queryKey:[`console`]}},ir=Object.keys(rr),ar=ir.filter(e=>e.startsWith(`res:`)),or=ir.filter(e=>e.startsWith(`stream:`));function sr(e,t){if(t===`res:*`){lr(e);return}let n=rr[t];n!==void 0&&e.invalidateQueries(n)}function cr(e){for(let t of ir)sr(e,t)}function lr(e){e.invalidateQueries()}var ur=4401,dr=500,fr=3e4,pr=new Set([...ar,...or]),mr=3,hr=6e4,gr=(e,t)=>{let n=setTimeout(e,t);return()=>clearTimeout(n)};function _r(){let{protocol:e,host:t}=window.location;return`${e===`https:`?`wss:`:`ws:`}//${t}/api/stream`}function vr(e){if(typeof e!=`string`)return null;let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t||Array.isArray(t))return null;let n=t,{type:r,topic:i,seq:a}=n;return typeof r!=`string`||i!==void 0&&typeof i!=`string`||a!==void 0&&typeof a!=`number`?null:{type:r,...typeof i==`string`?{topic:i}:{},...typeof a==`number`?{seq:a}:{},...`payload`in n?{payload:n.payload}:{}}}function yr(e){let t=new Set,n=new Set,r=new Map,i=new Map,a=new Map,o=e=>a.has(e)||pr.has(e),s=[],c=null,l=!1,u=!1,d=!1,f=!1,p=!1,m=0,h=null,g={status:`poll`,pushed:()=>!1};function _(){let e=p?`offline`:u&&!f?`push`:`poll`,r=e===`push`;g={status:e,pushed:e=>r&&n.has(e)};for(let e of t)e()}function v(e){c?.send(JSON.stringify(e))}function y(e,t){let n=i.get(e);if(n===void 0||n.size===0)return!1;for(let e of[...n])e(t);return!0}function b(){for(let e of ar)v({type:`subscribe`,topic:e});for(let e of or){let t=r.get(e);v(t===void 0?{type:`subscribe`,topic:e}:{type:`subscribe`,topic:e,sinceSeq:t})}for(let e of a.keys())v({type:`subscribe`,topic:e})}function x(){u=!0,m=0,n.clear(),d&&cr(e.client),d=!0,b(),_()}function S(t){let i=vr(t.data);if(i===null)return;let{topic:a}=i;if(i.type===`ack`){a!==void 0&&o(a)&&(n.add(a),y(a,{kind:`open`}),_());return}if(i.type===`error`){a!==void 0&&(n.delete(a)&&_(),y(a,{kind:`refused`}));return}if(a!==void 0){if(i.type===`gap`){i.seq!==void 0&&r.set(a,i.seq),y(a,{kind:`gap`}),sr(e.client,a);return}if(i.type===`event`){if(a===`res:*`){lr(e.client);return}if(i.seq!==void 0){let t=r.get(a);if(r.set(a,i.seq),t!==void 0&&i.seq>t+1){y(a,{kind:`gap`}),sr(e.client,a);return}}i.payload!==void 0&&y(a,{kind:`frame`,payload:i.payload})||sr(e.client,a)}}}function C(t){let r=u;u=!1,c=null,n.clear();for(let e of[...i.keys()])y(e,{kind:`closed`});if(l){if(t.code===ur){p=!0,l=!1,_(),lr(e.client);return}if(!r)f=!0;else{let t=e.now();s=[...s.filter(e=>e>t-hr),t],s.length>=mr&&(f=!0)}_(),w()}}function w(){let t=Math.min(fr,dr*2**m);m+=1,h=e.timer(()=>{h=null,l&&T()},t)}function T(){let t=new WebSocket(e.url());c=t,t.addEventListener(`open`,x),t.addEventListener(`message`,S),t.addEventListener(`close`,C)}function E(e,t){let n=i.get(e)??new Set;return i.set(e,n),n.add(t),()=>{n.delete(t),n.size===0&&i.delete(e)}}return{subscribe(e){return t.add(e),()=>{t.delete(e)}},snapshot:()=>g,hold(e,t){let r=E(e,t),i=(a.get(e)??0)+1;a.set(e,i),i===1&&u&&v({type:`subscribe`,topic:e}),n.has(e)&&t({kind:`open`});let o=!1;return()=>{if(o)return;o=!0,r();let t=(a.get(e)??1)-1;if(t>0){a.set(e,t);return}a.delete(e),n.delete(e)&&_(),u&&v({type:`unsubscribe`,topic:e})}},publish(e,t){return!u||!n.has(e)?!1:(v({type:`send`,topic:e,payload:t}),!0)},onStream:E,start(){return l=!0,T(),()=>{l=!1,h?.(),h=null;let e=c;c=null,u=!1,e?.close()}}}}var br=Oe(null),xr=Oe(null),Sr=Oe(null),Cr={status:`poll`,pushed:()=>!1};function wr({children:e,enabled:t=!0,timer:n=gr,now:r=Date.now,url:i=_r}){let a=Ee(),[o]=je(()=>yr({client:a,timer:n,now:r,url:i})),[s]=je(()=>({subscribe:(e,t)=>o.hold(e,e=>{if(e.kind===`gap`){t({kind:`closed`});return}t(e)}),send:o.publish}));N(()=>{if(t)return o.start()},[o,t]);let c=Me(o.subscribe,o.snapshot,o.snapshot);return P(br,{value:c,children:P(xr,{value:o.onStream,children:P(Sr,{value:s,children:e})})})}function Tr(){return ke(br)??Cr}function Er(e,t){let n=ke(xr),r=Ae(t);N(()=>{r.current=t}),N(()=>{if(n!==null)return n(e,e=>r.current(e))},[n,e])}function Dr(e,t){let n=ke(Sr),r=Ae(t);N(()=>{r.current=t}),N(()=>{if(n!==null&&e!==null)return n.subscribe(e,e=>r.current(e))},[n,e])}function Or({children:e}){let t=Tr(),n=ke(Sr);return P(ye,{connection:t,...n===null?{}:{channels:n},children:e})}async function kr(e){return e.queryClient.ensureQueryData({queryKey:s.status,queryFn:()=>fe(`/api/status`),revalidateIfStale:!0})}function Ar(e){let t=e.principal;return e.authenticated!==!0||t==null?`/login`:t.kind===`client`?`/client`:t.kind===`admin`||t.kind===`viewer`?`/`:`/login`}function jr(e,t){let n=Ar(e);if(n===`/login`)throw le({to:`/login`,search:{next:t}});if(n!==`/`)throw le({to:n})}function Mr(e,t){let n=Ar(e);if(n===`/login`)throw le({to:`/login`,search:{next:t}});if(n!==`/client`)throw le({to:n})}var Nr=k(`/_app`)({beforeLoad:async({context:e,location:t})=>{jr(await kr(e),t.href),await e.queryClient.ensureQueryData(a)},pendingComponent:Pr,pendingMs:200,errorComponent:O(()=>A(()=>import(`./_app-CSru2YTE.js`),__vite__mapDeps([0,1])),`errorComponent`),component:Fr});function Pr(){return P(he,{legend:`Console`,children:P(ge,{rows:6})})}function Fr(){let e=c().data??[];return P(wr,{children:F(Or,{children:[P(be,{$providers:e}),P(xe,{children:P(Un,{})})]})})}var Ir=k(`/client`)({beforeLoad:async({context:e,location:t})=>{Mr(await kr(e),t.href)},component:O(()=>A(()=>import(`./client-DUhmc9Si.js`),__vite__mapDeps([2,3,4,1,5,6,7,8,9,10,11,12,13,14,15,16,17])),`component`)}),Lr=k(`/login`)({validateSearch:e=>({...typeof e.next==`string`?{next:e.next}:{},...typeof e.reason==`string`?{reason:e.reason}:{}}),component:O(()=>A(()=>import(`./login-DbXxdOl5.js`),__vite__mapDeps([18,4,1,11,19])),`component`)}),Rr=k(`/_app/`)({component:O(()=>A(()=>import(`./_app.index-BV1kJJjA.js`),__vite__mapDeps([20,4,1,5,7,10,14,12,17])),`component`)}),zr=k(`/_app/accounts`)({component:O(()=>A(()=>import(`./_app.accounts-2syjcpos.js`),__vite__mapDeps([21,4,1,5,22,13,8,23,24,25,26,9,10,11,14,12,15,3])),`component`)}),Br=k(`/_app/console`)({component:O(()=>A(()=>import(`./_app.console-Dxkf_zSS.js`),__vite__mapDeps([27,4,1,5,11])),`component`)}),Vr=k(`/_app/database`)({component:O(()=>A(()=>import(`./_app.database-CqSoTi2l.js`),__vite__mapDeps([28,4,1,5,25,11,14,12,17,19])),`component`)}),Hr=k(`/_app/keys`)({component:O(()=>A(()=>import(`./_app.keys-Dq5O0AG9.js`),__vite__mapDeps([29,4,1,5,22,13,8,23,26,9,10,11,14,12])),`component`)}),Ur=k(`/_app/logs`)({component:O(()=>A(()=>import(`./_app.logs-PjRK5wqy.js`),__vite__mapDeps([30,4,1,5,6,7,8,9,10,11,12])),`component`)}),Wr=k(`/_app/models`)({component:O(()=>A(()=>import(`./_app.models-BfmeeB5e.js`),__vite__mapDeps([31,4,1,5,23,24,25,26,9,10,11,14])),`component`)}),Gr=k(`/_app/settings`)({component:O(()=>A(()=>import(`./_app.settings-5i-vvT-H.js`),__vite__mapDeps([32,4,1,5,26,9,11,14,19])),`component`)}),Kr=k(`/_app/usage`)({component:O(()=>A(()=>import(`./_app.usage--5qFtU1W.js`),__vite__mapDeps([33,3,4,1,5,12,16,17])),`component`)}),qr=k(`/_app/plugins/$pluginId`)({component:O(()=>A(()=>import(`./_app.plugins._pluginId-BSlXzAHP.js`),__vite__mapDeps([34,4,1,35,5])),`component`)}),$=Nr.update({id:`/_app`,getParentRoute:()=>tr}),Jr=Ir.update({id:`/client`,path:`/client`,getParentRoute:()=>tr}),Yr=Lr.update({id:`/login`,path:`/login`,getParentRoute:()=>tr}),Xr=Rr.update({id:`/`,path:`/`,getParentRoute:()=>$}),Zr={AppAccountsRoute:zr.update({id:`/accounts`,path:`/accounts`,getParentRoute:()=>$}),AppConsoleRoute:Br.update({id:`/console`,path:`/console`,getParentRoute:()=>$}),AppDatabaseRoute:Vr.update({id:`/database`,path:`/database`,getParentRoute:()=>$}),AppKeysRoute:Hr.update({id:`/keys`,path:`/keys`,getParentRoute:()=>$}),AppLogsRoute:Ur.update({id:`/logs`,path:`/logs`,getParentRoute:()=>$}),AppModelsRoute:Wr.update({id:`/models`,path:`/models`,getParentRoute:()=>$}),AppSettingsRoute:Gr.update({id:`/settings`,path:`/settings`,getParentRoute:()=>$}),AppUsageRoute:Kr.update({id:`/usage`,path:`/usage`,getParentRoute:()=>$}),AppIndexRoute:Xr,AppPluginsPluginIdRoute:qr.update({id:`/plugins/$pluginId`,path:`/plugins/$pluginId`,getParentRoute:()=>$})},Qr={AppRoute:$._addFileChildren(Zr),ClientRoute:Jr,LoginRoute:Yr},$r=tr._addFileChildren(Qr)._addFileTypes();function ei(e){return{isLoginRoute:()=>e().state.location.pathname===`/login`,onUnauthenticated:()=>void e().navigate({to:`/login`,search:{next:e().state.location.href}})}}function ti(e){let t=t=>{t instanceof me&&t.isUnauthenticated&&(e.isLoginRoute()||e.onUnauthenticated())};return new we({queryCache:new Ce({onError:t}),mutationCache:new Se({onError:t}),defaultOptions:{queries:{retry:(e,t)=>t instanceof me&&t.isUnauthenticated?!1:e<2,staleTime:5e3,refetchOnWindowFocus:!0},mutations:{retry:!1}}})}var ni,ri=ti(ei(()=>ni));ni=Yn({routeTree:$r,context:{queryClient:ri}});var ii=document.getElementById(`root`);if(ii===null)throw Error(`#root is missing from index.html`);Pe(ii).render(P(De,{children:P(ve,{children:P(Te,{client:ri,children:P(Qn,{router:ni})})})}));export{Dr as a,sr as c,Or as i,Lr as n,Er as o,wr as r,nr as s,qr as t};
14
+ `,tr=se()({component:Un,notFoundComponent:()=>P($n,{children:F(de,{$gap:3,style:{alignItems:`center`},children:[P(_e,{children:`Not found`}),P(er,{children:`This console has no screen at that address.`}),P(pe,{as:`a`,href:`/`,$variant:`primary`,$size:`sm`,children:`Back to the rack`})]})})}),nr=`stream:console`,rr={"res:usage":{predicate:e=>e.queryKey[0]===`usage`||e.queryKey[0]===`client`&&(e.queryKey[1]===`usage`||e.queryKey[1]===`summary`)},"res:logs":{predicate:e=>e.queryKey[0]===`logs`&&e.queryKey[1]!==`body`||e.queryKey[0]===`client`&&e.queryKey[1]===`logs`||(e.queryKey[0]===`logPages`||e.queryKey[0]===`client`&&e.queryKey[1]===`logPages`)&&m(e.state.data)},"res:credentials":{queryKey:s.credentials},"res:keys":{queryKey:s.keys},"res:settings":{queryKey:s.settings},"res:models":{queryKey:s.models},"res:quota":{predicate:e=>e.queryKey[0]===`quota-history`||e.queryKey[0]===`credentials`&&e.queryKey[1]===`health`},[nr]:{queryKey:[`console`]}},ir=Object.keys(rr),ar=ir.filter(e=>e.startsWith(`res:`)),or=ir.filter(e=>e.startsWith(`stream:`));function sr(e,t){if(t===`res:*`){lr(e);return}let n=rr[t];n!==void 0&&e.invalidateQueries(n)}function cr(e){for(let t of ir)sr(e,t)}function lr(e){e.invalidateQueries()}var ur=4401,dr=500,fr=3e4,pr=new Set([...ar,...or]),mr=3,hr=6e4,gr=(e,t)=>{let n=setTimeout(e,t);return()=>clearTimeout(n)};function _r(){let{protocol:e,host:t}=window.location;return`${e===`https:`?`wss:`:`ws:`}//${t}/api/stream`}function vr(e){if(typeof e!=`string`)return null;let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t||Array.isArray(t))return null;let n=t,{type:r,topic:i,seq:a}=n;return typeof r!=`string`||i!==void 0&&typeof i!=`string`||a!==void 0&&typeof a!=`number`?null:{type:r,...typeof i==`string`?{topic:i}:{},...typeof a==`number`?{seq:a}:{},...`payload`in n?{payload:n.payload}:{}}}function yr(e){let t=new Set,n=new Set,r=new Map,i=new Map,a=new Map,o=e=>a.has(e)||pr.has(e),s=[],c=null,l=!1,u=!1,d=!1,f=!1,p=!1,m=0,h=null,g={status:`poll`,pushed:()=>!1};function _(){let e=p?`offline`:u&&!f?`push`:`poll`,r=e===`push`;g={status:e,pushed:e=>r&&n.has(e)};for(let e of t)e()}function v(e){c?.send(JSON.stringify(e))}function y(e,t){let n=i.get(e);if(n===void 0||n.size===0)return!1;for(let e of[...n])e(t);return!0}function b(){for(let e of ar)v({type:`subscribe`,topic:e});for(let e of or){let t=r.get(e);v(t===void 0?{type:`subscribe`,topic:e}:{type:`subscribe`,topic:e,sinceSeq:t})}for(let e of a.keys())v({type:`subscribe`,topic:e})}function x(){u=!0,m=0,n.clear(),d&&cr(e.client),d=!0,b(),_()}function S(t){let i=vr(t.data);if(i===null)return;let{topic:a}=i;if(i.type===`ack`){a!==void 0&&o(a)&&(n.add(a),y(a,{kind:`open`}),_());return}if(i.type===`error`){a!==void 0&&(n.delete(a)&&_(),y(a,{kind:`refused`}));return}if(a!==void 0){if(i.type===`gap`){i.seq!==void 0&&r.set(a,i.seq),y(a,{kind:`gap`}),sr(e.client,a);return}if(i.type===`event`){if(a===`res:*`){lr(e.client);return}if(i.seq!==void 0){let t=r.get(a);if(r.set(a,i.seq),t!==void 0&&i.seq>t+1){y(a,{kind:`gap`}),sr(e.client,a);return}}i.payload!==void 0&&y(a,{kind:`frame`,payload:i.payload})||sr(e.client,a)}}}function C(t){let r=u;u=!1,c=null,n.clear();for(let e of[...i.keys()])y(e,{kind:`closed`});if(l){if(t.code===ur){p=!0,l=!1,_(),lr(e.client);return}if(!r)f=!0;else{let t=e.now();s=[...s.filter(e=>e>t-hr),t],s.length>=mr&&(f=!0)}_(),w()}}function w(){let t=Math.min(fr,dr*2**m);m+=1,h=e.timer(()=>{h=null,l&&T()},t)}function T(){let t=new WebSocket(e.url());c=t,t.addEventListener(`open`,x),t.addEventListener(`message`,S),t.addEventListener(`close`,C)}function E(e,t){let n=i.get(e)??new Set;return i.set(e,n),n.add(t),()=>{n.delete(t),n.size===0&&i.delete(e)}}return{subscribe(e){return t.add(e),()=>{t.delete(e)}},snapshot:()=>g,hold(e,t){let r=E(e,t),i=(a.get(e)??0)+1;a.set(e,i),i===1&&u&&v({type:`subscribe`,topic:e}),n.has(e)&&t({kind:`open`});let o=!1;return()=>{if(o)return;o=!0,r();let t=(a.get(e)??1)-1;if(t>0){a.set(e,t);return}a.delete(e),n.delete(e)&&_(),u&&v({type:`unsubscribe`,topic:e})}},publish(e,t){return!u||!n.has(e)?!1:(v({type:`send`,topic:e,payload:t}),!0)},onStream:E,start(){return l=!0,T(),()=>{l=!1,h?.(),h=null;let e=c;c=null,u=!1,e?.close()}}}}var br=Oe(null),xr=Oe(null),Sr=Oe(null),Cr={status:`poll`,pushed:()=>!1};function wr({children:e,enabled:t=!0,timer:n=gr,now:r=Date.now,url:i=_r}){let a=Ee(),[o]=je(()=>yr({client:a,timer:n,now:r,url:i})),[s]=je(()=>({subscribe:(e,t)=>o.hold(e,e=>{if(e.kind===`gap`){t({kind:`closed`});return}t(e)}),send:o.publish}));N(()=>{if(t)return o.start()},[o,t]);let c=Me(o.subscribe,o.snapshot,o.snapshot);return P(br,{value:c,children:P(xr,{value:o.onStream,children:P(Sr,{value:s,children:e})})})}function Tr(){return ke(br)??Cr}function Er(e,t){let n=ke(xr),r=Ae(t);N(()=>{r.current=t}),N(()=>{if(n!==null)return n(e,e=>r.current(e))},[n,e])}function Dr(e,t){let n=ke(Sr),r=Ae(t);N(()=>{r.current=t}),N(()=>{if(n!==null&&e!==null)return n.subscribe(e,e=>r.current(e))},[n,e])}function Or({children:e}){let t=Tr(),n=ke(Sr);return P(ye,{connection:t,...n===null?{}:{channels:n},children:e})}async function kr(e){return e.queryClient.ensureQueryData({queryKey:s.status,queryFn:()=>fe(`/api/status`),revalidateIfStale:!0})}function Ar(e){let t=e.principal;return e.authenticated!==!0||t==null?`/login`:t.kind===`client`?`/client`:t.kind===`admin`||t.kind===`viewer`?`/`:`/login`}function jr(e,t){let n=Ar(e);if(n===`/login`)throw le({to:`/login`,search:{next:t}});if(n!==`/`)throw le({to:n})}function Mr(e,t){let n=Ar(e);if(n===`/login`)throw le({to:`/login`,search:{next:t}});if(n!==`/client`)throw le({to:n})}var Nr=k(`/_app`)({beforeLoad:async({context:e,location:t})=>{jr(await kr(e),t.href),await e.queryClient.ensureQueryData(a)},pendingComponent:Pr,pendingMs:200,errorComponent:O(()=>A(()=>import(`./_app-CSru2YTE.js`),__vite__mapDeps([0,1])),`errorComponent`),component:Fr});function Pr(){return P(he,{legend:`Console`,children:P(ge,{rows:6})})}function Fr(){let e=c().data??[];return P(wr,{children:F(Or,{children:[P(be,{$providers:e}),P(xe,{children:P(Un,{})})]})})}var Ir=k(`/client`)({beforeLoad:async({context:e,location:t})=>{Mr(await kr(e),t.href)},component:O(()=>A(()=>import(`./client-DEALADtD.js`),__vite__mapDeps([2,3,4,1,5,6,7,8,9,10,11,12,13,14,15,16,17])),`component`)}),Lr=k(`/login`)({validateSearch:e=>({...typeof e.next==`string`?{next:e.next}:{},...typeof e.reason==`string`?{reason:e.reason}:{}}),component:O(()=>A(()=>import(`./login-BhkdR1f4.js`),__vite__mapDeps([18,4,1,11,19])),`component`)}),Rr=k(`/_app/`)({component:O(()=>A(()=>import(`./_app.index-BV1kJJjA.js`),__vite__mapDeps([20,4,1,5,7,10,14,12,17])),`component`)}),zr=k(`/_app/accounts`)({component:O(()=>A(()=>import(`./_app.accounts-2syjcpos.js`),__vite__mapDeps([21,4,1,5,22,13,8,23,24,25,26,9,10,11,14,12,15,3])),`component`)}),Br=k(`/_app/console`)({component:O(()=>A(()=>import(`./_app.console-facio1_r.js`),__vite__mapDeps([27,4,1,5,11])),`component`)}),Vr=k(`/_app/database`)({component:O(()=>A(()=>import(`./_app.database-CqSoTi2l.js`),__vite__mapDeps([28,4,1,5,25,11,14,12,17,19])),`component`)}),Hr=k(`/_app/keys`)({component:O(()=>A(()=>import(`./_app.keys-Dq5O0AG9.js`),__vite__mapDeps([29,4,1,5,22,13,8,23,26,9,10,11,14,12])),`component`)}),Ur=k(`/_app/logs`)({component:O(()=>A(()=>import(`./_app.logs-PjRK5wqy.js`),__vite__mapDeps([30,4,1,5,6,7,8,9,10,11,12])),`component`)}),Wr=k(`/_app/models`)({component:O(()=>A(()=>import(`./_app.models-BfmeeB5e.js`),__vite__mapDeps([31,4,1,5,23,24,25,26,9,10,11,14])),`component`)}),Gr=k(`/_app/settings`)({component:O(()=>A(()=>import(`./_app.settings-CdSQyweb.js`),__vite__mapDeps([32,4,1,5,26,9,11,14,19])),`component`)}),Kr=k(`/_app/usage`)({component:O(()=>A(()=>import(`./_app.usage--5qFtU1W.js`),__vite__mapDeps([33,3,4,1,5,12,16,17])),`component`)}),qr=k(`/_app/plugins/$pluginId`)({component:O(()=>A(()=>import(`./_app.plugins._pluginId-cCDDM_D_.js`),__vite__mapDeps([34,4,1,35,5])),`component`)}),$=Nr.update({id:`/_app`,getParentRoute:()=>tr}),Jr=Ir.update({id:`/client`,path:`/client`,getParentRoute:()=>tr}),Yr=Lr.update({id:`/login`,path:`/login`,getParentRoute:()=>tr}),Xr=Rr.update({id:`/`,path:`/`,getParentRoute:()=>$}),Zr={AppAccountsRoute:zr.update({id:`/accounts`,path:`/accounts`,getParentRoute:()=>$}),AppConsoleRoute:Br.update({id:`/console`,path:`/console`,getParentRoute:()=>$}),AppDatabaseRoute:Vr.update({id:`/database`,path:`/database`,getParentRoute:()=>$}),AppKeysRoute:Hr.update({id:`/keys`,path:`/keys`,getParentRoute:()=>$}),AppLogsRoute:Ur.update({id:`/logs`,path:`/logs`,getParentRoute:()=>$}),AppModelsRoute:Wr.update({id:`/models`,path:`/models`,getParentRoute:()=>$}),AppSettingsRoute:Gr.update({id:`/settings`,path:`/settings`,getParentRoute:()=>$}),AppUsageRoute:Kr.update({id:`/usage`,path:`/usage`,getParentRoute:()=>$}),AppIndexRoute:Xr,AppPluginsPluginIdRoute:qr.update({id:`/plugins/$pluginId`,path:`/plugins/$pluginId`,getParentRoute:()=>$})},Qr={AppRoute:$._addFileChildren(Zr),ClientRoute:Jr,LoginRoute:Yr},$r=tr._addFileChildren(Qr)._addFileTypes();function ei(e){return{isLoginRoute:()=>e().state.location.pathname===`/login`,onUnauthenticated:()=>void e().navigate({to:`/login`,search:{next:e().state.location.href}})}}function ti(e){let t=t=>{t instanceof me&&t.isUnauthenticated&&(e.isLoginRoute()||e.onUnauthenticated())};return new we({queryCache:new Ce({onError:t}),mutationCache:new Se({onError:t}),defaultOptions:{queries:{retry:(e,t)=>t instanceof me&&t.isUnauthenticated?!1:e<2,staleTime:5e3,refetchOnWindowFocus:!0},mutations:{retry:!1}}})}var ni,ri=ti(ei(()=>ni));ni=Yn({routeTree:$r,context:{queryClient:ri}});var ii=document.getElementById(`root`);if(ii===null)throw Error(`#root is missing from index.html`);Pe(ii).render(P(De,{children:P(ve,{children:P(Te,{client:ri,children:P(Qn,{router:ni})})})}));export{Dr as a,sr as c,Or as i,Lr as n,Er as o,wr as r,nr as s,qr as t};
@@ -1,4 +1,4 @@
1
- import{Et as e,Qt as t,Yt as n,in as r,t as i}from"./Lamp-Dk9XrTCg.js";import{O as a,S as o,T as s,c,i as l,k as u,y as d}from"./Panel-CsovmtxF.js";import{n as f}from"./index-Bzh27906.js";import{n as p,t as m}from"./Field-DG1317zr.js";import{t as h}from"./reasons-Du1OBWAM.js";import{useState as g}from"react";import{jsx as _,jsxs as v}from"react/jsx-runtime";import y from"styled-components";var b=y.div`
1
+ import{Et as e,Qt as t,Yt as n,in as r,t as i}from"./Lamp-Dk9XrTCg.js";import{O as a,S as o,T as s,c,i as l,k as u,y as d}from"./Panel-CsovmtxF.js";import{n as f}from"./index-BYDVTknB.js";import{n as p,t as m}from"./Field-DG1317zr.js";import{t as h}from"./reasons-Du1OBWAM.js";import{useState as g}from"react";import{jsx as _,jsxs as v}from"react/jsx-runtime";import y from"styled-components";var b=y.div`
2
2
  display: flex;
3
3
  align-items: center;
4
4
  justify-content: center;
package/public/index.html CHANGED
@@ -9,7 +9,7 @@
9
9
  <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
10
10
  <title>OmniGateway — One endpoint in front of the AI accounts you already pay for.</title>
11
11
  <script type="importmap">{"imports":{"react":"/shared/react.js","react/jsx-runtime":"/shared/jsx-runtime.js","react-dom":"/shared/react-dom.js","react-dom/client":"/shared/react-dom-client.js","styled-components":"/shared/styled-components.js","@tanstack/react-query":"/shared/react-query.js","@omnigateway/dashboard-sdk":"/shared/dashboard-sdk.js"}}</script>
12
- <script type="module" crossorigin src="/assets/index-Bzh27906.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-BYDVTknB.js"></script>
13
13
  <link rel="modulepreload" crossorigin href="/assets/Panel-CsovmtxF.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/Lamp-Dk9XrTCg.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-B7KDmXJ9.js">