@iislee/opencodex 2.11.0 → 2.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +618 -74
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +152 -29
- package/src/images/plan.ts +23 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +865 -181
- package/src/server/lifecycle.ts +284 -13
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +288 -32
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +9 -3
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { create, toBinary } from "@bufbuild/protobuf";
|
|
2
2
|
import {
|
|
3
3
|
AgentClientMessageSchema,
|
|
4
|
+
ExecClientThrowSchema,
|
|
4
5
|
ExecClientControlMessageSchema,
|
|
5
6
|
ExecClientMessageSchema,
|
|
6
7
|
ExecClientStreamCloseSchema,
|
|
@@ -15,14 +16,18 @@ export function clientBytes(message: Parameters<typeof create<typeof AgentClient
|
|
|
15
16
|
return toBinary(AgentClientMessageSchema, create(AgentClientMessageSchema, message));
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
export function execBytes
|
|
19
|
+
export function execBytes<K extends ExecClientMessage["message"]["case"]>(
|
|
20
|
+
execMsg: ExecServerMessage,
|
|
21
|
+
messageCase: K,
|
|
22
|
+
value: Extract<ExecClientMessage["message"], { case: K }>["value"],
|
|
23
|
+
): Uint8Array {
|
|
19
24
|
return clientBytes({
|
|
20
25
|
message: {
|
|
21
26
|
case: "execClientMessage",
|
|
22
27
|
value: create(ExecClientMessageSchema, {
|
|
23
28
|
id: execMsg.id,
|
|
24
29
|
execId: execMsg.execId,
|
|
25
|
-
message: { case: messageCase, value
|
|
30
|
+
message: { case: messageCase, value } as ExecClientMessage["message"],
|
|
26
31
|
}),
|
|
27
32
|
},
|
|
28
33
|
});
|
|
@@ -45,6 +50,22 @@ export function execStreamCloseBytes(execMsg: ExecServerMessage): Uint8Array {
|
|
|
45
50
|
});
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Exec-channel typed throw (`execClientControlMessage.throw`). senpi's contract (T05):
|
|
55
|
+
* a frame that cannot be answered at all must get an explicit error reply + stream-close
|
|
56
|
+
* so the server unblocks with a known failure, instead of waiting forever on silence.
|
|
57
|
+
*/
|
|
58
|
+
export function execThrowBytes(execMsg: ExecServerMessage, error: string): Uint8Array {
|
|
59
|
+
return clientBytes({
|
|
60
|
+
message: {
|
|
61
|
+
case: "execClientControlMessage",
|
|
62
|
+
value: create(ExecClientControlMessageSchema, {
|
|
63
|
+
message: { case: "throw", value: create(ExecClientThrowSchema, { id: execMsg.id, error }) },
|
|
64
|
+
}),
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
48
69
|
export function errorText(err: unknown): string {
|
|
49
70
|
return err instanceof Error ? err.message : String(err);
|
|
50
71
|
}
|
|
@@ -39,12 +39,15 @@ const MAX_GREP_FILES = 500;
|
|
|
39
39
|
const MAX_GREP_RESULTS = 200;
|
|
40
40
|
const MAX_FILE_BYTES = 1_000_000;
|
|
41
41
|
|
|
42
|
-
function codexNativeMutationRefusal(operation: "write" | "delete"): string {
|
|
43
|
-
|
|
42
|
+
function codexNativeMutationRefusal(operation: "write" | "delete", structuredEditAvailable: boolean): string {
|
|
43
|
+
const structuredHint = structuredEditAvailable
|
|
44
|
+
? " Use the structured edit tools (`edit_file` / `multi_edit`) or the `apply_patch` tool for file edits so Codex can approve the change, enforce sandbox policy, show diffs, and record rollout."
|
|
45
|
+
: " Use the `apply_patch` tool for file edits so Codex can approve the change, enforce sandbox policy, show diffs, and record rollout.";
|
|
46
|
+
return `Cursor-native ${operation} is disabled for this Codex request because apply_patch is available.${structuredHint} No file was changed.`;
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
const NATIVE_LOCAL_EXEC_DISABLED =
|
|
47
|
-
"
|
|
50
|
+
"Cursor-native filesystem tools are not executed locally. Use a catalog tool for this work: `shell_command` / `exec_command` (or the listed `mcp_opencodex-responses_*` display alias) with host-shell-safe equivalents: POSIX (`cat`, `head`, `ls`, `rg`, `grep`) or Windows PowerShell (`Get-Content`, `Get-ChildItem`, `Select-String`); use `apply_patch` for file edits.";
|
|
48
51
|
|
|
49
52
|
export function rejectReadExecForPolicy(execMsg: ExecServerMessage): Uint8Array {
|
|
50
53
|
if (execMsg.message.case !== "readArgs") throw new Error("invalid read exec");
|
|
@@ -84,13 +87,13 @@ export function readExec(execMsg: ExecServerMessage): Uint8Array {
|
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
export function rejectWriteExecForApplyPatch(execMsg: ExecServerMessage): Uint8Array {
|
|
90
|
+
export function rejectWriteExecForApplyPatch(execMsg: ExecServerMessage, structuredEditAvailable = false): Uint8Array {
|
|
88
91
|
if (execMsg.message.case !== "writeArgs") throw new Error("invalid write exec");
|
|
89
92
|
const path = resolve(execMsg.message.value.path);
|
|
90
93
|
return execBytes(execMsg, "writeResult", create(WriteResultSchema, {
|
|
91
94
|
result: {
|
|
92
95
|
case: "rejected",
|
|
93
|
-
value: create(WriteRejectedSchema, { path, reason: codexNativeMutationRefusal("write") }),
|
|
96
|
+
value: create(WriteRejectedSchema, { path, reason: codexNativeMutationRefusal("write", structuredEditAvailable) }),
|
|
94
97
|
},
|
|
95
98
|
}));
|
|
96
99
|
}
|
|
@@ -133,13 +136,13 @@ export function writeExec(execMsg: ExecServerMessage): Uint8Array {
|
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
138
|
|
|
136
|
-
export function rejectDeleteExecForApplyPatch(execMsg: ExecServerMessage): Uint8Array {
|
|
139
|
+
export function rejectDeleteExecForApplyPatch(execMsg: ExecServerMessage, structuredEditAvailable = false): Uint8Array {
|
|
137
140
|
if (execMsg.message.case !== "deleteArgs") throw new Error("invalid delete exec");
|
|
138
141
|
const path = resolve(execMsg.message.value.path);
|
|
139
142
|
return execBytes(execMsg, "deleteResult", create(DeleteResultSchema, {
|
|
140
143
|
result: {
|
|
141
144
|
case: "rejected",
|
|
142
|
-
value: create(DeleteRejectedSchema, { path, reason: codexNativeMutationRefusal("delete") }),
|
|
145
|
+
value: create(DeleteRejectedSchema, { path, reason: codexNativeMutationRefusal("delete", structuredEditAvailable) }),
|
|
143
146
|
},
|
|
144
147
|
}));
|
|
145
148
|
}
|
|
@@ -7,7 +7,7 @@ export interface CursorNativeNetworkDeps {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
const NATIVE_FETCH_DISABLED =
|
|
10
|
-
"
|
|
10
|
+
"Cursor-native fetch is not executed locally. Use the Codex shell bridge tool `shell_command` (aliases: `exec_command`, `mcp_opencodex-responses_shell_command`, `mcp_opencodex-responses_exec_command`) with curl or wget.";
|
|
11
11
|
|
|
12
12
|
export function rejectFetchExecForPolicy(execMsg: ExecServerMessage): Uint8Array {
|
|
13
13
|
if (execMsg.message.case !== "fetchArgs") throw new Error("invalid fetch exec");
|
|
@@ -89,7 +89,6 @@ export function nativeShellDisabledMessage(): string {
|
|
|
89
89
|
// client that executes the bridge (LAN/SSH remote-proxy).
|
|
90
90
|
return (
|
|
91
91
|
"Route this through the Codex bridge shell tool from the current catalog (`shell_command` or `exec_command`, including the long `mcp_opencodex-responses_*` display name if listed). "
|
|
92
|
-
+ "Do not tell the user shell access is blocked, disabled, or denied — silently call that bridge tool. "
|
|
93
92
|
+ "Adapt the command for the Codex client host shell before calling the bridge "
|
|
94
93
|
+ "(Windows PowerShell 5.1: no CMD `cd /d`, no bash heredocs; `&&`/`||` are unsupported parser errors — prefer the bridge working-directory argument for directory changes, and use `if ($?) { ... }` for success-gated follow-up steps; do not treat `;` as a substitute for `&&`). "
|
|
95
94
|
+ "Make at most one corrected bridge attempt after a failure, then report the error and stop — do not repeat equivalent failing commands."
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
recordScreenExec,
|
|
51
51
|
type CursorNativeToolDeps,
|
|
52
52
|
} from "./native-exec-tools";
|
|
53
|
-
import { clientBytes, execBytes } from "./native-exec-common";
|
|
53
|
+
import { clientBytes, execBytes, execStreamCloseBytes, execThrowBytes } from "./native-exec-common";
|
|
54
54
|
import type { McpToolDefinition } from "./gen/agent_pb";
|
|
55
55
|
import { OCX_RESPONSES_TOOL_PROVIDER } from "./tool-definitions";
|
|
56
56
|
|
|
@@ -70,6 +70,8 @@ export interface CursorNativeExecContext extends CursorNativeExecDeps {
|
|
|
70
70
|
unsafeAllowNativeLocalExec?: boolean;
|
|
71
71
|
/** apply_patch is visible for this request; Cursor-native write/delete must not bypass Codex. */
|
|
72
72
|
rejectNativeFileMutations?: boolean;
|
|
73
|
+
/** The synthetic exact-match edit tools (edit_file / multi_edit) are advertised this request. */
|
|
74
|
+
structuredEditAvailable?: boolean;
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
export function cursorUnsafeNativeLocalExecEnabled(input: Pick<CursorNativeExecContext, "unsafeAllowNativeLocalExec"> = {}): boolean {
|
|
@@ -115,6 +117,7 @@ interface CursorBlobLimits {
|
|
|
115
117
|
interface CursorBlobRequestScopeState {
|
|
116
118
|
keys: Set<string>;
|
|
117
119
|
sealed: boolean;
|
|
120
|
+
kind: "request" | "checkpoint";
|
|
118
121
|
}
|
|
119
122
|
|
|
120
123
|
const DEFAULT_BLOB_LIMITS: CursorBlobLimits = {
|
|
@@ -128,6 +131,8 @@ const blobs = new Map<string, CursorBlobEntry>();
|
|
|
128
131
|
const blobRequestScopes = new Map<CursorBlobRequestScopeToken, CursorBlobRequestScopeState>();
|
|
129
132
|
let blobLimits = { ...DEFAULT_BLOB_LIMITS };
|
|
130
133
|
let blobBytes = 0;
|
|
134
|
+
/** Retained key-string bytes (separate from the payload cap — see key()). */
|
|
135
|
+
let blobKeyBytes = 0;
|
|
131
136
|
let blobLocalBytes = 0;
|
|
132
137
|
let blobPinnedBytes = 0;
|
|
133
138
|
let blobEvictableBytes = 0;
|
|
@@ -152,13 +157,16 @@ function recomputeBlobClassAccounting(): void {
|
|
|
152
157
|
let pinnedBytes = 0;
|
|
153
158
|
let evictableBytes = 0;
|
|
154
159
|
let oldestAt: number | null = null;
|
|
155
|
-
for (const entry of blobs
|
|
160
|
+
for (const [k, entry] of blobs) {
|
|
156
161
|
const requestPinned = entry.requestPins.size > 0;
|
|
157
162
|
const provenancePinned = entry.provenance === "remote-setBlobArgs" && !isExpired(entry, now);
|
|
158
163
|
if (entry.provenance === "local-regenerated") localBytes += entry.sizeBytes;
|
|
159
|
-
|
|
164
|
+
// Key strings classify WITH their entry: a zero-payload blob must stay
|
|
165
|
+
// evictable/pinned exactly as its payload would be, or the budget cannot
|
|
166
|
+
// select it even though the total snapshot counts its key.
|
|
167
|
+
if (requestPinned || provenancePinned) pinnedBytes += entry.sizeBytes + k.length;
|
|
160
168
|
if (!requestPinned && (entry.provenance === "local-regenerated" || isExpired(entry, now))) {
|
|
161
|
-
evictableBytes += entry.sizeBytes;
|
|
169
|
+
evictableBytes += entry.sizeBytes + k.length;
|
|
162
170
|
oldestAt = oldestAt === null ? entry.storedAt : Math.min(oldestAt, entry.storedAt);
|
|
163
171
|
}
|
|
164
172
|
}
|
|
@@ -196,9 +204,12 @@ function deleteBlob(k: string, recompute = true): number {
|
|
|
196
204
|
if (!entry) return 0;
|
|
197
205
|
blobs.delete(k);
|
|
198
206
|
blobBytes -= entry.sizeBytes;
|
|
207
|
+
blobKeyBytes -= k.length;
|
|
199
208
|
for (const scope of entry.requestPins) blobRequestScopes.get(scope)?.keys.delete(k);
|
|
200
209
|
if (recompute) recomputeBlobClassAccounting();
|
|
201
|
-
|
|
210
|
+
// Full logical release (payload + key): the retained-store snapshot counts
|
|
211
|
+
// both, so budget enforcement must see both leave.
|
|
212
|
+
return entry.sizeBytes + k.length;
|
|
202
213
|
}
|
|
203
214
|
|
|
204
215
|
function releaseHydratedBlob(k: string, requestScope?: CursorBlobRequestScopeToken): void {
|
|
@@ -313,6 +324,7 @@ function setBlob(
|
|
|
313
324
|
if (blobs.has(k)) deleteBlob(k, false);
|
|
314
325
|
blobs.set(k, entry);
|
|
315
326
|
blobBytes += entry.sizeBytes;
|
|
327
|
+
blobKeyBytes += k.length;
|
|
316
328
|
for (const scope of entry.requestPins) blobRequestScopes.get(scope)?.keys.add(k);
|
|
317
329
|
reconcileBlobClassAccountingAndEnforce();
|
|
318
330
|
return { admitted: true, replaced: existing !== undefined };
|
|
@@ -328,8 +340,20 @@ function getBlob(k: string): Uint8Array | undefined {
|
|
|
328
340
|
return entry.data;
|
|
329
341
|
}
|
|
330
342
|
|
|
343
|
+
/**
|
|
344
|
+
* Raw blob IDs up to this size keep their hex passthrough (every ID the live
|
|
345
|
+
* protocol carries is a 32-byte digest). Anything larger maps to a fixed-size
|
|
346
|
+
* SHA-256 hex of the raw bytes — the derivation is symmetric across
|
|
347
|
+
* setBlobArgs/getBlobArgs, so the round-trip still works, but a hostile or
|
|
348
|
+
* malformed multi-MiB ID can never become an unbounded hex Map key.
|
|
349
|
+
* The `h:`/`d:` prefix domain-separates the two namespaces: a digested ID's
|
|
350
|
+
* key can never collide with a raw 32-byte ID that happens to BE that digest.
|
|
351
|
+
*/
|
|
352
|
+
const MAX_BLOB_ID_PASSTHROUGH_BYTES = 64;
|
|
353
|
+
|
|
331
354
|
function key(bytes: Uint8Array): string {
|
|
332
|
-
return Buffer.from(bytes).toString("hex")
|
|
355
|
+
if (bytes.byteLength <= MAX_BLOB_ID_PASSTHROUGH_BYTES) return `h:${Buffer.from(bytes).toString("hex")}`;
|
|
356
|
+
return `d:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
333
357
|
}
|
|
334
358
|
|
|
335
359
|
/**
|
|
@@ -353,7 +377,7 @@ export function createCursorBlobRequestScope(): CursorBlobRequestScopeToken {
|
|
|
353
377
|
// IDENTITY, not just pin counts (review C2-2: identical descriptions made
|
|
354
378
|
// scope-swap bugs invisible to deep comparison).
|
|
355
379
|
const scope = Symbol(`cursor-blob-request-${++blobScopeSequence}`);
|
|
356
|
-
blobRequestScopes.set(scope, { keys: new Set(), sealed: false });
|
|
380
|
+
blobRequestScopes.set(scope, { keys: new Set(), sealed: false, kind: "request" });
|
|
357
381
|
return scope;
|
|
358
382
|
}
|
|
359
383
|
|
|
@@ -379,9 +403,52 @@ export function storeCursorBlob(data: Uint8Array, requestScope?: CursorBlobReque
|
|
|
379
403
|
return blobId;
|
|
380
404
|
}
|
|
381
405
|
|
|
406
|
+
/**
|
|
407
|
+
* Long-lived pin for blobs referenced by an active Cursor conversation checkpoint.
|
|
408
|
+
* Unlike a request scope, this lease is not sealed and is not released by getBlob hydration.
|
|
409
|
+
*/
|
|
410
|
+
export function createCursorBlobCheckpointLease(label: string): CursorBlobRequestScopeToken {
|
|
411
|
+
const scope = Symbol("cursor-blob-checkpoint-" + (++blobScopeSequence) + "-" + label.slice(0, 16));
|
|
412
|
+
blobRequestScopes.set(scope, { keys: new Set(), sealed: false, kind: "checkpoint" });
|
|
413
|
+
return scope;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export function pinCursorBlobIdsForCheckpoint(
|
|
417
|
+
blobIds: readonly Uint8Array[],
|
|
418
|
+
lease: CursorBlobRequestScopeToken,
|
|
419
|
+
): boolean {
|
|
420
|
+
const state = blobRequestScopes.get(lease);
|
|
421
|
+
if (!state || state.sealed) return false;
|
|
422
|
+
const added: Array<{ entry: { requestPins: Set<CursorBlobRequestScopeToken> }; key: string }> = [];
|
|
423
|
+
for (const blobId of blobIds) {
|
|
424
|
+
if (blobId.byteLength === 0) continue;
|
|
425
|
+
const k = key(blobId);
|
|
426
|
+
const entry = blobs.get(k);
|
|
427
|
+
if (!entry || (isExpired(entry, Date.now()) && entry.requestPins.size === 0 && entry.provenance !== "remote-setBlobArgs")) {
|
|
428
|
+
for (const pinned of added) {
|
|
429
|
+
pinned.entry.requestPins.delete(lease);
|
|
430
|
+
state.keys.delete(pinned.key);
|
|
431
|
+
}
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
if (!entry.requestPins.has(lease)) {
|
|
435
|
+
entry.requestPins.add(lease);
|
|
436
|
+
state.keys.add(k);
|
|
437
|
+
added.push({ entry, key: k });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
reconcileBlobClassAccountingAndEnforce();
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
export function hasCursorBlob(blobId: Uint8Array): boolean {
|
|
445
|
+
return getBlob(key(blobId)) !== undefined;
|
|
446
|
+
}
|
|
447
|
+
|
|
382
448
|
export interface CursorBlobMetrics {
|
|
383
449
|
count: number;
|
|
384
450
|
totalBytes: number;
|
|
451
|
+
keyBytes: number;
|
|
385
452
|
localBytes: number;
|
|
386
453
|
pinnedBytes: number;
|
|
387
454
|
rejectedEntryTooLarge: number;
|
|
@@ -393,6 +460,7 @@ export function cursorBlobMetrics(): CursorBlobMetrics {
|
|
|
393
460
|
return {
|
|
394
461
|
count: blobs.size,
|
|
395
462
|
totalBytes: blobBytes,
|
|
463
|
+
keyBytes: blobKeyBytes,
|
|
396
464
|
localBytes: blobLocalBytes,
|
|
397
465
|
pinnedBytes: blobPinnedBytes,
|
|
398
466
|
rejectedEntryTooLarge,
|
|
@@ -410,7 +478,9 @@ export function cursorBlobRetainedStoreSnapshot(): {
|
|
|
410
478
|
} {
|
|
411
479
|
return {
|
|
412
480
|
count: blobs.size,
|
|
413
|
-
|
|
481
|
+
// Payload + retained key strings: the framework must see everything the
|
|
482
|
+
// store retains. The 64 MiB admission cap stays payload-only by design.
|
|
483
|
+
bytes: blobBytes + blobKeyBytes,
|
|
414
484
|
evictableBytes: blobEvictableBytes,
|
|
415
485
|
pinnedBytes: blobPinnedBytes,
|
|
416
486
|
oldestAt: blobOldestEvictableAt,
|
|
@@ -434,12 +504,22 @@ export function setCursorBlobLimitsForTests(limits?: Partial<CursorBlobLimits>):
|
|
|
434
504
|
blobLimits = limits ? { ...DEFAULT_BLOB_LIMITS, ...limits } : { ...DEFAULT_BLOB_LIMITS };
|
|
435
505
|
}
|
|
436
506
|
|
|
507
|
+
/**
|
|
508
|
+
* The live per-blob admission ceiling. Callers that build a blob must budget against THIS value
|
|
509
|
+
* rather than a copy of the constant: the limit is test-overridable, and a hardcoded 16 MiB would
|
|
510
|
+
* silently drift from admission the moment either side changes.
|
|
511
|
+
*/
|
|
512
|
+
export function cursorBlobMaxEntryBytes(): number {
|
|
513
|
+
return blobLimits.maxEntryBytes;
|
|
514
|
+
}
|
|
515
|
+
|
|
437
516
|
export function resetCursorBlobStateForTests(): void {
|
|
438
517
|
if (blobExpiryAccountingTimer) clearTimeout(blobExpiryAccountingTimer);
|
|
439
518
|
blobExpiryAccountingTimer = undefined;
|
|
440
519
|
blobs.clear();
|
|
441
520
|
blobRequestScopes.clear();
|
|
442
521
|
blobBytes = 0;
|
|
522
|
+
blobKeyBytes = 0;
|
|
443
523
|
rejectedEntryTooLarge = 0;
|
|
444
524
|
rejectedPinnedSaturation = 0;
|
|
445
525
|
recomputeBlobClassAccounting();
|
|
@@ -488,8 +568,8 @@ export async function handleCursorNativeExec(execMsg: ExecServerMessage, deps: C
|
|
|
488
568
|
if (execCase === "fetchArgs") return [rejectFetchExecForPolicy(execMsg)];
|
|
489
569
|
}
|
|
490
570
|
if (execCase === "readArgs") return [readExec(execMsg)];
|
|
491
|
-
if (execCase === "writeArgs") return [deps.rejectNativeFileMutations ? rejectWriteExecForApplyPatch(execMsg) : writeExec(execMsg)];
|
|
492
|
-
if (execCase === "deleteArgs") return [deps.rejectNativeFileMutations ? rejectDeleteExecForApplyPatch(execMsg) : deleteExec(execMsg)];
|
|
571
|
+
if (execCase === "writeArgs") return [deps.rejectNativeFileMutations ? rejectWriteExecForApplyPatch(execMsg, deps.structuredEditAvailable === true) : writeExec(execMsg)];
|
|
572
|
+
if (execCase === "deleteArgs") return [deps.rejectNativeFileMutations ? rejectDeleteExecForApplyPatch(execMsg, deps.structuredEditAvailable === true) : deleteExec(execMsg)];
|
|
493
573
|
if (execCase === "lsArgs") return [lsExec(execMsg)];
|
|
494
574
|
if (execCase === "grepArgs") return [grepExec(execMsg)];
|
|
495
575
|
if (execCase === "shellArgs") return [shellExec(execMsg)];
|
|
@@ -523,10 +603,15 @@ export async function handleCursorNativeExec(execMsg: ExecServerMessage, deps: C
|
|
|
523
603
|
}))];
|
|
524
604
|
}
|
|
525
605
|
// Unknown exec case — Cursor added a new native exec type that our protobuf definition does not
|
|
526
|
-
// include yet.
|
|
527
|
-
//
|
|
606
|
+
// include yet. T05 (senpi contract): reply with ExecClientThrow + stream-close so the server
|
|
607
|
+
// unblocks with a known failure. Previously this returned an empty reply (silence), which is
|
|
608
|
+
// the stall class senpi explicitly refused (#116 was about throwing into failAndClear and
|
|
609
|
+
// killing the whole connection; a typed in-band throw does not do that).
|
|
528
610
|
debugProviderDiagnostic("cursor", "unknown-exec-case", { execCase: execCase ?? "unknown", execId: execMsg.execId });
|
|
529
|
-
return [
|
|
611
|
+
return [
|
|
612
|
+
execThrowBytes(execMsg, "Unknown exec message variant; this client does not implement it."),
|
|
613
|
+
execStreamCloseBytes(execMsg),
|
|
614
|
+
];
|
|
530
615
|
}
|
|
531
616
|
|
|
532
617
|
|
|
@@ -537,7 +622,9 @@ export function handleCursorNativeKv(
|
|
|
537
622
|
if (kvMsg.message.case === "getBlobArgs") {
|
|
538
623
|
const blobKey = key(kvMsg.message.value.blobId);
|
|
539
624
|
const blobData = getBlob(blobKey);
|
|
540
|
-
if (blobData
|
|
625
|
+
if (blobData && requestScope && blobRequestScopes.get(requestScope)?.kind === "request") {
|
|
626
|
+
releaseHydratedBlob(blobKey, requestScope);
|
|
627
|
+
}
|
|
541
628
|
return clientBytes({
|
|
542
629
|
message: {
|
|
543
630
|
case: "kvClientMessage",
|