@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -4,17 +4,19 @@ import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync } from
|
|
|
4
4
|
import { delimiter, dirname, join, resolve } from "node:path";
|
|
5
5
|
import { atomicWriteFile, expandUserPath, getConfigDir, websocketsEnabled } from "../../config";
|
|
6
6
|
import { CODEX_CONFIG_PATH, CODEX_MODELS_CACHE_PATH, DEFAULT_CATALOG_PATH, readRootTomlString, resolveCodexConfigPath } from "../paths";
|
|
7
|
+
import { codexAccountNamespaceEntries, isMainCodexAccountTarget } from "../account-namespaces";
|
|
7
8
|
import { clearModelCache, DEFAULT_MODEL_CACHE_TTL_MS, getFreshCached, getStaleCached, isModelsFetchCoolingDown, markModelsFetchFailure, setCached } from "../model-cache";
|
|
8
9
|
import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
|
|
9
10
|
import type { OcxConfig, OcxProviderConfig } from "../../types";
|
|
10
11
|
import { modelInList } from "../../types";
|
|
11
12
|
import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
|
|
12
|
-
import {
|
|
13
|
+
import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
|
|
13
14
|
import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
|
|
14
|
-
import { getProviderRegistryEntry } from "../../providers/registry";
|
|
15
|
+
import { getProviderRegistryEntry, providerCodexAccountMode } from "../../providers/registry";
|
|
15
16
|
import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
|
|
17
|
+
import { clampAutoCompactTokenLimit } from "../../providers/auto-compact-budget";
|
|
16
18
|
import { routedSlug, slugEquals, slugsEquivalent } from "../../providers/slug-codec";
|
|
17
|
-
import {
|
|
19
|
+
import { identifyRoutedModel } from "../../adapters/identity";
|
|
18
20
|
import { filterCursorConfiguredModelsByLiveDiscovery } from "../../adapters/cursor/discovery";
|
|
19
21
|
import { fetchCursorUsableModels } from "../../adapters/cursor/live-models";
|
|
20
22
|
import { isCanonicalOpenAiForwardProvider, OPENAI_API_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers";
|
|
@@ -22,6 +24,7 @@ import {
|
|
|
22
24
|
COMBO_NAMESPACE,
|
|
23
25
|
comboModelId,
|
|
24
26
|
getCombo,
|
|
27
|
+
isNativeAliasCombo,
|
|
25
28
|
listComboIds,
|
|
26
29
|
targetKey,
|
|
27
30
|
} from "../../combos";
|
|
@@ -31,21 +34,68 @@ import { redactSecretString } from "../../lib/redact";
|
|
|
31
34
|
import upstreamModelsSnapshot from "../data/upstream-models.json";
|
|
32
35
|
|
|
33
36
|
|
|
34
|
-
import { filterSupportedNativeSlugs } from "./parsing";
|
|
35
37
|
import type { RawEntry } from "./parsing";
|
|
36
|
-
import { readCurrentCatalogOrCache, unique } from "./bundled";
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
import { readCurrentCatalogOrCache, readCurrentCodexCatalog, readCurrentCodexModelsCache, unique } from "./bundled";
|
|
39
|
+
import { trustedAccountBoundNativeCatalogSlug, visibleCodexAccountSelectors } from "./account-models";
|
|
40
|
+
import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
|
|
41
|
+
import {
|
|
42
|
+
ACCOUNT_GATED_NATIVE_OPENAI_MODELS,
|
|
43
|
+
NATIVE_DAYBREAK_BLUE_MODEL,
|
|
44
|
+
NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS,
|
|
45
|
+
NATIVE_OPENAI_MODELS,
|
|
46
|
+
SUPPORTED_NATIVE_OPENAI_SLUGS,
|
|
47
|
+
isNativeOpenAiCapabilityAliasModel,
|
|
48
|
+
nativeOpenAiCapabilitySourceSlug,
|
|
49
|
+
} from "./native-models";
|
|
50
|
+
import { cachedAvailableAccountGatedNativeModels } from "../model-entitlements";
|
|
51
|
+
import { MAIN_CODEX_ACCOUNT_ID } from "../main-account";
|
|
52
|
+
export { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
|
|
53
|
+
export {
|
|
54
|
+
NATIVE_DAYBREAK_BLUE_MODEL,
|
|
55
|
+
NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS,
|
|
56
|
+
NATIVE_OPENAI_MODELS,
|
|
57
|
+
SUPPORTED_NATIVE_OPENAI_SLUGS,
|
|
58
|
+
isNativeOpenAiCapabilityAliasModel,
|
|
59
|
+
nativeOpenAiCapabilitySourceSlug,
|
|
60
|
+
} from "./native-models";
|
|
42
61
|
|
|
43
62
|
export const DOCUMENTED_NATIVE_OPENAI_ADDITIONS = [
|
|
44
63
|
"gpt-5.3-codex-spark",
|
|
45
64
|
"gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
|
|
46
65
|
];
|
|
47
66
|
|
|
48
|
-
export
|
|
67
|
+
export function configuredNativeAliasSlugs(
|
|
68
|
+
config: Pick<OcxConfig, "combos">,
|
|
69
|
+
): Set<string> {
|
|
70
|
+
const aliases = new Set<string>();
|
|
71
|
+
for (const raw of Object.values(config.combos ?? {})) {
|
|
72
|
+
if (!isNativeAliasCombo(raw)) continue;
|
|
73
|
+
const alias = raw.alias!.trim();
|
|
74
|
+
if (SUPPORTED_NATIVE_OPENAI_SLUGS.has(alias)) aliases.add(alias);
|
|
75
|
+
}
|
|
76
|
+
return aliases;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Bare native rows that must be absent, rather than merely hidden, while Desktop native-alias
|
|
81
|
+
* compatibility is active. Codex Desktop's remote allowlist can ignore `visibility: "hide"`;
|
|
82
|
+
* omitting disabled native rows is therefore part of the explicit native-alias opt-in.
|
|
83
|
+
*/
|
|
84
|
+
export function desktopAllowlistSuppressedNativeSlugs(
|
|
85
|
+
config: Pick<OcxConfig, "combos" | "disabledModels">,
|
|
86
|
+
): Set<string> {
|
|
87
|
+
const suppressed = configuredNativeAliasSlugs(config);
|
|
88
|
+
if (suppressed.size === 0) return suppressed;
|
|
89
|
+
const disabled = disabledNativeSlugs(config);
|
|
90
|
+
for (const slug of NATIVE_OPENAI_MODELS) {
|
|
91
|
+
if (disabled.has(slug)) suppressed.add(slug);
|
|
92
|
+
}
|
|
93
|
+
return suppressed;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function isNativeAliasCatalogEntry(entry: RawEntry): boolean {
|
|
97
|
+
return entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND;
|
|
98
|
+
}
|
|
49
99
|
|
|
50
100
|
export function isUnsupportedOpenAiNativeSlug(slug: string): boolean {
|
|
51
101
|
if (slug.includes("/")) return false;
|
|
@@ -53,26 +103,206 @@ export function isUnsupportedOpenAiNativeSlug(slug: string): boolean {
|
|
|
53
103
|
return /^(?:gpt|codex)-/.test(slug);
|
|
54
104
|
}
|
|
55
105
|
|
|
56
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Advertised context for the Codex-login native GPT-5.6 family.
|
|
108
|
+
*
|
|
109
|
+
* This is an OPERATING CAP, not the hard ceiling — the same shape upstream uses. The live
|
|
110
|
+
* catalog reports `context_window: 272000` against a `max_context_window: 872000` for these
|
|
111
|
+
* slugs, and gpt-5.4 runs 272,000 against 1,000,000: the advertised window is always well
|
|
112
|
+
* inside what the model can take.
|
|
113
|
+
*
|
|
114
|
+
* The hard ceiling here was measured on 2026-08-17 against a real Codex-login account:
|
|
115
|
+
* `POST /backend-api/codex/responses` admitted 921,508 input tokens and refused 922,013 with
|
|
116
|
+
* `error.code: context_length_exceeded` on sol, terra and luna alike.
|
|
117
|
+
*
|
|
118
|
+
* Codex spends `context_window * effective_context_window_percent`, which defaults to 95%
|
|
119
|
+
* (codex-rs `openai_models.rs` / `turn_context.rs`). So this value yields a 875,900-token
|
|
120
|
+
* budget and leaves ~46k of headroom under the measured ceiling. An earlier release shipped
|
|
121
|
+
* 1,050,000 here, which spent 997,500 — past what the upstream accepts.
|
|
122
|
+
*
|
|
123
|
+
* Do NOT back-solve this from the ceiling (970,000 would land the budget at 921,500, inside
|
|
124
|
+
* the 1,840-token gap between the last success and the first refusal). The 95% is a safety
|
|
125
|
+
* margin to keep, not a discount to cancel out.
|
|
126
|
+
*
|
|
127
|
+
* Evidence: devlog/_plan/260817_native_gpt56_1m_context/001_measurement_evidence.md
|
|
128
|
+
* and 014_final_922k_with_margin.md.
|
|
129
|
+
*/
|
|
130
|
+
export const NATIVE_GPT56_CONTEXT_WINDOW = 272_000;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Hard ceiling: the largest input the native GPT-5.6 family actually accepts (measured).
|
|
134
|
+
*
|
|
135
|
+
* Equal to the advertised window above rather than below it, because that window is already
|
|
136
|
+
* capped under this ceiling. The clamp stays because routed and API-key rows carry the same
|
|
137
|
+
* family at a 1,050,000 window, where 90% (945,000) WOULD overshoot this limit.
|
|
138
|
+
*/
|
|
139
|
+
export const NATIVE_GPT56_MAX_INPUT_TOKENS = 922_000;
|
|
140
|
+
|
|
141
|
+
/** User-facing 1M opt-in: the largest window the native 5.6 family may advertise. */
|
|
142
|
+
export const NATIVE_GPT56_OPT_IN_CONTEXT_WINDOW = NATIVE_GPT56_MAX_INPUT_TOKENS;
|
|
57
143
|
|
|
58
|
-
|
|
144
|
+
const NATIVE_GPT56_FAMILY = new Set<string>([
|
|
145
|
+
"gpt-5.6-sol",
|
|
146
|
+
"gpt-5.6-terra",
|
|
147
|
+
"gpt-5.6-luna",
|
|
148
|
+
NATIVE_DAYBREAK_BLUE_MODEL,
|
|
149
|
+
]);
|
|
150
|
+
|
|
151
|
+
export const NATIVE_OPENAI_CONTEXT_OVERRIDES: Record<string, { contextWindow?: number; maxContextWindow?: number; maxInputTokens?: number }> = {
|
|
59
152
|
"gpt-5.5": { contextWindow: 272_000, maxContextWindow: 272_000 },
|
|
60
153
|
"gpt-5.4": { contextWindow: 1_000_000, maxContextWindow: 1_000_000 },
|
|
61
154
|
"gpt-5.3-codex-spark": { contextWindow: 100_000, maxContextWindow: 100_000 },
|
|
62
|
-
"gpt-5.6-sol": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow:
|
|
63
|
-
"gpt-5.6-terra": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow:
|
|
64
|
-
"gpt-5.6-luna": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow:
|
|
155
|
+
"gpt-5.6-sol": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
|
|
156
|
+
"gpt-5.6-terra": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
|
|
157
|
+
"gpt-5.6-luna": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
|
|
158
|
+
// Daybreak Blue borrows Sol's capability metadata and rides the same family contract.
|
|
159
|
+
// Unlike sol/terra/luna its window was NOT measured here: this account cannot reach it
|
|
160
|
+
// (`400 "The 'gpt-daybreak-blue-latest' model is not supported when using Codex with a
|
|
161
|
+
// ChatGPT account."`), so the promotion rests on a report from an account that has
|
|
162
|
+
// access rather than on a probe. Treat it as the weaker evidence of the four.
|
|
163
|
+
[NATIVE_DAYBREAK_BLUE_MODEL]: { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
|
|
65
164
|
};
|
|
66
165
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
166
|
+
const PINNED_UPSTREAM_MODELS: Map<string, RawEntry> = new Map(
|
|
167
|
+
((upstreamModelsSnapshot as unknown as { models?: RawEntry[] }).models ?? [])
|
|
168
|
+
.flatMap(model => typeof model.slug === "string" ? [[model.slug, model] as const] : []),
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
function pinnedNativeCapabilityEntry(slug: string): RawEntry | undefined {
|
|
172
|
+
return PINNED_UPSTREAM_MODELS.get(nativeOpenAiCapabilitySourceSlug(slug));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Pinned capability metadata is safe to use as a fallback for every supported native model.
|
|
177
|
+
* Keep it separate from UPSTREAM_NATIVE_ENTRIES: that narrower map also authorizes replacing
|
|
178
|
+
* persisted native rows during sync, which is currently intentional only for the GPT-5.6 family.
|
|
179
|
+
*/
|
|
180
|
+
const PINNED_NATIVE_CAPABILITY_ENTRIES: Map<string, RawEntry> = new Map(
|
|
181
|
+
[...NATIVE_OPENAI_MODELS, ...NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS].flatMap(slug => {
|
|
182
|
+
const entry = pinnedNativeCapabilityEntry(slug);
|
|
183
|
+
return entry ? [[slug, entry] as const] : [];
|
|
184
|
+
}),
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The user-owned levers that set a native window, carried together.
|
|
189
|
+
*
|
|
190
|
+
* For the GPT-5.6 family these may raise the Codex 272k default up to the measured
|
|
191
|
+
* 922k ceiling. Other native slugs still only ever lower.
|
|
192
|
+
*
|
|
193
|
+
* This travels as an ARGUMENT rather than module state on purpose. `grok/sync.ts` runs in
|
|
194
|
+
* the `ocx ensure` parent process, outside the server, so an injected global would never
|
|
195
|
+
* reach it — that failure is recorded in
|
|
196
|
+
* devlog/_plan/260817_native_gpt56_1m_context/006_root_cause_replan.md. Every call site
|
|
197
|
+
* already holds a config or a cap, so passing one more field costs nothing.
|
|
198
|
+
*
|
|
199
|
+
* A bare number is still accepted for the many call sites that only know the cap.
|
|
200
|
+
*/
|
|
201
|
+
export interface NativeContextLimits {
|
|
202
|
+
/** `providerContextCaps.openai` */
|
|
203
|
+
readonly cap?: number;
|
|
204
|
+
/** `providers.openai.contextWindow` — a floor-wide user override. */
|
|
205
|
+
readonly providerWindow?: number;
|
|
206
|
+
/** `providers.openai.modelContextWindows` — per-model, wins over `providerWindow`. */
|
|
207
|
+
readonly modelWindows?: Readonly<Record<string, number>>;
|
|
208
|
+
/** `providers.openai.modelAutoCompactTokenLimits` — soft, lowering-only budgets. */
|
|
209
|
+
readonly modelAutoCompactTokenLimits?: Readonly<Record<string, number>>;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export type NativeContextLimitsInput = NativeContextLimits | number | undefined;
|
|
213
|
+
|
|
214
|
+
function positiveInt(value: unknown): number | undefined {
|
|
215
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : undefined;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function asLimits(input: NativeContextLimitsInput): NativeContextLimits {
|
|
219
|
+
if (input === undefined) return {};
|
|
220
|
+
return typeof input === "number" ? { cap: input } : input;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** Read both levers out of a config once, for call sites that hold one. */
|
|
224
|
+
export function nativeContextLimits(
|
|
225
|
+
config: Pick<OcxConfig, "providers" | "providerContextCaps">,
|
|
226
|
+
): NativeContextLimits {
|
|
227
|
+
const provider = config.providers?.[OPENAI_CODEX_PROVIDER_ID];
|
|
228
|
+
const modelWindows: Record<string, number> = {};
|
|
229
|
+
for (const [slug, value] of Object.entries(provider?.modelContextWindows ?? {})) {
|
|
230
|
+
const window = positiveInt(value);
|
|
231
|
+
if (window !== undefined) modelWindows[slug] = window;
|
|
232
|
+
}
|
|
233
|
+
const modelAutoCompactTokenLimits: Record<string, number> = {};
|
|
234
|
+
for (const [slug, value] of Object.entries(provider?.modelAutoCompactTokenLimits ?? {})) {
|
|
235
|
+
const budget = positiveInt(value);
|
|
236
|
+
if (budget !== undefined) modelAutoCompactTokenLimits[slug] = budget;
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
...(positiveInt(providerContextCap(config, OPENAI_CODEX_PROVIDER_ID)) !== undefined
|
|
240
|
+
? { cap: providerContextCap(config, OPENAI_CODEX_PROVIDER_ID) }
|
|
241
|
+
: {}),
|
|
242
|
+
...(positiveInt(provider?.contextWindow) !== undefined ? { providerWindow: provider!.contextWindow } : {}),
|
|
243
|
+
...(Object.keys(modelWindows).length > 0 ? { modelWindows } : {}),
|
|
244
|
+
...(Object.keys(modelAutoCompactTokenLimits).length > 0 ? { modelAutoCompactTokenLimits } : {}),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** Apply the user levers to an authoritative value. */
|
|
249
|
+
function narrowToLimits(raw: number | undefined, slug: string, input: NativeContextLimitsInput): number | undefined {
|
|
250
|
+
if (raw === undefined) return undefined;
|
|
251
|
+
const limits = asLimits(input);
|
|
252
|
+
const overlay = positiveInt(limits.modelWindows?.[slug]) ?? positiveInt(limits.providerWindow);
|
|
253
|
+
const cap = positiveInt(limits.cap);
|
|
254
|
+
if (NATIVE_GPT56_FAMILY.has(slug)) {
|
|
255
|
+
const ceiling = NATIVE_GPT56_MAX_INPUT_TOKENS;
|
|
256
|
+
const chosen = overlay ?? cap ?? raw;
|
|
257
|
+
const window = Math.min(chosen, ceiling);
|
|
258
|
+
return overlay !== undefined && cap !== undefined ? Math.min(window, cap) : window;
|
|
259
|
+
}
|
|
260
|
+
const narrowed = overlay === undefined ? raw : Math.min(raw, overlay);
|
|
261
|
+
// 922k is the GPT-5.6 1M opt-in, not a request to shrink gpt-5.4's 1M window.
|
|
262
|
+
if (cap === NATIVE_GPT56_MAX_INPUT_TOKENS) return narrowed;
|
|
263
|
+
return applyProviderContextCap(narrowed, cap) ?? narrowed;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function nativeOpenAiContextWindow(slug: string, limits?: NativeContextLimitsInput): number | undefined {
|
|
267
|
+
const raw = NATIVE_OPENAI_CONTEXT_OVERRIDES[slug]?.contextWindow
|
|
268
|
+
?? (typeof PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.context_window === "number"
|
|
269
|
+
? PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)!.context_window as number
|
|
71
270
|
: undefined);
|
|
271
|
+
return narrowToLimits(raw, slug, limits);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Largest input a native slug accepts, or undefined when no separate limit is known
|
|
276
|
+
* (the caller then falls back to the context window).
|
|
277
|
+
*
|
|
278
|
+
* A provider context cap lowers this too: a capped 272k window must not keep advertising a
|
|
279
|
+
* 922k input ceiling, or the cap would be cosmetic on every input-side surface.
|
|
280
|
+
*/
|
|
281
|
+
export function nativeOpenAiMaxInputTokens(slug: string, limits?: NativeContextLimitsInput): number | undefined {
|
|
282
|
+
const raw = NATIVE_OPENAI_CONTEXT_OVERRIDES[slug]?.maxInputTokens;
|
|
283
|
+
if (raw === undefined) return undefined;
|
|
284
|
+
const window = nativeOpenAiContextWindow(slug, limits);
|
|
285
|
+
const narrowed = narrowToLimits(raw, slug, limits) ?? raw;
|
|
286
|
+
return window === undefined ? narrowed : Math.min(narrowed, window);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** Effective native soft budget after every hard window/input limit is resolved. */
|
|
290
|
+
export function nativeOpenAiAutoCompactTokenLimit(
|
|
291
|
+
slug: string,
|
|
292
|
+
limits?: NativeContextLimitsInput,
|
|
293
|
+
): number | undefined {
|
|
294
|
+
const contextWindow = nativeOpenAiContextWindow(slug, limits);
|
|
295
|
+
if (contextWindow === undefined) return undefined;
|
|
296
|
+
const configured = positiveInt(asLimits(limits).modelAutoCompactTokenLimits?.[slug]);
|
|
297
|
+
return clampAutoCompactTokenLimit(
|
|
298
|
+
contextWindow,
|
|
299
|
+
nativeOpenAiMaxInputTokens(slug, limits),
|
|
300
|
+
configured,
|
|
301
|
+
);
|
|
72
302
|
}
|
|
73
303
|
|
|
74
304
|
export function nativeInputModalities(slug: string): string[] {
|
|
75
|
-
const upstream =
|
|
305
|
+
const upstream = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug);
|
|
76
306
|
if (Array.isArray(upstream?.input_modalities) && upstream!.input_modalities!.length > 0) {
|
|
77
307
|
return [...upstream!.input_modalities as string[]];
|
|
78
308
|
}
|
|
@@ -82,7 +312,7 @@ export function nativeInputModalities(slug: string): string[] {
|
|
|
82
312
|
}
|
|
83
313
|
|
|
84
314
|
export function nativeReasoningEfforts(slug: string): string[] {
|
|
85
|
-
const upstream =
|
|
315
|
+
const upstream = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug);
|
|
86
316
|
const levels = Array.isArray(upstream?.supported_reasoning_levels)
|
|
87
317
|
? upstream!.supported_reasoning_levels as Array<{ effort?: string }>
|
|
88
318
|
: [];
|
|
@@ -97,12 +327,18 @@ export function nativeReasoningEfforts(slug: string): string[] {
|
|
|
97
327
|
|
|
98
328
|
/** Upstream-pinned default for a native slug, when present and non-empty. */
|
|
99
329
|
export function nativeDefaultReasoningEffort(slug: string): string | undefined {
|
|
100
|
-
const level =
|
|
330
|
+
const level = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.default_reasoning_level;
|
|
101
331
|
return typeof level === "string" && level.length > 0 ? level : undefined;
|
|
102
332
|
}
|
|
103
333
|
|
|
334
|
+
/** Upstream-pinned multi-agent surface for a supported native slug, when present. */
|
|
335
|
+
export function nativeMultiAgentVersion(slug: string): string | undefined {
|
|
336
|
+
const version = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.multi_agent_version;
|
|
337
|
+
return typeof version === "string" && version.length > 0 ? version : undefined;
|
|
338
|
+
}
|
|
339
|
+
|
|
104
340
|
export function nativeParallelToolCalls(slug: string): boolean {
|
|
105
|
-
return
|
|
341
|
+
return PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.supports_parallel_tool_calls === true
|
|
106
342
|
|| false;
|
|
107
343
|
}
|
|
108
344
|
|
|
@@ -116,40 +352,147 @@ export function disabledNativeSlugs(config: Pick<OcxConfig, "disabledModels">):
|
|
|
116
352
|
return new Set((config.disabledModels ?? []).filter(id => !id.includes("/")));
|
|
117
353
|
}
|
|
118
354
|
|
|
119
|
-
export function visibleNativeSlugs(config: Pick<OcxConfig, "disabledModels">): string[] {
|
|
355
|
+
export function visibleNativeSlugs(config: Pick<OcxConfig, "disabledModels" | "combos">): string[] {
|
|
120
356
|
const disabled = disabledNativeSlugs(config);
|
|
121
|
-
|
|
357
|
+
const shadowed = configuredNativeAliasSlugs(config);
|
|
358
|
+
return nativeOpenAiSlugs().filter(slug => !disabled.has(slug) && !shadowed.has(slug));
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/** Whether an enabled canonical OpenAI provider can serve exact account-qualified routes. */
|
|
362
|
+
export function shouldIncludeAccountBoundNativeOpenAi(
|
|
363
|
+
config: Pick<OcxConfig, "providers">,
|
|
364
|
+
): boolean {
|
|
365
|
+
const provider = config.providers[OPENAI_CODEX_PROVIDER_ID];
|
|
366
|
+
if (!provider || provider.disabled === true) return false;
|
|
367
|
+
// Registry routing defaults an omitted authMode on the built-in OpenAI row to forward.
|
|
368
|
+
const canonical = provider.authMode === undefined
|
|
369
|
+
? { ...provider, authMode: "forward" as const }
|
|
370
|
+
: provider;
|
|
371
|
+
return isCanonicalOpenAiForwardProvider(canonical);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/** Whether native ChatGPT/Codex rows belong in this provider configuration. */
|
|
375
|
+
export function shouldIncludeNativeOpenAi(config: Pick<OcxConfig, "providers">): boolean {
|
|
376
|
+
const hasEnabledProvider = Object.values(config.providers)
|
|
377
|
+
.some(provider => provider.disabled !== true);
|
|
378
|
+
// Preserve the existing no-enabled-provider catalog bootstrap, but do not use that bootstrap
|
|
379
|
+
// exception for account-qualified rows: exact-account routing requires a live OpenAI provider.
|
|
380
|
+
return !hasEnabledProvider || shouldIncludeAccountBoundNativeOpenAi(config);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
type AccountSelectorConfig = Pick<
|
|
384
|
+
OcxConfig,
|
|
385
|
+
"codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled"
|
|
386
|
+
>;
|
|
387
|
+
|
|
388
|
+
function mainAccountSelectors(config: AccountSelectorConfig): string[] {
|
|
389
|
+
const targets = new Map(codexAccountNamespaceEntries(config));
|
|
390
|
+
return visibleCodexAccountSelectors(config).filter(selector =>
|
|
391
|
+
isMainCodexAccountTarget(targets.get(selector) ?? ""));
|
|
122
392
|
}
|
|
123
393
|
|
|
124
394
|
/** Native slugs exposed to Claude Desktop show/export/apply (opt-out via claudeCode.desktopNativeModels). */
|
|
125
|
-
export function desktopVisibleNativeSlugs(
|
|
395
|
+
export function desktopVisibleNativeSlugs(
|
|
396
|
+
config: Pick<OcxConfig, "claudeCode" | "disabledModels" | "combos" | "providers"
|
|
397
|
+
| "codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled">,
|
|
398
|
+
): string[] {
|
|
126
399
|
if (config.claudeCode?.desktopNativeModels === false) return [];
|
|
127
|
-
|
|
400
|
+
const visible = visibleNativeSlugs(config);
|
|
401
|
+
if (!shouldIncludeAccountBoundNativeOpenAi(config)) return visible;
|
|
402
|
+
const qualified = [...accountBoundNativeOpenAiSlugsBySelector(config).entries()].flatMap(([selector, slugs]) =>
|
|
403
|
+
slugs
|
|
404
|
+
.filter(slug => !SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug))
|
|
405
|
+
.map(slug => `${selector}/${slug}`),
|
|
406
|
+
);
|
|
407
|
+
const disabled = new Set(config.disabledModels ?? []);
|
|
408
|
+
return unique([
|
|
409
|
+
...visible,
|
|
410
|
+
...qualified.filter(slug => !disabled.has(slug) && !disabled.has(slug.slice(slug.indexOf("/") + 1))),
|
|
411
|
+
]);
|
|
128
412
|
}
|
|
129
413
|
|
|
130
|
-
export function nativeModelRows(config: Pick<OcxConfig, "disabledModels">): Array<{ slug: string; disabled: boolean; contextWindow?: number }> {
|
|
414
|
+
export function nativeModelRows(config: Pick<OcxConfig, "disabledModels" | "combos" | "providerContextCaps" | "providers">): Array<{ slug: string; disabled: boolean; contextWindow?: number; maxInputTokens?: number; autoCompactTokenLimit?: number }> {
|
|
131
415
|
const disabled = disabledNativeSlugs(config);
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
416
|
+
const shadowed = configuredNativeAliasSlugs(config);
|
|
417
|
+
// Both user levers, not just the cap: a per-model window set from the dashboard has to show
|
|
418
|
+
// up on the row the dashboard itself renders.
|
|
419
|
+
const limits = nativeContextLimits(config);
|
|
420
|
+
const bareEligibleAccountIds = providerCodexAccountMode(
|
|
421
|
+
OPENAI_CODEX_PROVIDER_ID,
|
|
422
|
+
config.providers?.[OPENAI_CODEX_PROVIDER_ID],
|
|
423
|
+
) === "direct" ? new Set([MAIN_CODEX_ACCOUNT_ID]) : undefined;
|
|
424
|
+
const availableGated = cachedAvailableAccountGatedNativeModels(Date.now(), bareEligibleAccountIds);
|
|
425
|
+
return NATIVE_OPENAI_MODELS
|
|
426
|
+
.filter(slug => !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableGated.has(slug))
|
|
427
|
+
.filter(slug => !shadowed.has(slug)).map(slug => {
|
|
428
|
+
const contextWindow = nativeOpenAiContextWindow(slug, limits);
|
|
429
|
+
const maxInputTokens = nativeOpenAiMaxInputTokens(slug, limits);
|
|
430
|
+
const autoCompactTokenLimit = nativeOpenAiAutoCompactTokenLimit(slug, limits);
|
|
431
|
+
return {
|
|
432
|
+
slug,
|
|
433
|
+
disabled: disabled.has(slug),
|
|
434
|
+
...(contextWindow !== undefined ? { contextWindow } : {}),
|
|
435
|
+
...(maxInputTokens !== undefined ? { maxInputTokens } : {}),
|
|
436
|
+
...(autoCompactTokenLimit !== undefined ? { autoCompactTokenLimit } : {}),
|
|
437
|
+
};
|
|
135
438
|
});
|
|
136
439
|
}
|
|
137
440
|
|
|
138
|
-
export function applyNativeVisibility(
|
|
441
|
+
export function applyNativeVisibility(
|
|
442
|
+
entries: RawEntry[],
|
|
443
|
+
disabledModels: ReadonlySet<string>,
|
|
444
|
+
hideBareNative = false,
|
|
445
|
+
observedNativeSlugs: ReadonlySet<string> = new Set(),
|
|
446
|
+
): RawEntry[] {
|
|
139
447
|
for (const entry of entries) {
|
|
448
|
+
if (isNativeAliasCatalogEntry(entry)) continue;
|
|
140
449
|
const slug = typeof entry.slug === "string" ? entry.slug : "";
|
|
141
|
-
|
|
142
|
-
|
|
450
|
+
const accountBoundSlug = trustedAccountBoundNativeCatalogSlug(entry);
|
|
451
|
+
const nativeSlug = accountBoundSlug ?? slug;
|
|
452
|
+
if (!nativeSlug
|
|
453
|
+
|| (!accountBoundSlug && slug.includes("/"))
|
|
454
|
+
|| (!SUPPORTED_NATIVE_OPENAI_SLUGS.has(nativeSlug) && !observedNativeSlugs.has(nativeSlug))) continue;
|
|
455
|
+
const disabled = disabledModels.has(nativeSlug)
|
|
456
|
+
|| (accountBoundSlug !== undefined && disabledModels.has(slug));
|
|
457
|
+
entry.visibility = disabled || (!accountBoundSlug && hideBareNative)
|
|
458
|
+
? "hide"
|
|
459
|
+
: "list";
|
|
143
460
|
}
|
|
144
461
|
return entries;
|
|
145
462
|
}
|
|
146
463
|
|
|
464
|
+
function upstreamNativeEntryForSlug(slug: string): RawEntry | undefined {
|
|
465
|
+
const sourceSlug = nativeOpenAiCapabilitySourceSlug(slug);
|
|
466
|
+
if (!sourceSlug.startsWith("gpt-5.6-")) return undefined;
|
|
467
|
+
const source = PINNED_UPSTREAM_MODELS.get(sourceSlug);
|
|
468
|
+
if (!source) return undefined;
|
|
469
|
+
if (slug === sourceSlug) return source;
|
|
470
|
+
|
|
471
|
+
const alias = structuredClone(source) as RawEntry;
|
|
472
|
+
alias.slug = slug;
|
|
473
|
+
alias.display_name = "Daybreak Blue";
|
|
474
|
+
alias.description = "Frontier general-purpose model with safeguards for defensive cybersecurity work.";
|
|
475
|
+
if (typeof alias.base_instructions === "string") {
|
|
476
|
+
alias.base_instructions = identifyRoutedModel(alias.base_instructions, slug);
|
|
477
|
+
}
|
|
478
|
+
if (alias.model_messages && typeof alias.model_messages === "object" && !Array.isArray(alias.model_messages)) {
|
|
479
|
+
const modelMessages = alias.model_messages as Record<string, unknown>;
|
|
480
|
+
if (typeof modelMessages.instructions_template === "string") {
|
|
481
|
+
alias.model_messages = {
|
|
482
|
+
...modelMessages,
|
|
483
|
+
instructions_template: identifyRoutedModel(modelMessages.instructions_template, slug),
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
delete alias.availability_nux;
|
|
488
|
+
return alias;
|
|
489
|
+
}
|
|
490
|
+
|
|
147
491
|
export const UPSTREAM_NATIVE_ENTRIES: Map<string, RawEntry> = new Map(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
.map(m => [m.slug as string, m]),
|
|
492
|
+
[...NATIVE_OPENAI_MODELS, ...NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS].flatMap(slug => {
|
|
493
|
+
const entry = upstreamNativeEntryForSlug(slug);
|
|
494
|
+
return entry ? [[slug, entry] as const] : [];
|
|
495
|
+
}),
|
|
153
496
|
);
|
|
154
497
|
|
|
155
498
|
export function upstreamNativeEntry(slug: string): RawEntry | null {
|
|
@@ -167,14 +510,181 @@ export function shouldUpgradeToUpstreamEntry(entry: RawEntry): boolean {
|
|
|
167
510
|
}
|
|
168
511
|
|
|
169
512
|
export function nativeOpenAiSlugs(): string[] {
|
|
170
|
-
const live =
|
|
171
|
-
|
|
513
|
+
const live = catalogNativeSlugs();
|
|
514
|
+
const availableGated = cachedAvailableAccountGatedNativeModels();
|
|
515
|
+
const candidates = live.length > 0 ? unique([...live, ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]) : NATIVE_OPENAI_MODELS;
|
|
516
|
+
return candidates.filter(slug => (
|
|
517
|
+
!ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableGated.has(slug)
|
|
518
|
+
));
|
|
172
519
|
}
|
|
173
520
|
|
|
174
|
-
|
|
521
|
+
const ACCOUNT_BOUND_OPENAI_NATIVE_PREFIX = /^(?:gpt-|o1-|o3-|o4-)/;
|
|
522
|
+
const ACCOUNT_BOUND_OBSERVED_NATIVE_MARKER = "opencodex_account_observed_native";
|
|
523
|
+
const ACCOUNT_BOUND_OBSERVED_SELECTORS_MARKER = "opencodex_account_observed_selectors";
|
|
524
|
+
|
|
525
|
+
function isAccountBoundOpenAiNativeSlug(slug: string): boolean {
|
|
526
|
+
return !slug.includes("/") && ACCOUNT_BOUND_OPENAI_NATIVE_PREFIX.test(slug);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Shape/plausibility filter for a candidate account-native row. **This is not a trust control.**
|
|
531
|
+
*
|
|
532
|
+
* It checks that a row carries the field shape a real Codex catalog row has, which rejects
|
|
533
|
+
* malformed and minimal hand-written rows. It cannot distinguish a genuine upstream observation
|
|
534
|
+
* from a complete row typed by hand into `$CODEX_HOME/models_cache.json`: there is no signature,
|
|
535
|
+
* source identity, or server attestation to check. A full-shape forged row is accepted, and
|
|
536
|
+
* `observedFullShapeRowIsAccepted` in tests/native-model-toggle.test.ts pins that so nobody
|
|
537
|
+
* later mistakes this predicate for a security boundary.
|
|
538
|
+
*
|
|
539
|
+
* That is acceptable here because the file is user-owned and written by Codex itself: anyone
|
|
540
|
+
* able to rewrite it can already edit `config.json` or run `ocx` directly, and `router.ts`
|
|
541
|
+
* accepts any bare `gpt-*` id under an account namespace regardless of this catalog. What the
|
|
542
|
+
* filter buys is that garbage rows do not get advertised through discovery — not that an
|
|
543
|
+
* advertised row is proven genuine.
|
|
544
|
+
*/
|
|
545
|
+
function hasNativeCatalogRowShape(entry: RawEntry): boolean {
|
|
546
|
+
const levels = entry.supported_reasoning_levels;
|
|
547
|
+
const messages = entry.model_messages;
|
|
548
|
+
return typeof entry.base_instructions === "string"
|
|
549
|
+
&& entry.base_instructions.length > 0
|
|
550
|
+
&& (typeof entry.comp_hash === "string" || entry.comp_hash === null)
|
|
551
|
+
&& entry.shell_type === "shell_command"
|
|
552
|
+
&& Array.isArray(levels)
|
|
553
|
+
&& levels.length > 0
|
|
554
|
+
&& levels.every(level => typeof level === "object" && level !== null
|
|
555
|
+
&& typeof (level as { effort?: unknown }).effort === "string")
|
|
556
|
+
&& typeof messages === "object"
|
|
557
|
+
&& messages !== null
|
|
558
|
+
&& !Array.isArray(messages);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
function observedAccountBoundNativeSlug(entry: RawEntry): string | undefined {
|
|
562
|
+
const accountBound = trustedAccountBoundNativeCatalogSlug(entry);
|
|
563
|
+
const slug = accountBound ?? (typeof entry.slug === "string" ? entry.slug : "");
|
|
564
|
+
if (!isAccountBoundOpenAiNativeSlug(slug)
|
|
565
|
+
|| entry.supported_in_api !== true
|
|
566
|
+
|| !hasNativeCatalogRowShape(entry)
|
|
567
|
+
|| (entry.visibility !== "list" && entry[ACCOUNT_BOUND_OBSERVED_NATIVE_MARKER] !== true)) {
|
|
568
|
+
return undefined;
|
|
569
|
+
}
|
|
570
|
+
return slug;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Return exact, previously observed account-native rows that are not in the static release set.
|
|
575
|
+
* The result is used only to carry a hidden observation across startup cache invalidation.
|
|
576
|
+
*/
|
|
577
|
+
export function observedAccountBoundNativeEntries(
|
|
578
|
+
observedEntries: readonly RawEntry[],
|
|
579
|
+
): RawEntry[] {
|
|
580
|
+
const seen = new Set<string>();
|
|
581
|
+
return observedEntries.flatMap(entry => {
|
|
582
|
+
const slug = observedAccountBoundNativeSlug(entry);
|
|
583
|
+
// Only carry bare upstream observations across cache replacement. Account-qualified rows are
|
|
584
|
+
// already a projection of the current selector map and must not preserve private/stale labels.
|
|
585
|
+
if (!slug
|
|
586
|
+
|| typeof entry.slug !== "string"
|
|
587
|
+
|| entry.slug.includes("/")
|
|
588
|
+
|| SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)
|
|
589
|
+
|| seen.has(slug)) return [];
|
|
590
|
+
seen.add(slug);
|
|
591
|
+
return [structuredClone(entry)];
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* Native ids observed in the user's Codex catalog/cache for account-qualified discovery.
|
|
597
|
+
*
|
|
598
|
+
* Unknown ids are deliberately returned only to callers that build selector-qualified rows. The
|
|
599
|
+
* static bare set remains the source of truth for global/API-key discovery, while this preserves
|
|
600
|
+
* exact account-scoped ids such as `gpt-daybreak-blue-latest` until the static set catches up.
|
|
601
|
+
*/
|
|
602
|
+
export function accountBoundNativeOpenAiSlugs(
|
|
603
|
+
observedEntries: readonly RawEntry[] = [
|
|
604
|
+
...(readCurrentCodexModelsCache()?.models ?? []),
|
|
605
|
+
// Existing generated rows are also safe to reuse after a process starts without a cache
|
|
606
|
+
// invalidation pass; bare user-authored catalog rows are intentionally not trusted here.
|
|
607
|
+
...(readCurrentCodexCatalog()?.models ?? []).filter(entry =>
|
|
608
|
+
trustedAccountBoundNativeCatalogSlug(entry) !== undefined),
|
|
609
|
+
],
|
|
610
|
+
): string[] {
|
|
611
|
+
const observed = observedEntries.flatMap(entry => {
|
|
612
|
+
const slug = observedAccountBoundNativeSlug(entry);
|
|
613
|
+
return slug === undefined ? [] : [slug];
|
|
614
|
+
});
|
|
615
|
+
return unique([...NATIVE_OPENAI_MODELS, ...observed]);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* Resolve account-native ids per public selector. Bare observations come from Codex's main
|
|
620
|
+
* catalog/cache, so they are eligible only for selectors that target the main account. A
|
|
621
|
+
* generated qualified row carries its own selector and never gets copied to an unrelated pool
|
|
622
|
+
* account. An explicit observation marker is public selector metadata only; private account ids
|
|
623
|
+
* never enter the catalog or cache.
|
|
624
|
+
*/
|
|
625
|
+
export function accountBoundNativeOpenAiSlugsBySelector(
|
|
626
|
+
config: AccountSelectorConfig,
|
|
627
|
+
observedEntries: readonly RawEntry[] = [
|
|
628
|
+
...(readCurrentCodexModelsCache()?.models ?? []),
|
|
629
|
+
...(readCurrentCodexCatalog()?.models ?? []).filter(entry =>
|
|
630
|
+
trustedAccountBoundNativeCatalogSlug(entry) !== undefined),
|
|
631
|
+
],
|
|
632
|
+
): ReadonlyMap<string, readonly string[]> {
|
|
633
|
+
const selectors = visibleCodexAccountSelectors(config);
|
|
634
|
+
const mainSelectors = new Set(mainAccountSelectors(config));
|
|
635
|
+
const result = new Map<string, Set<string>>(
|
|
636
|
+
selectors.map(selector => [selector, new Set(NATIVE_OPENAI_MODELS)]),
|
|
637
|
+
);
|
|
638
|
+
for (const entry of observedEntries) {
|
|
639
|
+
const slug = observedAccountBoundNativeSlug(entry);
|
|
640
|
+
if (slug === undefined || SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)) continue;
|
|
641
|
+
const generated = trustedAccountBoundNativeCatalogSlug(entry);
|
|
642
|
+
const generatedSelector = generated === undefined || typeof entry.slug !== "string"
|
|
643
|
+
? undefined
|
|
644
|
+
: entry.slug.slice(0, entry.slug.indexOf("/"));
|
|
645
|
+
const markedSelectors = Array.isArray(entry[ACCOUNT_BOUND_OBSERVED_SELECTORS_MARKER])
|
|
646
|
+
? entry[ACCOUNT_BOUND_OBSERVED_SELECTORS_MARKER].filter((value): value is string => typeof value === "string")
|
|
647
|
+
: [];
|
|
648
|
+
const eligible = generatedSelector !== undefined
|
|
649
|
+
? (mainSelectors.has(generatedSelector) ? [generatedSelector] : [])
|
|
650
|
+
: markedSelectors.length > 0
|
|
651
|
+
? markedSelectors.filter(selector => mainSelectors.has(selector))
|
|
652
|
+
: [...mainSelectors];
|
|
653
|
+
for (const selector of eligible) {
|
|
654
|
+
const rows = result.get(selector);
|
|
655
|
+
if (rows) rows.add(slug);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
return new Map([...result.entries()].map(([selector, slugs]) => [selector, [...slugs]]));
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/** Unknown native ids observed from Codex, excluding the static release set. */
|
|
662
|
+
export function observedAccountBoundNativeOpenAiSlugs(
|
|
663
|
+
observedEntries?: readonly RawEntry[],
|
|
664
|
+
): string[] {
|
|
665
|
+
const all = accountBoundNativeOpenAiSlugs(observedEntries);
|
|
666
|
+
return all.filter(slug => !SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug));
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
function catalogNativeSlugs(): string[] {
|
|
175
670
|
const cat = readCurrentCatalogOrCache();
|
|
176
|
-
const
|
|
671
|
+
const models = cat?.models ?? [];
|
|
672
|
+
const live = models.flatMap(entry => {
|
|
673
|
+
const slug = typeof entry.slug === "string" ? entry.slug : "";
|
|
674
|
+
return !slug.includes("/") && SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug) ? [slug] : [];
|
|
675
|
+
});
|
|
676
|
+
const accountBound = models.flatMap(entry => {
|
|
677
|
+
const slug = trustedAccountBoundNativeCatalogSlug(entry);
|
|
678
|
+
return slug !== undefined && SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug) ? [slug] : [];
|
|
679
|
+
});
|
|
680
|
+
// Deliberately ignore `visibility`: it is a rendered projection of disabledModels and account
|
|
681
|
+
// selectors, so treating it as fresh availability would shrink the supported set between syncs.
|
|
682
|
+
// visibleNativeSlugs applies the current disabledModels source of truth for public consumers.
|
|
683
|
+
return unique([...live, ...accountBound]);
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
export function listCatalogNativeSlugs(): string[] {
|
|
177
687
|
// Ensure documented additions (e.g. gpt-5.3-codex-spark) appear even when the bundled catalog
|
|
178
688
|
// predates the slug — mirrors nativeOpenAiSlugs() which already merges them for /v1/models.
|
|
179
|
-
return unique([...
|
|
689
|
+
return unique([...catalogNativeSlugs(), ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]);
|
|
180
690
|
}
|