@remodex/rmx 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/AGENTS_INSTALL.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +242 -0
  4. package/assets/architecture.png +0 -0
  5. package/assets/banner.png +0 -0
  6. package/assets/claude-code-models.gif +0 -0
  7. package/assets/codex-app-picker.png +0 -0
  8. package/bin/ocx.mjs +584 -0
  9. package/bin/package-main.mjs +9 -0
  10. package/gui/dist/assets/index-CZqebSPQ.css +1 -0
  11. package/gui/dist/assets/index-CkETtt7P.js +71 -0
  12. package/gui/dist/favicon.png +0 -0
  13. package/gui/dist/fonts/google-sans-cyrillic.woff2 +0 -0
  14. package/gui/dist/fonts/google-sans-latin.woff2 +0 -0
  15. package/gui/dist/icons.svg +24 -0
  16. package/gui/dist/index.html +25 -0
  17. package/gui/dist/logo.png +0 -0
  18. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  19. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  20. package/gui/dist/provider-icons/claude-color.svg +1 -0
  21. package/gui/dist/provider-icons/cline-color.svg +16 -0
  22. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  23. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  24. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  25. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  26. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  27. package/gui/dist/provider-icons/discord.svg +1 -0
  28. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  29. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  30. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  31. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  32. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  33. package/gui/dist/provider-icons/grok.svg +1 -0
  34. package/gui/dist/provider-icons/groq-color.svg +1 -0
  35. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  36. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  37. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  38. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  39. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  40. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  41. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  42. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  43. package/gui/dist/provider-icons/openai.svg +1 -0
  44. package/gui/dist/provider-icons/opencode.svg +2 -0
  45. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  46. package/gui/dist/provider-icons/pi.svg +21 -0
  47. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  48. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  49. package/gui/dist/provider-icons/telegram.svg +1 -0
  50. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  51. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  52. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  53. package/package.json +118 -0
  54. package/src/AGENTS.md +28 -0
  55. package/src/adapters/anthropic-image-guard.ts +251 -0
  56. package/src/adapters/anthropic-image-normalize.ts +518 -0
  57. package/src/adapters/anthropic.ts +1205 -0
  58. package/src/adapters/azure.ts +36 -0
  59. package/src/adapters/base.ts +83 -0
  60. package/src/adapters/client-fingerprint.ts +59 -0
  61. package/src/adapters/command-code.ts +453 -0
  62. package/src/adapters/cursor/arg-codec.ts +38 -0
  63. package/src/adapters/cursor/arg-normalize.ts +104 -0
  64. package/src/adapters/cursor/cursor-errors.ts +165 -0
  65. package/src/adapters/cursor/discovery.ts +276 -0
  66. package/src/adapters/cursor/effort-map.ts +139 -0
  67. package/src/adapters/cursor/exec-policy.ts +88 -0
  68. package/src/adapters/cursor/framing.ts +250 -0
  69. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  70. package/src/adapters/cursor/kv-store.ts +52 -0
  71. package/src/adapters/cursor/live-models.ts +153 -0
  72. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  73. package/src/adapters/cursor/live-transport.ts +1235 -0
  74. package/src/adapters/cursor/mcp-config.ts +42 -0
  75. package/src/adapters/cursor/mcp-manager.ts +333 -0
  76. package/src/adapters/cursor/message-mapper.ts +49 -0
  77. package/src/adapters/cursor/native-exec-common.ts +59 -0
  78. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  79. package/src/adapters/cursor/native-exec-fs.ts +332 -0
  80. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  81. package/src/adapters/cursor/native-exec-network.ts +43 -0
  82. package/src/adapters/cursor/native-exec-shell.ts +548 -0
  83. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  84. package/src/adapters/cursor/native-exec.ts +604 -0
  85. package/src/adapters/cursor/protobuf-events.ts +735 -0
  86. package/src/adapters/cursor/protobuf-request.ts +719 -0
  87. package/src/adapters/cursor/request-builder.ts +280 -0
  88. package/src/adapters/cursor/thread-continuity.ts +67 -0
  89. package/src/adapters/cursor/tool-definitions.ts +621 -0
  90. package/src/adapters/cursor/transport-retry.ts +132 -0
  91. package/src/adapters/cursor/transport.ts +57 -0
  92. package/src/adapters/cursor/types.ts +59 -0
  93. package/src/adapters/cursor.ts +196 -0
  94. package/src/adapters/google-antigravity-replay.ts +520 -0
  95. package/src/adapters/google-antigravity-wire.ts +140 -0
  96. package/src/adapters/google-errors.ts +85 -0
  97. package/src/adapters/google-http.ts +100 -0
  98. package/src/adapters/google-tool-schema.ts +173 -0
  99. package/src/adapters/google-truncation.ts +24 -0
  100. package/src/adapters/google-wire-compiler.ts +232 -0
  101. package/src/adapters/google.ts +859 -0
  102. package/src/adapters/identity.ts +77 -0
  103. package/src/adapters/image.ts +23 -0
  104. package/src/adapters/kiro-constants.ts +16 -0
  105. package/src/adapters/kiro-errors.ts +208 -0
  106. package/src/adapters/kiro-events.ts +197 -0
  107. package/src/adapters/kiro-images.ts +129 -0
  108. package/src/adapters/kiro-retry.ts +312 -0
  109. package/src/adapters/kiro-thinking.ts +104 -0
  110. package/src/adapters/kiro-tool-fallback.ts +36 -0
  111. package/src/adapters/kiro-tools.ts +224 -0
  112. package/src/adapters/kiro-truncation.ts +33 -0
  113. package/src/adapters/kiro-wire.ts +129 -0
  114. package/src/adapters/kiro.ts +1924 -0
  115. package/src/adapters/mimo-free.ts +263 -0
  116. package/src/adapters/openai-chat.ts +1265 -0
  117. package/src/adapters/openai-responses.ts +1309 -0
  118. package/src/adapters/run-turn-queue.ts +114 -0
  119. package/src/adapters/tool-catalog-nudge.ts +71 -0
  120. package/src/adapters/upstream-http-error.ts +48 -0
  121. package/src/android-remote/assets.ts +218 -0
  122. package/src/android-remote/attachments.ts +168 -0
  123. package/src/android-remote/auth.ts +237 -0
  124. package/src/android-remote/cloudflare-provisioning.ts +409 -0
  125. package/src/android-remote/cloudflare-secret.ts +106 -0
  126. package/src/android-remote/cloudflare-tunnel.ts +488 -0
  127. package/src/android-remote/cloudflared.ts +286 -0
  128. package/src/android-remote/codex-app-server.ts +565 -0
  129. package/src/android-remote/desktop-history-page.ts +936 -0
  130. package/src/android-remote/desktop-ipc.ts +3643 -0
  131. package/src/android-remote/desktop-ownership-store.ts +98 -0
  132. package/src/android-remote/desktop-project-registration.ts +129 -0
  133. package/src/android-remote/desktop-session-stream.ts +1110 -0
  134. package/src/android-remote/desktop-workspace-state.ts +443 -0
  135. package/src/android-remote/file-change-parser.ts +112 -0
  136. package/src/android-remote/gateway.ts +9108 -0
  137. package/src/android-remote/mutation-store.ts +299 -0
  138. package/src/android-remote/projection.ts +1780 -0
  139. package/src/android-remote/queued-turn-store.ts +248 -0
  140. package/src/android-remote/session-command-recovery.ts +1384 -0
  141. package/src/android-remote/store.ts +466 -0
  142. package/src/android-remote/thread-reconciliation.ts +133 -0
  143. package/src/android-remote/thread-source-paths.ts +307 -0
  144. package/src/android-remote/thread-stream.ts +546 -0
  145. package/src/android-remote/turn-activity.ts +235 -0
  146. package/src/android-remote/user-message-identity.ts +94 -0
  147. package/src/bridge.ts +1793 -0
  148. package/src/chat/inbound.ts +295 -0
  149. package/src/chat/outbound.ts +821 -0
  150. package/src/claude/agents-inject.ts +267 -0
  151. package/src/claude/alias.ts +149 -0
  152. package/src/claude/auth-detect.ts +229 -0
  153. package/src/claude/auth-mode-migration.ts +32 -0
  154. package/src/claude/auth-mode.ts +62 -0
  155. package/src/claude/context-windows.ts +189 -0
  156. package/src/claude/desktop-3p-guard.ts +35 -0
  157. package/src/claude/desktop-3p-paths.ts +84 -0
  158. package/src/claude/desktop-3p.ts +601 -0
  159. package/src/claude/desktop-health.ts +26 -0
  160. package/src/claude/desktop-profile.ts +263 -0
  161. package/src/claude/gateway-cache.ts +70 -0
  162. package/src/claude/inbound-debug.ts +163 -0
  163. package/src/claude/inbound.ts +519 -0
  164. package/src/claude/model-info.ts +154 -0
  165. package/src/claude/outbound.ts +898 -0
  166. package/src/cli/access.ts +108 -0
  167. package/src/cli/account-api.ts +296 -0
  168. package/src/cli/account-auth.ts +250 -0
  169. package/src/cli/account-catalog-refresh.ts +14 -0
  170. package/src/cli/account-extended.ts +476 -0
  171. package/src/cli/account-main.ts +317 -0
  172. package/src/cli/account.ts +297 -0
  173. package/src/cli/agent-driven.ts +70 -0
  174. package/src/cli/agent.ts +184 -0
  175. package/src/cli/catalog-prewarm.ts +27 -0
  176. package/src/cli/claude-desktop.ts +211 -0
  177. package/src/cli/claude.ts +302 -0
  178. package/src/cli/codex-shim-autorestore.ts +45 -0
  179. package/src/cli/codex-shim-readiness.ts +69 -0
  180. package/src/cli/combo.ts +124 -0
  181. package/src/cli/config-command.ts +183 -0
  182. package/src/cli/debug.ts +228 -0
  183. package/src/cli/desktop-first-run.ts +25 -0
  184. package/src/cli/doctor.ts +1022 -0
  185. package/src/cli/export-command.ts +201 -0
  186. package/src/cli/help.ts +370 -0
  187. package/src/cli/index.ts +1565 -0
  188. package/src/cli/init.ts +224 -0
  189. package/src/cli/integrations.ts +225 -0
  190. package/src/cli/interactive-confirm.ts +133 -0
  191. package/src/cli/internal-dispatch.ts +35 -0
  192. package/src/cli/launcher-context.ts +77 -0
  193. package/src/cli/models-runtime.ts +224 -0
  194. package/src/cli/models.ts +340 -0
  195. package/src/cli/observe.ts +170 -0
  196. package/src/cli/opencode.ts +587 -0
  197. package/src/cli/provider-runtime.ts +179 -0
  198. package/src/cli/provider.ts +476 -0
  199. package/src/cli/ready.ts +301 -0
  200. package/src/cli/route-policy.ts +92 -0
  201. package/src/cli/runtime-api.ts +328 -0
  202. package/src/cli/star-prompt.ts +211 -0
  203. package/src/cli/status-oauth.ts +78 -0
  204. package/src/cli/status.ts +321 -0
  205. package/src/cli/system-command.ts +196 -0
  206. package/src/cli/system-restart-client.ts +146 -0
  207. package/src/cli/tray-proxy.ts +205 -0
  208. package/src/cli/v2.ts +200 -0
  209. package/src/cli.ts +10 -0
  210. package/src/clients/config-export.ts +1109 -0
  211. package/src/codex/account-id.ts +34 -0
  212. package/src/codex/account-label.ts +34 -0
  213. package/src/codex/account-lifecycle.ts +172 -0
  214. package/src/codex/account-namespace-match.ts +63 -0
  215. package/src/codex/account-namespaces.ts +195 -0
  216. package/src/codex/account-pause.ts +20 -0
  217. package/src/codex/account-priority.ts +83 -0
  218. package/src/codex/account-runtime-state.ts +31 -0
  219. package/src/codex/account-store.ts +517 -0
  220. package/src/codex/account-usability.ts +40 -0
  221. package/src/codex/admission.ts +263 -0
  222. package/src/codex/app-server-processes.ts +799 -0
  223. package/src/codex/auth-api.ts +2098 -0
  224. package/src/codex/auth-collision.ts +107 -0
  225. package/src/codex/auth-context.ts +480 -0
  226. package/src/codex/autostart-health.ts +156 -0
  227. package/src/codex/catalog/account-models.ts +67 -0
  228. package/src/codex/catalog/aggregation.ts +471 -0
  229. package/src/codex/catalog/bundled.ts +533 -0
  230. package/src/codex/catalog/effort.ts +432 -0
  231. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  232. package/src/codex/catalog/kinds.ts +2 -0
  233. package/src/codex/catalog/metadata.ts +287 -0
  234. package/src/codex/catalog/native-models.ts +7 -0
  235. package/src/codex/catalog/parsing.ts +503 -0
  236. package/src/codex/catalog/provider-fetch.ts +2267 -0
  237. package/src/codex/catalog/sync.ts +1606 -0
  238. package/src/codex/catalog-admission.ts +197 -0
  239. package/src/codex/catalog-refresh-status.ts +87 -0
  240. package/src/codex/catalog-write-serialization.ts +242 -0
  241. package/src/codex/catalog.ts +15 -0
  242. package/src/codex/codex-write-lock.ts +384 -0
  243. package/src/codex/convergence-types.ts +593 -0
  244. package/src/codex/convergence.ts +580 -0
  245. package/src/codex/custom-model-catalog-migration.ts +176 -0
  246. package/src/codex/data/upstream-models.json +830 -0
  247. package/src/codex/desired-state.ts +230 -0
  248. package/src/codex/desktop-client-processes.ts +521 -0
  249. package/src/codex/exec-invocation.ts +22 -0
  250. package/src/codex/features.ts +1091 -0
  251. package/src/codex/generation.ts +202 -0
  252. package/src/codex/history-job.ts +347 -0
  253. package/src/codex/history-lock.ts +242 -0
  254. package/src/codex/history-migration-guardian.ts +115 -0
  255. package/src/codex/history-provider.ts +1075 -0
  256. package/src/codex/history-transition.ts +105 -0
  257. package/src/codex/history-worker.ts +204 -0
  258. package/src/codex/home.ts +206 -0
  259. package/src/codex/inject-coordination.ts +257 -0
  260. package/src/codex/inject.ts +1857 -0
  261. package/src/codex/injected-marker.ts +79 -0
  262. package/src/codex/integration-record.ts +266 -0
  263. package/src/codex/internal/catalog-writer.ts +203 -0
  264. package/src/codex/internal/history-writer.ts +105 -0
  265. package/src/codex/journal.ts +172 -0
  266. package/src/codex/main-account-cache.ts +56 -0
  267. package/src/codex/main-account.ts +40 -0
  268. package/src/codex/management-convergence.ts +114 -0
  269. package/src/codex/model-cache.ts +267 -0
  270. package/src/codex/native-main-admission.ts +47 -0
  271. package/src/codex/native-main-auth-temp.ts +187 -0
  272. package/src/codex/native-main-claim.ts +167 -0
  273. package/src/codex/native-main-lock-file.ts +162 -0
  274. package/src/codex/native-main-owner.ts +329 -0
  275. package/src/codex/native-profile-api.ts +247 -0
  276. package/src/codex/native-profile-manager.ts +1531 -0
  277. package/src/codex/native-profile-processes.ts +121 -0
  278. package/src/codex/native-profile-recovery.ts +99 -0
  279. package/src/codex/native-profile-stage-store.ts +387 -0
  280. package/src/codex/native-profile-startup.ts +348 -0
  281. package/src/codex/native-profile-store.ts +855 -0
  282. package/src/codex/native-profile-types.ts +120 -0
  283. package/src/codex/native-residue.ts +691 -0
  284. package/src/codex/paths.ts +78 -0
  285. package/src/codex/plugins-doctor.ts +242 -0
  286. package/src/codex/pool-rotation.ts +295 -0
  287. package/src/codex/project-config-warnings.ts +426 -0
  288. package/src/codex/prompt-journal.ts +311 -0
  289. package/src/codex/prompt-layers.ts +967 -0
  290. package/src/codex/prompt-lock.ts +143 -0
  291. package/src/codex/provider-adoption.ts +242 -0
  292. package/src/codex/quota-rejection.ts +224 -0
  293. package/src/codex/quota.ts +494 -0
  294. package/src/codex/refresh.ts +60 -0
  295. package/src/codex/routing.ts +1855 -0
  296. package/src/codex/runtime.ts +659 -0
  297. package/src/codex/shim.ts +1215 -0
  298. package/src/codex/subagent-defaults.ts +557 -0
  299. package/src/codex/subagent-model-fallback.ts +560 -0
  300. package/src/codex/sync.ts +238 -0
  301. package/src/codex/transition-state.ts +612 -0
  302. package/src/codex/upstream-host-health.ts +368 -0
  303. package/src/codex/user-identity.ts +374 -0
  304. package/src/codex/warmup.ts +192 -0
  305. package/src/codex/websocket-registry.ts +100 -0
  306. package/src/codex/write-coordination.ts +114 -0
  307. package/src/combos/failover.ts +140 -0
  308. package/src/combos/index.ts +44 -0
  309. package/src/combos/request.ts +64 -0
  310. package/src/combos/resolve.ts +232 -0
  311. package/src/combos/types.ts +392 -0
  312. package/src/config.ts +3270 -0
  313. package/src/generated/model-metadata.ts +144 -0
  314. package/src/github/star-state.ts +203 -0
  315. package/src/grok/inject.ts +540 -0
  316. package/src/grok/inspect.ts +45 -0
  317. package/src/grok/status.ts +127 -0
  318. package/src/grok/sync.ts +66 -0
  319. package/src/images/artifacts.ts +516 -0
  320. package/src/images/fulfill-video.ts +163 -0
  321. package/src/images/fulfill.ts +149 -0
  322. package/src/images/index.ts +4 -0
  323. package/src/images/loop.ts +922 -0
  324. package/src/images/plan.ts +133 -0
  325. package/src/images/synthetic-tool.ts +133 -0
  326. package/src/images/types.ts +41 -0
  327. package/src/images/xai-client.ts +141 -0
  328. package/src/images/xai-video-client.ts +163 -0
  329. package/src/index.ts +22 -0
  330. package/src/integrations/config-io.ts +151 -0
  331. package/src/integrations/journal.ts +315 -0
  332. package/src/integrations/merge.ts +135 -0
  333. package/src/integrations/native/ownership-preflight.ts +202 -0
  334. package/src/integrations/ownership.ts +111 -0
  335. package/src/integrations/registry.ts +108 -0
  336. package/src/integrations/serialize.ts +235 -0
  337. package/src/integrations/state.ts +290 -0
  338. package/src/integrations/store.ts +103 -0
  339. package/src/integrations/writer.ts +492 -0
  340. package/src/lib/abort.ts +146 -0
  341. package/src/lib/admin-secrets.ts +25 -0
  342. package/src/lib/admission.ts +83 -0
  343. package/src/lib/app-owned-memory-stores.ts +173 -0
  344. package/src/lib/app-owned-memory.ts +265 -0
  345. package/src/lib/bounded-body.ts +242 -0
  346. package/src/lib/bun-binary-validator.d.mts +3 -0
  347. package/src/lib/bun-binary-validator.mjs +18 -0
  348. package/src/lib/bun-runtime.ts +184 -0
  349. package/src/lib/bun-stream-caps.ts +127 -0
  350. package/src/lib/config-ownership.ts +438 -0
  351. package/src/lib/crash-guard.ts +344 -0
  352. package/src/lib/debug-log-buffer.ts +83 -0
  353. package/src/lib/debug-settings.ts +108 -0
  354. package/src/lib/debug.ts +31 -0
  355. package/src/lib/destination-policy.ts +316 -0
  356. package/src/lib/errors.ts +364 -0
  357. package/src/lib/eventstream-decoder.ts +253 -0
  358. package/src/lib/gcp-adc.ts +341 -0
  359. package/src/lib/injection-debug-log.ts +58 -0
  360. package/src/lib/local-management-attestation.ts +51 -0
  361. package/src/lib/open-url.ts +25 -0
  362. package/src/lib/pinned-http.ts +182 -0
  363. package/src/lib/privacy.ts +20 -0
  364. package/src/lib/process-control.ts +168 -0
  365. package/src/lib/provider-environment.ts +470 -0
  366. package/src/lib/provider-outbound.ts +203 -0
  367. package/src/lib/provider-url.ts +14 -0
  368. package/src/lib/proxy-env.ts +18 -0
  369. package/src/lib/redact.ts +510 -0
  370. package/src/lib/remodex-home.ts +616 -0
  371. package/src/lib/retry-after.ts +55 -0
  372. package/src/lib/service-secrets.ts +178 -0
  373. package/src/lib/shadow-call.ts +54 -0
  374. package/src/lib/sidecar-tracker.ts +52 -0
  375. package/src/lib/sse-decoder.ts +364 -0
  376. package/src/lib/state-store-registrations.ts +109 -0
  377. package/src/lib/state-store-sweeper.ts +184 -0
  378. package/src/lib/system-restart-contract.ts +73 -0
  379. package/src/lib/test-home-guard.ts +98 -0
  380. package/src/lib/token-estimate.ts +69 -0
  381. package/src/lib/translator-budget.ts +366 -0
  382. package/src/lib/upstream-reachability.ts +91 -0
  383. package/src/lib/upstream-retry.ts +508 -0
  384. package/src/lib/win-exec.ts +115 -0
  385. package/src/lib/win-paths.ts +68 -0
  386. package/src/lib/windows-elevation.ts +705 -0
  387. package/src/lib/windows-secret-acl.ts +817 -0
  388. package/src/lib/windows-user-principal.ts +283 -0
  389. package/src/lib/winsw.ts +402 -0
  390. package/src/model-sources.ts +73 -0
  391. package/src/oauth/anthropic-routing.ts +594 -0
  392. package/src/oauth/anthropic.ts +177 -0
  393. package/src/oauth/callback-server.ts +294 -0
  394. package/src/oauth/chatgpt.ts +150 -0
  395. package/src/oauth/command-code.ts +239 -0
  396. package/src/oauth/cursor.ts +231 -0
  397. package/src/oauth/github-copilot.ts +428 -0
  398. package/src/oauth/google-antigravity.ts +230 -0
  399. package/src/oauth/health.ts +443 -0
  400. package/src/oauth/index.ts +1280 -0
  401. package/src/oauth/key-providers.ts +128 -0
  402. package/src/oauth/kimi.ts +213 -0
  403. package/src/oauth/kiro-credentials.ts +726 -0
  404. package/src/oauth/kiro.ts +621 -0
  405. package/src/oauth/local-token-detect.ts +121 -0
  406. package/src/oauth/log.ts +48 -0
  407. package/src/oauth/login-cli.ts +163 -0
  408. package/src/oauth/pkce.ts +15 -0
  409. package/src/oauth/store.ts +655 -0
  410. package/src/oauth/token-guardian.ts +309 -0
  411. package/src/oauth/types.ts +62 -0
  412. package/src/oauth/xai.ts +241 -0
  413. package/src/providers/alibaba-region-backup.ts +75 -0
  414. package/src/providers/alibaba-region-migration.ts +156 -0
  415. package/src/providers/alibaba-region-startup.ts +36 -0
  416. package/src/providers/antigravity-models.ts +317 -0
  417. package/src/providers/api-keys.ts +140 -0
  418. package/src/providers/base-url-choices.ts +64 -0
  419. package/src/providers/codex-capacity.ts +288 -0
  420. package/src/providers/command-code-efforts.ts +85 -0
  421. package/src/providers/context-cap.ts +73 -0
  422. package/src/providers/derive.ts +451 -0
  423. package/src/providers/free-directory.ts +187 -0
  424. package/src/providers/github-copilot-transport.ts +56 -0
  425. package/src/providers/google-vertex-location.ts +14 -0
  426. package/src/providers/key-failover.ts +271 -0
  427. package/src/providers/kiro-models.ts +67 -0
  428. package/src/providers/label.ts +19 -0
  429. package/src/providers/model-discovery-limits.ts +16 -0
  430. package/src/providers/model-discovery.ts +361 -0
  431. package/src/providers/openai-sidecar.ts +235 -0
  432. package/src/providers/openai-tier-startup.ts +27 -0
  433. package/src/providers/openai-tiers.ts +301 -0
  434. package/src/providers/openai-virtual-models.ts +83 -0
  435. package/src/providers/openrouter-routing.ts +102 -0
  436. package/src/providers/provider-id-rewrite.ts +179 -0
  437. package/src/providers/quota.ts +1942 -0
  438. package/src/providers/reasoning-capabilities.ts +336 -0
  439. package/src/providers/registry.ts +2375 -0
  440. package/src/providers/slug-codec.ts +74 -0
  441. package/src/providers/xai-transport.ts +149 -0
  442. package/src/reasoning-effort.ts +243 -0
  443. package/src/responses/compaction.ts +124 -0
  444. package/src/responses/hosted-tool-policy.ts +9 -0
  445. package/src/responses/parser.ts +714 -0
  446. package/src/responses/reasoning-envelope.ts +60 -0
  447. package/src/responses/reasoning-replay-cache.ts +106 -0
  448. package/src/responses/schema.ts +159 -0
  449. package/src/responses/spill-store.ts +431 -0
  450. package/src/responses/state.ts +1039 -0
  451. package/src/responses/tool-groups.ts +19 -0
  452. package/src/router.ts +802 -0
  453. package/src/routing/analytics.ts +377 -0
  454. package/src/routing/capability.ts +205 -0
  455. package/src/routing/cost.ts +77 -0
  456. package/src/routing/evaluator.ts +444 -0
  457. package/src/routing/health.ts +401 -0
  458. package/src/routing/history/cursor.ts +43 -0
  459. package/src/routing/history/indexer.ts +605 -0
  460. package/src/routing/history/schema.ts +72 -0
  461. package/src/routing/profile-namespace.ts +15 -0
  462. package/src/routing/profile.ts +424 -0
  463. package/src/routing/quota.ts +145 -0
  464. package/src/routing/request-evidence.ts +45 -0
  465. package/src/routing/trace.ts +686 -0
  466. package/src/server/adapter-resolve.ts +83 -0
  467. package/src/server/auth-cors.ts +606 -0
  468. package/src/server/chat-completions.ts +379 -0
  469. package/src/server/claude-messages.ts +980 -0
  470. package/src/server/effort-policy.ts +251 -0
  471. package/src/server/github-copilot-responses-repair.ts +338 -0
  472. package/src/server/gui-static.ts +152 -0
  473. package/src/server/image-retry.ts +42 -0
  474. package/src/server/images.ts +485 -0
  475. package/src/server/index.ts +1633 -0
  476. package/src/server/lifecycle.ts +482 -0
  477. package/src/server/live.ts +609 -0
  478. package/src/server/management/agent-settings-routes.ts +1180 -0
  479. package/src/server/management/android-remote-routes.ts +390 -0
  480. package/src/server/management/api-access.ts +141 -0
  481. package/src/server/management/api-key-usage.ts +167 -0
  482. package/src/server/management/body.ts +35 -0
  483. package/src/server/management/combo-routes.ts +244 -0
  484. package/src/server/management/config-routes.ts +602 -0
  485. package/src/server/management/context.ts +88 -0
  486. package/src/server/management/integration-routes.ts +538 -0
  487. package/src/server/management/logs-usage-routes.ts +516 -0
  488. package/src/server/management/model-routes.ts +519 -0
  489. package/src/server/management/model-rows.ts +143 -0
  490. package/src/server/management/native-integration-routes.ts +781 -0
  491. package/src/server/management/oauth-account-routes.ts +573 -0
  492. package/src/server/management/provider-routes.ts +781 -0
  493. package/src/server/management/request-history-routes.ts +191 -0
  494. package/src/server/management/routing-analytics-routes.ts +74 -0
  495. package/src/server/management/routing-profile-routes.ts +384 -0
  496. package/src/server/management/shared.ts +277 -0
  497. package/src/server/management/sidebar-routes.ts +106 -0
  498. package/src/server/management/sync-response.ts +69 -0
  499. package/src/server/management/system-restart.ts +433 -0
  500. package/src/server/management/system-routes.ts +141 -0
  501. package/src/server/management/usage-summary-cache.ts +86 -0
  502. package/src/server/management-api.ts +269 -0
  503. package/src/server/management-auth.ts +353 -0
  504. package/src/server/memory-watchdog.ts +156 -0
  505. package/src/server/port-reclaim.ts +307 -0
  506. package/src/server/ports.ts +156 -0
  507. package/src/server/proxy-liveness.ts +326 -0
  508. package/src/server/proxy-stop.ts +92 -0
  509. package/src/server/readiness.ts +99 -0
  510. package/src/server/relay-eager.ts +353 -0
  511. package/src/server/relay.ts +1179 -0
  512. package/src/server/request-decompress.ts +132 -0
  513. package/src/server/request-log-conversation.ts +168 -0
  514. package/src/server/request-log.ts +1072 -0
  515. package/src/server/responses/collaboration.ts +409 -0
  516. package/src/server/responses/compact.ts +710 -0
  517. package/src/server/responses/core.ts +3561 -0
  518. package/src/server/responses/encrypted-payload.ts +308 -0
  519. package/src/server/responses/fetch-helpers.ts +171 -0
  520. package/src/server/responses/passthrough-error.ts +78 -0
  521. package/src/server/responses/policy-fallback.ts +152 -0
  522. package/src/server/responses/terminal-guard.ts +230 -0
  523. package/src/server/responses/upstream-error.ts +48 -0
  524. package/src/server/responses-image-gen-repair.ts +132 -0
  525. package/src/server/responses-item-id-repair.ts +272 -0
  526. package/src/server/responses-json-events.ts +52 -0
  527. package/src/server/responses-model-rewrite.ts +29 -0
  528. package/src/server/responses-snapshot-repair.ts +621 -0
  529. package/src/server/responses.ts +10 -0
  530. package/src/server/search.ts +181 -0
  531. package/src/server/sse-frame-buffer.ts +292 -0
  532. package/src/server/sse-payload-rewrite.ts +263 -0
  533. package/src/server/startup-action-control.ts +308 -0
  534. package/src/server/startup-health-cache.ts +119 -0
  535. package/src/server/system-env.ts +418 -0
  536. package/src/server/windows-tcp-drop.ts +184 -0
  537. package/src/server/windows-tray-control.ts +41 -0
  538. package/src/server/ws-bridge.ts +470 -0
  539. package/src/service-manager-probe.ts +824 -0
  540. package/src/service.ts +3011 -0
  541. package/src/stall-timeout.ts +20 -0
  542. package/src/storage/cleanup-job.ts +57 -0
  543. package/src/storage/cleanup.ts +3085 -0
  544. package/src/storage/policy-job.ts +457 -0
  545. package/src/storage/policy-scheduler.ts +40 -0
  546. package/src/storage/policy-worker.ts +59 -0
  547. package/src/storage/policy.ts +527 -0
  548. package/src/storage/restore-job.ts +299 -0
  549. package/src/storage/restore-worker.ts +58 -0
  550. package/src/storage/scanner.ts +238 -0
  551. package/src/storage/storage-mutation-coordinator.ts +139 -0
  552. package/src/storage/worker-lifecycle.ts +215 -0
  553. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  554. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  555. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  556. package/src/tray/assets/opencodex-tray.png +0 -0
  557. package/src/tray/windows-tray.ps1 +364 -0
  558. package/src/tray/windows.ts +738 -0
  559. package/src/types.ts +1531 -0
  560. package/src/update/badge.ts +72 -0
  561. package/src/update/desktop-release.ts +1620 -0
  562. package/src/update/index.ts +402 -0
  563. package/src/update/job.ts +1906 -0
  564. package/src/update/notify.ts +261 -0
  565. package/src/update/npm-cache-preflight.d.mts +47 -0
  566. package/src/update/npm-cache-preflight.mjs +201 -0
  567. package/src/update/npm-invocation.d.mts +23 -0
  568. package/src/update/npm-invocation.mjs +94 -0
  569. package/src/update/tray-update-plan.d.mts +18 -0
  570. package/src/update/tray-update-plan.mjs +38 -0
  571. package/src/usage/cost.ts +0 -0
  572. package/src/usage/debug.ts +97 -0
  573. package/src/usage/expected-prices.ts +283 -0
  574. package/src/usage/log.ts +695 -0
  575. package/src/usage/summary.ts +585 -0
  576. package/src/usage/totals.ts +14 -0
  577. package/src/vision/anthropic-describe.ts +185 -0
  578. package/src/vision/describe.ts +127 -0
  579. package/src/vision/index.ts +558 -0
  580. package/src/vision/reasoning.ts +55 -0
  581. package/src/web-search/anthropic-executor.ts +189 -0
  582. package/src/web-search/executor.ts +105 -0
  583. package/src/web-search/format-result.ts +89 -0
  584. package/src/web-search/index.ts +196 -0
  585. package/src/web-search/loop.ts +791 -0
  586. package/src/web-search/parse.ts +235 -0
  587. package/src/web-search/progress-stream.ts +342 -0
  588. package/src/web-search/synthetic-tool.ts +47 -0
