@bitkyc08/opencodex 2.55.0-preview.20260914 → 2.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/gui/dist/assets/{index-DH2PUHqr.js → index-D4zuyIxQ.js} +1 -1
- package/gui/dist/index.html +1 -1
- package/package.json +2 -1
- package/src/adapters/base.ts +21 -0
- package/src/adapters/cursor/transport-retry.ts +46 -1
- package/src/adapters/cursor.ts +4 -0
- package/src/adapters/kiro/adapter.ts +42 -1
- package/src/adapters/kiro-retry.ts +23 -4
- package/src/adapters/openai-chat/errors.ts +116 -0
- package/src/adapters/openai-chat/messages.ts +346 -0
- package/src/adapters/openai-chat/passthrough.ts +146 -0
- package/src/adapters/openai-chat/response-events.ts +117 -0
- package/src/adapters/openai-chat/tool-call-validation.ts +200 -0
- package/src/adapters/openai-chat/tool-schema.ts +477 -0
- package/src/adapters/openai-chat/wire.ts +50 -0
- package/src/adapters/openai-chat.ts +33 -1445
- package/src/adapters/openai-responses/canonical-forward.ts +202 -0
- package/src/adapters/openai-responses/image-gen.ts +406 -0
- package/src/adapters/openai-responses/internal.ts +3 -0
- package/src/adapters/openai-responses/passthrough.ts +611 -0
- package/src/adapters/openai-responses/prompt-cache.ts +83 -0
- package/src/adapters/openai-responses/reasoning.ts +220 -0
- package/src/adapters/openai-responses/request-strips.ts +185 -0
- package/src/adapters/openai-responses/tool-output-recovery.ts +509 -0
- package/src/adapters/openai-responses/tool-schema.ts +293 -0
- package/src/adapters/openai-responses/web-search.ts +156 -0
- package/src/adapters/openai-responses.ts +4 -2625
- package/src/bridge/errors.ts +34 -0
- package/src/bridge/internal.ts +174 -0
- package/src/bridge/response-json.ts +624 -0
- package/src/bridge/sse.ts +1444 -0
- package/src/bridge.ts +5 -2204
- package/src/chat/inbound.ts +12 -1
- package/src/codex/account-lifecycle.ts +3 -0
- package/src/codex/account-store.ts +71 -9
- package/src/codex/auth-api/account-list.ts +507 -0
- package/src/codex/auth-api/http.ts +32 -0
- package/src/codex/auth-api/login-flow.ts +554 -0
- package/src/codex/auth-api/login-state.ts +64 -0
- package/src/codex/auth-api/main-account-probe.ts +331 -0
- package/src/codex/auth-api/pool-mode-gate.ts +274 -0
- package/src/codex/auth-api/pool-quota-probe.ts +512 -0
- package/src/codex/auth-api/reset-credit-service.ts +422 -0
- package/src/codex/auth-api/routes.ts +425 -0
- package/src/codex/auth-api/runtime-config.ts +48 -0
- package/src/codex/auth-api.ts +27 -3118
- package/src/codex/auth-context.ts +95 -28
- package/src/codex/catalog/auto-review.ts +507 -0
- package/src/codex/catalog/build-entries.ts +981 -0
- package/src/codex/catalog/combo-member.ts +375 -0
- package/src/codex/catalog/derive-entry.ts +229 -0
- package/src/codex/catalog/effort.ts +0 -1
- package/src/codex/catalog/gated-native-warn.ts +63 -0
- package/src/codex/catalog/gather-capture.ts +533 -0
- package/src/codex/catalog/model-hints.ts +691 -0
- package/src/codex/catalog/model-visibility.ts +304 -0
- package/src/codex/catalog/provider-fetch.ts +52 -2942
- package/src/codex/catalog/provider-models.ts +685 -0
- package/src/codex/catalog/restore.ts +132 -0
- package/src/codex/catalog/retained-sync.ts +706 -0
- package/src/codex/catalog/routed-gather.ts +858 -0
- package/src/codex/catalog/subagent-roster.ts +176 -0
- package/src/codex/catalog/sync.ts +52 -2698
- package/src/codex/inject/config-toml.ts +563 -0
- package/src/codex/inject/remove.ts +192 -0
- package/src/codex/inject/restore.ts +540 -0
- package/src/codex/inject/routing-classify.ts +109 -0
- package/src/codex/inject/routing-target.ts +125 -0
- package/src/codex/inject.ts +81 -1436
- package/src/codex/lineage.ts +458 -0
- package/src/codex/pool-refresh-backoff.ts +152 -0
- package/src/codex/routing/active-account.ts +194 -0
- package/src/codex/routing/cooldown-math.ts +275 -0
- package/src/codex/routing/health-store.ts +402 -0
- package/src/codex/routing/probe-lease.ts +358 -0
- package/src/codex/routing/selection.ts +703 -0
- package/src/codex/routing/thread-affinity.ts +538 -0
- package/src/codex/routing.ts +353 -2234
- package/src/codex/shim-fingerprint.ts +223 -0
- package/src/codex/shim-inspect.ts +175 -0
- package/src/codex/shim-probe.ts +367 -0
- package/src/codex/shim-restore-lock.ts +169 -0
- package/src/codex/shim-state-file.ts +151 -0
- package/src/codex/shim-templates.ts +265 -0
- package/src/codex/shim.ts +48 -1268
- package/src/config/diagnostics.ts +705 -0
- package/src/config/feature-flags.ts +55 -0
- package/src/config/live-reconcile.ts +403 -0
- package/src/config/load-degrade.ts +880 -0
- package/src/config/mutation-lock.ts +244 -0
- package/src/config/openai-tier-backup.ts +268 -0
- package/src/config/persist-unlocked.ts +92 -0
- package/src/config/proxy-env.ts +188 -0
- package/src/config/salvage.ts +244 -0
- package/src/config/schema/config-schema.ts +640 -0
- package/src/config/schema/leaf-validators.ts +855 -0
- package/src/config/warn-memo.ts +28 -0
- package/src/config.ts +234 -4481
- package/src/generated/compatibility-version.json +539 -39
- package/src/lib/request-execution-budget.ts +69 -20
- package/src/lib/spend-reservation-ledger.ts +940 -0
- package/src/lib/upstream-retry.ts +55 -11
- package/src/lib/workflow-budget.ts +553 -30
- package/src/providers/quota/account-cache.ts +441 -0
- package/src/providers/quota/antigravity.ts +295 -0
- package/src/providers/quota/report-cache.ts +320 -0
- package/src/providers/quota/vendor-probes-key.ts +1243 -0
- package/src/providers/quota/vendor-probes-oauth.ts +590 -0
- package/src/providers/quota.ts +324 -3079
- package/src/providers/registry/entries-core.ts +1221 -0
- package/src/providers/registry/entries-extended.ts +1204 -0
- package/src/providers/registry/model-seeds.ts +908 -0
- package/src/providers/registry/types.ts +352 -0
- package/src/providers/registry.ts +24 -3536
- package/src/responses/continuation-ownership.ts +29 -0
- package/src/responses/state/replay-fingerprint.ts +80 -0
- package/src/responses/state/snapshot-codec.ts +104 -0
- package/src/responses/state/spill-failure.ts +118 -0
- package/src/responses/state/spill-queue.ts +665 -0
- package/src/responses/state/temp-recovery.ts +257 -0
- package/src/responses/state.ts +82 -1143
- package/src/routing/identity-domains.ts +449 -0
- package/src/routing/probe-lease.ts +511 -0
- package/src/server/index/bounded-request.ts +88 -0
- package/src/server/index/live-sideband.ts +565 -0
- package/src/server/index/serve-options.ts +1766 -0
- package/src/server/index/startup-warnings.ts +213 -0
- package/src/server/index/websocket-handler.ts +335 -0
- package/src/server/index.ts +40 -2547
- package/src/server/management/route-registry.ts +26 -23
- package/src/server/management/shared.ts +8 -5
- package/src/server/management/workflow-budget-routes.ts +133 -0
- package/src/server/management-api.ts +12 -0
- package/src/server/request-log-conversation.ts +9 -7
- package/src/server/request-log.ts +245 -1
- package/src/server/responses/account-change-state.ts +233 -0
- package/src/server/responses/adapter-continuation.ts +514 -0
- package/src/server/responses/adapter-delivery.ts +214 -0
- package/src/server/responses/adapter-dispatch.ts +971 -0
- package/src/server/responses/compact.ts +59 -4
- package/src/server/responses/completion-policy.ts +33 -0
- package/src/server/responses/core-auth.ts +527 -0
- package/src/server/responses/core-codex-account.ts +859 -0
- package/src/server/responses/core-combo-failure.ts +210 -0
- package/src/server/responses/core-combo.ts +707 -0
- package/src/server/responses/core-errors.ts +152 -0
- package/src/server/responses/core-lifetime.ts +95 -0
- package/src/server/responses/core-normalize.ts +350 -0
- package/src/server/responses/core-opaque-recovery.ts +380 -0
- package/src/server/responses/core-options.ts +159 -0
- package/src/server/responses/core-replay.ts +225 -0
- package/src/server/responses/core.ts +192 -8893
- package/src/server/responses/passthrough-delivery.ts +856 -0
- package/src/server/responses/passthrough-dispatch.ts +1476 -0
- package/src/server/responses/passthrough-execution.ts +54 -0
- package/src/server/responses/request-prepare.ts +970 -0
- package/src/server/responses/request-send-budget.ts +164 -0
- package/src/server/responses/request-sidecar-auth.ts +149 -0
- package/src/server/responses/request-transport.ts +744 -0
- package/src/server/responses/response-effects.ts +157 -0
- package/src/server/responses/run-turn-execution.ts +448 -0
- package/src/server/responses/sidecar-execution.ts +469 -0
- package/src/server/responses-image-gen-repair.ts +1 -1
- package/src/server/workflow-refusal.ts +84 -0
- package/src/types/config.ts +30 -0
- package/src/usage/log.ts +146 -0
- package/src/usage/summary.ts +171 -21
|
@@ -72,17 +72,28 @@ export interface DispatchIntent {
|
|
|
72
72
|
readonly replaySafe?: boolean;
|
|
73
73
|
/**
|
|
74
74
|
* True when the physical send is already reported through another counter -- the retry
|
|
75
|
-
* helpers' `onSendsConsumed` hook. The
|
|
76
|
-
*
|
|
77
|
-
*
|
|
75
|
+
* helpers' `onSendsConsumed` hook. The send is still booked at reservation time, because an
|
|
76
|
+
* advisory reservation cannot stop a concurrent leg; what changes is that the booking is
|
|
77
|
+
* PENDING, and the first send the external reporter names settles it instead of adding a
|
|
78
|
+
* second charge. Charging both is how a four-send cap silently becomes a two-send cap.
|
|
78
79
|
*/
|
|
79
80
|
readonly countedExternally?: boolean;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
export interface SingleUseDispatchPermit {
|
|
83
84
|
readonly sendClass: SendClass;
|
|
84
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* Confirm the dispatch this permit already paid for. The reservation is the charge, so this
|
|
87
|
+
* charges nothing; it is how a leg proves it is the one that sent. A second call returns
|
|
88
|
+
* false, which is what keeps a retry thunk from sending twice on one permit.
|
|
89
|
+
*/
|
|
85
90
|
use(): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Hand back a reservation that never dispatched -- a credential move that found no alternate,
|
|
93
|
+
* a rebuild abandoned before the send. Idempotent, and a no-op once the permit was used or
|
|
94
|
+
* once an external send reporter already settled it.
|
|
95
|
+
*/
|
|
96
|
+
release(): void;
|
|
86
97
|
}
|
|
87
98
|
|
|
88
99
|
export type DispatchDecision =
|
|
@@ -103,6 +114,9 @@ export interface RequestExecutionBudget extends TransientSendBudget {
|
|
|
103
114
|
* Sends still available from the base allowance, capped by a layer's own maximum.
|
|
104
115
|
* Returns 0 when the allowance is gone -- it never floors to 1, because a floor of 1 is
|
|
105
116
|
* what let every recovery leg send one more time forever.
|
|
117
|
+
*
|
|
118
|
+
* A reserved-but-unconfirmed send is spent for this purpose. The alternative -- counting only
|
|
119
|
+
* confirmed sends -- is what let two legs read the same remainder and both dispatch.
|
|
106
120
|
*/
|
|
107
121
|
remainingBaseSends(cap: number): number;
|
|
108
122
|
readonly reserveSpent: boolean;
|
|
@@ -124,13 +138,30 @@ export function createRequestExecutionBudget(
|
|
|
124
138
|
policy: RequestExecutionBudgetPolicy = CODEX_TEXT_GUARDED_BUDGET_POLICY,
|
|
125
139
|
logicalRequestId?: string,
|
|
126
140
|
): RequestExecutionBudget {
|
|
141
|
+
let spent = 0;
|
|
142
|
+
// Reservations whose physical send is reported by a retry helper rather than by the permit.
|
|
143
|
+
// They are already charged; the reporter's first send settles one instead of charging again.
|
|
144
|
+
let pendingExternalSends = 0;
|
|
127
145
|
let reserveSpent = false;
|
|
128
146
|
let alternateTargetSends = 0;
|
|
129
147
|
let targetTransitions = 0;
|
|
130
148
|
let lastTargetKey: string | undefined;
|
|
131
149
|
|
|
132
150
|
const budget: RequestExecutionBudget = {
|
|
133
|
-
used:
|
|
151
|
+
get used(): number { return spent; },
|
|
152
|
+
set used(next: number) {
|
|
153
|
+
// The retry helpers report their real send count by assigning through this field. A
|
|
154
|
+
// reservation taken with `countedExternally` has already booked one of those sends, so
|
|
155
|
+
// the report settles the pending booking first and only the surplus is charged.
|
|
156
|
+
const delta = next - spent;
|
|
157
|
+
if (delta <= 0) {
|
|
158
|
+
spent = Math.max(0, next);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const settled = Math.min(delta, pendingExternalSends);
|
|
162
|
+
pendingExternalSends -= settled;
|
|
163
|
+
spent += delta - settled;
|
|
164
|
+
},
|
|
134
165
|
logicalRequestId: logicalRequestId ?? `lr-${Date.now().toString(36)}-${(logicalRequestSeq += 1).toString(36)}`,
|
|
135
166
|
policyVersion: REQUEST_BUDGET_POLICY_VERSION,
|
|
136
167
|
policy,
|
|
@@ -140,11 +171,11 @@ export function createRequestExecutionBudget(
|
|
|
140
171
|
get lastTargetKey() { return lastTargetKey; },
|
|
141
172
|
remainingBaseSends(cap: number): number {
|
|
142
173
|
const capped = Number.isFinite(cap) ? Math.trunc(cap) : 0;
|
|
143
|
-
return Math.max(0, Math.min(capped, policy.baseSendAllowance -
|
|
174
|
+
return Math.max(0, Math.min(capped, policy.baseSendAllowance - spent));
|
|
144
175
|
},
|
|
145
176
|
reserveDispatch(intent: DispatchIntent): DispatchDecision {
|
|
146
177
|
if (intent.replaySafe === false) return { allowed: false, reason: "not-replay-safe" };
|
|
147
|
-
if (
|
|
178
|
+
if (spent >= policy.maxTotalModelSends) return { allowed: false, reason: "total-exhausted" };
|
|
148
179
|
|
|
149
180
|
const changesTarget = lastTargetKey !== undefined && lastTargetKey !== intent.targetKey;
|
|
150
181
|
const isAlternateTarget = changesTarget || intent.sendClass === "account-failover"
|
|
@@ -159,7 +190,7 @@ export function createRequestExecutionBudget(
|
|
|
159
190
|
// The base allowance is spent first. Only once it is gone does a recovery class reach
|
|
160
191
|
// for the single shared reserve -- an account move and a validated rebuild cannot each
|
|
161
192
|
// take one.
|
|
162
|
-
const drawsReserve =
|
|
193
|
+
const drawsReserve = policy.baseSendAllowance - spent <= 0;
|
|
163
194
|
if (drawsReserve) {
|
|
164
195
|
if (!RESERVE_FUNDED_CLASSES.has(intent.sendClass)) {
|
|
165
196
|
return { allowed: false, reason: "base-allowance-exhausted" };
|
|
@@ -169,29 +200,47 @@ export function createRequestExecutionBudget(
|
|
|
169
200
|
}
|
|
170
201
|
}
|
|
171
202
|
|
|
172
|
-
|
|
203
|
+
// THE RESERVATION IS THE CHARGE. Deciding here and charging in `use()` left a window in
|
|
204
|
+
// which two legs read the same remainder, both received a permit, and both dispatched:
|
|
205
|
+
// one remaining send admitted two physical sends, which is the per-request multiplication
|
|
206
|
+
// this budget exists to stop. Everything is booked now; `release()` is the way back.
|
|
207
|
+
const previousTargetKey = lastTargetKey;
|
|
208
|
+
spent += 1;
|
|
209
|
+
if (intent.countedExternally === true) pendingExternalSends += 1;
|
|
210
|
+
if (drawsReserve) reserveSpent = true;
|
|
211
|
+
if (isAlternateTarget) alternateTargetSends += 1;
|
|
212
|
+
if (changesTarget) targetTransitions += 1;
|
|
213
|
+
lastTargetKey = intent.targetKey;
|
|
214
|
+
|
|
215
|
+
let settled: "open" | "used" | "released" = "open";
|
|
173
216
|
return {
|
|
174
217
|
allowed: true,
|
|
175
218
|
permit: {
|
|
176
219
|
sendClass: intent.sendClass,
|
|
177
220
|
use(): boolean {
|
|
178
|
-
if (
|
|
179
|
-
|
|
180
|
-
// Charged here, immediately before the physical send, rather than reported after
|
|
181
|
-
// the helper returns: a counter that is only reconciled afterwards cannot stop two
|
|
182
|
-
// concurrent legs that both read the same remainder.
|
|
183
|
-
if (intent.countedExternally !== true) budget.used += 1;
|
|
184
|
-
if (drawsReserve) reserveSpent = true;
|
|
185
|
-
if (isAlternateTarget) alternateTargetSends += 1;
|
|
186
|
-
if (changesTarget) targetTransitions += 1;
|
|
187
|
-
lastTargetKey = intent.targetKey;
|
|
221
|
+
if (settled !== "open") return false;
|
|
222
|
+
settled = "used";
|
|
188
223
|
return true;
|
|
189
224
|
},
|
|
225
|
+
release(): void {
|
|
226
|
+
if (settled !== "open") return;
|
|
227
|
+
settled = "released";
|
|
228
|
+
// An externally counted reservation the reporter already settled paid for a send
|
|
229
|
+
// that physically happened. Refunding it would hand the request a free send back.
|
|
230
|
+
if (intent.countedExternally === true) {
|
|
231
|
+
if (pendingExternalSends === 0) return;
|
|
232
|
+
pendingExternalSends -= 1;
|
|
233
|
+
}
|
|
234
|
+
spent -= 1;
|
|
235
|
+
if (drawsReserve) reserveSpent = false;
|
|
236
|
+
if (isAlternateTarget) alternateTargetSends -= 1;
|
|
237
|
+
if (changesTarget) targetTransitions -= 1;
|
|
238
|
+
lastTargetKey = previousTargetKey;
|
|
239
|
+
},
|
|
190
240
|
},
|
|
191
241
|
};
|
|
192
242
|
},
|
|
193
243
|
};
|
|
194
|
-
if (lastTargetKey === undefined) lastTargetKey = undefined;
|
|
195
244
|
return budget;
|
|
196
245
|
}
|
|
197
246
|
|