@iislee/opencodex 2.11.0 → 2.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +618 -74
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +152 -29
- package/src/images/plan.ts +23 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +865 -181
- package/src/server/lifecycle.ts +284 -13
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +288 -32
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +9 -3
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -8,19 +8,30 @@ import type {
|
|
|
8
8
|
OcxToolResultMessage,
|
|
9
9
|
} from "../../types";
|
|
10
10
|
import { isAllowedToolChoice, namespacedToolName, toolChoiceAliases, type OcxTool, type OcxToolChoice } from "../../types";
|
|
11
|
-
import type { CursorRequestMessage, CursorRunRequest } from "./types";
|
|
12
|
-
import { cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
|
|
13
|
-
import { cursorEffortSuffix,
|
|
11
|
+
import type { CursorRequestMessage, CursorRequestedModelParameter, CursorRunRequest } from "./types";
|
|
12
|
+
import { cursorCheckpointModelAffinityId, cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
|
|
13
|
+
import { cursorEffortSuffix, cursorRequestWireModelIdWithEffort } from "./effort-map";
|
|
14
14
|
import {
|
|
15
15
|
cursorMcpToolEncodedSize,
|
|
16
16
|
cursorMcpToolsEncodedSize,
|
|
17
17
|
cursorToolAllowedByChoice,
|
|
18
18
|
cursorToolChoiceAliases,
|
|
19
|
+
cursorStructuredEditTools,
|
|
19
20
|
cursorToolWireName,
|
|
20
21
|
cursorToolsForActivePrompt,
|
|
22
|
+
isCursorStructuredEditToolName,
|
|
21
23
|
isBareCodexShellBridgeTool,
|
|
24
|
+
isCursorExecutionPathTool,
|
|
25
|
+
isCursorWaitTool,
|
|
22
26
|
} from "./tool-definitions";
|
|
23
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";
|
|
24
35
|
|
|
25
36
|
/** Probe-verified Cursor Connect boundaries, with byte headroom for the enclosing field. */
|
|
26
37
|
export const CURSOR_TOOL_COUNT_LIMIT = 330;
|
|
@@ -37,18 +48,25 @@ function explicitlySelectedNames(choice: OcxToolChoice | undefined): Set<string>
|
|
|
37
48
|
}
|
|
38
49
|
|
|
39
50
|
function toolPriority(tool: OcxTool, selectedNames: ReadonlySet<string>): number {
|
|
40
|
-
//
|
|
41
|
-
//
|
|
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;
|
|
42
54
|
if (isBareCodexShellBridgeTool(tool)) return 0;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (tool
|
|
46
|
-
if (!tool.namespace) return
|
|
47
|
-
return
|
|
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;
|
|
48
66
|
}
|
|
49
67
|
|
|
50
68
|
function isPinnedCursorTool(tool: OcxTool, selectedNames: ReadonlySet<string>): boolean {
|
|
51
|
-
return toolPriority(tool, selectedNames) <=
|
|
69
|
+
return toolPriority(tool, selectedNames) <= 3;
|
|
52
70
|
}
|
|
53
71
|
|
|
54
72
|
/**
|
|
@@ -61,7 +79,11 @@ export function applyCursorToolBudget(
|
|
|
61
79
|
toolChoice: OcxToolChoice | undefined,
|
|
62
80
|
): CursorToolBudgetResult {
|
|
63
81
|
const catalog = tools ?? [];
|
|
64
|
-
const
|
|
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];
|
|
65
87
|
if (
|
|
66
88
|
eligible.length <= CURSOR_TOOL_COUNT_LIMIT
|
|
67
89
|
&& cursorMcpToolsEncodedSize(eligible, toolChoice) <= CURSOR_TOOL_BYTES_LIMIT
|
|
@@ -87,7 +109,7 @@ export function applyCursorToolBudget(
|
|
|
87
109
|
return true;
|
|
88
110
|
};
|
|
89
111
|
|
|
90
|
-
// Phase 1: selected tools +
|
|
112
|
+
// Phase 1: selected tools + execution path + apply_patch (priority <= 3).
|
|
91
113
|
// Pins are admitted before filler so a crowded catalog cannot drop the Codex execution path (#399).
|
|
92
114
|
for (const candidate of candidates) {
|
|
93
115
|
if (!isPinnedCursorTool(candidate.tool, selectedNames)) continue;
|
|
@@ -99,9 +121,49 @@ export function applyCursorToolBudget(
|
|
|
99
121
|
tryKeep(candidate.tool);
|
|
100
122
|
}
|
|
101
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
|
+
|
|
102
162
|
return {
|
|
103
163
|
tools: eligible.filter(tool => keptSet.has(tool)),
|
|
104
|
-
omitted
|
|
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)),
|
|
105
167
|
};
|
|
106
168
|
}
|
|
107
169
|
|
|
@@ -117,17 +179,30 @@ function catalogLimitNote(kept: readonly OcxTool[], omitted: readonly OcxTool[])
|
|
|
117
179
|
}
|
|
118
180
|
|
|
119
181
|
/**
|
|
120
|
-
* Resolve a `cursor/<model>` selection + Codex reasoning effort to
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* known effort base) passes through unchanged.
|
|
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.
|
|
125
186
|
*/
|
|
126
|
-
function normalizeCursorModelId(modelId: string, reasoning?: string): {
|
|
187
|
+
function normalizeCursorModelId(modelId: string, reasoning?: string): {
|
|
188
|
+
modelId: string;
|
|
189
|
+
requestedModelParameters?: readonly CursorRequestedModelParameter[];
|
|
190
|
+
routingLevel?: CursorRoutingLevel;
|
|
191
|
+
} {
|
|
127
192
|
const selection = cursorWireModelSelection(modelId);
|
|
128
193
|
const id = selection.modelId;
|
|
129
194
|
const suffix = cursorEffortSuffix(id, reasoning);
|
|
130
|
-
|
|
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 };
|
|
131
206
|
}
|
|
132
207
|
|
|
133
208
|
function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): string | undefined {
|
|
@@ -137,7 +212,8 @@ function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): stri
|
|
|
137
212
|
case "thinking":
|
|
138
213
|
return part.thinking;
|
|
139
214
|
case "image":
|
|
140
|
-
|
|
215
|
+
// Images ride UserMessage.selected_context (SelectedImage) instead of text.
|
|
216
|
+
return undefined;
|
|
141
217
|
case "toolCall":
|
|
142
218
|
// Cursor does not accept OpenAI Responses assistant tool-call parts as native history here.
|
|
143
219
|
// Rendering them as visible "[tool_call]" text leaks synthetic protocol markers back into
|
|
@@ -170,9 +246,19 @@ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
|
|
|
170
246
|
switch (message.role) {
|
|
171
247
|
case "user":
|
|
172
248
|
case "developer":
|
|
173
|
-
|
|
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
|
+
}
|
|
174
257
|
case "assistant":
|
|
175
|
-
|
|
258
|
+
{
|
|
259
|
+
const content = contentToText(message.content);
|
|
260
|
+
return content.length > 0 ? { role: "assistant", content } : undefined;
|
|
261
|
+
}
|
|
176
262
|
case "toolResult":
|
|
177
263
|
return {
|
|
178
264
|
role: "tool",
|
|
@@ -181,6 +267,19 @@ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
|
|
|
181
267
|
}
|
|
182
268
|
}
|
|
183
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
|
+
|
|
184
283
|
export function generatedCursorConversationId(): string {
|
|
185
284
|
return `cursor_${crypto.randomUUID().replace(/-/g, "")}`;
|
|
186
285
|
}
|
|
@@ -209,38 +308,133 @@ export function resolveCursorConversationId(
|
|
|
209
308
|
options: CreateCursorRequestOptions = {},
|
|
210
309
|
): string {
|
|
211
310
|
if (options.forceFreshConversation === true) return generatedCursorConversationId();
|
|
212
|
-
// Helper/shadow/compaction turns must not append into the parent's Cursor conversation,
|
|
213
|
-
// even when previous_response_id restored the parent's remembered id.
|
|
214
311
|
if (parsed._cursorIsolateConversation === true) return generatedCursorConversationId();
|
|
215
312
|
if (parsed._cursorConversationId) return parsed._cursorConversationId;
|
|
216
313
|
const threadId = parsed._clientThreadId?.trim();
|
|
217
314
|
if (threadId) {
|
|
218
315
|
const recovered = lookupCursorThreadConversation(threadId, parsed._cursorIdentityScope);
|
|
219
316
|
if (recovered) return recovered;
|
|
220
|
-
return cursorConversationIdFromClientThread(threadId
|
|
317
|
+
return cursorConversationIdFromClientThread(`thread:${threadId}`, parsed._cursorIdentityScope);
|
|
221
318
|
}
|
|
222
319
|
return generatedCursorConversationId();
|
|
223
320
|
}
|
|
224
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
|
+
|
|
225
350
|
export interface CreateCursorRequestOptions {
|
|
226
351
|
/** Force a brand-new Cursor conversation id even when remembered state exists. */
|
|
227
352
|
forceFreshConversation?: boolean;
|
|
228
353
|
}
|
|
229
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
|
+
|
|
230
425
|
export function createCursorRequest(
|
|
231
426
|
parsed: OcxParsedRequest,
|
|
232
427
|
options: CreateCursorRequestOptions = {},
|
|
233
428
|
): CursorRunRequest {
|
|
234
|
-
const messages = parsed.context.messages
|
|
235
|
-
.map(requestMessage)
|
|
236
|
-
.filter((message): message is CursorRequestMessage => !!message && message.content.length > 0);
|
|
429
|
+
const messages = cursorRequestMessagesFromRaw(parsed.context.messages);
|
|
237
430
|
const activeText = [...messages].reverse().find(message => message.role === "user" || message.role === "developer")?.content ?? "";
|
|
238
431
|
const visibleTools = cursorToolsForActivePrompt(parsed.context.tools, activeText, parsed.options.toolChoice);
|
|
239
432
|
const budget = applyCursorToolBudget(visibleTools, parsed.options.toolChoice);
|
|
240
433
|
const limitNote = catalogLimitNote(budget.tools, budget.omitted);
|
|
241
434
|
const model = normalizeCursorModelId(parsed.modelId, parsed.options.reasoning);
|
|
242
|
-
|
|
435
|
+
const request: CursorRunRequest = {
|
|
243
436
|
modelId: model.modelId,
|
|
437
|
+
...(model.requestedModelParameters ? { requestedModelParameters: model.requestedModelParameters } : {}),
|
|
244
438
|
...(model.routingLevel ? { routingLevel: model.routingLevel } : {}),
|
|
245
439
|
conversationId: resolveCursorConversationId(parsed, model.modelId, options),
|
|
246
440
|
system: [...(parsed.context.systemPrompt ?? []), ...(limitNote ? [limitNote] : [])],
|
|
@@ -252,4 +446,16 @@ export function createCursorRequest(
|
|
|
252
446
|
...(parsed.options.toolChoice ? { toolChoice: parsed.options.toolChoice } : {}),
|
|
253
447
|
...(parsed.options.parallelToolCalls !== undefined ? { parallelToolCalls: parsed.options.parallelToolCalls } : {}),
|
|
254
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;
|
|
255
461
|
}
|