@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,182 @@
|
|
|
1
|
+
import type { StorageCleanupPolicy } from "../types";
|
|
2
|
+
import { startStateStoreSweeper } from "../lib/state-store-sweeper";
|
|
3
|
+
import {
|
|
4
|
+
abortStorageCleanupPolicyJobAsync,
|
|
5
|
+
setStorageCleanupPolicyJobLiveApply,
|
|
6
|
+
} from "../storage/policy-job";
|
|
7
|
+
import { setStorageCleanupPolicyLiveSink } from "../storage/policy";
|
|
8
|
+
import {
|
|
9
|
+
scheduleStorageCleanupStartupRun,
|
|
10
|
+
startStorageCleanupScheduler,
|
|
11
|
+
stopStorageCleanupScheduler,
|
|
12
|
+
} from "../storage/policy-scheduler";
|
|
13
|
+
import {
|
|
14
|
+
cancelQueuedStorageWorkerSpawns,
|
|
15
|
+
drainStorageWorkers,
|
|
16
|
+
} from "../storage/worker-lifecycle";
|
|
17
|
+
import {
|
|
18
|
+
acquireServerResourceOwner,
|
|
19
|
+
type ServerResourceOwnerLease,
|
|
20
|
+
} from "../lib/server-resource-ownership";
|
|
21
|
+
import {
|
|
22
|
+
startMemoryWatchdog,
|
|
23
|
+
type MemoryWatchdog,
|
|
24
|
+
} from "./memory-watchdog";
|
|
25
|
+
|
|
26
|
+
type PolicyApply = (policy: StorageCleanupPolicy) => void;
|
|
27
|
+
|
|
28
|
+
type ProcessLoops = {
|
|
29
|
+
memoryWatchdog: MemoryWatchdog;
|
|
30
|
+
stateStoreSweeper: ReturnType<typeof startStateStoreSweeper>;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type LeaseOwner = {
|
|
34
|
+
token: symbol;
|
|
35
|
+
applyPolicy: PolicyApply;
|
|
36
|
+
resources: ServerResourceOwnerLease;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type ServerBackgroundLifecycleLease = {
|
|
40
|
+
scheduleStartupRun(): void;
|
|
41
|
+
release(): Promise<void>;
|
|
42
|
+
releaseAfterFailedStart(): void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const owners: LeaseOwner[] = [];
|
|
46
|
+
let processLoops: ProcessLoops | null = null;
|
|
47
|
+
let cleanupInProgress = false;
|
|
48
|
+
|
|
49
|
+
function setLivePolicyOwner(applyPolicy: PolicyApply | null): void {
|
|
50
|
+
setStorageCleanupPolicyLiveSink(applyPolicy);
|
|
51
|
+
setStorageCleanupPolicyJobLiveApply(applyPolicy);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function startProcessLoops(applyPolicy: PolicyApply): ProcessLoops {
|
|
55
|
+
let memoryWatchdog: MemoryWatchdog | null = null;
|
|
56
|
+
let stateStoreSweeper: ReturnType<typeof startStateStoreSweeper> | null = null;
|
|
57
|
+
try {
|
|
58
|
+
memoryWatchdog = startMemoryWatchdog();
|
|
59
|
+
stateStoreSweeper = startStateStoreSweeper();
|
|
60
|
+
setLivePolicyOwner(applyPolicy);
|
|
61
|
+
startStorageCleanupScheduler();
|
|
62
|
+
return { memoryWatchdog, stateStoreSweeper };
|
|
63
|
+
} catch (error) {
|
|
64
|
+
memoryWatchdog?.stop();
|
|
65
|
+
stateStoreSweeper?.stop();
|
|
66
|
+
stopStorageCleanupScheduler();
|
|
67
|
+
setLivePolicyOwner(null);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function stopProcessLoops(): void {
|
|
73
|
+
const loops = processLoops;
|
|
74
|
+
processLoops = null;
|
|
75
|
+
loops?.memoryWatchdog.stop();
|
|
76
|
+
loops?.stateStoreSweeper.stop();
|
|
77
|
+
stopStorageCleanupScheduler();
|
|
78
|
+
setLivePolicyOwner(null);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function stopStoragePolicyWorker(): Promise<void> {
|
|
82
|
+
cancelQueuedStorageWorkerSpawns();
|
|
83
|
+
const abortResult = await Promise.allSettled([abortStorageCleanupPolicyJobAsync()]);
|
|
84
|
+
if (abortResult[0]?.status === "rejected") {
|
|
85
|
+
console.warn(
|
|
86
|
+
"[storage] policy worker abort during server stop failed:",
|
|
87
|
+
abortResult[0].reason instanceof Error
|
|
88
|
+
? abortResult[0].reason.message
|
|
89
|
+
: abortResult[0].reason,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
await drainStorageWorkers();
|
|
94
|
+
} catch (error) {
|
|
95
|
+
console.warn(
|
|
96
|
+
"[storage] worker drain during server stop failed:",
|
|
97
|
+
error instanceof Error ? error.message : error,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function removeOwner(owner: LeaseOwner): boolean {
|
|
103
|
+
const index = owners.findIndex(candidate => candidate.token === owner.token);
|
|
104
|
+
if (index === -1) return false;
|
|
105
|
+
owners.splice(index, 1);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function releaseOwnerSynchronously(owner: LeaseOwner): "inactive" | "shared" | "last" {
|
|
110
|
+
if (!removeOwner(owner)) return "inactive";
|
|
111
|
+
owner.resources.release();
|
|
112
|
+
const nextOwner = owners.at(-1);
|
|
113
|
+
if (nextOwner) {
|
|
114
|
+
setLivePolicyOwner(nextOwner.applyPolicy);
|
|
115
|
+
return "shared";
|
|
116
|
+
}
|
|
117
|
+
stopProcessLoops();
|
|
118
|
+
return "last";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Acquire one server's lease on process-wide singleton loops.
|
|
123
|
+
*
|
|
124
|
+
* The first live server starts the loops. Later servers only add a reference and
|
|
125
|
+
* become the current policy sink; out-of-order release restores the newest
|
|
126
|
+
* remaining sink. The final release owns timer and Worker teardown. Resources
|
|
127
|
+
* registered while this server starts are released with this exact lease.
|
|
128
|
+
*/
|
|
129
|
+
export function acquireServerBackgroundLifecycle(
|
|
130
|
+
applyPolicy: PolicyApply,
|
|
131
|
+
): ServerBackgroundLifecycleLease {
|
|
132
|
+
if (cleanupInProgress) {
|
|
133
|
+
throw new Error("server background lifecycle cleanup is still in progress");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const owner: LeaseOwner = {
|
|
137
|
+
token: Symbol("server-background-lifecycle"),
|
|
138
|
+
applyPolicy,
|
|
139
|
+
resources: acquireServerResourceOwner(),
|
|
140
|
+
};
|
|
141
|
+
try {
|
|
142
|
+
if (!processLoops) {
|
|
143
|
+
processLoops = startProcessLoops(applyPolicy);
|
|
144
|
+
} else {
|
|
145
|
+
setLivePolicyOwner(applyPolicy);
|
|
146
|
+
}
|
|
147
|
+
owners.push(owner);
|
|
148
|
+
} catch (error) {
|
|
149
|
+
owner.resources.release();
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
let releaseFlight: Promise<void> | null = null;
|
|
154
|
+
return {
|
|
155
|
+
scheduleStartupRun() {
|
|
156
|
+
if (owners.some(candidate => candidate.token === owner.token)) {
|
|
157
|
+
scheduleStorageCleanupStartupRun();
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
release() {
|
|
161
|
+
if (releaseFlight) return releaseFlight;
|
|
162
|
+
const outcome = releaseOwnerSynchronously(owner);
|
|
163
|
+
if (outcome !== "last") {
|
|
164
|
+
releaseFlight = Promise.resolve();
|
|
165
|
+
return releaseFlight;
|
|
166
|
+
}
|
|
167
|
+
cleanupInProgress = true;
|
|
168
|
+
releaseFlight = stopStoragePolicyWorker().finally(() => {
|
|
169
|
+
cleanupInProgress = false;
|
|
170
|
+
});
|
|
171
|
+
return releaseFlight;
|
|
172
|
+
},
|
|
173
|
+
releaseAfterFailedStart() {
|
|
174
|
+
if (releaseFlight) return;
|
|
175
|
+
// Startup evaluation is scheduled only after both listeners bind, so a
|
|
176
|
+
// failed start cannot have spawned a Worker for this lease. Keep rollback
|
|
177
|
+
// synchronous so a caller may immediately retry a different port.
|
|
178
|
+
releaseOwnerSynchronously(owner);
|
|
179
|
+
releaseFlight = Promise.resolve();
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* OpenAI Chat Completions inbound (/v1/chat/completions) for GitHub Copilot App
|
|
3
3
|
* and other OpenAI-compatible clients.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Ordinary openai-chat routes send directly on the Chat Completions wire. Routes
|
|
6
|
+
* that need Responses-only behavior keep the Chat -> Responses -> Chat bridge.
|
|
7
7
|
*/
|
|
8
8
|
import { FORWARD_HEADERS } from "../adapters/openai-responses";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
assertChatCompletionsRoutingBody,
|
|
11
|
+
ChatCompletionsRequestError,
|
|
12
|
+
chatCompletionsToResponsesBody,
|
|
13
|
+
} from "../chat/inbound";
|
|
10
14
|
import {
|
|
11
15
|
chatCompletionsErrorResponse,
|
|
12
16
|
collectChatCompletion,
|
|
@@ -18,13 +22,14 @@ import { classifyError, CYBER_POLICY_ERROR_CODE, isCyberPolicyCode } from "../li
|
|
|
18
22
|
import { redactSecretString } from "../lib/redact";
|
|
19
23
|
import { resolveClientRetryAfter } from "../lib/retry-after";
|
|
20
24
|
import { estimateTokens } from "../lib/token-estimate";
|
|
21
|
-
import { routeModel } from "../router";
|
|
25
|
+
import { NoEligiblePolicyCandidateError, routeModel } from "../router";
|
|
26
|
+
import { evidenceFromBody } from "../routing/request-evidence";
|
|
22
27
|
import { resolveWireProtocolOverride } from "./adapter-resolve";
|
|
23
28
|
import type { OcxConfig } from "../types";
|
|
24
29
|
import { readJsonRequestBody } from "./request-decompress";
|
|
25
30
|
import {
|
|
26
31
|
addFinalRequestLog,
|
|
27
|
-
|
|
32
|
+
httpStatusForRequestLogTerminal,
|
|
28
33
|
recordFirstOutput,
|
|
29
34
|
type RequestLogContext,
|
|
30
35
|
type RequestLogEntry,
|
|
@@ -32,12 +37,15 @@ import {
|
|
|
32
37
|
import { responseWithDeferredRequestLog } from "./relay";
|
|
33
38
|
import { handleResponses } from "./responses";
|
|
34
39
|
import type { AdmissionLease } from "../lib/admission";
|
|
40
|
+
import type { DataPlaneAdmission } from "./auth-cors";
|
|
41
|
+
import { tryClaimNativeMainProfileForTurn } from "../codex/native-main-admission";
|
|
35
42
|
import {
|
|
36
43
|
createTranslatorBudget,
|
|
37
44
|
finalizeTranslatorBudgetResponse,
|
|
38
45
|
isTranslatorBudgetExceededError,
|
|
39
46
|
type TranslatorBudget,
|
|
40
47
|
} from "../lib/translator-budget";
|
|
48
|
+
import { handleNativeChatCompletions, isNativeChatRouteEligible } from "./chat-native";
|
|
41
49
|
|
|
42
50
|
type Rec = Record<string, unknown>;
|
|
43
51
|
|
|
@@ -57,7 +65,7 @@ export async function handleChatCompletions(
|
|
|
57
65
|
req: Request,
|
|
58
66
|
config: OcxConfig,
|
|
59
67
|
logCtx: RequestLogContext,
|
|
60
|
-
logIds?: { requestId: string; start: number; turnAdmissionLease?: AdmissionLease },
|
|
68
|
+
logIds?: { requestId: string; start: number; turnAdmissionLease?: AdmissionLease; admission?: DataPlaneAdmission },
|
|
61
69
|
): Promise<Response> {
|
|
62
70
|
const translatorBudget = createTranslatorBudget();
|
|
63
71
|
try {
|
|
@@ -76,14 +84,13 @@ async function handleChatCompletionsWithBudget(
|
|
|
76
84
|
config: OcxConfig,
|
|
77
85
|
logCtx: RequestLogContext,
|
|
78
86
|
translatorBudget: TranslatorBudget,
|
|
79
|
-
logIds?: { requestId: string; start: number; turnAdmissionLease?: AdmissionLease },
|
|
87
|
+
logIds?: { requestId: string; start: number; turnAdmissionLease?: AdmissionLease; admission?: DataPlaneAdmission },
|
|
80
88
|
): Promise<Response> {
|
|
81
|
-
let chatBody:
|
|
82
|
-
let internalBody: Rec;
|
|
89
|
+
let chatBody: Rec;
|
|
83
90
|
try {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
91
|
+
const rawBody = await readChatBody(req, translatorBudget);
|
|
92
|
+
assertChatCompletionsRoutingBody(rawBody);
|
|
93
|
+
chatBody = rawBody;
|
|
87
94
|
} catch (err) {
|
|
88
95
|
const overflow = isTranslatorBudgetExceededError(err);
|
|
89
96
|
const status = overflow ? 413 : err instanceof ChatCompletionsRequestError ? 400 : 500;
|
|
@@ -96,20 +103,17 @@ async function handleChatCompletionsWithBudget(
|
|
|
96
103
|
);
|
|
97
104
|
}
|
|
98
105
|
|
|
99
|
-
const requestedModel =
|
|
100
|
-
const stream =
|
|
106
|
+
const requestedModel = chatBody.model as string;
|
|
107
|
+
const stream = chatBody.stream === true;
|
|
101
108
|
// Best-effort Grok attribution: the managed fence stamps this header on every model
|
|
102
109
|
// it registers (extra_headers, sent verbatim by upstream Grok). Dashboard usage
|
|
103
110
|
// bucketing only — never an auth or billing signal.
|
|
104
111
|
if (req.headers.get("x-opencodex-grok") === "1") logCtx.surface = "grok";
|
|
105
|
-
// Routed adapters only support streamed turns; always stream internally and fold
|
|
106
|
-
// for non-streaming clients.
|
|
107
|
-
internalBody.stream = true;
|
|
108
|
-
|
|
109
|
-
let nativeRoute = false;
|
|
110
112
|
let directRoute = false;
|
|
113
|
+
let settledRoute: ReturnType<typeof routeModel> | null = null;
|
|
114
|
+
let chatNativeRoute: ReturnType<typeof routeModel> | null = null;
|
|
111
115
|
try {
|
|
112
|
-
const route = routeModel(config,
|
|
116
|
+
const route = routeModel(config, requestedModel, evidenceFromBody(chatBody));
|
|
113
117
|
// Settle the wire once so every branch below reads the adapter this model will
|
|
114
118
|
// actually use, not the provider-wide default (#404).
|
|
115
119
|
route.provider = resolveWireProtocolOverride(route.providerName, route.modelId, route.provider, "chat");
|
|
@@ -117,39 +121,79 @@ async function handleChatCompletionsWithBudget(
|
|
|
117
121
|
logCtx.providerAdapter = route.provider.adapter;
|
|
118
122
|
logCtx.requestedModel = requestedModel;
|
|
119
123
|
logCtx.provider = route.providerName;
|
|
124
|
+
logCtx.routeDecision = route.routeDecision;
|
|
125
|
+
settledRoute = route;
|
|
120
126
|
if (route.provider.adapter === "openai-responses") {
|
|
121
|
-
nativeRoute = true;
|
|
122
127
|
directRoute = route.codexAccountMode === "direct";
|
|
123
|
-
// ChatGPT backend rejects store:true and unsupported sampling knobs.
|
|
124
|
-
internalBody.store = false;
|
|
125
|
-
delete internalBody.max_output_tokens;
|
|
126
|
-
delete internalBody.temperature;
|
|
127
|
-
delete internalBody.top_p;
|
|
128
|
-
delete internalBody.stop;
|
|
129
|
-
delete internalBody.user;
|
|
130
|
-
} else if (internalBody.store === undefined) {
|
|
131
|
-
internalBody.store = false;
|
|
132
|
-
}
|
|
133
|
-
if (route.provider.adapter === "openai-chat" && internalBody.text !== undefined) {
|
|
134
|
-
if (logIds) addFinalRequestLog(logIds.requestId, logIds.start, logCtx, 400, { closeReason: "non_stream" });
|
|
135
|
-
return chatCompletionsErrorResponse(400, "response_format is not supported for routed openai-chat models");
|
|
136
128
|
}
|
|
137
129
|
if (route.provider.adapter === "cursor" || route.provider.adapter === "kiro") {
|
|
138
|
-
const raw = chatBody as Rec;
|
|
139
130
|
const parts: string[] = [];
|
|
140
|
-
if (
|
|
141
|
-
if (
|
|
131
|
+
if (chatBody.messages !== undefined) parts.push(JSON.stringify(chatBody.messages));
|
|
132
|
+
if (chatBody.tools !== undefined) parts.push(JSON.stringify(chatBody.tools));
|
|
142
133
|
logCtx.usageLogInputTokens = Math.max(1, estimateTokens(parts.join("\n"), requestedModel));
|
|
143
134
|
}
|
|
144
|
-
if (
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
135
|
+
if (isNativeChatRouteEligible(route, chatBody)) chatNativeRoute = route;
|
|
136
|
+
} catch (err) {
|
|
137
|
+
if (err instanceof NoEligiblePolicyCandidateError) {
|
|
138
|
+
logCtx.routeDecision = err.trace;
|
|
139
|
+
if (logIds) addFinalRequestLog(logIds.requestId, logIds.start, logCtx, 404, { closeReason: "non_stream" });
|
|
140
|
+
return chatCompletionsErrorResponse(404, err.message, "invalid_request_error");
|
|
148
141
|
}
|
|
149
|
-
} catch {
|
|
150
142
|
/* unknown model: let handleResponses shape the 404 */
|
|
151
143
|
}
|
|
152
|
-
|
|
144
|
+
|
|
145
|
+
if (chatNativeRoute) {
|
|
146
|
+
return handleNativeChatCompletions({
|
|
147
|
+
req,
|
|
148
|
+
config,
|
|
149
|
+
logCtx,
|
|
150
|
+
...(logIds ? { logIds } : {}),
|
|
151
|
+
route: chatNativeRoute,
|
|
152
|
+
chatBody,
|
|
153
|
+
requestedModel,
|
|
154
|
+
requestedStream: stream,
|
|
155
|
+
translatorBudget,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let internalBody: Rec;
|
|
160
|
+
try {
|
|
161
|
+
// Validate the full Chat boundary after routing. Native Chat keeps `chatBody` as
|
|
162
|
+
// its wire source; this Responses projection is used only by the fallback path.
|
|
163
|
+
internalBody = chatCompletionsToResponsesBody(chatBody);
|
|
164
|
+
} catch (err) {
|
|
165
|
+
const overflow = isTranslatorBudgetExceededError(err);
|
|
166
|
+
const status = overflow ? 413 : err instanceof ChatCompletionsRequestError ? 400 : 500;
|
|
167
|
+
if (logIds) addFinalRequestLog(logIds.requestId, logIds.start, logCtx, status, { closeReason: "non_stream" });
|
|
168
|
+
return chatCompletionsErrorResponse(
|
|
169
|
+
status,
|
|
170
|
+
overflow ? "request translation buffer exceeded the safe limit" : err instanceof Error ? err.message : String(err),
|
|
171
|
+
overflow ? "request_too_large" : undefined,
|
|
172
|
+
overflow ? "translation_buffer_limit" : undefined,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Routed adapters only support streamed turns; always stream internally and fold
|
|
177
|
+
// for non-streaming clients. Native Chat uses the caller's original stream bit.
|
|
178
|
+
internalBody.stream = true;
|
|
179
|
+
if (settledRoute?.provider.adapter === "openai-responses") {
|
|
180
|
+
// ChatGPT backend rejects store:true and unsupported sampling knobs.
|
|
181
|
+
internalBody.store = false;
|
|
182
|
+
delete internalBody.max_output_tokens;
|
|
183
|
+
delete internalBody.temperature;
|
|
184
|
+
delete internalBody.top_p;
|
|
185
|
+
delete internalBody.stop;
|
|
186
|
+
delete internalBody.user;
|
|
187
|
+
} else if (internalBody.store === undefined) {
|
|
188
|
+
internalBody.store = false;
|
|
189
|
+
}
|
|
190
|
+
if (settledRoute && internalBody.reasoning !== undefined) {
|
|
191
|
+
const { stripEmptyLadderEffort, supportedLadderFor } = await import("./effort-policy");
|
|
192
|
+
const ladder = supportedLadderFor({ provider: settledRoute.provider, modelId: settledRoute.modelId });
|
|
193
|
+
const next = stripEmptyLadderEffort(internalBody.reasoning, ladder);
|
|
194
|
+
if (next === undefined) delete internalBody.reasoning;
|
|
195
|
+
else internalBody.reasoning = next;
|
|
196
|
+
}
|
|
153
197
|
|
|
154
198
|
const headers = new Headers({ "content-type": "application/json" });
|
|
155
199
|
for (const name of FORWARD_HEADERS) {
|
|
@@ -158,19 +202,42 @@ async function handleChatCompletionsWithBudget(
|
|
|
158
202
|
if (value) headers.set(name, value);
|
|
159
203
|
}
|
|
160
204
|
// Prefer main ChatGPT auth so OpenAI-backed sidecars remain reachable on routed turns.
|
|
161
|
-
if (!directRoute)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
205
|
+
if (!directRoute) {
|
|
206
|
+
// This enrichment is optional for routed/non-main providers. If native main
|
|
207
|
+
// is fenced, omit it and let auth-context reject only a final physical-main
|
|
208
|
+
// selection while healthy pool/provider routes continue.
|
|
209
|
+
if (tryClaimNativeMainProfileForTurn(logIds?.turnAdmissionLease)) {
|
|
210
|
+
try {
|
|
211
|
+
const { getMainAccountToken } = await import("../codex/main-account");
|
|
212
|
+
const token = getMainAccountToken();
|
|
213
|
+
if (token) {
|
|
214
|
+
headers.set("authorization", `Bearer ${token.accessToken}`);
|
|
215
|
+
headers.set("chatgpt-account-id", token.chatgptAccountId);
|
|
216
|
+
}
|
|
217
|
+
} catch {
|
|
218
|
+
/* optional */
|
|
219
|
+
}
|
|
167
220
|
}
|
|
168
|
-
} catch {
|
|
169
|
-
/* optional */
|
|
170
221
|
}
|
|
171
222
|
|
|
172
|
-
|
|
173
|
-
|
|
223
|
+
let internalBodyJson: string;
|
|
224
|
+
try {
|
|
225
|
+
internalBodyJson = JSON.stringify(internalBody);
|
|
226
|
+
translatorBudget.chargeRetained(
|
|
227
|
+
new TextEncoder().encode(internalBodyJson).byteLength,
|
|
228
|
+
{ kind: "request_copies" },
|
|
229
|
+
);
|
|
230
|
+
} catch (err) {
|
|
231
|
+
const overflow = isTranslatorBudgetExceededError(err);
|
|
232
|
+
const status = overflow ? 413 : 500;
|
|
233
|
+
if (logIds) addFinalRequestLog(logIds.requestId, logIds.start, logCtx, status, { closeReason: "non_stream" });
|
|
234
|
+
return chatCompletionsErrorResponse(
|
|
235
|
+
status,
|
|
236
|
+
overflow ? "request translation buffer exceeded the safe limit" : err instanceof Error ? err.message : String(err),
|
|
237
|
+
overflow ? "request_too_large" : undefined,
|
|
238
|
+
overflow ? "translation_buffer_limit" : undefined,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
174
241
|
const internalReq = new Request("http://localhost/v1/responses", {
|
|
175
242
|
method: "POST",
|
|
176
243
|
headers,
|
|
@@ -185,12 +252,19 @@ async function handleChatCompletionsWithBudget(
|
|
|
185
252
|
};
|
|
186
253
|
const upstream = await handleResponses(internalReq, config, logCtx, {
|
|
187
254
|
...(logIds?.turnAdmissionLease ? { turnAdmissionLease: logIds.turnAdmissionLease } : {}),
|
|
255
|
+
// #1686: the Chat surface translates its body and replays here, so the admission fact has
|
|
256
|
+
// to ride along or a bearer-admitted Chat caller would still be refused by Direct.
|
|
257
|
+
...(logIds?.admission ? { admission: logIds.admission } : {}),
|
|
188
258
|
abortSignal: req.signal,
|
|
189
259
|
// Body is Responses-shaped by now, but the client spoke Chat Completions.
|
|
190
260
|
inboundWire: "chat",
|
|
261
|
+
// Terminal vision-describe marker (roadmap 180): the bridge rebuilds
|
|
262
|
+
// headers from the FORWARD_HEADERS allowlist, which would drop the raw
|
|
263
|
+
// header — so the fact is detected here and carried as an option flag.
|
|
264
|
+
...(req.headers.get("x-opencodex-vision-describe") === "1" ? { visionDescribeTerminal: true } : {}),
|
|
191
265
|
translatorBudget,
|
|
192
266
|
...(logIds ? { onFirstOutput: () => recordFirstOutput(logCtx, logIds.start) } : {}),
|
|
193
|
-
onNativePassthroughTerminal: status => finalizeNativeLog(
|
|
267
|
+
onNativePassthroughTerminal: status => finalizeNativeLog(httpStatusForRequestLogTerminal(status, logCtx), { terminalStatus: status, closeReason: "terminal" }),
|
|
194
268
|
onNativePassthroughCancel: () => finalizeNativeLog(499, { closeReason: "client_cancel" }),
|
|
195
269
|
});
|
|
196
270
|
|
|
@@ -316,7 +390,7 @@ async function handleChatCompletionsWithBudget(
|
|
|
316
390
|
const classified = classifyError(502, error?.type ?? "server_error", message);
|
|
317
391
|
if (error?.code === "translation_buffer_limit") {
|
|
318
392
|
classified.code = "translation_buffer_limit";
|
|
319
|
-
classified.type = "
|
|
393
|
+
classified.type = "upstream_error";
|
|
320
394
|
} else if (isCyberPolicyCode(error?.code)) {
|
|
321
395
|
classified.code = CYBER_POLICY_ERROR_CODE;
|
|
322
396
|
classified.type = "invalid_request_error";
|
|
@@ -327,7 +401,7 @@ async function handleChatCompletionsWithBudget(
|
|
|
327
401
|
}
|
|
328
402
|
return chatCompletionsErrorResponse(
|
|
329
403
|
classified.code === "translation_buffer_limit"
|
|
330
|
-
?
|
|
404
|
+
? 502
|
|
331
405
|
: isCyberPolicyCode(classified.code) ? 400 : 502,
|
|
332
406
|
message,
|
|
333
407
|
classified.type,
|