@iislee/opencodex 2.11.0 → 2.31.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 +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -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 +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -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 +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- 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 +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- 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 +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- 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 +618 -74
- package/src/adapters/identity.ts +39 -6
- 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 +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- 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 +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- 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 +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- 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 +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -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 +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- 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 +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -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/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -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 +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -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 +353 -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 +492 -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 +682 -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 +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -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 +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -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 +152 -29
- package/src/images/plan.ts +23 -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.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -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/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- 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 +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- 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/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- 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/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 +202 -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 +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -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/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- 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/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -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 +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -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 +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -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 +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -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 +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -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 +145 -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 +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- 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 +865 -181
- package/src/server/lifecycle.ts +284 -13
- 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 +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -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 +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -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 +288 -32
- 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 +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- 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/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -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 +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -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 +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -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 +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- 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 +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- 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 +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- 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 +9 -3
- 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 +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- 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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** ChatGPT/Codex wire id observed for the account-native Daybreak Blue surface. */
|
|
2
|
+
export const NATIVE_DAYBREAK_BLUE_MODEL = "gpt-daybreak-blue-latest";
|
|
3
|
+
|
|
4
|
+
/** Native ChatGPT/Codex ids whose availability is proven per authenticated account. */
|
|
5
|
+
export const ACCOUNT_GATED_NATIVE_OPENAI_MODELS: ReadonlySet<string> = new Set([
|
|
6
|
+
NATIVE_DAYBREAK_BLUE_MODEL,
|
|
7
|
+
]);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Account-native aliases whose Codex capabilities track another pinned native row.
|
|
11
|
+
*
|
|
12
|
+
* This is catalog metadata inheritance only. Routing always preserves the requested
|
|
13
|
+
* wire id for the separately billed API-key `daybreak-*-latest` surface, so the two never
|
|
14
|
+
* collapse into each other.
|
|
15
|
+
*
|
|
16
|
+
* The ChatGPT/Codex surface is different: an account-gated request IS rewritten to its
|
|
17
|
+
* canonical wire model before it leaves the process (`applyCodexAccountGatedWireNormalization`
|
|
18
|
+
* in src/server/responses/core.ts), because the authenticated backend rejects the gated slug
|
|
19
|
+
* on shards that do not carry it. The catalog keeps the product identity; only the wire moves.
|
|
20
|
+
*/
|
|
21
|
+
const NATIVE_OPENAI_CAPABILITY_SOURCES: Readonly<Record<string, string>> = Object.freeze({
|
|
22
|
+
[NATIVE_DAYBREAK_BLUE_MODEL]: "gpt-5.6-sol",
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Native ids whose capability metadata is inherited from another pinned native row.
|
|
27
|
+
*
|
|
28
|
+
* Membership here is about METADATA INHERITANCE only, and is independent of whether the
|
|
29
|
+
* slug is also present in `NATIVE_OPENAI_MODELS`. `gpt-daybreak-blue-latest` is now in BOTH:
|
|
30
|
+
* it inherits Sol's capability shape AND is a supported account-gated native id (owner decision,
|
|
31
|
+
* devlog 260816_codexrs_multiagent_v2_and_history_perf/011).
|
|
32
|
+
*
|
|
33
|
+
* The maps that consume the union of these two lists (`PINNED_NATIVE_CAPABILITY_ENTRIES`,
|
|
34
|
+
* `UPSTREAM_NATIVE_ENTRIES`) are keyed by slug, so an overlapping id collapses to one
|
|
35
|
+
* entry. Catalog row generation iterates `NATIVE_OPENAI_MODELS`, then entitlement evidence limits
|
|
36
|
+
* it to at most one bare row and one row per entitled account selector.
|
|
37
|
+
*/
|
|
38
|
+
export const NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS = Object.freeze(
|
|
39
|
+
Object.keys(NATIVE_OPENAI_CAPABILITY_SOURCES),
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export function isNativeOpenAiCapabilityAliasModel(slug: string): boolean {
|
|
43
|
+
return Object.hasOwn(NATIVE_OPENAI_CAPABILITY_SOURCES, slug);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function nativeOpenAiCapabilitySourceSlug(slug: string): string {
|
|
47
|
+
return NATIVE_OPENAI_CAPABILITY_SOURCES[slug] ?? slug;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Native OpenAI model ids that this release can route and restore with authoritative metadata.
|
|
52
|
+
*
|
|
53
|
+
* `gpt-daybreak-blue-latest` is entitlement-gated upstream: it is absent from codex-rs's
|
|
54
|
+
* bundled catalog and reaches a client only through an authenticated `/models` response.
|
|
55
|
+
* It is listed here by explicit owner decision so the capability template exists without waiting
|
|
56
|
+
* for an observation, because opencodex injects `model_catalog_json` and codex-rs therefore builds
|
|
57
|
+
* a `StaticModelsManager` whose refresh is a no-op — an entitled account had no way to
|
|
58
|
+
* discover it on a clean install.
|
|
59
|
+
*
|
|
60
|
+
* Availability is not static: catalog sync and Pool routing require the account's authenticated
|
|
61
|
+
* `/models` roster to contain the slug. An unconfirmed or unentitled account never receives the
|
|
62
|
+
* request. `disabledModels` remains the independent user visibility control.
|
|
63
|
+
*
|
|
64
|
+
* Devlog: 260816_codexrs_multiagent_v2_and_history_perf/011 §4-bis.
|
|
65
|
+
*/
|
|
66
|
+
export const NATIVE_OPENAI_MODELS = [
|
|
67
|
+
"gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex-spark",
|
|
68
|
+
"gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
|
|
69
|
+
NATIVE_DAYBREAK_BLUE_MODEL,
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
export const SUPPORTED_NATIVE_OPENAI_SLUGS = new Set(NATIVE_OPENAI_MODELS);
|
|
@@ -9,7 +9,7 @@ import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
|
|
|
9
9
|
import type { OcxConfig, OcxProviderConfig } from "../../types";
|
|
10
10
|
import { modelInList } from "../../types";
|
|
11
11
|
import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
|
|
12
|
-
import {
|
|
12
|
+
import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
|
|
13
13
|
import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
|
|
14
14
|
import { getProviderRegistryEntry } from "../../providers/registry";
|
|
15
15
|
import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
|
|
@@ -31,7 +31,9 @@ import { redactSecretString } from "../../lib/redact";
|
|
|
31
31
|
import upstreamModelsSnapshot from "../data/upstream-models.json";
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
import { NATIVE_OPENAI_CONTEXT_OVERRIDES, SUPPORTED_NATIVE_OPENAI_SLUGS, UPSTREAM_NATIVE_ENTRIES } from "./metadata";
|
|
34
|
+
import { NATIVE_OPENAI_CONTEXT_OVERRIDES, SUPPORTED_NATIVE_OPENAI_SLUGS, UPSTREAM_NATIVE_ENTRIES, isNativeOpenAiCapabilityAliasModel, nativeMultiAgentVersion, nativeOpenAiContextWindow, nativeOpenAiMaxInputTokens, type NativeContextLimitsInput } from "./metadata";
|
|
35
|
+
import { trustedAccountBoundNativeCatalogSlug } from "./account-models";
|
|
36
|
+
import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
|
|
35
37
|
|
|
36
38
|
export function legacyCatalogBackupPath(): string {
|
|
37
39
|
return join(getConfigDir(), "catalog-backup.json");
|
|
@@ -84,11 +86,18 @@ export function isDefaultCatalogPath(path: string): boolean {
|
|
|
84
86
|
return samePath(path, activeDefaultCatalogPath());
|
|
85
87
|
}
|
|
86
88
|
|
|
89
|
+
/** Stable nonsemantic ownership marker for rows projected from config.customModels. */
|
|
90
|
+
export const CODEX_CUSTOM_MODEL_CATALOG_KIND = "custom-model-v1";
|
|
91
|
+
/** A formerly ambiguous slug was authoritatively observed as an ordinary provider row. */
|
|
92
|
+
export const CODEX_PROVIDER_MODEL_CATALOG_KIND = "provider-model-v1";
|
|
93
|
+
|
|
87
94
|
export interface CatalogModel {
|
|
88
95
|
id: string;
|
|
89
96
|
provider: string;
|
|
90
97
|
/** Public Codex-facing slug override (used by combo aliases). */
|
|
91
98
|
alias?: string;
|
|
99
|
+
/** Explicit combo takeover of a bare OpenAI-native catalog id. */
|
|
100
|
+
nativeAlias?: boolean;
|
|
92
101
|
/**
|
|
93
102
|
* Display-only Codex catalog `display_name` override. Relabels the picker row ONLY — it never
|
|
94
103
|
* affects the routing slug, alias-collision order, native marketing-name precedence, or provider
|
|
@@ -107,18 +116,35 @@ export interface CatalogModel {
|
|
|
107
116
|
inputModalities?: string[];
|
|
108
117
|
/** Provider opted into parallel tool calls (OcxProviderConfig.parallelToolCalls). */
|
|
109
118
|
parallelToolCalls?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* This routed row is an explicitly configured account-native alias on the canonical ChatGPT
|
|
121
|
+
* forward provider. It may inherit pinned native Codex metadata without changing its wire id.
|
|
122
|
+
*/
|
|
123
|
+
codexForwardNativeCapabilityAlias?: boolean;
|
|
110
124
|
/** Whether Codex may send Responses text.verbosity for this routed model. */
|
|
111
125
|
supportsVerbosity?: boolean;
|
|
126
|
+
/** Whether this exact routed model has a verified OpenAI-compatible service tier. */
|
|
127
|
+
supportsServiceTier?: boolean;
|
|
128
|
+
/** Optional provider-specific copy for the advertised Fast tier. */
|
|
129
|
+
fastTierDescription?: string;
|
|
112
130
|
supportsReasoningSummaries?: boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Codex tool calling mode for this routed model.
|
|
133
|
+
* "code_mode_only" (default) sets entry.tool_mode = "code_mode_only".
|
|
134
|
+
* "shell" leaves tool_mode unset so Codex declares top-level shell tools (exec_command).
|
|
135
|
+
*/
|
|
136
|
+
codexToolMode?: "code_mode_only" | "shell";
|
|
113
137
|
/** Normalized upstream capability names retained for management/API consumers (#485 follow-up). */
|
|
114
138
|
capabilities?: string[];
|
|
139
|
+
/** OpenCodex-only catalog ownership marker; Codex ignores the serialized extension field. */
|
|
140
|
+
catalogKind?: typeof CODEX_CUSTOM_MODEL_CATALOG_KIND | typeof CODEX_PROVIDER_MODEL_CATALOG_KIND;
|
|
115
141
|
}
|
|
116
142
|
|
|
117
143
|
export type RawEntry = Record<string, unknown>;
|
|
118
144
|
|
|
119
145
|
export type RawCatalog = { models?: RawEntry[]; [k: string]: unknown };
|
|
120
146
|
|
|
121
|
-
export const JAWCODE_CATALOG_AUGMENT_PROVIDERS = new Set(["opencode-go"]);
|
|
147
|
+
export const JAWCODE_CATALOG_AUGMENT_PROVIDERS = new Set(["opencode-go", "deepseek"]);
|
|
122
148
|
|
|
123
149
|
export const ROUTED_MODEL_COMPATIBILITY_EXCLUSIONS = new Set([
|
|
124
150
|
// Issue #82: Zen Go /models advertises HY3, but Console Go rejects it as outside the lite list.
|
|
@@ -192,7 +218,12 @@ export function readCatalog(path: string): RawCatalog | null {
|
|
|
192
218
|
|
|
193
219
|
export function findNativeTemplate(catalog: RawCatalog | null): RawEntry | null {
|
|
194
220
|
return catalog?.models?.find(
|
|
195
|
-
m => typeof m.slug === "string"
|
|
221
|
+
m => typeof m.slug === "string"
|
|
222
|
+
&& !m.slug.includes("/")
|
|
223
|
+
&& "base_instructions" in m
|
|
224
|
+
&& m.opencodex_catalog_kind !== CODEX_NATIVE_ALIAS_CATALOG_KIND
|
|
225
|
+
&& m.owned_by !== COMBO_NAMESPACE
|
|
226
|
+
&& !(typeof m.description === "string" && m.description.startsWith("Routed via opencodex → ")),
|
|
196
227
|
) ?? null;
|
|
197
228
|
}
|
|
198
229
|
|
|
@@ -243,16 +274,83 @@ export function isNativeOpenAiEntry(entry: RawEntry): boolean {
|
|
|
243
274
|
return typeof entry.slug === "string" && !entry.slug.includes("/");
|
|
244
275
|
}
|
|
245
276
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
277
|
+
/**
|
|
278
|
+
* Auto-compaction threshold for a native row.
|
|
279
|
+
*
|
|
280
|
+
* The usual rule is 90% of the window, but a row whose input ceiling sits below that has to
|
|
281
|
+
* clamp to the ceiling instead — otherwise the client keeps filling until upstream answers
|
|
282
|
+
* `context_length_exceeded` and compaction never gets a chance to run. Native GPT-5.6 no
|
|
283
|
+
* longer trips this (922,000 window, 829,800 at 90%), but the routed and API-key rows carry
|
|
284
|
+
* the same family at a 1,050,000 window where 90% would be 945,000 — past the ceiling.
|
|
285
|
+
*/
|
|
286
|
+
function nativeAutoCompactLimit(contextWindow: number, maxInputTokens: number | undefined, contextCap?: number): number {
|
|
287
|
+
const ninety = Math.floor(contextWindow * 0.9);
|
|
288
|
+
if (typeof maxInputTokens !== "number" || maxInputTokens <= 0) return ninety;
|
|
289
|
+
const cappedMaxInput = applyProviderContextCap(maxInputTokens, contextCap) ?? maxInputTokens;
|
|
290
|
+
return Math.min(ninety, cappedMaxInput, contextWindow);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Narrow any already-resolved native window by the user levers.
|
|
295
|
+
*
|
|
296
|
+
* Used for the fields the accessors do not own (`max_context_window`, and preserved rows
|
|
297
|
+
* that carry no static override) so every field on a row lands at the same width.
|
|
298
|
+
*/
|
|
299
|
+
function narrowNativeMaxContextWindow(
|
|
300
|
+
slug: string,
|
|
301
|
+
value: number | undefined,
|
|
302
|
+
limits?: NativeContextLimitsInput,
|
|
303
|
+
): number | undefined {
|
|
304
|
+
if (typeof value !== "number" || value <= 0) return value;
|
|
305
|
+
const resolved = nativeOpenAiContextWindow(slug, limits);
|
|
306
|
+
const authoritative = nativeOpenAiContextWindow(slug);
|
|
307
|
+
// The accessor pair tells us how far the levers moved this slug; apply the same delta to a
|
|
308
|
+
// field the accessor does not model, without ever raising it.
|
|
309
|
+
if (resolved === undefined || authoritative === undefined) return value;
|
|
310
|
+
return Math.min(value, Math.max(resolved, 1));
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export function applyNativeOpenAiContextOverride(entry: RawEntry, limits?: NativeContextLimitsInput): void {
|
|
314
|
+
const nativeSlug = trustedAccountBoundNativeCatalogSlug(entry)
|
|
315
|
+
?? (isNativeOpenAiEntry(entry) ? entry.slug as string : undefined);
|
|
316
|
+
if (!nativeSlug) return;
|
|
317
|
+
const override = NATIVE_OPENAI_CONTEXT_OVERRIDES[nativeSlug];
|
|
318
|
+
if (override) {
|
|
319
|
+
// Read the effective values through the accessors rather than re-deriving them from the
|
|
320
|
+
// static table: this function used to apply only the provider cap, so a per-model window
|
|
321
|
+
// the dashboard had already accepted was silently written back at full width here.
|
|
322
|
+
if (typeof override.contextWindow === "number") {
|
|
323
|
+
const contextWindow = nativeOpenAiContextWindow(nativeSlug, limits) ?? override.contextWindow;
|
|
324
|
+
entry.context_window = contextWindow;
|
|
325
|
+
entry.auto_compact_token_limit = nativeAutoCompactLimit(
|
|
326
|
+
contextWindow,
|
|
327
|
+
nativeOpenAiMaxInputTokens(nativeSlug, limits) ?? override.maxInputTokens,
|
|
328
|
+
undefined,
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
if (typeof override.maxContextWindow === "number") {
|
|
332
|
+
const maxContextWindow = narrowNativeMaxContextWindow(nativeSlug, override.maxContextWindow, limits);
|
|
333
|
+
entry.max_context_window = maxContextWindow;
|
|
334
|
+
}
|
|
253
335
|
}
|
|
254
|
-
|
|
255
|
-
|
|
336
|
+
// providerContextCaps.openai is a ceiling for native OpenAI rows regardless of where the
|
|
337
|
+
// advertised window came from (#1430): preserved rows without a hardcoded override (e.g.
|
|
338
|
+
// gpt-5.4-mini) must stay under the cap too, and auto-compaction follows the capped window.
|
|
339
|
+
// The per-model window narrows the same rows for the same reason.
|
|
340
|
+
const currentContext = typeof entry.context_window === "number" ? entry.context_window : undefined;
|
|
341
|
+
const cappedContext = narrowNativeMaxContextWindow(nativeSlug, currentContext, limits);
|
|
342
|
+
if (cappedContext !== currentContext && typeof cappedContext === "number") {
|
|
343
|
+
entry.context_window = cappedContext;
|
|
344
|
+
entry.auto_compact_token_limit = nativeAutoCompactLimit(
|
|
345
|
+
cappedContext,
|
|
346
|
+
nativeOpenAiMaxInputTokens(nativeSlug, limits) ?? override?.maxInputTokens,
|
|
347
|
+
undefined,
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
const currentMax = typeof entry.max_context_window === "number" ? entry.max_context_window : undefined;
|
|
351
|
+
const cappedMax = narrowNativeMaxContextWindow(nativeSlug, currentMax, limits);
|
|
352
|
+
if (cappedMax !== currentMax) {
|
|
353
|
+
entry.max_context_window = cappedMax;
|
|
256
354
|
}
|
|
257
355
|
}
|
|
258
356
|
|
|
@@ -300,6 +398,51 @@ export function ensureStrictCatalogFields(
|
|
|
300
398
|
|
|
301
399
|
export type MultiAgentMode = "v1" | "default" | "v2";
|
|
302
400
|
|
|
401
|
+
export interface MultiAgentModeOptions {
|
|
402
|
+
/**
|
|
403
|
+
* When the catalog is in v2 mode, stamp ChatGPT-native rows as v1 instead.
|
|
404
|
+
* Routed parents get v2 (plaintext child tasks). Native Sol/Terra stay on v1
|
|
405
|
+
* so they can still spawn Grok/Claude — ChatGPT encrypts v2 NEW_TASK bodies.
|
|
406
|
+
*/
|
|
407
|
+
keepNativeChatGptOnV1?: boolean;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** Catalog rows that run on the ChatGPT backend (encrypt v2 child tasks). */
|
|
411
|
+
export function catalogEntryIsNativeChatGpt(entry: RawEntry): boolean {
|
|
412
|
+
const slug = typeof entry.slug === "string" ? entry.slug : "";
|
|
413
|
+
// combo-native-alias-v1 occupies a bare native slug but is routed through
|
|
414
|
+
// OpenCodex. Keep those on v2 unless the row still carries the ChatGPT-forward
|
|
415
|
+
// contract (`use_responses_lite`).
|
|
416
|
+
if (entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND) {
|
|
417
|
+
return entry.use_responses_lite === true;
|
|
418
|
+
}
|
|
419
|
+
if (trustedAccountBoundNativeCatalogSlug(entry)) return true;
|
|
420
|
+
const routedNativeSlug = slug.startsWith(`${OPENAI_CODEX_PROVIDER_ID}/`)
|
|
421
|
+
? slug.slice(OPENAI_CODEX_PROVIDER_ID.length + 1)
|
|
422
|
+
: "";
|
|
423
|
+
if (
|
|
424
|
+
entry.opencodex_catalog_kind === CODEX_CUSTOM_MODEL_CATALOG_KIND
|
|
425
|
+
&& entry.use_responses_lite === true
|
|
426
|
+
&& isNativeOpenAiCapabilityAliasModel(routedNativeSlug)
|
|
427
|
+
) return true;
|
|
428
|
+
if (UPSTREAM_NATIVE_ENTRIES.has(slug) || SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)) return true;
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
export const ROUTED_CODEX_TOOL_MODE = "code_mode_only";
|
|
433
|
+
|
|
434
|
+
export function applyRoutedCodexToolMode(
|
|
435
|
+
entry: RawEntry,
|
|
436
|
+
toolMode?: "code_mode_only" | "shell" | string,
|
|
437
|
+
): RawEntry {
|
|
438
|
+
if (toolMode === "shell") {
|
|
439
|
+
delete entry.tool_mode;
|
|
440
|
+
return entry;
|
|
441
|
+
}
|
|
442
|
+
entry.tool_mode = ROUTED_CODEX_TOOL_MODE;
|
|
443
|
+
return entry;
|
|
444
|
+
}
|
|
445
|
+
|
|
303
446
|
/**
|
|
304
447
|
* @param v2FeatureEnabled When the native multi_agent_v2 feature is on, "default"
|
|
305
448
|
* mode stamps unpinned entries as "v2" instead of deleting the key. The native
|
|
@@ -310,15 +453,42 @@ export type MultiAgentMode = "v1" | "default" | "v2";
|
|
|
310
453
|
* 260730_codex_rs_upstream_v2_live_handoff/060). Upstream pins are always
|
|
311
454
|
* preserved: a genuine "v1" pin is a real capability statement and stays excluded.
|
|
312
455
|
* With the feature off the output is byte-identical to the historical behavior.
|
|
456
|
+
*
|
|
457
|
+
* `keepNativeChatGptOnV1` only applies when `mode === "v2"`. It leaves Sol/Terra
|
|
458
|
+
* (and other ChatGPT-native rows) on v1 so a native parent can still spawn a
|
|
459
|
+
* routed child. See issue #92.
|
|
313
460
|
*/
|
|
314
|
-
export function applyMultiAgentMode(
|
|
461
|
+
export function applyMultiAgentMode(
|
|
462
|
+
entries: RawEntry[],
|
|
463
|
+
mode: MultiAgentMode,
|
|
464
|
+
v2FeatureEnabled = false,
|
|
465
|
+
options: MultiAgentModeOptions = {},
|
|
466
|
+
): RawEntry[] {
|
|
467
|
+
if (mode === "v2" && options.keepNativeChatGptOnV1 === true) {
|
|
468
|
+
for (const entry of entries) {
|
|
469
|
+
entry.multi_agent_version = catalogEntryIsNativeChatGpt(entry) ? "v1" : "v2";
|
|
470
|
+
}
|
|
471
|
+
return entries;
|
|
472
|
+
}
|
|
315
473
|
if (mode === "default") {
|
|
316
474
|
// Restore upstream defaults: clear any stale forced multi_agent_version and
|
|
317
475
|
// re-apply upstream pins from the snapshot for native entries that have one.
|
|
318
476
|
for (const entry of entries) {
|
|
319
477
|
const slug = typeof entry.slug === "string" ? entry.slug : "";
|
|
320
|
-
const
|
|
321
|
-
const
|
|
478
|
+
const nativeAlias = entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND;
|
|
479
|
+
const routedNativeSlug = slug.startsWith(`${OPENAI_CODEX_PROVIDER_ID}/`)
|
|
480
|
+
? slug.slice(OPENAI_CODEX_PROVIDER_ID.length + 1)
|
|
481
|
+
: "";
|
|
482
|
+
const codexForwardCapabilityAlias = entry.opencodex_catalog_kind === CODEX_CUSTOM_MODEL_CATALOG_KIND
|
|
483
|
+
&& entry.use_responses_lite === true
|
|
484
|
+
&& isNativeOpenAiCapabilityAliasModel(routedNativeSlug)
|
|
485
|
+
? routedNativeSlug
|
|
486
|
+
: undefined;
|
|
487
|
+
const upstreamPin = nativeAlias
|
|
488
|
+
? nativeMultiAgentVersion(slug)
|
|
489
|
+
: codexForwardCapabilityAlias
|
|
490
|
+
? nativeMultiAgentVersion(codexForwardCapabilityAlias)
|
|
491
|
+
: UPSTREAM_NATIVE_ENTRIES.get(trustedAccountBoundNativeCatalogSlug(entry) ?? slug)?.multi_agent_version;
|
|
322
492
|
if (typeof upstreamPin === "string") {
|
|
323
493
|
entry.multi_agent_version = upstreamPin;
|
|
324
494
|
} else if (v2FeatureEnabled) {
|
|
@@ -335,9 +505,14 @@ export function applyMultiAgentMode(entries: RawEntry[], mode: MultiAgentMode, v
|
|
|
335
505
|
return entries;
|
|
336
506
|
}
|
|
337
507
|
|
|
338
|
-
export function normalizeRoutedCatalogEntry(
|
|
508
|
+
export function normalizeRoutedCatalogEntry(
|
|
509
|
+
entry: RawEntry,
|
|
510
|
+
parallelToolCalls = false,
|
|
511
|
+
toolMode?: "code_mode_only" | "shell" | string,
|
|
512
|
+
): RawEntry {
|
|
339
513
|
delete entry.model_messages;
|
|
340
514
|
delete entry.tool_mode;
|
|
515
|
+
applyRoutedCodexToolMode(entry, toolMode);
|
|
341
516
|
delete entry.multi_agent_version;
|
|
342
517
|
delete entry.use_responses_lite;
|
|
343
518
|
delete entry.supports_websockets;
|
|
@@ -346,20 +521,24 @@ export function normalizeRoutedCatalogEntry(entry: RawEntry, parallelToolCalls =
|
|
|
346
521
|
delete entry.service_tiers;
|
|
347
522
|
delete entry.default_service_tier;
|
|
348
523
|
// Routed rows cloned from native templates must not inherit OpenAI-only summary delivery.
|
|
349
|
-
//
|
|
524
|
+
// Explicit provider/model metadata is re-applied after this normalization step.
|
|
350
525
|
delete entry.supports_reasoning_summaries;
|
|
351
526
|
const isCursorEntry = typeof entry.slug === "string" && entry.slug.startsWith("cursor/");
|
|
352
|
-
//
|
|
353
|
-
//
|
|
354
|
-
//
|
|
355
|
-
//
|
|
527
|
+
// `supports_search_tool` selects Codex's deferred tool-discovery surface; it is not the hosted
|
|
528
|
+
// web-search capability. Routed rows also carry tool_mode=code_mode_only (below), and under code
|
|
529
|
+
// mode DEFERRED MCP tools remain callable through exec's `tools` global / ALL_TOOLS without any
|
|
530
|
+
// tool_search round-trip (upstream codex-rs code_mode suite; live canary 2026-08-13: routed
|
|
531
|
+
// kimi/k3 called tools.mcp__node_repl__js → isError:false). Stamping false here instead forces
|
|
532
|
+
// every MCP declaration into exec.description — a measured 2.7x turn-1 payload regression
|
|
533
|
+
// (96,699 → 258,929 chars; devlog/_plan/260813_tool_catalog_deferral/010). So every routed
|
|
534
|
+
// code-mode row advertises deferred discovery. Cursor still omits hosted web-search metadata below,
|
|
535
|
+
// but disabling this separate exposure bit can inflate `exec` past Cursor's 120 KB wire cap (#1830).
|
|
356
536
|
if (isCursorEntry) {
|
|
357
537
|
delete entry.web_search_tool_type;
|
|
358
|
-
entry.supports_search_tool = false;
|
|
359
538
|
} else {
|
|
360
539
|
entry.web_search_tool_type = "text_and_image";
|
|
361
|
-
entry.supports_search_tool = true;
|
|
362
540
|
}
|
|
541
|
+
entry.supports_search_tool = true;
|
|
363
542
|
// Cursor's transport already serializes overlapping tool calls into atomic Responses tool events.
|
|
364
543
|
// Advertising parallel calls lets Codex send the same native capability bit it sends for OpenAI.
|
|
365
544
|
// Opt-in providers (OcxProviderConfig.parallelToolCalls, e.g. xAI) advertise it too: the
|
|
@@ -389,11 +568,25 @@ export function catalogModelSupportsReasoningSummaries(modelId: string): boolean
|
|
|
389
568
|
return values.size === 1 ? values.values().next().value : undefined;
|
|
390
569
|
}
|
|
391
570
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
571
|
+
/**
|
|
572
|
+
* Resolve the generated jawcode metadata row for a provider/model pair.
|
|
573
|
+
*
|
|
574
|
+
* Exported because it is the SECOND source of real capability assertions:
|
|
575
|
+
* `applyCatalogMetadata` writes context/modalities from it without ever
|
|
576
|
+
* touching a `CatalogModel`, so the routing-evidence provenance stamp in
|
|
577
|
+
* `applyCatalogModelMetadata` has to consult the same table. Both callers share
|
|
578
|
+
* this one lookup rather than duplicating the resolve/case-fold rules, which is
|
|
579
|
+
* what keeps the serialized entry and its provenance from drifting apart.
|
|
580
|
+
*/
|
|
581
|
+
export function generatedModelMetadata(provider: string, modelId: string) {
|
|
582
|
+
const jawcodeProvider = resolveMetadataProvider(provider);
|
|
583
|
+
if (!jawcodeProvider) return undefined;
|
|
584
|
+
return getModelMetadata(jawcodeProvider, modelId)
|
|
585
|
+
?? (shouldCaseFoldMetadataModelId(provider) ? getModelMetadataCaseInsensitive(jawcodeProvider, modelId) : undefined);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
export function applyCatalogMetadata(entry: RawEntry, provider: string, modelId: string, contextCap?: number): void {
|
|
589
|
+
const meta = generatedModelMetadata(provider, modelId);
|
|
397
590
|
if (!meta) return;
|
|
398
591
|
if (typeof meta.contextWindow === "number" && meta.contextWindow > 0) {
|
|
399
592
|
const contextWindow = applyProviderContextCap(meta.contextWindow, contextCap) ?? meta.contextWindow;
|
|
@@ -422,7 +615,8 @@ export function readCatalogBackup(catalogPath: string): RawCatalog | null {
|
|
|
422
615
|
}
|
|
423
616
|
|
|
424
617
|
export function catalogHasRoutedEntries(catalog: RawCatalog | null): boolean {
|
|
425
|
-
return (catalog?.models ?? []).some(m => typeof m.slug === "string"
|
|
618
|
+
return (catalog?.models ?? []).some(m => typeof m.slug === "string"
|
|
619
|
+
&& (m.slug.includes("/") || m.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND));
|
|
426
620
|
}
|
|
427
621
|
|
|
428
622
|
export function writePristineCatalogBackup(backupPath: string, catalogPath: string, catalog: RawCatalog): void {
|