@jeffusion/bungee-core 5.24.0 → 5.24.2

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.
@@ -326,7 +326,9 @@
326
326
  "GET"
327
327
  ],
328
328
  "outboundHeaders": {
329
- "passthrough": [],
329
+ "passthrough": [
330
+ "If-None-Match"
331
+ ],
330
332
  "set": {
331
333
  "Accept": "application/json",
332
334
  "User-Agent": "codex_cli_rs/0.153.3 (Mac OS 26.3.1; arm64) iTerm.app/3.6.9",
@@ -388,7 +390,9 @@
388
390
  "GET"
389
391
  ],
390
392
  "outboundHeaders": {
391
- "passthrough": [],
393
+ "passthrough": [
394
+ "If-None-Match"
395
+ ],
392
396
  "set": {
393
397
  "Accept": "application/json",
394
398
  "User-Agent": "Bungee/5.11.0",
@@ -17,10 +17,10 @@
17
17
  "/** Declarative repair request; the host owns the next upstream attempt. */\nconst retryActionBrand=Symbol.for('@jeffusion/bungee/request-retry-action');\nexport class RequestRetryAction extends Error {\n readonly body:unknown;\n constructor(body: unknown, readonly reason: string) {\n super('gateway request repair retry');\n this.name = 'RequestRetryAction';\n Object.defineProperty(this,retryActionBrand,{value:true});\n Object.defineProperty(this,'body',{value:body,enumerable:false});\n }\n /** Plugins and host may bundle the SDK independently in the same process. */\n static [Symbol.hasInstance](value:unknown):boolean {\n return value instanceof Error && (value as unknown as Record<symbol,unknown>)[retryActionBrand]===true;\n }\n}\n",
18
18
  "import type { TokenStatsRange } from './plugin.types';\n\nconst HOUR = 3_600_000;\nexport const TOKEN_STATS_RETENTION_MS = 31 * 24 * HOUR;\nexport const TOKEN_STATS_RANGES = ['1h', '12h', '24h', '1d', '7d', '30d', 'day', 'week', 'month'] as const;\n\n/** Recent page ranges are consecutive elapsed hours; calendar ranges use local dates. */\nexport function tokenStatsWindow(range: TokenStatsRange, asOfMs: number, timeZone = 'UTC') {\n if (range === '1h' || range === '12h' || range === '24h') {\n const duration = { '1h': HOUR, '12h': 12 * HOUR, '24h': 24 * HOUR };\n const bucketMs = { '1h': 300_000, '12h': HOUR, '24h': 2 * HOUR }[range];\n return { startMs: asOfMs - duration[range], endMs: asOfMs, bucketMs };\n }\n if (range === '1d' || range === '7d' || range === '30d') {\n const days = { '1d': 1, '7d': 7, '30d': 30 }[range];\n const bucketMs = range === '1d' ? HOUR : 24 * HOUR;\n const startMs = asOfMs - days * 24 * HOUR;\n const bucketStarts = Array.from({ length: range === '1d' ? 24 : days }, (_, i) => startMs + i * bucketMs);\n return { startMs, endMs: asOfMs, bucketMs, bucketStarts };\n }\n const format = new Intl.DateTimeFormat('en-US', {\n timeZone, year: 'numeric', month: 'numeric', day: 'numeric',\n hour: 'numeric', minute: 'numeric', second: 'numeric', hourCycle: 'h23',\n });\n const parts = (ms: number) => Object.fromEntries(format.formatToParts(ms)\n .filter(part => part.type !== 'literal').map(part => [part.type, Number(part.value)]));\n const today = parts(asOfMs);\n const day = Date.UTC(today.year!, today.month! - 1, today.day!);\n // Resolve each local midnight separately so DST days can contain 23 or 25 hours.\n const midnight = (date: number) => {\n let candidate = date;\n for (let i = 0; i < 4; i++) {\n const p = parts(candidate);\n const local = Date.UTC(p.year!, p.month! - 1, p.day!, p.hour!, p.minute!, p.second!);\n const next = candidate + date - local;\n if (next === candidate) return candidate;\n candidate = next;\n }\n return candidate;\n };\n if (range === 'day') {\n const startMs = midnight(day);\n const bucketEndMs = midnight(day + 24 * HOUR);\n const bucketStarts = Array.from({ length: Math.ceil((bucketEndMs - startMs) / HOUR) }, (_, i) => startMs + i * HOUR);\n return { startMs, endMs: asOfMs, bucketMs: HOUR, bucketStarts, bucketEndMs };\n }\n const firstDay = range === 'month' ? Date.UTC(today.year!, today.month! - 1, 1)\n : day - ((new Date(day).getUTCDay() + 6) % 7) * 24 * HOUR;\n const nextPeriod = range === 'month' ? Date.UTC(today.year!, today.month!, 1) : firstDay + 7 * 24 * HOUR;\n const days = (nextPeriod - firstDay) / (24 * HOUR);\n const bucketStarts = Array.from({ length: days }, (_, i) => midnight(firstDay + i * 24 * HOUR));\n return { startMs: bucketStarts[0]!, endMs: asOfMs, bucketMs: 24 * HOUR, bucketStarts, bucketEndMs: midnight(nextPeriod) };\n}\n",
19
19
  "import { defineRpcService, type PluginServices } from '@jeffusion/bungee-core/plugin';\n\nconst key = {type: 'string', minLength: 64, maxLength: 64} as const;\nconst etag = {type: 'string', minLength: 66, maxLength: 66} as const;\n\n/** Only directory validators cross workers; no catalog bodies or credentials. */\nexport const catalogValidatorsRpc = defineRpcService({\n id: 'codex-router.catalog-validators.v1', version: 1, methods: {\n get: {kind: 'query', input: {type: 'object', properties: {key}},\n output: {type: 'union', variants: [etag, {type: 'null'}]}, purposes: ['request', 'attempt']},\n put: {kind: 'command', input: {type: 'object', properties: {key, etag}},\n output: {type: 'null'}, purposes: ['request', 'attempt'],\n command: {deduplication: 'none', resultRetentionMs: 1, quotaBytes: 1024, maxResultBytes: 1024}},\n },\n});\n\nexport function catalogValidatorsClient(services: PluginServices) {\n return services.rpc!.consume('codex-router', catalogValidatorsRpc);\n}\n",
20
- "import { createHash } from 'node:crypto';\nimport type { DispatchRequestInput } from '@jeffusion/bungee-core/plugin';\nimport type { ModelBinding } from './config';\n\nfunction header(headers: Record<string, string>, name: string): string {\n return Object.entries(headers).find(([key]) => key.toLowerCase() === name)?.[1] ?? '';\n}\n\n/** Request headers are captured at entry dispatch, before provider rewrites. */\nexport function catalogValidatorKey({context, principal, servingRevision}: DispatchRequestInput, bindings: readonly ModelBinding[]): string | null {\n const directory = context.method === 'GET' && /\\/models$/.test(context.originalUrl.pathname);\n const generation = context.method === 'POST' && /\\/responses$/.test(context.originalUrl.pathname);\n if ((!directory && !generation) || !context.routeId) return null;\n const versions = context.originalUrl.searchParams.getAll('client_version');\n const version = directory ? versions.length === 1 ? versions[0] : '' : header(context.headers, 'version');\n if (!version || version.length > 128 || /[\\u0000-\\u0020\\u007f]/.test(version)) return null;\n // Account headers partition records only; authorization still belongs to the host.\n return createHash('sha256').update(JSON.stringify([\n context.routeId, servingRevision ?? null, bindings,\n principal ? [principal.domain, principal.keyId, principal.credentialVersion] : ['anonymous', '', 0],\n header(context.headers, 'authorization'), header(context.headers, 'x-api-key'), header(context.headers, 'api-key'),\n header(context.headers, 'chatgpt-account-id'), version,\n ])).digest('hex');\n}\n\n/** Ephemeral control-process LRU. Reads affect eviction, never the publication TTL. */\nexport class CatalogValidators {\n private readonly entries = new Map<string, {etag: string; expires: number}>();\n constructor(private readonly now = Date.now) {}\n private sweep(): void {\n const now = this.now();\n for (const [key, entry] of this.entries) if (entry.expires <= now) this.entries.delete(key);\n }\n get(key: string): string | null {\n this.sweep();\n const entry = this.entries.get(key);\n if (!entry) return null;\n this.entries.delete(key);\n this.entries.set(key, entry);\n return entry.etag;\n }\n put(key: string, etag: string): null {\n if (!/^[a-f0-9]{64}$/.test(key) || !/^\"[a-f0-9]{64}\"$/.test(etag)) throw new Error('codex_router_invalid_catalog_validator');\n this.sweep();\n this.entries.delete(key);\n if (this.entries.size >= 512) this.entries.delete(this.entries.keys().next().value!);\n this.entries.set(key, {etag, expires: this.now() + 600_000});\n return null;\n }\n clear(): void { this.entries.clear(); }\n}\n",
20
+ "import { createHash } from 'node:crypto';\nimport type { DispatchRequestInput } from '@jeffusion/bungee-core/plugin';\nimport type { ModelBinding } from './config';\n\nfunction header(headers: Record<string, string>, name: string): string {\n return Object.entries(headers).find(([key]) => key.toLowerCase() === name)?.[1] ?? '';\n}\n\n/** Request headers are captured at entry dispatch, before provider rewrites. */\nexport function catalogKeys({context, principal, servingRevision}: DispatchRequestInput, bindings: readonly ModelBinding[]): {validator: string; snapshot: string} | null {\n const directory = context.method === 'GET' && /\\/models$/.test(context.originalUrl.pathname);\n const generation = context.method === 'POST' && /\\/responses$/.test(context.originalUrl.pathname);\n if ((!directory && !generation) || !context.routeId) return null;\n const versions = context.originalUrl.searchParams.getAll('client_version');\n const version = directory ? versions.length === 1 ? versions[0] : '' : header(context.headers, 'version');\n if (!version || version.length > 128 || /[\\u0000-\\u0020\\u007f]/.test(version)) return null;\n // Account headers partition records only; authorization still belongs to the host.\n const scope = [\n context.routeId, servingRevision ?? null, bindings,\n principal ? [principal.domain, principal.keyId, principal.credentialVersion] : ['anonymous', '', 0],\n header(context.headers, 'authorization'), header(context.headers, 'x-api-key'), header(context.headers, 'api-key'),\n header(context.headers, 'chatgpt-account-id'),\n ];\n const key = (version: string) => createHash('sha256').update(JSON.stringify([...scope, version])).digest('hex');\n // Codex queries the release version but sends the full version in generation headers.\n // Normalize only notification matching; upstream snapshots retain the exact query version.\n return {validator: key(version.replace(/^(\\d+\\.\\d+\\.\\d+)[-+].*$/, '$1')), snapshot: key(version)};\n}\n\n/** Ephemeral control-process LRU. Reads affect eviction, never the publication TTL. */\nexport class CatalogValidators {\n private readonly entries = new Map<string, {etag: string; expires: number}>();\n constructor(private readonly now = Date.now) {}\n private sweep(): void {\n const now = this.now();\n for (const [key, entry] of this.entries) if (entry.expires <= now) this.entries.delete(key);\n }\n get(key: string): string | null {\n this.sweep();\n const entry = this.entries.get(key);\n if (!entry) return null;\n this.entries.delete(key);\n this.entries.set(key, entry);\n return entry.etag;\n }\n put(key: string, etag: string): null {\n if (!/^[a-f0-9]{64}$/.test(key) || !/^\"[a-f0-9]{64}\"$/.test(etag)) throw new Error('codex_router_invalid_catalog_validator');\n this.sweep();\n this.entries.delete(key);\n if (this.entries.size >= 512) this.entries.delete(this.entries.keys().next().value!);\n this.entries.set(key, {etag, expires: this.now() + 600_000});\n return null;\n }\n clear(): void { this.entries.clear(); }\n}\n",
21
21
  "import type { ControlHostContext, PluginControl, ControlPlugin } from '@jeffusion/bungee-core/plugin';\nimport { MODELS_DEV_CATALOG_SERVICE_ID, MODELS_DEV_CATALOG_CONTRACT_VERSION, MODELS_DEV_CAPABILITIES_SERVICE_ID, MODELS_DEV_CAPABILITIES_CONTRACT_VERSION, type ModelsDevCatalogService, type ModelsDevCapabilitiesService } from '../../models-dev/contract';\nimport { catalogValidatorsRpc } from '../contract';\nimport { CatalogValidators } from './catalog-validators';\nexport function createControl(host: ControlHostContext): PluginControl {\n const validators = new CatalogValidators();\n host.services!.rpc!.publish(catalogValidatorsRpc, {\n get: ({key}) => validators.get(key), put: ({key, etag}) => validators.put(key, etag),\n });\n host.services!.onDispose(() => validators.clear());\n host.signal.addEventListener('abort', () => validators.clear(), {once: true});\n return {\n rpc:[], start() {}, async dispose() { validators.clear(); },\n api:[{path:'/catalog', methods:['GET'], handler:'getCatalog', invoke:async ({request}) => {\n if (host.signal.aborted) return Response.json({error:'inactive'},{status:503});\n const params = new URL(request.url).searchParams;\n const page = Number(params.get('page') ?? 1);\n if (!Number.isSafeInteger(page) || page < 1 || page > 400\n || ['provider','search','page'].some(key => params.getAll(key).length > 1 || (params.get(key)?.length ?? 0) > 512)) return Response.json({error:'invalid_query'},{status:400});\n const catalog = host.services!.consume<ModelsDevCatalogService>('models-dev',MODELS_DEV_CATALOG_SERVICE_ID,MODELS_DEV_CATALOG_CONTRACT_VERSION);\n const capabilities = host.services!.consume<ModelsDevCapabilitiesService>('models-dev',MODELS_DEV_CAPABILITIES_SERVICE_ID,MODELS_DEV_CAPABILITIES_CONTRACT_VERSION);\n const result = catalog.modelOptions({provider:params.get('provider') ?? undefined,search:params.get('search') ?? undefined,page,pageSize:50});\n return Response.json({...result,providers:catalog.providers(),status:catalog.status(),models:result.models.map(model => ({...model,capabilities:capabilities.model(model)}))});\n }}],\n };\n}\nexport default {createControl} satisfies ControlPlugin;\n"
22
22
  ],
23
- "mappings": "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",
23
+ "mappings": "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",
24
24
  "debugId": "764DFFD4F1D0FE2964756E2164756E21",
25
25
  "names": []
26
26
  }
@@ -3427,6 +3427,48 @@ var model_template_0_160_1_default = {
3427
3427
  };
3428
3428
 
3429
3429
  // plugins/codex-router/server/catalog.ts
3430
+ class CatalogSnapshots {
3431
+ now;
3432
+ maxBytes;
3433
+ entries = new Map;
3434
+ bytes = 0;
3435
+ constructor(now = Date.now, maxBytes = 32 * 1024 * 1024) {
3436
+ this.now = now;
3437
+ this.maxBytes = maxBytes;
3438
+ }
3439
+ get(key) {
3440
+ const entry = this.entries.get(key);
3441
+ if (entry) {
3442
+ this.entries.delete(key);
3443
+ this.entries.set(key, entry);
3444
+ }
3445
+ return entry;
3446
+ }
3447
+ fresh(snapshot) {
3448
+ return snapshot.expiresAt > this.now();
3449
+ }
3450
+ put(key, native, upstreamEtag) {
3451
+ this.invalidate(key);
3452
+ const bytes = Buffer.byteLength(JSON.stringify(native), "utf8");
3453
+ if (bytes > this.maxBytes)
3454
+ return;
3455
+ while (this.entries.size >= 32 || this.bytes + bytes > this.maxBytes)
3456
+ this.invalidate(this.entries.keys().next().value);
3457
+ this.entries.set(key, { native: structuredClone(native), upstreamEtag, expiresAt: this.now() + 600000, bytes });
3458
+ this.bytes += bytes;
3459
+ }
3460
+ invalidate(key) {
3461
+ const entry = this.entries.get(key);
3462
+ if (entry) {
3463
+ this.bytes -= entry.bytes;
3464
+ this.entries.delete(key);
3465
+ }
3466
+ }
3467
+ clear() {
3468
+ this.entries.clear();
3469
+ this.bytes = 0;
3470
+ }
3471
+ }
3430
3472
  function mergeCatalog(native, bindings, catalog) {
3431
3473
  if (!native || typeof native !== "object" || Array.isArray(native))
3432
3474
  throw new Error("codex_router_invalid_catalog");
@@ -3520,7 +3562,7 @@ import { createHash as createHash2 } from "crypto";
3520
3562
  function header(headers, name) {
3521
3563
  return Object.entries(headers).find(([key]) => key.toLowerCase() === name)?.[1] ?? "";
3522
3564
  }
3523
- function catalogValidatorKey({ context, principal, servingRevision }, bindings) {
3565
+ function catalogKeys({ context, principal, servingRevision }, bindings) {
3524
3566
  const directory = context.method === "GET" && /\/models$/.test(context.originalUrl.pathname);
3525
3567
  const generation = context.method === "POST" && /\/responses$/.test(context.originalUrl.pathname);
3526
3568
  if (!directory && !generation || !context.routeId)
@@ -3529,7 +3571,7 @@ function catalogValidatorKey({ context, principal, servingRevision }, bindings)
3529
3571
  const version = directory ? versions.length === 1 ? versions[0] : "" : header(context.headers, "version");
3530
3572
  if (!version || version.length > 128 || /[\u0000-\u0020\u007f]/.test(version))
3531
3573
  return null;
3532
- return createHash2("sha256").update(JSON.stringify([
3574
+ const scope = [
3533
3575
  context.routeId,
3534
3576
  servingRevision ?? null,
3535
3577
  bindings,
@@ -3537,9 +3579,10 @@ function catalogValidatorKey({ context, principal, servingRevision }, bindings)
3537
3579
  header(context.headers, "authorization"),
3538
3580
  header(context.headers, "x-api-key"),
3539
3581
  header(context.headers, "api-key"),
3540
- header(context.headers, "chatgpt-account-id"),
3541
- version
3542
- ])).digest("hex");
3582
+ header(context.headers, "chatgpt-account-id")
3583
+ ];
3584
+ const key = (version) => createHash2("sha256").update(JSON.stringify([...scope, version])).digest("hex");
3585
+ return { validator: key(version.replace(/^(\d+\.\d+\.\d+)[-+].*$/, "$1")), snapshot: key(version) };
3543
3586
  }
3544
3587
 
3545
3588
  // plugins/codex-router/server/index.ts
@@ -3552,6 +3595,7 @@ var CodexRouterPlugin = definePlugin(class {
3552
3595
  history;
3553
3596
  validators;
3554
3597
  catalogRequests = new Map;
3598
+ snapshots = new CatalogSnapshots;
3555
3599
  conversion;
3556
3600
  constructor(options) {
3557
3601
  this.bindings = parseBindings(options?.models);
@@ -3565,7 +3609,10 @@ var CodexRouterPlugin = definePlugin(class {
3565
3609
  try {
3566
3610
  this.validators = catalogValidatorsClient(context.services);
3567
3611
  } catch {}
3568
- context.services.onDispose?.(() => this.catalogRequests.clear());
3612
+ context.services.onDispose?.(() => {
3613
+ this.catalogRequests.clear();
3614
+ this.snapshots.clear();
3615
+ });
3569
3616
  }
3570
3617
  bodyRequirements(context) {
3571
3618
  return { request: context.method === "POST" && /\/responses$/.test(context.url.pathname) ? "json-write" : "none", response: context.method === "GET" && /\/models$/.test(context.url.pathname) ? ["json"] : [] };
@@ -3573,9 +3620,9 @@ var CodexRouterPlugin = definePlugin(class {
3573
3620
  register(hooks) {
3574
3621
  hooks.onWebSocketSessionMode.tap("codex-router.session", (url) => /\/responses$/.test(url.pathname) ? "responses" : undefined);
3575
3622
  hooks.onDispatchRequest.tap("codex-router.catalog-identity", (input) => {
3576
- const key = catalogValidatorKey(input, this.bindings);
3577
- if (key)
3578
- this.catalogRequests.set(input.context.requestId, { key, signal: input.signal });
3623
+ const keys = catalogKeys(input, this.bindings);
3624
+ if (keys)
3625
+ this.catalogRequests.set(input.context.requestId, { key: keys.validator, snapshotKey: keys.snapshot, signal: input.signal });
3579
3626
  });
3580
3627
  hooks.onDispatchRequest.tapPromise("codex-router.binding", async ({ context, targets }) => {
3581
3628
  if (context.method !== "POST" || !/\/responses$/.test(context.originalUrl.pathname))
@@ -3702,10 +3749,41 @@ var CodexRouterPlugin = definePlugin(class {
3702
3749
  for (const key of Object.keys(context.headers))
3703
3750
  if (["if-none-match", "if-modified-since"].includes(key.toLowerCase()))
3704
3751
  delete context.headers[key];
3752
+ const record = this.catalogRequests.get(context.requestId);
3753
+ if (record) {
3754
+ record.snapshot = this.snapshots.get(record.snapshotKey);
3755
+ if (record.snapshot?.upstreamEtag)
3756
+ context.headers["if-none-match"] = record.snapshot.upstreamEtag;
3757
+ }
3705
3758
  }
3706
3759
  return context;
3707
3760
  });
3761
+ hooks.onInterceptRequest.tapPromise("codex-router.catalog-cache", async (context) => {
3762
+ if (context.method !== "GET" || !/\/models$/.test(context.originalUrl.pathname))
3763
+ return;
3764
+ const record = this.catalogRequests.get(context.requestId);
3765
+ const revalidate = Object.entries(context.headers).some(([key, value]) => key.toLowerCase() === "cache-control" && /(?:^|,)\s*(?:no-cache|max-age=0)\s*(?:,|$)/i.test(value));
3766
+ if (!record?.snapshot || !this.snapshots.fresh(record.snapshot) || revalidate)
3767
+ return;
3768
+ const response = await this.catalogResponse(record.snapshot.native, new Headers, record);
3769
+ return { action: "respond", response };
3770
+ });
3708
3771
  hooks.onRawResponse.tapPromise("codex-router.catalog-notification", async (result, context) => {
3772
+ if (context.method === "GET" && /\/models$/.test(context.originalUrl.pathname)) {
3773
+ const record = this.catalogRequests.get(context.requestId);
3774
+ if (record && [401, 403].includes(result.response.status))
3775
+ this.snapshots.invalidate(record.snapshotKey);
3776
+ if (result.response.status === 304) {
3777
+ if (!record?.snapshot?.upstreamEtag)
3778
+ throw new DataAdmissionError(502, "codex_router_catalog_without_snapshot");
3779
+ const headers = new Headers(result.response.headers);
3780
+ for (const key of ["content-length", "content-encoding", "transfer-encoding"])
3781
+ headers.delete(key);
3782
+ headers.set("content-type", "application/json");
3783
+ headers.set("etag", headers.get("etag") ?? record.snapshot.upstreamEtag);
3784
+ return { ...result, response: new Response(JSON.stringify(record.snapshot.native), { headers }) };
3785
+ }
3786
+ }
3709
3787
  if (context.method === "POST" && /\/responses$/.test(context.originalUrl.pathname)) {
3710
3788
  await this.rewriteCatalogNotification(result.response, this.catalogRequests.get(context.requestId));
3711
3789
  }
@@ -3716,25 +3794,31 @@ var CodexRouterPlugin = definePlugin(class {
3716
3794
  if (context.method !== "GET" || !/\/models$/.test(context.originalUrl.pathname) || !response.ok)
3717
3795
  return response;
3718
3796
  const native = await context.bodyHandle.json({ id: "codex-router.catalog", mandatory: true });
3719
- const body = JSON.stringify(mergeCatalog(native, this.bindings, this.conversion));
3720
- const etag = catalogEtag(body);
3721
- const headers = new Headers(response.headers);
3722
- for (const key of ["content-length", "content-encoding", "etag", "last-modified"])
3723
- headers.delete(key);
3724
- headers.set("content-type", "application/json");
3725
- headers.set("cache-control", "private, no-store");
3726
- headers.set("etag", etag);
3727
- if (record && this.validators) {
3728
- try {
3729
- await this.validators.put({ key: record.key, etag }, { signal: record.signal, timeoutMs: 1000, operationId: crypto.randomUUID() });
3730
- } catch {}
3731
- }
3732
- return new Response(body, { status: response.status, headers });
3797
+ const merged = await this.catalogResponse(native, response.headers, record, response.status);
3798
+ if (record && !record.signal.aborted)
3799
+ this.snapshots.put(record.snapshotKey, native, response.headers.get("etag"));
3800
+ return merged;
3733
3801
  });
3734
3802
  hooks.onFinally.tap("codex-router.catalog-cleanup", (context) => {
3735
3803
  this.catalogRequests.delete(context.requestId);
3736
3804
  });
3737
3805
  }
3806
+ async catalogResponse(native, sourceHeaders, record, status = 200) {
3807
+ const body = JSON.stringify(mergeCatalog(native, this.bindings, this.conversion));
3808
+ const etag = catalogEtag(body);
3809
+ const headers = new Headers(sourceHeaders);
3810
+ for (const key of ["content-length", "content-encoding", "etag", "last-modified"])
3811
+ headers.delete(key);
3812
+ headers.set("content-type", "application/json");
3813
+ headers.set("cache-control", "private, no-store");
3814
+ headers.set("etag", etag);
3815
+ if (record && this.validators) {
3816
+ try {
3817
+ await this.validators.put({ key: record.key, etag }, { signal: record.signal, timeoutMs: 1000, operationId: crypto.randomUUID() });
3818
+ } catch {}
3819
+ }
3820
+ return new Response(body, { status, headers });
3821
+ }
3738
3822
  async rewriteCatalogNotification(response, record) {
3739
3823
  response.headers.delete("x-models-etag");
3740
3824
  if (record && this.validators) {
@@ -3747,6 +3831,7 @@ var CodexRouterPlugin = definePlugin(class {
3747
3831
  }
3748
3832
  reset() {
3749
3833
  this.catalogRequests.clear();
3834
+ this.snapshots.clear();
3750
3835
  }
3751
3836
  });
3752
3837
  var server_default = CodexRouterPlugin;
@@ -3755,4 +3840,4 @@ export {
3755
3840
  server_default as default
3756
3841
  };
3757
3842
 
3758
- //# debugId=68FE5D69208B581A64756E2164756E21
3843
+ //# debugId=FAA6702D27B7AC8764756E2164756E21