@@ -0,0 +1,302 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, realpathSync, statSync } from "node:fs";
3
+ import { basename, dirname, resolve } from "node:path";
4
+
5
+ import { expandUserPath } from "../../config";
6
+ import type {
7
+ CatalogConditionalSourceObservations,
8
+ CatalogConditionalSourceRole,
9
+ CatalogFilesystemIdentity,
10
+ CatalogHomeSelectionObservation,
11
+ CatalogRequiredSourceObservations,
12
+ CatalogRequiredSourceRole,
13
+ CatalogSourceEvidence,
14
+ CatalogSourceObservation,
15
+ CatalogSourceRole,
16
+ } from "../convergence-types";
17
+ import { defaultCodexHome } from "../home";
18
+
19
+ export type CatalogGatherReadableSourceRole =
20
+ | "active-catalog-merge"
21
+ | "hashed-backup-fallback"
22
+ | "legacy-backup-fallback"
23
+ | "models-cache-fallback"
24
+ | "runtime-selection";
25
+
26
+ /** The minimal observe-only source interface consumed by bundled catalog selection. */
27
+ export interface CatalogGatherEvidenceSession {
28
+ readSource(role: CatalogGatherReadableSourceRole): Uint8Array | null;
29
+ }
30
+
31
+ /** The exact observe-only auth input consumed by provider discovery. */
32
+ export interface CatalogGatherProviderAuthEvidence {
33
+ readonly authStoreBuffer: Uint8Array | null;
34
+ }
35
+
36
+ export type CatalogFilesystemEvidenceSession = CatalogGatherEvidenceSession
37
+ & CatalogGatherProviderAuthEvidence;
38
+
39
+ const CONDITIONAL_SOURCE_ROLES = [
40
+ "bundled-catalog-template",
41
+ "active-catalog-merge",
42
+ "hashed-backup-fallback",
43
+ "legacy-backup-fallback",
44
+ "models-cache-fallback",
45
+ "native-catalog-selection",
46
+ "runtime-selection",
47
+ "provider-auth-selection",
48
+ ] as const satisfies readonly CatalogConditionalSourceRole[];
49
+
50
+ interface MutableSessionState {
51
+ homeSelection: CatalogHomeSelectionObservation | null;
52
+ readonly sourcePaths: Map<CatalogSourceRole, string>;
53
+ requiredTargetSelection: CatalogSourceObservation<CatalogRequiredSourceRole> | null;
54
+ readonly conditional: Record<CatalogConditionalSourceRole, CatalogSourceObservation[]>;
55
+ sealed: boolean;
56
+ }
57
+
58
+ const sessionStates = new WeakMap<object, MutableSessionState>();
59
+
60
+ function filesystemIdentity(
61
+ entry: Readonly<{ dev: bigint; ino: bigint }>,
62
+ ): CatalogFilesystemIdentity {
63
+ return Object.freeze({ volume: String(entry.dev), fileId: String(entry.ino) });
64
+ }
65
+
66
+ function sessionState(session: CatalogFilesystemEvidenceSession): MutableSessionState {
67
+ const state = sessionStates.get(session);
68
+ if (!state) {
69
+ throw new TypeError("Catalog filesystem evidence session was not created by its owner.");
70
+ }
71
+ return state;
72
+ }
73
+
74
+ function assertOpen(state: MutableSessionState): void {
75
+ if (state.sealed) throw new Error("Catalog filesystem evidence session is already sealed.");
76
+ }
77
+
78
+ function observedHomeSelection(): CatalogHomeSelectionObservation {
79
+ const environmentSelector = process.env.CODEX_HOME?.trim();
80
+ const selector = environmentSelector
81
+ ? { kind: "environment" as const, raw: environmentSelector }
82
+ : { kind: "default" as const, raw: defaultCodexHome() };
83
+ const selectedPath = selector.kind === "environment"
84
+ ? resolve(expandUserPath(selector.raw))
85
+ : resolve(selector.raw);
86
+ const canonicalCodexHome = realpathSync.native(selectedPath);
87
+ const root = statSync(canonicalCodexHome, { bigint: true });
88
+ if (!root.isDirectory()) {
89
+ throw new Error(`Codex home is not a directory: ${selectedPath}`);
90
+ }
91
+ return Object.freeze({
92
+ selector: Object.freeze(selector),
93
+ canonicalCodexHome,
94
+ rootIdentity: filesystemIdentity(root),
95
+ });
96
+ }
97
+
98
+ /** Capture and freeze the selector/root authority before any derived path is admitted. */
99
+ export function captureAndSealCatalogHomeSelection(
100
+ session: CatalogFilesystemEvidenceSession,
101
+ ): CatalogHomeSelectionObservation {
102
+ const state = sessionState(session);
103
+ assertOpen(state);
104
+ if (state.homeSelection) return state.homeSelection;
105
+ state.homeSelection = observedHomeSelection();
106
+ return state.homeSelection;
107
+ }
108
+
109
+ /** Bind the next consultation for a closed role without exposing the evidence arrays. */
110
+ export function acceptCatalogGatherSourcePath(
111
+ session: CatalogFilesystemEvidenceSession,
112
+ role: CatalogSourceRole,
113
+ logicalPath: string,
114
+ ): void {
115
+ const state = sessionState(session);
116
+ assertOpen(state);
117
+ if (!state.homeSelection) {
118
+ throw new Error("Catalog home selection must be sealed before accepting a derived path.");
119
+ }
120
+ state.sourcePaths.set(role, resolve(logicalPath));
121
+ }
122
+
123
+ function isMissing(error: unknown): boolean {
124
+ return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
125
+ }
126
+
127
+ function observeSource<R extends CatalogSourceRole>(
128
+ role: R,
129
+ logicalPath: string,
130
+ ): Readonly<{ bytes: Uint8Array | null; observation: CatalogSourceObservation<R> }> {
131
+ const canonicalParent = realpathSync.native(dirname(logicalPath));
132
+ const parent = statSync(canonicalParent, { bigint: true });
133
+ if (!parent.isDirectory()) {
134
+ throw new Error(`Catalog source parent is not a directory: ${dirname(logicalPath)}`);
135
+ }
136
+ const parentIdentity = Object.freeze({
137
+ canonicalPath: canonicalParent,
138
+ ...filesystemIdentity(parent),
139
+ });
140
+
141
+ let bytes: Uint8Array;
142
+ try {
143
+ bytes = Uint8Array.from(readFileSync(logicalPath));
144
+ } catch (error) {
145
+ if (!isMissing(error)) throw error;
146
+ return Object.freeze({
147
+ bytes: null,
148
+ observation: Object.freeze({
149
+ state: "absent" as const,
150
+ role,
151
+ logicalPath,
152
+ canonicalPath: resolve(canonicalParent, basename(logicalPath)),
153
+ parentIdentity,
154
+ fileIdentity: null,
155
+ }),
156
+ });
157
+ }
158
+
159
+ const canonicalPath = realpathSync.native(logicalPath);
160
+ const file = statSync(canonicalPath, { bigint: true });
161
+ if (!file.isFile()) throw new Error(`Catalog source is not a regular file: ${logicalPath}`);
162
+ return Object.freeze({
163
+ bytes,
164
+ observation: Object.freeze({
165
+ state: "present" as const,
166
+ role,
167
+ logicalPath,
168
+ canonicalPath,
169
+ parentIdentity,
170
+ fileIdentity: filesystemIdentity(file),
171
+ sha256: createHash("sha256").update(bytes).digest("hex"),
172
+ }),
173
+ });
174
+ }
175
+
176
+ /** Read once, record PRESENT/ABSENT first, then return the exact hashed buffer. */
177
+ export function readCatalogGatherSource<R extends CatalogSourceRole>(
178
+ session: CatalogFilesystemEvidenceSession,
179
+ role: R,
180
+ ): Uint8Array | null {
181
+ const state = sessionState(session);
182
+ assertOpen(state);
183
+ const logicalPath = state.sourcePaths.get(role);
184
+ if (!logicalPath) throw new Error(`No catalog source path was accepted for role ${role}.`);
185
+ if (role === "catalog-target-selection" && state.requiredTargetSelection) {
186
+ throw new Error(`Required catalog source role ${role} was already observed.`);
187
+ }
188
+
189
+ const observed = observeSource(role, logicalPath);
190
+ if (role === "catalog-target-selection") {
191
+ state.requiredTargetSelection = observed.observation as CatalogSourceObservation<"catalog-target-selection">;
192
+ } else {
193
+ state.conditional[role as CatalogConditionalSourceRole].push(observed.observation);
194
+ }
195
+ return observed.bytes;
196
+ }
197
+
198
+ function optionalFileIdentity(path: string): Readonly<{ device: string; inode: string }> | null {
199
+ try {
200
+ const entry = statSync(path, { bigint: true });
201
+ return { device: String(entry.dev), inode: String(entry.ino) };
202
+ } catch (error) {
203
+ if (isMissing(error)) return null;
204
+ throw error;
205
+ }
206
+ }
207
+
208
+ /** Probe a candidate write target without allowing filesystem mutation. */
209
+ export function captureCatalogGatherTargetIdentity(
210
+ session: CatalogFilesystemEvidenceSession,
211
+ path: string,
212
+ ): string {
213
+ const state = sessionState(session);
214
+ assertOpen(state);
215
+ if (!state.homeSelection) {
216
+ throw new Error("Catalog home selection must be sealed before accepting a derived path.");
217
+ }
218
+ const textualPath = resolve(path);
219
+ const canonicalParent = realpathSync.native(dirname(textualPath));
220
+ const parent = statSync(canonicalParent, { bigint: true });
221
+ return JSON.stringify({
222
+ path: textualPath,
223
+ canonicalParent,
224
+ parentIdentity: { device: String(parent.dev), inode: String(parent.ino) },
225
+ fileIdentity: optionalFileIdentity(textualPath),
226
+ });
227
+ }
228
+
229
+ function cloneObservation<R extends CatalogSourceRole>(
230
+ observation: CatalogSourceObservation<R>,
231
+ ): CatalogSourceObservation<R> {
232
+ if (observation.state === "absent") {
233
+ return Object.freeze({
234
+ ...observation,
235
+ parentIdentity: Object.freeze({ ...observation.parentIdentity }),
236
+ fileIdentity: null,
237
+ });
238
+ }
239
+ return Object.freeze({
240
+ ...observation,
241
+ parentIdentity: Object.freeze({ ...observation.parentIdentity }),
242
+ fileIdentity: Object.freeze({ ...observation.fileIdentity }),
243
+ });
244
+ }
245
+
246
+ /** Seal one complete owner-created session into detached, recursively frozen evidence. */
247
+ export function sealCatalogGatherEvidenceSession(
248
+ session: CatalogFilesystemEvidenceSession,
249
+ ): CatalogSourceEvidence {
250
+ const state = sessionState(session);
251
+ assertOpen(state);
252
+ if (!state.homeSelection) throw new Error("Catalog home selection is required before sealing.");
253
+ const targetSelection = state.requiredTargetSelection;
254
+ if (!targetSelection) {
255
+ throw new Error("Required catalog source role catalog-target-selection was not observed.");
256
+ }
257
+ for (const role of CONDITIONAL_SOURCE_ROLES) {
258
+ if (!Object.hasOwn(state.conditional, role)) {
259
+ throw new Error(`Conditional catalog source role ${role} is missing.`);
260
+ }
261
+ }
262
+
263
+ const conditional = Object.fromEntries(CONDITIONAL_SOURCE_ROLES.map(role => [
264
+ role,
265
+ Object.freeze(state.conditional[role].map(observation => cloneObservation(observation))),
266
+ ])) as unknown as CatalogConditionalSourceObservations;
267
+ const required = Object.freeze({
268
+ "catalog-target-selection": cloneObservation(targetSelection),
269
+ }) as CatalogRequiredSourceObservations;
270
+ const evidence = Object.freeze({
271
+ homeSelection: Object.freeze({
272
+ ...state.homeSelection,
273
+ selector: Object.freeze({ ...state.homeSelection.selector }),
274
+ rootIdentity: Object.freeze({ ...state.homeSelection.rootIdentity }),
275
+ }),
276
+ required,
277
+ conditional: Object.freeze(conditional),
278
+ });
279
+ state.sealed = true;
280
+ return evidence;
281
+ }
282
+
283
+ /** Create an opaque session; all mutable evidence state remains module-private. */
284
+ export function createCatalogGatherEvidenceSession(): CatalogFilesystemEvidenceSession {
285
+ let session: CatalogFilesystemEvidenceSession;
286
+ session = Object.freeze({
287
+ readSource: (role: CatalogGatherReadableSourceRole) => readCatalogGatherSource(session, role),
288
+ get authStoreBuffer(): Uint8Array | null {
289
+ return readCatalogGatherSource(session, "provider-auth-selection");
290
+ },
291
+ });
292
+ sessionStates.set(session, {
293
+ homeSelection: null,
294
+ sourcePaths: new Map(),
295
+ requiredTargetSelection: null,
296
+ conditional: Object.fromEntries(
297
+ CONDITIONAL_SOURCE_ROLES.map(role => [role, [] as CatalogSourceObservation[]]),
298
+ ) as unknown as MutableSessionState["conditional"],
299
+ sealed: false,
300
+ });
301
+ return session;
302
+ }
@@ -0,0 +1,2 @@
1
+ /** Stable ownership marker for a routed combo that deliberately owns a bare native slug. */
2
+ export const CODEX_NATIVE_ALIAS_CATALOG_KIND = "combo-native-alias-v1";
@@ -0,0 +1,287 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync } from "node:fs";
4
+ import { delimiter, dirname, join, resolve } from "node:path";
5
+ import { atomicWriteFile, expandUserPath, getConfigDir, websocketsEnabled } from "../../config";
6
+ import { CODEX_CONFIG_PATH, CODEX_MODELS_CACHE_PATH, DEFAULT_CATALOG_PATH, readRootTomlString, resolveCodexConfigPath } from "../paths";
7
+ import { clearModelCache, DEFAULT_MODEL_CACHE_TTL_MS, getFreshCached, getStaleCached, isModelsFetchCoolingDown, markModelsFetchFailure, setCached } from "../model-cache";
8
+ import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
9
+ import type { OcxConfig, OcxProviderConfig } from "../../types";
10
+ import { modelInList } from "../../types";
11
+ import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
12
+ import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
13
+ import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
14
+ import { getProviderRegistryEntry } from "../../providers/registry";
15
+ import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
16
+ import { routedSlug, slugEquals, slugsEquivalent } from "../../providers/slug-codec";
17
+ import { CODEX_GPT5_IDENTITY_LINE } from "../../adapters/identity";
18
+ import { filterCursorConfiguredModelsByLiveDiscovery } from "../../adapters/cursor/discovery";
19
+ import { fetchCursorUsableModels } from "../../adapters/cursor/live-models";
20
+ import { isCanonicalOpenAiForwardProvider, OPENAI_API_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers";
21
+ import { modelSourceVisible } from "../../model-sources";
22
+ import {
23
+ COMBO_NAMESPACE,
24
+ comboModelId,
25
+ getCombo,
26
+ isNativeAliasCombo,
27
+ listComboIds,
28
+ targetKey,
29
+ } from "../../combos";
30
+ import type { NormalizedComboConfig } from "../../combos/types";
31
+ import { providerDestinationResolvedError } from "../../lib/destination-policy";
32
+ import { redactSecretString } from "../../lib/redact";
33
+ import upstreamModelsSnapshot from "../data/upstream-models.json";
34
+
35
+
36
+ import type { RawEntry } from "./parsing";
37
+ import { readCurrentCatalogOrCache, unique } from "./bundled";
38
+ import { trustedAccountBoundNativeCatalogSlug } from "./account-models";
39
+ import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
40
+ import { NATIVE_OPENAI_MODELS, SUPPORTED_NATIVE_OPENAI_SLUGS } from "./native-models";
41
+ export { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
42
+ export { NATIVE_OPENAI_MODELS, SUPPORTED_NATIVE_OPENAI_SLUGS } from "./native-models";
43
+
44
+ export const DOCUMENTED_NATIVE_OPENAI_ADDITIONS = [
45
+ "gpt-5.3-codex-spark",
46
+ "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
47
+ ];
48
+
49
+ export function configuredNativeAliasSlugs(
50
+ config: Pick<OcxConfig, "combos">,
51
+ ): Set<string> {
52
+ const aliases = new Set<string>();
53
+ for (const raw of Object.values(config.combos ?? {})) {
54
+ if (!isNativeAliasCombo(raw)) continue;
55
+ const alias = raw.alias!.trim();
56
+ if (SUPPORTED_NATIVE_OPENAI_SLUGS.has(alias)) aliases.add(alias);
57
+ }
58
+ return aliases;
59
+ }
60
+
61
+ /**
62
+ * Bare native rows that must be absent, rather than merely hidden, while Desktop native-alias
63
+ * compatibility is active. Codex Desktop's remote allowlist can ignore `visibility: "hide"`;
64
+ * omitting disabled native rows is therefore part of the explicit native-alias opt-in.
65
+ */
66
+ export function desktopAllowlistSuppressedNativeSlugs(
67
+ config: Pick<OcxConfig, "combos" | "disabledModels">,
68
+ ): Set<string> {
69
+ const suppressed = configuredNativeAliasSlugs(config);
70
+ if (suppressed.size === 0) return suppressed;
71
+ const disabled = disabledNativeSlugs(config);
72
+ for (const slug of NATIVE_OPENAI_MODELS) {
73
+ if (disabled.has(slug)) suppressed.add(slug);
74
+ }
75
+ return suppressed;
76
+ }
77
+
78
+ export function isNativeAliasCatalogEntry(entry: RawEntry): boolean {
79
+ return entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND;
80
+ }
81
+
82
+ export function isUnsupportedOpenAiNativeSlug(slug: string): boolean {
83
+ if (slug.includes("/")) return false;
84
+ if (SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)) return false;
85
+ return /^(?:gpt|codex)-/.test(slug);
86
+ }
87
+
88
+ export const NATIVE_GPT56_CONTEXT_WINDOW = 372_000;
89
+
90
+ export const NATIVE_OPENAI_CONTEXT_OVERRIDES: Record<string, { contextWindow?: number; maxContextWindow?: number }> = {
91
+ "gpt-5.5": { contextWindow: 272_000, maxContextWindow: 272_000 },
92
+ "gpt-5.4": { contextWindow: 1_000_000, maxContextWindow: 1_000_000 },
93
+ "gpt-5.3-codex-spark": { contextWindow: 100_000, maxContextWindow: 100_000 },
94
+ "gpt-5.6-sol": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_CONTEXT_WINDOW },
95
+ "gpt-5.6-terra": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_CONTEXT_WINDOW },
96
+ "gpt-5.6-luna": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_CONTEXT_WINDOW },
97
+ };
98
+
99
+ /**
100
+ * Pinned capability metadata is safe to use as a fallback for every supported native model.
101
+ * Keep it separate from UPSTREAM_NATIVE_ENTRIES: that narrower map also authorizes replacing
102
+ * persisted native rows during sync, which is currently intentional only for the GPT-5.6 family.
103
+ */
104
+ const PINNED_NATIVE_CAPABILITY_ENTRIES: Map<string, RawEntry> = new Map(
105
+ ((upstreamModelsSnapshot as unknown as { models?: RawEntry[] }).models ?? [])
106
+ .filter(m => typeof m.slug === "string"
107
+ && SUPPORTED_NATIVE_OPENAI_SLUGS.has(m.slug as string))
108
+ .map(m => [m.slug as string, m]),
109
+ );
110
+
111
+ export function nativeOpenAiContextWindow(slug: string): number | undefined {
112
+ return NATIVE_OPENAI_CONTEXT_OVERRIDES[slug]?.contextWindow
113
+ ?? (typeof PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.context_window === "number"
114
+ ? PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)!.context_window as number
115
+ : undefined);
116
+ }
117
+
118
+ export function nativeInputModalities(slug: string): string[] {
119
+ const upstream = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug);
120
+ if (Array.isArray(upstream?.input_modalities) && upstream!.input_modalities!.length > 0) {
121
+ return [...upstream!.input_modalities as string[]];
122
+ }
123
+ // gpt-5.3-codex-spark is not in the upstream snapshot; all supported natives are
124
+ // text+image capable, so default to the family baseline rather than text-only.
125
+ return ["text", "image"];
126
+ }
127
+
128
+ export function nativeReasoningEfforts(slug: string): string[] {
129
+ const upstream = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug);
130
+ const levels = Array.isArray(upstream?.supported_reasoning_levels)
131
+ ? upstream!.supported_reasoning_levels as Array<{ effort?: string }>
132
+ : [];
133
+ if (levels.length > 0) {
134
+ // Preserve the exact pinned per-model ladder. In particular, GPT-5.6 Sol and Terra
135
+ // include ultra while Luna intentionally ends at max.
136
+ return levels.flatMap(l => typeof l.effort === "string" ? [l.effort] : []);
137
+ }
138
+ // gpt-5.3-codex-spark is not in upstream snapshot — use the standard old-ladder default.
139
+ return ["low", "medium", "high", "xhigh"];
140
+ }
141
+
142
+ /** Upstream-pinned default for a native slug, when present and non-empty. */
143
+ export function nativeDefaultReasoningEffort(slug: string): string | undefined {
144
+ const level = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.default_reasoning_level;
145
+ return typeof level === "string" && level.length > 0 ? level : undefined;
146
+ }
147
+
148
+ /** Upstream-pinned multi-agent surface for a supported native slug, when present. */
149
+ export function nativeMultiAgentVersion(slug: string): string | undefined {
150
+ const version = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.multi_agent_version;
151
+ return typeof version === "string" && version.length > 0 ? version : undefined;
152
+ }
153
+
154
+ export function nativeParallelToolCalls(slug: string): boolean {
155
+ return PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.supports_parallel_tool_calls === true
156
+ || false;
157
+ }
158
+
159
+ export function hasComboTargets(config: { combos?: Record<string, { targets?: unknown[] }> }): boolean {
160
+ const combos = config.combos;
161
+ if (!combos) return false;
162
+ return Object.values(combos).some(c => Array.isArray(c?.targets) && c!.targets!.length > 0);
163
+ }
164
+
165
+ export function disabledNativeSlugs(config: Pick<OcxConfig, "disabledModels">): Set<string> {
166
+ return new Set((config.disabledModels ?? []).filter(id => !id.includes("/")));
167
+ }
168
+
169
+ export function visibleNativeSlugs(
170
+ config: Pick<OcxConfig, "disabledModels" | "combos" | "modelSourceVisibility">,
171
+ ): string[] {
172
+ if (!modelSourceVisible(config, OPENAI_CODEX_PROVIDER_ID)) return [];
173
+ const disabled = disabledNativeSlugs(config);
174
+ const shadowed = configuredNativeAliasSlugs(config);
175
+ return nativeOpenAiSlugs().filter(slug => !disabled.has(slug) && !shadowed.has(slug));
176
+ }
177
+
178
+ /** Whether an enabled canonical OpenAI provider can serve exact account-qualified routes. */
179
+ export function shouldIncludeAccountBoundNativeOpenAi(
180
+ config: Pick<OcxConfig, "providers" | "modelSourceVisibility">,
181
+ ): boolean {
182
+ if (!modelSourceVisible(config, OPENAI_CODEX_PROVIDER_ID)) return false;
183
+ const provider = config.providers[OPENAI_CODEX_PROVIDER_ID];
184
+ if (!provider || provider.disabled === true) return false;
185
+ // Registry routing defaults an omitted authMode on the built-in OpenAI row to forward.
186
+ const canonical = provider.authMode === undefined
187
+ ? { ...provider, authMode: "forward" as const }
188
+ : provider;
189
+ return isCanonicalOpenAiForwardProvider(canonical);
190
+ }
191
+
192
+ /** Whether native ChatGPT/Codex rows belong in this provider configuration. */
193
+ export function shouldIncludeNativeOpenAi(
194
+ config: Pick<OcxConfig, "providers" | "modelSourceVisibility">,
195
+ ): boolean {
196
+ if (!modelSourceVisible(config, OPENAI_CODEX_PROVIDER_ID)) return false;
197
+ const hasEnabledProvider = Object.values(config.providers)
198
+ .some(provider => provider.disabled !== true);
199
+ // Preserve the existing no-enabled-provider catalog bootstrap, but do not use that bootstrap
200
+ // exception for account-qualified rows: exact-account routing requires a live OpenAI provider.
201
+ return !hasEnabledProvider || shouldIncludeAccountBoundNativeOpenAi(config);
202
+ }
203
+
204
+ /** Native slugs exposed to Claude Desktop show/export/apply (opt-out via claudeCode.desktopNativeModels). */
205
+ export function desktopVisibleNativeSlugs(
206
+ config: Pick<OcxConfig, "claudeCode" | "disabledModels" | "combos" | "modelSourceVisibility">,
207
+ ): string[] {
208
+ if (config.claudeCode?.desktopNativeModels === false) return [];
209
+ return visibleNativeSlugs(config);
210
+ }
211
+
212
+ export function nativeModelRows(config: Pick<OcxConfig, "disabledModels" | "combos">): Array<{ slug: string; disabled: boolean; contextWindow?: number }> {
213
+ const disabled = disabledNativeSlugs(config);
214
+ const shadowed = configuredNativeAliasSlugs(config);
215
+ return NATIVE_OPENAI_MODELS.filter(slug => !shadowed.has(slug)).map(slug => {
216
+ const contextWindow = nativeOpenAiContextWindow(slug);
217
+ return { slug, disabled: disabled.has(slug), ...(contextWindow !== undefined ? { contextWindow } : {}) };
218
+ });
219
+ }
220
+
221
+ export function applyNativeVisibility(
222
+ entries: RawEntry[],
223
+ disabledModels: ReadonlySet<string>,
224
+ hideBareNative = false,
225
+ ): RawEntry[] {
226
+ for (const entry of entries) {
227
+ if (isNativeAliasCatalogEntry(entry)) continue;
228
+ const slug = typeof entry.slug === "string" ? entry.slug : "";
229
+ const accountBoundSlug = trustedAccountBoundNativeCatalogSlug(entry);
230
+ const nativeSlug = accountBoundSlug ?? slug;
231
+ if (!nativeSlug
232
+ || (!accountBoundSlug && slug.includes("/"))
233
+ || !SUPPORTED_NATIVE_OPENAI_SLUGS.has(nativeSlug)) continue;
234
+ const disabled = disabledModels.has(nativeSlug)
235
+ || (accountBoundSlug !== undefined && disabledModels.has(slug));
236
+ entry.visibility = disabled || (!accountBoundSlug && hideBareNative)
237
+ ? "hide"
238
+ : "list";
239
+ }
240
+ return entries;
241
+ }
242
+
243
+ export const UPSTREAM_NATIVE_ENTRIES: Map<string, RawEntry> = new Map(
244
+ ((upstreamModelsSnapshot as unknown as { models?: RawEntry[] }).models ?? [])
245
+ .filter(m => typeof m.slug === "string"
246
+ && SUPPORTED_NATIVE_OPENAI_SLUGS.has(m.slug as string)
247
+ && (m.slug as string).startsWith("gpt-5.6-"))
248
+ .map(m => [m.slug as string, m]),
249
+ );
250
+
251
+ export function upstreamNativeEntry(slug: string): RawEntry | null {
252
+ const entry = UPSTREAM_NATIVE_ENTRIES.get(slug);
253
+ if (!entry) return null;
254
+ const clone = JSON.parse(JSON.stringify(entry)) as RawEntry;
255
+ delete clone.minimal_client_version;
256
+ return clone;
257
+ }
258
+
259
+ export function shouldUpgradeToUpstreamEntry(entry: RawEntry): boolean {
260
+ return typeof entry.slug === "string"
261
+ && UPSTREAM_NATIVE_ENTRIES.has(entry.slug)
262
+ && entry.display_name === entry.slug;
263
+ }
264
+
265
+ export function nativeOpenAiSlugs(): string[] {
266
+ const live = listCatalogNativeSlugs();
267
+ return live.length > 0 ? unique([...live, ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]) : NATIVE_OPENAI_MODELS;
268
+ }
269
+
270
+ export function listCatalogNativeSlugs(): string[] {
271
+ const cat = readCurrentCatalogOrCache();
272
+ const models = cat?.models ?? [];
273
+ const live = models.flatMap(entry => {
274
+ const slug = typeof entry.slug === "string" ? entry.slug : "";
275
+ return !slug.includes("/") && SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug) ? [slug] : [];
276
+ });
277
+ const accountBound = models.flatMap(entry => {
278
+ const slug = trustedAccountBoundNativeCatalogSlug(entry);
279
+ return slug !== undefined && SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug) ? [slug] : [];
280
+ });
281
+ // Deliberately ignore `visibility`: it is a rendered projection of disabledModels and account
282
+ // selectors, so treating it as fresh availability would shrink the supported set between syncs.
283
+ // visibleNativeSlugs applies the current disabledModels source of truth for public consumers.
284
+ // Ensure documented additions (e.g. gpt-5.3-codex-spark) appear even when the bundled catalog
285
+ // predates the slug — mirrors nativeOpenAiSlugs() which already merges them for /v1/models.
286
+ return unique([...live, ...accountBound, ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]);
287
+ }
@@ -0,0 +1,7 @@
1
+ /** Native OpenAI model ids that this release can route and restore with authoritative metadata. */
2
+ export const NATIVE_OPENAI_MODELS = [
3
+ "gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex-spark",
4
+ "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
5
+ ];
6
+
7
+ export const SUPPORTED_NATIVE_OPENAI_SLUGS = new Set(NATIVE_OPENAI_MODELS);