@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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AdapterEvent } from "../../types";
|
|
2
|
+
import { encodeCursorCallId } from "./call-id";
|
|
2
3
|
import { cursorExecResult } from "./exec-policy";
|
|
3
4
|
import type { CursorClientMessage, CursorServerMessage } from "./types";
|
|
4
5
|
import type { CursorKvStore } from "./kv-store";
|
|
@@ -18,7 +19,9 @@ export function mapCursorServerMessage(
|
|
|
18
19
|
case "thinking":
|
|
19
20
|
return [{ type: "thinking_delta", thinking: message.thinking }];
|
|
20
21
|
case "tool_call_start":
|
|
21
|
-
|
|
22
|
+
// Cursor composite ids can contain a literal newline; Responses call_ids
|
|
23
|
+
// must stay single-line (see call-id.ts).
|
|
24
|
+
return [{ type: "tool_call_start", id: encodeCursorCallId(message.id), name: message.name }];
|
|
22
25
|
case "tool_call_delta":
|
|
23
26
|
return [{ type: "tool_call_delta", arguments: message.arguments }];
|
|
24
27
|
case "tool_call_end":
|
|
@@ -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
|
}
|
|
@@ -170,10 +170,33 @@ function runExternalJson(command: string, payload: unknown, config: DesktopExecu
|
|
|
170
170
|
}
|
|
171
171
|
});
|
|
172
172
|
|
|
173
|
+
// A command that never reads stdin - `echo`, a script that exits on a bad flag,
|
|
174
|
+
// anything that fails before its first read - closes the pipe while we are still
|
|
175
|
+
// writing to it. The write then fails with EPIPE, and on Linux that surfaces as an
|
|
176
|
+
// ASYNCHRONOUS 'error' event on the stream rather than a throw, so the try/catch
|
|
177
|
+
// below never saw it and the rejection escaped as an unhandled stream error. On
|
|
178
|
+
// macOS the same command usually drains the small payload first, which is why this
|
|
179
|
+
// only ever went red on the Linux shard.
|
|
180
|
+
//
|
|
181
|
+
// EPIPE here is not a failure of the executor CONTRACT: the child's exit code and
|
|
182
|
+
// stdout are what decide the result, and both are handled in 'close' above. So the
|
|
183
|
+
// pipe error is swallowed deliberately and the outcome is left to the child, which
|
|
184
|
+
// is what makes "bad output maps to failure" reachable instead of exploding.
|
|
185
|
+
child.stdin.on("error", (err: NodeJS.ErrnoException) => {
|
|
186
|
+
if (err.code === "EPIPE" || err.code === "ERR_STREAM_DESTROYED") return;
|
|
187
|
+
if (settled) return;
|
|
188
|
+
settled = true;
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
reject(err);
|
|
191
|
+
});
|
|
173
192
|
try {
|
|
174
193
|
child.stdin.write(JSON.stringify(payload));
|
|
175
194
|
child.stdin.end();
|
|
176
195
|
} catch (err) {
|
|
196
|
+
// Kept for the synchronous half: a stream already destroyed when we reach this
|
|
197
|
+
// line throws immediately instead of emitting.
|
|
198
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
199
|
+
if (code === "EPIPE" || code === "ERR_STREAM_DESTROYED") return;
|
|
177
200
|
if (!settled) {
|
|
178
201
|
settled = true;
|
|
179
202
|
clearTimeout(timer);
|
|
@@ -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 `Make this ${operation} through the Codex edit path instead.${structuredHint} No file was changed. Do NOT narrate this redirect or comment on tool availability — just make the edit call.`;
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
const NATIVE_LOCAL_EXEC_DISABLED =
|
|
47
|
-
"
|
|
50
|
+
"Re-issue this operation NOW through the catalog shell tool (`shell_command` / `exec_command`, or the listed `mcp_opencodex-responses_*` display alias) with the host-shell-safe equivalent: POSIX (`cat`, `head`, `ls`, `rg`, `grep`) or Windows PowerShell (`Get-Content`, `Get-ChildItem`, `Select-String`); use `apply_patch` for file edits. Do NOT narrate this redirect, do NOT comment on tool availability, and do NOT re-announce the task — just make the bridge call.";
|
|
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
|
+
"Re-issue this fetch NOW through the catalog shell tool `shell_command` (aliases: `exec_command`, `mcp_opencodex-responses_shell_command`, `mcp_opencodex-responses_exec_command`) with curl or wget. Do NOT narrate this redirect or comment on tool availability — just make the bridge call.";
|
|
11
11
|
|
|
12
12
|
export function rejectFetchExecForPolicy(execMsg: ExecServerMessage): Uint8Array {
|
|
13
13
|
if (execMsg.message.case !== "fetchArgs") throw new Error("invalid fetch exec");
|
|
@@ -87,12 +87,14 @@ export function nativeShellDisabledMessage(): string {
|
|
|
87
87
|
// idioms through the Codex bridge on Windows PowerShell 5.1 and looping (#604).
|
|
88
88
|
// Keep this host-shell-neutral: OpenCodex may run on a different OS than the Codex
|
|
89
89
|
// client that executes the bridge (LAN/SSH remote-proxy).
|
|
90
|
+
// Silent-redirect framing (devlog 260826 gap-8): no "blocked/denied/disabled" words —
|
|
91
|
+
// models narrate those as a surface switch ("Shell이 차단되어 전환합니다") and burn turns.
|
|
90
92
|
return (
|
|
91
|
-
"
|
|
92
|
-
+ "Do not tell the user shell access is blocked, disabled, or denied — silently call that bridge tool. "
|
|
93
|
+
"Re-issue this command NOW through the catalog shell tool (`shell_command` or `exec_command`; the long `mcp_opencodex-responses_*` display name is the same tool). "
|
|
93
94
|
+ "Adapt the command for the Codex client host shell before calling the bridge "
|
|
94
95
|
+ "(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
|
-
+ "Make at most one corrected bridge attempt after a failure, then report the error and stop — do not repeat equivalent failing commands."
|
|
96
|
+
+ "Make at most one corrected bridge attempt after a failure, then report the error and stop — do not repeat equivalent failing commands. "
|
|
97
|
+
+ "Do NOT narrate this redirect, do NOT comment on tool availability, and do NOT re-announce the task — just make the bridge call."
|
|
96
98
|
);
|
|
97
99
|
}
|
|
98
100
|
|
|
@@ -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,65 @@ export function storeCursorBlob(data: Uint8Array, requestScope?: CursorBlobReque
|
|
|
379
403
|
return blobId;
|
|
380
404
|
}
|
|
381
405
|
|
|
406
|
+
/**
|
|
407
|
+
* Serve-time integrity for content-addressed blobs (devlog 260826_cursor_responses_gap 080):
|
|
408
|
+
* a raw 32-byte blob id IS the SHA-256 of its bytes, so served data whose digest mismatches
|
|
409
|
+
* the id means in-store corruption — the splice signature behind garbled replayed tool
|
|
410
|
+
* results. Ids longer than 32 bytes (digested-key namespace) and server-minted ids are not
|
|
411
|
+
* content-addressed and always pass.
|
|
412
|
+
*/
|
|
413
|
+
export function cursorBlobServeIntegrityOk(blobId: Uint8Array, served: Uint8Array): boolean {
|
|
414
|
+
if (blobId.byteLength !== 32) return true;
|
|
415
|
+
const digest = createHash("sha256").update(served).digest();
|
|
416
|
+
return digest.equals(Buffer.from(blobId));
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Long-lived pin for blobs referenced by an active Cursor conversation checkpoint.
|
|
421
|
+
* Unlike a request scope, this lease is not sealed and is not released by getBlob hydration.
|
|
422
|
+
*/
|
|
423
|
+
export function createCursorBlobCheckpointLease(label: string): CursorBlobRequestScopeToken {
|
|
424
|
+
const scope = Symbol("cursor-blob-checkpoint-" + (++blobScopeSequence) + "-" + label.slice(0, 16));
|
|
425
|
+
blobRequestScopes.set(scope, { keys: new Set(), sealed: false, kind: "checkpoint" });
|
|
426
|
+
return scope;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
export function pinCursorBlobIdsForCheckpoint(
|
|
430
|
+
blobIds: readonly Uint8Array[],
|
|
431
|
+
lease: CursorBlobRequestScopeToken,
|
|
432
|
+
): boolean {
|
|
433
|
+
const state = blobRequestScopes.get(lease);
|
|
434
|
+
if (!state || state.sealed) return false;
|
|
435
|
+
const added: Array<{ entry: { requestPins: Set<CursorBlobRequestScopeToken> }; key: string }> = [];
|
|
436
|
+
for (const blobId of blobIds) {
|
|
437
|
+
if (blobId.byteLength === 0) continue;
|
|
438
|
+
const k = key(blobId);
|
|
439
|
+
const entry = blobs.get(k);
|
|
440
|
+
if (!entry || (isExpired(entry, Date.now()) && entry.requestPins.size === 0 && entry.provenance !== "remote-setBlobArgs")) {
|
|
441
|
+
for (const pinned of added) {
|
|
442
|
+
pinned.entry.requestPins.delete(lease);
|
|
443
|
+
state.keys.delete(pinned.key);
|
|
444
|
+
}
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
if (!entry.requestPins.has(lease)) {
|
|
448
|
+
entry.requestPins.add(lease);
|
|
449
|
+
state.keys.add(k);
|
|
450
|
+
added.push({ entry, key: k });
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
reconcileBlobClassAccountingAndEnforce();
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
export function hasCursorBlob(blobId: Uint8Array): boolean {
|
|
458
|
+
return getBlob(key(blobId)) !== undefined;
|
|
459
|
+
}
|
|
460
|
+
|
|
382
461
|
export interface CursorBlobMetrics {
|
|
383
462
|
count: number;
|
|
384
463
|
totalBytes: number;
|
|
464
|
+
keyBytes: number;
|
|
385
465
|
localBytes: number;
|
|
386
466
|
pinnedBytes: number;
|
|
387
467
|
rejectedEntryTooLarge: number;
|
|
@@ -393,6 +473,7 @@ export function cursorBlobMetrics(): CursorBlobMetrics {
|
|
|
393
473
|
return {
|
|
394
474
|
count: blobs.size,
|
|
395
475
|
totalBytes: blobBytes,
|
|
476
|
+
keyBytes: blobKeyBytes,
|
|
396
477
|
localBytes: blobLocalBytes,
|
|
397
478
|
pinnedBytes: blobPinnedBytes,
|
|
398
479
|
rejectedEntryTooLarge,
|
|
@@ -410,7 +491,9 @@ export function cursorBlobRetainedStoreSnapshot(): {
|
|
|
410
491
|
} {
|
|
411
492
|
return {
|
|
412
493
|
count: blobs.size,
|
|
413
|
-
|
|
494
|
+
// Payload + retained key strings: the framework must see everything the
|
|
495
|
+
// store retains. The 64 MiB admission cap stays payload-only by design.
|
|
496
|
+
bytes: blobBytes + blobKeyBytes,
|
|
414
497
|
evictableBytes: blobEvictableBytes,
|
|
415
498
|
pinnedBytes: blobPinnedBytes,
|
|
416
499
|
oldestAt: blobOldestEvictableAt,
|
|
@@ -434,12 +517,22 @@ export function setCursorBlobLimitsForTests(limits?: Partial<CursorBlobLimits>):
|
|
|
434
517
|
blobLimits = limits ? { ...DEFAULT_BLOB_LIMITS, ...limits } : { ...DEFAULT_BLOB_LIMITS };
|
|
435
518
|
}
|
|
436
519
|
|
|
520
|
+
/**
|
|
521
|
+
* The live per-blob admission ceiling. Callers that build a blob must budget against THIS value
|
|
522
|
+
* rather than a copy of the constant: the limit is test-overridable, and a hardcoded 16 MiB would
|
|
523
|
+
* silently drift from admission the moment either side changes.
|
|
524
|
+
*/
|
|
525
|
+
export function cursorBlobMaxEntryBytes(): number {
|
|
526
|
+
return blobLimits.maxEntryBytes;
|
|
527
|
+
}
|
|
528
|
+
|
|
437
529
|
export function resetCursorBlobStateForTests(): void {
|
|
438
530
|
if (blobExpiryAccountingTimer) clearTimeout(blobExpiryAccountingTimer);
|
|
439
531
|
blobExpiryAccountingTimer = undefined;
|
|
440
532
|
blobs.clear();
|
|
441
533
|
blobRequestScopes.clear();
|
|
442
534
|
blobBytes = 0;
|
|
535
|
+
blobKeyBytes = 0;
|
|
443
536
|
rejectedEntryTooLarge = 0;
|
|
444
537
|
rejectedPinnedSaturation = 0;
|
|
445
538
|
recomputeBlobClassAccounting();
|
|
@@ -488,8 +581,8 @@ export async function handleCursorNativeExec(execMsg: ExecServerMessage, deps: C
|
|
|
488
581
|
if (execCase === "fetchArgs") return [rejectFetchExecForPolicy(execMsg)];
|
|
489
582
|
}
|
|
490
583
|
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)];
|
|
584
|
+
if (execCase === "writeArgs") return [deps.rejectNativeFileMutations ? rejectWriteExecForApplyPatch(execMsg, deps.structuredEditAvailable === true) : writeExec(execMsg)];
|
|
585
|
+
if (execCase === "deleteArgs") return [deps.rejectNativeFileMutations ? rejectDeleteExecForApplyPatch(execMsg, deps.structuredEditAvailable === true) : deleteExec(execMsg)];
|
|
493
586
|
if (execCase === "lsArgs") return [lsExec(execMsg)];
|
|
494
587
|
if (execCase === "grepArgs") return [grepExec(execMsg)];
|
|
495
588
|
if (execCase === "shellArgs") return [shellExec(execMsg)];
|
|
@@ -523,10 +616,15 @@ export async function handleCursorNativeExec(execMsg: ExecServerMessage, deps: C
|
|
|
523
616
|
}))];
|
|
524
617
|
}
|
|
525
618
|
// Unknown exec case — Cursor added a new native exec type that our protobuf definition does not
|
|
526
|
-
// include yet.
|
|
527
|
-
//
|
|
619
|
+
// include yet. T05 (senpi contract): reply with ExecClientThrow + stream-close so the server
|
|
620
|
+
// unblocks with a known failure. Previously this returned an empty reply (silence), which is
|
|
621
|
+
// the stall class senpi explicitly refused (#116 was about throwing into failAndClear and
|
|
622
|
+
// killing the whole connection; a typed in-band throw does not do that).
|
|
528
623
|
debugProviderDiagnostic("cursor", "unknown-exec-case", { execCase: execCase ?? "unknown", execId: execMsg.execId });
|
|
529
|
-
return [
|
|
624
|
+
return [
|
|
625
|
+
execThrowBytes(execMsg, "Unknown exec message variant; this client does not implement it."),
|
|
626
|
+
execStreamCloseBytes(execMsg),
|
|
627
|
+
];
|
|
530
628
|
}
|
|
531
629
|
|
|
532
630
|
|
|
@@ -537,7 +635,16 @@ export function handleCursorNativeKv(
|
|
|
537
635
|
if (kvMsg.message.case === "getBlobArgs") {
|
|
538
636
|
const blobKey = key(kvMsg.message.value.blobId);
|
|
539
637
|
const blobData = getBlob(blobKey);
|
|
540
|
-
|
|
638
|
+
// Splice-class corruption guard (devlog 260826 080): diagnostic only, never blocks serving.
|
|
639
|
+
if (blobData && !cursorBlobServeIntegrityOk(kvMsg.message.value.blobId, blobData)) {
|
|
640
|
+
debugProviderDiagnostic("cursor", "blob-integrity-mismatch", {
|
|
641
|
+
blobKey: blobKey.slice(0, 18),
|
|
642
|
+
servedBytes: blobData.byteLength,
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
if (blobData && requestScope && blobRequestScopes.get(requestScope)?.kind === "request") {
|
|
646
|
+
releaseHydratedBlob(blobKey, requestScope);
|
|
647
|
+
}
|
|
541
648
|
return clientBytes({
|
|
542
649
|
message: {
|
|
543
650
|
case: "kvClientMessage",
|