@yansigit/opencodex 2.31.1 → 2.31.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.
@@ -16,7 +16,7 @@
16
16
  } catch (e) {}
17
17
  })();
18
18
  </script>
19
- <script type="module" crossorigin src="/assets/index-DJDp_XER.js"></script>
19
+ <script type="module" crossorigin src="/assets/index-BAMgarF9.js"></script>
20
20
  <link rel="stylesheet" crossorigin href="/assets/index-CGoDO3uO.css">
21
21
  </head>
22
22
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yansigit/opencodex",
3
- "version": "2.31.1",
3
+ "version": "2.31.2",
4
4
  "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code",
5
5
  "type": "module",
6
6
  "main": "./bin/package-main.mjs",
@@ -24,6 +24,12 @@ export interface IncomingMeta {
24
24
  export interface ProviderAdapter {
25
25
  name: string;
26
26
 
27
+ /**
28
+ * Validate a parsed request before any attempt, sidecar, pacing, queue, or transport work.
29
+ * Adapters may throw a client-facing validation error when the request is unsupported.
30
+ */
31
+ validateRequest?(parsed: OcxParsedRequest): void;
32
+
27
33
  /**
28
34
  * Convert an already-read provider HTTP error into client-safe text. This hook must be pure and
29
35
  * return fully redacted output: callers may pass untrusted provider headers and payload text.
@@ -147,6 +147,18 @@ function bareReLooksLikeOverflow(context?: CursorSizeContext): boolean {
147
147
  return estimatedInputTokens >= OVERFLOW_MIN_FRACTION * contextWindow;
148
148
  }
149
149
 
150
+ /**
151
+ * True when a transport error is the bare 0-token resource_exhausted overflow shape
152
+ * (not quota/rate) that should surface for Codex compact or remint on later hits.
153
+ */
154
+ export function isCursorOverflowRemintCandidate(err: unknown, sizeContext?: CursorSizeContext): boolean {
155
+ const message = errorMessage(err);
156
+ if (!message) return false;
157
+ const lower = message.toLowerCase();
158
+ if (!isCursorZeroTokenResourceExhausted(lower)) return false;
159
+ return classifyCursorError(message, sizeContext) === "Cursor context limit exceeded";
160
+ }
161
+
150
162
  export function isCursorZeroTokenResourceExhausted(lowerMessage: string): boolean {
151
163
  if (!lowerMessage.includes("resource_exhausted") && !lowerMessage.includes("resource exhausted")) return false;
152
164
  // Any explicit quota/rate cue wins: this is a real 429.
@@ -65,3 +65,74 @@ export function lookupCursorThreadConversation(
65
65
  export function clearCursorThreadContinuityForTests(): void {
66
66
  overrides.clear();
67
67
  }
68
+
69
+ /** Max conversation-id remints after the first surfaced overflow (senpi cap). */
70
+ export const CURSOR_OVERFLOW_REMINT_MAX = 3;
71
+
72
+ type OverflowRemintState = {
73
+ surfaced: boolean;
74
+ remintCount: number;
75
+ skip: boolean;
76
+ };
77
+
78
+ const overflowRemintByScope = new Map<string, OverflowRemintState>();
79
+
80
+ function overflowRemintEntry(scopeKey: string): OverflowRemintState {
81
+ const existing = overflowRemintByScope.get(scopeKey);
82
+ if (existing) return existing;
83
+ const fresh: OverflowRemintState = { surfaced: false, remintCount: 0, skip: false };
84
+ overflowRemintByScope.set(scopeKey, fresh);
85
+ return fresh;
86
+ }
87
+
88
+ /**
89
+ * Stable scope for overflow remint accounting. Thread-identified clients key by
90
+ * thread + identity; conversation-only clients key by the base conversation id
91
+ * captured before any remint (wire id may rotate).
92
+ */
93
+ export function cursorOverflowRemintScopeKey(
94
+ parsed: {
95
+ _clientThreadId?: string;
96
+ _cursorIdentityScope?: string;
97
+ },
98
+ baseConversationId?: string,
99
+ ): string | null {
100
+ if (parsed._clientThreadId) {
101
+ return `overflow\0${cursorThreadScopeKey(parsed._clientThreadId, parsed._cursorIdentityScope)}`;
102
+ }
103
+ const base = baseConversationId?.trim();
104
+ if (!base) return null;
105
+ const scope = parsed._cursorIdentityScope?.trim() || "local";
106
+ return `overflow\0${scope}\0conv\0${base}`;
107
+ }
108
+
109
+ /** True until the first overflow for this scope has been surfaced for Codex compact. */
110
+ export function shouldSurfaceCursorOverflowFirst(scopeKey: string): boolean {
111
+ return overflowRemintEntry(scopeKey).surfaced !== true;
112
+ }
113
+
114
+ export function markCursorOverflowSurfaced(scopeKey: string): void {
115
+ const entry = overflowRemintEntry(scopeKey);
116
+ entry.surfaced = true;
117
+ }
118
+
119
+ export function shouldSkipCursorOverflowRemint(scopeKey: string): boolean {
120
+ const entry = overflowRemintByScope.get(scopeKey);
121
+ if (!entry) return false;
122
+ return entry.skip === true || entry.remintCount >= CURSOR_OVERFLOW_REMINT_MAX;
123
+ }
124
+
125
+ /** Record one overflow remint; returns false when the cap is exhausted. */
126
+ export function recordCursorOverflowRemint(scopeKey: string): boolean {
127
+ const entry = overflowRemintEntry(scopeKey);
128
+ if (entry.skip || entry.remintCount >= CURSOR_OVERFLOW_REMINT_MAX) {
129
+ entry.skip = true;
130
+ return false;
131
+ }
132
+ entry.remintCount += 1;
133
+ return true;
134
+ }
135
+
136
+ export function clearCursorOverflowRemintForTests(): void {
137
+ overflowRemintByScope.clear();
138
+ }
@@ -1,9 +1,15 @@
1
1
  import { createHash } from "node:crypto";
2
- import type { AdapterEvent, OcxProviderConfig } from "../types";
2
+ import type { AdapterEvent, OcxParsedRequest, OcxProviderConfig } from "../types";
3
3
  import type { ProviderAdapter } from "./base";
4
4
  import { isTranslatorBudgetExceededError } from "../lib/translator-budget";
5
5
  import { cursorExecDeniedMessage, cursorRequestDeclaresFullAccess } from "./cursor/exec-policy";
6
- import { isCursorBenignCancelError, isCursorInvalidArgumentError, safeCursorErrorMessage, type CursorSizeContext } from "./cursor/cursor-errors";
6
+ import {
7
+ isCursorBenignCancelError,
8
+ isCursorInvalidArgumentError,
9
+ isCursorOverflowRemintCandidate,
10
+ safeCursorErrorMessage,
11
+ type CursorSizeContext,
12
+ } from "./cursor/cursor-errors";
7
13
  import { cursorCheckpointModelAffinityId, inferCursorContextWindow, isCursorExternalWireModel } from "./cursor/discovery";
8
14
  import { createCursorKvStore, type CursorKvStore } from "./cursor/kv-store";
9
15
  import { mapCursorServerMessage } from "./cursor/message-mapper";
@@ -26,7 +32,14 @@ import {
26
32
  } from "./cursor/checkpoint-store";
27
33
  import { debugProviderDiagnostic } from "../lib/debug";
28
34
  import { estimateTokens } from "../lib/token-estimate";
29
- import { rememberCursorThreadConversation } from "./cursor/thread-continuity";
35
+ import {
36
+ cursorOverflowRemintScopeKey,
37
+ markCursorOverflowSurfaced,
38
+ recordCursorOverflowRemint,
39
+ rememberCursorThreadConversation,
40
+ shouldSkipCursorOverflowRemint,
41
+ shouldSurfaceCursorOverflowFirst,
42
+ } from "./cursor/thread-continuity";
30
43
  import { runCursorTurnWithRetry } from "./cursor/transport-retry";
31
44
  import {
32
45
  createDisabledCursorTransport,
@@ -77,10 +90,18 @@ function cursorRequestSizeContext(request: { modelId: string; system: string[];
77
90
  };
78
91
  }
79
92
 
93
+ function assertCursorRequestSupported(parsed: OcxParsedRequest): void {
94
+ if (parsed.options.textFormat !== undefined || parsed._structuredOutput === true) {
95
+ throw new Error("Cursor does not support structured output");
96
+ }
97
+ }
98
+
80
99
  export function createCursorAdapter(provider: OcxProviderConfig, deps: CursorAdapterDeps = {}): ProviderAdapter {
81
100
  return {
82
101
  name: "cursor",
83
102
 
103
+ validateRequest: assertCursorRequestSupported,
104
+
84
105
  buildRequest() {
85
106
  return {
86
107
  url: provider.baseUrl || CURSOR_API_URL,
@@ -98,6 +119,7 @@ export function createCursorAdapter(provider: OcxProviderConfig, deps: CursorAda
98
119
  },
99
120
 
100
121
  async runTurn(_parsed, incoming, emit) {
122
+ assertCursorRequestSupported(_parsed);
101
123
  if (incoming.abortSignal?.aborted) {
102
124
  emit({ type: "error", message: "Cursor turn was aborted before start." });
103
125
  return;
@@ -243,39 +265,79 @@ export function createCursorAdapter(provider: OcxProviderConfig, deps: CursorAda
243
265
  );
244
266
  };
245
267
 
246
- try {
247
- await runOnce(request);
248
- } catch (err) {
249
- // One-shot fallback for external-model Connect invalid_argument before any
250
- // non-heartbeat output. Retries apply only to safe plain-user turns; tool-result
251
- // resumes, local exec/MCP side effects, and already-emitted output fail closed.
252
- if (
253
- !isCursorInvalidArgumentError(err)
254
- || !isCursorExternalWireModel(request.modelId)
255
- || lastRawIsToolResult
256
- || emittedOutput
257
- || replayUnsafe
258
- || incoming.abortSignal?.aborted
259
- ) {
260
- throw err;
261
- }
262
- const failedConversationId = request.conversationId;
268
+ const overflowRemintBaseId = _parsed._clientThreadId
269
+ ? undefined
270
+ : (previousConversationId ?? _parsed._cursorConversationId);
271
+
272
+ const remintConversationId = (failedConversationId: string) => {
263
273
  lastTransport = undefined;
264
274
  _parsed._cursorConversationId = undefined;
265
- request = createCursorRequest(_parsed, { forceFreshConversation: true });
266
- rekeyContextUsage(failedConversationId, request.conversationId);
267
- _parsed._cursorConversationId = request.conversationId;
268
- // Persist recovery for store:false clients that only send a parent thread id, so the
269
- // next turn does not recompute the stale deterministic thread hash. Isolated helper /
270
- // compaction turns must not park their throwaway id under the parent thread key.
275
+ const next = createCursorRequest(_parsed, { forceFreshConversation: true });
276
+ rekeyContextUsage(failedConversationId, next.conversationId);
277
+ _parsed._cursorConversationId = next.conversationId;
271
278
  if (_parsed._clientThreadId && _parsed._cursorIsolateConversation !== true) {
272
279
  rememberCursorThreadConversation(
273
280
  _parsed._clientThreadId,
274
- request.conversationId,
281
+ next.conversationId,
275
282
  _parsed._cursorIdentityScope,
276
283
  );
277
284
  }
278
- await runOnce(request);
285
+ return next;
286
+ };
287
+
288
+ for (;;) {
289
+ try {
290
+ await runOnce(request);
291
+ break;
292
+ } catch (err) {
293
+ const overflowRemintSafe =
294
+ !lastRawIsToolResult
295
+ && !emittedOutput
296
+ && !replayUnsafe
297
+ && !incoming.abortSignal?.aborted;
298
+ const overflowScopeKey = cursorOverflowRemintScopeKey(
299
+ _parsed,
300
+ overflowRemintBaseId ?? request.conversationId,
301
+ );
302
+
303
+ if (
304
+ overflowScopeKey
305
+ && overflowRemintSafe
306
+ && isCursorOverflowRemintCandidate(err, requestSizeContext)
307
+ ) {
308
+ if (shouldSkipCursorOverflowRemint(overflowScopeKey)) {
309
+ throw err;
310
+ }
311
+ if (shouldSurfaceCursorOverflowFirst(overflowScopeKey)) {
312
+ markCursorOverflowSurfaced(overflowScopeKey);
313
+ throw err;
314
+ }
315
+ if (!recordCursorOverflowRemint(overflowScopeKey)) {
316
+ throw err;
317
+ }
318
+ const failedConversationId = request.conversationId;
319
+ if (inheritedCheckpointRef) invalidateCursorCheckpoint(inheritedCheckpointRef);
320
+ request = remintConversationId(failedConversationId);
321
+ continue;
322
+ }
323
+
324
+ // One-shot fallback for external-model Connect invalid_argument before any
325
+ // non-heartbeat output. Retries apply only to safe plain-user turns; tool-result
326
+ // resumes, local exec/MCP side effects, and already-emitted output fail closed.
327
+ if (
328
+ !isCursorInvalidArgumentError(err)
329
+ || !isCursorExternalWireModel(request.modelId)
330
+ || lastRawIsToolResult
331
+ || emittedOutput
332
+ || replayUnsafe
333
+ || incoming.abortSignal?.aborted
334
+ ) {
335
+ throw err;
336
+ }
337
+ request = remintConversationId(request.conversationId);
338
+ await runOnce(request);
339
+ break;
340
+ }
279
341
  }
280
342
  if (
281
343
  request.checkpointInvalidationReason
@@ -141,6 +141,14 @@ function compileGenerationConfig(value: unknown): JsonObject | undefined {
141
141
  const valid = value.responseModalities.filter((m): m is string => typeof m === "string" && ["TEXT", "IMAGE", "AUDIO"].includes(m));
142
142
  if (valid.length > 0) out.responseModalities = valid;
143
143
  }
144
+ if (value.responseMimeType === "application/json") out.responseMimeType = value.responseMimeType;
145
+ if (isObject(value.responseSchema)) {
146
+ const responseSchema = sanitizeGeminiToolParameters(value.responseSchema);
147
+ const properties = isObject(responseSchema.properties) ? responseSchema.properties : undefined;
148
+ const hasProperties = properties !== undefined && Object.keys(properties).length > 0;
149
+ const hasRequired = Array.isArray(responseSchema.required) && responseSchema.required.length > 0;
150
+ if (hasProperties || hasRequired) out.responseSchema = responseSchema;
151
+ }
144
152
  return Object.keys(out).length > 0 ? out : undefined;
145
153
  }
146
154
 
@@ -24,6 +24,7 @@ import { ANTIGRAVITY_REQUEST_UA, antigravitySessionId, isLikelyRealThoughtSignat
24
24
  import { repairGoogleToolPairs, stripTrailingClaudePrefill } from "./google-antigravity-tools";
25
25
  import { canonicalAntigravityHttpsHost, isAntigravityHttpsHost } from "./google-antigravity-hosts";
26
26
  import { compileGoogleWireBody } from "./google-wire-compiler";
27
+ import { sanitizeGeminiToolParameters } from "./google-tool-schema";
27
28
  import { identifyRoutedModel } from "./identity";
28
29
  import { antigravityUsesReplayCache, applyAntigravityReplay, clearAntigravityReplay, observeAntigravityReplay } from "./google-antigravity-replay";
29
30
  import { resolveAntigravityEffortWireModel } from "../providers/antigravity-models";
@@ -430,6 +431,30 @@ function isImageCapableModel(modelId: string): boolean {
430
431
  return IMAGE_CAPABLE_MODELS.has(modelId);
431
432
  }
432
433
 
434
+ function applyGeminiStructuredOutput(
435
+ generationConfig: Record<string, unknown>,
436
+ parsed: OcxParsedRequest,
437
+ wireModelId: string,
438
+ ): void {
439
+ const textFormat = parsed.options.textFormat;
440
+ if (!textFormat) return;
441
+ if (Array.isArray(parsed.context.tools) && parsed.context.tools.length > 0) return;
442
+ if (/claude/i.test(wireModelId) || /claude/i.test(parsed.modelId)) return;
443
+ if (isImageCapableModel(parsed.modelId)) return;
444
+
445
+ generationConfig.responseMimeType = "application/json";
446
+ if (textFormat.type !== "json_schema" || textFormat.schema === undefined) return;
447
+
448
+ const sanitized = sanitizeGeminiToolParameters(textFormat.schema);
449
+ const props = sanitized.properties;
450
+ const propKeys = props !== null && typeof props === "object" && !Array.isArray(props)
451
+ ? Object.keys(props)
452
+ : [];
453
+ const required = Array.isArray(sanitized.required) ? sanitized.required : [];
454
+ if (propKeys.length === 0 && required.length === 0) return;
455
+ generationConfig.responseSchema = sanitized;
456
+ }
457
+
433
458
  /**
434
459
  * Model-visible markdown link for a materialized artifact. Uses the authenticated
435
460
  * opaque HTTP route so remote/container clients can fetch the image without host
@@ -711,6 +736,7 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte
711
736
  if (!generationConfig.thinkingConfig && isImageCapableModel(parsed.modelId)) {
712
737
  generationConfig.responseModalities = ["TEXT", "IMAGE"];
713
738
  }
739
+ applyGeminiStructuredOutput(generationConfig, parsed, routedModelId);
714
740
  if (Object.keys(generationConfig).length > 0) body.generationConfig = generationConfig;
715
741
 
716
742
  const ccaAlwaysSse = provider.googleMode === "cloud-code-assist";
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "path": "package.json",
13
- "sha256": "11b1be6ac332acb93290cc0d5713be85196891efc6f32d2187f9c213f95ceb30"
13
+ "sha256": "5f79caaeac059bcbe36457e17d5c74ebaf9a0ec4779e74f1099db586395cbcb8"
14
14
  },
15
15
  {
16
16
  "path": "scripts/model-metadata.source.json",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  {
44
44
  "path": "src/adapters/base.ts",
45
- "sha256": "e4537344ba92385cded42375df448cc71613785bf6290b4dc042464e01761593"
45
+ "sha256": "4aff33a01ae643fe3c81faa62138b057259048ebf655da2bcf41c3516d118162"
46
46
  },
47
47
  {
48
48
  "path": "src/adapters/client-fingerprint.ts",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  {
60
60
  "path": "src/adapters/cursor.ts",
61
- "sha256": "2648737b4e9216f6cf09fc4edf83da4fedaa483220f1716c6f66b6a7c6d15286"
61
+ "sha256": "f84e2b4ad71a5f5763e37772748043383f78966af2a6ae938353396bdc5e0117"
62
62
  },
63
63
  {
64
64
  "path": "src/adapters/cursor/arg-codec.ts",
@@ -74,7 +74,7 @@
74
74
  },
75
75
  {
76
76
  "path": "src/adapters/cursor/cursor-errors.ts",
77
- "sha256": "b5fb1069d88bf53b4f6de84017646c99452681c22a1bf4abbf6f4b2465a13be4"
77
+ "sha256": "5a0835bd74b850bedddc5d1b9b4ed23937db554613c8c78c4e36fd0d766e6ff2"
78
78
  },
79
79
  {
80
80
  "path": "src/adapters/cursor/discovery.ts",
@@ -182,7 +182,7 @@
182
182
  },
183
183
  {
184
184
  "path": "src/adapters/cursor/thread-continuity.ts",
185
- "sha256": "56972b722418dc54dfb58136abd3d36fc87e630dc6f3e7c87d2a569c54b0bcf8"
185
+ "sha256": "d4e5867db3bc0c92c22462cbed74f7f3cc8be1cf2427c17656407961c5e3025c"
186
186
  },
187
187
  {
188
188
  "path": "src/adapters/cursor/tool-definitions.ts",
@@ -238,11 +238,11 @@
238
238
  },
239
239
  {
240
240
  "path": "src/adapters/google-wire-compiler.ts",
241
- "sha256": "23e981c264293f5c6d4839f6e14fdb1428e37af8f91a918ef0e92fd8ffa4637d"
241
+ "sha256": "5f3b21dc2fd6cbd584a83e2537d5a7012b179f76b575afd83ff17a3acdb7ad8d"
242
242
  },
243
243
  {
244
244
  "path": "src/adapters/google.ts",
245
- "sha256": "91e476435f211629fdbbd8dda64779731c03daf5a65e6804c45afa08697b12e3"
245
+ "sha256": "74ad714b7c4ff969f9e80af8f9d6cbab6a3727b18394a07775be30fa0ff9bb56"
246
246
  },
247
247
  {
248
248
  "path": "src/adapters/identity.ts",
@@ -2002,7 +2002,7 @@
2002
2002
  },
2003
2003
  {
2004
2004
  "path": "src/oauth/anthropic-routing.ts",
2005
- "sha256": "af0a2ffde5c630030e06b829033be65b91af11fae108cf9a4fab04659a8fce42"
2005
+ "sha256": "589ed95211898ccb5e05b8eb896bd018f563177b7dcf919b7662b947b82b68e4"
2006
2006
  },
2007
2007
  {
2008
2008
  "path": "src/oauth/anthropic.ts",
@@ -2010,7 +2010,7 @@
2010
2010
  },
2011
2011
  {
2012
2012
  "path": "src/oauth/antigravity-routing.ts",
2013
- "sha256": "f94b3b92acf730d0e2f2dc043bcd690ace1c475a3e92c2e69d0e4d957f0f2f74"
2013
+ "sha256": "4ea7bae4b3f508ef3f5640ccf0010ccc1040953f590671a0490a12845ca00914"
2014
2014
  },
2015
2015
  {
2016
2016
  "path": "src/oauth/callback-server.ts",
@@ -2024,6 +2024,10 @@
2024
2024
  "path": "src/oauth/command-code.ts",
2025
2025
  "sha256": "75ef37ec5186139f0a6d976c64b376ec1d7865463e97e5946ada291b194ad0be"
2026
2026
  },
2027
+ {
2028
+ "path": "src/oauth/cursor-routing.ts",
2029
+ "sha256": "86ee28d1f27034a527dc15a0befbfa5bc51ca3d2c3babe8e331e955f2c5bda4c"
2030
+ },
2027
2031
  {
2028
2032
  "path": "src/oauth/cursor.ts",
2029
2033
  "sha256": "afc515c357f5bc9f788c07e40a0a1fce6ef3d9887759906e5a48113a720d5673"
@@ -2138,7 +2142,7 @@
2138
2142
  },
2139
2143
  {
2140
2144
  "path": "src/providers/cursor-pool.ts",
2141
- "sha256": "26c8cb42be69a3089577ed9907673d12705f5496ede163baaf288fc2c288bfcd"
2145
+ "sha256": "815eb4715ced1cb744f48790d50cab2edf9158925077705e411721f16700df0b"
2142
2146
  },
2143
2147
  {
2144
2148
  "path": "src/providers/derive.ts",
@@ -2348,6 +2352,26 @@
2348
2352
  "path": "src/router.ts",
2349
2353
  "sha256": "44f5eebeb8894345edf51120ce1c6b091fa0f81be5bac875bd944af0c9c9b2de"
2350
2354
  },
2355
+ {
2356
+ "path": "src/routing/account-pool/affinity.ts",
2357
+ "sha256": "6bc16c3888ad7bf76a8a4e1a8611ee08816c47c34803c476d6f3f60a4fdd06ea"
2358
+ },
2359
+ {
2360
+ "path": "src/routing/account-pool/cooldown.ts",
2361
+ "sha256": "08a0b8178f24be3cf6d58091bca1e92e06635013fd06e46fcba4056979d15538"
2362
+ },
2363
+ {
2364
+ "path": "src/routing/account-pool/index.ts",
2365
+ "sha256": "ae1e896112557c0eaf0952e9cd26acbed93f672e9571fe8648f52854f392ab35"
2366
+ },
2367
+ {
2368
+ "path": "src/routing/account-pool/resolve.ts",
2369
+ "sha256": "1c06a541be08e46550be7a08f6b9cf7891200cefcf1ac49192f5f489aee7e848"
2370
+ },
2371
+ {
2372
+ "path": "src/routing/account-pool/types.ts",
2373
+ "sha256": "dfe95b901a7838916b6f490ef891e34635943328a4f8adbd550306d74ebe5a67"
2374
+ },
2351
2375
  {
2352
2376
  "path": "src/routing/analytics.ts",
2353
2377
  "sha256": "6b356e72e698e9a25a760e42a78d19236133e376eda3ff3da9220b027603e3b1"
@@ -2582,7 +2606,7 @@
2582
2606
  },
2583
2607
  {
2584
2608
  "path": "src/server/management/oauth-account-routes.ts",
2585
- "sha256": "b45cb4a832968edbdc3e60c09d8ba0945f430a619907b330fd930c9baeab0943"
2609
+ "sha256": "6bbdcd54e8c2cdca400954085de5605dd7a08336bb9e714eb11d8ed0eda4ea81"
2586
2610
  },
2587
2611
  {
2588
2612
  "path": "src/server/management/provider-capability-config.ts",
@@ -2750,7 +2774,7 @@
2750
2774
  },
2751
2775
  {
2752
2776
  "path": "src/server/responses/core.ts",
2753
- "sha256": "ba43e84778846fb1423fed04f25f2c2590ab7e4f1dbde64c756466959edd4169"
2777
+ "sha256": "889f74b70fb60c2c7bff2559fc923b64a883a5444aa4757ef1eb2c4a450e8e2d"
2754
2778
  },
2755
2779
  {
2756
2780
  "path": "src/server/responses/empty-completion-guard.ts",
@@ -2930,7 +2954,7 @@
2930
2954
  },
2931
2955
  {
2932
2956
  "path": "src/types/config.ts",
2933
- "sha256": "390b863cc8adc7715c12b2615c8d51a16bf446d33f9a7288c40cd610562b0ec7"
2957
+ "sha256": "0392623bd207f5e331e4b40488b140e7492b1478afe366b8f1e8112cb39c5359"
2934
2958
  },
2935
2959
  {
2936
2960
  "path": "src/types/provider.ts",
@@ -2938,7 +2962,7 @@
2938
2962
  },
2939
2963
  {
2940
2964
  "path": "src/types/request.ts",
2941
- "sha256": "648dfd779dc1d19c50b1db2974b4a30991b33387605a9a9c1da8a137a40db628"
2965
+ "sha256": "4a5e832cbd05b3c9cdeba818d2cdeeb10cb5da93349140e0c093fd99d66799d0"
2942
2966
  },
2943
2967
  {
2944
2968
  "path": "src/types/tools.ts",
@@ -3010,7 +3034,7 @@
3010
3034
  },
3011
3035
  {
3012
3036
  "path": "src/usage/log.ts",
3013
- "sha256": "e93150a475168276b816d783d0a1a965f7393a50f0731576528e35fc096a90d0"
3037
+ "sha256": "c850f8c7b515edebd490a819efde393d99d122aa92702a6bdff1a82cd90d8af1"
3014
3038
  },
3015
3039
  {
3016
3040
  "path": "src/usage/summary.ts",