@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -8,19 +8,32 @@ 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 {
|
|
11
|
+
import type { CursorRequestMessage, CursorRequestedModelParameter, CursorRunRequest } from "./types";
|
|
12
|
+
import { cursorCheckpointModelAffinityId, cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
|
|
13
|
+
import { cursorUltraBaseModelId } from "./discovery";
|
|
14
|
+
import { decodeCursorCallId } from "./call-id";
|
|
15
|
+
import { cursorGrokFastSelection, resolveCursorSelection } from "./catalog";
|
|
14
16
|
import {
|
|
15
17
|
cursorMcpToolEncodedSize,
|
|
16
18
|
cursorMcpToolsEncodedSize,
|
|
17
19
|
cursorToolAllowedByChoice,
|
|
18
20
|
cursorToolChoiceAliases,
|
|
21
|
+
cursorStructuredEditTools,
|
|
19
22
|
cursorToolWireName,
|
|
20
23
|
cursorToolsForActivePrompt,
|
|
24
|
+
isCursorStructuredEditToolName,
|
|
21
25
|
isBareCodexShellBridgeTool,
|
|
26
|
+
isCursorExecutionPathTool,
|
|
27
|
+
isCursorWaitTool,
|
|
22
28
|
} from "./tool-definitions";
|
|
23
29
|
import { lookupCursorThreadConversation } from "./thread-continuity";
|
|
30
|
+
import {
|
|
31
|
+
getCursorCheckpoint,
|
|
32
|
+
getCursorCheckpointForPrefix,
|
|
33
|
+
type CursorCheckpointInvalidationReason,
|
|
34
|
+
type CursorCheckpointSnapshot,
|
|
35
|
+
} from "./checkpoint-store";
|
|
36
|
+
import { extractCursorImageUrls } from "./images";
|
|
24
37
|
|
|
25
38
|
/** Probe-verified Cursor Connect boundaries, with byte headroom for the enclosing field. */
|
|
26
39
|
export const CURSOR_TOOL_COUNT_LIMIT = 330;
|
|
@@ -37,18 +50,25 @@ function explicitlySelectedNames(choice: OcxToolChoice | undefined): Set<string>
|
|
|
37
50
|
}
|
|
38
51
|
|
|
39
52
|
function toolPriority(tool: OcxTool, selectedNames: ReadonlySet<string>): number {
|
|
40
|
-
//
|
|
41
|
-
//
|
|
53
|
+
// Execution path (bare or opencodex-responses `exec` / `exec_command` / `shell_command`)
|
|
54
|
+
// outranks filler so a crowded catalog cannot drop the Codex shell bridge (#399).
|
|
55
|
+
if (isCursorExecutionPathTool(tool)) return 0;
|
|
42
56
|
if (isBareCodexShellBridgeTool(tool)) return 0;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (tool
|
|
46
|
-
if (!tool.namespace) return
|
|
47
|
-
return
|
|
57
|
+
// `wait` only resumes a yielded exec cell. Keep it with the execution path, but after
|
|
58
|
+
// `exec` itself so a large wait schema cannot starve the tool that creates the cell.
|
|
59
|
+
if (isCursorWaitTool(tool)) return 1;
|
|
60
|
+
if (!tool.namespace && tool.name === "apply_patch") return 2;
|
|
61
|
+
// Structured edit tools convert to apply_patch on the return path, so they must survive the
|
|
62
|
+
// same byte/count truncation as the freeform tool they stand in for (#1017).
|
|
63
|
+
if (!tool.namespace && isCursorStructuredEditToolName(tool.name)) return 2;
|
|
64
|
+
if (cursorToolChoiceAliases(tool).some(name => selectedNames.has(name))) return 3;
|
|
65
|
+
if (tool.loadedFromToolSearch) return 4;
|
|
66
|
+
if (!tool.namespace) return 5;
|
|
67
|
+
return 6;
|
|
48
68
|
}
|
|
49
69
|
|
|
50
70
|
function isPinnedCursorTool(tool: OcxTool, selectedNames: ReadonlySet<string>): boolean {
|
|
51
|
-
return toolPriority(tool, selectedNames) <=
|
|
71
|
+
return toolPriority(tool, selectedNames) <= 3;
|
|
52
72
|
}
|
|
53
73
|
|
|
54
74
|
/**
|
|
@@ -61,7 +81,11 @@ export function applyCursorToolBudget(
|
|
|
61
81
|
toolChoice: OcxToolChoice | undefined,
|
|
62
82
|
): CursorToolBudgetResult {
|
|
63
83
|
const catalog = tools ?? [];
|
|
64
|
-
const
|
|
84
|
+
const baseEligible = catalog.filter(tool => cursorToolAllowedByChoice(tool, toolChoice, catalog));
|
|
85
|
+
// Synthetic structured edit tools ride along with the freeform apply_patch tool (#1017). They are
|
|
86
|
+
// part of the advertised catalog, so their serialized size counts toward the byte ceiling here.
|
|
87
|
+
const synthetic = cursorStructuredEditTools(catalog, toolChoice);
|
|
88
|
+
const eligible = [...baseEligible, ...synthetic];
|
|
65
89
|
if (
|
|
66
90
|
eligible.length <= CURSOR_TOOL_COUNT_LIMIT
|
|
67
91
|
&& cursorMcpToolsEncodedSize(eligible, toolChoice) <= CURSOR_TOOL_BYTES_LIMIT
|
|
@@ -87,7 +111,7 @@ export function applyCursorToolBudget(
|
|
|
87
111
|
return true;
|
|
88
112
|
};
|
|
89
113
|
|
|
90
|
-
// Phase 1: selected tools +
|
|
114
|
+
// Phase 1: selected tools + execution path + apply_patch (priority <= 3).
|
|
91
115
|
// Pins are admitted before filler so a crowded catalog cannot drop the Codex execution path (#399).
|
|
92
116
|
for (const candidate of candidates) {
|
|
93
117
|
if (!isPinnedCursorTool(candidate.tool, selectedNames)) continue;
|
|
@@ -99,9 +123,49 @@ export function applyCursorToolBudget(
|
|
|
99
123
|
tryKeep(candidate.tool);
|
|
100
124
|
}
|
|
101
125
|
|
|
126
|
+
const evictNonExecutionPath = (needBytes: number): void => {
|
|
127
|
+
for (let i = kept.length - 1; i >= 0; i--) {
|
|
128
|
+
const occupant = kept[i];
|
|
129
|
+
if (!occupant || isCursorExecutionPathTool(occupant)) continue;
|
|
130
|
+
kept.splice(i, 1);
|
|
131
|
+
keptSet.delete(occupant);
|
|
132
|
+
keptBytes -= cursorMcpToolEncodedSize(occupant, toolChoice);
|
|
133
|
+
if (kept.length < CURSOR_TOOL_COUNT_LIMIT && keptBytes + needBytes <= CURSOR_TOOL_BYTES_LIMIT) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Force-admit at least one execution-path tool when one was eligible. Priority-0
|
|
140
|
+
// admission can still fail if the tool itself is larger than leftover room after
|
|
141
|
+
// earlier same-priority pins; evict wait/patch/filler rather than ship wait-only.
|
|
142
|
+
for (const tool of eligible) {
|
|
143
|
+
if (!isCursorExecutionPathTool(tool) || keptSet.has(tool)) continue;
|
|
144
|
+
const need = cursorMcpToolEncodedSize(tool, toolChoice);
|
|
145
|
+
if (need > CURSOR_TOOL_BYTES_LIMIT) continue;
|
|
146
|
+
evictNonExecutionPath(need);
|
|
147
|
+
tryKeep(tool);
|
|
148
|
+
if (keptSet.has(tool)) break;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const eligibleHasExecutionPath = eligible.some(isCursorExecutionPathTool);
|
|
152
|
+
const keptHasExecutionPath = eligible.some(tool => keptSet.has(tool) && isCursorExecutionPathTool(tool));
|
|
153
|
+
// Never advertise `wait` after dropping the tool that creates the exec cell.
|
|
154
|
+
if (eligibleHasExecutionPath && !keptHasExecutionPath) {
|
|
155
|
+
for (const tool of eligible) {
|
|
156
|
+
if (!isCursorWaitTool(tool) || !keptSet.has(tool)) continue;
|
|
157
|
+
keptSet.delete(tool);
|
|
158
|
+
const index = kept.indexOf(tool);
|
|
159
|
+
if (index >= 0) kept.splice(index, 1);
|
|
160
|
+
keptBytes -= cursorMcpToolEncodedSize(tool, toolChoice);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
102
164
|
return {
|
|
103
165
|
tools: eligible.filter(tool => keptSet.has(tool)),
|
|
104
|
-
omitted
|
|
166
|
+
// Synthetic tools are pinned in phase 1 and never reported as omitted; the note counts only
|
|
167
|
+
// tools the client itself requested.
|
|
168
|
+
omitted: baseEligible.filter(tool => !keptSet.has(tool)),
|
|
105
169
|
};
|
|
106
170
|
}
|
|
107
171
|
|
|
@@ -117,17 +181,43 @@ function catalogLimitNote(kept: readonly OcxTool[], omitted: readonly OcxTool[])
|
|
|
117
181
|
}
|
|
118
182
|
|
|
119
183
|
/**
|
|
120
|
-
* Resolve a `cursor/<model>` selection + Codex reasoning effort to
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* known effort base) passes through unchanged.
|
|
184
|
+
* Resolve a `cursor/<model>` selection + Codex reasoning effort to Cursor's requested model shape.
|
|
185
|
+
* Most models encode effort in a flat id (`claude-4.6-opus-high`). Grok Fast is parameterized
|
|
186
|
+
* instead: current Cursor clients send the matching Grok base id plus `effort` and `fast` parameters.
|
|
187
|
+
* A fully-qualified id (one that is not a known effort base) passes through unchanged.
|
|
125
188
|
*/
|
|
126
|
-
function normalizeCursorModelId(modelId: string, reasoning?: string): {
|
|
189
|
+
function normalizeCursorModelId(modelId: string, reasoning?: string): {
|
|
190
|
+
modelId: string;
|
|
191
|
+
requestedModelParameters?: readonly CursorRequestedModelParameter[];
|
|
192
|
+
routingLevel?: CursorRoutingLevel;
|
|
193
|
+
maxMode?: boolean;
|
|
194
|
+
} {
|
|
195
|
+
// Router ids (auto / auto-<level>) keep their dedicated wire selection.
|
|
127
196
|
const selection = cursorWireModelSelection(modelId);
|
|
197
|
+
if (selection.routingLevel !== undefined || selection.modelId === "default") return selection;
|
|
198
|
+
// Umbrella catalog resolution (devlog 260828_cursor_umbrella_catalog): one
|
|
199
|
+
// resolver owns effort composition, variant dimensions, the synthetic -1m
|
|
200
|
+
// marker (ultra -> Max Mode, evidence-gated), and the cursor- wire prefix.
|
|
128
201
|
const id = selection.modelId;
|
|
129
|
-
|
|
130
|
-
|
|
202
|
+
// Grok Fast stays parameterized: current Cursor clients send the base id
|
|
203
|
+
// plus effort/fast parameters instead of the flattened -fast id.
|
|
204
|
+
const grokFast = cursorGrokFastSelection(id, reasoning);
|
|
205
|
+
if (grokFast) {
|
|
206
|
+
return {
|
|
207
|
+
...selection,
|
|
208
|
+
modelId: grokFast.wireBaseId,
|
|
209
|
+
requestedModelParameters: [
|
|
210
|
+
{ id: "effort", value: grokFast.effort },
|
|
211
|
+
{ id: "fast", value: "true" },
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const resolved = resolveCursorSelection(id, reasoning);
|
|
216
|
+
return {
|
|
217
|
+
...selection,
|
|
218
|
+
...(resolved.maxMode ? { maxMode: true } : {}),
|
|
219
|
+
modelId: resolved.wireId,
|
|
220
|
+
};
|
|
131
221
|
}
|
|
132
222
|
|
|
133
223
|
function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): string | undefined {
|
|
@@ -137,7 +227,8 @@ function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): stri
|
|
|
137
227
|
case "thinking":
|
|
138
228
|
return part.thinking;
|
|
139
229
|
case "image":
|
|
140
|
-
|
|
230
|
+
// Images ride UserMessage.selected_context (SelectedImage) instead of text.
|
|
231
|
+
return undefined;
|
|
141
232
|
case "toolCall":
|
|
142
233
|
// Cursor does not accept OpenAI Responses assistant tool-call parts as native history here.
|
|
143
234
|
// Rendering them as visible "[tool_call]" text leaks synthetic protocol markers back into
|
|
@@ -150,7 +241,7 @@ function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): stri
|
|
|
150
241
|
function toolResultToText(message: OcxToolResultMessage): string {
|
|
151
242
|
return [
|
|
152
243
|
"[tool_result]",
|
|
153
|
-
`call_id: ${message.toolCallId}`,
|
|
244
|
+
`call_id: ${decodeCursorCallId(message.toolCallId)}`,
|
|
154
245
|
`name: ${namespacedToolName(message.toolNamespace, message.toolName)}`,
|
|
155
246
|
`is_error: ${message.isError}`,
|
|
156
247
|
"output:",
|
|
@@ -170,9 +261,19 @@ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
|
|
|
170
261
|
switch (message.role) {
|
|
171
262
|
case "user":
|
|
172
263
|
case "developer":
|
|
173
|
-
|
|
264
|
+
{
|
|
265
|
+
const content = contentToText(message.content);
|
|
266
|
+
// Image-only turns survive as empty content; the encoder keeps them userMessageAction.
|
|
267
|
+
if (content.length === 0 && extractCursorImageUrls(message.content).length === 0) {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
return { role: message.role, content };
|
|
271
|
+
}
|
|
174
272
|
case "assistant":
|
|
175
|
-
|
|
273
|
+
{
|
|
274
|
+
const content = contentToText(message.content);
|
|
275
|
+
return content.length > 0 ? { role: "assistant", content } : undefined;
|
|
276
|
+
}
|
|
176
277
|
case "toolResult":
|
|
177
278
|
return {
|
|
178
279
|
role: "tool",
|
|
@@ -181,6 +282,19 @@ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
|
|
|
181
282
|
}
|
|
182
283
|
}
|
|
183
284
|
|
|
285
|
+
/**
|
|
286
|
+
* Rebuild the text `messages` channel from prepared `rawMessages` so omission markers
|
|
287
|
+
* and JPEG-rewritten parts stay visible to activePromptText after image preparation.
|
|
288
|
+
*/
|
|
289
|
+
export function cursorRequestMessagesFromRaw(
|
|
290
|
+
messages: readonly OcxMessage[] | undefined,
|
|
291
|
+
): CursorRequestMessage[] {
|
|
292
|
+
if (!messages?.length) return [];
|
|
293
|
+
return messages
|
|
294
|
+
.map(requestMessage)
|
|
295
|
+
.filter((message): message is CursorRequestMessage => !!message);
|
|
296
|
+
}
|
|
297
|
+
|
|
184
298
|
export function generatedCursorConversationId(): string {
|
|
185
299
|
return `cursor_${crypto.randomUUID().replace(/-/g, "")}`;
|
|
186
300
|
}
|
|
@@ -199,7 +313,7 @@ export function cursorConversationIdFromClientThread(threadId: string, identityS
|
|
|
199
313
|
|
|
200
314
|
/**
|
|
201
315
|
* Resolve the Cursor conversation id for this turn.
|
|
202
|
-
* Priority: force-fresh → isolate helper → remembered →
|
|
316
|
+
* Priority: force-fresh → isolate helper → remembered → client thread owner → random.
|
|
203
317
|
* Never use OpenAI Responses `previous_response_id` (resp_*) or shared `prompt_cache_key`
|
|
204
318
|
* (cache-cohort fingerprint, not conversation ownership).
|
|
205
319
|
*/
|
|
@@ -209,39 +323,144 @@ export function resolveCursorConversationId(
|
|
|
209
323
|
options: CreateCursorRequestOptions = {},
|
|
210
324
|
): string {
|
|
211
325
|
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
326
|
if (parsed._cursorIsolateConversation === true) return generatedCursorConversationId();
|
|
215
327
|
if (parsed._cursorConversationId) return parsed._cursorConversationId;
|
|
216
|
-
const threadId = parsed
|
|
328
|
+
const threadId = cursorClientThreadOwner(parsed);
|
|
217
329
|
if (threadId) {
|
|
218
330
|
const recovered = lookupCursorThreadConversation(threadId, parsed._cursorIdentityScope);
|
|
219
331
|
if (recovered) return recovered;
|
|
220
|
-
return cursorConversationIdFromClientThread(threadId
|
|
332
|
+
return cursorConversationIdFromClientThread(`thread:${threadId}`, parsed._cursorIdentityScope);
|
|
221
333
|
}
|
|
222
334
|
return generatedCursorConversationId();
|
|
223
335
|
}
|
|
224
336
|
|
|
337
|
+
export function cursorClientThreadOwner(parsed: OcxParsedRequest): string | undefined {
|
|
338
|
+
return parsed._clientThreadId?.trim() || parsed._cursorClientThreadId?.trim() || undefined;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function updateFramed(hash: ReturnType<typeof createHash>, value: string): void {
|
|
342
|
+
const bytes = Buffer.from(value, "utf8");
|
|
343
|
+
const length = Buffer.allocUnsafe(4);
|
|
344
|
+
length.writeUInt32BE(bytes.byteLength);
|
|
345
|
+
hash.update(length);
|
|
346
|
+
hash.update(bytes);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export function cursorInstructionDigest(parsed: OcxParsedRequest): string {
|
|
350
|
+
const hash = createHash("sha256").update("ocx:cursor:sys:");
|
|
351
|
+
for (const line of parsed.context.systemPrompt ?? []) updateFramed(hash, line);
|
|
352
|
+
for (const message of parsed.context.messages) {
|
|
353
|
+
if (message.role !== "developer") continue;
|
|
354
|
+
updateFramed(hash, contentToText(message.content));
|
|
355
|
+
}
|
|
356
|
+
return hash.digest("hex");
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export function cursorCoveredPrefixDigest(parsed: OcxParsedRequest, coveredMessageCount: number): string {
|
|
360
|
+
const hash = createHash("sha256").update("ocx:cursor:prefix:");
|
|
361
|
+
updateFramed(hash, cursorInstructionDigest(parsed));
|
|
362
|
+
for (const message of parsed.context.messages.slice(0, coveredMessageCount)) {
|
|
363
|
+
updateFramed(hash, message.role);
|
|
364
|
+
updateFramed(hash, contentToText(message.content));
|
|
365
|
+
}
|
|
366
|
+
return hash.digest("hex");
|
|
367
|
+
}
|
|
368
|
+
|
|
225
369
|
export interface CreateCursorRequestOptions {
|
|
226
370
|
/** Force a brand-new Cursor conversation id even when remembered state exists. */
|
|
227
371
|
forceFreshConversation?: boolean;
|
|
228
372
|
}
|
|
229
373
|
|
|
374
|
+
function lookupPrefixSnapshot(
|
|
375
|
+
parsed: OcxParsedRequest,
|
|
376
|
+
request: CursorRunRequest,
|
|
377
|
+
identityScope: string,
|
|
378
|
+
): CursorCheckpointSnapshot | undefined {
|
|
379
|
+
const systemDigest = cursorInstructionDigest(parsed);
|
|
380
|
+
const modelId = cursorCheckpointModelAffinityId(request.modelId);
|
|
381
|
+
for (let covered = parsed.context.messages.length; covered >= 1; covered--) {
|
|
382
|
+
const snapshot = getCursorCheckpointForPrefix({
|
|
383
|
+
conversationId: request.conversationId,
|
|
384
|
+
prefixDigest: cursorCoveredPrefixDigest(parsed, covered),
|
|
385
|
+
systemDigest,
|
|
386
|
+
coveredMessageCount: covered,
|
|
387
|
+
identityScope,
|
|
388
|
+
modelId,
|
|
389
|
+
});
|
|
390
|
+
if (snapshot) return snapshot;
|
|
391
|
+
}
|
|
392
|
+
return undefined;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function lineageMismatch(
|
|
396
|
+
parsed: OcxParsedRequest,
|
|
397
|
+
snapshot: CursorCheckpointSnapshot,
|
|
398
|
+
): CursorCheckpointInvalidationReason | undefined {
|
|
399
|
+
const covered = snapshot.coveredMessageCount;
|
|
400
|
+
if (covered === undefined || covered < 0 || covered > parsed.context.messages.length) {
|
|
401
|
+
return "lineage_mismatch";
|
|
402
|
+
}
|
|
403
|
+
if (!snapshot.prefixDigest || !snapshot.systemDigest) return "lineage_mismatch";
|
|
404
|
+
if (snapshot.systemDigest !== cursorInstructionDigest(parsed)) return "lineage_mismatch";
|
|
405
|
+
if (snapshot.prefixDigest !== cursorCoveredPrefixDigest(parsed, covered)) return "lineage_mismatch";
|
|
406
|
+
const lastRole = parsed.context.messages.at(-1)?.role;
|
|
407
|
+
if (lastRole === "toolResult" && covered >= parsed.context.messages.length) return "trailing_tool_result";
|
|
408
|
+
return undefined;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function resolveCursorCheckpoint(
|
|
412
|
+
parsed: OcxParsedRequest,
|
|
413
|
+
request: CursorRunRequest,
|
|
414
|
+
options: CreateCursorRequestOptions,
|
|
415
|
+
): { snapshot: CursorCheckpointSnapshot } | { reason: CursorCheckpointInvalidationReason } {
|
|
416
|
+
if (options.forceFreshConversation === true) return { reason: "force_fresh" };
|
|
417
|
+
if (parsed._compactionRequest === true || parsed._contextCompactionBoundary === true) return { reason: "compaction" };
|
|
418
|
+
const isolated = parsed._cursorIsolateConversation === true;
|
|
419
|
+
const cursorState = parsed._providerContinuation?.cursor;
|
|
420
|
+
const ref = isolated ? undefined : cursorState?.checkpointRef;
|
|
421
|
+
const identityScope = parsed._cursorIdentityScope?.trim() || "local";
|
|
422
|
+
let snapshot: CursorCheckpointSnapshot | undefined;
|
|
423
|
+
if (ref) {
|
|
424
|
+
snapshot = getCursorCheckpoint(ref);
|
|
425
|
+
if (!snapshot) return { reason: "expired" };
|
|
426
|
+
} else {
|
|
427
|
+
if (
|
|
428
|
+
isolated
|
|
429
|
+
|| (!parsed._cursorConversationId && !cursorClientThreadOwner(parsed))
|
|
430
|
+
) return { reason: "missing_ref" };
|
|
431
|
+
snapshot = lookupPrefixSnapshot(parsed, request, identityScope);
|
|
432
|
+
if (!snapshot) return { reason: "missing_ref" };
|
|
433
|
+
}
|
|
434
|
+
if (snapshot.conversationId !== request.conversationId) {
|
|
435
|
+
return { reason: "conversation_changed" };
|
|
436
|
+
}
|
|
437
|
+
if (snapshot.identityScope !== identityScope) return { reason: "identity_changed" };
|
|
438
|
+
if (cursorCheckpointModelAffinityId(snapshot.modelId) !== cursorCheckpointModelAffinityId(request.modelId)) {
|
|
439
|
+
return { reason: "model_changed" };
|
|
440
|
+
}
|
|
441
|
+
if (parsed.context.messages.at(-1)?.role !== "toolResult" && cursorState?.checkpointUsable === false) {
|
|
442
|
+
return { reason: "trailing_tool_result" };
|
|
443
|
+
}
|
|
444
|
+
const lineage = lineageMismatch(parsed, snapshot);
|
|
445
|
+
if (lineage) return { reason: lineage };
|
|
446
|
+
return { snapshot };
|
|
447
|
+
}
|
|
448
|
+
|
|
230
449
|
export function createCursorRequest(
|
|
231
450
|
parsed: OcxParsedRequest,
|
|
232
451
|
options: CreateCursorRequestOptions = {},
|
|
233
452
|
): CursorRunRequest {
|
|
234
|
-
const messages = parsed.context.messages
|
|
235
|
-
.map(requestMessage)
|
|
236
|
-
.filter((message): message is CursorRequestMessage => !!message && message.content.length > 0);
|
|
453
|
+
const messages = cursorRequestMessagesFromRaw(parsed.context.messages);
|
|
237
454
|
const activeText = [...messages].reverse().find(message => message.role === "user" || message.role === "developer")?.content ?? "";
|
|
238
455
|
const visibleTools = cursorToolsForActivePrompt(parsed.context.tools, activeText, parsed.options.toolChoice);
|
|
239
456
|
const budget = applyCursorToolBudget(visibleTools, parsed.options.toolChoice);
|
|
240
457
|
const limitNote = catalogLimitNote(budget.tools, budget.omitted);
|
|
241
458
|
const model = normalizeCursorModelId(parsed.modelId, parsed.options.reasoning);
|
|
242
|
-
|
|
459
|
+
const request: CursorRunRequest = {
|
|
243
460
|
modelId: model.modelId,
|
|
461
|
+
...(model.requestedModelParameters ? { requestedModelParameters: model.requestedModelParameters } : {}),
|
|
244
462
|
...(model.routingLevel ? { routingLevel: model.routingLevel } : {}),
|
|
463
|
+
...(model.maxMode ? { maxMode: true } : {}),
|
|
245
464
|
conversationId: resolveCursorConversationId(parsed, model.modelId, options),
|
|
246
465
|
system: [...(parsed.context.systemPrompt ?? []), ...(limitNote ? [limitNote] : [])],
|
|
247
466
|
messages,
|
|
@@ -249,7 +468,24 @@ export function createCursorRequest(
|
|
|
249
468
|
...(parsed._compactionRequest === true || parsed._contextCompactionBoundary === true ? { contextUsageReset: true } : {}),
|
|
250
469
|
...(parsed._compactionRequest === true ? { contextUsageStoreCheckpoints: false } : {}),
|
|
251
470
|
...(budget.tools.length ? { tools: budget.tools } : {}),
|
|
471
|
+
// Bare API caller (no tools, no Codex thread identity): suppress Cursor's default
|
|
472
|
+
// native tool catalog instead of paying its ~10-15K token preamble (devlog 260826 040).
|
|
473
|
+
...(budget.tools.length === 0 && !cursorClientThreadOwner(parsed)
|
|
474
|
+
? { suppressDefaultCursorToolCatalog: true }
|
|
475
|
+
: {}),
|
|
252
476
|
...(parsed.options.toolChoice ? { toolChoice: parsed.options.toolChoice } : {}),
|
|
253
477
|
...(parsed.options.parallelToolCalls !== undefined ? { parallelToolCalls: parsed.options.parallelToolCalls } : {}),
|
|
254
478
|
};
|
|
479
|
+
const resolved = resolveCursorCheckpoint(parsed, request, options);
|
|
480
|
+
if ("reason" in resolved) {
|
|
481
|
+
request.continuationMode = "full-replay";
|
|
482
|
+
request.checkpointInvalidationReason = resolved.reason;
|
|
483
|
+
return request;
|
|
484
|
+
}
|
|
485
|
+
request.checkpointBytes = resolved.snapshot.checkpointBytes;
|
|
486
|
+
request.continuationMode = "checkpoint";
|
|
487
|
+
if (parsed.context.messages.at(-1)?.role === "toolResult" && resolved.snapshot.coveredMessageCount !== undefined) {
|
|
488
|
+
request.checkpointSuffixStart = resolved.snapshot.coveredMessageCount;
|
|
489
|
+
}
|
|
490
|
+
return request;
|
|
255
491
|
}
|