@remodex/rmx 1.0.2
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 +91 -0
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/assets/architecture.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/claude-code-models.gif +0 -0
- package/assets/codex-app-picker.png +0 -0
- package/bin/ocx.mjs +584 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-CZqebSPQ.css +1 -0
- package/gui/dist/assets/index-CkETtt7P.js +71 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/fonts/google-sans-cyrillic.woff2 +0 -0
- package/gui/dist/fonts/google-sans-latin.woff2 +0 -0
- package/gui/dist/icons.svg +24 -0
- package/gui/dist/index.html +25 -0
- package/gui/dist/logo.png +0 -0
- package/gui/dist/provider-icons/alibaba-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity-color.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/deepseek-color.svg +1 -0
- package/gui/dist/provider-icons/discord.svg +1 -0
- package/gui/dist/provider-icons/firepass-color.svg +1 -0
- package/gui/dist/provider-icons/fireworks-color.svg +1 -0
- package/gui/dist/provider-icons/gemini-color.svg +1 -0
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
- package/gui/dist/provider-icons/grok.svg +1 -0
- package/gui/dist/provider-icons/groq-color.svg +1 -0
- package/gui/dist/provider-icons/huggingface-color.svg +1 -0
- package/gui/dist/provider-icons/kimi-color.svg +1 -0
- package/gui/dist/provider-icons/kiro-color.svg +15 -0
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
- package/gui/dist/provider-icons/mistral-color.svg +1 -0
- package/gui/dist/provider-icons/moonshot-color.svg +1 -0
- package/gui/dist/provider-icons/nvidia-color.svg +1 -0
- package/gui/dist/provider-icons/ollama-color.svg +1 -0
- package/gui/dist/provider-icons/openai.svg +1 -0
- package/gui/dist/provider-icons/opencode.svg +2 -0
- package/gui/dist/provider-icons/openrouter-color.svg +1 -0
- package/gui/dist/provider-icons/pi.svg +21 -0
- package/gui/dist/provider-icons/qianfan-color.svg +1 -0
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
- package/gui/dist/provider-icons/telegram.svg +1 -0
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/vllm-color.svg +1 -0
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
- package/package.json +118 -0
- package/src/AGENTS.md +28 -0
- package/src/adapters/anthropic-image-guard.ts +251 -0
- package/src/adapters/anthropic-image-normalize.ts +518 -0
- package/src/adapters/anthropic.ts +1205 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +83 -0
- package/src/adapters/client-fingerprint.ts +59 -0
- package/src/adapters/command-code.ts +453 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/cursor-errors.ts +165 -0
- package/src/adapters/cursor/discovery.ts +276 -0
- package/src/adapters/cursor/effort-map.ts +139 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +250 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
- package/src/adapters/cursor/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +153 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1235 -0
- package/src/adapters/cursor/mcp-config.ts +42 -0
- package/src/adapters/cursor/mcp-manager.ts +333 -0
- package/src/adapters/cursor/message-mapper.ts +49 -0
- package/src/adapters/cursor/native-exec-common.ts +59 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +332 -0
- package/src/adapters/cursor/native-exec-mcp.ts +153 -0
- package/src/adapters/cursor/native-exec-network.ts +43 -0
- package/src/adapters/cursor/native-exec-shell.ts +548 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +604 -0
- package/src/adapters/cursor/protobuf-events.ts +735 -0
- package/src/adapters/cursor/protobuf-request.ts +719 -0
- package/src/adapters/cursor/request-builder.ts +280 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +621 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +57 -0
- package/src/adapters/cursor/types.ts +59 -0
- package/src/adapters/cursor.ts +196 -0
- package/src/adapters/google-antigravity-replay.ts +520 -0
- package/src/adapters/google-antigravity-wire.ts +140 -0
- package/src/adapters/google-errors.ts +85 -0
- package/src/adapters/google-http.ts +100 -0
- package/src/adapters/google-tool-schema.ts +173 -0
- package/src/adapters/google-truncation.ts +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +859 -0
- package/src/adapters/identity.ts +77 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +208 -0
- package/src/adapters/kiro-events.ts +197 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +104 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +224 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1924 -0
- package/src/adapters/mimo-free.ts +263 -0
- package/src/adapters/openai-chat.ts +1265 -0
- package/src/adapters/openai-responses.ts +1309 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-catalog-nudge.ts +71 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/android-remote/assets.ts +218 -0
- package/src/android-remote/attachments.ts +168 -0
- package/src/android-remote/auth.ts +237 -0
- package/src/android-remote/cloudflare-provisioning.ts +409 -0
- package/src/android-remote/cloudflare-secret.ts +106 -0
- package/src/android-remote/cloudflare-tunnel.ts +488 -0
- package/src/android-remote/cloudflared.ts +286 -0
- package/src/android-remote/codex-app-server.ts +565 -0
- package/src/android-remote/desktop-history-page.ts +936 -0
- package/src/android-remote/desktop-ipc.ts +3643 -0
- package/src/android-remote/desktop-ownership-store.ts +98 -0
- package/src/android-remote/desktop-project-registration.ts +129 -0
- package/src/android-remote/desktop-session-stream.ts +1110 -0
- package/src/android-remote/desktop-workspace-state.ts +443 -0
- package/src/android-remote/file-change-parser.ts +112 -0
- package/src/android-remote/gateway.ts +9108 -0
- package/src/android-remote/mutation-store.ts +299 -0
- package/src/android-remote/projection.ts +1780 -0
- package/src/android-remote/queued-turn-store.ts +248 -0
- package/src/android-remote/session-command-recovery.ts +1384 -0
- package/src/android-remote/store.ts +466 -0
- package/src/android-remote/thread-reconciliation.ts +133 -0
- package/src/android-remote/thread-source-paths.ts +307 -0
- package/src/android-remote/thread-stream.ts +546 -0
- package/src/android-remote/turn-activity.ts +235 -0
- package/src/android-remote/user-message-identity.ts +94 -0
- package/src/bridge.ts +1793 -0
- package/src/chat/inbound.ts +295 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +267 -0
- package/src/claude/alias.ts +149 -0
- package/src/claude/auth-detect.ts +229 -0
- package/src/claude/auth-mode-migration.ts +32 -0
- package/src/claude/auth-mode.ts +62 -0
- package/src/claude/context-windows.ts +189 -0
- package/src/claude/desktop-3p-guard.ts +35 -0
- package/src/claude/desktop-3p-paths.ts +84 -0
- package/src/claude/desktop-3p.ts +601 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +70 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +519 -0
- package/src/claude/model-info.ts +154 -0
- package/src/claude/outbound.ts +898 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +296 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +476 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +297 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +184 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-desktop.ts +211 -0
- package/src/cli/claude.ts +302 -0
- package/src/cli/codex-shim-autorestore.ts +45 -0
- package/src/cli/codex-shim-readiness.ts +69 -0
- package/src/cli/combo.ts +124 -0
- package/src/cli/config-command.ts +183 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/desktop-first-run.ts +25 -0
- package/src/cli/doctor.ts +1022 -0
- package/src/cli/export-command.ts +201 -0
- package/src/cli/help.ts +370 -0
- package/src/cli/index.ts +1565 -0
- package/src/cli/init.ts +224 -0
- package/src/cli/integrations.ts +225 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/internal-dispatch.ts +35 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/models-runtime.ts +224 -0
- package/src/cli/models.ts +340 -0
- package/src/cli/observe.ts +170 -0
- package/src/cli/opencode.ts +587 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +476 -0
- package/src/cli/ready.ts +301 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +328 -0
- package/src/cli/star-prompt.ts +211 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +321 -0
- package/src/cli/system-command.ts +196 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +205 -0
- package/src/cli/v2.ts +200 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1109 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +34 -0
- package/src/codex/account-lifecycle.ts +172 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +195 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +517 -0
- package/src/codex/account-usability.ts +40 -0
- package/src/codex/admission.ts +263 -0
- package/src/codex/app-server-processes.ts +799 -0
- package/src/codex/auth-api.ts +2098 -0
- package/src/codex/auth-collision.ts +107 -0
- package/src/codex/auth-context.ts +480 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +471 -0
- package/src/codex/catalog/bundled.ts +533 -0
- package/src/codex/catalog/effort.ts +432 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +287 -0
- package/src/codex/catalog/native-models.ts +7 -0
- package/src/codex/catalog/parsing.ts +503 -0
- package/src/codex/catalog/provider-fetch.ts +2267 -0
- package/src/codex/catalog/sync.ts +1606 -0
- package/src/codex/catalog-admission.ts +197 -0
- package/src/codex/catalog-refresh-status.ts +87 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +15 -0
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +593 -0
- package/src/codex/convergence.ts +580 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/data/upstream-models.json +830 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-client-processes.ts +521 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1091 -0
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +347 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +115 -0
- package/src/codex/history-provider.ts +1075 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +204 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +257 -0
- package/src/codex/inject.ts +1857 -0
- package/src/codex/injected-marker.ts +79 -0
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +105 -0
- package/src/codex/journal.ts +172 -0
- package/src/codex/main-account-cache.ts +56 -0
- package/src/codex/main-account.ts +40 -0
- package/src/codex/management-convergence.ts +114 -0
- package/src/codex/model-cache.ts +267 -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 +167 -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 +348 -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 +691 -0
- package/src/codex/paths.ts +78 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +426 -0
- package/src/codex/prompt-journal.ts +311 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/provider-adoption.ts +242 -0
- package/src/codex/quota-rejection.ts +224 -0
- package/src/codex/quota.ts +494 -0
- package/src/codex/refresh.ts +60 -0
- package/src/codex/routing.ts +1855 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +1215 -0
- package/src/codex/subagent-defaults.ts +557 -0
- package/src/codex/subagent-model-fallback.ts +560 -0
- package/src/codex/sync.ts +238 -0
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +374 -0
- package/src/codex/warmup.ts +192 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +140 -0
- package/src/combos/index.ts +44 -0
- package/src/combos/request.ts +64 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +392 -0
- package/src/config.ts +3270 -0
- package/src/generated/model-metadata.ts +144 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +540 -0
- package/src/grok/inspect.ts +45 -0
- package/src/grok/status.ts +127 -0
- package/src/grok/sync.ts +66 -0
- package/src/images/artifacts.ts +516 -0
- package/src/images/fulfill-video.ts +163 -0
- package/src/images/fulfill.ts +149 -0
- package/src/images/index.ts +4 -0
- package/src/images/loop.ts +922 -0
- package/src/images/plan.ts +133 -0
- package/src/images/synthetic-tool.ts +133 -0
- package/src/images/types.ts +41 -0
- package/src/images/xai-client.ts +141 -0
- package/src/images/xai-video-client.ts +163 -0
- package/src/index.ts +22 -0
- package/src/integrations/config-io.ts +151 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +108 -0
- package/src/integrations/serialize.ts +235 -0
- package/src/integrations/state.ts +290 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer.ts +492 -0
- package/src/lib/abort.ts +146 -0
- package/src/lib/admin-secrets.ts +25 -0
- package/src/lib/admission.ts +83 -0
- package/src/lib/app-owned-memory-stores.ts +173 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +242 -0
- package/src/lib/bun-binary-validator.d.mts +3 -0
- package/src/lib/bun-binary-validator.mjs +18 -0
- package/src/lib/bun-runtime.ts +184 -0
- package/src/lib/bun-stream-caps.ts +127 -0
- package/src/lib/config-ownership.ts +438 -0
- package/src/lib/crash-guard.ts +344 -0
- package/src/lib/debug-log-buffer.ts +83 -0
- package/src/lib/debug-settings.ts +108 -0
- package/src/lib/debug.ts +31 -0
- package/src/lib/destination-policy.ts +316 -0
- package/src/lib/errors.ts +364 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/pinned-http.ts +182 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-environment.ts +470 -0
- package/src/lib/provider-outbound.ts +203 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +510 -0
- package/src/lib/remodex-home.ts +616 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/service-secrets.ts +178 -0
- package/src/lib/shadow-call.ts +54 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +109 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/test-home-guard.ts +98 -0
- package/src/lib/token-estimate.ts +69 -0
- package/src/lib/translator-budget.ts +366 -0
- package/src/lib/upstream-reachability.ts +91 -0
- package/src/lib/upstream-retry.ts +508 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-elevation.ts +705 -0
- package/src/lib/windows-secret-acl.ts +817 -0
- package/src/lib/windows-user-principal.ts +283 -0
- package/src/lib/winsw.ts +402 -0
- package/src/model-sources.ts +73 -0
- package/src/oauth/anthropic-routing.ts +594 -0
- package/src/oauth/anthropic.ts +177 -0
- package/src/oauth/callback-server.ts +294 -0
- package/src/oauth/chatgpt.ts +150 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +231 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +230 -0
- package/src/oauth/health.ts +443 -0
- package/src/oauth/index.ts +1280 -0
- package/src/oauth/key-providers.ts +128 -0
- package/src/oauth/kimi.ts +213 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -0
- package/src/oauth/local-token-detect.ts +121 -0
- package/src/oauth/log.ts +48 -0
- package/src/oauth/login-cli.ts +163 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +655 -0
- package/src/oauth/token-guardian.ts +309 -0
- package/src/oauth/types.ts +62 -0
- package/src/oauth/xai.ts +241 -0
- package/src/providers/alibaba-region-backup.ts +75 -0
- package/src/providers/alibaba-region-migration.ts +156 -0
- package/src/providers/alibaba-region-startup.ts +36 -0
- package/src/providers/antigravity-models.ts +317 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +64 -0
- package/src/providers/codex-capacity.ts +288 -0
- package/src/providers/command-code-efforts.ts +85 -0
- package/src/providers/context-cap.ts +73 -0
- package/src/providers/derive.ts +451 -0
- package/src/providers/free-directory.ts +187 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +271 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +361 -0
- package/src/providers/openai-sidecar.ts +235 -0
- package/src/providers/openai-tier-startup.ts +27 -0
- package/src/providers/openai-tiers.ts +301 -0
- package/src/providers/openai-virtual-models.ts +83 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +179 -0
- package/src/providers/quota.ts +1942 -0
- package/src/providers/reasoning-capabilities.ts +336 -0
- package/src/providers/registry.ts +2375 -0
- package/src/providers/slug-codec.ts +74 -0
- package/src/providers/xai-transport.ts +149 -0
- package/src/reasoning-effort.ts +243 -0
- package/src/responses/compaction.ts +124 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/parser.ts +714 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +106 -0
- package/src/responses/schema.ts +159 -0
- package/src/responses/spill-store.ts +431 -0
- package/src/responses/state.ts +1039 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/router.ts +802 -0
- package/src/routing/analytics.ts +377 -0
- package/src/routing/capability.ts +205 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +444 -0
- package/src/routing/health.ts +401 -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 +424 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +686 -0
- package/src/server/adapter-resolve.ts +83 -0
- package/src/server/auth-cors.ts +606 -0
- package/src/server/chat-completions.ts +379 -0
- package/src/server/claude-messages.ts +980 -0
- package/src/server/effort-policy.ts +251 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +152 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +485 -0
- package/src/server/index.ts +1633 -0
- package/src/server/lifecycle.ts +482 -0
- package/src/server/live.ts +609 -0
- package/src/server/management/agent-settings-routes.ts +1180 -0
- package/src/server/management/android-remote-routes.ts +390 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +167 -0
- package/src/server/management/body.ts +35 -0
- package/src/server/management/combo-routes.ts +244 -0
- package/src/server/management/config-routes.ts +602 -0
- package/src/server/management/context.ts +88 -0
- package/src/server/management/integration-routes.ts +538 -0
- package/src/server/management/logs-usage-routes.ts +516 -0
- package/src/server/management/model-routes.ts +519 -0
- package/src/server/management/model-rows.ts +143 -0
- package/src/server/management/native-integration-routes.ts +781 -0
- package/src/server/management/oauth-account-routes.ts +573 -0
- package/src/server/management/provider-routes.ts +781 -0
- 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 +384 -0
- package/src/server/management/shared.ts +277 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +433 -0
- package/src/server/management/system-routes.ts +141 -0
- package/src/server/management/usage-summary-cache.ts +86 -0
- package/src/server/management-api.ts +269 -0
- package/src/server/management-auth.ts +353 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +326 -0
- package/src/server/proxy-stop.ts +92 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1179 -0
- package/src/server/request-decompress.ts +132 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1072 -0
- package/src/server/responses/collaboration.ts +409 -0
- package/src/server/responses/compact.ts +710 -0
- package/src/server/responses/core.ts +3561 -0
- package/src/server/responses/encrypted-payload.ts +308 -0
- package/src/server/responses/fetch-helpers.ts +171 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/policy-fallback.ts +152 -0
- package/src/server/responses/terminal-guard.ts +230 -0
- package/src/server/responses/upstream-error.ts +48 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +272 -0
- package/src/server/responses-json-events.ts +52 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses.ts +10 -0
- package/src/server/search.ts +181 -0
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +263 -0
- package/src/server/startup-action-control.ts +308 -0
- package/src/server/startup-health-cache.ts +119 -0
- package/src/server/system-env.ts +418 -0
- package/src/server/windows-tcp-drop.ts +184 -0
- package/src/server/windows-tray-control.ts +41 -0
- package/src/server/ws-bridge.ts +470 -0
- package/src/service-manager-probe.ts +824 -0
- package/src/service.ts +3011 -0
- package/src/stall-timeout.ts +20 -0
- package/src/storage/cleanup-job.ts +57 -0
- package/src/storage/cleanup.ts +3085 -0
- package/src/storage/policy-job.ts +457 -0
- package/src/storage/policy-scheduler.ts +40 -0
- package/src/storage/policy-worker.ts +59 -0
- package/src/storage/policy.ts +527 -0
- package/src/storage/restore-job.ts +299 -0
- package/src/storage/restore-worker.ts +58 -0
- package/src/storage/scanner.ts +238 -0
- package/src/storage/storage-mutation-coordinator.ts +139 -0
- package/src/storage/worker-lifecycle.ts +215 -0
- package/src/tray/assets/opencodex-tray-offline.ico +0 -0
- package/src/tray/assets/opencodex-tray-online.ico +0 -0
- package/src/tray/assets/opencodex-tray-warning.ico +0 -0
- package/src/tray/assets/opencodex-tray.png +0 -0
- package/src/tray/windows-tray.ps1 +364 -0
- package/src/tray/windows.ts +738 -0
- package/src/types.ts +1531 -0
- package/src/update/badge.ts +72 -0
- package/src/update/desktop-release.ts +1620 -0
- package/src/update/index.ts +402 -0
- package/src/update/job.ts +1906 -0
- package/src/update/notify.ts +261 -0
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -0
- package/src/update/tray-update-plan.d.mts +18 -0
- package/src/update/tray-update-plan.mjs +38 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +283 -0
- package/src/usage/log.ts +695 -0
- package/src/usage/summary.ts +585 -0
- package/src/usage/totals.ts +14 -0
- package/src/vision/anthropic-describe.ts +185 -0
- package/src/vision/describe.ts +127 -0
- package/src/vision/index.ts +558 -0
- package/src/vision/reasoning.ts +55 -0
- package/src/web-search/anthropic-executor.ts +189 -0
- package/src/web-search/executor.ts +105 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/index.ts +196 -0
- package/src/web-search/loop.ts +791 -0
- package/src/web-search/parse.ts +235 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/synthetic-tool.ts +47 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-aware argument key normalization for Cursor tool calls.
|
|
3
|
+
*
|
|
4
|
+
* Cursor-trained models sometimes emit argument keys that differ from the tool's declared schema
|
|
5
|
+
* (e.g. `filepath` instead of `path`, `cmd` instead of `command`). This module maps common aliases
|
|
6
|
+
* to the canonical key name ONLY when the tool schema declares that canonical key. Keys already
|
|
7
|
+
* matching the schema are never touched.
|
|
8
|
+
*
|
|
9
|
+
* Derived from opencode-cursor reference (src/provider/tool-schema-compat.ts).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const KEY_ALIASES = new Map<string, string>([
|
|
13
|
+
["filepath", "path"],
|
|
14
|
+
["filename", "path"],
|
|
15
|
+
["file", "path"],
|
|
16
|
+
["targetpath", "path"],
|
|
17
|
+
["directorypath", "path"],
|
|
18
|
+
["dir", "path"],
|
|
19
|
+
["folder", "path"],
|
|
20
|
+
["directory", "path"],
|
|
21
|
+
["targetdirectory", "path"],
|
|
22
|
+
["targetfile", "path"],
|
|
23
|
+
["globpattern", "pattern"],
|
|
24
|
+
["filepattern", "pattern"],
|
|
25
|
+
["searchpattern", "pattern"],
|
|
26
|
+
["includepattern", "include"],
|
|
27
|
+
["workingdirectory", "cwd"],
|
|
28
|
+
["workdir", "cwd"],
|
|
29
|
+
["currentdirectory", "cwd"],
|
|
30
|
+
["cmd", "command"],
|
|
31
|
+
["script", "command"],
|
|
32
|
+
["shellcommand", "command"],
|
|
33
|
+
["terminalcommand", "command"],
|
|
34
|
+
["contents", "content"],
|
|
35
|
+
["text", "content"],
|
|
36
|
+
["body", "content"],
|
|
37
|
+
["data", "content"],
|
|
38
|
+
["payload", "content"],
|
|
39
|
+
["streamcontent", "content"],
|
|
40
|
+
["oldstring", "old_string"],
|
|
41
|
+
["newstring", "new_string"],
|
|
42
|
+
["oldtext", "old_string"],
|
|
43
|
+
["newtext", "new_string"],
|
|
44
|
+
["oldcontent", "old_string"],
|
|
45
|
+
["newcontent", "new_string"],
|
|
46
|
+
["recursive", "force"],
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Extract the set of declared property names from a JSON Schema parameters object.
|
|
51
|
+
* Handles the common `{ type: "object", properties: { ... } }` shape.
|
|
52
|
+
*/
|
|
53
|
+
function schemaPropertyNames(schema: unknown): Set<string> | undefined {
|
|
54
|
+
if (!schema || typeof schema !== "object") return undefined;
|
|
55
|
+
const obj = schema as Record<string, unknown>;
|
|
56
|
+
const props = obj.properties;
|
|
57
|
+
if (!props || typeof props !== "object") return undefined;
|
|
58
|
+
return new Set(Object.keys(props as Record<string, unknown>));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Normalize argument keys against the tool's declared schema. Keys not in the schema that have a
|
|
63
|
+
* known alias pointing to a schema-declared key are renamed. Explicitly supplied canonical keys
|
|
64
|
+
* always win over aliases, regardless of object property insertion order — conflicting aliases
|
|
65
|
+
* are discarded rather than left beside the canonical key.
|
|
66
|
+
*
|
|
67
|
+
* Returns the original object reference if no changes were needed (cheap identity check for callers).
|
|
68
|
+
*/
|
|
69
|
+
export function normalizeArgKeys(args: Record<string, unknown>, toolSchema: unknown): Record<string, unknown> {
|
|
70
|
+
const declared = schemaPropertyNames(toolSchema);
|
|
71
|
+
if (!declared || declared.size === 0) return args;
|
|
72
|
+
|
|
73
|
+
const suppliedCanonical = new Set<string>();
|
|
74
|
+
for (const key of Object.keys(args)) {
|
|
75
|
+
if (declared.has(key)) suppliedCanonical.add(key);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let changed = false;
|
|
79
|
+
const result: Record<string, unknown> = {};
|
|
80
|
+
for (const [key, value] of Object.entries(args)) {
|
|
81
|
+
if (declared.has(key)) {
|
|
82
|
+
result[key] = value;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const canonical = KEY_ALIASES.get(key.toLowerCase());
|
|
86
|
+
if (canonical && declared.has(canonical)) {
|
|
87
|
+
// Canonical was explicitly supplied (any order) — drop the alias entirely.
|
|
88
|
+
if (suppliedCanonical.has(canonical)) {
|
|
89
|
+
changed = true;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// First alias fills the canonical slot; later aliases for the same key are discarded.
|
|
93
|
+
if (!(canonical in result)) {
|
|
94
|
+
result[canonical] = value;
|
|
95
|
+
changed = true;
|
|
96
|
+
} else {
|
|
97
|
+
changed = true;
|
|
98
|
+
}
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
result[key] = value;
|
|
102
|
+
}
|
|
103
|
+
return changed ? result : args;
|
|
104
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { redactSecretString } from "../../lib/redact";
|
|
2
|
+
|
|
3
|
+
const ABSOLUTE_PATH_PATTERN = /(?:\/Users\/[^ "';,]+|\/home\/[^ "';,]+|[A-Za-z]:\\Users\\[^ "';,]+)/g;
|
|
4
|
+
// Cursor error messages can contain raw credential key=value pairs beyond what the shared
|
|
5
|
+
// redactSecretString covers. We handle the additional transport-specific patterns locally.
|
|
6
|
+
const CURSOR_CREDENTIAL_PATTERN = /\b(authorization|auth[_-]?token|cursor[_-]?token)=([^&\s"',;]+)/gi;
|
|
7
|
+
|
|
8
|
+
function sanitize(value: string): string {
|
|
9
|
+
return redactSecretString(value)
|
|
10
|
+
.replace(CURSOR_CREDENTIAL_PATTERN, "$1=[REDACTED]")
|
|
11
|
+
.replace(ABSOLUTE_PATH_PATTERN, "[REDACTED_PATH]");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function errorMessage(value: unknown): string {
|
|
15
|
+
if (value instanceof Error) return value.message;
|
|
16
|
+
if (typeof value === "string") return value;
|
|
17
|
+
return String(value ?? "");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function errorCode(value: unknown): string {
|
|
21
|
+
if (typeof value !== "object" || !value || !("code" in value)) return "";
|
|
22
|
+
const code = (value as { code?: unknown }).code;
|
|
23
|
+
return code === undefined || code === null ? "" : String(code);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* True when Cursor intentionally cancelled the HTTP/2 stream after a client-tool suspend.
|
|
28
|
+
* These are expected between multi-turn Responses bridge cycles, not upstream failures.
|
|
29
|
+
*/
|
|
30
|
+
export function isCursorBenignCancelError(value: unknown): boolean {
|
|
31
|
+
const message = errorMessage(value).toLowerCase();
|
|
32
|
+
const code = errorCode(value).toUpperCase();
|
|
33
|
+
if (code === "NGHTTP2_CANCEL") return true;
|
|
34
|
+
if (message.includes("nghttp2_cancel")) return true;
|
|
35
|
+
if (message.includes("cursor stream suspended")) return true;
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* True when Cursor Connect rejected the turn with invalid_argument.
|
|
41
|
+
* Seen after stepCompleted on brittle external-model continuations.
|
|
42
|
+
*/
|
|
43
|
+
export function isCursorInvalidArgumentError(value: unknown): boolean {
|
|
44
|
+
const code = errorCode(value).toLowerCase();
|
|
45
|
+
if (code === "invalid_argument") return true;
|
|
46
|
+
const message = errorMessage(value).toLowerCase();
|
|
47
|
+
return message.includes("invalid_argument");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const QUOTA_RATE_CUES = ["too many requests", "quota", "rate limit", "rate-limit", "throttl"];
|
|
51
|
+
const REQUEST_TOO_LARGE_PATTERNS: (string | RegExp)[] = [
|
|
52
|
+
"tool catalog too large",
|
|
53
|
+
"tool registration too large",
|
|
54
|
+
"too many tools",
|
|
55
|
+
"message too large",
|
|
56
|
+
"payload too large",
|
|
57
|
+
"request too large",
|
|
58
|
+
// Size cue required somewhere: a bare "request exceeds ... limit" (concurrency/quota
|
|
59
|
+
// shape) must NOT match, but "request body/size exceeds ... limit" and
|
|
60
|
+
// "request exceeds maximum allowed size" are deterministic overflow (WP3 r1/r2).
|
|
61
|
+
/request exceeds .*size/,
|
|
62
|
+
/request (?:body|size) exceeds .*(?:size|limit)/,
|
|
63
|
+
"maximum allowed size",
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* True when a resource_exhausted detail names a request-size overflow rather than quota.
|
|
68
|
+
* Quota/rate cues are rejected FIRST: "resource_exhausted while loading tool catalog: quota
|
|
69
|
+
* exhausted" is rate limiting, not a too-large request, even though it mentions the catalog.
|
|
70
|
+
*/
|
|
71
|
+
export function isCursorRequestTooLargeDetail(lowerMessage: string): boolean {
|
|
72
|
+
if (QUOTA_RATE_CUES.some(cue => lowerMessage.includes(cue))) return false;
|
|
73
|
+
return REQUEST_TOO_LARGE_PATTERNS.some(pattern =>
|
|
74
|
+
typeof pattern === "string" ? lowerMessage.includes(pattern) : pattern.test(lowerMessage),
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Classify a Cursor transport/Connect/gRPC error message into an actionable category.
|
|
80
|
+
* The returned prefix string is recognized by `src/lib/errors.ts` `classifyError` keywords,
|
|
81
|
+
* so bridge-level error mapping produces the right Codex error type (rate_limit, auth, etc.).
|
|
82
|
+
*/
|
|
83
|
+
export function classifyCursorError(message: string): string {
|
|
84
|
+
const lower = message.toLowerCase();
|
|
85
|
+
|
|
86
|
+
if (isCursorBenignCancelError(message)) return "Cursor stream suspended";
|
|
87
|
+
|
|
88
|
+
if (
|
|
89
|
+
lower.includes("resource_exhausted") ||
|
|
90
|
+
lower.includes("resource exhausted")
|
|
91
|
+
) {
|
|
92
|
+
// gRPC RESOURCE_EXHAUSTED is quota/rate exhaustion unless the detail names a
|
|
93
|
+
// request-size overflow (tool catalog/registration). Only the latter is a
|
|
94
|
+
// client-fixable 400; everything else surfaces as a 429 so Codex backs off
|
|
95
|
+
// instead of hammering retries (live evidence: 6x 400 retry storm, devlog
|
|
96
|
+
// 260723_cursor_context_continuity/000_plan.md).
|
|
97
|
+
return isCursorRequestTooLargeDetail(lower)
|
|
98
|
+
? "Cursor resource limit exceeded"
|
|
99
|
+
: "Cursor rate limit exceeded";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (
|
|
103
|
+
lower.includes("rate limit") ||
|
|
104
|
+
lower.includes("rate-limit") ||
|
|
105
|
+
lower.includes("too many requests") ||
|
|
106
|
+
lower.includes("throttling")
|
|
107
|
+
) return "Cursor rate limit exceeded";
|
|
108
|
+
|
|
109
|
+
if (
|
|
110
|
+
lower.includes("unauthenticated") ||
|
|
111
|
+
lower.includes("unauthorized") ||
|
|
112
|
+
lower.includes("permission_denied") ||
|
|
113
|
+
lower.includes("permission denied") ||
|
|
114
|
+
lower.includes("forbidden") ||
|
|
115
|
+
lower.includes("invalid token") ||
|
|
116
|
+
lower.includes("expired token") ||
|
|
117
|
+
lower.includes("authentication") ||
|
|
118
|
+
lower.includes("access denied")
|
|
119
|
+
) return "Cursor authentication failed";
|
|
120
|
+
|
|
121
|
+
if (
|
|
122
|
+
lower.includes("unavailable") ||
|
|
123
|
+
lower.includes("overloaded") ||
|
|
124
|
+
lower.includes("temporarily") ||
|
|
125
|
+
lower.includes("server is busy")
|
|
126
|
+
) return "Cursor server overloaded";
|
|
127
|
+
|
|
128
|
+
if (
|
|
129
|
+
lower.includes("invalid") ||
|
|
130
|
+
lower.includes("not found") ||
|
|
131
|
+
lower.includes("unsupported") ||
|
|
132
|
+
lower.includes("malformed") ||
|
|
133
|
+
lower.includes("unimplemented")
|
|
134
|
+
) return "Cursor invalid request";
|
|
135
|
+
|
|
136
|
+
if (
|
|
137
|
+
lower.includes("timed out") ||
|
|
138
|
+
lower.includes("timeout") ||
|
|
139
|
+
lower.includes("etimedout") ||
|
|
140
|
+
lower.includes("deadline")
|
|
141
|
+
) return "Cursor request timed out";
|
|
142
|
+
|
|
143
|
+
if (
|
|
144
|
+
lower.includes("econnreset") ||
|
|
145
|
+
lower.includes("econnrefused") ||
|
|
146
|
+
lower.includes("goaway") ||
|
|
147
|
+
lower.includes("nghttp2") ||
|
|
148
|
+
lower.includes("socket hang up") ||
|
|
149
|
+
lower.includes("connection reset")
|
|
150
|
+
) return "Cursor connection failed";
|
|
151
|
+
|
|
152
|
+
return "Cursor upstream error";
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Produce a user-facing, secret-safe Cursor error message with an actionable category prefix.
|
|
157
|
+
* Mirrors `safeKiroErrorMessage` / `safeKiroHttpErrorMessage` in kiro-errors.ts.
|
|
158
|
+
*/
|
|
159
|
+
export function safeCursorErrorMessage(rawMessage: string): string {
|
|
160
|
+
const prefix = classifyCursorError(rawMessage);
|
|
161
|
+
const detail = sanitize(rawMessage)
|
|
162
|
+
.replace(/resource[_ ]exhausted/gi, "resource limit exceeded")
|
|
163
|
+
.slice(0, 500);
|
|
164
|
+
return detail ? `${prefix}: ${detail}` : prefix;
|
|
165
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CANONICAL_EFFORT_SUFFIXES,
|
|
3
|
+
cursorModelEffortLadder,
|
|
4
|
+
cursorWireModelIdWithEffort,
|
|
5
|
+
} from "./effort-map";
|
|
6
|
+
|
|
7
|
+
export interface CursorModelInfo {
|
|
8
|
+
id: string;
|
|
9
|
+
contextWindow?: number;
|
|
10
|
+
supportsReasoningEffort?: boolean;
|
|
11
|
+
inputModalities?: string[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const CURSOR_DEFAULT_CONTEXT_WINDOW = 128_000;
|
|
15
|
+
|
|
16
|
+
const CURSOR_REASONING_EFFORTS = ["low", "medium", "high"] as const;
|
|
17
|
+
const CURSOR_DEFAULT_INPUT_MODALITIES = ["text", "image"] as const;
|
|
18
|
+
const CONTEXT_1M = 1_000_000;
|
|
19
|
+
const CONTEXT_GEMINI = 1_048_576;
|
|
20
|
+
const CONTEXT_272K = 272_000;
|
|
21
|
+
const CONTEXT_262K = 262_144;
|
|
22
|
+
const CONTEXT_256K = 256_000;
|
|
23
|
+
const CONTEXT_200K = 200_000;
|
|
24
|
+
|
|
25
|
+
export function inferCursorContextWindow(modelId: string): number {
|
|
26
|
+
const id = modelId.trim().toLowerCase();
|
|
27
|
+
if (id.includes("1m")) return CONTEXT_1M;
|
|
28
|
+
if (id.startsWith("gemini-")) return CONTEXT_1M;
|
|
29
|
+
if (id === "glm-5.2") return CONTEXT_1M;
|
|
30
|
+
if (id.startsWith("gpt-5.6-")) return CONTEXT_1M;
|
|
31
|
+
if (id.startsWith("gpt-5") || id === "gpt-5-codex") return CONTEXT_272K;
|
|
32
|
+
if (id.startsWith("grok-4.5")) return 500_000;
|
|
33
|
+
if (id.startsWith("grok-")) return CONTEXT_256K;
|
|
34
|
+
if (id.includes("claude")) return CONTEXT_200K;
|
|
35
|
+
return CURSOR_DEFAULT_CONTEXT_WINDOW;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function normalizeInputModalities(input: string[] | undefined): string[] {
|
|
39
|
+
const values = (input ?? [...CURSOR_DEFAULT_INPUT_MODALITIES])
|
|
40
|
+
.map(item => item.trim())
|
|
41
|
+
.filter(Boolean);
|
|
42
|
+
return values.length > 0 ? [...new Set(values)] : [...CURSOR_DEFAULT_INPUT_MODALITIES];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function normalizeCursorModels(models: readonly CursorModelInfo[]): CursorModelInfo[] {
|
|
46
|
+
const byId = new Map<string, CursorModelInfo>();
|
|
47
|
+
for (const model of models) {
|
|
48
|
+
const id = model.id.trim();
|
|
49
|
+
if (!id || byId.has(id)) continue;
|
|
50
|
+
byId.set(id, {
|
|
51
|
+
id,
|
|
52
|
+
contextWindow: typeof model.contextWindow === "number" && model.contextWindow > 0
|
|
53
|
+
? model.contextWindow
|
|
54
|
+
: inferCursorContextWindow(id),
|
|
55
|
+
supportsReasoningEffort: model.supportsReasoningEffort === true,
|
|
56
|
+
inputModalities: normalizeInputModalities(model.inputModalities),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Strip the `cursor-` wire prefix that some Cursor GetUsableModels responses prepend to model ids
|
|
64
|
+
* (e.g. `cursor-grok-4.5-high` instead of `grok-4.5-high`). Applied at the comparison boundary
|
|
65
|
+
* so upstream wire ids stay verbatim everywhere else (issue #117).
|
|
66
|
+
*/
|
|
67
|
+
function stripCursorWirePrefix(id: string): string {
|
|
68
|
+
return id.startsWith("cursor-") ? id.slice("cursor-".length) : id;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* True when a configured Cursor base model should remain exposed after live GetUsableModels filtering.
|
|
73
|
+
* Live ids are full effort-suffixed variants (`claude-4.6-opus-high`); base ids match exactly, the
|
|
74
|
+
* ordinary `{base}-{effort}` form, or Cursor's current `{base-without-fast}-{effort}-fast` form.
|
|
75
|
+
*/
|
|
76
|
+
export function isCursorModelAvailableForAccount(modelId: string, liveIds: readonly string[]): boolean {
|
|
77
|
+
return liveIds.some(raw => {
|
|
78
|
+
const id = stripCursorWirePrefix(raw);
|
|
79
|
+
if (id === modelId) return true;
|
|
80
|
+
for (const effort of CANONICAL_EFFORT_SUFFIXES) {
|
|
81
|
+
if (
|
|
82
|
+
id === `${modelId}-${effort}` ||
|
|
83
|
+
id === cursorWireModelIdWithEffort(modelId, effort)
|
|
84
|
+
) return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Codex-facing id for Cursor's auto-router. Always kept in the catalog even when live discovery omits it. */
|
|
91
|
+
export const CURSOR_AUTO_MODEL_ID = "auto";
|
|
92
|
+
|
|
93
|
+
/** Cursor Router's public optimization modes (cost -> intelligence Pareto frontier). */
|
|
94
|
+
export const CURSOR_ROUTING_LEVELS = ["cost", "balance", "intelligence"] as const;
|
|
95
|
+
export type CursorRoutingLevel = typeof CURSOR_ROUTING_LEVELS[number];
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Codex cannot render Cursor's model-specific parameter control, so expose each optimization mode
|
|
99
|
+
* as a first-class routed model next to the backwards-compatible `cursor/auto` entry.
|
|
100
|
+
*/
|
|
101
|
+
export const CURSOR_ROUTER_MODEL_IDS = [
|
|
102
|
+
CURSOR_AUTO_MODEL_ID,
|
|
103
|
+
...CURSOR_ROUTING_LEVELS.map(level => `${CURSOR_AUTO_MODEL_ID}-${level}`),
|
|
104
|
+
] as const;
|
|
105
|
+
|
|
106
|
+
/** Wire id Cursor Connect expects for the auto-router (GetUsableModels returns `default`, not `auto`). */
|
|
107
|
+
export const CURSOR_AUTO_WIRE_MODEL_ID = "default";
|
|
108
|
+
|
|
109
|
+
export interface CursorWireModelSelection {
|
|
110
|
+
modelId: string;
|
|
111
|
+
routingLevel?: CursorRoutingLevel;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Resolve a Codex-facing model id into Cursor's wire model plus optional router parameter. */
|
|
115
|
+
export function cursorWireModelSelection(modelId: string): CursorWireModelSelection {
|
|
116
|
+
const normalized = modelId.startsWith("cursor/") ? modelId.slice("cursor/".length) : modelId;
|
|
117
|
+
if (normalized === CURSOR_AUTO_MODEL_ID) return { modelId: CURSOR_AUTO_WIRE_MODEL_ID };
|
|
118
|
+
const prefix = `${CURSOR_AUTO_MODEL_ID}-`;
|
|
119
|
+
if (normalized.startsWith(prefix)) {
|
|
120
|
+
const level = normalized.slice(prefix.length);
|
|
121
|
+
if ((CURSOR_ROUTING_LEVELS as readonly string[]).includes(level)) {
|
|
122
|
+
return { modelId: CURSOR_AUTO_WIRE_MODEL_ID, routingLevel: level as CursorRoutingLevel };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { modelId: normalized };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Map a Codex-facing Cursor model id to the upstream wire id. */
|
|
129
|
+
export function cursorCodexToWireModelId(modelId: string): string {
|
|
130
|
+
return cursorWireModelSelection(modelId).modelId;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Cursor-native wire models keep server-side conversation state reliably.
|
|
135
|
+
* External models (gpt/claude/gemini/grok families and similar) are more brittle on resumeAction.
|
|
136
|
+
*/
|
|
137
|
+
export function isCursorNativeWireModel(modelId: string): boolean {
|
|
138
|
+
const wire = cursorCodexToWireModelId(modelId).trim().toLowerCase();
|
|
139
|
+
const bare = stripCursorEffortSuffix(wire);
|
|
140
|
+
if (bare === CURSOR_AUTO_WIRE_MODEL_ID || bare === CURSOR_AUTO_MODEL_ID) return true;
|
|
141
|
+
return bare.startsWith("composer-");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Inverse of {@link isCursorNativeWireModel}. */
|
|
145
|
+
export function isCursorExternalWireModel(modelId: string): boolean {
|
|
146
|
+
return !isCursorNativeWireModel(modelId);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function stripCursorEffortSuffix(wireModelId: string): string {
|
|
150
|
+
const suffixes = [...CANONICAL_EFFORT_SUFFIXES].sort((a, b) => b.length - a.length);
|
|
151
|
+
for (const suffix of suffixes) {
|
|
152
|
+
const marker = `-${suffix}`;
|
|
153
|
+
if (wireModelId.endsWith(marker)) return wireModelId.slice(0, -marker.length);
|
|
154
|
+
}
|
|
155
|
+
return wireModelId;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function isCursorRouterModelId(modelId: string): boolean {
|
|
159
|
+
return (CURSOR_ROUTER_MODEL_IDS as readonly string[]).includes(modelId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Filter the static Cursor seed to models this account can use. */
|
|
163
|
+
export function filterCursorConfiguredModelsByLiveDiscovery<T extends { id: string }>(
|
|
164
|
+
configured: readonly T[],
|
|
165
|
+
liveIds: readonly string[],
|
|
166
|
+
): T[] {
|
|
167
|
+
return configured.filter(model =>
|
|
168
|
+
isCursorRouterModelId(model.id) || isCursorModelAvailableForAccount(model.id, liveIds),
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorModels([
|
|
173
|
+
// Context windows and the model lineup mirror Cursor's public models/pricing docs plus the jawcode
|
|
174
|
+
// SOT (../jawcode/packages/ai/src/models.json, `cursor` provider), which mirrors the real
|
|
175
|
+
// GetUsableModels catalog. Live discovery is the preferred path when logged in; these ids seed the
|
|
176
|
+
// routed Codex catalog and provide a static fallback. Cursor base ids carry no effort suffix here —
|
|
177
|
+
// the request builder appends the per-model suffix (see effort-map.ts) and reasoning models
|
|
178
|
+
// advertise effort so Codex exposes the tier picker. `supportsReasoningEffort` tracks whether the
|
|
179
|
+
// model has *selectable effort tiers* (CURSOR_MODEL_EFFORT_TIERS), NOT merely whether it reasons:
|
|
180
|
+
// gemini/grok/kimi-k2.7/gpt-5-mini are reasoning models in the SOT but are sent bare (no tier picker).
|
|
181
|
+
...CURSOR_ROUTER_MODEL_IDS.map(id => ({ id, contextWindow: CONTEXT_200K, supportsReasoningEffort: false })),
|
|
182
|
+
|
|
183
|
+
{ id: "claude-sonnet-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
184
|
+
{ id: "claude-4-sonnet", contextWindow: CONTEXT_200K },
|
|
185
|
+
{ id: "claude-4-sonnet-1m", contextWindow: CONTEXT_1M },
|
|
186
|
+
{ id: "claude-4.5-haiku", contextWindow: CONTEXT_200K },
|
|
187
|
+
{ id: "claude-4.5-sonnet", contextWindow: CONTEXT_200K },
|
|
188
|
+
{ id: "claude-4.5-opus", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
189
|
+
{ id: "claude-4.6-opus", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
190
|
+
{ id: "claude-4.6-sonnet", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
191
|
+
{ id: "claude-opus-4-7", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
192
|
+
// opus-4-7-fast: effort-suffix tiers unverified -> no tier picker; sent bare like live-only ids.
|
|
193
|
+
{ id: "claude-opus-4-7-fast", contextWindow: CONTEXT_200K },
|
|
194
|
+
{ id: "claude-opus-4-8", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
195
|
+
{ id: "claude-opus-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
196
|
+
{ id: "claude-fable-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
197
|
+
|
|
198
|
+
{ id: "composer-1", contextWindow: CONTEXT_200K },
|
|
199
|
+
{ id: "composer-2.5", contextWindow: CONTEXT_200K },
|
|
200
|
+
{ id: "composer-2.5-fast", contextWindow: CONTEXT_200K },
|
|
201
|
+
|
|
202
|
+
{ id: "gemini-2.5-flash", contextWindow: CONTEXT_GEMINI },
|
|
203
|
+
{ id: "gemini-3-flash", contextWindow: CONTEXT_GEMINI },
|
|
204
|
+
{ id: "gemini-3-pro", contextWindow: CONTEXT_GEMINI },
|
|
205
|
+
{ id: "gemini-3-pro-image-preview", contextWindow: CONTEXT_200K },
|
|
206
|
+
{ id: "gemini-3.1-pro", contextWindow: CONTEXT_GEMINI },
|
|
207
|
+
{ id: "gemini-3.5-flash", contextWindow: CONTEXT_200K },
|
|
208
|
+
|
|
209
|
+
{ id: "gpt-5-codex", contextWindow: CONTEXT_272K },
|
|
210
|
+
{ id: "gpt-5-fast", contextWindow: CONTEXT_272K },
|
|
211
|
+
{ id: "gpt-5-mini", contextWindow: CONTEXT_272K },
|
|
212
|
+
{ id: "gpt-5.1", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
213
|
+
{ id: "gpt-5.1-codex", contextWindow: CONTEXT_272K },
|
|
214
|
+
{ id: "gpt-5.1-codex-max", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
215
|
+
{ id: "gpt-5.1-codex-mini", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
216
|
+
{ id: "gpt-5.2", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
217
|
+
{ id: "gpt-5.2-codex", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
218
|
+
{ id: "gpt-5.3-codex", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
219
|
+
{ id: "gpt-5.4", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
220
|
+
{ id: "gpt-5.4-mini", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
221
|
+
{ id: "gpt-5.4-nano", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
222
|
+
{ id: "gpt-5.5", contextWindow: CONTEXT_272K, supportsReasoningEffort: true },
|
|
223
|
+
// gpt-5.5-extra: absent from cursor.com docs but SURVIVES the live GetUsableModels filter
|
|
224
|
+
// (account-verified 260709, devlog/model_update/260709_model_refresh/004_live_snapshot.md).
|
|
225
|
+
{ id: "gpt-5.5-extra", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
|
|
226
|
+
{ id: "gpt-5.6-sol", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
|
|
227
|
+
{ id: "gpt-5.6-terra", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
|
|
228
|
+
{ id: "gpt-5.6-luna", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
|
|
229
|
+
|
|
230
|
+
// 260709 refresh: stale grok/composer/kimi/gpt ids dropped per current cursor.com docs; the
|
|
231
|
+
// 260709 note: grok-4.5 was deferred; confirmed live 260708 (cursor.com/models, xAI launch).
|
|
232
|
+
|
|
233
|
+
// Conflict resolution (260709): keep the refreshed 1M context + kimi-k2.7-code from de12fc8,
|
|
234
|
+
// take PR #73's supportsReasoningEffort for glm-5.2 (its effort-map tiers landed with the PR).
|
|
235
|
+
{ id: "glm-5.2", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
|
|
236
|
+
{ id: "kimi-k2.7-code", contextWindow: CONTEXT_262K },
|
|
237
|
+
// kimi-k3: cursor.com/docs/models/kimi-k3; account-verified via GetUsableModels (2026-07-28) —
|
|
238
|
+
// ships only as effort-suffixed kimi-k3-{low,high,max}, so the tier picker is exposed.
|
|
239
|
+
{ id: "kimi-k3", contextWindow: CONTEXT_262K, supportsReasoningEffort: true },
|
|
240
|
+
|
|
241
|
+
{ id: "grok-4.5", contextWindow: 500_000, supportsReasoningEffort: true },
|
|
242
|
+
{ id: "grok-4.5-fast", contextWindow: 500_000, supportsReasoningEffort: true },
|
|
243
|
+
]);
|
|
244
|
+
|
|
245
|
+
export function cursorModelIds(models: readonly CursorModelInfo[] = CURSOR_STATIC_MODELS): string[] {
|
|
246
|
+
return normalizeCursorModels(models).map(model => model.id);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function cursorModelContextWindows(
|
|
250
|
+
models: readonly CursorModelInfo[] = CURSOR_STATIC_MODELS,
|
|
251
|
+
): Record<string, number> {
|
|
252
|
+
return Object.fromEntries(
|
|
253
|
+
normalizeCursorModels(models).map(model => [model.id, model.contextWindow ?? inferCursorContextWindow(model.id)]),
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function cursorModelInputModalities(
|
|
258
|
+
models: readonly CursorModelInfo[] = CURSOR_STATIC_MODELS,
|
|
259
|
+
): Record<string, string[]> {
|
|
260
|
+
return Object.fromEntries(
|
|
261
|
+
normalizeCursorModels(models).map(model => [model.id, normalizeInputModalities(model.inputModalities)]),
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function cursorModelReasoningEfforts(
|
|
266
|
+
models: readonly CursorModelInfo[] = CURSOR_STATIC_MODELS,
|
|
267
|
+
): Record<string, string[]> {
|
|
268
|
+
return Object.fromEntries(
|
|
269
|
+
normalizeCursorModels(models).map(model => [
|
|
270
|
+
model.id,
|
|
271
|
+
model.supportsReasoningEffort === true
|
|
272
|
+
? cursorModelEffortLadder(model.id) ?? []
|
|
273
|
+
: [],
|
|
274
|
+
]),
|
|
275
|
+
);
|
|
276
|
+
}
|