@bitkyc08/opencodex 2.55.0 → 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.
Files changed (167) hide show
  1. package/gui/dist/assets/{index-VuoiWj9J.js → index-D4zuyIxQ.js} +1 -1
  2. package/gui/dist/index.html +1 -1
  3. package/package.json +2 -1
  4. package/src/adapters/base.ts +21 -0
  5. package/src/adapters/cursor/transport-retry.ts +46 -1
  6. package/src/adapters/cursor.ts +4 -0
  7. package/src/adapters/kiro/adapter.ts +42 -1
  8. package/src/adapters/kiro-retry.ts +23 -4
  9. package/src/adapters/openai-chat/errors.ts +116 -0
  10. package/src/adapters/openai-chat/messages.ts +346 -0
  11. package/src/adapters/openai-chat/passthrough.ts +146 -0
  12. package/src/adapters/openai-chat/response-events.ts +117 -0
  13. package/src/adapters/openai-chat/tool-call-validation.ts +200 -0
  14. package/src/adapters/openai-chat/tool-schema.ts +477 -0
  15. package/src/adapters/openai-chat/wire.ts +50 -0
  16. package/src/adapters/openai-chat.ts +33 -1445
  17. package/src/adapters/openai-responses/canonical-forward.ts +202 -0
  18. package/src/adapters/openai-responses/image-gen.ts +406 -0
  19. package/src/adapters/openai-responses/internal.ts +3 -0
  20. package/src/adapters/openai-responses/passthrough.ts +611 -0
  21. package/src/adapters/openai-responses/prompt-cache.ts +83 -0
  22. package/src/adapters/openai-responses/reasoning.ts +220 -0
  23. package/src/adapters/openai-responses/request-strips.ts +185 -0
  24. package/src/adapters/openai-responses/tool-output-recovery.ts +509 -0
  25. package/src/adapters/openai-responses/tool-schema.ts +293 -0
  26. package/src/adapters/openai-responses/web-search.ts +156 -0
  27. package/src/adapters/openai-responses.ts +4 -2625
  28. package/src/bridge/errors.ts +34 -0
  29. package/src/bridge/internal.ts +174 -0
  30. package/src/bridge/response-json.ts +624 -0
  31. package/src/bridge/sse.ts +1444 -0
  32. package/src/bridge.ts +5 -2204
  33. package/src/chat/inbound.ts +12 -1
  34. package/src/codex/account-lifecycle.ts +3 -0
  35. package/src/codex/account-store.ts +71 -9
  36. package/src/codex/auth-api/account-list.ts +507 -0
  37. package/src/codex/auth-api/http.ts +32 -0
  38. package/src/codex/auth-api/login-flow.ts +554 -0
  39. package/src/codex/auth-api/login-state.ts +64 -0
  40. package/src/codex/auth-api/main-account-probe.ts +331 -0
  41. package/src/codex/auth-api/pool-mode-gate.ts +274 -0
  42. package/src/codex/auth-api/pool-quota-probe.ts +512 -0
  43. package/src/codex/auth-api/reset-credit-service.ts +422 -0
  44. package/src/codex/auth-api/routes.ts +425 -0
  45. package/src/codex/auth-api/runtime-config.ts +48 -0
  46. package/src/codex/auth-api.ts +27 -3118
  47. package/src/codex/auth-context.ts +95 -28
  48. package/src/codex/catalog/auto-review.ts +507 -0
  49. package/src/codex/catalog/build-entries.ts +981 -0
  50. package/src/codex/catalog/combo-member.ts +375 -0
  51. package/src/codex/catalog/derive-entry.ts +229 -0
  52. package/src/codex/catalog/effort.ts +0 -1
  53. package/src/codex/catalog/gated-native-warn.ts +63 -0
  54. package/src/codex/catalog/gather-capture.ts +533 -0
  55. package/src/codex/catalog/model-hints.ts +691 -0
  56. package/src/codex/catalog/model-visibility.ts +304 -0
  57. package/src/codex/catalog/provider-fetch.ts +52 -2942
  58. package/src/codex/catalog/provider-models.ts +685 -0
  59. package/src/codex/catalog/restore.ts +132 -0
  60. package/src/codex/catalog/retained-sync.ts +706 -0
  61. package/src/codex/catalog/routed-gather.ts +858 -0
  62. package/src/codex/catalog/subagent-roster.ts +176 -0
  63. package/src/codex/catalog/sync.ts +52 -2698
  64. package/src/codex/inject/config-toml.ts +563 -0
  65. package/src/codex/inject/remove.ts +192 -0
  66. package/src/codex/inject/restore.ts +540 -0
  67. package/src/codex/inject/routing-classify.ts +109 -0
  68. package/src/codex/inject/routing-target.ts +125 -0
  69. package/src/codex/inject.ts +81 -1436
  70. package/src/codex/lineage.ts +458 -0
  71. package/src/codex/pool-refresh-backoff.ts +152 -0
  72. package/src/codex/routing/active-account.ts +194 -0
  73. package/src/codex/routing/cooldown-math.ts +275 -0
  74. package/src/codex/routing/health-store.ts +402 -0
  75. package/src/codex/routing/probe-lease.ts +358 -0
  76. package/src/codex/routing/selection.ts +703 -0
  77. package/src/codex/routing/thread-affinity.ts +538 -0
  78. package/src/codex/routing.ts +353 -2234
  79. package/src/codex/shim-fingerprint.ts +223 -0
  80. package/src/codex/shim-inspect.ts +175 -0
  81. package/src/codex/shim-probe.ts +367 -0
  82. package/src/codex/shim-restore-lock.ts +169 -0
  83. package/src/codex/shim-state-file.ts +151 -0
  84. package/src/codex/shim-templates.ts +265 -0
  85. package/src/codex/shim.ts +48 -1268
  86. package/src/config/diagnostics.ts +705 -0
  87. package/src/config/feature-flags.ts +55 -0
  88. package/src/config/live-reconcile.ts +403 -0
  89. package/src/config/load-degrade.ts +880 -0
  90. package/src/config/mutation-lock.ts +244 -0
  91. package/src/config/openai-tier-backup.ts +268 -0
  92. package/src/config/persist-unlocked.ts +92 -0
  93. package/src/config/proxy-env.ts +188 -0
  94. package/src/config/salvage.ts +244 -0
  95. package/src/config/schema/config-schema.ts +640 -0
  96. package/src/config/schema/leaf-validators.ts +855 -0
  97. package/src/config/warn-memo.ts +28 -0
  98. package/src/config.ts +234 -4481
  99. package/src/generated/compatibility-version.json +539 -39
  100. package/src/lib/request-execution-budget.ts +69 -20
  101. package/src/lib/spend-reservation-ledger.ts +940 -0
  102. package/src/lib/upstream-retry.ts +55 -11
  103. package/src/lib/workflow-budget.ts +553 -30
  104. package/src/providers/quota/account-cache.ts +441 -0
  105. package/src/providers/quota/antigravity.ts +295 -0
  106. package/src/providers/quota/report-cache.ts +320 -0
  107. package/src/providers/quota/vendor-probes-key.ts +1243 -0
  108. package/src/providers/quota/vendor-probes-oauth.ts +590 -0
  109. package/src/providers/quota.ts +324 -3079
  110. package/src/providers/registry/entries-core.ts +1221 -0
  111. package/src/providers/registry/entries-extended.ts +1204 -0
  112. package/src/providers/registry/model-seeds.ts +908 -0
  113. package/src/providers/registry/types.ts +352 -0
  114. package/src/providers/registry.ts +24 -3536
  115. package/src/responses/continuation-ownership.ts +29 -0
  116. package/src/responses/state/replay-fingerprint.ts +80 -0
  117. package/src/responses/state/snapshot-codec.ts +104 -0
  118. package/src/responses/state/spill-failure.ts +118 -0
  119. package/src/responses/state/spill-queue.ts +665 -0
  120. package/src/responses/state/temp-recovery.ts +257 -0
  121. package/src/responses/state.ts +82 -1143
  122. package/src/routing/identity-domains.ts +449 -0
  123. package/src/routing/probe-lease.ts +511 -0
  124. package/src/server/index/bounded-request.ts +88 -0
  125. package/src/server/index/live-sideband.ts +565 -0
  126. package/src/server/index/serve-options.ts +1766 -0
  127. package/src/server/index/startup-warnings.ts +213 -0
  128. package/src/server/index/websocket-handler.ts +335 -0
  129. package/src/server/index.ts +40 -2547
  130. package/src/server/management/route-registry.ts +26 -23
  131. package/src/server/management/shared.ts +8 -5
  132. package/src/server/management/workflow-budget-routes.ts +133 -0
  133. package/src/server/management-api.ts +12 -0
  134. package/src/server/request-log-conversation.ts +9 -7
  135. package/src/server/request-log.ts +245 -1
  136. package/src/server/responses/account-change-state.ts +233 -0
  137. package/src/server/responses/adapter-continuation.ts +514 -0
  138. package/src/server/responses/adapter-delivery.ts +214 -0
  139. package/src/server/responses/adapter-dispatch.ts +971 -0
  140. package/src/server/responses/compact.ts +59 -4
  141. package/src/server/responses/completion-policy.ts +33 -0
  142. package/src/server/responses/core-auth.ts +527 -0
  143. package/src/server/responses/core-codex-account.ts +859 -0
  144. package/src/server/responses/core-combo-failure.ts +210 -0
  145. package/src/server/responses/core-combo.ts +707 -0
  146. package/src/server/responses/core-errors.ts +152 -0
  147. package/src/server/responses/core-lifetime.ts +95 -0
  148. package/src/server/responses/core-normalize.ts +350 -0
  149. package/src/server/responses/core-opaque-recovery.ts +380 -0
  150. package/src/server/responses/core-options.ts +159 -0
  151. package/src/server/responses/core-replay.ts +225 -0
  152. package/src/server/responses/core.ts +192 -8893
  153. package/src/server/responses/passthrough-delivery.ts +856 -0
  154. package/src/server/responses/passthrough-dispatch.ts +1476 -0
  155. package/src/server/responses/passthrough-execution.ts +54 -0
  156. package/src/server/responses/request-prepare.ts +970 -0
  157. package/src/server/responses/request-send-budget.ts +164 -0
  158. package/src/server/responses/request-sidecar-auth.ts +149 -0
  159. package/src/server/responses/request-transport.ts +744 -0
  160. package/src/server/responses/response-effects.ts +157 -0
  161. package/src/server/responses/run-turn-execution.ts +448 -0
  162. package/src/server/responses/sidecar-execution.ts +469 -0
  163. package/src/server/responses-image-gen-repair.ts +1 -1
  164. package/src/server/workflow-refusal.ts +84 -0
  165. package/src/types/config.ts +30 -0
  166. package/src/usage/log.ts +146 -0
  167. 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 permit then books the reserve, alternate-target and
76
- * transition ledgers but leaves `used` to that reporter, because charging both is how a
77
- * four-send cap silently becomes a two-send cap.
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
- /** Consume exactly once. A second call returns false and charges nothing. */
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: 0,
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 - budget.used));
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 (budget.used >= policy.maxTotalModelSends) return { allowed: false, reason: "total-exhausted" };
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 = budget.remainingBaseSends(policy.baseSendAllowance) === 0;
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
- let consumed = false;
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 (consumed) return false;
179
- consumed = true;
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