@bitkyc08/opencodex 2.84.0 → 2.87.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 (518) hide show
  1. package/README.md +0 -4
  2. package/bin/ocx.mjs +61 -3
  3. package/gui/dist/assets/App-ZfYbLHkB.js +58 -0
  4. package/gui/dist/assets/App-wT3mXqFz.css +1 -0
  5. package/gui/dist/assets/{Tray-C9TGtwad.js → Tray-DCd-A1az.js} +1 -1
  6. package/gui/dist/assets/index-CfYDMj34.js +94 -0
  7. package/gui/dist/assets/index-DPeB9HpV.css +1 -0
  8. package/gui/dist/assets/quota-summary-ChvmKGOk.js +1 -0
  9. package/gui/dist/index.html +2 -2
  10. package/package.json +1 -2
  11. package/src/adapters/anthropic/beta-allowlist.ts +91 -11
  12. package/src/adapters/anthropic/beta-body-pairs.ts +93 -0
  13. package/src/adapters/anthropic/client-identity.ts +1 -1
  14. package/src/adapters/anthropic/passthrough.ts +16 -3
  15. package/src/adapters/anthropic-progress.ts +84 -0
  16. package/src/adapters/anthropic.ts +108 -21
  17. package/src/adapters/azure.ts +19 -1
  18. package/src/adapters/base.ts +2 -0
  19. package/src/adapters/claude-cli/adapter.ts +111 -23
  20. package/src/adapters/claude-cli/profiles.ts +2 -1
  21. package/src/adapters/claude-cli/stable-replay.ts +108 -0
  22. package/src/adapters/claude-cli/usage-admission.ts +230 -0
  23. package/src/adapters/client-fingerprint.ts +24 -0
  24. package/src/adapters/coding-agent/protocol.ts +1 -1
  25. package/src/adapters/coding-agent/turn.ts +40 -11
  26. package/src/adapters/cursor/arg-codec.ts +17 -5
  27. package/src/adapters/cursor/catalog.ts +8 -0
  28. package/src/adapters/cursor/effort-map.ts +3 -0
  29. package/src/adapters/cursor/freeform-args.ts +75 -0
  30. package/src/adapters/cursor/protobuf-events.ts +36 -23
  31. package/src/adapters/dsh-account.ts +97 -0
  32. package/src/adapters/google-antigravity-wire.ts +22 -1
  33. package/src/adapters/google.ts +37 -10
  34. package/src/adapters/openai-chat/messages.ts +4 -3
  35. package/src/adapters/openai-chat/passthrough.ts +8 -2
  36. package/src/adapters/openai-chat/reasoning-replay.ts +52 -0
  37. package/src/adapters/openai-chat/response-events.ts +59 -1
  38. package/src/adapters/openai-chat.ts +8 -5
  39. package/src/adapters/openai-responses/compaction-search-history.ts +14 -7
  40. package/src/adapters/openai-responses/passthrough.ts +57 -125
  41. package/src/adapters/openai-responses/request-strips.ts +25 -3
  42. package/src/adapters/openai-responses/transport.ts +81 -0
  43. package/src/adapters/qoder/adapter.ts +44 -3
  44. package/src/adapters/registry.ts +5 -0
  45. package/src/adapters/zed.ts +26 -1
  46. package/src/advisor/activity.ts +55 -0
  47. package/src/advisor/budget.ts +62 -0
  48. package/src/advisor/consult.ts +223 -0
  49. package/src/advisor/context.ts +238 -0
  50. package/src/advisor/disclosure.ts +20 -0
  51. package/src/advisor/evidence-tool.ts +21 -0
  52. package/src/advisor/evidence.ts +117 -0
  53. package/src/advisor/runtime.ts +353 -0
  54. package/src/advisor/settings.ts +144 -0
  55. package/src/advisor/state.ts +369 -0
  56. package/src/advisor/synthetic-tool.ts +33 -0
  57. package/src/bridge/errors.ts +24 -1
  58. package/src/bridge/internal.ts +3 -1
  59. package/src/bridge/response-json.ts +18 -3
  60. package/src/bridge/sse.ts +58 -8
  61. package/src/bridge/terminal-refusal.ts +59 -0
  62. package/src/chat/inbound.ts +30 -6
  63. package/src/chat/outbound.ts +5 -0
  64. package/src/claude/desktop-3p-library.ts +72 -7
  65. package/src/claude/desktop-3p.ts +75 -19
  66. package/src/claude/desktop-first-party.ts +1 -1
  67. package/src/claude/desktop-picker-platform.ts +4 -0
  68. package/src/claude/desktop-picker-profile.ts +11 -4
  69. package/src/claude/desktop-picker.ts +15 -8
  70. package/src/claude/desktop-profile.ts +10 -1
  71. package/src/claude/desktop-remote-store-io.ts +5 -3
  72. package/src/claude/desktop-system-proxy.ts +50 -4
  73. package/src/claude/inbound-content-options.ts +11 -0
  74. package/src/claude/inbound.ts +154 -50
  75. package/src/claude/intercept/local-ca.ts +8 -1
  76. package/src/claude/intercept/picker-ca-startup.ts +2 -1
  77. package/src/claude/intercept/picker-runtime.ts +6 -5
  78. package/src/claude/intercept/picker-trust-windows.ts +338 -0
  79. package/src/claude/intercept/picker-trust.ts +19 -0
  80. package/src/claude/intercept/port-policy.ts +30 -0
  81. package/src/claude/intercept/runtime.ts +97 -94
  82. package/src/claude/model-default-settings.ts +154 -0
  83. package/src/claude/model-info.ts +7 -7
  84. package/src/claude/outbound.ts +51 -19
  85. package/src/cli/account-api.ts +1 -0
  86. package/src/cli/account-policy-dto.ts +6 -0
  87. package/src/cli/account-policy.ts +34 -5
  88. package/src/cli/account-preservation.ts +44 -0
  89. package/src/cli/account.ts +8 -2
  90. package/src/cli/advisor.ts +165 -0
  91. package/src/cli/auxiliary-listener-preflight.ts +37 -0
  92. package/src/cli/capabilities-accounts.ts +20 -1
  93. package/src/cli/capabilities-agents-routing.ts +23 -2
  94. package/src/cli/capabilities-base.ts +39 -11
  95. package/src/cli/capabilities-observe-system.ts +63 -3
  96. package/src/cli/capabilities-provider-models.ts +11 -0
  97. package/src/cli/chatgpt-command.ts +35 -14
  98. package/src/cli/claude.ts +46 -6
  99. package/src/cli/codex-cli-update.ts +151 -41
  100. package/src/cli/codex-provider.ts +44 -0
  101. package/src/cli/combo-input.ts +10 -1
  102. package/src/cli/combo-result.ts +1 -1
  103. package/src/cli/combo.ts +2 -1
  104. package/src/cli/cross-home-owner.ts +17 -14
  105. package/src/cli/dispatch.ts +30 -5
  106. package/src/cli/doctor.ts +15 -1
  107. package/src/cli/ensure-desktop-cold-start.ts +382 -0
  108. package/src/cli/export-command.ts +1 -1
  109. package/src/cli/help.ts +4 -2
  110. package/src/cli/index.ts +14 -5
  111. package/src/cli/integration-plan-dto.ts +3 -0
  112. package/src/cli/log-history.ts +172 -0
  113. package/src/cli/models-runtime-subcommands.ts +1 -0
  114. package/src/cli/models-runtime.ts +72 -8
  115. package/src/cli/observe-stream.ts +2 -0
  116. package/src/cli/observe.ts +16 -4
  117. package/src/cli/provider.ts +27 -5
  118. package/src/cli/registry.ts +41 -9
  119. package/src/cli/restart-scope.ts +3 -1
  120. package/src/cli/runtime-api.ts +5 -3
  121. package/src/cli/system-command.ts +40 -8
  122. package/src/cli/uninstall-client-state.ts +32 -0
  123. package/src/cli/usage-compare.ts +309 -0
  124. package/src/cli/usage-model-search.ts +4 -4
  125. package/src/cli/usage-report.ts +2 -2
  126. package/src/cli/v2.ts +1 -1
  127. package/src/client/machine-listener.ts +1 -3
  128. package/src/client/runtime.ts +1 -0
  129. package/src/clients/client-path.ts +51 -0
  130. package/src/clients/config-export/contracts.ts +3 -1
  131. package/src/clients/config-export/model-metadata.ts +3 -2
  132. package/src/clients/config-export/qoder.ts +93 -0
  133. package/src/clients/config-export.ts +35 -48
  134. package/src/clients/gentle-shell-path.ts +87 -0
  135. package/src/codex/account-auto-switch.ts +2 -0
  136. package/src/codex/account-identity.ts +29 -0
  137. package/src/codex/account-label.ts +1 -1
  138. package/src/codex/account-lifecycle.ts +21 -5
  139. package/src/codex/account-preservation.ts +28 -0
  140. package/src/codex/account-use-remaining.ts +23 -0
  141. package/src/codex/app-server-processes.ts +97 -7
  142. package/src/codex/app-server-restart-service.ts +55 -4
  143. package/src/codex/auth-api/account-list.ts +4 -0
  144. package/src/codex/auth-api/account-pause-group.ts +6 -50
  145. package/src/codex/auth-api/account-preservation.ts +57 -0
  146. package/src/codex/auth-api/pool-mode-gate.ts +5 -2
  147. package/src/codex/auth-api/routes.ts +8 -0
  148. package/src/codex/auth-api/use-remaining-route.ts +36 -0
  149. package/src/codex/auth-api.ts +0 -1
  150. package/src/codex/auth-context.ts +81 -7
  151. package/src/codex/autostart-health.ts +4 -0
  152. package/src/codex/catalog/auto-review.ts +20 -3
  153. package/src/codex/catalog/build-entries.ts +19 -2
  154. package/src/codex/catalog/combo-member.ts +14 -5
  155. package/src/codex/catalog/configured-tiers.ts +50 -0
  156. package/src/codex/catalog/effort.ts +4 -1
  157. package/src/codex/catalog/gather-capture.ts +2 -0
  158. package/src/codex/catalog/metadata.ts +11 -9
  159. package/src/codex/catalog/model-hints.ts +42 -19
  160. package/src/codex/catalog/model-visibility.ts +3 -1
  161. package/src/codex/catalog/native-ultrafast.ts +106 -0
  162. package/src/codex/catalog/parsing.ts +35 -86
  163. package/src/codex/catalog/provider-models.ts +40 -34
  164. package/src/codex/catalog/retained-sync.ts +2 -0
  165. package/src/codex/catalog/routed-gather.ts +33 -16
  166. package/src/codex/catalog/vendor-context.ts +82 -0
  167. package/src/codex/cli-install-provenance.ts +105 -17
  168. package/src/codex/cli-update-plan.ts +545 -0
  169. package/src/codex/config-write-lock.ts +63 -4
  170. package/src/codex/convergence.ts +2 -0
  171. package/src/codex/desktop-app/picker-freshness.ts +96 -0
  172. package/src/codex/desktop-app/types.ts +2 -0
  173. package/src/codex/desktop-app/windows.ts +29 -16
  174. package/src/codex/desktop-app-restart.ts +25 -2
  175. package/src/codex/desktop-compatibility/certificate-service.ts +99 -0
  176. package/src/codex/desktop-compatibility/certificate-store.ts +193 -0
  177. package/src/codex/desktop-compatibility/connection-store.ts +87 -0
  178. package/src/codex/desktop-compatibility/installed-build.ts +73 -0
  179. package/src/codex/desktop-compatibility/json-body.ts +29 -0
  180. package/src/codex/desktop-compatibility/native-identity.ts +62 -0
  181. package/src/codex/desktop-compatibility/relay-listener.ts +93 -0
  182. package/src/codex/desktop-compatibility/routing-binding.ts +10 -0
  183. package/src/codex/desktop-compatibility/routing-preflight.ts +69 -0
  184. package/src/codex/desktop-compatibility/runtime-ownership.ts +28 -0
  185. package/src/codex/desktop-compatibility/runtime.ts +182 -0
  186. package/src/codex/desktop-compatibility/service.ts +30 -0
  187. package/src/codex/desktop-compatibility/startup-settings.ts +50 -0
  188. package/src/codex/desktop-compatibility/usage-activation.ts +86 -0
  189. package/src/codex/desktop-compatibility/usage-controlled-fetch.ts +59 -0
  190. package/src/codex/desktop-compatibility/usage-controller.ts +107 -0
  191. package/src/codex/desktop-compatibility/usage-policy.ts +59 -0
  192. package/src/codex/desktop-compatibility/usage-refresh.ts +33 -0
  193. package/src/codex/desktop-compatibility/usage-sse-controller.ts +86 -0
  194. package/src/codex/desktop-compatibility/windows-activation-source.ts +44 -0
  195. package/src/codex/desktop-compatibility/windows-certificate-trust.ts +81 -0
  196. package/src/codex/desktop-compatibility/windows-key-protection.ts +165 -0
  197. package/src/codex/desktop-compatibility/windows-package-command.ts +86 -0
  198. package/src/codex/desktop-compatibility/windows-package-launch.ts +28 -0
  199. package/src/codex/features.ts +85 -45
  200. package/src/codex/history-provider.ts +1 -1
  201. package/src/codex/inject/config-write-section.ts +4 -1
  202. package/src/codex/inject/history-failure.ts +27 -0
  203. package/src/codex/inject/remove.ts +18 -6
  204. package/src/codex/inject/restore.ts +24 -2
  205. package/src/codex/inject/routing-classify.ts +4 -3
  206. package/src/codex/inject.ts +18 -27
  207. package/src/codex/journal.ts +16 -1
  208. package/src/codex/main-account-hard-lock.ts +30 -1
  209. package/src/codex/main-account.ts +99 -15
  210. package/src/codex/native-main-refresh-mode.ts +217 -0
  211. package/src/codex/native-profile-startup.ts +1 -1
  212. package/src/codex/ocx-compaction-history.ts +12 -10
  213. package/src/codex/paths.ts +86 -1
  214. package/src/codex/provider-routing.ts +174 -0
  215. package/src/codex/refresh.ts +2 -2
  216. package/src/codex/routing/health-store.ts +2 -2
  217. package/src/codex/routing/pool-recovery.ts +79 -0
  218. package/src/codex/routing/selection.ts +4 -3
  219. package/src/codex/routing/thread-affinity.ts +1 -1
  220. package/src/codex/shim-diagnostics.ts +6 -0
  221. package/src/codex/shim-overlay.ts +7 -2
  222. package/src/codex/signed-in-identity.ts +43 -0
  223. package/src/codex/subagent-model-fallback.ts +1 -1
  224. package/src/codex/sync.ts +6 -1
  225. package/src/codex/user-identity.ts +16 -5
  226. package/src/codex/windows-local-appdata.ts +84 -0
  227. package/src/combos/failover.ts +6 -1
  228. package/src/combos/index.ts +1 -0
  229. package/src/combos/resolve.ts +46 -10
  230. package/src/combos/types.ts +15 -0
  231. package/src/config/diagnostics.ts +35 -7
  232. package/src/config/live-reconcile.ts +51 -2
  233. package/src/config/load-degrade.ts +23 -1
  234. package/src/config/opencode-wire-upgrade.ts +54 -0
  235. package/src/config/opencode-zen-upgrade.ts +52 -0
  236. package/src/config/owner-registry.ts +22 -17
  237. package/src/config/paths.ts +10 -3
  238. package/src/config/provider-validation.ts +45 -2
  239. package/src/config/schema/config-schema.ts +39 -0
  240. package/src/config/schema/desktop-compatibility.ts +9 -0
  241. package/src/config/schema/leaf-validators.ts +39 -9
  242. package/src/config/schema/main-account-hard-lock-fallback.ts +26 -0
  243. package/src/config/schema/native-reasoning-retention.ts +26 -0
  244. package/src/config.ts +2 -0
  245. package/src/generated/compatibility-version.json +962 -350
  246. package/src/generated/model-metadata.ts +1 -1
  247. package/src/grok/sync.ts +1 -1
  248. package/src/images/loop.ts +46 -8
  249. package/src/integrations/catalog-refresh.ts +1 -1
  250. package/src/integrations/config-io.ts +20 -2
  251. package/src/integrations/journal.ts +15 -1
  252. package/src/integrations/mutation-plan.ts +2 -0
  253. package/src/integrations/registry.ts +15 -0
  254. package/src/integrations/store.ts +3 -0
  255. package/src/integrations/writer.ts +10 -1
  256. package/src/lib/advisor-activation.ts +16 -0
  257. package/src/lib/background-work.ts +65 -0
  258. package/src/lib/bounded-file-read.ts +58 -0
  259. package/src/lib/bun-path-runtime.d.mts +10 -1
  260. package/src/lib/bun-path-runtime.mjs +62 -3
  261. package/src/lib/codex-restart-contract.ts +15 -0
  262. package/src/lib/desktop-proxy-route.ts +30 -0
  263. package/src/lib/desktop-upstream-tunnel.ts +72 -0
  264. package/src/lib/empty-tool-catalog.ts +62 -0
  265. package/src/lib/errors.ts +26 -3
  266. package/src/lib/gcp-adc.ts +96 -9
  267. package/src/lib/gcp-credential-input.ts +12 -0
  268. package/src/lib/lab-live-route-production.ts +5 -0
  269. package/src/lib/local-internal-call-capability.ts +55 -0
  270. package/src/lib/opaque-proxy-tunnel.ts +217 -0
  271. package/src/lib/package-tree-integrity.ts +2 -2
  272. package/src/lib/redact.ts +2 -2
  273. package/src/lib/socks5-fetch.ts +48 -71
  274. package/src/lib/socks5-handshake.ts +112 -0
  275. package/src/lib/translator-budget.ts +7 -1
  276. package/src/oauth/account-quota-rank.ts +69 -2
  277. package/src/oauth/anthropic-account-refusal.ts +20 -2
  278. package/src/oauth/anthropic-oauth-definitions.ts +3 -1
  279. package/src/oauth/anthropic-routing.ts +1 -21
  280. package/src/oauth/anthropic.ts +38 -7
  281. package/src/oauth/callback-server.ts +27 -1
  282. package/src/oauth/chatgpt-device.ts +1 -1
  283. package/src/oauth/chatgpt-shared.ts +83 -0
  284. package/src/oauth/chatgpt.ts +8 -72
  285. package/src/oauth/dsh.ts +203 -0
  286. package/src/oauth/generic-account-failover.ts +62 -12
  287. package/src/oauth/generic-session-affinity.ts +125 -0
  288. package/src/oauth/index.ts +188 -111
  289. package/src/oauth/kiro-device-login.ts +2 -1
  290. package/src/oauth/kiro.ts +7 -1
  291. package/src/oauth/local-token-detect.ts +21 -1
  292. package/src/oauth/login-cli-errors.ts +44 -0
  293. package/src/oauth/login-cli.ts +69 -7
  294. package/src/oauth/login-flow-state.ts +371 -23
  295. package/src/oauth/meta-muse-errors.ts +41 -0
  296. package/src/oauth/meta-muse-keychain.ts +52 -0
  297. package/src/oauth/meta-muse.ts +51 -84
  298. package/src/oauth/model-discovery-auth.ts +3 -0
  299. package/src/oauth/pool-settings-capability.ts +4 -2
  300. package/src/oauth/refresh-flight-retirement.ts +48 -0
  301. package/src/oauth/session-affinity-key.ts +23 -0
  302. package/src/oauth/store-anthropic-instance.ts +9 -2
  303. package/src/oauth/store.ts +12 -5
  304. package/src/protocols/codecs/chat-ir.ts +467 -0
  305. package/src/protocols/codecs/chat.ts +10 -1
  306. package/src/protocols/codecs/messages-ir.ts +500 -0
  307. package/src/protocols/encoders/adapter-events.ts +5 -4
  308. package/src/protocols/encoders/messages.ts +9 -6
  309. package/src/protocols/features.ts +10 -2
  310. package/src/protocols/path.ts +11 -1
  311. package/src/protocols/plan-snapshot.ts +39 -16
  312. package/src/protocols/plan.ts +9 -1
  313. package/src/protocols/provider-summary.ts +2 -1
  314. package/src/protocols/settings.ts +8 -0
  315. package/src/providers/antigravity-account-roster.ts +102 -0
  316. package/src/providers/antigravity-models.ts +85 -7
  317. package/src/providers/api-key-cooldowns.ts +49 -0
  318. package/src/providers/api-key-resolve.ts +11 -6
  319. package/src/providers/api-key-response-ownership.ts +57 -0
  320. package/src/providers/api-key-selection.ts +31 -6
  321. package/src/providers/api-keys.ts +214 -3
  322. package/src/providers/claude-cli-usage.ts +96 -0
  323. package/src/providers/dsh-account-destination.ts +31 -0
  324. package/src/providers/dsh-account-models.ts +41 -0
  325. package/src/providers/gcp-credential-cleanup.ts +59 -0
  326. package/src/providers/key-failover.ts +54 -50
  327. package/src/providers/key-store.ts +7 -2
  328. package/src/providers/model-rename-fields.ts +5 -0
  329. package/src/providers/model-rename-migration.ts +7 -5
  330. package/src/providers/openai-tiers-destination.ts +11 -2
  331. package/src/providers/openai-tiers.ts +5 -12
  332. package/src/providers/opencode-go-transport.ts +3 -1
  333. package/src/providers/quota/account-cache.ts +6 -5
  334. package/src/providers/quota/account-row.ts +34 -0
  335. package/src/providers/quota/antigravity.ts +28 -7
  336. package/src/providers/quota/dsh-account.ts +70 -0
  337. package/src/providers/quota/vendor-probes-oauth.ts +1 -93
  338. package/src/providers/quota-types.ts +2 -0
  339. package/src/providers/quota.ts +14 -20
  340. package/src/providers/registry/entries-core.ts +44 -14
  341. package/src/providers/registry/entries-extended.ts +19 -0
  342. package/src/providers/registry/types.ts +1 -1
  343. package/src/providers/request-pacing.ts +77 -19
  344. package/src/providers/routed-config.ts +339 -0
  345. package/src/providers/service-tier.ts +2 -1
  346. package/src/quota/window-mapping.ts +5 -2
  347. package/src/responses/anthropic-progress.ts +34 -0
  348. package/src/responses/assistant-replay.ts +35 -0
  349. package/src/responses/compaction-history-framing.ts +65 -0
  350. package/src/responses/compaction.ts +6 -1
  351. package/src/responses/incomplete-reason.ts +31 -0
  352. package/src/responses/parser.ts +78 -22
  353. package/src/responses/reasoning-envelope.ts +4 -0
  354. package/src/responses/reasoning-replay-cache.ts +24 -2
  355. package/src/responses/reasoning-retention.ts +173 -0
  356. package/src/responses/retained-compaction.ts +46 -0
  357. package/src/responses/schema.ts +23 -0
  358. package/src/responses/state.ts +32 -29
  359. package/src/router.ts +8 -321
  360. package/src/routing/health.ts +37 -22
  361. package/src/routing/history/build-file.ts +92 -0
  362. package/src/routing/history/indexer.ts +254 -221
  363. package/src/routing/history/ingest.ts +242 -0
  364. package/src/routing/history/rebuild-job.ts +111 -0
  365. package/src/routing/history/rebuild-protocol.ts +15 -0
  366. package/src/routing/history/rebuild-worker.ts +34 -0
  367. package/src/routing/profile.ts +1 -1
  368. package/src/server/admission-model-scope.ts +21 -1
  369. package/src/server/antigravity-direct-eligibility.ts +208 -0
  370. package/src/server/auth-cors.ts +15 -0
  371. package/src/server/chat-completions.ts +82 -10
  372. package/src/server/chat-native-reasoning.ts +123 -0
  373. package/src/server/chat-native-sse.ts +110 -7
  374. package/src/server/chat-native.ts +76 -17
  375. package/src/server/claude-messages.ts +164 -433
  376. package/src/server/effort-policy.ts +1 -1
  377. package/src/server/images.ts +15 -2
  378. package/src/server/index/desktop-compatibility-startup.ts +56 -0
  379. package/src/server/index/model-alias-id.ts +36 -0
  380. package/src/server/index/optional-listeners.ts +2 -0
  381. package/src/server/index/serve-options.ts +11 -3
  382. package/src/server/index/startup-warnings.ts +11 -0
  383. package/src/server/index/websocket-handler.ts +9 -0
  384. package/src/server/index.ts +14 -11
  385. package/src/server/inference/advisor-diagnostics.ts +31 -0
  386. package/src/server/inference/client-encoder-delivery.ts +6 -5
  387. package/src/server/login-shell-path.ts +146 -0
  388. package/src/server/management/advisor-routes.ts +202 -0
  389. package/src/server/management/agent-settings-routes.ts +22 -4
  390. package/src/server/management/claude-desktop-picker-routes.ts +1 -1
  391. package/src/server/management/combo-routes.ts +176 -50
  392. package/src/server/management/companion-routes.ts +4 -0
  393. package/src/server/management/config-routes.ts +77 -6
  394. package/src/server/management/context.ts +4 -0
  395. package/src/server/management/cursor-integration-routes.ts +1 -1
  396. package/src/server/management/desktop-compatibility-routes.ts +46 -0
  397. package/src/server/management/desktop-compatibility-runtime-routes.ts +46 -0
  398. package/src/server/management/desktop-compatibility-settings-routes.ts +27 -0
  399. package/src/server/management/model-routes.ts +13 -8
  400. package/src/server/management/model-rows.ts +14 -0
  401. package/src/server/management/native-integration-routes.ts +2 -7
  402. package/src/server/management/native-reasoning-retention-routes.ts +41 -0
  403. package/src/server/management/oauth-account-routes.ts +87 -14
  404. package/src/server/management/protocol-settings-patch.ts +1 -0
  405. package/src/server/management/provider-gcp-credential-routes.ts +29 -0
  406. package/src/server/management/provider-key-pacing-routes.ts +31 -0
  407. package/src/server/management/provider-overwrite-carry.ts +7 -0
  408. package/src/server/management/provider-routes.ts +25 -30
  409. package/src/server/management/route-registry.ts +21 -1
  410. package/src/server/management/sibling-guard.ts +1 -0
  411. package/src/server/management-api.ts +9 -1
  412. package/src/server/messages-antigravity-direct.ts +195 -0
  413. package/src/server/messages-native-tool-guard.ts +185 -0
  414. package/src/server/messages-native.ts +106 -22
  415. package/src/server/messages-shared.ts +431 -0
  416. package/src/server/relay.ts +1 -1
  417. package/src/server/request-log-terminal-status.ts +1 -1
  418. package/src/server/request-log.ts +13 -1
  419. package/src/server/responses/account-change-state.ts +8 -2
  420. package/src/server/responses/adapter-continuation.ts +48 -19
  421. package/src/server/responses/adapter-delivery.ts +43 -8
  422. package/src/server/responses/adapter-dispatch.ts +48 -4
  423. package/src/server/responses/advisor-plan-slot.ts +27 -0
  424. package/src/server/responses/advisor-retention.ts +117 -0
  425. package/src/server/responses/advisor-slot.ts +368 -0
  426. package/src/server/responses/code-mode-collab-surface.ts +116 -8
  427. package/src/server/responses/codex-ws-wire.ts +15 -8
  428. package/src/server/responses/compact.ts +303 -125
  429. package/src/server/responses/compaction-recovery.ts +18 -10
  430. package/src/server/responses/compaction-retention.ts +61 -0
  431. package/src/server/responses/context-overflow.ts +11 -6
  432. package/src/server/responses/core-auth.ts +6 -0
  433. package/src/server/responses/core-codex-account.ts +11 -1
  434. package/src/server/responses/core-combo-failure.ts +12 -1
  435. package/src/server/responses/core-combo.ts +141 -36
  436. package/src/server/responses/core-errors.ts +3 -3
  437. package/src/server/responses/core-lifetime.ts +7 -2
  438. package/src/server/responses/core-normalize.ts +11 -0
  439. package/src/server/responses/core-opaque-recovery.ts +35 -0
  440. package/src/server/responses/core-options.ts +51 -0
  441. package/src/server/responses/core-pipeline.ts +141 -0
  442. package/src/server/responses/core-replay.ts +25 -6
  443. package/src/server/responses/core.ts +3 -116
  444. package/src/server/responses/fetch-helpers.ts +73 -19
  445. package/src/server/responses/main-hard-lock-routing.ts +109 -0
  446. package/src/server/responses/native-response-control.ts +4 -2
  447. package/src/server/responses/passthrough-delivery.ts +19 -11
  448. package/src/server/responses/passthrough-dispatch.ts +29 -16
  449. package/src/server/responses/request-prepare.ts +144 -17
  450. package/src/server/responses/request-sidecar-auth.ts +2 -2
  451. package/src/server/responses/request-transport.ts +120 -27
  452. package/src/server/responses/response-effects.ts +1 -0
  453. package/src/server/responses/run-turn-execution.ts +166 -38
  454. package/src/server/responses/sidecar-execution.ts +98 -5
  455. package/src/server/responses/terminal-guard.ts +4 -17
  456. package/src/server/responses-undeclared-tool-guard.ts +30 -9
  457. package/src/server/startup-action-control.ts +16 -2
  458. package/src/server/startup-health-cache.ts +1 -0
  459. package/src/service/auth-preflight.ts +71 -0
  460. package/src/service/cli.ts +4 -2
  461. package/src/service/definition.ts +97 -0
  462. package/src/service/desktop-startup.ts +14 -0
  463. package/src/service/guards.ts +1 -61
  464. package/src/service/health-sentinel-linux.ts +112 -0
  465. package/src/service/health-sentinel-main.ts +99 -61
  466. package/src/service/health-sentinel-probe.ts +24 -7
  467. package/src/service/health.ts +5 -89
  468. package/src/service/launchd.ts +27 -7
  469. package/src/service/logging.ts +135 -0
  470. package/src/service/repair.ts +2 -1
  471. package/src/service/state.ts +7 -8
  472. package/src/service/systemd.ts +1 -1
  473. package/src/service/windows-guarded-manager.ts +2 -1
  474. package/src/service/windows-ops.ts +1 -1
  475. package/src/service/windows-scheduler.ts +2 -7
  476. package/src/service/windows-taskxml.ts +2 -2
  477. package/src/service/windows-wscript.ts +14 -0
  478. package/src/service.ts +4 -2
  479. package/src/sidecar/auth.ts +2 -0
  480. package/src/tray/windows-tray.ps1 +43 -24
  481. package/src/types/config.ts +124 -6
  482. package/src/types/opencode-go.ts +61 -0
  483. package/src/types/opencode-zen.ts +29 -0
  484. package/src/types/provider.ts +39 -6
  485. package/src/types/request.ts +38 -2
  486. package/src/types/tools.ts +2 -0
  487. package/src/types/wire.ts +29 -37
  488. package/src/types.ts +1 -0
  489. package/src/update/async-check.ts +1 -1
  490. package/src/update/badge.ts +2 -2
  491. package/src/update/index.ts +88 -15
  492. package/src/update/job-supervised-restart.ts +107 -0
  493. package/src/update/job.ts +32 -32
  494. package/src/update/notify.ts +1 -1
  495. package/src/update/npm-invocation.mjs +12 -2
  496. package/src/update/refresh-scheduler.ts +2 -2
  497. package/src/update/supervised-recovery.d.mts +27 -0
  498. package/src/update/supervised-recovery.mjs +157 -0
  499. package/src/usage/cache-diagnostic.ts +2 -0
  500. package/src/usage/cost.ts +48 -12
  501. package/src/usage/expected-prices.ts +15 -0
  502. package/src/usage/ledger-retention.ts +2 -1
  503. package/src/usage/ledger-scanner.ts +6 -5
  504. package/src/usage/log.ts +17 -8
  505. package/src/usage/summary.ts +22 -9
  506. package/src/usage/user-cost-overlays.ts +14 -19
  507. package/src/usage/user-cost-validation.ts +38 -0
  508. package/src/vision/eligibility.ts +13 -0
  509. package/src/web-search/gemini-executor.ts +2 -2
  510. package/src/web-search/loop.ts +55 -5
  511. package/src/web-search/progress-stream.ts +4 -1
  512. package/src/web-search/run-turn-loop.ts +9 -1
  513. package/assets/sponsors/packycode.png +0 -0
  514. package/gui/dist/assets/App-CSJvmjNs.css +0 -1
  515. package/gui/dist/assets/App-CZtqiGcw.js +0 -56
  516. package/gui/dist/assets/index-BB6uK6tU.css +0 -1
  517. package/gui/dist/assets/index-CTm4l-HQ.js +0 -94
  518. package/gui/dist/assets/quota-summary-BbEeRfPY.js +0 -1
