@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-dispatch input admission (#1412).
|
|
3
|
+
*
|
|
4
|
+
* Refuses a turn whose estimated input cannot plausibly fit the model context window,
|
|
5
|
+
* BEFORE auth resolution, circuit admission, or any upstream I/O. #1412 reported ~127k of
|
|
6
|
+
* real context compounding to 1.3M-1.6M tokens and crashing the proxy; the provider would
|
|
7
|
+
* reject such a turn anyway, so paying for the round trip buys nothing.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately narrow. This is not a context manager and not a compaction trigger: it
|
|
10
|
+
* catches the pathological case and stays out of the way otherwise. Every uncertainty
|
|
11
|
+
* resolves toward admitting.
|
|
12
|
+
*/
|
|
13
|
+
import { nativeOpenAiContextWindow, nativeOpenAiMaxInputTokens, type NativeContextLimitsInput } from "../../codex/catalog/metadata";
|
|
14
|
+
import { estimateTokens } from "../../lib/token-estimate";
|
|
15
|
+
import { isCanonicalOpenAiForwardProvider, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers";
|
|
16
|
+
import { modelRecordValue } from "../../reasoning-effort";
|
|
17
|
+
import type { OcxContentPart, OcxParsedRequest, OcxProviderConfig } from "../../types";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Multiplier applied to the ceiling before refusing.
|
|
21
|
+
*
|
|
22
|
+
* 2.5, not something tighter, because `estimateTokens` can overshoot by 1.6x on its own.
|
|
23
|
+
* `cjkRatio` samples every `stride`-th character, so a payload of fixed-width records whose
|
|
24
|
+
* length aligns with the stride samples as 100% CJK while being ~1.6% CJK, firing the
|
|
25
|
+
* 2.5-chars/token clamp instead of the 4.0 default. Measured on Bun 1.3.14: 126,046 chars,
|
|
26
|
+
* true CJK ratio 0.0161, sampled ratio 1.0, estimate inflated 1.6x. Since 4.0 / 2.5 = 1.6
|
|
27
|
+
* is that branch maximum divergence, a threshold at or under 1.6 would convert the
|
|
28
|
+
* estimator error bar into false 413s.
|
|
29
|
+
*
|
|
30
|
+
* 2.5 sits above it with room for the ~10% model-family ratio spread, and still refuses the
|
|
31
|
+
* #1412 shape (10x) four times over.
|
|
32
|
+
*/
|
|
33
|
+
export const ADMISSION_TOLERANCE = 2.5;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Token cost charged for a remote image URL. The bytes are not in this request — the
|
|
37
|
+
* provider fetches them — so the URL own length is not the cost. A small flat charge
|
|
38
|
+
* acknowledges the tiles the image will occupy without pretending to know its dimensions.
|
|
39
|
+
*/
|
|
40
|
+
const REMOTE_IMAGE_TOKENS = 850;
|
|
41
|
+
|
|
42
|
+
/** Decoded image bytes per token. Coarse tile-count proxy, not a provider formula. */
|
|
43
|
+
const IMAGE_BYTES_PER_TOKEN = 750;
|
|
44
|
+
|
|
45
|
+
export interface InputAdmissionResult {
|
|
46
|
+
admitted: boolean;
|
|
47
|
+
estimatedTokens: number;
|
|
48
|
+
/** Resolved ceiling, or null when nothing could be resolved (=> always admitted). */
|
|
49
|
+
ceiling: number | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function positive(value: unknown): number | null {
|
|
53
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Charge a `data:` URL by its DECODED size rather than its character length: base64 inflates
|
|
58
|
+
* by 4/3, so charging the string would overcount by a third. A remote URL is charged flat.
|
|
59
|
+
*/
|
|
60
|
+
function imageTokens(imageUrl: string): number {
|
|
61
|
+
if (!imageUrl.startsWith("data:")) return REMOTE_IMAGE_TOKENS;
|
|
62
|
+
const comma = imageUrl.indexOf(",");
|
|
63
|
+
if (comma < 0) return REMOTE_IMAGE_TOKENS;
|
|
64
|
+
const payload = imageUrl.length - comma - 1;
|
|
65
|
+
if (payload <= 0) return 0;
|
|
66
|
+
const decoded = Math.floor((payload * 3) / 4);
|
|
67
|
+
return Math.max(1, Math.ceil(decoded / IMAGE_BYTES_PER_TOKEN));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function contentPartTokens(part: OcxContentPart, modelId: string): number {
|
|
71
|
+
if (part.type === "image") return imageTokens(part.imageUrl);
|
|
72
|
+
if (part.type === "video") return imageTokens(part.videoUrl);
|
|
73
|
+
return estimateTokens(part.text, modelId);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function contentTokens(content: string | readonly OcxContentPart[], modelId: string): number {
|
|
77
|
+
if (typeof content === "string") return estimateTokens(content, modelId);
|
|
78
|
+
let total = 0;
|
|
79
|
+
for (const part of content) total += contentPartTokens(part, modelId);
|
|
80
|
+
return total;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Estimate the input tokens of a parsed request.
|
|
85
|
+
*
|
|
86
|
+
* Walks the whole `OcxMessage` union rather than user text alone. Assistant turns carry
|
|
87
|
+
* their content as `OcxAssistantContentPart[]` — text, thinking blocks, and tool calls whose
|
|
88
|
+
* JSON arguments are frequently the largest single item in an agent conversation. A walk
|
|
89
|
+
* that counted only `{type:"text"}` would undercount exactly the turns that trigger this
|
|
90
|
+
* gate.
|
|
91
|
+
*/
|
|
92
|
+
export function estimateInputTokens(parsed: OcxParsedRequest, modelId: string): number {
|
|
93
|
+
const { context } = parsed;
|
|
94
|
+
let total = 0;
|
|
95
|
+
|
|
96
|
+
for (const prompt of context.systemPrompt ?? []) total += estimateTokens(prompt, modelId);
|
|
97
|
+
|
|
98
|
+
for (const message of context.messages) {
|
|
99
|
+
if (message.role === "assistant") {
|
|
100
|
+
for (const part of message.content) {
|
|
101
|
+
if (part.type === "text") total += estimateTokens(part.text, modelId);
|
|
102
|
+
else if (part.type === "thinking") total += estimateTokens(part.thinking, modelId);
|
|
103
|
+
else total += estimateTokens(part.name, modelId) + estimateTokens(JSON.stringify(part.arguments), modelId);
|
|
104
|
+
}
|
|
105
|
+
// Opaque provider blob replayed verbatim upstream, so it costs real input tokens.
|
|
106
|
+
if (message.kiroRedactedReasoning) total += estimateTokens(message.kiroRedactedReasoning, modelId);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
total += contentTokens(message.content, modelId);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Tool schemas ride every turn: name, description, and the JSON parameter schema all
|
|
113
|
+
// reach the upstream, and a large MCP catalog can dominate a short conversation.
|
|
114
|
+
for (const tool of context.tools ?? []) {
|
|
115
|
+
total += estimateTokens(tool.name, modelId)
|
|
116
|
+
+ estimateTokens(tool.description, modelId)
|
|
117
|
+
+ estimateTokens(JSON.stringify(tool.parameters), modelId);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return total;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Resolve the admission ceiling. Pure: no filesystem, no catalog, no registry scan.
|
|
125
|
+
*
|
|
126
|
+
* `provider` must be the ROUTED config (`route.provider`), which `routedProviderConfig`
|
|
127
|
+
* has already transport-guarded and merged. Re-deriving from `config.providers[name]` would
|
|
128
|
+
* reject a user-defined provider that merely shares a built-in name using limits that
|
|
129
|
+
* belong to a different service.
|
|
130
|
+
*/
|
|
131
|
+
export function resolveInputCeiling(
|
|
132
|
+
provider: OcxProviderConfig,
|
|
133
|
+
providerName: string,
|
|
134
|
+
modelId: string,
|
|
135
|
+
// Operator cap for the canonical native provider. Passed in rather than read from a
|
|
136
|
+
// config here so this stays pure: no filesystem, no catalog, no registry scan.
|
|
137
|
+
nativeContextCap?: NativeContextLimitsInput,
|
|
138
|
+
): number | null {
|
|
139
|
+
// `modelRecordValue`, not a bare lookup: the catalog resolves these same two maps that
|
|
140
|
+
// way, so a `gpt-oss` entry covers `gpt-oss:120b`. Reading raw here made the gate fall
|
|
141
|
+
// back to the provider-wide window and refuse turns the model can plainly hold.
|
|
142
|
+
const configured = positive(modelRecordValue(provider.modelContextWindows, modelId))
|
|
143
|
+
?? positive(provider.contextWindow);
|
|
144
|
+
|
|
145
|
+
// The canonical `openai` registry entry declares no context fields, so without this the
|
|
146
|
+
// gate would be inert on the default Codex route. All three clauses are load-bearing: a
|
|
147
|
+
// transport-mismatched custom provider named "openai" is preserved verbatim by routing
|
|
148
|
+
// and must not inherit built-in native limits, and a routed `provider/model` id is not a
|
|
149
|
+
// native slug. Static maps only — no catalog read.
|
|
150
|
+
const canonicalNativeBare = providerName === OPENAI_CODEX_PROVIDER_ID
|
|
151
|
+
&& isCanonicalOpenAiForwardProvider(provider)
|
|
152
|
+
&& !modelId.includes("/");
|
|
153
|
+
const nativeLimits = canonicalNativeBare && configured !== null
|
|
154
|
+
? {
|
|
155
|
+
...(typeof nativeContextCap === "number" ? { cap: nativeContextCap } : (nativeContextCap ?? {})),
|
|
156
|
+
modelWindows: { [modelId]: configured },
|
|
157
|
+
}
|
|
158
|
+
: nativeContextCap;
|
|
159
|
+
const native = canonicalNativeBare
|
|
160
|
+
? positive(nativeOpenAiContextWindow(modelId, nativeLimits))
|
|
161
|
+
: null;
|
|
162
|
+
const nativeMaxInput = canonicalNativeBare ? positive(nativeOpenAiMaxInputTokens(modelId, nativeLimits)) : null;
|
|
163
|
+
|
|
164
|
+
const window = canonicalNativeBare ? native : configured;
|
|
165
|
+
// modelMaxInputTokens is an input-only cap, so it can only tighten the window.
|
|
166
|
+
const configuredMaxInput = positive(modelRecordValue(provider.modelMaxInputTokens, modelId));
|
|
167
|
+
const limits = [window, configuredMaxInput, nativeMaxInput].filter((v): v is number => v !== null);
|
|
168
|
+
return limits.length === 0 ? null : Math.min(...limits);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Fail-open when no ceiling is known; refuse only past `ceiling * ADMISSION_TOLERANCE`.
|
|
173
|
+
*
|
|
174
|
+
* The caller is responsible for skipping compaction turns — see the call site in core.ts.
|
|
175
|
+
*/
|
|
176
|
+
export function checkInputAdmission(
|
|
177
|
+
parsed: OcxParsedRequest,
|
|
178
|
+
provider: OcxProviderConfig,
|
|
179
|
+
providerName: string,
|
|
180
|
+
modelId: string,
|
|
181
|
+
nativeContextCap?: NativeContextLimitsInput,
|
|
182
|
+
): InputAdmissionResult {
|
|
183
|
+
const ceiling = resolveInputCeiling(provider, providerName, modelId, nativeContextCap);
|
|
184
|
+
if (ceiling === null) return { admitted: true, estimatedTokens: 0, ceiling: null };
|
|
185
|
+
const estimatedTokens = estimateInputTokens(parsed, modelId);
|
|
186
|
+
return { admitted: estimatedTokens <= ceiling * ADMISSION_TOLERANCE, estimatedTokens, ceiling };
|
|
187
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { formatErrorResponse } from "../../bridge";
|
|
2
|
+
import { RequestPacingQueueOverloadError } from "../../providers/request-pacing";
|
|
3
|
+
|
|
4
|
+
/** Convert local request-pacing admission failures into a retryable HTTP response. */
|
|
5
|
+
export function requestPacingOverloadResponse(error: unknown): Response | undefined {
|
|
6
|
+
if (!(error instanceof RequestPacingQueueOverloadError)) return undefined;
|
|
7
|
+
return formatErrorResponse(
|
|
8
|
+
429,
|
|
9
|
+
"rate_limit_error",
|
|
10
|
+
error.message,
|
|
11
|
+
{ retryAfter: String(error.retryAfterSeconds) },
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import { formatErrorResponse } from "../../bridge";
|
|
2
|
+
import { isCyberPolicyCode, isCyberPolicyMessage } from "../../lib/errors";
|
|
2
3
|
import {
|
|
3
4
|
resolveClientRetryAfter,
|
|
4
5
|
validateClientRetryAfterHeader,
|
|
5
6
|
} from "../../lib/retry-after";
|
|
6
7
|
|
|
8
|
+
function isCyberPolicyBody(body: string): boolean {
|
|
9
|
+
if (isCyberPolicyMessage(body)) return true;
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(body) as Record<string, unknown>;
|
|
12
|
+
const response = parsed.response && typeof parsed.response === "object" && !Array.isArray(parsed.response)
|
|
13
|
+
? parsed.response as Record<string, unknown>
|
|
14
|
+
: undefined;
|
|
15
|
+
for (const candidate of [parsed.error, response?.error, response?.last_error, parsed.last_error, parsed]) {
|
|
16
|
+
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) continue;
|
|
17
|
+
const record = candidate as Record<string, unknown>;
|
|
18
|
+
if (isCyberPolicyCode(typeof record.code === "string" ? record.code : undefined)) return true;
|
|
19
|
+
if (typeof record.message === "string" && isCyberPolicyMessage(record.message)) return true;
|
|
20
|
+
}
|
|
21
|
+
} catch {
|
|
22
|
+
/* non-JSON body — message detection above is the only safe fallback */
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
7
27
|
/**
|
|
8
28
|
* Passthrough adapters historically relayed upstream non-2xx bodies verbatim.
|
|
9
29
|
* Codex maps an *empty* body to the literal client string "Unknown error"
|
|
@@ -32,18 +52,22 @@ export function formatPassthroughUpstreamError(
|
|
|
32
52
|
const now = options?.now ?? Date.now();
|
|
33
53
|
const upstreamRetryAfter = options?.headers?.get("retry-after")?.trim() || undefined;
|
|
34
54
|
const originalValid = validateClientRetryAfterHeader(upstreamRetryAfter, now);
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
55
|
+
const cyberPolicyFailure = isCyberPolicyBody(trimmed);
|
|
56
|
+
const resolved = cyberPolicyFailure
|
|
57
|
+
? undefined
|
|
58
|
+
: resolveClientRetryAfter({
|
|
59
|
+
status,
|
|
60
|
+
message: trimmed || `Provider error ${status}: (empty body)`,
|
|
61
|
+
upstreamRetryAfter,
|
|
62
|
+
now,
|
|
63
|
+
});
|
|
41
64
|
|
|
42
65
|
if (trimmed) {
|
|
43
66
|
const needsSet = resolved !== undefined && upstreamRetryAfter !== resolved;
|
|
44
|
-
const needsDelete =
|
|
45
|
-
|
|
46
|
-
|
|
67
|
+
const needsDelete = (cyberPolicyFailure && upstreamRetryAfter !== undefined)
|
|
68
|
+
|| (resolved === undefined
|
|
69
|
+
&& upstreamRetryAfter !== undefined
|
|
70
|
+
&& originalValid === undefined);
|
|
47
71
|
|
|
48
72
|
if (!needsSet && !needsDelete) {
|
|
49
73
|
return new Response(bodyText, {
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { comboFailureDecision } from "../../combos/failover";
|
|
2
|
+
import { readBoundedResponseBody } from "../../lib/bounded-body";
|
|
3
|
+
import { readJsonRequestBody } from "../request-decompress";
|
|
4
|
+
import { finishRequestAttempt, type RequestLogContext } from "../request-log";
|
|
5
|
+
import type { OcxConfig } from "../../types";
|
|
6
|
+
import type { RouteCandidateTrace, RouteDecisionTraceV1 } from "../../routing/trace";
|
|
7
|
+
import { handleResponses as handleResponsesCore } from "./core";
|
|
8
|
+
import { requestPacingOverloadResponse } from "./pacing-overload";
|
|
9
|
+
|
|
10
|
+
type CoreHandler = typeof handleResponsesCore;
|
|
11
|
+
type CoreOptions = Parameters<CoreHandler>[3];
|
|
12
|
+
|
|
13
|
+
export interface PolicyFallbackDeps {
|
|
14
|
+
runCore?: CoreHandler;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function candidateKey(candidate: Pick<RouteCandidateTrace, "provider" | "model">): string {
|
|
18
|
+
return `${candidate.provider}\u0000${candidate.model}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Rank the remaining candidates from the ORIGINAL policy trace. The initial
|
|
23
|
+
* decision stays immutable; fallback execution belongs in attempts[], not in a
|
|
24
|
+
* rewritten decision trace.
|
|
25
|
+
*/
|
|
26
|
+
export function rankPolicyFallbackCandidates(
|
|
27
|
+
trace: RouteDecisionTraceV1,
|
|
28
|
+
tried: ReadonlySet<string>,
|
|
29
|
+
): RouteCandidateTrace[] {
|
|
30
|
+
return trace.candidates
|
|
31
|
+
.map((candidate, index) => ({ candidate, index }))
|
|
32
|
+
.filter(({ candidate }) =>
|
|
33
|
+
candidate.eligible
|
|
34
|
+
&& candidate.exclusions.length === 0
|
|
35
|
+
&& !tried.has(candidateKey(candidate)))
|
|
36
|
+
.sort((left, right) => {
|
|
37
|
+
const scoreDelta = (right.candidate.score?.total ?? Number.NEGATIVE_INFINITY)
|
|
38
|
+
- (left.candidate.score?.total ?? Number.NEGATIVE_INFINITY);
|
|
39
|
+
return scoreDelta || left.index - right.index;
|
|
40
|
+
})
|
|
41
|
+
.map(({ candidate }) => candidate);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function requestWithCandidate(
|
|
45
|
+
req: Request,
|
|
46
|
+
rawBody: Record<string, unknown>,
|
|
47
|
+
candidate: Pick<RouteCandidateTrace, "provider" | "model">,
|
|
48
|
+
): Request {
|
|
49
|
+
const headers = new Headers(req.headers);
|
|
50
|
+
headers.delete("content-encoding");
|
|
51
|
+
headers.delete("content-length");
|
|
52
|
+
headers.set("content-type", "application/json");
|
|
53
|
+
return new Request(req.url, {
|
|
54
|
+
method: req.method,
|
|
55
|
+
headers,
|
|
56
|
+
body: JSON.stringify({ ...rawBody, model: `${candidate.provider}/${candidate.model}` }),
|
|
57
|
+
signal: req.signal,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function errorCodeFromText(text: string): string | undefined {
|
|
62
|
+
if (!text) return undefined;
|
|
63
|
+
try {
|
|
64
|
+
const payload = JSON.parse(text) as { error?: { code?: unknown; type?: unknown }; code?: unknown };
|
|
65
|
+
const candidate = payload.error?.code ?? payload.error?.type ?? payload.code;
|
|
66
|
+
return typeof candidate === "string" ? candidate : undefined;
|
|
67
|
+
} catch {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function shouldHopPolicyCandidate(response: Response, signal?: AbortSignal): Promise<boolean> {
|
|
73
|
+
if (response.status < 400 || signal?.aborted) return false;
|
|
74
|
+
try {
|
|
75
|
+
const inspected = await readBoundedResponseBody(response.clone(), { signal });
|
|
76
|
+
const text = inspected.displaySafe ? inspected.text : "";
|
|
77
|
+
return comboFailureDecision(response.status, text, { code: errorCodeFromText(text) }) === "hop";
|
|
78
|
+
} catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function isPolicyDecision(trace: RouteDecisionTraceV1 | undefined): trace is RouteDecisionTraceV1 {
|
|
84
|
+
return trace?.routeKind === "policy" && !!trace.profile;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Finalize the failed physical attempt so the retry receives a fresh attempt row. */
|
|
88
|
+
function finishFailedPolicyAttempt(logCtx: RequestLogContext, status: number): void {
|
|
89
|
+
const attempt = logCtx.activeAttempt;
|
|
90
|
+
if (attempt) {
|
|
91
|
+
const startedAt = logCtx.activeAttemptStartedAt ?? Date.now();
|
|
92
|
+
finishRequestAttempt(attempt, status, Math.max(0, Date.now() - startedAt), attempt.usage ?? logCtx.usage);
|
|
93
|
+
}
|
|
94
|
+
delete logCtx.activeAttempt;
|
|
95
|
+
delete logCtx.activeAttemptStartedAt;
|
|
96
|
+
delete logCtx.usage;
|
|
97
|
+
delete logCtx.usageFromBridge;
|
|
98
|
+
delete logCtx.upstreamError;
|
|
99
|
+
delete logCtx.terminalHttpStatus;
|
|
100
|
+
delete logCtx.terminalErrorCode;
|
|
101
|
+
delete logCtx.terminalIncompleteReason;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Run a Responses request and, only for an explicitly selected policy profile,
|
|
106
|
+
* hop to the next eligible policy candidate after a retryable pre-success
|
|
107
|
+
* failure. The initial policy trace remains the canonical selection evidence;
|
|
108
|
+
* physical retries continue to accumulate in the existing request attempts.
|
|
109
|
+
*/
|
|
110
|
+
export async function handleResponsesWithPolicyFallback(
|
|
111
|
+
req: Request,
|
|
112
|
+
config: OcxConfig,
|
|
113
|
+
logCtx: RequestLogContext,
|
|
114
|
+
options: CoreOptions = {},
|
|
115
|
+
deps: PolicyFallbackDeps = {},
|
|
116
|
+
): Promise<Response> {
|
|
117
|
+
const runCore = deps.runCore ?? handleResponsesCore;
|
|
118
|
+
let requestBodyReadNotified = false;
|
|
119
|
+
const coreOptions: CoreOptions = options.onRequestBodyRead
|
|
120
|
+
? {
|
|
121
|
+
...options,
|
|
122
|
+
onRequestBodyRead: () => {
|
|
123
|
+
if (requestBodyReadNotified) return;
|
|
124
|
+
requestBodyReadNotified = true;
|
|
125
|
+
options.onRequestBodyRead?.();
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
: options;
|
|
129
|
+
let rawBody: Record<string, unknown> | null = null;
|
|
130
|
+
try {
|
|
131
|
+
const parsed = await readJsonRequestBody(req.clone());
|
|
132
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) rawBody = parsed as Record<string, unknown>;
|
|
133
|
+
} catch {
|
|
134
|
+
// Core owns the client-facing parse/decompression error.
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let response: Response;
|
|
138
|
+
try {
|
|
139
|
+
response = await runCore(req, config, logCtx, coreOptions);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
const overload = requestPacingOverloadResponse(error);
|
|
142
|
+
if (overload) return overload;
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
const initialTrace = logCtx.routeDecision;
|
|
146
|
+
const initialRequestedModel = logCtx.requestedModel;
|
|
147
|
+
if (!rawBody || !isPolicyDecision(initialTrace)) return response;
|
|
148
|
+
|
|
149
|
+
const tried = new Set<string>([
|
|
150
|
+
candidateKey({ provider: initialTrace.selected.provider, model: initialTrace.selected.model }),
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
while (await shouldHopPolicyCandidate(response, req.signal)) {
|
|
154
|
+
if (req.signal.aborted) return response;
|
|
155
|
+
const next = rankPolicyFallbackCandidates(initialTrace, tried)[0];
|
|
156
|
+
if (!next) return response;
|
|
157
|
+
tried.add(candidateKey(next));
|
|
158
|
+
|
|
159
|
+
finishFailedPolicyAttempt(logCtx, response.status);
|
|
160
|
+
const retryRequest = requestWithCandidate(req, rawBody, next);
|
|
161
|
+
try {
|
|
162
|
+
try {
|
|
163
|
+
response = await runCore(retryRequest, config, logCtx, coreOptions);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
const overload = requestPacingOverloadResponse(error);
|
|
166
|
+
if (overload) return overload;
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
} finally {
|
|
170
|
+
logCtx.requestedModel = initialRequestedModel;
|
|
171
|
+
logCtx.routeDecision = initialTrace;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return response;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export const handleResponses = handleResponsesWithPolicyFallback;
|