@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,86 @@
|
|
|
1
|
+
import type { OcxProviderConfig } from "../types";
|
|
2
|
+
import {
|
|
3
|
+
getProviderRegistryEntry,
|
|
4
|
+
providerMatchesRegistryTransport,
|
|
5
|
+
type ProviderRegistryEntry,
|
|
6
|
+
} from "./registry";
|
|
7
|
+
|
|
8
|
+
const STATIC_MODEL_CATALOG_PROVIDER_IDS = new Set(["cline-pass", "mimo-free"]);
|
|
9
|
+
|
|
10
|
+
function normalizedEndpoint(value: string): string {
|
|
11
|
+
const trimmed = value.trim();
|
|
12
|
+
try {
|
|
13
|
+
const parsed = new URL(trimmed);
|
|
14
|
+
parsed.pathname = parsed.pathname.replace(/\/+$/, "") || "/";
|
|
15
|
+
return parsed.toString().replace(/\/$/, "");
|
|
16
|
+
} catch {
|
|
17
|
+
return trimmed.replace(/\/+$/, "");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function exactRegistryTransportMatch(
|
|
22
|
+
entry: ProviderRegistryEntry,
|
|
23
|
+
provider: Pick<OcxProviderConfig, "baseUrl" | "adapter"> & Partial<Pick<OcxProviderConfig, "authMode">>,
|
|
24
|
+
options: { allowLegacyMimoLocal?: boolean } = {},
|
|
25
|
+
): boolean {
|
|
26
|
+
if (entry.allowBaseUrlOverride || /\{[^}]*\}/.test(entry.baseUrl)) return false;
|
|
27
|
+
if (typeof provider.baseUrl !== "string" || provider.adapter !== entry.adapter) return false;
|
|
28
|
+
const legacyMimoLocal = options.allowLegacyMimoLocal === true
|
|
29
|
+
&& entry.id === "mimo-free"
|
|
30
|
+
&& provider.authMode === "local";
|
|
31
|
+
if (provider.authMode !== undefined && provider.authMode !== "key" && !legacyMimoLocal) return false;
|
|
32
|
+
return normalizedEndpoint(provider.baseUrl) === normalizedEndpoint(entry.baseUrl);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Registry policy for providers whose maintained model list is authoritative. */
|
|
36
|
+
export function registryEntrySupportsLiveModelDiscovery(entry: ProviderRegistryEntry): boolean {
|
|
37
|
+
return !STATIC_MODEL_CATALOG_PROVIDER_IDS.has(entry.id);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Static-catalog authority is tied to canonical provider identity and exact transport.
|
|
42
|
+
* Renamed/custom rows stay operator-owned: Cline and ClinePass intentionally share a transport,
|
|
43
|
+
* so destination matching alone cannot safely identify a renamed ClinePass configuration.
|
|
44
|
+
*/
|
|
45
|
+
export function staticModelCatalogEntryForProvider(
|
|
46
|
+
name: string,
|
|
47
|
+
provider: OcxProviderConfig,
|
|
48
|
+
): ProviderRegistryEntry | undefined {
|
|
49
|
+
const entry = getProviderRegistryEntry(name);
|
|
50
|
+
if (!entry || !STATIC_MODEL_CATALOG_PROVIDER_IDS.has(entry.id)) return undefined;
|
|
51
|
+
return exactRegistryTransportMatch(entry, provider, { allowLegacyMimoLocal: true })
|
|
52
|
+
? entry
|
|
53
|
+
: undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function providerSupportsLiveModelDiscovery(name: string, provider: OcxProviderConfig): boolean {
|
|
57
|
+
return staticModelCatalogEntryForProvider(name, provider) === undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* MiMo Free predates collision preservation in the registry. Keep same-named custom rows out of
|
|
62
|
+
* registry ownership without broadening the generic transport matcher to other key providers.
|
|
63
|
+
*/
|
|
64
|
+
export function providerMatchesRegistryTransportWithStaticGuards(
|
|
65
|
+
name: string,
|
|
66
|
+
provider: Pick<OcxProviderConfig, "baseUrl" | "adapter"> & Partial<Pick<OcxProviderConfig, "authMode">>,
|
|
67
|
+
): boolean {
|
|
68
|
+
if (name !== "mimo-free") return providerMatchesRegistryTransport(name, provider);
|
|
69
|
+
const entry = getProviderRegistryEntry(name);
|
|
70
|
+
return entry !== undefined
|
|
71
|
+
&& exactRegistryTransportMatch(entry, provider, { allowLegacyMimoLocal: true });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Repair only registry-owned legacy state; operator-owned model lists stay untouched. */
|
|
75
|
+
export function repairStaticModelCatalogProvider(name: string, provider: OcxProviderConfig): void {
|
|
76
|
+
const entry = staticModelCatalogEntryForProvider(name, provider);
|
|
77
|
+
if (!entry) return;
|
|
78
|
+
provider.liveModels = false;
|
|
79
|
+
if (
|
|
80
|
+
name === "mimo-free"
|
|
81
|
+
&& entry.id === "mimo-free"
|
|
82
|
+
&& (provider.authMode === undefined || provider.authMode === "local")
|
|
83
|
+
) {
|
|
84
|
+
provider.authMode = "key";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { OcxProviderConfig } from "../types";
|
|
2
|
+
|
|
3
|
+
export const XAI_RESPONSES_OPT_IN_MODELS = ["grok-4.6", "grok-4.5"] as const;
|
|
4
|
+
|
|
5
|
+
export type XaiResponsesOptInState = boolean | "mixed";
|
|
6
|
+
|
|
7
|
+
/** Derived dashboard/API state for the two modelAdapters entries owned by the xAI opt-in. */
|
|
8
|
+
export function xaiResponsesOptInState(provider: OcxProviderConfig): XaiResponsesOptInState {
|
|
9
|
+
const enabled = XAI_RESPONSES_OPT_IN_MODELS.map(
|
|
10
|
+
model => provider.modelAdapters?.[model] === "openai-responses",
|
|
11
|
+
);
|
|
12
|
+
if (enabled.every(Boolean)) return true;
|
|
13
|
+
if (enabled.some(Boolean)) return "mixed";
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
@@ -53,7 +53,7 @@ function withoutUserOverridden(
|
|
|
53
53
|
|
|
54
54
|
function withGeneratedRequestId(
|
|
55
55
|
init: RequestInit | undefined,
|
|
56
|
-
|
|
56
|
+
pinnedRequestId: string,
|
|
57
57
|
stableHeaders: Readonly<Record<string, string>>,
|
|
58
58
|
): RequestInit {
|
|
59
59
|
const headers = new Headers(init?.headers);
|
|
@@ -63,7 +63,7 @@ function withGeneratedRequestId(
|
|
|
63
63
|
if (!headers.has(XAI_GROK_COMPATIBILITY.headers.requestId)) {
|
|
64
64
|
headers.set(
|
|
65
65
|
XAI_GROK_COMPATIBILITY.headers.requestId,
|
|
66
|
-
|
|
66
|
+
pinnedRequestId,
|
|
67
67
|
);
|
|
68
68
|
}
|
|
69
69
|
return { ...init, headers };
|
|
@@ -83,7 +83,9 @@ export function deriveXaiConvId(promptCacheKey: string): string {
|
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
85
|
* Resolve xAI's runtime transport without mutating persisted config. Conversation/session
|
|
86
|
-
* affinity is stable for this resolved transport; request identity is
|
|
86
|
+
* affinity is stable for this resolved transport; request identity is pinned per resolved
|
|
87
|
+
* transport (= per logical request until key rotation), so same-target replays and transient
|
|
88
|
+
* retries carry the same id while a rotated key gets a fresh one.
|
|
87
89
|
* Agent, deployment, model-override, turn, mode, and user identity headers are intentionally
|
|
88
90
|
* omitted because opencodex has no truthful values for the official fields.
|
|
89
91
|
*/
|
|
@@ -128,9 +130,14 @@ export function resolveProviderTransport(
|
|
|
128
130
|
provider.headers,
|
|
129
131
|
XAI_GROK_COMPATIBILITY.headers.requestId,
|
|
130
132
|
);
|
|
133
|
+
// Pin the request id per resolved transport (= per logical request until key rotation):
|
|
134
|
+
// same-target 429 replays must carry the SAME x-grok-req-id as the original dispatch, and
|
|
135
|
+
// transient retries reuse one id so the upstream can dedupe them. A rotated key resolves a
|
|
136
|
+
// fresh transport, which gets its own id.
|
|
137
|
+
const requestId = configuredRequestId ?? randomUUID();
|
|
131
138
|
const baseFetch = provider.fetch ?? globalThis.fetch;
|
|
132
139
|
const attemptFetch = ((input, init) =>
|
|
133
|
-
baseFetch(input, withGeneratedRequestId(init,
|
|
140
|
+
baseFetch(input, withGeneratedRequestId(init, requestId, stableHeaders))) as typeof globalThis.fetch;
|
|
134
141
|
|
|
135
142
|
return {
|
|
136
143
|
...provider,
|
package/src/reasoning-effort.ts
CHANGED
|
@@ -19,6 +19,52 @@ export function isCodexReasoningEffort(effort: string): boolean {
|
|
|
19
19
|
return CODEX_REASONING_SET.has(effort);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* True for ladder members plus the `none`/`minimal` sentinels. Both are valid declared
|
|
24
|
+
* efforts (OpenAI accepts `minimal`; Codex validates `none` against
|
|
25
|
+
* `supported_reasoning_levels` for no-reasoning subagent spawns, #883/#962) but are NOT
|
|
26
|
+
* part of the low..ultra ladder: they never appear in default ladders, ranks, or clamps
|
|
27
|
+
* (`minimal` is mapped to `low` on the wire by requestToCodexEffort).
|
|
28
|
+
*/
|
|
29
|
+
export function isDeclaredReasoningEffort(effort: string): boolean {
|
|
30
|
+
return effort === "none" || effort === "minimal" || CODEX_REASONING_SET.has(effort);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Reorder any declared subset (low..ultra, plus the optional `none`/`minimal` sentinels
|
|
35
|
+
* first, in that order) into canonical order and drop duplicates. Catalog
|
|
36
|
+
* `supported_reasoning_levels` follow the input order and the fallback default picks the
|
|
37
|
+
* first entry, so a caller-chosen order would otherwise leak into the catalog.
|
|
38
|
+
*/
|
|
39
|
+
export function canonicalizeReasoningEfforts(values: readonly string[]): string[] {
|
|
40
|
+
const seen = new Set(values);
|
|
41
|
+
const ordered = CODEX_REASONING_ORDER.filter(effort => seen.has(effort));
|
|
42
|
+
const sentinels = ["none", "minimal"].filter(effort => seen.has(effort));
|
|
43
|
+
return [...sentinels, ...ordered];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Reasoning ladder accepted for the OpenAI vision sidecar. `ultra` is deliberately excluded:
|
|
48
|
+
* the vision describer is a single helper call, and `ultra` would be collapsed to `max` by the
|
|
49
|
+
* upstream client boundary anyway.
|
|
50
|
+
*/
|
|
51
|
+
export const VISION_REASONING_EFFORTS = ["low", "medium", "high", "xhigh", "max"] as const;
|
|
52
|
+
export type VisionReasoningEffort = typeof VISION_REASONING_EFFORTS[number];
|
|
53
|
+
|
|
54
|
+
/** True when `effort` is one of the vision sidecar's supported Responses reasoning levels. */
|
|
55
|
+
export function isVisionReasoningEffort(effort: unknown): effort is VisionReasoningEffort {
|
|
56
|
+
return typeof effort === "string" && (VISION_REASONING_EFFORTS as readonly string[]).includes(effort);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Normalize a persisted/configured vision reasoning value. Invalid values (hand-edited config,
|
|
61
|
+
* stale files) degrade to `undefined` so the caller falls back to the documented default instead
|
|
62
|
+
* of forwarding an upstream-rejected effort.
|
|
63
|
+
*/
|
|
64
|
+
export function sanitizeVisionReasoning(effort: unknown): VisionReasoningEffort | undefined {
|
|
65
|
+
return isVisionReasoningEffort(effort) ? effort : undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
22
68
|
/** Position of `effort` in the Codex ladder (low=0 .. ultra=5), or -1 when not a ladder member. */
|
|
23
69
|
export function codexEffortRank(effort: string): number {
|
|
24
70
|
return CODEX_REASONING_ORDER.indexOf(effort);
|
|
@@ -44,7 +90,9 @@ export function sanitizeCodexReasoningEfforts(efforts: readonly string[] | undef
|
|
|
44
90
|
const seen = new Set<string>();
|
|
45
91
|
const out: string[] = [];
|
|
46
92
|
for (const effort of efforts) {
|
|
47
|
-
|
|
93
|
+
// `none`/`minimal` are valid declared sentinels, kept and sorted first (rank -1); they
|
|
94
|
+
// never appear in the default ladder.
|
|
95
|
+
if ((effort !== "none" && effort !== "minimal" && !CODEX_REASONING_SET.has(effort)) || seen.has(effort)) continue;
|
|
48
96
|
seen.add(effort);
|
|
49
97
|
out.push(effort);
|
|
50
98
|
}
|
|
@@ -33,6 +33,24 @@ export const SUMMARY_PREFIX = "Another language model started to solve this prob
|
|
|
33
33
|
|
|
34
34
|
export const OPAQUE_COMPACTION_NOTE = "[earlier conversation was compacted; the summary is stored in a format this model cannot read]";
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Item types in the compact wire family. Each carries an `encrypted_content` blob the client
|
|
38
|
+
* replays verbatim on every later turn, and the minting backend verifies it is unmodified.
|
|
39
|
+
*
|
|
40
|
+
* Keep this the only enumeration: a copy that listed just `compaction` let the response-side
|
|
41
|
+
* field backfill synthesize ids into the other two, which the client then replayed as "modified
|
|
42
|
+
* from the compact response".
|
|
43
|
+
*/
|
|
44
|
+
const COMPACTION_ITEM_TYPES: ReadonlySet<string> = new Set([
|
|
45
|
+
"compaction",
|
|
46
|
+
"compaction_summary",
|
|
47
|
+
"context_compaction",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
export function isCompactionItemType(type: unknown): boolean {
|
|
51
|
+
return typeof type === "string" && COMPACTION_ITEM_TYPES.has(type);
|
|
52
|
+
}
|
|
53
|
+
|
|
36
54
|
export function encodeCompactionSummary(summary: string): string {
|
|
37
55
|
return OCX_COMPACTION_PREFIX + Buffer.from(summary, "utf-8").toString("base64");
|
|
38
56
|
}
|
|
@@ -105,7 +123,14 @@ export function buildCompactV1Output(userMessages: string[], summary: string): R
|
|
|
105
123
|
remaining -= msg.length;
|
|
106
124
|
} else {
|
|
107
125
|
// Budget partially covers this older message: keep its tail (most recent context) and stop.
|
|
108
|
-
|
|
126
|
+
let tailStart = msg.length - remaining;
|
|
127
|
+
// Never start the retained tail on a lone LOW surrogate: the pair's
|
|
128
|
+
// other half would be lost and encoding substitutes U+FFFD.
|
|
129
|
+
if (tailStart > 0 && tailStart < msg.length) {
|
|
130
|
+
const first = msg.charCodeAt(tailStart);
|
|
131
|
+
if (first >= 0xdc00 && first <= 0xdfff) tailStart += 1;
|
|
132
|
+
}
|
|
133
|
+
selected.push(msg.slice(tailStart));
|
|
109
134
|
break;
|
|
110
135
|
}
|
|
111
136
|
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { namespacedToolName } from "../types";
|
|
2
|
+
import { collectResponsesToolGroups } from "./tool-groups";
|
|
3
|
+
|
|
4
|
+
const ROUTED_CUSTOM_TOOL_PASSTHROUGH = new Set(["apply_patch"]);
|
|
5
|
+
const BUILTIN_FUNCTIONS_NAMESPACE = "functions";
|
|
6
|
+
|
|
7
|
+
function routedCustomToolPassesThrough(
|
|
8
|
+
name: string,
|
|
9
|
+
supportsResponsesCustomTools: boolean | undefined,
|
|
10
|
+
): boolean {
|
|
11
|
+
return supportsResponsesCustomTools !== false && ROUTED_CUSTOM_TOOL_PASSTHROUGH.has(name);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
15
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function customToolInput(argumentsText: unknown): string {
|
|
19
|
+
if (typeof argumentsText !== "string") return "";
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(argumentsText) as unknown;
|
|
22
|
+
if (isPlainObject(parsed) && typeof parsed.input === "string") return parsed.input;
|
|
23
|
+
} catch { /* malformed arguments stay visible to the client */ }
|
|
24
|
+
return argumentsText;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function customToolWireName(namespace: string | undefined, name: string): string {
|
|
28
|
+
return namespace === BUILTIN_FUNCTIONS_NAMESPACE ? name : namespacedToolName(namespace, name);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Final upstream identity of a call, including a namespace restored by an earlier rewrite. */
|
|
32
|
+
export function routedCustomToolWireName(value: unknown): string | undefined {
|
|
33
|
+
if (!isPlainObject(value) || typeof value.name !== "string") return undefined;
|
|
34
|
+
return customToolWireName(
|
|
35
|
+
typeof value.namespace === "string" ? value.namespace : undefined,
|
|
36
|
+
value.name,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Names of converted custom declarations after namespace lowering. Restoration uses these exact
|
|
42
|
+
* wire identities so same-named function and custom children in different namespaces stay distinct.
|
|
43
|
+
*/
|
|
44
|
+
function collectRoutedCustomToolWireNames(
|
|
45
|
+
body: unknown,
|
|
46
|
+
supportsResponsesCustomTools?: boolean,
|
|
47
|
+
): Set<string> {
|
|
48
|
+
const names = new Set<string>();
|
|
49
|
+
const groups = collectResponsesToolGroups(body);
|
|
50
|
+
const bareWireNames = new Set<string>();
|
|
51
|
+
for (const group of groups) {
|
|
52
|
+
for (const tool of group) {
|
|
53
|
+
if (
|
|
54
|
+
isPlainObject(tool)
|
|
55
|
+
&& tool.type !== "namespace"
|
|
56
|
+
&& typeof tool.name === "string"
|
|
57
|
+
) bareWireNames.add(tool.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
for (const group of groups) {
|
|
62
|
+
for (const tool of group) {
|
|
63
|
+
if (!isPlainObject(tool)) continue;
|
|
64
|
+
if (
|
|
65
|
+
tool.type === "custom"
|
|
66
|
+
&& typeof tool.name === "string"
|
|
67
|
+
&& !routedCustomToolPassesThrough(tool.name, supportsResponsesCustomTools)
|
|
68
|
+
) {
|
|
69
|
+
names.add(tool.name);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (tool.type !== "namespace" || typeof tool.name !== "string" || !Array.isArray(tool.tools)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
for (const child of tool.tools) {
|
|
76
|
+
if (
|
|
77
|
+
isPlainObject(child)
|
|
78
|
+
&& child.type === "custom"
|
|
79
|
+
&& typeof child.name === "string"
|
|
80
|
+
&& !routedCustomToolPassesThrough(child.name, supportsResponsesCustomTools)
|
|
81
|
+
&& !(tool.name === BUILTIN_FUNCTIONS_NAMESPACE && bareWireNames.has(child.name))
|
|
82
|
+
) names.add(customToolWireName(tool.name, child.name));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return names;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function customToolItemId(id: unknown): unknown {
|
|
90
|
+
if (typeof id !== "string") return id;
|
|
91
|
+
return id.startsWith("fc_") ? `ctc_${id.slice(3)}` : id;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function collectRoutedCustomToolNames(
|
|
95
|
+
body: unknown,
|
|
96
|
+
supportsResponsesCustomTools?: boolean,
|
|
97
|
+
): Set<string> {
|
|
98
|
+
const names = new Set<string>();
|
|
99
|
+
const visit = (value: unknown): void => {
|
|
100
|
+
if (Array.isArray(value)) {
|
|
101
|
+
for (const entry of value) visit(entry);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!isPlainObject(value)) return;
|
|
105
|
+
if (
|
|
106
|
+
value.type === "custom"
|
|
107
|
+
&& typeof value.name === "string"
|
|
108
|
+
&& !routedCustomToolPassesThrough(value.name, supportsResponsesCustomTools)
|
|
109
|
+
) {
|
|
110
|
+
names.add(value.name);
|
|
111
|
+
}
|
|
112
|
+
for (const entry of Object.values(value)) visit(entry);
|
|
113
|
+
};
|
|
114
|
+
visit(body);
|
|
115
|
+
return names;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function collectConvertedCallIds(value: unknown, names: ReadonlySet<string>, out: Set<string>): void {
|
|
119
|
+
if (Array.isArray(value)) {
|
|
120
|
+
for (const entry of value) collectConvertedCallIds(entry, names, out);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!isPlainObject(value)) return;
|
|
124
|
+
if (
|
|
125
|
+
(value.type === "custom_tool_call" || value.type === "function_call")
|
|
126
|
+
&& typeof value.name === "string"
|
|
127
|
+
&& names.has(value.name)
|
|
128
|
+
&& typeof value.call_id === "string"
|
|
129
|
+
) {
|
|
130
|
+
out.add(value.call_id);
|
|
131
|
+
}
|
|
132
|
+
for (const entry of Object.values(value)) collectConvertedCallIds(entry, names, out);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function rewriteForUpstream(
|
|
136
|
+
value: unknown,
|
|
137
|
+
names: ReadonlySet<string>,
|
|
138
|
+
callIds: ReadonlySet<string>,
|
|
139
|
+
): unknown {
|
|
140
|
+
if (Array.isArray(value)) return value.map(entry => rewriteForUpstream(entry, names, callIds));
|
|
141
|
+
if (!isPlainObject(value)) return value;
|
|
142
|
+
|
|
143
|
+
if (value.type === "custom" && typeof value.name === "string" && names.has(value.name)) {
|
|
144
|
+
const { format: _format, ...rest } = value;
|
|
145
|
+
const isDefinition = typeof value.description === "string"
|
|
146
|
+
|| isPlainObject(value.format)
|
|
147
|
+
|| isPlainObject(value.parameters);
|
|
148
|
+
if (!isDefinition) return { ...rest, type: "function" };
|
|
149
|
+
const inputDescription = value.name === "exec"
|
|
150
|
+
? "JavaScript source for unified exec. Use await tools.exec_command(...) for shell commands and text(...) to return textual output; do not provide a bare shell command."
|
|
151
|
+
: "Raw input for this client-executed custom tool.";
|
|
152
|
+
return {
|
|
153
|
+
...rest,
|
|
154
|
+
type: "function",
|
|
155
|
+
parameters: {
|
|
156
|
+
type: "object",
|
|
157
|
+
properties: {
|
|
158
|
+
input: {
|
|
159
|
+
type: "string",
|
|
160
|
+
description: inputDescription,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
required: ["input"],
|
|
164
|
+
additionalProperties: false,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (
|
|
170
|
+
value.type === "custom_tool_call"
|
|
171
|
+
&& typeof value.name === "string"
|
|
172
|
+
&& names.has(value.name)
|
|
173
|
+
) {
|
|
174
|
+
const { input, id: _id, ...rest } = value;
|
|
175
|
+
return {
|
|
176
|
+
...rest,
|
|
177
|
+
type: "function_call",
|
|
178
|
+
arguments: JSON.stringify({ input: typeof input === "string" ? input : "" }),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (
|
|
183
|
+
value.type === "custom_tool_call_output"
|
|
184
|
+
&& typeof value.call_id === "string"
|
|
185
|
+
&& callIds.has(value.call_id)
|
|
186
|
+
) {
|
|
187
|
+
return { ...value, type: "function_call_output" };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
let changed = false;
|
|
191
|
+
const next: Record<string, unknown> = {};
|
|
192
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
193
|
+
const rewritten = rewriteForUpstream(entry, names, callIds);
|
|
194
|
+
next[key] = rewritten;
|
|
195
|
+
changed ||= rewritten !== entry;
|
|
196
|
+
}
|
|
197
|
+
return changed ? next : value;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function rewriteRoutedCustomToolsForUpstream(
|
|
201
|
+
body: unknown,
|
|
202
|
+
supportsResponsesCustomTools?: boolean,
|
|
203
|
+
): {
|
|
204
|
+
body: unknown;
|
|
205
|
+
names: Set<string>;
|
|
206
|
+
} {
|
|
207
|
+
const conversionNames = collectRoutedCustomToolNames(body, supportsResponsesCustomTools);
|
|
208
|
+
const names = collectRoutedCustomToolWireNames(body, supportsResponsesCustomTools);
|
|
209
|
+
if (conversionNames.size === 0) return { body, names };
|
|
210
|
+
const callIds = new Set<string>();
|
|
211
|
+
collectConvertedCallIds(body, conversionNames, callIds);
|
|
212
|
+
return { body: rewriteForUpstream(body, conversionNames, callIds), names };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function restoreRoutedCustomCalls(
|
|
216
|
+
value: unknown,
|
|
217
|
+
names: ReadonlySet<string>,
|
|
218
|
+
): { value: unknown; changed: boolean } {
|
|
219
|
+
if (Array.isArray(value)) {
|
|
220
|
+
let changed = false;
|
|
221
|
+
const restored = value.map(entry => {
|
|
222
|
+
const result = restoreRoutedCustomCalls(entry, names);
|
|
223
|
+
changed ||= result.changed;
|
|
224
|
+
return result.value;
|
|
225
|
+
});
|
|
226
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
227
|
+
}
|
|
228
|
+
if (!isPlainObject(value)) return { value, changed: false };
|
|
229
|
+
|
|
230
|
+
let changed = false;
|
|
231
|
+
const restored: Record<string, unknown> = {};
|
|
232
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
233
|
+
const result = restoreRoutedCustomCalls(entry, names);
|
|
234
|
+
restored[key] = result.value;
|
|
235
|
+
changed ||= result.changed;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const wireName = routedCustomToolWireName(value);
|
|
239
|
+
if (value.type === "function_call" && wireName !== undefined && names.has(wireName)) {
|
|
240
|
+
restored.type = "custom_tool_call";
|
|
241
|
+
restored.id = customToolItemId(value.id);
|
|
242
|
+
restored.input = customToolInput(value.arguments);
|
|
243
|
+
delete restored.arguments;
|
|
244
|
+
changed = true;
|
|
245
|
+
}
|
|
246
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function restoreRoutedCustomCallsInJson(
|
|
250
|
+
text: string,
|
|
251
|
+
names: ReadonlySet<string>,
|
|
252
|
+
): string {
|
|
253
|
+
if (names.size === 0) return text;
|
|
254
|
+
let payload: unknown;
|
|
255
|
+
try {
|
|
256
|
+
payload = JSON.parse(text);
|
|
257
|
+
} catch {
|
|
258
|
+
return text;
|
|
259
|
+
}
|
|
260
|
+
const restored = restoreRoutedCustomCalls(payload, names);
|
|
261
|
+
return restored.changed ? JSON.stringify(restored.value) : text;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function unwrapRoutedCustomToolArguments(argumentsText: unknown): string {
|
|
265
|
+
return customToolInput(argumentsText);
|
|
266
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Hosted tools rejected by specific native model slugs. */
|
|
2
|
+
const UNSUPPORTED_HOSTED_TOOLS: ReadonlyArray<{ match: (model: string) => boolean; tools: ReadonlySet<string> }> = [
|
|
3
|
+
{ match: model => model.includes("codex-spark"), tools: new Set(["image_generation", "tool_search"]) },
|
|
4
|
+
];
|
|
5
|
+
|
|
6
|
+
/** True when forwarding this hosted tool to the model would be rejected upstream. */
|
|
7
|
+
export function isHostedToolUnsupportedForModel(modelId: string, tool: string): boolean {
|
|
8
|
+
return UNSUPPORTED_HOSTED_TOOLS.some(entry => entry.match(modelId) && entry.tools.has(tool));
|
|
9
|
+
}
|