@yansigit/opencodex 2.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/LICENSE +21 -0
- package/README.md +303 -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 +587 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
- package/gui/dist/assets/index-CGoDO3uO.css +1 -0
- package/gui/dist/favicon.png +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 +108 -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-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +1327 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +121 -0
- package/src/adapters/client-fingerprint.ts +65 -0
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +288 -0
- package/src/adapters/cursor/discovery.ts +333 -0
- package/src/adapters/cursor/effort-map.ts +151 -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/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/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +269 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1653 -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 +76 -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 +547 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +663 -0
- package/src/adapters/cursor/protobuf-events.ts +1381 -0
- package/src/adapters/cursor/protobuf-request.ts +1032 -0
- package/src/adapters/cursor/request-builder.ts +461 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +735 -0
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +79 -0
- package/src/adapters/cursor/types.ts +79 -0
- package/src/adapters/cursor.ts +322 -0
- package/src/adapters/google-antigravity-hosts.ts +48 -0
- package/src/adapters/google-antigravity-replay.ts +827 -0
- package/src/adapters/google-antigravity-tools.ts +105 -0
- package/src/adapters/google-antigravity-wire.ts +141 -0
- package/src/adapters/google-errors.ts +92 -0
- package/src/adapters/google-http.ts +460 -0
- package/src/adapters/google-tool-schema.ts +238 -0
- package/src/adapters/google-truncation.ts +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +1377 -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 +112 -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 +1936 -0
- package/src/adapters/mimo-free.ts +280 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1980 -0
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1911 -0
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +154 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +1986 -0
- package/src/chat/inbound.ts +319 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +266 -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 +205 -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 +615 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +107 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +578 -0
- package/src/claude/model-info.ts +174 -0
- package/src/claude/outbound.ts +926 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +302 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +737 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +299 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +290 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +213 -0
- package/src/cli/claude.ts +355 -0
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +47 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +127 -0
- package/src/cli/config-command.ts +209 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/dispatch.ts +585 -0
- package/src/cli/doctor.ts +1202 -0
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +213 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +973 -0
- package/src/cli/init.ts +211 -0
- package/src/cli/integrations.ts +260 -0
- package/src/cli/interactive-confirm.ts +133 -0
- 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 +245 -0
- package/src/cli/models.ts +422 -0
- package/src/cli/observe.ts +206 -0
- package/src/cli/opencode.ts +588 -0
- package/src/cli/provider-replit.ts +232 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +492 -0
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +422 -0
- package/src/cli/replit-gateway-key-input.ts +138 -0
- package/src/cli/root.ts +86 -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 +328 -0
- package/src/cli/system-command.ts +112 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +199 -0
- package/src/cli/v2.ts +268 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1704 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +47 -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 +544 -0
- package/src/codex/account-usability.ts +43 -0
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/agent-roles-sync.ts +225 -0
- package/src/codex/agent-roles.ts +238 -0
- package/src/codex/app-server-processes.ts +1143 -0
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +2147 -0
- package/src/codex/auth-collision.ts +109 -0
- package/src/codex/auth-context.ts +665 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +436 -0
- package/src/codex/catalog/bundled.ts +549 -0
- package/src/codex/catalog/effort.ts +446 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +664 -0
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +650 -0
- package/src/codex/catalog/provider-fetch.ts +2064 -0
- package/src/codex/catalog/sync.ts +1883 -0
- 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 +14 -0
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/data/upstream-models.json +830 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1566 -0
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +108 -0
- package/src/codex/history-provider.ts +979 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1733 -0
- package/src/codex/injected-marker.ts +106 -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 +80 -0
- package/src/codex/journal.ts +225 -0
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +56 -0
- package/src/codex/main-account.ts +68 -0
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +273 -0
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +144 -0
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +425 -0
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +573 -0
- package/src/codex/refresh.ts +62 -0
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +1888 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +2170 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +784 -0
- package/src/codex/sync.ts +319 -0
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +298 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +160 -0
- package/src/combos/index.ts +45 -0
- package/src/combos/request.ts +94 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +398 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +4041 -0
- package/src/fork/register.ts +3 -0
- package/src/generated/compatibility-version.json +3116 -0
- package/src/generated/model-metadata.ts +106 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +530 -0
- package/src/grok/inspect.ts +45 -0
- package/src/grok/status.ts +121 -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 +955 -0
- package/src/images/plan.ts +143 -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 +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/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 +195 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +346 -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 +130 -0
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +364 -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 +380 -0
- package/src/lib/errors.ts +406 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -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/open-url.ts +25 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +270 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-outbound.ts +210 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +521 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +61 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +119 -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 +90 -0
- package/src/lib/token-estimate.ts +86 -0
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +400 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +392 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-atomic-replace.ts +156 -0
- package/src/lib/windows-elevation.ts +773 -0
- package/src/lib/windows-secret-acl.ts +854 -0
- 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 +403 -0
- 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-routing.ts +594 -0
- package/src/oauth/anthropic.ts +188 -0
- package/src/oauth/antigravity-routing.ts +151 -0
- package/src/oauth/callback-server.ts +300 -0
- package/src/oauth/chatgpt.ts +161 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +252 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +262 -0
- package/src/oauth/health.ts +407 -0
- package/src/oauth/index.ts +1504 -0
- package/src/oauth/key-providers.ts +124 -0
- package/src/oauth/kimi.ts +227 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -0
- package/src/oauth/local-token-detect.ts +130 -0
- package/src/oauth/log.ts +50 -0
- package/src/oauth/login-cli.ts +223 -0
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +728 -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 +695 -0
- package/src/providers/antigravity-quota.ts +216 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +74 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +82 -0
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +586 -0
- package/src/providers/fastwire.ts +501 -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 +449 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +243 -0
- package/src/providers/openai-tier-startup.ts +56 -0
- package/src/providers/openai-tiers.ts +423 -0
- package/src/providers/openai-virtual-models.ts +83 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +185 -0
- package/src/providers/quota.ts +2345 -0
- package/src/providers/registry.ts +2918 -0
- package/src/providers/replit/constants.ts +27 -0
- package/src/providers/replit/derive.ts +85 -0
- package/src/providers/replit/headers.ts +28 -0
- package/src/providers/replit/origin.ts +55 -0
- package/src/providers/replit/pair-install-response.ts +72 -0
- package/src/providers/replit/probe.ts +199 -0
- package/src/providers/replit/setup.ts +350 -0
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +103 -0
- 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 +148 -0
- package/src/reasoning-effort.ts +183 -0
- package/src/responses/compaction.ts +142 -0
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +838 -0
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +165 -0
- package/src/responses/spill-store.ts +459 -0
- package/src/responses/state.ts +1433 -0
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +761 -0
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +53 -0
- package/src/server/auth-cors.ts +751 -0
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +442 -0
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +1030 -0
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +190 -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 +568 -0
- package/src/server/index.ts +1813 -0
- package/src/server/lifecycle.ts +498 -0
- package/src/server/live.ts +717 -0
- 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 +1433 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +193 -0
- package/src/server/management/body.ts +41 -0
- package/src/server/management/combo-routes.ts +263 -0
- package/src/server/management/config-routes.ts +835 -0
- package/src/server/management/context.ts +113 -0
- 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 +586 -0
- package/src/server/management/model-routes.ts +560 -0
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +637 -0
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +1033 -0
- package/src/server/management/replit-provider-routes.ts +86 -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 +385 -0
- package/src/server/management/shared.ts +286 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- 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 +435 -0
- package/src/server/management/system-routes.ts +194 -0
- package/src/server/management/usage-summary-cache.ts +94 -0
- 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 +314 -0
- package/src/server/management-auth.ts +482 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +328 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1209 -0
- package/src/server/request-decompress.ts +239 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1259 -0
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +551 -0
- package/src/server/responses/compact.ts +771 -0
- package/src/server/responses/core.ts +5389 -0
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +331 -0
- package/src/server/responses/fetch-helpers.ts +232 -0
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +251 -0
- package/src/server/responses/upstream-error.ts +53 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -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 +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +25 -0
- package/src/server/search.ts +201 -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 +315 -0
- package/src/server/startup-health-cache.ts +131 -0
- package/src/server/system-env.ts +484 -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 +472 -0
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +3575 -0
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -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 +757 -0
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +876 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +106 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +415 -0
- package/src/update/job.ts +1887 -0
- package/src/update/notify.ts +263 -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/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -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 +625 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +416 -0
- package/src/usage/log.ts +1223 -0
- package/src/usage/summary.ts +753 -0
- package/src/usage/totals.ts +14 -0
- 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 +189 -0
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +131 -0
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +681 -0
- 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 +195 -0
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +113 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +331 -0
- package/src/web-search/loop.ts +896 -0
- package/src/web-search/parse.ts +315 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/synthetic-tool.ts +47 -0
- package/src/web-search/xai-executor.ts +219 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import type {
|
|
3
|
+
OcxAssistantContentPart,
|
|
4
|
+
OcxContentPart,
|
|
5
|
+
OcxMessage,
|
|
6
|
+
OcxParsedRequest,
|
|
7
|
+
OcxToolCall,
|
|
8
|
+
OcxToolResultMessage,
|
|
9
|
+
} from "../../types";
|
|
10
|
+
import { isAllowedToolChoice, namespacedToolName, toolChoiceAliases, type OcxTool, type OcxToolChoice } from "../../types";
|
|
11
|
+
import type { CursorRequestMessage, CursorRequestedModelParameter, CursorRunRequest } from "./types";
|
|
12
|
+
import { cursorCheckpointModelAffinityId, cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
|
|
13
|
+
import { cursorEffortSuffix, cursorRequestWireModelIdWithEffort } from "./effort-map";
|
|
14
|
+
import {
|
|
15
|
+
cursorMcpToolEncodedSize,
|
|
16
|
+
cursorMcpToolsEncodedSize,
|
|
17
|
+
cursorToolAllowedByChoice,
|
|
18
|
+
cursorToolChoiceAliases,
|
|
19
|
+
cursorStructuredEditTools,
|
|
20
|
+
cursorToolWireName,
|
|
21
|
+
cursorToolsForActivePrompt,
|
|
22
|
+
isCursorStructuredEditToolName,
|
|
23
|
+
isBareCodexShellBridgeTool,
|
|
24
|
+
isCursorExecutionPathTool,
|
|
25
|
+
isCursorWaitTool,
|
|
26
|
+
} from "./tool-definitions";
|
|
27
|
+
import { lookupCursorThreadConversation } from "./thread-continuity";
|
|
28
|
+
import {
|
|
29
|
+
getCursorCheckpoint,
|
|
30
|
+
getCursorCheckpointForPrefix,
|
|
31
|
+
type CursorCheckpointInvalidationReason,
|
|
32
|
+
type CursorCheckpointSnapshot,
|
|
33
|
+
} from "./checkpoint-store";
|
|
34
|
+
import { extractCursorImageUrls } from "./images";
|
|
35
|
+
|
|
36
|
+
/** Probe-verified Cursor Connect boundaries, with byte headroom for the enclosing field. */
|
|
37
|
+
export const CURSOR_TOOL_COUNT_LIMIT = 330;
|
|
38
|
+
export const CURSOR_TOOL_BYTES_LIMIT = 120_000;
|
|
39
|
+
|
|
40
|
+
interface CursorToolBudgetResult {
|
|
41
|
+
tools: OcxTool[];
|
|
42
|
+
omitted: OcxTool[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function explicitlySelectedNames(choice: OcxToolChoice | undefined): Set<string> {
|
|
46
|
+
if (!choice || choice === "auto" || choice === "none" || choice === "required") return new Set();
|
|
47
|
+
return new Set("name" in choice ? [choice.name] : isAllowedToolChoice(choice) ? choice.allowedTools : []);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function toolPriority(tool: OcxTool, selectedNames: ReadonlySet<string>): number {
|
|
51
|
+
// Execution path (bare or opencodex-responses `exec` / `exec_command` / `shell_command`)
|
|
52
|
+
// outranks filler so a crowded catalog cannot drop the Codex shell bridge (#399).
|
|
53
|
+
if (isCursorExecutionPathTool(tool)) return 0;
|
|
54
|
+
if (isBareCodexShellBridgeTool(tool)) return 0;
|
|
55
|
+
// `wait` only resumes a yielded exec cell. Keep it with the execution path, but after
|
|
56
|
+
// `exec` itself so a large wait schema cannot starve the tool that creates the cell.
|
|
57
|
+
if (isCursorWaitTool(tool)) return 1;
|
|
58
|
+
if (!tool.namespace && tool.name === "apply_patch") return 2;
|
|
59
|
+
// Structured edit tools convert to apply_patch on the return path, so they must survive the
|
|
60
|
+
// same byte/count truncation as the freeform tool they stand in for (#1017).
|
|
61
|
+
if (!tool.namespace && isCursorStructuredEditToolName(tool.name)) return 2;
|
|
62
|
+
if (cursorToolChoiceAliases(tool).some(name => selectedNames.has(name))) return 3;
|
|
63
|
+
if (tool.loadedFromToolSearch) return 4;
|
|
64
|
+
if (!tool.namespace) return 5;
|
|
65
|
+
return 6;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function isPinnedCursorTool(tool: OcxTool, selectedNames: ReadonlySet<string>): boolean {
|
|
69
|
+
return toolPriority(tool, selectedNames) <= 3;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Select one catalog used by both Cursor protobuf registration and call recognition.
|
|
74
|
+
* Actual McpTools serialization is measured after every candidate so descriptions,
|
|
75
|
+
* names, provider identifiers, and schemas all count toward the byte ceiling.
|
|
76
|
+
*/
|
|
77
|
+
export function applyCursorToolBudget(
|
|
78
|
+
tools: readonly OcxTool[] | undefined,
|
|
79
|
+
toolChoice: OcxToolChoice | undefined,
|
|
80
|
+
): CursorToolBudgetResult {
|
|
81
|
+
const catalog = tools ?? [];
|
|
82
|
+
const baseEligible = catalog.filter(tool => cursorToolAllowedByChoice(tool, toolChoice, catalog));
|
|
83
|
+
// Synthetic structured edit tools ride along with the freeform apply_patch tool (#1017). They are
|
|
84
|
+
// part of the advertised catalog, so their serialized size counts toward the byte ceiling here.
|
|
85
|
+
const synthetic = cursorStructuredEditTools(catalog, toolChoice);
|
|
86
|
+
const eligible = [...baseEligible, ...synthetic];
|
|
87
|
+
if (
|
|
88
|
+
eligible.length <= CURSOR_TOOL_COUNT_LIMIT
|
|
89
|
+
&& cursorMcpToolsEncodedSize(eligible, toolChoice) <= CURSOR_TOOL_BYTES_LIMIT
|
|
90
|
+
) return { tools: [...eligible], omitted: [] };
|
|
91
|
+
|
|
92
|
+
const selectedNames = explicitlySelectedNames(toolChoice);
|
|
93
|
+
const candidates = eligible
|
|
94
|
+
.map((tool, index) => ({ tool, index, priority: toolPriority(tool, selectedNames) }))
|
|
95
|
+
.sort((a, b) => a.priority - b.priority || a.index - b.index);
|
|
96
|
+
const kept: OcxTool[] = [];
|
|
97
|
+
const keptSet = new Set<OcxTool>();
|
|
98
|
+
let keptBytes = 0;
|
|
99
|
+
|
|
100
|
+
const tryKeep = (tool: OcxTool): boolean => {
|
|
101
|
+
if (keptSet.has(tool) || kept.length >= CURSOR_TOOL_COUNT_LIMIT) return keptSet.has(tool);
|
|
102
|
+
// Repeated protobuf message fields serialize as concatenated tag/length/value entries,
|
|
103
|
+
// so each one-entry wrapper size is the exact additive contribution to McpTools.
|
|
104
|
+
const candidateBytes = cursorMcpToolEncodedSize(tool, toolChoice);
|
|
105
|
+
if (keptBytes + candidateBytes > CURSOR_TOOL_BYTES_LIMIT) return false;
|
|
106
|
+
kept.push(tool);
|
|
107
|
+
keptSet.add(tool);
|
|
108
|
+
keptBytes += candidateBytes;
|
|
109
|
+
return true;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Phase 1: selected tools + execution path + apply_patch (priority <= 3).
|
|
113
|
+
// Pins are admitted before filler so a crowded catalog cannot drop the Codex execution path (#399).
|
|
114
|
+
for (const candidate of candidates) {
|
|
115
|
+
if (!isPinnedCursorTool(candidate.tool, selectedNames)) continue;
|
|
116
|
+
tryKeep(candidate.tool);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Phase 2: remaining tools by priority.
|
|
120
|
+
for (const candidate of candidates) {
|
|
121
|
+
tryKeep(candidate.tool);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const evictNonExecutionPath = (needBytes: number): void => {
|
|
125
|
+
for (let i = kept.length - 1; i >= 0; i--) {
|
|
126
|
+
const occupant = kept[i];
|
|
127
|
+
if (!occupant || isCursorExecutionPathTool(occupant)) continue;
|
|
128
|
+
kept.splice(i, 1);
|
|
129
|
+
keptSet.delete(occupant);
|
|
130
|
+
keptBytes -= cursorMcpToolEncodedSize(occupant, toolChoice);
|
|
131
|
+
if (kept.length < CURSOR_TOOL_COUNT_LIMIT && keptBytes + needBytes <= CURSOR_TOOL_BYTES_LIMIT) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Force-admit at least one execution-path tool when one was eligible. Priority-0
|
|
138
|
+
// admission can still fail if the tool itself is larger than leftover room after
|
|
139
|
+
// earlier same-priority pins; evict wait/patch/filler rather than ship wait-only.
|
|
140
|
+
for (const tool of eligible) {
|
|
141
|
+
if (!isCursorExecutionPathTool(tool) || keptSet.has(tool)) continue;
|
|
142
|
+
const need = cursorMcpToolEncodedSize(tool, toolChoice);
|
|
143
|
+
if (need > CURSOR_TOOL_BYTES_LIMIT) continue;
|
|
144
|
+
evictNonExecutionPath(need);
|
|
145
|
+
tryKeep(tool);
|
|
146
|
+
if (keptSet.has(tool)) break;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const eligibleHasExecutionPath = eligible.some(isCursorExecutionPathTool);
|
|
150
|
+
const keptHasExecutionPath = eligible.some(tool => keptSet.has(tool) && isCursorExecutionPathTool(tool));
|
|
151
|
+
// Never advertise `wait` after dropping the tool that creates the exec cell.
|
|
152
|
+
if (eligibleHasExecutionPath && !keptHasExecutionPath) {
|
|
153
|
+
for (const tool of eligible) {
|
|
154
|
+
if (!isCursorWaitTool(tool) || !keptSet.has(tool)) continue;
|
|
155
|
+
keptSet.delete(tool);
|
|
156
|
+
const index = kept.indexOf(tool);
|
|
157
|
+
if (index >= 0) kept.splice(index, 1);
|
|
158
|
+
keptBytes -= cursorMcpToolEncodedSize(tool, toolChoice);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
tools: eligible.filter(tool => keptSet.has(tool)),
|
|
164
|
+
// Synthetic tools are pinned in phase 1 and never reported as omitted; the note counts only
|
|
165
|
+
// tools the client itself requested.
|
|
166
|
+
omitted: baseEligible.filter(tool => !keptSet.has(tool)),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function catalogLimitNote(kept: readonly OcxTool[], omitted: readonly OcxTool[]): string | undefined {
|
|
171
|
+
if (omitted.length === 0) return undefined;
|
|
172
|
+
const recoverable = kept.some(tool => tool.toolSearch || cursorToolWireName(tool) === "tool_search");
|
|
173
|
+
const names = omitted.slice(0, 12).map(cursorToolWireName);
|
|
174
|
+
const remainder = omitted.length - names.length;
|
|
175
|
+
const omittedSummary = `${names.join(", ")}${remainder > 0 ? `, and ${remainder} more` : ""}`;
|
|
176
|
+
return recoverable
|
|
177
|
+
? `[opencodex] Cursor's transport limit allows ${kept.length} of ${kept.length + omitted.length} client tools this turn. Omitted: ${omittedSummary}. Use tool_search for a needed omitted tool; tools returned by tool_search are prioritized on the next turn.`
|
|
178
|
+
: `[opencodex] Cursor's transport limit allows ${kept.length} of ${kept.length + omitted.length} client tools this turn. Omitted and unavailable this turn: ${omittedSummary}.`;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Resolve a `cursor/<model>` selection + Codex reasoning effort to Cursor's requested model shape.
|
|
183
|
+
* Most models encode effort in a flat id (`claude-4.6-opus-high`). Grok Fast is parameterized
|
|
184
|
+
* instead: current Cursor clients send the matching Grok base id plus `effort` and `fast` parameters.
|
|
185
|
+
* A fully-qualified id (one that is not a known effort base) passes through unchanged.
|
|
186
|
+
*/
|
|
187
|
+
function normalizeCursorModelId(modelId: string, reasoning?: string): {
|
|
188
|
+
modelId: string;
|
|
189
|
+
requestedModelParameters?: readonly CursorRequestedModelParameter[];
|
|
190
|
+
routingLevel?: CursorRoutingLevel;
|
|
191
|
+
} {
|
|
192
|
+
const selection = cursorWireModelSelection(modelId);
|
|
193
|
+
const id = selection.modelId;
|
|
194
|
+
const suffix = cursorEffortSuffix(id, reasoning);
|
|
195
|
+
if ((id === "grok-4.5-fast" || id === "grok-4.6-fast") && suffix) {
|
|
196
|
+
return {
|
|
197
|
+
...selection,
|
|
198
|
+
modelId: id.slice(0, -"-fast".length),
|
|
199
|
+
requestedModelParameters: [
|
|
200
|
+
{ id: "effort", value: suffix },
|
|
201
|
+
{ id: "fast", value: "true" },
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return { ...selection, modelId: suffix ? cursorRequestWireModelIdWithEffort(id, suffix) : id };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): string | undefined {
|
|
209
|
+
switch (part.type) {
|
|
210
|
+
case "text":
|
|
211
|
+
return part.text;
|
|
212
|
+
case "thinking":
|
|
213
|
+
return part.thinking;
|
|
214
|
+
case "image":
|
|
215
|
+
// Images ride UserMessage.selected_context (SelectedImage) instead of text.
|
|
216
|
+
return undefined;
|
|
217
|
+
case "toolCall":
|
|
218
|
+
// Cursor does not accept OpenAI Responses assistant tool-call parts as native history here.
|
|
219
|
+
// Rendering them as visible "[tool_call]" text leaks synthetic protocol markers back into
|
|
220
|
+
// model output and can halt multi-tool continuations. The paired tool result carries the
|
|
221
|
+
// call id/name/output Cursor needs for the next action.
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function toolResultToText(message: OcxToolResultMessage): string {
|
|
227
|
+
return [
|
|
228
|
+
"[tool_result]",
|
|
229
|
+
`call_id: ${message.toolCallId}`,
|
|
230
|
+
`name: ${namespacedToolName(message.toolNamespace, message.toolName)}`,
|
|
231
|
+
`is_error: ${message.isError}`,
|
|
232
|
+
"output:",
|
|
233
|
+
contentToText(message.content),
|
|
234
|
+
].join("\n");
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function contentToText(content: string | readonly (OcxContentPart | OcxAssistantContentPart)[]): string {
|
|
238
|
+
if (typeof content === "string") return content;
|
|
239
|
+
return content
|
|
240
|
+
.map(contentPartToText)
|
|
241
|
+
.filter((value): value is string => typeof value === "string" && value.length > 0)
|
|
242
|
+
.join("\n");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
|
|
246
|
+
switch (message.role) {
|
|
247
|
+
case "user":
|
|
248
|
+
case "developer":
|
|
249
|
+
{
|
|
250
|
+
const content = contentToText(message.content);
|
|
251
|
+
// Image-only turns survive as empty content; the encoder keeps them userMessageAction.
|
|
252
|
+
if (content.length === 0 && extractCursorImageUrls(message.content).length === 0) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
return { role: message.role, content };
|
|
256
|
+
}
|
|
257
|
+
case "assistant":
|
|
258
|
+
{
|
|
259
|
+
const content = contentToText(message.content);
|
|
260
|
+
return content.length > 0 ? { role: "assistant", content } : undefined;
|
|
261
|
+
}
|
|
262
|
+
case "toolResult":
|
|
263
|
+
return {
|
|
264
|
+
role: "tool",
|
|
265
|
+
content: toolResultToText(message),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Rebuild the text `messages` channel from prepared `rawMessages` so omission markers
|
|
272
|
+
* and JPEG-rewritten parts stay visible to activePromptText after image preparation.
|
|
273
|
+
*/
|
|
274
|
+
export function cursorRequestMessagesFromRaw(
|
|
275
|
+
messages: readonly OcxMessage[] | undefined,
|
|
276
|
+
): CursorRequestMessage[] {
|
|
277
|
+
if (!messages?.length) return [];
|
|
278
|
+
return messages
|
|
279
|
+
.map(requestMessage)
|
|
280
|
+
.filter((message): message is CursorRequestMessage => !!message);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export function generatedCursorConversationId(): string {
|
|
284
|
+
return `cursor_${crypto.randomUUID().replace(/-/g, "")}`;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** Derive an opaque provider-scoped Cursor id from the upstream client's conversation identity. */
|
|
288
|
+
export function cursorConversationIdFromClientThread(threadId: string, identityScope?: string): string {
|
|
289
|
+
const digest = createHash("sha256")
|
|
290
|
+
.update("ocx:cursor:thread:")
|
|
291
|
+
.update(identityScope?.trim() || "local")
|
|
292
|
+
.update("\0")
|
|
293
|
+
.update(threadId)
|
|
294
|
+
.digest("hex")
|
|
295
|
+
.slice(0, 32);
|
|
296
|
+
return `cursor_${digest}`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Resolve the Cursor conversation id for this turn.
|
|
301
|
+
* Priority: force-fresh → isolate helper → remembered → thread override → client thread → random.
|
|
302
|
+
* Never use OpenAI Responses `previous_response_id` (resp_*) or shared `prompt_cache_key`
|
|
303
|
+
* (cache-cohort fingerprint, not conversation ownership).
|
|
304
|
+
*/
|
|
305
|
+
export function resolveCursorConversationId(
|
|
306
|
+
parsed: OcxParsedRequest,
|
|
307
|
+
_wireModelId: string,
|
|
308
|
+
options: CreateCursorRequestOptions = {},
|
|
309
|
+
): string {
|
|
310
|
+
if (options.forceFreshConversation === true) return generatedCursorConversationId();
|
|
311
|
+
if (parsed._cursorIsolateConversation === true) return generatedCursorConversationId();
|
|
312
|
+
if (parsed._cursorConversationId) return parsed._cursorConversationId;
|
|
313
|
+
const threadId = parsed._clientThreadId?.trim();
|
|
314
|
+
if (threadId) {
|
|
315
|
+
const recovered = lookupCursorThreadConversation(threadId, parsed._cursorIdentityScope);
|
|
316
|
+
if (recovered) return recovered;
|
|
317
|
+
return cursorConversationIdFromClientThread(`thread:${threadId}`, parsed._cursorIdentityScope);
|
|
318
|
+
}
|
|
319
|
+
return generatedCursorConversationId();
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function updateFramed(hash: ReturnType<typeof createHash>, value: string): void {
|
|
323
|
+
const bytes = Buffer.from(value, "utf8");
|
|
324
|
+
const length = Buffer.allocUnsafe(4);
|
|
325
|
+
length.writeUInt32BE(bytes.byteLength);
|
|
326
|
+
hash.update(length);
|
|
327
|
+
hash.update(bytes);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export function cursorInstructionDigest(parsed: OcxParsedRequest): string {
|
|
331
|
+
const hash = createHash("sha256").update("ocx:cursor:sys:");
|
|
332
|
+
for (const line of parsed.context.systemPrompt ?? []) updateFramed(hash, line);
|
|
333
|
+
for (const message of parsed.context.messages) {
|
|
334
|
+
if (message.role !== "developer") continue;
|
|
335
|
+
updateFramed(hash, contentToText(message.content));
|
|
336
|
+
}
|
|
337
|
+
return hash.digest("hex");
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export function cursorCoveredPrefixDigest(parsed: OcxParsedRequest, coveredMessageCount: number): string {
|
|
341
|
+
const hash = createHash("sha256").update("ocx:cursor:prefix:");
|
|
342
|
+
updateFramed(hash, cursorInstructionDigest(parsed));
|
|
343
|
+
for (const message of parsed.context.messages.slice(0, coveredMessageCount)) {
|
|
344
|
+
updateFramed(hash, message.role);
|
|
345
|
+
updateFramed(hash, contentToText(message.content));
|
|
346
|
+
}
|
|
347
|
+
return hash.digest("hex");
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export interface CreateCursorRequestOptions {
|
|
351
|
+
/** Force a brand-new Cursor conversation id even when remembered state exists. */
|
|
352
|
+
forceFreshConversation?: boolean;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function lookupPrefixSnapshot(
|
|
356
|
+
parsed: OcxParsedRequest,
|
|
357
|
+
request: CursorRunRequest,
|
|
358
|
+
identityScope: string,
|
|
359
|
+
): CursorCheckpointSnapshot | undefined {
|
|
360
|
+
const systemDigest = cursorInstructionDigest(parsed);
|
|
361
|
+
const modelId = cursorCheckpointModelAffinityId(request.modelId);
|
|
362
|
+
for (let covered = parsed.context.messages.length; covered >= 1; covered--) {
|
|
363
|
+
const snapshot = getCursorCheckpointForPrefix({
|
|
364
|
+
prefixDigest: cursorCoveredPrefixDigest(parsed, covered),
|
|
365
|
+
systemDigest,
|
|
366
|
+
coveredMessageCount: covered,
|
|
367
|
+
identityScope,
|
|
368
|
+
modelId,
|
|
369
|
+
});
|
|
370
|
+
if (snapshot) return snapshot;
|
|
371
|
+
}
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function lineageMismatch(
|
|
376
|
+
parsed: OcxParsedRequest,
|
|
377
|
+
snapshot: CursorCheckpointSnapshot,
|
|
378
|
+
): CursorCheckpointInvalidationReason | undefined {
|
|
379
|
+
const covered = snapshot.coveredMessageCount;
|
|
380
|
+
if (covered === undefined || covered < 0 || covered > parsed.context.messages.length) {
|
|
381
|
+
return "lineage_mismatch";
|
|
382
|
+
}
|
|
383
|
+
if (!snapshot.prefixDigest || !snapshot.systemDigest) return "lineage_mismatch";
|
|
384
|
+
if (snapshot.systemDigest !== cursorInstructionDigest(parsed)) return "lineage_mismatch";
|
|
385
|
+
if (snapshot.prefixDigest !== cursorCoveredPrefixDigest(parsed, covered)) return "lineage_mismatch";
|
|
386
|
+
const lastRole = parsed.context.messages.at(-1)?.role;
|
|
387
|
+
if (lastRole === "toolResult" && covered >= parsed.context.messages.length) return "trailing_tool_result";
|
|
388
|
+
return undefined;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
function resolveCursorCheckpoint(
|
|
392
|
+
parsed: OcxParsedRequest,
|
|
393
|
+
request: CursorRunRequest,
|
|
394
|
+
options: CreateCursorRequestOptions,
|
|
395
|
+
): { snapshot: CursorCheckpointSnapshot } | { reason: CursorCheckpointInvalidationReason } {
|
|
396
|
+
if (options.forceFreshConversation === true) return { reason: "force_fresh" };
|
|
397
|
+
if (parsed._compactionRequest === true || parsed._contextCompactionBoundary === true) return { reason: "compaction" };
|
|
398
|
+
const isolated = parsed._cursorIsolateConversation === true;
|
|
399
|
+
const cursorState = parsed._providerContinuation?.cursor;
|
|
400
|
+
const ref = isolated ? undefined : cursorState?.checkpointRef;
|
|
401
|
+
const identityScope = parsed._cursorIdentityScope?.trim() || "local";
|
|
402
|
+
let snapshot: CursorCheckpointSnapshot | undefined;
|
|
403
|
+
if (ref) {
|
|
404
|
+
snapshot = getCursorCheckpoint(ref);
|
|
405
|
+
if (!snapshot) return { reason: "expired" };
|
|
406
|
+
} else {
|
|
407
|
+
snapshot = lookupPrefixSnapshot(parsed, request, identityScope);
|
|
408
|
+
if (!snapshot) return { reason: "missing_ref" };
|
|
409
|
+
}
|
|
410
|
+
if (!isolated && snapshot.conversationId !== request.conversationId && ref) {
|
|
411
|
+
return { reason: "conversation_changed" };
|
|
412
|
+
}
|
|
413
|
+
if (snapshot.identityScope !== identityScope) return { reason: "identity_changed" };
|
|
414
|
+
if (cursorCheckpointModelAffinityId(snapshot.modelId) !== cursorCheckpointModelAffinityId(request.modelId)) {
|
|
415
|
+
return { reason: "model_changed" };
|
|
416
|
+
}
|
|
417
|
+
if (parsed.context.messages.at(-1)?.role !== "toolResult" && cursorState?.checkpointUsable === false) {
|
|
418
|
+
return { reason: "trailing_tool_result" };
|
|
419
|
+
}
|
|
420
|
+
const lineage = lineageMismatch(parsed, snapshot);
|
|
421
|
+
if (lineage) return { reason: lineage };
|
|
422
|
+
return { snapshot };
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
export function createCursorRequest(
|
|
426
|
+
parsed: OcxParsedRequest,
|
|
427
|
+
options: CreateCursorRequestOptions = {},
|
|
428
|
+
): CursorRunRequest {
|
|
429
|
+
const messages = cursorRequestMessagesFromRaw(parsed.context.messages);
|
|
430
|
+
const activeText = [...messages].reverse().find(message => message.role === "user" || message.role === "developer")?.content ?? "";
|
|
431
|
+
const visibleTools = cursorToolsForActivePrompt(parsed.context.tools, activeText, parsed.options.toolChoice);
|
|
432
|
+
const budget = applyCursorToolBudget(visibleTools, parsed.options.toolChoice);
|
|
433
|
+
const limitNote = catalogLimitNote(budget.tools, budget.omitted);
|
|
434
|
+
const model = normalizeCursorModelId(parsed.modelId, parsed.options.reasoning);
|
|
435
|
+
const request: CursorRunRequest = {
|
|
436
|
+
modelId: model.modelId,
|
|
437
|
+
...(model.requestedModelParameters ? { requestedModelParameters: model.requestedModelParameters } : {}),
|
|
438
|
+
...(model.routingLevel ? { routingLevel: model.routingLevel } : {}),
|
|
439
|
+
conversationId: resolveCursorConversationId(parsed, model.modelId, options),
|
|
440
|
+
system: [...(parsed.context.systemPrompt ?? []), ...(limitNote ? [limitNote] : [])],
|
|
441
|
+
messages,
|
|
442
|
+
rawMessages: parsed.context.messages,
|
|
443
|
+
...(parsed._compactionRequest === true || parsed._contextCompactionBoundary === true ? { contextUsageReset: true } : {}),
|
|
444
|
+
...(parsed._compactionRequest === true ? { contextUsageStoreCheckpoints: false } : {}),
|
|
445
|
+
...(budget.tools.length ? { tools: budget.tools } : {}),
|
|
446
|
+
...(parsed.options.toolChoice ? { toolChoice: parsed.options.toolChoice } : {}),
|
|
447
|
+
...(parsed.options.parallelToolCalls !== undefined ? { parallelToolCalls: parsed.options.parallelToolCalls } : {}),
|
|
448
|
+
};
|
|
449
|
+
const resolved = resolveCursorCheckpoint(parsed, request, options);
|
|
450
|
+
if ("reason" in resolved) {
|
|
451
|
+
request.continuationMode = "full-replay";
|
|
452
|
+
request.checkpointInvalidationReason = resolved.reason;
|
|
453
|
+
return request;
|
|
454
|
+
}
|
|
455
|
+
request.checkpointBytes = resolved.snapshot.checkpointBytes;
|
|
456
|
+
request.continuationMode = "checkpoint";
|
|
457
|
+
if (parsed.context.messages.at(-1)?.role === "toolResult" && resolved.snapshot.coveredMessageCount !== undefined) {
|
|
458
|
+
request.checkpointSuffixStart = resolved.snapshot.coveredMessageCount;
|
|
459
|
+
}
|
|
460
|
+
return request;
|
|
461
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded in-memory overrides for Cursor conversation continuity.
|
|
3
|
+
*
|
|
4
|
+
* When an invalid_argument recovery mints a fresh conversation id for a store:false
|
|
5
|
+
* thread-identified client, later turns without previous_response_id must reuse that
|
|
6
|
+
* recovered id instead of recomputing the stale deterministic thread hash.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const OVERRIDE_TTL_MS = 60 * 60 * 1000;
|
|
10
|
+
const OVERRIDE_MAX_ENTRIES = 2048;
|
|
11
|
+
|
|
12
|
+
const overrides = new Map<string, { conversationId: string; updatedAt: number }>();
|
|
13
|
+
|
|
14
|
+
function now(): number {
|
|
15
|
+
return Date.now();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function prune(at: number): void {
|
|
19
|
+
for (const [key, entry] of overrides) {
|
|
20
|
+
if (at - entry.updatedAt > OVERRIDE_TTL_MS) overrides.delete(key);
|
|
21
|
+
else break; // Map iterates insertion order; refreshed entries are moved to the end
|
|
22
|
+
}
|
|
23
|
+
while (overrides.size > OVERRIDE_MAX_ENTRIES) {
|
|
24
|
+
const oldest = overrides.keys().next().value;
|
|
25
|
+
if (oldest === undefined) break;
|
|
26
|
+
overrides.delete(oldest);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Scope key for a client thread, optionally namespaced by authenticated tenant/operator identity. */
|
|
31
|
+
export function cursorThreadScopeKey(threadId: string, identityScope?: string): string {
|
|
32
|
+
const scope = identityScope?.trim() || "local";
|
|
33
|
+
return `${scope}\0${threadId}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function rememberCursorThreadConversation(
|
|
37
|
+
threadId: string,
|
|
38
|
+
conversationId: string,
|
|
39
|
+
identityScope?: string,
|
|
40
|
+
): void {
|
|
41
|
+
const key = cursorThreadScopeKey(threadId, identityScope);
|
|
42
|
+
const at = now();
|
|
43
|
+
overrides.delete(key);
|
|
44
|
+
overrides.set(key, { conversationId, updatedAt: at });
|
|
45
|
+
prune(at);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function lookupCursorThreadConversation(
|
|
49
|
+
threadId: string,
|
|
50
|
+
identityScope?: string,
|
|
51
|
+
): string | undefined {
|
|
52
|
+
const key = cursorThreadScopeKey(threadId, identityScope);
|
|
53
|
+
const entry = overrides.get(key);
|
|
54
|
+
if (!entry) return undefined;
|
|
55
|
+
const at = now();
|
|
56
|
+
if (at - entry.updatedAt > OVERRIDE_TTL_MS) {
|
|
57
|
+
overrides.delete(key);
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
overrides.delete(key);
|
|
61
|
+
overrides.set(key, { conversationId: entry.conversationId, updatedAt: at });
|
|
62
|
+
return entry.conversationId;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function clearCursorThreadContinuityForTests(): void {
|
|
66
|
+
overrides.clear();
|
|
67
|
+
}
|