@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reversible single-line codec for Cursor composite tool-call ids.
|
|
3
|
+
*
|
|
4
|
+
* Cursor's wire delivers tool-call ids that can be two identifiers glued with a
|
|
5
|
+
* literal newline ("call-<uuid>-<n>\nfc_<uuid>_<n>"). OpenCodex forwards ids
|
|
6
|
+
* verbatim, so that newline leaked into Responses-visible `call_id` values,
|
|
7
|
+
* where line-oriented clients (logging, splitting, validation) break. The codec
|
|
8
|
+
* encodes only ids containing CR/LF into a versioned single-line form and
|
|
9
|
+
* decodes both that form and legacy raw multi-line ids back to the exact
|
|
10
|
+
* upstream bytes before anything is serialized toward Cursor.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const CALL_ID_PREFIX = "ocxc1_";
|
|
14
|
+
|
|
15
|
+
/** True when the id needs encoding to survive line-oriented consumers. */
|
|
16
|
+
function needsEncoding(id: string): boolean {
|
|
17
|
+
return id.includes("\n") || id.includes("\r");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Encode a Cursor wire call id into a single-line Responses-safe id. */
|
|
21
|
+
export function encodeCursorCallId(id: string): string {
|
|
22
|
+
if (!needsEncoding(id)) return id;
|
|
23
|
+
return CALL_ID_PREFIX + Buffer.from(id, "utf8").toString("base64url");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Decode a Responses-visible call id back to the exact Cursor wire id.
|
|
28
|
+
* Non-encoded ids (including legacy raw multi-line ids replayed by older
|
|
29
|
+
* clients) pass through unchanged; a malformed encoded payload also passes
|
|
30
|
+
* through rather than corrupting pairing.
|
|
31
|
+
*/
|
|
32
|
+
export function decodeCursorCallId(id: string): string {
|
|
33
|
+
if (!id.startsWith(CALL_ID_PREFIX)) return id;
|
|
34
|
+
const payload = id.slice(CALL_ID_PREFIX.length);
|
|
35
|
+
if (payload.length === 0) return id;
|
|
36
|
+
try {
|
|
37
|
+
const decoded = Buffer.from(payload, "base64url").toString("utf8");
|
|
38
|
+
// Round-trip guard: only trust payloads our encoder could have produced.
|
|
39
|
+
if (Buffer.from(decoded, "utf8").toString("base64url") !== payload) return id;
|
|
40
|
+
return decoded;
|
|
41
|
+
} catch {
|
|
42
|
+
return id;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor umbrella catalog — the single source of truth for cursor model
|
|
3
|
+
* identities (devlog 260828_cursor_umbrella_catalog).
|
|
4
|
+
*
|
|
5
|
+
* Design (003_design.md, audited): one capability record per BASE model.
|
|
6
|
+
* Thinking / fast / thinking-fast are DIMENSIONS of the base, each with its
|
|
7
|
+
* own effort ladder and wire order, because the live wire really does differ
|
|
8
|
+
* per variant (claude-opus-5-fast stops at high while its thinking-fast runs
|
|
9
|
+
* to max). The umbrella picker row defaults to the thinking variant when one
|
|
10
|
+
* exists; every legacy variant id keeps resolving through the alias grammar.
|
|
11
|
+
*
|
|
12
|
+
* Max Mode is evidence-gated and separate from context-window size: prior
|
|
13
|
+
* live probes (devlog 260822_senpi_cursor_transfer/210+310) found maxMode
|
|
14
|
+
* only on specific variants, so `maxModeVerified` marks bases with proven
|
|
15
|
+
* support (kimi-k3, user-verified) and live `maxModeModels` extends it.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export type CursorVariantKind = "regular" | "thinking" | "fast" | "thinkingFast";
|
|
19
|
+
|
|
20
|
+
export type CursorThinkingOrder = "thinking-then-effort" | "effort-then-thinking" | "bare";
|
|
21
|
+
|
|
22
|
+
export interface CursorVariantSpec {
|
|
23
|
+
/** Ascending canonical effort rungs the wire lists for this variant; empty = bare id. */
|
|
24
|
+
readonly levels: readonly string[];
|
|
25
|
+
/** Where the thinking marker sits relative to the effort rung (thinking variants only). */
|
|
26
|
+
readonly order?: CursorThinkingOrder;
|
|
27
|
+
/** Variant-specific quarantine (base-wide quarantine would erase healthy siblings). */
|
|
28
|
+
readonly quarantined?: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CursorCapability {
|
|
32
|
+
readonly variants: Partial<Record<CursorVariantKind, CursorVariantSpec>>;
|
|
33
|
+
/** Which variant the umbrella picker row selects (thinking merges into the base). */
|
|
34
|
+
readonly defaultVariant: CursorVariantKind;
|
|
35
|
+
/** Context-window metadata (display/routing only — never implies maxMode). */
|
|
36
|
+
readonly window: number;
|
|
37
|
+
/** Max Mode proven on the wire for this base (static evidence; live maxModeModels unions in). */
|
|
38
|
+
readonly maxModeVerified?: boolean;
|
|
39
|
+
/** Wire prefix required by AgentService/Run for the regular variant (grok families). */
|
|
40
|
+
readonly wirePrefix?: "cursor-";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const K = 1_000;
|
|
44
|
+
const CONTEXT_200K = 200 * K;
|
|
45
|
+
const CONTEXT_256K = 256 * K;
|
|
46
|
+
const CONTEXT_272K = 272 * K;
|
|
47
|
+
const CONTEXT_500K = 500 * K;
|
|
48
|
+
const CONTEXT_1M = 1_000 * K;
|
|
49
|
+
|
|
50
|
+
const FULL = ["low", "medium", "high", "xhigh", "max"] as const;
|
|
51
|
+
const T = "thinking-then-effort" as const;
|
|
52
|
+
const E = "effort-then-thinking" as const;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* One entry per base model. Ladders mirror the live GetUsableModels roster the
|
|
56
|
+
* retired effort-map recorded (260813-260825 captures); windows follow the
|
|
57
|
+
* per-family table verified against senpi's AvailableModels capture
|
|
58
|
+
* (001_reference_analysis.md).
|
|
59
|
+
*/
|
|
60
|
+
export const CURSOR_CAPABILITIES: Record<string, CursorCapability> = {
|
|
61
|
+
"claude-4.5-opus": {
|
|
62
|
+
window: CONTEXT_200K,
|
|
63
|
+
defaultVariant: "thinking",
|
|
64
|
+
variants: {
|
|
65
|
+
regular: { levels: ["high"] },
|
|
66
|
+
thinking: { levels: ["high"], order: E },
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
"claude-4.6-opus": {
|
|
70
|
+
window: CONTEXT_1M,
|
|
71
|
+
defaultVariant: "thinking",
|
|
72
|
+
variants: {
|
|
73
|
+
regular: { levels: ["high", "max"] },
|
|
74
|
+
thinking: { levels: ["high", "max"], order: E },
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
"claude-4.6-sonnet": {
|
|
78
|
+
window: CONTEXT_1M,
|
|
79
|
+
defaultVariant: "thinking",
|
|
80
|
+
variants: {
|
|
81
|
+
regular: { levels: ["medium"] },
|
|
82
|
+
thinking: { levels: ["medium"], order: E },
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
"claude-4.5-sonnet": {
|
|
86
|
+
window: CONTEXT_200K,
|
|
87
|
+
defaultVariant: "thinking",
|
|
88
|
+
variants: {
|
|
89
|
+
regular: { levels: [] },
|
|
90
|
+
thinking: { levels: [], order: "bare" },
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
"claude-4-sonnet": {
|
|
94
|
+
window: CONTEXT_200K,
|
|
95
|
+
defaultVariant: "thinking",
|
|
96
|
+
variants: {
|
|
97
|
+
regular: { levels: [] },
|
|
98
|
+
thinking: { levels: [], order: "bare" },
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
"claude-fable-5": {
|
|
102
|
+
window: CONTEXT_1M,
|
|
103
|
+
defaultVariant: "thinking",
|
|
104
|
+
variants: {
|
|
105
|
+
regular: { levels: FULL },
|
|
106
|
+
thinking: { levels: FULL, order: T },
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
"claude-sonnet-5": {
|
|
110
|
+
window: CONTEXT_1M,
|
|
111
|
+
defaultVariant: "thinking",
|
|
112
|
+
variants: {
|
|
113
|
+
regular: { levels: FULL },
|
|
114
|
+
thinking: { levels: FULL, order: T },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
"claude-opus-4-7": {
|
|
118
|
+
window: CONTEXT_1M,
|
|
119
|
+
defaultVariant: "thinking",
|
|
120
|
+
variants: {
|
|
121
|
+
regular: { levels: FULL },
|
|
122
|
+
thinking: { levels: FULL, order: T },
|
|
123
|
+
fast: { levels: FULL },
|
|
124
|
+
thinkingFast: { levels: FULL, order: T },
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
"claude-opus-4-8": {
|
|
128
|
+
window: CONTEXT_1M,
|
|
129
|
+
defaultVariant: "thinking",
|
|
130
|
+
variants: {
|
|
131
|
+
regular: { levels: FULL },
|
|
132
|
+
thinking: { levels: FULL, order: T },
|
|
133
|
+
fast: { levels: FULL },
|
|
134
|
+
thinkingFast: { levels: FULL, order: T },
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
"claude-opus-5": {
|
|
138
|
+
window: CONTEXT_1M,
|
|
139
|
+
defaultVariant: "thinking",
|
|
140
|
+
variants: {
|
|
141
|
+
// Regular stays quarantined (devlog 260826: dead-model quarantine) while
|
|
142
|
+
// the thinking/fast siblings remain live — quarantine is per-variant.
|
|
143
|
+
regular: { levels: FULL, quarantined: true },
|
|
144
|
+
thinking: { levels: FULL, order: T },
|
|
145
|
+
fast: { levels: ["low", "medium", "high"] },
|
|
146
|
+
thinkingFast: { levels: FULL, order: T },
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
"glm-5.2": {
|
|
150
|
+
window: CONTEXT_1M,
|
|
151
|
+
defaultVariant: "regular",
|
|
152
|
+
variants: { regular: { levels: ["high", "max"] } },
|
|
153
|
+
},
|
|
154
|
+
"glm-5.3": {
|
|
155
|
+
window: CONTEXT_1M,
|
|
156
|
+
defaultVariant: "regular",
|
|
157
|
+
variants: { regular: { levels: ["low", "high", "max"] } },
|
|
158
|
+
},
|
|
159
|
+
"gemini-3.6-flash": {
|
|
160
|
+
window: CONTEXT_1M,
|
|
161
|
+
defaultVariant: "regular",
|
|
162
|
+
variants: { regular: { levels: ["minimal", "low", "medium", "high"] } },
|
|
163
|
+
},
|
|
164
|
+
"gemini-3.7-flash": {
|
|
165
|
+
window: CONTEXT_1M,
|
|
166
|
+
defaultVariant: "regular",
|
|
167
|
+
variants: { regular: { levels: ["low", "medium", "high"] } },
|
|
168
|
+
},
|
|
169
|
+
"kimi-k3": {
|
|
170
|
+
window: CONTEXT_1M,
|
|
171
|
+
defaultVariant: "regular",
|
|
172
|
+
maxModeVerified: true,
|
|
173
|
+
variants: { regular: { levels: ["low", "high", "max"] } },
|
|
174
|
+
},
|
|
175
|
+
"grok-4.5": {
|
|
176
|
+
window: CONTEXT_500K,
|
|
177
|
+
defaultVariant: "regular",
|
|
178
|
+
wirePrefix: "cursor-",
|
|
179
|
+
variants: {
|
|
180
|
+
regular: { levels: ["low", "medium", "high"] },
|
|
181
|
+
fast: { levels: ["low", "medium", "high"] },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
"grok-4.6": {
|
|
185
|
+
window: CONTEXT_500K,
|
|
186
|
+
defaultVariant: "regular",
|
|
187
|
+
wirePrefix: "cursor-",
|
|
188
|
+
variants: {
|
|
189
|
+
regular: { levels: ["low", "medium", "high", "xhigh"] },
|
|
190
|
+
fast: { levels: ["low", "medium", "high", "xhigh"] },
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
"gpt-5.1": {
|
|
194
|
+
window: CONTEXT_272K,
|
|
195
|
+
defaultVariant: "regular",
|
|
196
|
+
variants: { regular: { levels: ["low", "high"] } },
|
|
197
|
+
},
|
|
198
|
+
"gpt-5.1-codex-max": {
|
|
199
|
+
window: CONTEXT_272K,
|
|
200
|
+
defaultVariant: "regular",
|
|
201
|
+
variants: { regular: { levels: ["low", "medium", "high", "xhigh"] } },
|
|
202
|
+
},
|
|
203
|
+
"gpt-5.1-codex-mini": {
|
|
204
|
+
window: CONTEXT_272K,
|
|
205
|
+
defaultVariant: "regular",
|
|
206
|
+
variants: { regular: { levels: ["low", "high"] } },
|
|
207
|
+
},
|
|
208
|
+
"gpt-5.2": {
|
|
209
|
+
window: CONTEXT_272K,
|
|
210
|
+
defaultVariant: "regular",
|
|
211
|
+
variants: { regular: { levels: ["low", "high", "xhigh"] } },
|
|
212
|
+
},
|
|
213
|
+
"gpt-5.2-codex": {
|
|
214
|
+
window: CONTEXT_272K,
|
|
215
|
+
defaultVariant: "regular",
|
|
216
|
+
variants: { regular: { levels: ["low", "high", "xhigh"] } },
|
|
217
|
+
},
|
|
218
|
+
"gpt-5.3-codex": {
|
|
219
|
+
window: CONTEXT_272K,
|
|
220
|
+
defaultVariant: "regular",
|
|
221
|
+
variants: { regular: { levels: ["low", "high", "xhigh"] } },
|
|
222
|
+
},
|
|
223
|
+
"gpt-5.4": {
|
|
224
|
+
window: CONTEXT_272K,
|
|
225
|
+
defaultVariant: "regular",
|
|
226
|
+
variants: { regular: { levels: ["low", "medium", "high", "xhigh"] } },
|
|
227
|
+
},
|
|
228
|
+
"gpt-5.4-mini": {
|
|
229
|
+
window: CONTEXT_272K,
|
|
230
|
+
defaultVariant: "regular",
|
|
231
|
+
variants: { regular: { levels: ["low", "medium", "high", "xhigh"] } },
|
|
232
|
+
},
|
|
233
|
+
"gpt-5.4-nano": {
|
|
234
|
+
window: CONTEXT_272K,
|
|
235
|
+
defaultVariant: "regular",
|
|
236
|
+
variants: { regular: { levels: ["low", "medium", "high", "xhigh"] } },
|
|
237
|
+
},
|
|
238
|
+
"gpt-5.5": {
|
|
239
|
+
window: CONTEXT_272K,
|
|
240
|
+
defaultVariant: "regular",
|
|
241
|
+
variants: { regular: { levels: ["low", "medium", "high"] } },
|
|
242
|
+
},
|
|
243
|
+
"gpt-5.5-extra": {
|
|
244
|
+
window: CONTEXT_272K,
|
|
245
|
+
defaultVariant: "regular",
|
|
246
|
+
variants: { regular: { levels: ["high"] } },
|
|
247
|
+
},
|
|
248
|
+
"gpt-5.6-sol": {
|
|
249
|
+
window: CONTEXT_1M,
|
|
250
|
+
defaultVariant: "regular",
|
|
251
|
+
variants: { regular: { levels: FULL } },
|
|
252
|
+
},
|
|
253
|
+
"gpt-5.6-terra": {
|
|
254
|
+
window: CONTEXT_1M,
|
|
255
|
+
defaultVariant: "regular",
|
|
256
|
+
variants: { regular: { levels: FULL } },
|
|
257
|
+
},
|
|
258
|
+
"gpt-5.6-luna": {
|
|
259
|
+
window: CONTEXT_1M,
|
|
260
|
+
defaultVariant: "regular",
|
|
261
|
+
variants: { regular: { levels: FULL } },
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
const LEVEL_TOKENS = ["extra-high", "minimal", "low", "medium", "high", "xhigh", "max", "none"] as const;
|
|
266
|
+
|
|
267
|
+
export interface ParsedCursorVariantId {
|
|
268
|
+
readonly baseId: string;
|
|
269
|
+
readonly kind: CursorVariantKind;
|
|
270
|
+
readonly level?: string;
|
|
271
|
+
/** True for synthetic big-context marker ids (`<base>-1m`). */
|
|
272
|
+
readonly ultra: boolean;
|
|
273
|
+
/** True when the id resolved through the capability table (else passthrough). */
|
|
274
|
+
readonly known: boolean;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function stripLevelSuffix(id: string): { stem: string; level?: string } {
|
|
278
|
+
// Prefer the parse whose stem is a KNOWN capability, and among known stems
|
|
279
|
+
// the most specific (longest) one: "gpt-5.5-extra-high" must parse as
|
|
280
|
+
// gpt-5.5-extra + high (its real single-rung wire id), not gpt-5.5 +
|
|
281
|
+
// extra-high (A-gate blocker 2 family).
|
|
282
|
+
let fallback: { stem: string; level?: string } | undefined;
|
|
283
|
+
let best: { stem: string; level?: string } | undefined;
|
|
284
|
+
for (const token of LEVEL_TOKENS) {
|
|
285
|
+
if (!id.endsWith(`-${token}`)) continue;
|
|
286
|
+
const candidate = { stem: id.slice(0, -(token.length + 1)), level: token };
|
|
287
|
+
fallback ??= candidate;
|
|
288
|
+
if (CURSOR_CAPABILITIES[candidate.stem] && (best === undefined || candidate.stem.length > best.stem.length)) {
|
|
289
|
+
best = candidate;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return best ?? fallback ?? { stem: id };
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Parse any cursor-facing id (picker slug tail, legacy variant id, or wire id)
|
|
297
|
+
* into its base + dimensions. Precedence is exact-identity-first so ids like
|
|
298
|
+
* `gpt-5.1-codex-max` and `gpt-5.5-extra` — whose tails collide with effort
|
|
299
|
+
* tokens — never mis-parse (A-gate round-1 blocker 2).
|
|
300
|
+
*/
|
|
301
|
+
/**
|
|
302
|
+
* Real wire ids that merely END in "-1m" — they are distinct catalog rows the
|
|
303
|
+
* wire serves verbatim, never the synthetic ultra marker (A-gate blocker 2:
|
|
304
|
+
* a real legacy wire identity must not parse as `<base>-1m`).
|
|
305
|
+
*/
|
|
306
|
+
const REAL_1M_WIRE_IDS: ReadonlySet<string> = new Set(["claude-4-sonnet-1m"]);
|
|
307
|
+
|
|
308
|
+
export function parseCursorVariantId(rawId: string): ParsedCursorVariantId {
|
|
309
|
+
const id = rawId.trim();
|
|
310
|
+
// 1. Exact base identity.
|
|
311
|
+
if (CURSOR_CAPABILITIES[id]) {
|
|
312
|
+
return { baseId: id, kind: defaultKindFor(id), ultra: false, known: true };
|
|
313
|
+
}
|
|
314
|
+
if (REAL_1M_WIRE_IDS.has(id)) {
|
|
315
|
+
return { baseId: id, kind: "regular", ultra: false, known: false };
|
|
316
|
+
}
|
|
317
|
+
// 2. cursor- wire prefix (regular grok wire forms).
|
|
318
|
+
if (id.startsWith("cursor-")) {
|
|
319
|
+
const inner = parseCursorVariantId(id.slice("cursor-".length));
|
|
320
|
+
if (inner.known) return inner;
|
|
321
|
+
}
|
|
322
|
+
// 3. Synthetic big-context marker.
|
|
323
|
+
if (id.endsWith("-1m")) {
|
|
324
|
+
const baseId = id.slice(0, -"-1m".length);
|
|
325
|
+
if (CURSOR_CAPABILITIES[baseId]) {
|
|
326
|
+
return { baseId, kind: "regular", ultra: true, known: true };
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// 4. Suffix grammar: strip -fast, then thinking/effort markers.
|
|
330
|
+
let stem = id;
|
|
331
|
+
let fast = false;
|
|
332
|
+
if (stem.endsWith("-fast")) {
|
|
333
|
+
fast = true;
|
|
334
|
+
stem = stem.slice(0, -"-fast".length);
|
|
335
|
+
}
|
|
336
|
+
let thinking = false;
|
|
337
|
+
let level: string | undefined;
|
|
338
|
+
const thinkingLevel = /^(.*)-thinking-([a-z-]+)$/.exec(stem);
|
|
339
|
+
if (thinkingLevel && CURSOR_CAPABILITIES[thinkingLevel[1]!] && (LEVEL_TOKENS as readonly string[]).includes(thinkingLevel[2]!)) {
|
|
340
|
+
return finishParse(thinkingLevel[1]!, true, fast, thinkingLevel[2]!);
|
|
341
|
+
}
|
|
342
|
+
const levelThinking = stem.endsWith("-thinking") ? stripLevelSuffix(stem.slice(0, -"-thinking".length)) : undefined;
|
|
343
|
+
if (levelThinking && CURSOR_CAPABILITIES[levelThinking.stem]) {
|
|
344
|
+
return finishParse(levelThinking.stem, true, fast, levelThinking.level);
|
|
345
|
+
}
|
|
346
|
+
if (stem.endsWith("-thinking") && CURSOR_CAPABILITIES[stem.slice(0, -"-thinking".length)]) {
|
|
347
|
+
return finishParse(stem.slice(0, -"-thinking".length), true, fast, undefined);
|
|
348
|
+
}
|
|
349
|
+
const plain = stripLevelSuffix(stem);
|
|
350
|
+
if (plain.level !== undefined && CURSOR_CAPABILITIES[plain.stem]) {
|
|
351
|
+
return finishParse(plain.stem, false, fast, plain.level);
|
|
352
|
+
}
|
|
353
|
+
if (fast && CURSOR_CAPABILITIES[stem]) {
|
|
354
|
+
return finishParse(stem, false, true, undefined);
|
|
355
|
+
}
|
|
356
|
+
void thinking;
|
|
357
|
+
void level;
|
|
358
|
+
// Unknown: passthrough (adapter sends the id unchanged).
|
|
359
|
+
return { baseId: id, kind: "regular", ultra: false, known: false };
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function finishParse(baseId: string, thinking: boolean, fast: boolean, level: string | undefined): ParsedCursorVariantId {
|
|
363
|
+
const kind: CursorVariantKind = thinking ? (fast ? "thinkingFast" : "thinking") : fast ? "fast" : "regular";
|
|
364
|
+
return { baseId, kind, ...(level !== undefined ? { level } : {}), ultra: false, known: true };
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function defaultKindFor(baseId: string): CursorVariantKind {
|
|
368
|
+
return CURSOR_CAPABILITIES[baseId]?.defaultVariant ?? "regular";
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function normalizeRequestedEffort(reasoning: string | undefined): string | undefined {
|
|
372
|
+
const normalized = reasoning?.toLowerCase();
|
|
373
|
+
return normalized === "ultra" ? "max" : normalized;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function codexEffortRank(reasoning: string | undefined): "low" | "medium" | "high" {
|
|
377
|
+
switch (normalizeRequestedEffort(reasoning) ?? "") {
|
|
378
|
+
case "none":
|
|
379
|
+
case "minimal":
|
|
380
|
+
case "low":
|
|
381
|
+
return "low";
|
|
382
|
+
case "medium":
|
|
383
|
+
return "medium";
|
|
384
|
+
case "high":
|
|
385
|
+
case "max":
|
|
386
|
+
case "xhigh":
|
|
387
|
+
return "high";
|
|
388
|
+
default:
|
|
389
|
+
return "high";
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/** Pick this variant's effort rung for a Codex reasoning label: literal-first, else rank clamp. */
|
|
394
|
+
export function cursorVariantEffort(spec: CursorVariantSpec, reasoning: string | undefined): string | undefined {
|
|
395
|
+
if (spec.levels.length === 0) return undefined;
|
|
396
|
+
const requested = normalizeRequestedEffort(reasoning);
|
|
397
|
+
if (requested && spec.levels.includes(requested)) return requested;
|
|
398
|
+
switch (codexEffortRank(reasoning)) {
|
|
399
|
+
case "low":
|
|
400
|
+
return spec.levels[0];
|
|
401
|
+
case "high":
|
|
402
|
+
return spec.levels[spec.levels.length - 1];
|
|
403
|
+
case "medium":
|
|
404
|
+
return spec.levels[Math.floor((spec.levels.length - 1) / 2)];
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export interface CursorResolvedSelection {
|
|
409
|
+
/** Flattened wire id for AgentService/Run (with any required cursor- prefix). */
|
|
410
|
+
readonly wireId: string;
|
|
411
|
+
/** Canonical prefix-free id for discovery/catalog comparison. */
|
|
412
|
+
readonly canonicalId: string;
|
|
413
|
+
/** True when the request should raise the Max Mode wire flag (evidence-gated). */
|
|
414
|
+
readonly maxMode: boolean;
|
|
415
|
+
readonly known: boolean;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Compose a variant's flattened wire id, reproducing the legacy effort-map
|
|
420
|
+
* order rules exactly (thinking-then-effort / effort-then-thinking / bare;
|
|
421
|
+
* fast marker terminal; wrong order is ERROR_BAD_MODEL_NAME on the wire).
|
|
422
|
+
*/
|
|
423
|
+
function composeWireId(baseId: string, kind: CursorVariantKind, effort: string | undefined): string {
|
|
424
|
+
const capability = CURSOR_CAPABILITIES[baseId];
|
|
425
|
+
const spec = capability?.variants[kind];
|
|
426
|
+
if (!capability || !spec) return baseId;
|
|
427
|
+
const thinking = kind === "thinking" || kind === "thinkingFast";
|
|
428
|
+
const fast = kind === "fast" || kind === "thinkingFast";
|
|
429
|
+
if (thinking) {
|
|
430
|
+
const order = spec.order ?? "thinking-then-effort";
|
|
431
|
+
if (order === "bare" || effort === undefined) return `${baseId}-thinking`;
|
|
432
|
+
if (order === "effort-then-thinking") return `${baseId}-${effort}-thinking`;
|
|
433
|
+
return fast ? `${baseId}-thinking-${effort}-fast` : `${baseId}-thinking-${effort}`;
|
|
434
|
+
}
|
|
435
|
+
if (effort === undefined) return fast ? `${baseId}-fast` : baseId;
|
|
436
|
+
return fast ? `${baseId}-${effort}-fast` : `${baseId}-${effort}`;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Resolve any picked cursor id + Codex reasoning effort to the wire identity.
|
|
441
|
+
* Legacy slugs (thinking/fast/-1m variants) keep resolving forever — picker
|
|
442
|
+
* rows shrink, routability does not (alias-retention contract, 003).
|
|
443
|
+
*
|
|
444
|
+
* `liveMaxModeIds` optionally extends the static maxMode evidence with the
|
|
445
|
+
* bases the live GetUsableModels roster flags (union semantics).
|
|
446
|
+
*/
|
|
447
|
+
export function resolveCursorSelection(
|
|
448
|
+
pickedId: string,
|
|
449
|
+
reasoning: string | undefined,
|
|
450
|
+
liveMaxModeIds?: ReadonlySet<string>,
|
|
451
|
+
): CursorResolvedSelection {
|
|
452
|
+
const parsed = parseCursorVariantId(pickedId);
|
|
453
|
+
if (!parsed.known) {
|
|
454
|
+
return { wireId: pickedId, canonicalId: pickedId, maxMode: false, known: false };
|
|
455
|
+
}
|
|
456
|
+
const capability = CURSOR_CAPABILITIES[parsed.baseId]!;
|
|
457
|
+
const spec = capability.variants[parsed.kind] ?? capability.variants.regular;
|
|
458
|
+
if (!spec) {
|
|
459
|
+
return { wireId: parsed.baseId, canonicalId: parsed.baseId, maxMode: false, known: true };
|
|
460
|
+
}
|
|
461
|
+
const requested = parsed.level ?? reasoning;
|
|
462
|
+
const effort = cursorVariantEffort(spec, requested);
|
|
463
|
+
const canonicalId = composeWireId(parsed.baseId, parsed.kind, effort);
|
|
464
|
+
const wireId = capability.wirePrefix && parsed.kind === "regular"
|
|
465
|
+
? `${capability.wirePrefix}${canonicalId}`
|
|
466
|
+
: canonicalId;
|
|
467
|
+
const ultraRequested = parsed.ultra || reasoning?.toLowerCase() === "ultra";
|
|
468
|
+
const evidence = liveMaxModeIds ?? liveCursorMaxModeBases;
|
|
469
|
+
const maxModeArmed = capability.maxModeVerified === true || evidence.has(parsed.baseId);
|
|
470
|
+
return { wireId, canonicalId, maxMode: ultraRequested && maxModeArmed, known: true };
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Live Max-Mode evidence (GetUsableModels maxModeModels). Provider discovery
|
|
475
|
+
* records the BASES the live roster flags; the resolver unions this with the
|
|
476
|
+
* static `maxModeVerified` gate so ultra generalizes automatically as evidence
|
|
477
|
+
* arrives — never from window size (devlog 260828 blocker-4 fold).
|
|
478
|
+
*/
|
|
479
|
+
let liveCursorMaxModeBases: ReadonlySet<string> = new Set();
|
|
480
|
+
|
|
481
|
+
export function recordLiveCursorMaxModeModels(liveIds: readonly string[]): void {
|
|
482
|
+
const bases = new Set<string>();
|
|
483
|
+
for (const id of liveIds) {
|
|
484
|
+
const parsed = parseCursorVariantId(id);
|
|
485
|
+
if (parsed.known) bases.add(parsed.baseId);
|
|
486
|
+
}
|
|
487
|
+
liveCursorMaxModeBases = bases;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
export function liveCursorMaxModeBasesForTests(): ReadonlySet<string> {
|
|
491
|
+
return liveCursorMaxModeBases;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export interface CursorUmbrellaRow {
|
|
495
|
+
readonly id: string;
|
|
496
|
+
readonly efforts: readonly string[];
|
|
497
|
+
readonly window: number;
|
|
498
|
+
/** Max Mode evidence present: the ultra rung maps to maxMode on the wire. */
|
|
499
|
+
readonly maxModeVerified: boolean;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Grok Fast keeps the parameterized wire shape (base id + effort/fast
|
|
504
|
+
* parameters) rather than a flattened -fast id — current Cursor clients send
|
|
505
|
+
* it that way and the flat form is rejected. Returns undefined for every
|
|
506
|
+
* other id.
|
|
507
|
+
*/
|
|
508
|
+
export function cursorGrokFastSelection(
|
|
509
|
+
pickedId: string,
|
|
510
|
+
reasoning: string | undefined,
|
|
511
|
+
): { wireBaseId: string; effort: string } | undefined {
|
|
512
|
+
const parsed = parseCursorVariantId(pickedId);
|
|
513
|
+
if (!parsed.known || parsed.kind !== "fast") return undefined;
|
|
514
|
+
const capability = CURSOR_CAPABILITIES[parsed.baseId];
|
|
515
|
+
if (capability?.wirePrefix !== "cursor-") return undefined;
|
|
516
|
+
const spec = capability.variants.fast;
|
|
517
|
+
if (!spec) return undefined;
|
|
518
|
+
const effort = cursorVariantEffort(spec, parsed.level ?? reasoning);
|
|
519
|
+
if (effort === undefined) return undefined;
|
|
520
|
+
return { wireBaseId: parsed.baseId, effort };
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* The umbrella picker rows: one per base whose default variant is selectable.
|
|
525
|
+
* Thinking merges into the base row; fast/thinking-fast/legacy slugs stay
|
|
526
|
+
* routable as aliases but add no rows. Router ids stay in discovery.
|
|
527
|
+
*/
|
|
528
|
+
export function cursorUmbrellaRows(): CursorUmbrellaRow[] {
|
|
529
|
+
const rows: CursorUmbrellaRow[] = [];
|
|
530
|
+
for (const [baseId, capability] of Object.entries(CURSOR_CAPABILITIES)) {
|
|
531
|
+
const spec = capability.variants[capability.defaultVariant];
|
|
532
|
+
if (!spec || spec.quarantined) continue;
|
|
533
|
+
rows.push({
|
|
534
|
+
id: baseId,
|
|
535
|
+
efforts: spec.levels,
|
|
536
|
+
window: capability.window,
|
|
537
|
+
maxModeVerified: capability.maxModeVerified === true,
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
return rows;
|
|
541
|
+
}
|