@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,384 @@
|
|
|
1
|
+
import type { KiroOAuthMetadata } from "../oauth/types";
|
|
2
|
+
import type { OcxTool, OcxToolChoice } from "./tools";
|
|
3
|
+
import type { TierDecision, TierObservationContext } from "./provider";
|
|
4
|
+
|
|
5
|
+
/** Exact provider/credential namespace for process-local reasoning replay. */
|
|
6
|
+
export interface OcxReasoningReplayIdentity {
|
|
7
|
+
providerName: string;
|
|
8
|
+
/** Opaque process-local digest of the exact upstream destination. */
|
|
9
|
+
providerDestinationIdentity: string;
|
|
10
|
+
/**
|
|
11
|
+
* The same destination, digested WITHOUT the process-local random key, so it can key a
|
|
12
|
+
* durable store. Absent when no base URL was resolvable.
|
|
13
|
+
*/
|
|
14
|
+
providerDestinationDurableIdentity?: string;
|
|
15
|
+
adapterName: string;
|
|
16
|
+
modelId: string;
|
|
17
|
+
/** Opaque process-local credential identity; never a raw token or API key. */
|
|
18
|
+
credentialIdentity: string;
|
|
19
|
+
/**
|
|
20
|
+
* Salted-HMAC credential identity that survives restarts, for the durable
|
|
21
|
+
* thought-signature store (#1926). Absent when no durable identity could be
|
|
22
|
+
* derived — the durable store then refuses to key the entry (fail closed).
|
|
23
|
+
*/
|
|
24
|
+
credentialDurableIdentity?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Stable holder shared by parsed-request copies and already-created bridges.
|
|
29
|
+
* Credential/provider rotation replaces `current` atomically without replacing
|
|
30
|
+
* the holder, so late tool-call cache writes see the active physical identity.
|
|
31
|
+
*/
|
|
32
|
+
export interface OcxReasoningReplayScopeRef {
|
|
33
|
+
readonly clientThreadId: string;
|
|
34
|
+
current?: Readonly<OcxReasoningReplayIdentity>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface OcxParsedRequest {
|
|
38
|
+
modelId: string;
|
|
39
|
+
/** Client-facing model selector retained for Anthropic routes after wire-model normalization. */
|
|
40
|
+
_responseModelId?: string;
|
|
41
|
+
/** Selected OpenAI API virtual-model id retained after it rewrites the upstream wire model. */
|
|
42
|
+
_openAiVirtualSelectedModelId?: string;
|
|
43
|
+
previousResponseId?: string;
|
|
44
|
+
context: OcxContext;
|
|
45
|
+
stream: boolean;
|
|
46
|
+
options: OcxRequestOptions;
|
|
47
|
+
_rawBody?: unknown;
|
|
48
|
+
/**
|
|
49
|
+
* Boundary between replayed history and this turn's newly appended input. Usually the
|
|
50
|
+
* items the proxy restored from local previous_response_id state; also set when the
|
|
51
|
+
* CLIENT already carried that history verbatim and the proxy skipped the prepend.
|
|
52
|
+
*/
|
|
53
|
+
_replayPrefixLen?: number;
|
|
54
|
+
/** Parsed-message index before the first conversational item in a continuation's current delta. */
|
|
55
|
+
_continuationConversationMessageIndex?: number;
|
|
56
|
+
/**
|
|
57
|
+
* True when the full history for a previous_response_id request is present in the input —
|
|
58
|
+
* whether the proxy expanded it or the client already sent it. Consumers read this as
|
|
59
|
+
* "this request is self-contained", never as "the proxy mutated it".
|
|
60
|
+
*/
|
|
61
|
+
_previousResponseInputExpanded?: boolean;
|
|
62
|
+
/** Provider-private stable Cursor conversation id resolved from the Responses previous_response_id chain. */
|
|
63
|
+
_cursorConversationId?: string;
|
|
64
|
+
/** Stable upstream client thread identity, used only to derive provider-scoped continuation ids. */
|
|
65
|
+
_clientThreadId?: string;
|
|
66
|
+
/** Provider/account/model-bound namespace for process-local raw-reasoning replay. */
|
|
67
|
+
_reasoningReplayScope?: OcxReasoningReplayScopeRef;
|
|
68
|
+
/**
|
|
69
|
+
* Set by bindRouteReasoningReplayScope after a proven serving-identity change, or by
|
|
70
|
+
* prepareOpaqueBlobRecovery after an authoritative rejection; consumers strip replayed blobs.
|
|
71
|
+
*/
|
|
72
|
+
_stripReasoningEncryptedContent?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Optional authenticated tenant/operator namespace for Cursor thread→conversation derivation.
|
|
75
|
+
* When absent (single-operator local proxy), derivation stays local-scoped.
|
|
76
|
+
*/
|
|
77
|
+
_cursorIdentityScope?: string;
|
|
78
|
+
/**
|
|
79
|
+
* True for helper/shadow/compaction turns that must not append into the main Cursor conversation
|
|
80
|
+
* derived from the parent thread id.
|
|
81
|
+
*/
|
|
82
|
+
_cursorIsolateConversation?: boolean;
|
|
83
|
+
/** Account-scoped, non-secret Kiro request metadata selected with the OAuth access token. */
|
|
84
|
+
_kiroAuthContext?: Pick<KiroOAuthMetadata, "profileArn" | "apiRegion" | "ssoRegion">;
|
|
85
|
+
/** Provider-private continuation metadata resolved from the Responses previous_response_id chain. */
|
|
86
|
+
_providerContinuation?: OcxProviderContinuationState;
|
|
87
|
+
/** Persisted continuation considered only after the final physical route is known. */
|
|
88
|
+
_providerContinuationCandidate?: OcxProviderContinuationState;
|
|
89
|
+
/** Exact process-local route owner attached to newly persisted provider state. */
|
|
90
|
+
_providerContinuationOwner?: OcxProviderContinuationOwner;
|
|
91
|
+
/**
|
|
92
|
+
* The hosted `{type:"web_search", ...}` tool config, stashed when Codex enables web search. Routed
|
|
93
|
+
* (non-OpenAI) providers can't run it server-side, so the proxy re-exposes it as a function tool and
|
|
94
|
+
* executes searches via the gpt-5.4-mini sidecar (see src/web-search). Absent when not requested.
|
|
95
|
+
*/
|
|
96
|
+
_webSearch?: Record<string, unknown>;
|
|
97
|
+
/** Hosted image_generation tool config stashed for the image bridge sidecar (see src/images). */
|
|
98
|
+
_imageGeneration?: { toolNames: Set<string>; originalTool?: Record<string, unknown> };
|
|
99
|
+
/**
|
|
100
|
+
* True when Codex requested structured output (`text.format` = json_schema/json_object). The
|
|
101
|
+
* web-search tool_result is then rendered as compact JSON instead of markdown prose, so its
|
|
102
|
+
* answer/"Sources:" text can't bleed into and corrupt the model's schema-constrained output.
|
|
103
|
+
*/
|
|
104
|
+
_structuredOutput?: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* True when the input carried `{type:"compaction_trigger"}` — Codex remote compaction v2 asking
|
|
107
|
+
* this turn to produce a `{type:"compaction"}` output item. Routed adapters can't natively;
|
|
108
|
+
* the server runs the model as a summarizer and the bridge emits a synthetic compaction item
|
|
109
|
+
* (see src/responses/compaction.ts).
|
|
110
|
+
*/
|
|
111
|
+
_compactionRequest?: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* True when the current request newly introduced a stored compaction summary/marker. Historical
|
|
114
|
+
* markers restored by previous_response_id expansion were already acknowledged and do not reset
|
|
115
|
+
* provider-private continuation caches again on every later turn.
|
|
116
|
+
*/
|
|
117
|
+
_contextCompactionBoundary?: boolean;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface OcxContext {
|
|
121
|
+
systemPrompt?: string[];
|
|
122
|
+
messages: OcxMessage[];
|
|
123
|
+
tools?: OcxTool[];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type OcxMessage =
|
|
127
|
+
| OcxUserMessage
|
|
128
|
+
| OcxAssistantMessage
|
|
129
|
+
| OcxDeveloperMessage
|
|
130
|
+
| OcxToolResultMessage;
|
|
131
|
+
|
|
132
|
+
export interface OcxUserMessage {
|
|
133
|
+
role: "user";
|
|
134
|
+
content: string | OcxContentPart[];
|
|
135
|
+
timestamp: number;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface OcxAssistantMessage {
|
|
139
|
+
role: "assistant";
|
|
140
|
+
content: OcxAssistantContentPart[];
|
|
141
|
+
/** Responses message phase, preserved when replaying translated provider output. */
|
|
142
|
+
phase?: OcxMessagePhase;
|
|
143
|
+
model?: string;
|
|
144
|
+
timestamp: number;
|
|
145
|
+
/**
|
|
146
|
+
* Kiro `reasoningContent.redactedContent` for THIS assistant turn — an opaque encrypted blob
|
|
147
|
+
* Kiro replays to preserve model reasoning across turns. Provider-specific and unrenderable, so
|
|
148
|
+
* it rides the message rather than a content part: any other adapter simply ignores it.
|
|
149
|
+
*/
|
|
150
|
+
kiroRedactedReasoning?: string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface OcxDeveloperMessage {
|
|
154
|
+
role: "developer";
|
|
155
|
+
content: string | OcxContentPart[];
|
|
156
|
+
timestamp: number;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface OcxToolResultMessage {
|
|
160
|
+
role: "toolResult";
|
|
161
|
+
toolCallId: string;
|
|
162
|
+
toolName: string;
|
|
163
|
+
/** MCP namespace from the originating tool call, if any. */
|
|
164
|
+
toolNamespace?: string;
|
|
165
|
+
/** Text, or content parts when a tool (e.g. Codex view_image) returns an image in its output. */
|
|
166
|
+
content: string | OcxContentPart[];
|
|
167
|
+
/** True when the Responses result contained opaque encrypted output Kiro cannot translate. */
|
|
168
|
+
containsEncryptedContent?: boolean;
|
|
169
|
+
isError: boolean;
|
|
170
|
+
timestamp: number;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export interface OcxTextContent {
|
|
174
|
+
type: "text";
|
|
175
|
+
text: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export interface OcxImageContent {
|
|
179
|
+
type: "image";
|
|
180
|
+
/** A `data:` URL (base64) or a remote https URL — passed through from Codex verbatim, NEVER inlined as text. */
|
|
181
|
+
imageUrl: string;
|
|
182
|
+
/** Fidelity hint from Codex: "low" | "high" | "auto". */
|
|
183
|
+
detail?: string;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** A user/developer message content part: text or an image (vision). */
|
|
187
|
+
export type OcxContentPart = OcxTextContent | OcxImageContent;
|
|
188
|
+
|
|
189
|
+
export interface OcxThinkingContent {
|
|
190
|
+
type: "thinking";
|
|
191
|
+
thinking: string;
|
|
192
|
+
signature?: string;
|
|
193
|
+
itemId?: string;
|
|
194
|
+
/** Raw Anthropic redacted_thinking block payloads to replay verbatim (order preserved). */
|
|
195
|
+
redacted?: string[];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface OcxToolCall {
|
|
199
|
+
type: "toolCall";
|
|
200
|
+
id: string;
|
|
201
|
+
name: string;
|
|
202
|
+
arguments: Record<string, unknown>;
|
|
203
|
+
customWireName?: string;
|
|
204
|
+
thoughtSignature?: string;
|
|
205
|
+
/**
|
|
206
|
+
* Provider-issued opaque metadata that must survive the whole round trip unchanged
|
|
207
|
+
* (issue #1735). A signed Gemini part is only valid when its signature comes back on the
|
|
208
|
+
* SAME part it was issued for, so this travels with the individual tool call rather than
|
|
209
|
+
* being matched by name/arguments after the fact.
|
|
210
|
+
*/
|
|
211
|
+
providerMetadata?: OcxProviderOpaqueToolCallMetadata;
|
|
212
|
+
/** MCP namespace (e.g. "mcp__context7") when this call targets a namespaced tool. */
|
|
213
|
+
namespace?: string;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Opaque, provider-scoped tool-call metadata. Values are never parsed, merged, re-encoded, or
|
|
218
|
+
* synthesized — they are carried verbatim or not at all.
|
|
219
|
+
*/
|
|
220
|
+
export interface OcxProviderOpaqueToolCallMetadata {
|
|
221
|
+
google?: {
|
|
222
|
+
thoughtSignature?: string;
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export type OcxAssistantContentPart = OcxTextContent | OcxThinkingContent | OcxToolCall;
|
|
227
|
+
export interface OcxRequestOptions {
|
|
228
|
+
maxOutputTokens?: number;
|
|
229
|
+
temperature?: number;
|
|
230
|
+
topP?: number;
|
|
231
|
+
stopSequences?: string[];
|
|
232
|
+
toolChoice?: OcxToolChoice;
|
|
233
|
+
parallelToolCalls?: boolean;
|
|
234
|
+
reasoning?: string;
|
|
235
|
+
hideThinkingSummary?: boolean;
|
|
236
|
+
serviceTier?: string;
|
|
237
|
+
/** Final outbound tier action, resolved after the provider/model wire is settled. */
|
|
238
|
+
tierDecision?: TierDecision;
|
|
239
|
+
/** Internal B0 observation inputs; adapters combine these with the wire they actually serialize. */
|
|
240
|
+
tierObservation?: TierObservationContext;
|
|
241
|
+
presencePenalty?: number;
|
|
242
|
+
frequencyPenalty?: number;
|
|
243
|
+
/** Responses prompt-cache affinity key. Passthrough preserves it via _rawBody; routed adapters do not consume it unless their upstream wire supports it. */
|
|
244
|
+
promptCacheKey?: string;
|
|
245
|
+
/**
|
|
246
|
+
* Responses `text.format` (json_schema / json_object), preserved for adapters whose
|
|
247
|
+
* upstream wire has an equivalent. The openai-chat adapter re-nests it as chat
|
|
248
|
+
* `response_format`, the exact inverse of responseFormatToText in src/chat/inbound.ts.
|
|
249
|
+
* The native passthrough ignores it (it forwards `_rawBody.text` verbatim) and Kiro
|
|
250
|
+
* keeps rejecting structured output via `_structuredOutput`.
|
|
251
|
+
*/
|
|
252
|
+
textFormat?: {
|
|
253
|
+
type: "json_schema" | "json_object";
|
|
254
|
+
name?: string;
|
|
255
|
+
description?: string;
|
|
256
|
+
schema?: Record<string, unknown>;
|
|
257
|
+
strict?: boolean;
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export type OcxMessagePhase = "commentary" | "final_answer";
|
|
262
|
+
|
|
263
|
+
/** Non-secret, process-local owner fence for provider-private continuation state. */
|
|
264
|
+
export interface OcxProviderContinuationOwner {
|
|
265
|
+
[field: string]: string | number;
|
|
266
|
+
version: 1;
|
|
267
|
+
providerName: string;
|
|
268
|
+
providerDestinationIdentity: string;
|
|
269
|
+
adapterName: string;
|
|
270
|
+
modelId: string;
|
|
271
|
+
credentialIdentity: string;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Provider-private state that must follow a locally expanded `previous_response_id` chain.
|
|
276
|
+
* Kept out of public Responses output and persisted only in the bounded local continuation cache.
|
|
277
|
+
*/
|
|
278
|
+
export interface OcxProviderContinuationState {
|
|
279
|
+
/** Proxy-authored owner metadata; stripped before provider adapters receive the state. */
|
|
280
|
+
__ocxOwner?: OcxProviderContinuationOwner;
|
|
281
|
+
cursor?: {
|
|
282
|
+
[field: string]: unknown;
|
|
283
|
+
conversationId?: string;
|
|
284
|
+
checkpointUsable?: boolean;
|
|
285
|
+
/** Opaque process-local Cursor ConversationStateStructure snapshot ref. Never raw protobuf. */
|
|
286
|
+
checkpointRef?: string;
|
|
287
|
+
};
|
|
288
|
+
kiro?: {
|
|
289
|
+
[field: string]: unknown;
|
|
290
|
+
conversationId?: string;
|
|
291
|
+
};
|
|
292
|
+
[provider: string]: Record<string, unknown> | undefined;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export type AdapterEvent =
|
|
296
|
+
| { type: "heartbeat" }
|
|
297
|
+
| { type: "text_delta"; text: string; phase?: OcxMessagePhase }
|
|
298
|
+
| { type: "thinking_delta"; thinking: string }
|
|
299
|
+
// Anthropic extended-thinking round-trip: signature_delta for the current thinking block, and
|
|
300
|
+
// opaque redacted_thinking blocks. Both must be replayed verbatim or tool-use turns 400.
|
|
301
|
+
| { type: "thinking_signature"; signature: string }
|
|
302
|
+
| { type: "redacted_thinking"; data: string }
|
|
303
|
+
// Kiro reasoning round-trip: the encrypted `redactedContent` blob for the CURRENT assistant turn.
|
|
304
|
+
// Never rendered — it only rides the reasoning item's envelope so the next request can replay it.
|
|
305
|
+
| { type: "kiro_redacted_reasoning"; data: string }
|
|
306
|
+
| { type: "reasoning_raw_delta"; text: string }
|
|
307
|
+
| { type: "tool_call_start"; id: string; name: string; providerMetadata?: OcxProviderOpaqueToolCallMetadata }
|
|
308
|
+
| { type: "tool_call_delta"; arguments: string }
|
|
309
|
+
| { type: "tool_call_end" }
|
|
310
|
+
/** Internal boundary between a guarded first pass and its one-shot continuation. */
|
|
311
|
+
| { type: "assistant_boundary" }
|
|
312
|
+
// Native web-search activity surfaced by the web-search sidecar so Codex renders a "Searched the
|
|
313
|
+
// web" cell. Emitted as a lifecycle PAIR at real wall-clock moments by src/web-search/loop.ts
|
|
314
|
+
// (routed adapters never emit these): `begin` right before the sidecar runs so Codex shows the
|
|
315
|
+
// "Searching the web" spinner, then `end` once it resolves. The bridge maps begin → an
|
|
316
|
+
// output_item.added(in_progress) and end → the matching output_item.done(completed|failed) under
|
|
317
|
+
// the SAME output index, so the activity animates instead of flashing completed instantly.
|
|
318
|
+
| { type: "web_search_call_begin"; id: string }
|
|
319
|
+
| { type: "web_search_call_end"; id: string; queries: string[]; status?: "completed" | "failed"; sources?: OcxUrlCitation[] }
|
|
320
|
+
| {
|
|
321
|
+
type: "done";
|
|
322
|
+
usage?: OcxUsage;
|
|
323
|
+
stopReason?: string;
|
|
324
|
+
endTurn?: boolean;
|
|
325
|
+
providerState?: OcxProviderContinuationState;
|
|
326
|
+
}
|
|
327
|
+
| {
|
|
328
|
+
type: "incomplete";
|
|
329
|
+
reason: string;
|
|
330
|
+
message?: string;
|
|
331
|
+
usage?: OcxUsage;
|
|
332
|
+
retryable?: boolean;
|
|
333
|
+
endTurn?: boolean;
|
|
334
|
+
providerState?: OcxProviderContinuationState;
|
|
335
|
+
}
|
|
336
|
+
// `usage` carries best-effort partial consumption when a turn dies before a clean done
|
|
337
|
+
// (e.g. cursor upstream 502 mid-stream), so failed requests can log real token counts.
|
|
338
|
+
| {
|
|
339
|
+
type: "error";
|
|
340
|
+
message: string;
|
|
341
|
+
usage?: OcxUsage;
|
|
342
|
+
/** Authoritative upstream/proxy status when known; avoids message-based classification. */
|
|
343
|
+
status?: number;
|
|
344
|
+
/** Responses error type and code when the adapter has a structured provider failure. */
|
|
345
|
+
errorType?: string;
|
|
346
|
+
code?: string;
|
|
347
|
+
retryable?: boolean;
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* A web source backing a search answer. Surfaced on the search-end event and rendered by the bridge
|
|
352
|
+
* as a `url_citation` annotation on the following assistant message (the desktop app's Sources chip
|
|
353
|
+
* reads these; the TUI ignores annotations, so this is additive).
|
|
354
|
+
*/
|
|
355
|
+
export interface OcxUrlCitation {
|
|
356
|
+
url: string;
|
|
357
|
+
title?: string;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Canonical usage convention (devlog/260711_claude_inbound/070):
|
|
362
|
+
* - `inputTokens` is the TOTAL prompt size, INCLUDING cache reads and cache writes
|
|
363
|
+
* (OpenAI Responses convention). Anthropic parse sites normalize into this shape.
|
|
364
|
+
* - `cachedInputTokens` is cache READ tokens only (a subset of `inputTokens`).
|
|
365
|
+
* - `cacheReadInputTokens`/`cacheCreationInputTokens` carry the read/write split when
|
|
366
|
+
* the provider reports both; reads mirror `cachedInputTokens`.
|
|
367
|
+
* - `totalTokens` = inputTokens + outputTokens. Never re-add cache detail on top.
|
|
368
|
+
*/
|
|
369
|
+
export interface OcxUsage {
|
|
370
|
+
inputTokens: number;
|
|
371
|
+
outputTokens: number;
|
|
372
|
+
/**
|
|
373
|
+
* Absolute active-context size after the response. Stateful providers can expose this separately
|
|
374
|
+
* from their per-attempt usage. Responses serialization derives the input side from
|
|
375
|
+
* `contextTotalTokens - outputTokens` so output is never added to an absolute checkpoint twice.
|
|
376
|
+
*/
|
|
377
|
+
contextTotalTokens?: number;
|
|
378
|
+
totalTokens?: number;
|
|
379
|
+
cachedInputTokens?: number;
|
|
380
|
+
cacheReadInputTokens?: number;
|
|
381
|
+
cacheCreationInputTokens?: number;
|
|
382
|
+
reasoningOutputTokens?: number;
|
|
383
|
+
estimated?: boolean;
|
|
384
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
export interface OcxTool {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
parameters: Record<string, unknown>;
|
|
5
|
+
strict?: boolean;
|
|
6
|
+
/** MCP namespace (e.g. "mcp__context7") for tools flattened out of a Responses "namespace" tool. */
|
|
7
|
+
namespace?: string;
|
|
8
|
+
/** Freeform/custom tool (e.g. apply_patch): the model's call must be relayed as a custom_tool_call. */
|
|
9
|
+
freeform?: boolean;
|
|
10
|
+
/** Client-executed tool discovery (tool_search): the model's call must be relayed as a tool_search_call. */
|
|
11
|
+
toolSearch?: boolean;
|
|
12
|
+
/** Tool definition restored from a prior tool_search output; transports may prioritize it when catalogs are bounded. */
|
|
13
|
+
loadedFromToolSearch?: boolean;
|
|
14
|
+
/** Cursor-only synthetic exact-match edit tool; never inferred from the wire name. */
|
|
15
|
+
cursorStructuredEdit?: true;
|
|
16
|
+
/** Synthetic web_search tool: the model's call is executed by the gpt-5.4-mini sidecar, not relayed to Codex. */
|
|
17
|
+
webSearch?: boolean;
|
|
18
|
+
/** Synthetic image_gen tool: the model's call is executed by the xAI image bridge sidecar, not relayed to Codex. */
|
|
19
|
+
imageGeneration?: boolean;
|
|
20
|
+
/** Synthetic video_gen tool: executed by the xAI video bridge sidecar. */
|
|
21
|
+
videoGeneration?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Wire name a chat model sees for a tool. Namespaced (MCP) tools are flattened to
|
|
26
|
+
* "<namespace>__<name>" so they survive the chat-completions function-tool format;
|
|
27
|
+
* the proxy maps this back to {namespace, name} on the return trip (Codex routes MCP
|
|
28
|
+
* calls by an explicit `namespace` field, not by parsing the name).
|
|
29
|
+
*/
|
|
30
|
+
export function namespacedToolName(namespace: string | undefined, name: string): string {
|
|
31
|
+
return namespace ? `${namespace}__${name}` : name;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function toolChoiceAliases(tool: Pick<OcxTool, "namespace" | "name">): string[] {
|
|
35
|
+
const wireName = namespacedToolName(tool.namespace, tool.name);
|
|
36
|
+
return tool.namespace ? [wireName, `${tool.namespace}.${tool.name}`] : [wireName];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function sameToolIdentity(
|
|
40
|
+
left: Pick<OcxTool, "namespace" | "name">,
|
|
41
|
+
right: Pick<OcxTool, "namespace" | "name">,
|
|
42
|
+
): boolean {
|
|
43
|
+
return left.namespace === right.namespace && left.name === right.name;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* All tools that could be selected by one client-facing name. Bare logical names are included
|
|
48
|
+
* here because they are a compatibility selector for namespaced tools, while wire and dotted
|
|
49
|
+
* aliases come from `toolChoiceAliases`. A selector with more than one candidate is invalid.
|
|
50
|
+
*/
|
|
51
|
+
export function toolChoiceCandidates(
|
|
52
|
+
tools: readonly Pick<OcxTool, "namespace" | "name">[] | undefined,
|
|
53
|
+
name: string,
|
|
54
|
+
): Pick<OcxTool, "namespace" | "name">[] {
|
|
55
|
+
if (!tools) return [];
|
|
56
|
+
const candidates: Pick<OcxTool, "namespace" | "name">[] = [];
|
|
57
|
+
for (const tool of tools) {
|
|
58
|
+
if (tool.name !== name && !toolChoiceAliases(tool).includes(name)) continue;
|
|
59
|
+
if (!candidates.some(candidate => sameToolIdentity(candidate, tool))) candidates.push(tool);
|
|
60
|
+
}
|
|
61
|
+
return candidates;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Newer Codex clients can select a tool nested in a namespace by its bare name. Resolve that
|
|
66
|
+
* shorthand only when the request contains one tool with the logical name, so an ambiguous name
|
|
67
|
+
* cannot authorize a tool from an unintended namespace.
|
|
68
|
+
*/
|
|
69
|
+
export function toolAllowedByChoice(
|
|
70
|
+
tool: Pick<OcxTool, "namespace" | "name">,
|
|
71
|
+
allowedTools: ReadonlySet<string>,
|
|
72
|
+
tools?: readonly Pick<OcxTool, "namespace" | "name">[],
|
|
73
|
+
): boolean {
|
|
74
|
+
if (!tools) return toolChoiceAliases(tool).some(name => allowedTools.has(name));
|
|
75
|
+
for (const name of [...toolChoiceAliases(tool), tool.name]) {
|
|
76
|
+
if (!allowedTools.has(name)) continue;
|
|
77
|
+
const candidates = toolChoiceCandidates(tools, name);
|
|
78
|
+
if (candidates.length === 1 && sameToolIdentity(candidates[0], tool)) return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function resolveToolChoiceWireName(tools: readonly Pick<OcxTool, "namespace" | "name">[] | undefined, name: string): string {
|
|
84
|
+
const candidates = toolChoiceCandidates(tools, name);
|
|
85
|
+
if (candidates.length === 1) {
|
|
86
|
+
const match = candidates[0];
|
|
87
|
+
return namespacedToolName(match.namespace, match.name);
|
|
88
|
+
}
|
|
89
|
+
// Keep unknown/ambiguous names unchanged for callers that only serialize a selector. The
|
|
90
|
+
// catalog-aware predicate rejects them, and parseRequest rejects ambiguous request selectors.
|
|
91
|
+
return name;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Whether `modelId` is in a per-provider classification list (e.g. `noVisionModels`). Matches the full
|
|
96
|
+
* id, OR — for Ollama-style ids — the family before the ":size" tag, so a `gpt-oss` entry covers
|
|
97
|
+
* `gpt-oss:120b`/`gpt-oss:20b`. Colon-less ids (e.g. `grok-build-0.1`) still match exactly only.
|
|
98
|
+
*/
|
|
99
|
+
export function modelInList(list: string[] | undefined, modelId: string): boolean {
|
|
100
|
+
if (!list || list.length === 0) return false;
|
|
101
|
+
if (list.includes(modelId)) return true;
|
|
102
|
+
const colon = modelId.indexOf(":");
|
|
103
|
+
return colon > 0 && list.includes(modelId.slice(0, colon));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type OcxToolChoice =
|
|
107
|
+
| "auto"
|
|
108
|
+
| "none"
|
|
109
|
+
| "required"
|
|
110
|
+
| { name: string }
|
|
111
|
+
| { allowedTools: string[]; mode: "auto" | "required" };
|
|
112
|
+
|
|
113
|
+
export function isAllowedToolChoice(value: OcxToolChoice | undefined): value is { allowedTools: string[]; mode: "auto" | "required" } {
|
|
114
|
+
return typeof value === "object" && value !== null && "allowedTools" in value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Compile the request's tool-choice policy into a reusable advertisement/restoration predicate. */
|
|
118
|
+
export function toolChoiceToolPredicate(
|
|
119
|
+
choice: OcxToolChoice | undefined,
|
|
120
|
+
tools?: readonly Pick<OcxTool, "namespace" | "name">[],
|
|
121
|
+
): (tool: Pick<OcxTool, "namespace" | "name">) => boolean {
|
|
122
|
+
if (!choice || choice === "auto" || choice === "required") return () => true;
|
|
123
|
+
if (choice === "none") return () => false;
|
|
124
|
+
if (isAllowedToolChoice(choice)) {
|
|
125
|
+
const allowed = new Set(choice.allowedTools);
|
|
126
|
+
return tool => toolAllowedByChoice(tool, allowed, tools);
|
|
127
|
+
}
|
|
128
|
+
if (!tools) return tool => toolChoiceAliases(tool).includes(choice.name);
|
|
129
|
+
const candidates = toolChoiceCandidates(tools, choice.name);
|
|
130
|
+
return tool => candidates.length === 1 && sameToolIdentity(candidates[0], tool);
|
|
131
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accepted values for the per-provider upstream HTTP-version pin (#1668). Shared by the
|
|
3
|
+
* zod load schema, the management write boundary (POST/PATCH), and the fetch runtime, so
|
|
4
|
+
* a value that one boundary accepts can never be rejected by another.
|
|
5
|
+
*/
|
|
6
|
+
export const UPSTREAM_HTTP_VERSION_VALUES = [
|
|
7
|
+
"auto",
|
|
8
|
+
"http1.1",
|
|
9
|
+
"h1",
|
|
10
|
+
"http2",
|
|
11
|
+
"h2",
|
|
12
|
+
] as const;
|
|
13
|
+
|
|
14
|
+
export type UpstreamHttpVersion = (typeof UPSTREAM_HTTP_VERSION_VALUES)[number];
|
|
15
|
+
|
|
16
|
+
export const REASONING_SUMMARY_DELIVERY_VALUES = [
|
|
17
|
+
"sequential",
|
|
18
|
+
"sequential_cutoff",
|
|
19
|
+
"concurrent",
|
|
20
|
+
"concurrent_cutoff",
|
|
21
|
+
] as const;
|
|
22
|
+
|
|
23
|
+
export type ReasoningSummaryDelivery = typeof REASONING_SUMMARY_DELIVERY_VALUES[number];
|
|
24
|
+
|
|
25
|
+
/** Trusted runtime ownership for Codex-account credentials. Never persisted per provider. */
|
|
26
|
+
export type CodexAccountMode = "direct" | "pool";
|
|
27
|
+
|
|
28
|
+
export const OPENAI_PROVIDER_TIER_VERSION = 2 as const;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Wires that a per-model `modelAdapters` override may select.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately narrow: provider-specific adapters (cursor, kiro, google, ...) carry
|
|
34
|
+
* their own credential and base-URL semantics, so exposing them here would widen the
|
|
35
|
+
* auth boundary rather than pick a wire. Widening this set needs a per-adapter
|
|
36
|
+
* credential threat model first (#404).
|
|
37
|
+
*/
|
|
38
|
+
export const MODEL_ADAPTER_OVERRIDE_ALLOWED: ReadonlySet<string> = new Set([
|
|
39
|
+
"openai-chat",
|
|
40
|
+
"openai-responses",
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Providers whose listed model ids must be driven over the Anthropic wire even when
|
|
45
|
+
* the provider's configured adapter says otherwise — the upstream only speaks
|
|
46
|
+
* Anthropic for these models.
|
|
47
|
+
*/
|
|
48
|
+
const ANTHROPIC_WIRE_MODELS: Record<string, ReadonlySet<string>> = {
|
|
49
|
+
"opencode-go": new Set(["minimax-m2.5", "minimax-m2.7", "minimax-m3"]),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
function anthropicWireModelsForProvider(providerName: string): ReadonlySet<string> | undefined {
|
|
53
|
+
return Object.hasOwn(ANTHROPIC_WIRE_MODELS, providerName)
|
|
54
|
+
? ANTHROPIC_WIRE_MODELS[providerName]
|
|
55
|
+
: undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Detached provider-local hard-pin table for pure wire-policy resolution. */
|
|
59
|
+
export function captureWireAdapterHardPins(providerName: string): Readonly<Record<string, string>> {
|
|
60
|
+
const models = anthropicWireModelsForProvider(providerName);
|
|
61
|
+
if (!models) return Object.freeze({});
|
|
62
|
+
return Object.freeze(Object.fromEntries([...models].map(modelId => [modelId, "anthropic"])));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* True when the upstream speaks exactly one wire for this model, so a configured
|
|
67
|
+
* override must not apply.
|
|
68
|
+
*
|
|
69
|
+
* Deliberately independent of the provider's current adapter: the wire resolver runs
|
|
70
|
+
* more than once per request, and a check phrased as "pin differs from the current
|
|
71
|
+
* adapter" would pass on the first pass and then let the override win on the second.
|
|
72
|
+
*/
|
|
73
|
+
export function isWirePinnedModel(providerName: string, modelId: string): boolean {
|
|
74
|
+
return anthropicWireModelsForProvider(providerName)?.has(modelId) ?? false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The wire a pinned model must use, or undefined when the model is not pinned. */
|
|
78
|
+
export function pinnedWireAdapter(providerName: string, modelId: string): string | undefined {
|
|
79
|
+
return isWirePinnedModel(providerName, modelId) ? "anthropic" : undefined;
|
|
80
|
+
}
|