@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Cursor output quarantine (devlog 260826 gaps 10-11).
|
|
3
|
+
*
|
|
4
|
+
* Gap 10: flattened tool-result history can prime an external model to echo the
|
|
5
|
+
* "[Tool Result]" envelope as its own reply.
|
|
6
|
+
*
|
|
7
|
+
* Gap 11: a model can invent a blocked native-tool attempt in visible commentary
|
|
8
|
+
* even though the only real current-turn tool is the advertised Codex bridge.
|
|
9
|
+
*
|
|
10
|
+
* Both failures are observable only at the output boundary. The sniffers below
|
|
11
|
+
* hold a bounded prefix until it either diverges or proves the failure, allowing
|
|
12
|
+
* cursor.ts to retry before any invalid text reaches the client.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const ECHO_MARKERS = ["[Tool Result]", "[Tool Error]", "[tool_result]"] as const;
|
|
16
|
+
const MAX_SNIFF_BYTES = 40;
|
|
17
|
+
/** Mid-stream observer: max leading whitespace on a line before matching disarms. */
|
|
18
|
+
const MAX_MIDSTREAM_LINE_INDENT = 128;
|
|
19
|
+
/** Mid-stream observer: post-marker window watched for call-id corruption. */
|
|
20
|
+
const MIDSTREAM_CORRUPTION_WINDOW = 512;
|
|
21
|
+
/** Mid-stream observer: cumulative scan cap (UTF-16 code units, checked between feeds). */
|
|
22
|
+
export const MAX_MIDSTREAM_SCAN_LENGTH = 512 * 1024;
|
|
23
|
+
/** Mid-stream observer: findings retained per turn. */
|
|
24
|
+
const MAX_MIDSTREAM_FINDINGS = 8;
|
|
25
|
+
const MAX_ROUTING_COMMENTARY_BYTES = 512;
|
|
26
|
+
/** Aggregate quarantine cap: past this, flush and disarm. */
|
|
27
|
+
const MAX_HOLD_BYTES = 8 * 1024;
|
|
28
|
+
const encoder = new TextEncoder();
|
|
29
|
+
|
|
30
|
+
export class CursorToolResultEchoError extends Error {
|
|
31
|
+
readonly code = "cursor_tool_result_echo";
|
|
32
|
+
constructor(marker: string) {
|
|
33
|
+
super(
|
|
34
|
+
"Cursor external model echoed the replayed tool-result envelope (\"" + marker
|
|
35
|
+
+ "\") instead of continuing the task.",
|
|
36
|
+
);
|
|
37
|
+
this.name = "CursorToolResultEchoError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class CursorRoutingCommentaryError extends Error {
|
|
42
|
+
readonly code = "cursor_routing_commentary_hallucination";
|
|
43
|
+
constructor() {
|
|
44
|
+
super("Cursor external model invented a blocked tool surface before any tool call occurred.");
|
|
45
|
+
this.name = "CursorRoutingCommentaryError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type EchoSnifferDecision =
|
|
50
|
+
| { kind: "hold" }
|
|
51
|
+
| { kind: "flush" }
|
|
52
|
+
| { kind: "echo"; marker: string };
|
|
53
|
+
|
|
54
|
+
export interface MidstreamEchoFinding {
|
|
55
|
+
marker: string;
|
|
56
|
+
/** UTF-16 offset of the marker's line start within the turn's full text. */
|
|
57
|
+
offset: number;
|
|
58
|
+
callIdCorrupt: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Diagnostic-only mid-stream envelope-echo observer (devlog 260828 F1/F2).
|
|
63
|
+
*
|
|
64
|
+
* The prefix sniffer only watches the first ~40 bytes of a turn, but live
|
|
65
|
+
* probing caught grok-4.6 echoing "[Tool Result]" envelope blocks in the
|
|
66
|
+
* MIDDLE of an agent message — after legitimate leading text — one of them
|
|
67
|
+
* carrying a whitespace-spliced call-id ("fc_x mar-y" instead of "fc_x-y").
|
|
68
|
+
* Deltas at that point have already reached the client, so this observer
|
|
69
|
+
* never throws and never withholds output: it records findings so the
|
|
70
|
+
* adapter can emit a structured diagnostic at turn end. Only fixed marker
|
|
71
|
+
* enums, numeric offsets, and corruption booleans are retained — never
|
|
72
|
+
* content bytes.
|
|
73
|
+
*/
|
|
74
|
+
export class CursorMidstreamEchoObserver {
|
|
75
|
+
private lineBuffer = "";
|
|
76
|
+
private lineStartOffset = 0;
|
|
77
|
+
private totalLength = 0;
|
|
78
|
+
private disarmed = false;
|
|
79
|
+
private lineDisarmed = false;
|
|
80
|
+
private corruptionWatch: { finding: MidstreamEchoFinding; remaining: number; window: string } | undefined;
|
|
81
|
+
private readonly recorded: MidstreamEchoFinding[] = [];
|
|
82
|
+
|
|
83
|
+
feed(textDelta: string): void {
|
|
84
|
+
if (this.disarmed && !this.corruptionWatch) return;
|
|
85
|
+
let index = 0;
|
|
86
|
+
while (index < textDelta.length) {
|
|
87
|
+
const newline = textDelta.indexOf("\n", index);
|
|
88
|
+
const segment = newline === -1 ? textDelta.slice(index) : textDelta.slice(index, newline);
|
|
89
|
+
if (this.corruptionWatch) this.watchCorruption(segment + (newline === -1 ? "" : "\n"));
|
|
90
|
+
if (!this.disarmed && !this.lineDisarmed && segment.length > 0) {
|
|
91
|
+
this.lineBuffer += segment;
|
|
92
|
+
if (this.lineBuffer.length > MAX_MIDSTREAM_LINE_INDENT + 32) {
|
|
93
|
+
// Bound per-line work: nothing beyond the indent cap + longest marker can match.
|
|
94
|
+
this.lineDisarmed = !this.lineMatchesPrefixSoFar();
|
|
95
|
+
this.lineBuffer = this.lineBuffer.slice(0, MAX_MIDSTREAM_LINE_INDENT + 32);
|
|
96
|
+
}
|
|
97
|
+
this.checkLine();
|
|
98
|
+
}
|
|
99
|
+
if (newline === -1) break;
|
|
100
|
+
this.lineBuffer = "";
|
|
101
|
+
this.lineDisarmed = false;
|
|
102
|
+
this.lineStartOffset = this.totalLength + newline + 1;
|
|
103
|
+
index = newline + 1;
|
|
104
|
+
}
|
|
105
|
+
this.totalLength += textDelta.length;
|
|
106
|
+
if (this.totalLength > MAX_MIDSTREAM_SCAN_LENGTH) this.disarmed = true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
findings(): readonly MidstreamEchoFinding[] {
|
|
110
|
+
if (this.corruptionWatch) {
|
|
111
|
+
this.settleCorruption();
|
|
112
|
+
}
|
|
113
|
+
return this.recorded;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private lineMatchesPrefixSoFar(): boolean {
|
|
117
|
+
const probe = this.lineBuffer.replace(/^[ \t]*/, "");
|
|
118
|
+
return ECHO_MARKERS.some(marker => probe.startsWith(marker) || marker.startsWith(probe));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private checkLine(): void {
|
|
122
|
+
const indentMatch = /^[ \t]*/.exec(this.lineBuffer);
|
|
123
|
+
const indent = indentMatch ? indentMatch[0].length : 0;
|
|
124
|
+
if (indent > MAX_MIDSTREAM_LINE_INDENT) {
|
|
125
|
+
this.lineDisarmed = true;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const probe = this.lineBuffer.slice(indent);
|
|
129
|
+
for (const marker of ECHO_MARKERS) {
|
|
130
|
+
if (probe.startsWith(marker)) {
|
|
131
|
+
// The prefix sniffer owns the very start of the turn; only offsets past
|
|
132
|
+
// its window count as mid-stream.
|
|
133
|
+
if (this.lineStartOffset === 0) {
|
|
134
|
+
this.lineDisarmed = true;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const finding: MidstreamEchoFinding = {
|
|
138
|
+
marker,
|
|
139
|
+
offset: this.lineStartOffset,
|
|
140
|
+
callIdCorrupt: false,
|
|
141
|
+
};
|
|
142
|
+
this.corruptionWatch = { finding, remaining: MIDSTREAM_CORRUPTION_WINDOW, window: "" };
|
|
143
|
+
this.lineDisarmed = true;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!ECHO_MARKERS.some(marker => marker.startsWith(probe)) && probe.length > 0) {
|
|
148
|
+
this.lineDisarmed = true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private watchCorruption(text: string): void {
|
|
153
|
+
const watch = this.corruptionWatch;
|
|
154
|
+
if (!watch) return;
|
|
155
|
+
const take = Math.min(watch.remaining, text.length);
|
|
156
|
+
watch.window += text.slice(0, take);
|
|
157
|
+
watch.remaining -= take;
|
|
158
|
+
if (watch.remaining <= 0) this.settleCorruption();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private settleCorruption(): void {
|
|
162
|
+
const watch = this.corruptionWatch;
|
|
163
|
+
if (!watch) return;
|
|
164
|
+
const window = watch.window;
|
|
165
|
+
watch.finding.callIdCorrupt =
|
|
166
|
+
/fc_[0-9a-f]+[ \t]+mar-/.test(window)
|
|
167
|
+
|| /call_id: \S+[ \t]+\S+_0\b/.test(window);
|
|
168
|
+
if (this.recorded.length < MAX_MIDSTREAM_FINDINGS) this.recorded.push(watch.finding);
|
|
169
|
+
// Window text is discarded here; only booleans/offsets survive.
|
|
170
|
+
this.corruptionWatch = undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Incremental envelope-prefix sniffer. Leading whitespace is tolerated so a
|
|
176
|
+
* marker copied after a newline is still caught.
|
|
177
|
+
*/
|
|
178
|
+
export class CursorEnvelopeEchoSniffer {
|
|
179
|
+
private buffered = "";
|
|
180
|
+
private byteCount = 0;
|
|
181
|
+
private done = false;
|
|
182
|
+
|
|
183
|
+
get settled(): boolean {
|
|
184
|
+
return this.done;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
feed(textDelta: string): EchoSnifferDecision {
|
|
188
|
+
if (this.done) return { kind: "flush" };
|
|
189
|
+
this.buffered += textDelta;
|
|
190
|
+
this.byteCount += encoder.encode(textDelta).byteLength;
|
|
191
|
+
const probe = this.buffered.replace(/^\s+/, "");
|
|
192
|
+
for (const marker of ECHO_MARKERS) {
|
|
193
|
+
if (probe.startsWith(marker)) {
|
|
194
|
+
this.done = true;
|
|
195
|
+
return { kind: "echo", marker };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const stillPrefix = ECHO_MARKERS.some(marker =>
|
|
199
|
+
probe.length < marker.length && marker.startsWith(probe),
|
|
200
|
+
);
|
|
201
|
+
if (stillPrefix && this.byteCount <= MAX_SNIFF_BYTES && this.buffered.length < MAX_HOLD_BYTES) {
|
|
202
|
+
return { kind: "hold" };
|
|
203
|
+
}
|
|
204
|
+
this.done = true;
|
|
205
|
+
return { kind: "flush" };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
finish(): EchoSnifferDecision {
|
|
209
|
+
if (this.done) return { kind: "flush" };
|
|
210
|
+
this.done = true;
|
|
211
|
+
return { kind: "flush" };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export type RoutingCommentaryDecision =
|
|
216
|
+
| { kind: "hold" }
|
|
217
|
+
| { kind: "flush" }
|
|
218
|
+
| { kind: "hallucination" };
|
|
219
|
+
|
|
220
|
+
const ROUTING_NATIVE_TOOL_NAME = /\b(shell|read|grep|list|bash)\b/giu;
|
|
221
|
+
const ROUTING_TOOL_HINT =
|
|
222
|
+
/(?:\b(?:shell|read|grep|list|bash)\b|exec_command|shell_command|브리지|네이티브\s*(?:셸|쉘))/iu;
|
|
223
|
+
const ROUTING_FAILURE_CLAIM =
|
|
224
|
+
/(?:blocked|unavailable|interrupted|차단|중단|막혀)/iu;
|
|
225
|
+
const ROUTING_REDIRECT_CLAIM =
|
|
226
|
+
/(?:exec_command|shell_command|\bexec\b|브리지|redirected|fallback|switch(?:ed|ing)?|전환|우회|통과(?:되|하)|다른\s*(?:도구|경로)|경로로)/iu;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Quarantines the first line of code-mode / bridge output long enough to reject
|
|
230
|
+
* an impossible routing claim. It requires a failure claim plus either an
|
|
231
|
+
* explicit redirect to another execution surface or two distinct unadvertised
|
|
232
|
+
* native-tool names; a legitimate sentence such as "Shell is unavailable on
|
|
233
|
+
* this OS" therefore passes.
|
|
234
|
+
*/
|
|
235
|
+
export class CursorRoutingCommentarySniffer {
|
|
236
|
+
private buffered = "";
|
|
237
|
+
private byteCount = 0;
|
|
238
|
+
private done = false;
|
|
239
|
+
|
|
240
|
+
get settled(): boolean {
|
|
241
|
+
return this.done;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
feed(textDelta: string): RoutingCommentaryDecision {
|
|
245
|
+
if (this.done) return { kind: "flush" };
|
|
246
|
+
this.buffered += textDelta;
|
|
247
|
+
this.byteCount += encoder.encode(textDelta).byteLength;
|
|
248
|
+
if (this.matchesHallucination()) {
|
|
249
|
+
this.done = true;
|
|
250
|
+
return { kind: "hallucination" };
|
|
251
|
+
}
|
|
252
|
+
const lineBreakCount = (this.buffered.match(/\n/gu) ?? []).length;
|
|
253
|
+
const hasRoutingHint = ROUTING_TOOL_HINT.test(this.buffered) || ROUTING_FAILURE_CLAIM.test(this.buffered);
|
|
254
|
+
const pendingFailureClaim =
|
|
255
|
+
ROUTING_TOOL_HINT.test(this.buffered)
|
|
256
|
+
&& ROUTING_FAILURE_CLAIM.test(this.buffered)
|
|
257
|
+
&& lineBreakCount < 2;
|
|
258
|
+
if (
|
|
259
|
+
this.byteCount < MAX_ROUTING_COMMENTARY_BYTES
|
|
260
|
+
&& this.buffered.length < MAX_HOLD_BYTES
|
|
261
|
+
&& (lineBreakCount === 0 || pendingFailureClaim)
|
|
262
|
+
&& (hasRoutingHint || this.byteCount < 64)
|
|
263
|
+
) {
|
|
264
|
+
return { kind: "hold" };
|
|
265
|
+
}
|
|
266
|
+
this.done = true;
|
|
267
|
+
return { kind: "flush" };
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
finish(): RoutingCommentaryDecision {
|
|
271
|
+
if (this.done) return { kind: "flush" };
|
|
272
|
+
this.done = true;
|
|
273
|
+
return this.matchesHallucination() ? { kind: "hallucination" } : { kind: "flush" };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
private matchesHallucination(): boolean {
|
|
277
|
+
if (!ROUTING_FAILURE_CLAIM.test(this.buffered)) return false;
|
|
278
|
+
const nativeTools = new Set(
|
|
279
|
+
[...this.buffered.matchAll(ROUTING_NATIVE_TOOL_NAME)].map(match => match[1]?.toLowerCase()),
|
|
280
|
+
);
|
|
281
|
+
if (nativeTools.size === 0) return false;
|
|
282
|
+
return ROUTING_REDIRECT_CLAIM.test(this.buffered) || nativeTools.size >= 2;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export const CURSOR_ECHO_RETRY_CONTINUATION_TEXT =
|
|
287
|
+
"Your previous reply copied an internal tool-output record verbatim and was rejected. Continue the original task now: issue the next required tool call, or answer in your own words if no tool is needed.";
|
|
288
|
+
|
|
289
|
+
export const CURSOR_ROUTING_COMMENTARY_RETRY_TEXT =
|
|
290
|
+
"Your previous reply claimed an execution-surface failure that did not occur and was rejected. Use the current tool catalog as ground truth. Perform the requested operation through the advertised execution tool now, with no commentary before the tool call.";
|
|
@@ -168,6 +168,45 @@ export function decodeAvailableConnectFrames(
|
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
+
/**
|
|
172
|
+
* Cursor-based sibling of decodeAvailableConnectFrames for callers that keep
|
|
173
|
+
* their own raw backlog: consumes complete frames from the FRONT of `input`
|
|
174
|
+
* and reports how many bytes were consumed (headers included) instead of
|
|
175
|
+
* materializing a remainder copy, and hands payload VIEWS (not copies) back so
|
|
176
|
+
* the caller can transfer the already-charged bytes to the frame lifecycle
|
|
177
|
+
* instead of reserving a second copy. The caller advances its own cursor by
|
|
178
|
+
* `consumedBytes` and never pays an O(backlog) copy per drain.
|
|
179
|
+
*/
|
|
180
|
+
export function consumeConnectFrames(
|
|
181
|
+
input: Uint8Array,
|
|
182
|
+
maxPayloadBytes = MAX_CONNECT_FRAME_PAYLOAD_BYTES,
|
|
183
|
+
availableFrameSlots = Number.POSITIVE_INFINITY,
|
|
184
|
+
): { frames: ConnectFrame[]; consumedBytes: number } {
|
|
185
|
+
const planned: InspectedConnectFrame[] = [];
|
|
186
|
+
let offset = 0;
|
|
187
|
+
while (offset < input.length && planned.length < availableFrameSlots) {
|
|
188
|
+
const inspected = inspectConnectFrame(input, offset, maxPayloadBytes);
|
|
189
|
+
if (!inspected) break;
|
|
190
|
+
planned.push(inspected);
|
|
191
|
+
offset += inspected.readBytes;
|
|
192
|
+
}
|
|
193
|
+
// Zero-copy handoff for large payloads: VIEWS into the caller's backlog
|
|
194
|
+
// buffer (safe: append-only at its end, compaction/growth replace the
|
|
195
|
+
// buffer, a consumed region is never mutated in place). Small payloads are
|
|
196
|
+
// COPIED instead — a small view would pin the whole backlog buffer (up to
|
|
197
|
+
// 32 MiB) alive while the frame waits in the work queue.
|
|
198
|
+
const COPY_PIN_THRESHOLD_BYTES = 64 * 1024;
|
|
199
|
+
const frames = planned.map(({ flags, length, payloadStart }) => ({
|
|
200
|
+
flags,
|
|
201
|
+
payload: length <= COPY_PIN_THRESHOLD_BYTES
|
|
202
|
+
? input.slice(payloadStart, payloadStart + length)
|
|
203
|
+
: input.subarray(payloadStart, payloadStart + length),
|
|
204
|
+
compressed: isConnectFrameCompressed(flags),
|
|
205
|
+
endStream: isConnectFrameEndStream(flags),
|
|
206
|
+
}));
|
|
207
|
+
return { frames, consumedBytes: offset };
|
|
208
|
+
}
|
|
209
|
+
|
|
171
210
|
function inspectConnectFrame(
|
|
172
211
|
input: Uint8Array,
|
|
173
212
|
offset: number,
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import http2 from "node:http2";
|
|
2
|
+
import { registerOptionalShutdownHook } from "../../lib/optional-shutdown-hooks";
|
|
3
|
+
|
|
4
|
+
const DEFAULT_MAX_SESSIONS = 8;
|
|
5
|
+
const SESSION_CLOSE_TIMEOUT_MS = 2_000;
|
|
6
|
+
|
|
7
|
+
interface PoolEntry {
|
|
8
|
+
readonly session: http2.ClientHttp2Session;
|
|
9
|
+
readonly streams: Set<http2.ClientHttp2Stream>;
|
|
10
|
+
usable: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* HTTP/2 connection pool for Cursor Connect DISCOVERY calls (GetUsableModels).
|
|
15
|
+
* Sessions are keyed by origin (scheme+host+port) and reused to avoid fresh
|
|
16
|
+
* TCP+TLS per call. The Run path deliberately dials its own session: Run
|
|
17
|
+
* streams are long-lived bidi whose lifecycle/EOF semantics are owned by
|
|
18
|
+
* live-transport (see devlog 260822_senpi_cursor_transfer/190 — Run-path
|
|
19
|
+
* pooling is a separate, deliberate unit if ever taken).
|
|
20
|
+
*/
|
|
21
|
+
export class CursorH2SessionPool {
|
|
22
|
+
private readonly entries = new Map<string, PoolEntry>();
|
|
23
|
+
private closed = false;
|
|
24
|
+
|
|
25
|
+
constructor(private readonly maxSessions = DEFAULT_MAX_SESSIONS) {}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Lazily registered on first use so a process that never talks to Cursor registers
|
|
29
|
+
* nothing (optional-subsystem doctrine). The seam is synchronous and best-effort;
|
|
30
|
+
* shutdown() is fire-and-forget there because lifecycle's drainAndShutdown runs
|
|
31
|
+
* under its own absolute deadline.
|
|
32
|
+
*/
|
|
33
|
+
private armShutdownHook: (() => void) | undefined = () => {
|
|
34
|
+
this.armShutdownHook = undefined;
|
|
35
|
+
registerOptionalShutdownHook("cursor-h2-pool", () => { void this.shutdown(); });
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
request(
|
|
39
|
+
url: string,
|
|
40
|
+
headers: http2.OutgoingHttpHeaders,
|
|
41
|
+
): http2.ClientHttp2Stream {
|
|
42
|
+
if (this.closed) throw new Error("Cursor H2 session pool is closed");
|
|
43
|
+
this.armShutdownHook?.();
|
|
44
|
+
const origin = new URL(url).origin;
|
|
45
|
+
const entry = this.usableEntry(origin) ?? this.createEntry(origin);
|
|
46
|
+
try {
|
|
47
|
+
const stream = entry.session.request(headers);
|
|
48
|
+
entry.streams.add(stream);
|
|
49
|
+
stream.once("close", () => { entry.streams.delete(stream); });
|
|
50
|
+
return stream;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
this.drain(entry, true);
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async shutdown(): Promise<void> {
|
|
58
|
+
if (this.closed) return;
|
|
59
|
+
this.closed = true;
|
|
60
|
+
const pending: Promise<void>[] = [];
|
|
61
|
+
for (const entry of [...this.entries.values()]) {
|
|
62
|
+
for (const stream of [...entry.streams]) stream.destroy();
|
|
63
|
+
entry.session.close();
|
|
64
|
+
if (entry.session.destroyed) continue;
|
|
65
|
+
pending.push(new Promise<void>(resolve => {
|
|
66
|
+
const timer = setTimeout(resolve, SESSION_CLOSE_TIMEOUT_MS);
|
|
67
|
+
timer.unref?.();
|
|
68
|
+
entry.session.once("close", () => { clearTimeout(timer); resolve(); });
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
this.entries.clear();
|
|
72
|
+
await Promise.all(pending);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get size(): number { return this.entries.size; }
|
|
76
|
+
|
|
77
|
+
private usableEntry(origin: string): PoolEntry | undefined {
|
|
78
|
+
const entry = this.entries.get(origin);
|
|
79
|
+
if (!entry) return undefined;
|
|
80
|
+
if (entry.usable && !entry.session.closed && !entry.session.destroyed) return entry;
|
|
81
|
+
this.drain(entry, false);
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private createEntry(origin: string): PoolEntry {
|
|
86
|
+
const session = http2.connect(origin);
|
|
87
|
+
const entry: PoolEntry = {
|
|
88
|
+
session,
|
|
89
|
+
streams: new Set(),
|
|
90
|
+
usable: true,
|
|
91
|
+
};
|
|
92
|
+
this.entries.set(origin, entry);
|
|
93
|
+
session.once("goaway", () => { this.drain(entry, true); });
|
|
94
|
+
session.on("error", () => { this.drain(entry, false); });
|
|
95
|
+
session.once("close", () => {
|
|
96
|
+
// Identity check: a stale close event from an old session must not evict
|
|
97
|
+
// a healthy replacement entry that was created after drain() removed the old one.
|
|
98
|
+
if (this.entries.get(origin) === entry) this.entries.delete(origin);
|
|
99
|
+
});
|
|
100
|
+
// Enforce bound: evict oldest when over capacity.
|
|
101
|
+
while (this.entries.size > this.maxSessions) {
|
|
102
|
+
const oldest = this.entries.keys().next().value;
|
|
103
|
+
if (!oldest || oldest === origin) break;
|
|
104
|
+
const old = this.entries.get(oldest);
|
|
105
|
+
if (old) this.drain(old, true);
|
|
106
|
+
}
|
|
107
|
+
return entry;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private drain(entry: PoolEntry, closeSession: boolean): void {
|
|
111
|
+
entry.usable = false;
|
|
112
|
+
for (const stream of [...entry.streams]) stream.destroy();
|
|
113
|
+
entry.streams.clear();
|
|
114
|
+
if (closeSession) entry.session.close();
|
|
115
|
+
// Remove from map by finding the matching key.
|
|
116
|
+
for (const [key, value] of this.entries) {
|
|
117
|
+
if (value === entry) { this.entries.delete(key); break; }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Shared singleton pool for all Cursor adapter H2 traffic. */
|
|
123
|
+
export const cursorH2Pool = new CursorH2SessionPool();
|