@@ -1,10 +1,17 @@
1
+ import type { VendorContextInference } from "./vendor-context";
1
2
  import { isCodexControlPlaneModel } from "../control-plane-models";
2
3
  import { execFileSync } from "node:child_process";
3
4
  import { createHash } from "node:crypto";
4
- import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync } from "node:fs";
5
+ import { copyFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
5
6
  import { delimiter, dirname, join, resolve } from "node:path";
6
- import { atomicWriteFile, expandUserPath, getConfigDir, loadConfig, ultraFastTierEnabled, websocketsEnabled } from "../../config";
7
- import { CODEX_CONFIG_PATH, CODEX_MODELS_CACHE_PATH, DEFAULT_CATALOG_PATH, readRootTomlString, resolveCodexConfigPath } from "../paths";
7
+ import { atomicWriteFile, getConfigDir, loadConfig, ultraFastTierEnabled, websocketsEnabled } from "../../config";
8
+ import {
9
+ activeCodexConfigPath,
10
+ activeCodexModelsCachePath,
11
+ isDefaultCatalogPath,
12
+ readCodexCatalogPath,
13
+ readRootTomlString,
14
+ } from "../paths";
8
15
  import { clearModelCache, DEFAULT_MODEL_CACHE_TTL_MS, getFreshCached, getStaleCached, isModelsFetchCoolingDown, markModelsFetchFailure, setCached } from "../model-cache";
9
16
  import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
10
17
  import type { OcxConfig, OcxProviderConfig } from "../../types";
@@ -32,7 +39,7 @@ import { redactSecretString } from "../../lib/redact";
32
39
  import upstreamModelsSnapshot from "../data/upstream-models.json";
33
40
 
34
41
 
35
- import { NATIVE_OPENAI_CONTEXT_OVERRIDES, SUPPORTED_NATIVE_OPENAI_SLUGS, UPSTREAM_NATIVE_ENTRIES, hasNativeOpenAiCapabilityMetadata, nativeMultiAgentVersion, nativeOpenAiAutoCompactTokenLimit, nativeOpenAiContextWindow, nativeOpenAiMaxInputTokens, type NativeContextLimitsInput } from "./metadata";
42
+ import { NATIVE_OPENAI_CONTEXT_OVERRIDES, SUPPORTED_NATIVE_OPENAI_SLUGS, UPSTREAM_NATIVE_ENTRIES, hasNativeOpenAiCapabilityMetadata, nativeMultiAgentVersion, nativeOpenAiAutoCompactTokenLimit, nativeOpenAiConfiguredContextLimit, nativeOpenAiContextWindow, nativeOpenAiMaxInputTokens, type NativeContextLimitsInput } from "./metadata";
36
43
  import { clampAutoCompactTokenLimit } from "../../providers/auto-compact-budget";
37
44
  import { trustedAccountBoundNativeCatalogSlug } from "./account-models";
38
45
  import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
@@ -49,46 +56,22 @@ export function catalogBackupPathFor(catalogPath: string): string {
49
56
  return join(getConfigDir(), `catalog-backup-${id}.json`);
50
57
  }
51
58
 
52
- export function samePath(a: string, b: string): boolean {
53
- const left = resolve(a);
54
- const right = resolve(b);
55
- return process.platform === "win32" ? left.toLowerCase() === right.toLowerCase() : left === right;
56
- }
57
-
58
- export function activeCodexHome(): string | null {
59
- const raw = process.env.CODEX_HOME?.trim();
60
- if (!raw) return null;
61
- const path = resolve(expandUserPath(raw));
62
- try {
63
- return realpathSync.native(path);
64
- } catch {
65
- return path;
66
- }
67
- }
68
-
69
- export function activeCodexConfigPath(): string {
70
- const home = activeCodexHome();
71
- return home ? join(home, "config.toml") : CODEX_CONFIG_PATH;
72
- }
73
-
74
- export function activeDefaultCatalogPath(): string {
75
- const home = activeCodexHome();
76
- return home ? join(home, "opencodex-catalog.json") : DEFAULT_CATALOG_PATH;
77
- }
78
-
79
- export function activeCodexModelsCachePath(): string {
80
- const home = activeCodexHome();
81
- return home ? join(home, "models_cache.json") : CODEX_MODELS_CACHE_PATH;
82
- }
83
-
84
- export function resolveActiveCodexConfigPath(path: string): string {
85
- const home = activeCodexHome();
86
- return home ? resolve(home, path) : resolveCodexConfigPath(path);
87
- }
88
-
89
- export function isDefaultCatalogPath(path: string): boolean {
90
- return samePath(path, activeDefaultCatalogPath());
91
- }
59
+ /**
60
+ * Active-home path resolution now lives in `../paths`, next to the constants it
61
+ * falls back to. It is re-exported here so existing importers keep working; new
62
+ * code that only needs a path should import from `../paths` directly.
63
+ */
64
+ export {
65
+ samePath,
66
+ activeCodexHome,
67
+ activeCodexConfigPath,
68
+ activeDefaultCatalogPath,
69
+ activeCodexModelsCachePath,
70
+ resolveActiveCodexConfigPath,
71
+ isDefaultCatalogPath,
72
+ readCodexCatalogPath,
73
+ readCodexCatalogPathForHome,
74
+ } from "../paths";
92
75
 
93
76
  /** Stable nonsemantic ownership marker for rows projected from config.customModels. */
94
77
  export const CODEX_CUSTOM_MODEL_CATALOG_KIND = "custom-model-v1";
@@ -120,6 +103,8 @@ export interface CatalogModel {
120
103
  suppressSyntheticMax?: boolean;
121
104
  defaultReasoningEffort?: string;
122
105
  contextWindow?: number;
106
+ /** Bundled fallback only; never a serving-provider capability assertion. */
107
+ contextWindowInference?: VendorContextInference;
123
108
  maxInputTokens?: number;
124
109
  /** Model-scoped output-token ceiling; omitted when no authoritative value is known. */
125
110
  maxOutputTokens?: number;
@@ -139,6 +124,8 @@ export interface CatalogModel {
139
124
  supportsVerbosity?: boolean;
140
125
  /** Whether this exact routed model has a verified OpenAI-compatible service tier. */
141
126
  supportsServiceTier?: boolean;
127
+ /** Captured eligible service-tier wire explicitly maps ultrafast to ultrafast. */
128
+ supportsUltraFastTier?: boolean;
142
129
  /** Optional provider-specific copy for the advertised Fast tier. */
143
130
  fastTierDescription?: string;
144
131
  supportsReasoningSummaries?: boolean;
@@ -249,40 +236,6 @@ export function shouldExposeRoutedModel(model: CatalogModel): boolean {
249
236
  return !isMediaGenerationModelId(model.id);
250
237
  }
251
238
 
252
- export function readCodexCatalogPath(): string {
253
- const home = activeCodexHome();
254
- if (home) return readCodexCatalogPathForHome(home);
255
- try {
256
- const configPath = activeCodexConfigPath();
257
- if (existsSync(configPath)) {
258
- const toml = readFileSync(configPath, "utf-8");
259
- const path = readRootTomlString(toml, "model_catalog_json");
260
- if (path) return resolveActiveCodexConfigPath(path);
261
- }
262
- } catch { /* ignore */ }
263
- return activeDefaultCatalogPath();
264
- }
265
-
266
- /**
267
- * Resolve the configured catalog without consulting ambient CODEX_HOME again.
268
- *
269
- * `configText` is for a caller that has already read that same `config.toml` under
270
- * its own constraints - the prompt-text probe reads it bounded, on the request
271
- * thread - so resolving the catalog does not cost a second, unbounded read of the
272
- * file the caller is holding. Omitting it keeps the original behaviour.
273
- */
274
- export function readCodexCatalogPathForHome(codexHome: string, configText?: string): string {
275
- try {
276
- const configPath = join(codexHome, "config.toml");
277
- if (configText !== undefined || existsSync(configPath)) {
278
- const toml = configText ?? readFileSync(configPath, "utf-8");
279
- const path = readRootTomlString(toml, "model_catalog_json");
280
- if (path) return resolve(codexHome, path);
281
- }
282
- } catch { /* ignore */ }
283
- return join(codexHome, "opencodex-catalog.json");
284
- }
285
-
286
239
  /**
287
240
  * Read the configured auto-review model from the root of Codex's config.toml (issue #1225).
288
241
  * Stamped onto catalog entries as `auto_review_model_override` during sync so the auto-review
@@ -501,7 +454,7 @@ export function isNativeOpenAiEntry(entry: RawEntry): boolean {
501
454
  * Narrow any already-resolved native window by the user levers.
502
455
  *
503
456
  * Used for the fields the accessors do not own (`max_context_window`, and preserved rows
504
- * that carry no static override) so every field on a row lands at the same width.
457
+ * that carry no static override). The advertised maximum may exceed the default window.
505
458
  */
506
459
  function narrowNativeMaxContextWindow(
507
460
  slug: string,
@@ -509,12 +462,7 @@ function narrowNativeMaxContextWindow(
509
462
  limits?: NativeContextLimitsInput,
510
463
  ): number | undefined {
511
464
  if (typeof value !== "number" || value <= 0) return value;
512
- const resolved = nativeOpenAiContextWindow(slug, limits);
513
- const authoritative = nativeOpenAiContextWindow(slug);
514
- // The accessor pair tells us how far the levers moved this slug; apply the same delta to a
515
- // field the accessor does not model, without ever raising it.
516
- if (resolved === undefined || authoritative === undefined) return value;
517
- return Math.min(value, Math.max(resolved, 1));
465
+ return applyProviderContextCap(value, nativeOpenAiConfiguredContextLimit(slug, limits));
518
466
  }
519
467
 
520
468
  export function applyNativeOpenAiContextOverride(entry: RawEntry, limits?: NativeContextLimitsInput): void {
@@ -631,7 +579,8 @@ export function ensureStrictCatalogFields(
631
579
  if (
632
580
  typeof entry.max_context_window !== "number"
633
581
  || entry.max_context_window <= 0
634
- || ((options.isRouted === true || !isNativeOpenAiEntry(entry)) && entry.max_context_window > contextWindow)
582
+ || ((options.isRouted === true || (!isNativeOpenAiEntry(entry)
583
+ && trustedAccountBoundNativeCatalogSlug(entry) === undefined)) && entry.max_context_window > contextWindow)
635
584
  ) {
636
585
  entry.max_context_window = contextWindow;
637
586
  }
@@ -53,6 +53,7 @@ import {
53
53
  import type { FastPolicyAuthority } from "../../providers/fastwire";
54
54
  import { effectiveGoogleMode, getProviderRegistryEntry, providerMatchesRegistryTransport, registryEntryForProviderDestination } from "../../providers/registry";
55
55
  import { parseAntigravityAvailableModels, registerAntigravityDiscoveredWireModels } from "../../providers/antigravity-models";
56
+ import { recordAntigravityAccountRoster } from "../../providers/antigravity-account-roster";
56
57
  import { applyProviderContextCap, providerContextCap, resolveUnknownRoutedContextWindow } from "../../providers/context-cap";
57
58
  import { clampAutoCompactTokenLimit } from "../../providers/auto-compact-budget";
58
59
  import { effectiveModelAliases } from "../../providers/default-aliases";
@@ -116,7 +117,7 @@ import type {
116
117
  CatalogTrustedOpenAiApiPolicySnapshot,
117
118
  } from "../convergence-types";
118
119
  import type { CapturedProviderGather, CatalogGatherProviderAuthOutcome, CatalogGatherProviderModelOutcome, ModelsAuthResolution, ModelsAuthResolver } from "./gather-capture";
119
- import { QUIET_AUTHORITATIVE_CATALOG_PROVIDERS, applyConfigHintsToCachedModels, applyProviderConfigHints, boundedOwnedBy, catalogHintsFromModelsApiItem, catalogHintsFromProviderConfig } from "./model-hints";
120
+ import { QUIET_AUTHORITATIVE_CATALOG_PROVIDERS, applyConfigHintsToCachedModels, applyProviderConfigHints, boundedOwnedBy, catalogHintsFromModelsApiItem, catalogHintsFromProviderConfig, withVisionSidecarInput } from "./model-hints";
120
121
  import { mergeConfiguredModelsIntoLiveCatalog, shouldExposeProviderModel, warnDroppedConfiguredIdsOnce } from "./model-visibility";
121
122
  import { captureModelsRequest, captureProviderGather, materializeCapturedHeaders } from "./gather-capture";
122
123
 
@@ -167,7 +168,7 @@ export function observedModelsAuthResolver(
167
168
  },
168
169
  };
169
170
  }
170
- /** Project captured discovery through config hints and retention; Auto-only Copilot exposes only Auto. */
171
+ /** Project provider evidence without synthetic sidecar image input, which belongs to each gather. */
171
172
  export async function fetchProviderModelsWithAuth(
172
173
  captured: CapturedProviderGather,
173
174
  ttlMs: number,
@@ -210,7 +211,7 @@ export async function fetchProviderModelsWithAuth(
210
211
  const configured: CatalogModel[] = configuredIds.map(id => ({
211
212
  id,
212
213
  provider: name,
213
- ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
214
+ ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
214
215
  }));
215
216
  const withConfiguredRetention = (
216
217
  models: CatalogModel[],
@@ -227,6 +228,7 @@ export async function fetchProviderModelsWithAuth(
227
228
  retainComboTargets: options?.retainComboTargets,
228
229
  metadataModelIdCaseFold,
229
230
  metadataConfigDir,
231
+ includeVisionSidecar: false,
230
232
  });
231
233
  if (
232
234
  options?.warnDrops === true
@@ -259,7 +261,7 @@ export async function fetchProviderModelsWithAuth(
259
261
  }
260
262
  return observed(ids.map(id => {
261
263
  const hints = catalogHintsFromProviderConfig(name, prov, id, contextCap,
262
- metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir);
264
+ metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false);
263
265
  const observedWindow = kiroObservedContextWindow(id);
264
266
  return { id, provider: name, ...hints,
265
267
  ...(observedWindow !== undefined
@@ -295,7 +297,7 @@ export async function fetchProviderModelsWithAuth(
295
297
  model => applyProviderConfigHints(name, prov, {
296
298
  id: model.id, provider: name,
297
299
  ...catalogHintsFromModelsApiItem(name, model as ProviderModelsApiItem),
298
- }, contextCap, metadataModelIdCaseFold, captured.effectiveAlias));
300
+ }, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, undefined, false));
299
301
  if (!isCurrentCacheGeneration()) return observed(configured, "degraded");
300
302
  markProviderDiscoveryOk(name, picker.length);
301
303
  // Retain callable manual/combo selectors, but do not advertise named selection
@@ -325,7 +327,7 @@ export async function fetchProviderModelsWithAuth(
325
327
  : [{
326
328
  id: prov.defaultModel,
327
329
  provider: name,
328
- ...catalogHintsFromProviderConfig(name, prov, prov.defaultModel, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
330
+ ...catalogHintsFromProviderConfig(name, prov, prov.defaultModel, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
329
331
  }];
330
332
  const vertexDefaultSeed = seedVertexDefault ? configured[0] : undefined;
331
333
  const withVertexDefaultSeed = (models: CatalogModel[]): CatalogModel[] => (
@@ -347,13 +349,13 @@ export async function fetchProviderModelsWithAuth(
347
349
  const fresh = getFreshCached(name, ttlMs, Date.now(), authorityIdentity);
348
350
  if (fresh) {
349
351
  return observed(withConfiguredRetention(
350
- applyConfigHintsToCachedModels(name, prov, fresh, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
352
+ applyConfigHintsToCachedModels(name, prov, fresh, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
351
353
  ), "authoritative");
352
354
  }
353
355
  const scopedStale = getStaleCached(name, authorityIdentity);
354
356
  if (isModelsFetchCoolingDown(name, undefined, undefined, authorityIdentity) && scopedStale) {
355
357
  return observed(withConfiguredRetention(
356
- applyConfigHintsToCachedModels(name, prov, scopedStale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
358
+ applyConfigHintsToCachedModels(name, prov, scopedStale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
357
359
  ), "degraded");
358
360
  }
359
361
  const live = await fetchCodeBuddyModels(profile, apiKey);
@@ -361,7 +363,7 @@ export async function fetchProviderModelsWithAuth(
361
363
  const discovered = live.models.map(id => ({
362
364
  id,
363
365
  provider: name,
364
- ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
366
+ ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
365
367
  }));
366
368
  const forCache = withConfiguredRetention(discovered, { retainComboTargets: false });
367
369
  if (!setCached(name, forCache, Date.now(), cacheGeneration, authorityIdentity)) {
@@ -377,7 +379,7 @@ export async function fetchProviderModelsWithAuth(
377
379
  }
378
380
  const stale = getStaleCached(name, authorityIdentity);
379
381
  return observed(withConfiguredRetention(
380
- stale ? applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir) : configured,
382
+ stale ? applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false) : configured,
381
383
  ), "degraded");
382
384
  }
383
385
  if (name === "zed" && prov.adapter === "zed") {
@@ -390,14 +392,14 @@ export async function fetchProviderModelsWithAuth(
390
392
  const cached = getFreshCached(name, ttlMs, Date.now(), authorityIdentity);
391
393
  if (cached) {
392
394
  return observed(
393
- withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, cached, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir)),
395
+ withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, cached, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false)),
394
396
  "authoritative",
395
397
  );
396
398
  }
397
399
  const stale = getStaleCached(name, authorityIdentity);
398
400
  if (isModelsFetchCoolingDown(name, undefined, undefined, authorityIdentity) && stale) {
399
401
  return observed(
400
- withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir)),
402
+ withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false)),
401
403
  "degraded",
402
404
  );
403
405
  }
@@ -417,7 +419,7 @@ export async function fetchProviderModelsWithAuth(
417
419
  ...(model.maxOutputTokens ? { maxOutputTokens: model.maxOutputTokens } : {}),
418
420
  ...(model.supportsImages ? { inputModalities: ["text", "image"] } : {}),
419
421
  ...(reasoningEfforts?.length ? { reasoningEfforts } : {}),
420
- ...catalogHintsFromProviderConfig(name, prov, model.id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
422
+ ...catalogHintsFromProviderConfig(name, prov, model.id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
421
423
  } as CatalogModel;
422
424
  });
423
425
  const forCache = withConfiguredRetention(discovered, { retainComboTargets: false });
@@ -432,7 +434,7 @@ export async function fetchProviderModelsWithAuth(
432
434
  markProviderDiscoveryFailed(name, { reason: "provider" });
433
435
  }
434
436
  return observed(
435
- withConfiguredRetention(stale ? applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir) : configured),
437
+ withConfiguredRetention(stale ? applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false) : configured),
436
438
  "degraded",
437
439
  );
438
440
  }
@@ -448,13 +450,13 @@ export async function fetchProviderModelsWithAuth(
448
450
  const fresh = getFreshCached(name, ttlMs, Date.now(), authorityIdentity);
449
451
  if (fresh) {
450
452
  return observed(withConfiguredRetention(
451
- applyConfigHintsToCachedModels(name, prov, fresh, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
453
+ applyConfigHintsToCachedModels(name, prov, fresh, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
452
454
  ), "authoritative");
453
455
  }
454
456
  const scopedStale = getStaleCached(name, authorityIdentity);
455
457
  if (isModelsFetchCoolingDown(name) && scopedStale) {
456
458
  return observed(withConfiguredRetention(
457
- applyConfigHintsToCachedModels(name, prov, scopedStale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
459
+ applyConfigHintsToCachedModels(name, prov, scopedStale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
458
460
  ), "degraded");
459
461
  }
460
462
  const live = await fetchQoderModels(profile, apiKey);
@@ -462,7 +464,7 @@ export async function fetchProviderModelsWithAuth(
462
464
  const discovered = live.models.map(id => ({
463
465
  id,
464
466
  provider: name,
465
- ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
467
+ ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
466
468
  }));
467
469
  const forCache = withConfiguredRetention(discovered, { retainComboTargets: false });
468
470
  if (!setCached(name, forCache, Date.now(), cacheGeneration, authorityIdentity)) {
@@ -478,7 +480,7 @@ export async function fetchProviderModelsWithAuth(
478
480
  }
479
481
  const stale = getStaleCached(name, authorityIdentity);
480
482
  return observed(withConfiguredRetention(
481
- stale ? applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir) : configured,
483
+ stale ? applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false) : configured,
482
484
  ), "degraded");
483
485
  }
484
486
  if (prov.adapter === "devin") {
@@ -493,7 +495,7 @@ export async function fetchProviderModelsWithAuth(
493
495
  const cachedDevin = getFreshCached(name, ttlMs, Date.now(), authorityIdentity);
494
496
  if (cachedDevin) {
495
497
  return observed(
496
- withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, cachedDevin, undefined, undefined, undefined, metadataConfigDir)),
498
+ withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, cachedDevin, undefined, undefined, undefined, metadataConfigDir, false)),
497
499
  "authoritative",
498
500
  );
499
501
  }
@@ -501,7 +503,7 @@ export async function fetchProviderModelsWithAuth(
501
503
  const cooling = getStaleCached(name, authorityIdentity);
502
504
  return observed(
503
505
  withConfiguredRetention(
504
- cooling ? applyConfigHintsToCachedModels(name, prov, cooling, undefined, undefined, undefined, metadataConfigDir) : configured,
506
+ cooling ? applyConfigHintsToCachedModels(name, prov, cooling, undefined, undefined, undefined, metadataConfigDir, false) : configured,
505
507
  ),
506
508
  "degraded",
507
509
  );
@@ -539,11 +541,11 @@ export async function fetchProviderModelsWithAuth(
539
541
  ...(liveResult.defaultEfforts[id] ? { defaultReasoningEffort: liveResult.defaultEfforts[id] } : {}),
540
542
  // The account catalog's per-base supportsImages vote collapses to one
541
543
  // modalities value. It spreads before the hints so exact
542
- // modelCapabilities declarations, the legacy modelInputModalities
543
- // record and the vision-sidecar rewrite keep winning — the live
544
- // value survives only when none of them applies.
544
+ // modelCapabilities declarations and the legacy modelInputModalities
545
+ // record keep winning. Sidecar advertisement is added after discovery;
546
+ // the live value survives only when no explicit declaration applies.
545
547
  ...(liveResult.inputModalities[id]?.length ? { inputModalities: liveResult.inputModalities[id] } : {}),
546
- ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir),
548
+ ...catalogHintsFromProviderConfig(name, prov, id, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false),
547
549
  } as CatalogModel;
548
550
  });
549
551
  const forCache = withConfiguredRetention(result, { retainComboTargets: false });
@@ -559,7 +561,7 @@ export async function fetchProviderModelsWithAuth(
559
561
  }
560
562
  const stale = getStaleCached(name, authorityIdentity);
561
563
  return observed(
562
- withConfiguredRetention(stale ? applyConfigHintsToCachedModels(name, prov, stale, undefined, undefined, undefined, metadataConfigDir) : configured),
564
+ withConfiguredRetention(stale ? applyConfigHintsToCachedModels(name, prov, stale, undefined, undefined, undefined, metadataConfigDir, false) : configured),
563
565
  "degraded",
564
566
  );
565
567
  }
@@ -576,7 +578,7 @@ export async function fetchProviderModelsWithAuth(
576
578
  const cachedCursor = getFreshCached(name, ttlMs, Date.now(), authorityIdentity);
577
579
  if (cachedCursor) {
578
580
  return observed(
579
- withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, cachedCursor, undefined, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir)),
581
+ withConfiguredRetention(applyConfigHintsToCachedModels(name, prov, cachedCursor, undefined, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false)),
580
582
  "authoritative",
581
583
  );
582
584
  }
@@ -584,7 +586,7 @@ export async function fetchProviderModelsWithAuth(
584
586
  const cooling = getStaleCached(name, authorityIdentity);
585
587
  return observed(
586
588
  withConfiguredRetention(
587
- cooling ? applyConfigHintsToCachedModels(name, prov, cooling, undefined, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir) : configured,
589
+ cooling ? applyConfigHintsToCachedModels(name, prov, cooling, undefined, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false) : configured,
588
590
  ),
589
591
  "degraded",
590
592
  );
@@ -630,7 +632,7 @@ export async function fetchProviderModelsWithAuth(
630
632
  const staleCursor = getStaleCached(name, authorityIdentity);
631
633
  return observed(
632
634
  withConfiguredRetention(
633
- staleCursor ? applyConfigHintsToCachedModels(name, prov, staleCursor, undefined, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir) : configured,
635
+ staleCursor ? applyConfigHintsToCachedModels(name, prov, staleCursor, undefined, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false) : configured,
634
636
  ),
635
637
  "degraded",
636
638
  );
@@ -648,7 +650,7 @@ export async function fetchProviderModelsWithAuth(
648
650
  if (fresh) {
649
651
  return observed(
650
652
  withConfiguredRetention(
651
- withVertexDefaultSeed(applyConfigHintsToCachedModels(name, prov, fresh, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir)),
653
+ withVertexDefaultSeed(applyConfigHintsToCachedModels(name, prov, fresh, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false)),
652
654
  ),
653
655
  "authoritative",
654
656
  ); // dedups Codex's frequent /v1/models polling within the TTL
@@ -660,7 +662,7 @@ export async function fetchProviderModelsWithAuth(
660
662
  return observed(
661
663
  withConfiguredRetention(
662
664
  stale
663
- ? withVertexDefaultSeed(applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir))
665
+ ? withVertexDefaultSeed(applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false))
664
666
  : failedDiscoveryConfigured,
665
667
  ),
666
668
  "degraded",
@@ -705,7 +707,7 @@ export async function fetchProviderModelsWithAuth(
705
707
  return {
706
708
  models: withConfiguredRetention(
707
709
  stale
708
- ? withVertexDefaultSeed(applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir))
710
+ ? withVertexDefaultSeed(applyConfigHintsToCachedModels(name, prov, stale, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false))
709
711
  : failedDiscoveryConfigured,
710
712
  ),
711
713
  fallback: stale ? "stale" : "configured",
@@ -796,7 +798,7 @@ export async function fetchProviderModelsWithAuth(
796
798
  ...(model.contextWindow ? { contextWindow: model.contextWindow } : {}),
797
799
  ...(model.inputModalities ? { inputModalities: model.inputModalities } : {}),
798
800
  }));
799
- const live = applyConfigHintsToCachedModels(name, prov, upstream, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir);
801
+ const live = applyConfigHintsToCachedModels(name, prov, upstream, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false);
800
802
  const forCache = azureMetadata ? upstream : withConfiguredRetention(live, { retainComboTargets: false });
801
803
  if (!isCurrentCacheGeneration()) {
802
804
  return observed(withConfiguredRetention(configured), "degraded");
@@ -807,6 +809,9 @@ export async function fetchProviderModelsWithAuth(
807
809
  provider: name,
808
810
  cacheGeneration,
809
811
  });
812
+ // Entitlement is per account (Claude 4.6 vs 5.5, Argon): remember what THIS account
813
+ // lists so account selection can prefer one that serves the requested model.
814
+ if (auth.oauthAccountId) recordAntigravityAccountRoster(name, auth.oauthAccountId, antigravity);
810
815
  if (!setCached(name, forCache, Date.now(), cacheGeneration)) {
811
816
  return observed(withConfiguredRetention(configured), "degraded");
812
817
  }
@@ -874,7 +879,7 @@ export async function fetchProviderModelsWithAuth(
874
879
  };
875
880
  })
876
881
  .filter(m => shouldExposeProviderModel(name, m.id));
877
- const live = applyConfigHintsToCachedModels(name, prov, upstream, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir);
882
+ const live = applyConfigHintsToCachedModels(name, prov, upstream, contextCap, metadataModelIdCaseFold, captured.effectiveAlias, metadataConfigDir, false);
878
883
  // Capture the count BEFORE the alias/configured augmentation below pushes extra rows into
879
884
  // `live`; otherwise configured entries would be reported as discovered ones.
880
885
  const liveModelCount = live.length;
@@ -921,6 +926,7 @@ export async function fetchProviderModelsWithAuth(
921
926
  }
922
927
  }
923
928
 
929
+ /** Preserve the provider-only API's default-enabled projection without widening cached evidence. */
924
930
  export async function fetchProviderModels(
925
931
  name: string,
926
932
  prov: OcxProviderConfig,
@@ -933,5 +939,5 @@ export async function fetchProviderModels(
933
939
  ttlMs,
934
940
  contextCap,
935
941
  refreshingModelsAuthResolver,
936
- )).models;
942
+ )).models.map(model => withVisionSidecarInput(model, captured.provider));
937
943
  }
@@ -1,4 +1,5 @@
1
1
  import { projectAntigravitySelectedModels } from "../../providers/antigravity-effort-families";
2
+ import { configuredUltraFastSlugs } from "./configured-tiers";
2
3
  import { existsSync, readFileSync } from "node:fs";
3
4
  import { join } from "node:path";
4
5
  import { initializeConfigOwnership } from "../../lib/config-ownership";
@@ -509,6 +510,7 @@ function writeRetainedCatalogSync({
509
510
  : [];
510
511
  catalog.models = mergeCatalogEntriesFromObservedState({
511
512
  ultraFastTier: ultraFastTierEnabled(config),
513
+ configuredUltraFastSlugs: configuredUltraFastSlugs(orderedGoModels),
512
514
  modelPickerOrder,
513
515
  accountSelectors,
514
516
  catalogModels: catalogModelsForMerge,