@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { fromBinary } from "@bufbuild/protobuf";
|
|
3
|
+
import { ConversationStateStructureSchema, type ConversationStateStructure } from "./gen/agent_pb";
|
|
4
|
+
import {
|
|
5
|
+
createCursorBlobCheckpointLease,
|
|
6
|
+
pinCursorBlobIdsForCheckpoint,
|
|
7
|
+
releaseCursorBlobRequestScope,
|
|
8
|
+
type CursorBlobRequestScopeToken,
|
|
9
|
+
} from "./native-exec";
|
|
10
|
+
|
|
11
|
+
export const CURSOR_CHECKPOINT_TTL_MS = 15 * 60_000;
|
|
12
|
+
export const CURSOR_CHECKPOINT_MAX_ENTRIES = 64;
|
|
13
|
+
export const CURSOR_CHECKPOINT_MAX_TOTAL_BYTES = 16 * 1024 * 1024;
|
|
14
|
+
|
|
15
|
+
export type CursorCheckpointInvalidationReason =
|
|
16
|
+
| "missing_ref"
|
|
17
|
+
| "expired"
|
|
18
|
+
| "decode_failed"
|
|
19
|
+
| "conversation_changed"
|
|
20
|
+
| "identity_changed"
|
|
21
|
+
| "model_changed"
|
|
22
|
+
| "compaction"
|
|
23
|
+
| "trailing_tool_result"
|
|
24
|
+
| "force_fresh"
|
|
25
|
+
| "upstream_invalid_argument"
|
|
26
|
+
| "lineage_mismatch";
|
|
27
|
+
|
|
28
|
+
export interface CursorCheckpointSnapshot {
|
|
29
|
+
ref: string;
|
|
30
|
+
conversationId: string;
|
|
31
|
+
identityScope: string;
|
|
32
|
+
modelId: string;
|
|
33
|
+
checkpointBytes: Uint8Array;
|
|
34
|
+
createdAt: number;
|
|
35
|
+
lastAccessAt: number;
|
|
36
|
+
blobLease?: CursorBlobRequestScopeToken;
|
|
37
|
+
coveredMessageCount?: number;
|
|
38
|
+
prefixDigest?: string;
|
|
39
|
+
systemDigest?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface CursorCheckpointStore {
|
|
43
|
+
snapshots: Map<string, CursorCheckpointSnapshot>;
|
|
44
|
+
prefixIndex: Map<string, Set<string>>;
|
|
45
|
+
totalBytes: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const store: CursorCheckpointStore = {
|
|
49
|
+
snapshots: new Map(),
|
|
50
|
+
prefixIndex: new Map(),
|
|
51
|
+
totalBytes: 0,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
let nowFn = (): number => Date.now();
|
|
55
|
+
let scheduleFn = (fn: () => void, ms: number): ReturnType<typeof setTimeout> => {
|
|
56
|
+
const timer = setTimeout(fn, ms);
|
|
57
|
+
timer.unref?.();
|
|
58
|
+
return timer;
|
|
59
|
+
};
|
|
60
|
+
let clearScheduleFn = (timer: ReturnType<typeof setTimeout>): void => {
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
};
|
|
63
|
+
let pruneTimer: ReturnType<typeof setTimeout> | undefined;
|
|
64
|
+
|
|
65
|
+
function now(): number {
|
|
66
|
+
return nowFn();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function installCursorCheckpointClockForTests(input: {
|
|
70
|
+
now?: () => number;
|
|
71
|
+
schedule?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
|
|
72
|
+
clear?: (timer: ReturnType<typeof setTimeout>) => void;
|
|
73
|
+
}): void {
|
|
74
|
+
if (input.now) nowFn = input.now;
|
|
75
|
+
if (input.schedule) scheduleFn = input.schedule;
|
|
76
|
+
if (input.clear) clearScheduleFn = input.clear;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function resetCursorCheckpointClockForTests(): void {
|
|
80
|
+
nowFn = () => Date.now();
|
|
81
|
+
scheduleFn = (fn, ms) => {
|
|
82
|
+
const timer = setTimeout(fn, ms);
|
|
83
|
+
timer.unref?.();
|
|
84
|
+
return timer;
|
|
85
|
+
};
|
|
86
|
+
clearScheduleFn = timer => {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
};
|
|
89
|
+
stopPruneTimer();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function stopPruneTimer(): void {
|
|
93
|
+
if (pruneTimer !== undefined) clearScheduleFn(pruneTimer);
|
|
94
|
+
pruneTimer = undefined;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function schedulePrune(at = now()): void {
|
|
98
|
+
stopPruneTimer();
|
|
99
|
+
let nextExpiry = Number.POSITIVE_INFINITY;
|
|
100
|
+
for (const snapshot of store.snapshots.values()) {
|
|
101
|
+
nextExpiry = Math.min(nextExpiry, snapshot.lastAccessAt + CURSOR_CHECKPOINT_TTL_MS);
|
|
102
|
+
}
|
|
103
|
+
if (!Number.isFinite(nextExpiry)) return;
|
|
104
|
+
pruneTimer = scheduleFn(() => {
|
|
105
|
+
pruneTimer = undefined;
|
|
106
|
+
prune();
|
|
107
|
+
schedulePrune();
|
|
108
|
+
}, Math.max(0, nextExpiry - at));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function prune(at = now()): void {
|
|
112
|
+
for (const [ref, snapshot] of store.snapshots) {
|
|
113
|
+
if (at - snapshot.lastAccessAt > CURSOR_CHECKPOINT_TTL_MS) deleteSnapshot(ref);
|
|
114
|
+
}
|
|
115
|
+
while (store.snapshots.size > CURSOR_CHECKPOINT_MAX_ENTRIES || store.totalBytes > CURSOR_CHECKPOINT_MAX_TOTAL_BYTES) {
|
|
116
|
+
const oldest = store.snapshots.keys().next().value;
|
|
117
|
+
if (oldest === undefined) break;
|
|
118
|
+
deleteSnapshot(oldest);
|
|
119
|
+
}
|
|
120
|
+
schedulePrune(at);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function indexPrefix(digest: string | undefined, ref: string): void {
|
|
124
|
+
if (!digest) return;
|
|
125
|
+
const refs = store.prefixIndex.get(digest) ?? new Set<string>();
|
|
126
|
+
refs.add(ref);
|
|
127
|
+
store.prefixIndex.set(digest, refs);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function unindexPrefix(digest: string | undefined, ref: string): void {
|
|
131
|
+
if (!digest) return;
|
|
132
|
+
const refs = store.prefixIndex.get(digest);
|
|
133
|
+
if (!refs) return;
|
|
134
|
+
refs.delete(ref);
|
|
135
|
+
if (refs.size === 0) store.prefixIndex.delete(digest);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function deleteSnapshot(ref: string): void {
|
|
139
|
+
const existing = store.snapshots.get(ref);
|
|
140
|
+
if (!existing) return;
|
|
141
|
+
if (existing.blobLease) releaseCursorBlobRequestScope(existing.blobLease);
|
|
142
|
+
unindexPrefix(existing.prefixDigest, ref);
|
|
143
|
+
store.snapshots.delete(ref);
|
|
144
|
+
store.totalBytes = Math.max(0, store.totalBytes - existing.checkpointBytes.byteLength);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function collectStateBlobIds(state: ConversationStateStructure, ids: Uint8Array[]): void {
|
|
148
|
+
ids.push(
|
|
149
|
+
...state.rootPromptMessagesJson,
|
|
150
|
+
...state.turns,
|
|
151
|
+
...state.turnsOld,
|
|
152
|
+
...state.todos,
|
|
153
|
+
...state.summaryArchives,
|
|
154
|
+
);
|
|
155
|
+
if (state.summary) ids.push(state.summary);
|
|
156
|
+
if (state.summaryArchive) ids.push(state.summaryArchive);
|
|
157
|
+
if (state.plan) ids.push(state.plan);
|
|
158
|
+
for (const value of Object.values(state.fileStates)) ids.push(value);
|
|
159
|
+
for (const value of Object.values(state.fileStatesV2)) {
|
|
160
|
+
if (value.content) ids.push(value.content);
|
|
161
|
+
if (value.initialContent) ids.push(value.initialContent);
|
|
162
|
+
}
|
|
163
|
+
for (const nested of Object.values(state.subagentStates)) {
|
|
164
|
+
if (nested.conversationState) collectStateBlobIds(nested.conversationState, ids);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function collectCheckpointBlobIds(checkpointBytes: Uint8Array): Uint8Array[] | undefined {
|
|
169
|
+
try {
|
|
170
|
+
const ids: Uint8Array[] = [];
|
|
171
|
+
collectStateBlobIds(fromBinary(ConversationStateStructureSchema, checkpointBytes), ids);
|
|
172
|
+
return ids.filter(id => id.byteLength > 0);
|
|
173
|
+
} catch {
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function cursorCheckpointRefHash(ref: string): string {
|
|
179
|
+
return createHash("sha256").update("ocx:cursor:ckpt-ref:").update(ref).digest("hex").slice(0, 16);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function commitCursorCheckpoint(input: {
|
|
183
|
+
conversationId: string;
|
|
184
|
+
identityScope?: string;
|
|
185
|
+
modelId: string;
|
|
186
|
+
checkpointBytes: Uint8Array;
|
|
187
|
+
coveredMessageCount?: number;
|
|
188
|
+
prefixDigest?: string;
|
|
189
|
+
systemDigest?: string;
|
|
190
|
+
}): string | undefined {
|
|
191
|
+
if (!input.conversationId || !input.modelId || input.checkpointBytes.byteLength === 0) return undefined;
|
|
192
|
+
if (input.checkpointBytes.byteLength > CURSOR_CHECKPOINT_MAX_TOTAL_BYTES) return undefined;
|
|
193
|
+
prune();
|
|
194
|
+
const createdAt = now();
|
|
195
|
+
const ref = createHash("sha256")
|
|
196
|
+
.update("ocx:cursor:ckpt:")
|
|
197
|
+
.update(input.conversationId)
|
|
198
|
+
.update("|")
|
|
199
|
+
.update(input.identityScope?.trim() || "local")
|
|
200
|
+
.update("|")
|
|
201
|
+
.update(input.modelId)
|
|
202
|
+
.update("|")
|
|
203
|
+
.update(String(createdAt))
|
|
204
|
+
.update("|")
|
|
205
|
+
.update(input.checkpointBytes)
|
|
206
|
+
.digest("hex")
|
|
207
|
+
.slice(0, 32);
|
|
208
|
+
const snapshot: CursorCheckpointSnapshot = {
|
|
209
|
+
ref,
|
|
210
|
+
conversationId: input.conversationId,
|
|
211
|
+
identityScope: input.identityScope?.trim() || "local",
|
|
212
|
+
modelId: input.modelId,
|
|
213
|
+
checkpointBytes: input.checkpointBytes.slice(),
|
|
214
|
+
createdAt,
|
|
215
|
+
lastAccessAt: createdAt,
|
|
216
|
+
...(input.coveredMessageCount !== undefined ? { coveredMessageCount: input.coveredMessageCount } : {}),
|
|
217
|
+
...(input.prefixDigest ? { prefixDigest: input.prefixDigest } : {}),
|
|
218
|
+
...(input.systemDigest ? { systemDigest: input.systemDigest } : {}),
|
|
219
|
+
};
|
|
220
|
+
const blobIds = collectCheckpointBlobIds(input.checkpointBytes);
|
|
221
|
+
if (blobIds === undefined) return undefined;
|
|
222
|
+
if (blobIds.length > 0) {
|
|
223
|
+
const lease = createCursorBlobCheckpointLease(ref);
|
|
224
|
+
if (!pinCursorBlobIdsForCheckpoint(blobIds, lease)) {
|
|
225
|
+
releaseCursorBlobRequestScope(lease);
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
snapshot.blobLease = lease;
|
|
229
|
+
}
|
|
230
|
+
deleteSnapshot(ref);
|
|
231
|
+
store.snapshots.set(ref, snapshot);
|
|
232
|
+
store.totalBytes += snapshot.checkpointBytes.byteLength;
|
|
233
|
+
indexPrefix(snapshot.prefixDigest, ref);
|
|
234
|
+
prune(createdAt);
|
|
235
|
+
return store.snapshots.has(ref) ? ref : undefined;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function getCursorCheckpointForPrefix(input: {
|
|
239
|
+
conversationId: string;
|
|
240
|
+
prefixDigest: string;
|
|
241
|
+
systemDigest: string;
|
|
242
|
+
coveredMessageCount: number;
|
|
243
|
+
identityScope?: string;
|
|
244
|
+
modelId: string;
|
|
245
|
+
}): CursorCheckpointSnapshot | undefined {
|
|
246
|
+
prune();
|
|
247
|
+
const refs = store.prefixIndex.get(input.prefixDigest);
|
|
248
|
+
if (!refs) return undefined;
|
|
249
|
+
const identityScope = input.identityScope?.trim() || "local";
|
|
250
|
+
let foundRef: string | undefined;
|
|
251
|
+
for (const ref of refs) {
|
|
252
|
+
const snapshot = store.snapshots.get(ref);
|
|
253
|
+
if (!snapshot) continue;
|
|
254
|
+
if (snapshot.conversationId !== input.conversationId) continue;
|
|
255
|
+
if (snapshot.systemDigest !== input.systemDigest) continue;
|
|
256
|
+
if (snapshot.coveredMessageCount !== input.coveredMessageCount) continue;
|
|
257
|
+
if (snapshot.identityScope !== identityScope) continue;
|
|
258
|
+
if (snapshot.modelId !== input.modelId) continue;
|
|
259
|
+
if (foundRef) return undefined;
|
|
260
|
+
foundRef = ref;
|
|
261
|
+
}
|
|
262
|
+
return getCursorCheckpoint(foundRef);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function getLatestCursorCheckpoint(
|
|
266
|
+
match: (snapshot: CursorCheckpointSnapshot) => boolean,
|
|
267
|
+
): CursorCheckpointSnapshot | undefined {
|
|
268
|
+
prune();
|
|
269
|
+
let found: CursorCheckpointSnapshot | undefined;
|
|
270
|
+
for (const snapshot of store.snapshots.values()) {
|
|
271
|
+
if (match(snapshot)) found = snapshot;
|
|
272
|
+
}
|
|
273
|
+
return found ? getCursorCheckpoint(found.ref) : undefined;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function getCursorCheckpoint(ref: string | undefined): CursorCheckpointSnapshot | undefined {
|
|
277
|
+
if (!ref) return undefined;
|
|
278
|
+
prune();
|
|
279
|
+
const snapshot = store.snapshots.get(ref);
|
|
280
|
+
if (!snapshot) return undefined;
|
|
281
|
+
const at = now();
|
|
282
|
+
if (at - snapshot.lastAccessAt > CURSOR_CHECKPOINT_TTL_MS) {
|
|
283
|
+
deleteSnapshot(ref);
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
snapshot.lastAccessAt = at;
|
|
287
|
+
store.snapshots.delete(ref);
|
|
288
|
+
store.snapshots.set(ref, snapshot);
|
|
289
|
+
return snapshot;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export function invalidateCursorCheckpoint(ref: string | undefined): void {
|
|
293
|
+
if (!ref) return;
|
|
294
|
+
deleteSnapshot(ref);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export function clearCursorCheckpointsForTests(): void {
|
|
298
|
+
stopPruneTimer();
|
|
299
|
+
for (const ref of [...store.snapshots.keys()]) deleteSnapshot(ref);
|
|
300
|
+
store.snapshots.clear();
|
|
301
|
+
store.prefixIndex.clear();
|
|
302
|
+
store.totalBytes = 0;
|
|
303
|
+
resetCursorCheckpointClockForTests();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export function cursorCheckpointStoreMetricsForTests(): { count: number; totalBytes: number } {
|
|
307
|
+
return { count: store.snapshots.size, totalBytes: store.totalBytes };
|
|
308
|
+
}
|
|
@@ -27,7 +27,56 @@ function errorCode(value: unknown): string {
|
|
|
27
27
|
* True when Cursor intentionally cancelled the HTTP/2 stream after a client-tool suspend.
|
|
28
28
|
* These are expected between multi-turn Responses bridge cycles, not upstream failures.
|
|
29
29
|
*/
|
|
30
|
+
/**
|
|
31
|
+
* A Cursor stream that ended cleanly at the HTTP/2 layer while a client tool call was still
|
|
32
|
+
* open — no `turnEnded`, no error trailer, just EOF. The call's buffered arguments are lost,
|
|
33
|
+
* so the turn is truncated: reporting it as success would hand Codex a turn whose tool call
|
|
34
|
+
* silently never happened. Not retryable — the request is committed once the session connects.
|
|
35
|
+
*/
|
|
36
|
+
export class CursorStreamTruncatedError extends Error {
|
|
37
|
+
constructor(
|
|
38
|
+
public readonly openCallIds: readonly string[],
|
|
39
|
+
public readonly framesReceived: number,
|
|
40
|
+
) {
|
|
41
|
+
super(
|
|
42
|
+
`Cursor stream ended without terminating the turn; ${openCallIds.length} tool call(s) left incomplete `
|
|
43
|
+
+ `(${openCallIds.join(", ")}) after ${framesReceived} frame(s). Arguments may be truncated; the call was not committed.`,
|
|
44
|
+
);
|
|
45
|
+
this.name = "CursorStreamTruncatedError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A cancel-shaped stream failure that WE did not request. `cancelCursorRun` is the only place
|
|
51
|
+
* that cancels our own stream, and it sets `expectedClose` first, so a cancel arriving without it
|
|
52
|
+
* came from Cursor or the network and is a real transport failure.
|
|
53
|
+
*
|
|
54
|
+
* It carries its own message on purpose. Left as a raw `NGHTTP2_CANCEL` error, the text is
|
|
55
|
+
* re-matched downstream (`classifyCursorError`) and labelled "Cursor stream suspended" — a turn
|
|
56
|
+
* that failed unexpectedly would report an intentional suspension and misdirect diagnosis.
|
|
57
|
+
*/
|
|
58
|
+
export class CursorUnexpectedCancelError extends Error {
|
|
59
|
+
/**
|
|
60
|
+
* The originating error's transport code (typically `NGHTTP2_CANCEL`), re-exposed so the
|
|
61
|
+
* per-turn `turn-failed` diagnostic still records how the stream actually died. Wrapping
|
|
62
|
+
* without this made the summary for exactly this failure the one with no code.
|
|
63
|
+
*/
|
|
64
|
+
public readonly code?: string;
|
|
65
|
+
|
|
66
|
+
constructor(public readonly cause?: unknown) {
|
|
67
|
+
super("Cursor connection was cancelled by the server before the turn completed");
|
|
68
|
+
this.name = "CursorUnexpectedCancelError";
|
|
69
|
+
const causeCode = errorCode(cause);
|
|
70
|
+
if (causeCode) this.code = causeCode;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
30
74
|
export function isCursorBenignCancelError(value: unknown): boolean {
|
|
75
|
+
// An unexpected cancel is never benign, however it is spelled. This class is raised only when
|
|
76
|
+
// the transport knows WE did not request the cancel, so its provenance outranks the code match
|
|
77
|
+
// below — otherwise the adapter would re-decide the same question from the error code alone
|
|
78
|
+
// and swallow a real transport failure (cursor.ts:181).
|
|
79
|
+
if (value instanceof CursorUnexpectedCancelError) return false;
|
|
31
80
|
const message = errorMessage(value).toLowerCase();
|
|
32
81
|
const code = errorCode(value).toUpperCase();
|
|
33
82
|
if (code === "NGHTTP2_CANCEL") return true;
|
|
@@ -36,6 +85,21 @@ export function isCursorBenignCancelError(value: unknown): boolean {
|
|
|
36
85
|
return false;
|
|
37
86
|
}
|
|
38
87
|
|
|
88
|
+
/**
|
|
89
|
+
* True when the turn was torn down by an `AbortSignal` rather than by a transport fault.
|
|
90
|
+
*
|
|
91
|
+
* This is deliberately NOT part of `isCursorBenignCancelError`: an abort mid-turn is a real
|
|
92
|
+
* failure and must still surface. It is only meaningful in combination with a terminal frame
|
|
93
|
+
* having already been emitted, where it means "the answer landed and then the connection went
|
|
94
|
+
* away" (#1527).
|
|
95
|
+
*/
|
|
96
|
+
export function isCursorAbortError(value: unknown): boolean {
|
|
97
|
+
const message = errorMessage(value).toLowerCase();
|
|
98
|
+
if (message.includes("cursor request was aborted")) return true;
|
|
99
|
+
const name = (value as { name?: unknown })?.name;
|
|
100
|
+
return typeof name === "string" && name === "AbortError";
|
|
101
|
+
}
|
|
102
|
+
|
|
39
103
|
/**
|
|
40
104
|
* True when Cursor Connect rejected the turn with invalid_argument.
|
|
41
105
|
* Seen after stepCompleted on brittle external-model continuations.
|
|
@@ -48,6 +112,58 @@ export function isCursorInvalidArgumentError(value: unknown): boolean {
|
|
|
48
112
|
}
|
|
49
113
|
|
|
50
114
|
const QUOTA_RATE_CUES = ["too many requests", "quota", "rate limit", "rate-limit", "throttl"];
|
|
115
|
+
/**
|
|
116
|
+
* A bare `resource_exhausted` end-stream with no detail beyond a generic error wrapper
|
|
117
|
+
* ("Error" or empty tail) and zero tokens billed is the shape Cursor's backend emits when
|
|
118
|
+
* the request payload exceeded its context window — not when quota ran out (senpi #1009,
|
|
119
|
+
* #1036: same wording, two causes). Quota rejections always carry an explicit rate cue
|
|
120
|
+
* ("too many requests", "quota exhausted"), so the ABSENCE of those cues plus the
|
|
121
|
+
* absence of a size phrase means payload overflow. Classifying it as 429 makes Codex
|
|
122
|
+
* back off instead of compacting, which burns retries on an unfixable-by-retry failure.
|
|
123
|
+
*/
|
|
124
|
+
const BARE_RE_TAILS = new Set(["error", "", "resource_exhausted", "resource exhausted"]);
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Size prior for bare resource_exhausted classification (devlog 260, live probe 210):
|
|
128
|
+
* a plan-gated model returns the SAME bare RE shape on a ~20-token prompt that a real
|
|
129
|
+
* payload overflow produces, so the message alone cannot separate "compact and retry"
|
|
130
|
+
* from "this account cannot use this model". When the caller can supply how large the
|
|
131
|
+
* request actually was relative to the model's window, a small request keeps the
|
|
132
|
+
* 429-class mapping; only a plausibly-large one classifies as overflow. Unknown
|
|
133
|
+
* sizes keep today's overflow mapping so the prior only ever REMOVES false overflows
|
|
134
|
+
* it can prove.
|
|
135
|
+
*/
|
|
136
|
+
export interface CursorSizeContext {
|
|
137
|
+
estimatedInputTokens?: number;
|
|
138
|
+
contextWindow?: number;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const OVERFLOW_MIN_FRACTION = 0.5;
|
|
142
|
+
|
|
143
|
+
function bareReLooksLikeOverflow(context?: CursorSizeContext): boolean {
|
|
144
|
+
if (!context) return true;
|
|
145
|
+
const { estimatedInputTokens, contextWindow } = context;
|
|
146
|
+
if (estimatedInputTokens === undefined || contextWindow === undefined || contextWindow <= 0) return true;
|
|
147
|
+
return estimatedInputTokens >= OVERFLOW_MIN_FRACTION * contextWindow;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function isCursorZeroTokenResourceExhausted(lowerMessage: string): boolean {
|
|
151
|
+
if (!lowerMessage.includes("resource_exhausted") && !lowerMessage.includes("resource exhausted")) return false;
|
|
152
|
+
// Any explicit quota/rate cue wins: this is a real 429.
|
|
153
|
+
if (QUOTA_RATE_CUES.some(cue => lowerMessage.includes(cue))) return false;
|
|
154
|
+
// An explicit size phrase also wins (already handled by the existing classifier).
|
|
155
|
+
if (isCursorRequestTooLargeDetail(lowerMessage)) return false;
|
|
156
|
+
// Extract the tail after the resource_exhausted marker. If it names a specific
|
|
157
|
+
// non-quota, non-size cause, this is NOT bare overflow.
|
|
158
|
+
const idx = Math.max(
|
|
159
|
+
lowerMessage.indexOf("resource_exhausted"),
|
|
160
|
+
lowerMessage.indexOf("resource exhausted"),
|
|
161
|
+
);
|
|
162
|
+
const tail = lowerMessage.slice(idx + "resource_exhausted".length).trim().replace(/^[:\s]+/, "").trim();
|
|
163
|
+
if (!BARE_RE_TAILS.has(tail)) return false;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
|
|
51
167
|
const REQUEST_TOO_LARGE_PATTERNS: (string | RegExp)[] = [
|
|
52
168
|
"tool catalog too large",
|
|
53
169
|
"tool registration too large",
|
|
@@ -80,7 +196,7 @@ export function isCursorRequestTooLargeDetail(lowerMessage: string): boolean {
|
|
|
80
196
|
* The returned prefix string is recognized by `src/lib/errors.ts` `classifyError` keywords,
|
|
81
197
|
* so bridge-level error mapping produces the right Codex error type (rate_limit, auth, etc.).
|
|
82
198
|
*/
|
|
83
|
-
export function classifyCursorError(message: string): string {
|
|
199
|
+
export function classifyCursorError(message: string, sizeContext?: CursorSizeContext): string {
|
|
84
200
|
const lower = message.toLowerCase();
|
|
85
201
|
|
|
86
202
|
if (isCursorBenignCancelError(message)) return "Cursor stream suspended";
|
|
@@ -94,9 +210,16 @@ export function classifyCursorError(message: string): string {
|
|
|
94
210
|
// client-fixable 400; everything else surfaces as a 429 so Codex backs off
|
|
95
211
|
// instead of hammering retries (live evidence: 6x 400 retry storm, devlog
|
|
96
212
|
// 260723_cursor_context_continuity/000_plan.md).
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
213
|
+
if (isCursorRequestTooLargeDetail(lower)) return "Cursor resource limit exceeded";
|
|
214
|
+
// A bare resource_exhausted with no quota cue and no size phrase is payload
|
|
215
|
+
// overflow, not rate limiting. Classifying it as 429 makes Codex back off on a
|
|
216
|
+
// failure that only compaction can fix (senpi #1009 / #1036; research unit T01).
|
|
217
|
+
// Refinement (devlog 260): plan-gated models emit the same bare shape on tiny
|
|
218
|
+
// requests — when the caller proves the request was small, keep the 429 class.
|
|
219
|
+
if (isCursorZeroTokenResourceExhausted(lower)) {
|
|
220
|
+
return bareReLooksLikeOverflow(sizeContext) ? "Cursor context limit exceeded" : "Cursor rate limit exceeded";
|
|
221
|
+
}
|
|
222
|
+
return "Cursor rate limit exceeded";
|
|
100
223
|
}
|
|
101
224
|
|
|
102
225
|
if (
|
|
@@ -118,6 +241,21 @@ export function classifyCursorError(message: string): string {
|
|
|
118
241
|
lower.includes("access denied")
|
|
119
242
|
) return "Cursor authentication failed";
|
|
120
243
|
|
|
244
|
+
// gRPC FAILED_PRECONDITION is deterministic and non-retryable (unlike UNAVAILABLE):
|
|
245
|
+
// the backend rejected the call because the account/plan state does not allow it —
|
|
246
|
+
// seen live when a plan-gated model (e.g. claude-fable-5) runs on a plan without it.
|
|
247
|
+
// Leaving it as "Cursor upstream error" (502) made clients retry it as overload.
|
|
248
|
+
//
|
|
249
|
+
// This MUST precede the overload keywords. The explicit gRPC status code is a
|
|
250
|
+
// structured signal from the backend; the keywords are inference over free text. A
|
|
251
|
+
// plan-gated rejection routinely reads "failed_precondition: model unavailable for
|
|
252
|
+
// this plan", which matched "unavailable" first and came back as a retryable
|
|
253
|
+
// overload — the exact misclassification this branch was added to stop. Checking the
|
|
254
|
+
// code first lets the deterministic signal win over the words around it.
|
|
255
|
+
if (lower.includes("failed_precondition") || lower.includes("failed precondition")) {
|
|
256
|
+
return "Cursor invalid request";
|
|
257
|
+
}
|
|
258
|
+
|
|
121
259
|
if (
|
|
122
260
|
lower.includes("unavailable") ||
|
|
123
261
|
lower.includes("overloaded") ||
|
|
@@ -156,8 +294,8 @@ export function classifyCursorError(message: string): string {
|
|
|
156
294
|
* Produce a user-facing, secret-safe Cursor error message with an actionable category prefix.
|
|
157
295
|
* Mirrors `safeKiroErrorMessage` / `safeKiroHttpErrorMessage` in kiro-errors.ts.
|
|
158
296
|
*/
|
|
159
|
-
export function safeCursorErrorMessage(rawMessage: string): string {
|
|
160
|
-
const prefix = classifyCursorError(rawMessage);
|
|
297
|
+
export function safeCursorErrorMessage(rawMessage: string, sizeContext?: CursorSizeContext): string {
|
|
298
|
+
const prefix = classifyCursorError(rawMessage, sizeContext);
|
|
161
299
|
const detail = sanitize(rawMessage)
|
|
162
300
|
.replace(/resource[_ ]exhausted/gi, "resource limit exceeded")
|
|
163
301
|
.slice(0, 500);
|