@iislee/opencodex 2.11.0 → 2.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +618 -74
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +152 -29
- package/src/images/plan.ts +23 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +865 -181
- package/src/server/lifecycle.ts +284 -13
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +288 -32
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +9 -3
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
package/src/server/lifecycle.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { flushAntigravityReplay } from "../adapters/google-antigravity-replay";
|
|
1
2
|
import { flushResponseState } from "../responses/state";
|
|
2
3
|
import { setStorageCleanupPolicyLiveSink } from "../storage/policy";
|
|
3
4
|
import {
|
|
@@ -6,6 +7,7 @@ import {
|
|
|
6
7
|
} from "../storage/policy-job";
|
|
7
8
|
import { abortRestoreTrashJobAsync } from "../storage/restore-job";
|
|
8
9
|
import { stopStorageCleanupScheduler } from "../storage/policy-scheduler";
|
|
10
|
+
import { runOptionalShutdownHooks } from "../lib/optional-shutdown-hooks";
|
|
9
11
|
import { stopStateStoreSweeper } from "../lib/state-store-sweeper";
|
|
10
12
|
import {
|
|
11
13
|
cancelQueuedStorageWorkerSpawns,
|
|
@@ -20,6 +22,8 @@ import {
|
|
|
20
22
|
beginBackgroundShellShutdown,
|
|
21
23
|
terminateAllBackgroundShells,
|
|
22
24
|
} from "../adapters/cursor/native-exec-shell";
|
|
25
|
+
import type { CodexAccountSelectionAdmission } from "../codex/auth-context";
|
|
26
|
+
import { releaseNativeMainStartupLifecycle } from "../codex/native-profile-startup";
|
|
23
27
|
|
|
24
28
|
// ---------------------------------------------------------------------------
|
|
25
29
|
// Active turn tracking + graceful shutdown drain
|
|
@@ -29,24 +33,138 @@ export const MAX_ACTIVE_TURNS = 256;
|
|
|
29
33
|
const turnGate = createAdmissionGate("active_turns", MAX_ACTIVE_TURNS);
|
|
30
34
|
export interface ActiveTurnLease extends AdmissionLease {
|
|
31
35
|
bindAbortController(ac: AbortController): void;
|
|
36
|
+
beginCodexAccountSelection(): CodexAccountSelectionAdmission;
|
|
32
37
|
isTransferred(): boolean;
|
|
33
38
|
}
|
|
34
39
|
const activeTurns = new Map<AbortController, ActiveTurnLease>();
|
|
35
40
|
const admittedTurns = new Set<ActiveTurnLease>();
|
|
36
41
|
const knownTurnControllers = new WeakSet<AbortController>();
|
|
37
42
|
let turnReleaseMisses = 0;
|
|
38
|
-
let
|
|
43
|
+
let shutdownDraining = false;
|
|
44
|
+
const temporaryDrainOwners = new Set<symbol>();
|
|
45
|
+
const nativeMainDrainOwners = new Set<symbol>();
|
|
46
|
+
const temporaryDrainWaiters = new Set<() => void>();
|
|
47
|
+
const nativeMainTurns = new Set<ActiveTurnLease>();
|
|
48
|
+
let nativeMainSelections = 0;
|
|
49
|
+
let legacyDrainLease: AdmissionLease | null = null;
|
|
39
50
|
let recyclingForExit = false;
|
|
40
51
|
let _serverRef: ReturnType<typeof Bun.serve> | undefined;
|
|
52
|
+
let serverStopFlights = new WeakMap<ReturnType<typeof Bun.serve>, Promise<void>>();
|
|
53
|
+
let serverStartupReleaseFlights = new WeakMap<ReturnType<typeof Bun.serve>, Promise<void>>();
|
|
54
|
+
let releaseServerStartupLifecycleImpl: typeof releaseNativeMainStartupLifecycle = releaseNativeMainStartupLifecycle;
|
|
41
55
|
|
|
42
56
|
export function setServerRef(server: ReturnType<typeof Bun.serve> | undefined): void { _serverRef = server; }
|
|
43
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Legacy/test-only drain control. Production scoped operations must use a lease,
|
|
59
|
+
* while process shutdown uses the irreversible shutdown latch.
|
|
60
|
+
*/
|
|
61
|
+
export function setDraining(value: boolean): void {
|
|
62
|
+
if (value) {
|
|
63
|
+
legacyDrainLease ??= acquireTemporaryDrain("legacy");
|
|
64
|
+
} else {
|
|
65
|
+
legacyDrainLease?.release();
|
|
66
|
+
legacyDrainLease = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function temporaryDrainCount(): number {
|
|
71
|
+
return temporaryDrainOwners.size + nativeMainDrainOwners.size;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function notifyTemporaryDrainsSettled(): void {
|
|
75
|
+
if (temporaryDrainCount() !== 0) return;
|
|
76
|
+
for (const resolve of temporaryDrainWaiters) resolve();
|
|
77
|
+
temporaryDrainWaiters.clear();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Acquire the single owner-scoped global data-plane fence. */
|
|
81
|
+
export function acquireTemporaryDrain(owner: string): AdmissionLease | null {
|
|
82
|
+
if (shutdownDraining || temporaryDrainCount() > 0) return null;
|
|
83
|
+
const token = Symbol(owner);
|
|
84
|
+
temporaryDrainOwners.add(token);
|
|
85
|
+
let active = true;
|
|
86
|
+
return {
|
|
87
|
+
release() {
|
|
88
|
+
if (!active) return;
|
|
89
|
+
active = false;
|
|
90
|
+
temporaryDrainOwners.delete(token);
|
|
91
|
+
notifyTemporaryDrainsSettled();
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Fence only turns that select the native Codex `__main__` account. */
|
|
97
|
+
export function acquireNativeMainProfileDrain(owner: string): AdmissionLease | null {
|
|
98
|
+
if (shutdownDraining || temporaryDrainCount() > 0) return null;
|
|
99
|
+
const token = Symbol(owner);
|
|
100
|
+
nativeMainDrainOwners.add(token);
|
|
101
|
+
let active = true;
|
|
102
|
+
return {
|
|
103
|
+
release() {
|
|
104
|
+
if (!active) return;
|
|
105
|
+
active = false;
|
|
106
|
+
nativeMainDrainOwners.delete(token);
|
|
107
|
+
notifyTemporaryDrainsSettled();
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Permanently fence this process for shutdown; scoped lease release cannot clear it. */
|
|
113
|
+
export function beginShutdownDrain(): boolean {
|
|
114
|
+
if (shutdownDraining) return false;
|
|
115
|
+
shutdownDraining = true;
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function isShutdownDraining(): boolean { return shutdownDraining; }
|
|
120
|
+
|
|
121
|
+
export function waitForTemporaryDrains(): Promise<void> {
|
|
122
|
+
if (temporaryDrainCount() === 0) return Promise.resolve();
|
|
123
|
+
return new Promise(resolve => temporaryDrainWaiters.add(resolve));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Wait for scoped drains without allowing them to outlive the shutdown deadline. */
|
|
127
|
+
async function waitForTemporaryDrainsUntil(deadlineMs: number): Promise<boolean> {
|
|
128
|
+
if (temporaryDrainCount() === 0) return true;
|
|
129
|
+
const remainingMs = Math.max(0, deadlineMs - Date.now());
|
|
130
|
+
if (remainingMs === 0) return false;
|
|
131
|
+
return new Promise<boolean>((resolve) => {
|
|
132
|
+
let settled = false;
|
|
133
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
134
|
+
const finish = (drained: boolean) => {
|
|
135
|
+
if (settled) return;
|
|
136
|
+
settled = true;
|
|
137
|
+
if (timer) clearTimeout(timer);
|
|
138
|
+
resolve(drained);
|
|
139
|
+
};
|
|
140
|
+
timer = setTimeout(() => finish(false), remainingMs);
|
|
141
|
+
void waitForTemporaryDrains().then(() => finish(true));
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Test-only process-lifetime reset. Never call from production recovery paths. */
|
|
146
|
+
export function resetLifecycleDrainStateForTests(): void {
|
|
147
|
+
legacyDrainLease?.release();
|
|
148
|
+
legacyDrainLease = null;
|
|
149
|
+
temporaryDrainOwners.clear();
|
|
150
|
+
nativeMainDrainOwners.clear();
|
|
151
|
+
nativeMainTurns.clear();
|
|
152
|
+
nativeMainSelections = 0;
|
|
153
|
+
for (const resolve of temporaryDrainWaiters) resolve();
|
|
154
|
+
temporaryDrainWaiters.clear();
|
|
155
|
+
shutdownDraining = false;
|
|
156
|
+
serverStopFlights = new WeakMap<ReturnType<typeof Bun.serve>, Promise<void>>();
|
|
157
|
+
serverStartupReleaseFlights = new WeakMap<ReturnType<typeof Bun.serve>, Promise<void>>();
|
|
158
|
+
releaseServerStartupLifecycleImpl = releaseNativeMainStartupLifecycle;
|
|
159
|
+
}
|
|
44
160
|
export function tryAdmitTurn(): ActiveTurnLease | null {
|
|
161
|
+
if (isDraining()) return null;
|
|
45
162
|
const gateLease = turnGate.tryAcquire();
|
|
46
163
|
if (!gateLease) return null;
|
|
47
164
|
const controllers = new Set<AbortController>();
|
|
48
165
|
let active = true;
|
|
49
166
|
let transferred = false;
|
|
167
|
+
let nativeMainClaimed = false;
|
|
50
168
|
const lease: ActiveTurnLease = {
|
|
51
169
|
bindAbortController(ac) {
|
|
52
170
|
knownTurnControllers.add(ac);
|
|
@@ -58,6 +176,31 @@ export function tryAdmitTurn(): ActiveTurnLease | null {
|
|
|
58
176
|
controllers.add(ac);
|
|
59
177
|
activeTurns.set(ac, lease);
|
|
60
178
|
},
|
|
179
|
+
beginCodexAccountSelection() {
|
|
180
|
+
const mainProfileDraining = nativeMainDrainOwners.size > 0;
|
|
181
|
+
let selectionActive = !mainProfileDraining;
|
|
182
|
+
let released = false;
|
|
183
|
+
if (selectionActive) nativeMainSelections += 1;
|
|
184
|
+
return {
|
|
185
|
+
mainProfileDraining,
|
|
186
|
+
claimMainProfile() {
|
|
187
|
+
if (released || mainProfileDraining || !active) return false;
|
|
188
|
+
if (!nativeMainClaimed) {
|
|
189
|
+
nativeMainClaimed = true;
|
|
190
|
+
nativeMainTurns.add(lease);
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
},
|
|
194
|
+
release() {
|
|
195
|
+
if (released) return;
|
|
196
|
+
released = true;
|
|
197
|
+
if (selectionActive) {
|
|
198
|
+
selectionActive = false;
|
|
199
|
+
nativeMainSelections = Math.max(0, nativeMainSelections - 1);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
},
|
|
61
204
|
isTransferred() { return transferred; },
|
|
62
205
|
release() {
|
|
63
206
|
if (!active) return;
|
|
@@ -67,12 +210,43 @@ export function tryAdmitTurn(): ActiveTurnLease | null {
|
|
|
67
210
|
if (activeTurns.get(controller) === lease) activeTurns.delete(controller);
|
|
68
211
|
}
|
|
69
212
|
controllers.clear();
|
|
213
|
+
nativeMainTurns.delete(lease);
|
|
70
214
|
gateLease.release();
|
|
71
215
|
},
|
|
72
216
|
};
|
|
73
217
|
admittedTurns.add(lease);
|
|
74
218
|
return lease;
|
|
75
219
|
}
|
|
220
|
+
export function codexAccountSelectionForTurn(
|
|
221
|
+
lease?: AdmissionLease,
|
|
222
|
+
): (() => CodexAccountSelectionAdmission | undefined) | undefined {
|
|
223
|
+
if (!lease || !("beginCodexAccountSelection" in lease)) return undefined;
|
|
224
|
+
const activeLease = lease as ActiveTurnLease;
|
|
225
|
+
return () => activeLease.beginCodexAccountSelection();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Promote a physical native-main credential read onto an already admitted turn. */
|
|
229
|
+
export function tryClaimNativeMainProfileForTurn(lease?: AdmissionLease): boolean {
|
|
230
|
+
const beginSelection = codexAccountSelectionForTurn(lease);
|
|
231
|
+
if (!beginSelection) return false;
|
|
232
|
+
const selection = beginSelection();
|
|
233
|
+
if (!selection) return false;
|
|
234
|
+
try {
|
|
235
|
+
return !selection.mainProfileDraining && selection.claimMainProfile();
|
|
236
|
+
} finally {
|
|
237
|
+
selection.release();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/** Acquire standalone native-main ownership for management/background work. */
|
|
242
|
+
export function tryAcquireNativeMainProfileClaim(): AdmissionLease | null {
|
|
243
|
+
const turn = tryAdmitTurn();
|
|
244
|
+
if (!turn) return null;
|
|
245
|
+
if (tryClaimNativeMainProfileForTurn(turn)) return turn;
|
|
246
|
+
turn.release();
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
|
|
76
250
|
export function registerTurn(ac: AbortController, lease?: AdmissionLease): void {
|
|
77
251
|
if (lease && "bindAbortController" in lease) (lease as ActiveTurnLease).bindAbortController(ac);
|
|
78
252
|
}
|
|
@@ -85,8 +259,11 @@ export function unregisterTurn(ac: AbortController): void {
|
|
|
85
259
|
}
|
|
86
260
|
lease.release();
|
|
87
261
|
}
|
|
88
|
-
export function isDraining(): boolean { return
|
|
262
|
+
export function isDraining(): boolean { return shutdownDraining || temporaryDrainOwners.size > 0; }
|
|
89
263
|
export function getActiveTurnCount(): number { return turnGate.metrics().active; }
|
|
264
|
+
export function getNativeMainProfileRequestCount(): number {
|
|
265
|
+
return nativeMainSelections + nativeMainTurns.size;
|
|
266
|
+
}
|
|
90
267
|
export function activeRegistryMetrics(): Record<string, AdmissionMetrics> {
|
|
91
268
|
const turns = turnGate.metrics();
|
|
92
269
|
return {
|
|
@@ -111,6 +288,80 @@ export function getServerListenPort(): number | undefined {
|
|
|
111
288
|
const port = _serverRef?.port;
|
|
112
289
|
return typeof port === "number" && port > 0 ? port : undefined;
|
|
113
290
|
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Stop one concrete listener exactly once. Deadline restart handoff can race the
|
|
294
|
+
* ordinary drain's finally block; both callers must observe the same stop result
|
|
295
|
+
* before any replacement process is allowed to bind the port.
|
|
296
|
+
*/
|
|
297
|
+
/**
|
|
298
|
+
* Run every shutdown step, then report whether any of them failed.
|
|
299
|
+
*
|
|
300
|
+
* Extracted from `startServer`'s composite `stop` because the two properties it has to hold
|
|
301
|
+
* pull in opposite directions and neither is testable in place:
|
|
302
|
+
*
|
|
303
|
+
* - Cleanup COMPLETES. A listener whose stop rejects cannot prevent the other listener, or the
|
|
304
|
+
* native lifecycle release, from running.
|
|
305
|
+
* - Failure PROPAGATES. `stopServerListener` deliberately surfaces a stop rejection so every
|
|
306
|
+
* caller sees the same result before a replacement binds the port. Swallowing it would let
|
|
307
|
+
* `drainAndShutdown` report success while a socket is still held.
|
|
308
|
+
*
|
|
309
|
+
* `always` runs after the listeners regardless of their outcome, and its own failure joins the
|
|
310
|
+
* reported set rather than replacing it.
|
|
311
|
+
*/
|
|
312
|
+
export async function runListenerShutdown(
|
|
313
|
+
steps: Array<() => Promise<void>>,
|
|
314
|
+
always: () => Promise<void>,
|
|
315
|
+
): Promise<void> {
|
|
316
|
+
const failures: unknown[] = [];
|
|
317
|
+
for (const step of steps) {
|
|
318
|
+
try {
|
|
319
|
+
await step();
|
|
320
|
+
} catch (error) {
|
|
321
|
+
failures.push(error);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
await always();
|
|
326
|
+
} catch (error) {
|
|
327
|
+
failures.push(error);
|
|
328
|
+
}
|
|
329
|
+
if (failures.length === 1) throw failures[0];
|
|
330
|
+
if (failures.length > 1) throw new AggregateError(failures, "listener shutdown failed");
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export function stopServerListener(
|
|
334
|
+
server: ReturnType<typeof Bun.serve> | undefined = _serverRef,
|
|
335
|
+
): Promise<void> {
|
|
336
|
+
if (!server) return Promise.resolve();
|
|
337
|
+
const existing = serverStopFlights.get(server);
|
|
338
|
+
if (existing) return existing;
|
|
339
|
+
// Bun's Server.stop returns Promise<void>; fire-and-forget races a
|
|
340
|
+
// follow-on listen and can leave the replacement seeing the old proxy.
|
|
341
|
+
const flight = Promise.resolve().then(() => server.stop(true));
|
|
342
|
+
serverStopFlights.set(server, flight);
|
|
343
|
+
return flight;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Native-main startup ownership cleanup, separate from the listen socket flight. */
|
|
347
|
+
export function releaseServerStartupLifecycle(
|
|
348
|
+
server: ReturnType<typeof Bun.serve> | undefined = _serverRef,
|
|
349
|
+
): Promise<void> {
|
|
350
|
+
if (!server) return Promise.resolve();
|
|
351
|
+
const existing = serverStartupReleaseFlights.get(server);
|
|
352
|
+
if (existing) return existing;
|
|
353
|
+
const flight = Promise.resolve().then(() => releaseServerStartupLifecycleImpl(server));
|
|
354
|
+
serverStartupReleaseFlights.set(server, flight);
|
|
355
|
+
return flight;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/** Test seam for a held/rejected startup lifecycle release. */
|
|
359
|
+
export function setServerStartupLifecycleReleaseForTests(
|
|
360
|
+
release: typeof releaseNativeMainStartupLifecycle | undefined,
|
|
361
|
+
): void {
|
|
362
|
+
releaseServerStartupLifecycleImpl = release ?? releaseNativeMainStartupLifecycle;
|
|
363
|
+
serverStartupReleaseFlights = new WeakMap<ReturnType<typeof Bun.serve>, Promise<void>>();
|
|
364
|
+
}
|
|
114
365
|
/**
|
|
115
366
|
* Mark this process as a recycle (dashboard drain-and-restart). Exit cleanup
|
|
116
367
|
* must keep Codex/Grok/system-env injection so the replacement process inherits
|
|
@@ -158,10 +409,16 @@ export async function drainAndShutdown(
|
|
|
158
409
|
timeoutMs: number,
|
|
159
410
|
): Promise<void> {
|
|
160
411
|
const s = server ?? _serverRef;
|
|
161
|
-
|
|
412
|
+
// One absolute budget covers both a pre-existing scoped profile drain and
|
|
413
|
+
// ordinary in-flight turns. A stuck scoped owner must not pin shutdown forever.
|
|
414
|
+
const deadline = Date.now() + Math.max(0, timeoutMs);
|
|
415
|
+
beginShutdownDrain();
|
|
416
|
+
const temporaryDrainsSettled = await waitForTemporaryDrainsUntil(deadline);
|
|
417
|
+
if (!temporaryDrainsSettled) {
|
|
418
|
+
console.warn("Temporary drain lease did not settle before the shutdown deadline; forcing shutdown");
|
|
419
|
+
}
|
|
162
420
|
beginBackgroundShellShutdown();
|
|
163
421
|
try {
|
|
164
|
-
const deadline = Date.now() + timeoutMs;
|
|
165
422
|
while (admittedTurns.size > 0 && Date.now() < deadline) {
|
|
166
423
|
await Bun.sleep(100);
|
|
167
424
|
}
|
|
@@ -178,12 +435,16 @@ export async function drainAndShutdown(
|
|
|
178
435
|
console.warn("[cursor] background shell drain incomplete", shellResult.value);
|
|
179
436
|
}
|
|
180
437
|
|
|
181
|
-
// Debounced replay-state
|
|
182
|
-
// previous_response_id chain
|
|
183
|
-
|
|
184
|
-
|
|
438
|
+
// Debounced replay-state snapshots may still be pending; flush so the last completed turn's
|
|
439
|
+
// previous_response_id chain and antigravity thought signatures survive the restart this
|
|
440
|
+
// shutdown is usually part of.
|
|
441
|
+
const stateFlush = await Promise.allSettled([flushResponseState(), flushAntigravityReplay()]);
|
|
442
|
+
if (stateFlush[0]?.status === "rejected") {
|
|
185
443
|
console.warn("[responses] state flush during shutdown failed");
|
|
186
444
|
}
|
|
445
|
+
if (stateFlush[1]?.status === "rejected") {
|
|
446
|
+
console.warn("[antigravity] replay flush during shutdown failed");
|
|
447
|
+
}
|
|
187
448
|
|
|
188
449
|
// Tear down opt-in storage policy timers / worker / live-config sink so they cannot fire after stop.
|
|
189
450
|
// Await worker thread exit: on Windows, a still-exiting Bun Worker under
|
|
@@ -191,7 +452,17 @@ export async function drainAndShutdown(
|
|
|
191
452
|
// Abort each job independently so one wedged join cannot skip the other,
|
|
192
453
|
// then drain leftovers; failures must not prevent `server.stop`.
|
|
193
454
|
stopStorageCleanupScheduler();
|
|
455
|
+
// Optional subsystems (Compatibility Lab today, anything added later) tear themselves
|
|
456
|
+
// down through hooks registered at activation. A process that never activated one runs
|
|
457
|
+
// nothing here and never loads its module graph.
|
|
458
|
+
runOptionalShutdownHooks();
|
|
194
459
|
stopStateStoreSweeper();
|
|
460
|
+
// The overlay reconciler is owner-scoped: the startServer stop override
|
|
461
|
+
// releases THIS server's lease through runListenerShutdown →
|
|
462
|
+
// userCostOverlayReconciler.stop(), which also recomputes disk-only
|
|
463
|
+
// preservation for any remaining owners. A process-wide stop here would
|
|
464
|
+
// kill reconciliation for every other server in the process, so drain
|
|
465
|
+
// must not call stopUserCostOverlayReconciler().
|
|
195
466
|
cancelQueuedStorageWorkerSpawns();
|
|
196
467
|
const shutdownJoins = await Promise.allSettled([
|
|
197
468
|
abortStorageCleanupPolicyJobAsync(),
|
|
@@ -217,11 +488,11 @@ export async function drainAndShutdown(
|
|
|
217
488
|
setStorageCleanupPolicyJobLiveApply(null);
|
|
218
489
|
} finally {
|
|
219
490
|
try {
|
|
220
|
-
|
|
221
|
-
// isolate reclaim / follow-on listen the same way unterminated Workers did.
|
|
222
|
-
if (s) await s.stop(true);
|
|
491
|
+
await stopServerListener(s);
|
|
223
492
|
} finally {
|
|
224
|
-
|
|
493
|
+
await releaseServerStartupLifecycle(s);
|
|
494
|
+
// shutdownDraining is a process-lifetime latch. A stopped server must
|
|
495
|
+
// never resume admission merely because shutdown cleanup returned.
|
|
225
496
|
}
|
|
226
497
|
}
|
|
227
498
|
}
|