@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
@@ -0,0 +1,176 @@
1
+ // Holds INV-AGENT-01 from structure/overview.md; keep the id here if this file is split or renamed.
2
+ import { slugsEquivalent } from "../../providers/slug-codec";
3
+ import { readCatalog, readCodexCatalogPath } from "./parsing";
4
+ import type { RawEntry } from "./parsing";
5
+ import { SUPPORTED_NATIVE_OPENAI_SLUGS } from "./metadata";
6
+ import { trustedAccountBoundNativeCatalogSlug } from "./account-models";
7
+ import { catalogEntryEfforts } from "./effort";
8
+
9
+ export const MAX_SPAWN_AGENT_MODEL_OVERRIDES = 5;
10
+
11
+ // Base for config.modelPickerOrder display priorities (#1649). modelPickerOrder is a DISPLAY-ONLY
12
+ // reordering of the Codex model picker: it rewrites a row's Codex-visible `priority` but not
13
+ // OpenCodex's natural-priority guidance window. Native Codex advertisements still follow the
14
+ // visible priority and can differ from that guidance window.
15
+ export const PICKER_ORDER_PRIORITY_BASE = 1_000;
16
+
17
+ // OpenCodex-private catalog field: the guidance candidate priority a row would have WITHOUT
18
+ // modelPickerOrder. Codex ignores unknown catalog fields (same as opencodex_catalog_kind), so this
19
+ // is invisible to Codex; effectiveSubagentRoster reads it to keep OpenCodex guidance candidates
20
+ // independent of display order. It does not freeze native advertisements. Absent on unmoved rows.
21
+ export const SPAWN_PRIORITY_FIELD = "opencodex_spawn_priority";
22
+
23
+ // OpenCodex-private catalog field: this row is listed but currently unable to serve (#1711).
24
+ // Codex ignores unknown catalog fields (same as opencodex_catalog_kind and the spawn priority
25
+ // above) and ensureStrictCatalogFields does not strip extras, so this is invisible to the native
26
+ // picker and cannot change what Codex offers. It never touches `visibility`.
27
+ export const CATALOG_INACTIVE_REASON_FIELD = "opencodex_inactive_reason";
28
+
29
+ export type SpawnAgentSurface = "v1" | "v2";
30
+
31
+ export type SubagentRosterExclusionReason =
32
+ | "missing_catalog_entry"
33
+ | "picker_hidden"
34
+ | "surface_incompatible"
35
+ | "outside_display_limit";
36
+
37
+ /**
38
+ * Whether a catalog entry may be offered as a V2 subagent model.
39
+ *
40
+ * Upstream changed this rule in codex-rs `6d4d9442c` ("Support leaf models in
41
+ * multi-agent v2"). `model_supports_multi_agent_backend`
42
+ * (core/src/tools/handlers/multi_agents_common.rs:36-42) now admits EVERY model
43
+ * except one explicitly marked `disabled`; the older `== Some(V2)` equality that
44
+ * `92938d880` introduced is gone.
45
+ *
46
+ * The field no longer answers "may I be a delegation target". It answers "does the
47
+ * CHILD get collaboration tools": `collab_tools_enabled`
48
+ * (core/src/tools/spec_plan.rs:599-610) grants a child recursive tools only when its
49
+ * own catalog value is exactly `Some(V2)`. The three-way distinction survives, but it
50
+ * now means eligible-recursive / eligible-LEAF / excluded:
51
+ *
52
+ * - `"v2"` -> eligible, and the child may itself delegate.
53
+ * - `"v1"` -> eligible LEAF worker. This is upstream's pin for `gpt-5.6-luna`
54
+ * (models-manager/models.json); excluding it here is exactly what
55
+ * kept Luna out of opencodex's roster.
56
+ * - absent/null -> eligible LEAF worker (routed or unpinned-native model).
57
+ * - `"disabled"` -> the sole capability-based exclusion.
58
+ *
59
+ * This is the roster filter only. Catalog STAMPING is a separate concern owned by
60
+ * `applyMultiAgentMode`, including the `keepNativeChatGptOnV1` policy (#1728) that
61
+ * keeps ChatGPT-native rows on `v1` so a native parent can still spawn a routed child
62
+ * despite backend-encrypted NEW_TASK bodies (#92). Recognizing those `v1` rows as
63
+ * eligible leaves here is what makes that policy usable, not a contradiction of it.
64
+ *
65
+ * Devlog: 260816_codexrs_multiagent_v2_and_history_perf/011 (C1), superseding the
66
+ * option-B decision in 260730_codex_rs_upstream_v2_live_handoff/060.
67
+ */
68
+ export function isEligibleV2SubagentEntry(entry: RawEntry): boolean {
69
+ return entry.multi_agent_version !== "disabled";
70
+ }
71
+
72
+ export interface EffectiveSubagentModel {
73
+ model: string;
74
+ efforts: string[];
75
+ }
76
+
77
+ export interface SubagentRosterExclusion {
78
+ configured: string;
79
+ reason: SubagentRosterExclusionReason;
80
+ catalogModel?: string;
81
+ }
82
+
83
+ export interface EffectiveSubagentRoster {
84
+ /** OpenCodex's natural-priority guidance projection, not captured native tool text. */
85
+ candidates: EffectiveSubagentModel[];
86
+ /** Configured models within that projection; exact-name eligibility is a separate check. */
87
+ advertised: EffectiveSubagentModel[];
88
+ excluded: SubagentRosterExclusion[];
89
+ }
90
+
91
+ export function configuredCatalogEntry(entries: readonly RawEntry[], configured: string): RawEntry | undefined {
92
+ return entries.find(entry => entry.slug === configured)
93
+ ?? entries.find(entry => typeof entry.slug === "string" && slugsEquivalent(configured, entry.slug));
94
+ }
95
+
96
+ function configuredSubagentModelMatchesEntry(configured: string, entry: RawEntry): boolean {
97
+ if (typeof entry.slug !== "string") return false;
98
+ if (slugsEquivalent(configured, entry.slug)) return true;
99
+ const nativeSlug = trustedAccountBoundNativeCatalogSlug(entry);
100
+ return !configured.includes("/")
101
+ && nativeSlug !== undefined
102
+ && SUPPORTED_NATIVE_OPENAI_SLUGS.has(nativeSlug)
103
+ && slugsEquivalent(configured, nativeSlug);
104
+ }
105
+
106
+ export function effectiveSubagentRoster(
107
+ configuredModels: readonly string[],
108
+ surface: SpawnAgentSurface,
109
+ catalogEntries?: readonly RawEntry[],
110
+ ): EffectiveSubagentRoster {
111
+ const configured = configuredModels
112
+ .filter(model => model.trim().length > 0)
113
+ .filter((model, index, all) =>
114
+ !all.slice(0, index).some(previous => slugsEquivalent(previous, model))
115
+ );
116
+ const entries = catalogEntries ?? readCatalog(readCodexCatalogPath())?.models ?? [];
117
+ const ordered = entries
118
+ .map((entry, index) => ({ entry, index }))
119
+ .filter(({ entry }) => typeof entry.slug === "string")
120
+ .filter(({ entry }) => entry.visibility === "list")
121
+ .filter(({ entry }) => surface !== "v2" || isEligibleV2SubagentEntry(entry))
122
+ .sort((left, right) => {
123
+ // OpenCodex guidance candidates rank by natural priority (SPAWN_PRIORITY_FIELD when present),
124
+ // so modelPickerOrder does not change this projection. Native tool advertisements differ. Rows the
125
+ // override did not move fall back to their Codex-visible `priority`.
126
+ const spawnPriorityOf = (entry: RawEntry): number => {
127
+ const spawn = entry[SPAWN_PRIORITY_FIELD];
128
+ if (typeof spawn === "number" && Number.isFinite(spawn)) return spawn;
129
+ return typeof entry.priority === "number" && Number.isFinite(entry.priority)
130
+ ? entry.priority : Number.MAX_SAFE_INTEGER;
131
+ };
132
+ const leftPriority = spawnPriorityOf(left.entry);
133
+ const rightPriority = spawnPriorityOf(right.entry);
134
+ return leftPriority - rightPriority || left.index - right.index;
135
+ })
136
+ .slice(0, MAX_SPAWN_AGENT_MODEL_OVERRIDES);
137
+ const orderedEntries = new Set(ordered.map(({ entry }) => entry));
138
+
139
+ const candidates = ordered.map(({ entry }) => ({
140
+ model: entry.slug as string,
141
+ efforts: catalogEntryEfforts(entry),
142
+ }));
143
+ const advertised = ordered
144
+ .filter(({ entry }) => configured.some(model => configuredSubagentModelMatchesEntry(model, entry)))
145
+ .map(({ entry }) => ({
146
+ model: entry.slug as string,
147
+ efforts: catalogEntryEfforts(entry),
148
+ }));
149
+ const excluded = configured.flatMap((model): SubagentRosterExclusion[] => {
150
+ const matchingEntries = entries.filter(entry => configuredSubagentModelMatchesEntry(model, entry));
151
+ if (matchingEntries.some(entry => orderedEntries.has(entry))) return [];
152
+ if (matchingEntries.length === 0) return [{ configured: model, reason: "missing_catalog_entry" }];
153
+ const visibleCompatible = matchingEntries.find(entry =>
154
+ entry.visibility === "list"
155
+ && (surface !== "v2" || isEligibleV2SubagentEntry(entry))
156
+ );
157
+ if (visibleCompatible) {
158
+ return [{
159
+ configured: model,
160
+ catalogModel: visibleCompatible.slug as string,
161
+ reason: "outside_display_limit",
162
+ }];
163
+ }
164
+ const visible = matchingEntries.find(entry => entry.visibility === "list");
165
+ if (visible) {
166
+ return [{
167
+ configured: model,
168
+ catalogModel: visible.slug as string,
169
+ reason: "surface_incompatible",
170
+ }];
171
+ }
172
+ const hidden = configuredCatalogEntry(entries, model) ?? matchingEntries[0]!;
173
+ return [{ configured: model, catalogModel: hidden.slug as string, reason: "picker_hidden" }];
174
+ });
175
+ return { candidates, advertised, excluded };
176
+ }