@yansigit/opencodex 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/LICENSE +21 -0
- package/README.md +303 -0
- package/assets/architecture.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/claude-code-models.gif +0 -0
- package/assets/codex-app-picker.png +0 -0
- package/bin/ocx.mjs +587 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
- package/gui/dist/assets/index-CGoDO3uO.css +1 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/icons.svg +24 -0
- package/gui/dist/index.html +25 -0
- package/gui/dist/logo.png +0 -0
- package/gui/dist/provider-icons/alibaba-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity-color.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/deepseek-color.svg +1 -0
- package/gui/dist/provider-icons/discord.svg +1 -0
- package/gui/dist/provider-icons/firepass-color.svg +1 -0
- package/gui/dist/provider-icons/fireworks-color.svg +1 -0
- package/gui/dist/provider-icons/gemini-color.svg +1 -0
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
- package/gui/dist/provider-icons/grok.svg +1 -0
- package/gui/dist/provider-icons/groq-color.svg +1 -0
- package/gui/dist/provider-icons/huggingface-color.svg +1 -0
- package/gui/dist/provider-icons/kimi-color.svg +1 -0
- package/gui/dist/provider-icons/kiro-color.svg +15 -0
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
- package/gui/dist/provider-icons/mistral-color.svg +1 -0
- package/gui/dist/provider-icons/moonshot-color.svg +1 -0
- package/gui/dist/provider-icons/nvidia-color.svg +1 -0
- package/gui/dist/provider-icons/ollama-color.svg +1 -0
- package/gui/dist/provider-icons/openai.svg +1 -0
- package/gui/dist/provider-icons/opencode.svg +2 -0
- package/gui/dist/provider-icons/openrouter-color.svg +1 -0
- package/gui/dist/provider-icons/pi.svg +21 -0
- package/gui/dist/provider-icons/qianfan-color.svg +1 -0
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
- package/gui/dist/provider-icons/telegram.svg +1 -0
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/vllm-color.svg +1 -0
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
- package/package.json +108 -0
- package/src/AGENTS.md +28 -0
- package/src/adapters/anthropic-image-guard.ts +251 -0
- package/src/adapters/anthropic-image-normalize.ts +518 -0
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +1327 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +121 -0
- package/src/adapters/client-fingerprint.ts +65 -0
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +288 -0
- package/src/adapters/cursor/discovery.ts +333 -0
- package/src/adapters/cursor/effort-map.ts +151 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +250 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -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/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +269 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1653 -0
- package/src/adapters/cursor/mcp-config.ts +42 -0
- package/src/adapters/cursor/mcp-manager.ts +333 -0
- package/src/adapters/cursor/message-mapper.ts +49 -0
- package/src/adapters/cursor/native-exec-common.ts +76 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +332 -0
- package/src/adapters/cursor/native-exec-mcp.ts +153 -0
- package/src/adapters/cursor/native-exec-network.ts +43 -0
- package/src/adapters/cursor/native-exec-shell.ts +547 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +663 -0
- package/src/adapters/cursor/protobuf-events.ts +1381 -0
- package/src/adapters/cursor/protobuf-request.ts +1032 -0
- package/src/adapters/cursor/request-builder.ts +461 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +735 -0
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +79 -0
- package/src/adapters/cursor/types.ts +79 -0
- package/src/adapters/cursor.ts +322 -0
- package/src/adapters/google-antigravity-hosts.ts +48 -0
- package/src/adapters/google-antigravity-replay.ts +827 -0
- package/src/adapters/google-antigravity-tools.ts +105 -0
- package/src/adapters/google-antigravity-wire.ts +141 -0
- package/src/adapters/google-errors.ts +92 -0
- package/src/adapters/google-http.ts +460 -0
- package/src/adapters/google-tool-schema.ts +238 -0
- package/src/adapters/google-truncation.ts +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +1377 -0
- package/src/adapters/identity.ts +77 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +208 -0
- package/src/adapters/kiro-events.ts +197 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +112 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +224 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1936 -0
- package/src/adapters/mimo-free.ts +280 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1980 -0
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1911 -0
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +154 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +1986 -0
- package/src/chat/inbound.ts +319 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +266 -0
- package/src/claude/alias.ts +149 -0
- package/src/claude/auth-detect.ts +229 -0
- package/src/claude/auth-mode-migration.ts +32 -0
- package/src/claude/auth-mode.ts +62 -0
- package/src/claude/context-windows.ts +205 -0
- package/src/claude/desktop-3p-guard.ts +35 -0
- package/src/claude/desktop-3p-paths.ts +84 -0
- package/src/claude/desktop-3p.ts +615 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +107 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +578 -0
- package/src/claude/model-info.ts +174 -0
- package/src/claude/outbound.ts +926 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +302 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +737 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +299 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +290 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +213 -0
- package/src/cli/claude.ts +355 -0
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +47 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +127 -0
- package/src/cli/config-command.ts +209 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/dispatch.ts +585 -0
- package/src/cli/doctor.ts +1202 -0
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +213 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +973 -0
- package/src/cli/init.ts +211 -0
- package/src/cli/integrations.ts +260 -0
- package/src/cli/interactive-confirm.ts +133 -0
- 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 +245 -0
- package/src/cli/models.ts +422 -0
- package/src/cli/observe.ts +206 -0
- package/src/cli/opencode.ts +588 -0
- package/src/cli/provider-replit.ts +232 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +492 -0
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +422 -0
- package/src/cli/replit-gateway-key-input.ts +138 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +328 -0
- package/src/cli/star-prompt.ts +211 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +328 -0
- package/src/cli/system-command.ts +112 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +199 -0
- package/src/cli/v2.ts +268 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1704 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +47 -0
- package/src/codex/account-lifecycle.ts +172 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +195 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +544 -0
- package/src/codex/account-usability.ts +43 -0
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/agent-roles-sync.ts +225 -0
- package/src/codex/agent-roles.ts +238 -0
- package/src/codex/app-server-processes.ts +1143 -0
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +2147 -0
- package/src/codex/auth-collision.ts +109 -0
- package/src/codex/auth-context.ts +665 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +436 -0
- package/src/codex/catalog/bundled.ts +549 -0
- package/src/codex/catalog/effort.ts +446 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +664 -0
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +650 -0
- package/src/codex/catalog/provider-fetch.ts +2064 -0
- package/src/codex/catalog/sync.ts +1883 -0
- 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 +14 -0
- 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/data/upstream-models.json +830 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1566 -0
- 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 +108 -0
- package/src/codex/history-provider.ts +979 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1733 -0
- package/src/codex/injected-marker.ts +106 -0
- 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 +225 -0
- 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 +56 -0
- package/src/codex/main-account.ts +68 -0
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +273 -0
- 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 +144 -0
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +425 -0
- 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 +573 -0
- package/src/codex/refresh.ts +62 -0
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +1888 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +2170 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +784 -0
- package/src/codex/sync.ts +319 -0
- 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 +298 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +160 -0
- package/src/combos/index.ts +45 -0
- package/src/combos/request.ts +94 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +398 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +4041 -0
- package/src/fork/register.ts +3 -0
- package/src/generated/compatibility-version.json +3116 -0
- package/src/generated/model-metadata.ts +106 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +530 -0
- package/src/grok/inspect.ts +45 -0
- package/src/grok/status.ts +121 -0
- package/src/grok/sync.ts +66 -0
- package/src/images/artifacts.ts +516 -0
- package/src/images/fulfill-video.ts +163 -0
- package/src/images/fulfill.ts +149 -0
- package/src/images/index.ts +4 -0
- package/src/images/loop.ts +955 -0
- package/src/images/plan.ts +143 -0
- package/src/images/synthetic-tool.ts +133 -0
- package/src/images/types.ts +41 -0
- package/src/images/xai-client.ts +141 -0
- package/src/images/xai-video-client.ts +163 -0
- package/src/index.ts +22 -0
- 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/abort.ts +146 -0
- package/src/lib/admin-secrets.ts +25 -0
- package/src/lib/admission.ts +83 -0
- package/src/lib/app-owned-memory-stores.ts +195 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +346 -0
- package/src/lib/bun-binary-validator.d.mts +3 -0
- package/src/lib/bun-binary-validator.mjs +18 -0
- package/src/lib/bun-runtime.ts +184 -0
- package/src/lib/bun-stream-caps.ts +130 -0
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +364 -0
- package/src/lib/crash-guard.ts +344 -0
- package/src/lib/debug-log-buffer.ts +83 -0
- package/src/lib/debug-settings.ts +108 -0
- package/src/lib/debug.ts +31 -0
- package/src/lib/destination-policy.ts +380 -0
- package/src/lib/errors.ts +406 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -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/open-url.ts +25 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +270 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-outbound.ts +210 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +521 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +61 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +119 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/test-home-guard.ts +90 -0
- package/src/lib/token-estimate.ts +86 -0
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +400 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +392 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-atomic-replace.ts +156 -0
- package/src/lib/windows-elevation.ts +773 -0
- package/src/lib/windows-secret-acl.ts +854 -0
- 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 +403 -0
- 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-routing.ts +594 -0
- package/src/oauth/anthropic.ts +188 -0
- package/src/oauth/antigravity-routing.ts +151 -0
- package/src/oauth/callback-server.ts +300 -0
- package/src/oauth/chatgpt.ts +161 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +252 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +262 -0
- package/src/oauth/health.ts +407 -0
- package/src/oauth/index.ts +1504 -0
- package/src/oauth/key-providers.ts +124 -0
- package/src/oauth/kimi.ts +227 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -0
- package/src/oauth/local-token-detect.ts +130 -0
- package/src/oauth/log.ts +50 -0
- package/src/oauth/login-cli.ts +223 -0
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +728 -0
- package/src/oauth/token-guardian.ts +309 -0
- package/src/oauth/types.ts +62 -0
- package/src/oauth/xai.ts +241 -0
- package/src/providers/alibaba-region-backup.ts +75 -0
- package/src/providers/alibaba-region-migration.ts +156 -0
- package/src/providers/alibaba-region-startup.ts +36 -0
- package/src/providers/antigravity-models.ts +695 -0
- package/src/providers/antigravity-quota.ts +216 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +74 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +82 -0
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +586 -0
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +187 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +271 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +449 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +243 -0
- package/src/providers/openai-tier-startup.ts +56 -0
- package/src/providers/openai-tiers.ts +423 -0
- package/src/providers/openai-virtual-models.ts +83 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +185 -0
- package/src/providers/quota.ts +2345 -0
- package/src/providers/registry.ts +2918 -0
- package/src/providers/replit/constants.ts +27 -0
- package/src/providers/replit/derive.ts +85 -0
- package/src/providers/replit/headers.ts +28 -0
- package/src/providers/replit/origin.ts +55 -0
- package/src/providers/replit/pair-install-response.ts +72 -0
- package/src/providers/replit/probe.ts +199 -0
- package/src/providers/replit/setup.ts +350 -0
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +103 -0
- 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 +148 -0
- package/src/reasoning-effort.ts +183 -0
- package/src/responses/compaction.ts +142 -0
- 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 +838 -0
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +165 -0
- package/src/responses/spill-store.ts +459 -0
- package/src/responses/state.ts +1433 -0
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +761 -0
- 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 +53 -0
- package/src/server/auth-cors.ts +751 -0
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +442 -0
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +1030 -0
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +190 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +152 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +568 -0
- package/src/server/index.ts +1813 -0
- package/src/server/lifecycle.ts +498 -0
- package/src/server/live.ts +717 -0
- 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 +1433 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +193 -0
- package/src/server/management/body.ts +41 -0
- package/src/server/management/combo-routes.ts +263 -0
- package/src/server/management/config-routes.ts +835 -0
- package/src/server/management/context.ts +113 -0
- 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 +586 -0
- package/src/server/management/model-routes.ts +560 -0
- 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 +637 -0
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +1033 -0
- package/src/server/management/replit-provider-routes.ts +86 -0
- 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 +385 -0
- package/src/server/management/shared.ts +286 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- 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 +435 -0
- package/src/server/management/system-routes.ts +194 -0
- package/src/server/management/usage-summary-cache.ts +94 -0
- 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 +314 -0
- package/src/server/management-auth.ts +482 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +328 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1209 -0
- package/src/server/request-decompress.ts +239 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1259 -0
- 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 +551 -0
- package/src/server/responses/compact.ts +771 -0
- package/src/server/responses/core.ts +5389 -0
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +331 -0
- package/src/server/responses/fetch-helpers.ts +232 -0
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +78 -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 +251 -0
- package/src/server/responses/upstream-error.ts +53 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +272 -0
- 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 +25 -0
- package/src/server/search.ts +201 -0
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +263 -0
- package/src/server/startup-action-control.ts +315 -0
- package/src/server/startup-health-cache.ts +131 -0
- package/src/server/system-env.ts +484 -0
- package/src/server/windows-tcp-drop.ts +184 -0
- package/src/server/windows-tray-control.ts +41 -0
- package/src/server/ws-bridge.ts +472 -0
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +3575 -0
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/stall-timeout.ts +20 -0
- package/src/storage/cleanup-job.ts +57 -0
- package/src/storage/cleanup.ts +3085 -0
- package/src/storage/policy-job.ts +457 -0
- package/src/storage/policy-scheduler.ts +40 -0
- package/src/storage/policy-worker.ts +59 -0
- package/src/storage/policy.ts +527 -0
- package/src/storage/restore-job.ts +299 -0
- package/src/storage/restore-worker.ts +58 -0
- package/src/storage/scanner.ts +238 -0
- package/src/storage/storage-mutation-coordinator.ts +139 -0
- package/src/storage/worker-lifecycle.ts +215 -0
- package/src/tray/assets/opencodex-tray-offline.ico +0 -0
- package/src/tray/assets/opencodex-tray-online.ico +0 -0
- package/src/tray/assets/opencodex-tray-warning.ico +0 -0
- package/src/tray/assets/opencodex-tray.png +0 -0
- package/src/tray/windows-tray.ps1 +364 -0
- package/src/tray/windows.ts +757 -0
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +876 -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 +106 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +415 -0
- package/src/update/job.ts +1887 -0
- package/src/update/notify.ts +263 -0
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/update/tray-update-plan.d.mts +18 -0
- package/src/update/tray-update-plan.mjs +38 -0
- package/src/usage/cost.ts +625 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +416 -0
- package/src/usage/log.ts +1223 -0
- package/src/usage/summary.ts +753 -0
- package/src/usage/totals.ts +14 -0
- 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 +189 -0
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +131 -0
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +681 -0
- 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 +195 -0
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +113 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +331 -0
- package/src/web-search/loop.ts +896 -0
- package/src/web-search/parse.ts +315 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/synthetic-tool.ts +47 -0
- package/src/web-search/xai-executor.ts +219 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
import { flushAntigravityReplay } from "../adapters/google-antigravity-replay";
|
|
2
|
+
import { flushResponseState } from "../responses/state";
|
|
3
|
+
import { setStorageCleanupPolicyLiveSink } from "../storage/policy";
|
|
4
|
+
import {
|
|
5
|
+
abortStorageCleanupPolicyJobAsync,
|
|
6
|
+
setStorageCleanupPolicyJobLiveApply,
|
|
7
|
+
} from "../storage/policy-job";
|
|
8
|
+
import { abortRestoreTrashJobAsync } from "../storage/restore-job";
|
|
9
|
+
import { stopStorageCleanupScheduler } from "../storage/policy-scheduler";
|
|
10
|
+
import { runOptionalShutdownHooks } from "../lib/optional-shutdown-hooks";
|
|
11
|
+
import { stopStateStoreSweeper } from "../lib/state-store-sweeper";
|
|
12
|
+
import {
|
|
13
|
+
cancelQueuedStorageWorkerSpawns,
|
|
14
|
+
drainStorageWorkers,
|
|
15
|
+
} from "../storage/worker-lifecycle";
|
|
16
|
+
import { createAdmissionGate, type AdmissionLease, type AdmissionMetrics } from "../lib/admission";
|
|
17
|
+
import { codexWebSocketAdmissionMetrics } from "../codex/websocket-registry";
|
|
18
|
+
import { storageMutationAdmissionMetrics } from "../storage/storage-mutation-coordinator";
|
|
19
|
+
import { storageWorkerAdmissionMetrics } from "../storage/worker-lifecycle";
|
|
20
|
+
import {
|
|
21
|
+
backgroundShellAdmissionMetrics,
|
|
22
|
+
beginBackgroundShellShutdown,
|
|
23
|
+
terminateAllBackgroundShells,
|
|
24
|
+
} from "../adapters/cursor/native-exec-shell";
|
|
25
|
+
import type { CodexAccountSelectionAdmission } from "../codex/auth-context";
|
|
26
|
+
import { releaseNativeMainStartupLifecycle } from "../codex/native-profile-startup";
|
|
27
|
+
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Active turn tracking + graceful shutdown drain
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
export const MAX_ACTIVE_TURNS = 256;
|
|
33
|
+
const turnGate = createAdmissionGate("active_turns", MAX_ACTIVE_TURNS);
|
|
34
|
+
export interface ActiveTurnLease extends AdmissionLease {
|
|
35
|
+
bindAbortController(ac: AbortController): void;
|
|
36
|
+
beginCodexAccountSelection(): CodexAccountSelectionAdmission;
|
|
37
|
+
isTransferred(): boolean;
|
|
38
|
+
}
|
|
39
|
+
const activeTurns = new Map<AbortController, ActiveTurnLease>();
|
|
40
|
+
const admittedTurns = new Set<ActiveTurnLease>();
|
|
41
|
+
const knownTurnControllers = new WeakSet<AbortController>();
|
|
42
|
+
let turnReleaseMisses = 0;
|
|
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;
|
|
50
|
+
let recyclingForExit = false;
|
|
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;
|
|
55
|
+
|
|
56
|
+
export function setServerRef(server: ReturnType<typeof Bun.serve> | undefined): void { _serverRef = server; }
|
|
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
|
+
}
|
|
160
|
+
export function tryAdmitTurn(): ActiveTurnLease | null {
|
|
161
|
+
if (isDraining()) return null;
|
|
162
|
+
const gateLease = turnGate.tryAcquire();
|
|
163
|
+
if (!gateLease) return null;
|
|
164
|
+
const controllers = new Set<AbortController>();
|
|
165
|
+
let active = true;
|
|
166
|
+
let transferred = false;
|
|
167
|
+
let nativeMainClaimed = false;
|
|
168
|
+
const lease: ActiveTurnLease = {
|
|
169
|
+
bindAbortController(ac) {
|
|
170
|
+
knownTurnControllers.add(ac);
|
|
171
|
+
if (!active) {
|
|
172
|
+
ac.abort(new Error("turn already settled"));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
transferred = true;
|
|
176
|
+
controllers.add(ac);
|
|
177
|
+
activeTurns.set(ac, lease);
|
|
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
|
+
},
|
|
204
|
+
isTransferred() { return transferred; },
|
|
205
|
+
release() {
|
|
206
|
+
if (!active) return;
|
|
207
|
+
active = false;
|
|
208
|
+
admittedTurns.delete(lease);
|
|
209
|
+
for (const controller of controllers) {
|
|
210
|
+
if (activeTurns.get(controller) === lease) activeTurns.delete(controller);
|
|
211
|
+
}
|
|
212
|
+
controllers.clear();
|
|
213
|
+
nativeMainTurns.delete(lease);
|
|
214
|
+
gateLease.release();
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
admittedTurns.add(lease);
|
|
218
|
+
return lease;
|
|
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
|
+
|
|
250
|
+
export function registerTurn(ac: AbortController, lease?: AdmissionLease): void {
|
|
251
|
+
if (lease && "bindAbortController" in lease) (lease as ActiveTurnLease).bindAbortController(ac);
|
|
252
|
+
}
|
|
253
|
+
export function unregisterTurn(ac: AbortController): void {
|
|
254
|
+
const lease = activeTurns.get(ac);
|
|
255
|
+
if (!lease) {
|
|
256
|
+
if (knownTurnControllers.has(ac)) return;
|
|
257
|
+
turnReleaseMisses += 1;
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
lease.release();
|
|
261
|
+
}
|
|
262
|
+
export function isDraining(): boolean { return shutdownDraining || temporaryDrainOwners.size > 0; }
|
|
263
|
+
export function getActiveTurnCount(): number { return turnGate.metrics().active; }
|
|
264
|
+
export function getNativeMainProfileRequestCount(): number {
|
|
265
|
+
return nativeMainSelections + nativeMainTurns.size;
|
|
266
|
+
}
|
|
267
|
+
export function activeRegistryMetrics(): Record<string, AdmissionMetrics> {
|
|
268
|
+
const turns = turnGate.metrics();
|
|
269
|
+
return {
|
|
270
|
+
activeTurns: { ...turns, releaseMisses: turns.releaseMisses + turnReleaseMisses },
|
|
271
|
+
codexWebSockets: codexWebSocketAdmissionMetrics(),
|
|
272
|
+
cursorBackgroundShells: backgroundShellAdmissionMetrics(),
|
|
273
|
+
storageHomeSlots: storageMutationAdmissionMetrics(),
|
|
274
|
+
storageWorkerReservations: storageWorkerAdmissionMetrics(),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export function abortAndReleaseAllTurns(reason: unknown = new Error("server shutdown")): void {
|
|
279
|
+
const owners = [...admittedTurns];
|
|
280
|
+
for (const owner of owners) {
|
|
281
|
+
const controllers = [...activeTurns].filter(([, lease]) => lease === owner).map(([controller]) => controller);
|
|
282
|
+
for (const controller of controllers) controller.abort(reason);
|
|
283
|
+
owner.release();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/** Live listen port of the Bun server, when started. */
|
|
287
|
+
export function getServerListenPort(): number | undefined {
|
|
288
|
+
const port = _serverRef?.port;
|
|
289
|
+
return typeof port === "number" && port > 0 ? port : undefined;
|
|
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
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Mark this process as a recycle (dashboard drain-and-restart). Exit cleanup
|
|
367
|
+
* must keep Codex/Grok/system-env injection so the replacement process inherits
|
|
368
|
+
* a working fence — unlike an intentional `ocx stop` teardown.
|
|
369
|
+
*/
|
|
370
|
+
export function markRecyclingForExit(): void { recyclingForExit = true; }
|
|
371
|
+
export function isRecyclingForExit(): boolean { return recyclingForExit; }
|
|
372
|
+
|
|
373
|
+
export function trackStreamLifetime(
|
|
374
|
+
body: ReadableStream<Uint8Array>,
|
|
375
|
+
ac: AbortController,
|
|
376
|
+
onDone?: () => void,
|
|
377
|
+
lease?: AdmissionLease,
|
|
378
|
+
): ReadableStream<Uint8Array> {
|
|
379
|
+
registerTurn(ac, lease);
|
|
380
|
+
const reader = body.getReader();
|
|
381
|
+
let closed = false;
|
|
382
|
+
const finish = () => {
|
|
383
|
+
if (closed) return;
|
|
384
|
+
closed = true;
|
|
385
|
+
unregisterTurn(ac);
|
|
386
|
+
onDone?.();
|
|
387
|
+
};
|
|
388
|
+
return new ReadableStream<Uint8Array>({
|
|
389
|
+
async pull(controller) {
|
|
390
|
+
try {
|
|
391
|
+
const { done, value } = await reader.read();
|
|
392
|
+
if (done) { finish(); controller.close(); return; }
|
|
393
|
+
controller.enqueue(value);
|
|
394
|
+
} catch (err) {
|
|
395
|
+
finish();
|
|
396
|
+
try { controller.error(err); } catch { /* already closed */ }
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
cancel(reason) {
|
|
400
|
+
finish();
|
|
401
|
+
ac.abort(reason);
|
|
402
|
+
reader.cancel(reason).catch(() => {});
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export async function drainAndShutdown(
|
|
408
|
+
server: ReturnType<typeof Bun.serve> | undefined,
|
|
409
|
+
timeoutMs: number,
|
|
410
|
+
): Promise<void> {
|
|
411
|
+
const s = server ?? _serverRef;
|
|
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
|
+
}
|
|
420
|
+
beginBackgroundShellShutdown();
|
|
421
|
+
try {
|
|
422
|
+
while (admittedTurns.size > 0 && Date.now() < deadline) {
|
|
423
|
+
await Bun.sleep(100);
|
|
424
|
+
}
|
|
425
|
+
if (admittedTurns.size > 0) {
|
|
426
|
+
console.warn(`⚠️ Aborting ${admittedTurns.size} in-flight turn(s) after ${timeoutMs}ms deadline`);
|
|
427
|
+
abortAndReleaseAllTurns(new Error("server shutdown"));
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const shellDrain = await Promise.allSettled([terminateAllBackgroundShells()]);
|
|
431
|
+
const shellResult = shellDrain[0]!;
|
|
432
|
+
if (shellResult.status === "rejected") {
|
|
433
|
+
console.warn("[cursor] background shell drain failed", { rejected: 1 });
|
|
434
|
+
} else if (shellResult.value.unresolved > 0 || shellResult.value.killFailures > 0) {
|
|
435
|
+
console.warn("[cursor] background shell drain incomplete", shellResult.value);
|
|
436
|
+
}
|
|
437
|
+
|
|
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") {
|
|
443
|
+
console.warn("[responses] state flush during shutdown failed");
|
|
444
|
+
}
|
|
445
|
+
if (stateFlush[1]?.status === "rejected") {
|
|
446
|
+
console.warn("[antigravity] replay flush during shutdown failed");
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Tear down opt-in storage policy timers / worker / live-config sink so they cannot fire after stop.
|
|
450
|
+
// Await worker thread exit: on Windows, a still-exiting Bun Worker under
|
|
451
|
+
// `bun test --isolate` panics the whole process at the next realm reclaim.
|
|
452
|
+
// Abort each job independently so one wedged join cannot skip the other,
|
|
453
|
+
// then drain leftovers; failures must not prevent `server.stop`.
|
|
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();
|
|
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().
|
|
466
|
+
cancelQueuedStorageWorkerSpawns();
|
|
467
|
+
const shutdownJoins = await Promise.allSettled([
|
|
468
|
+
abortStorageCleanupPolicyJobAsync(),
|
|
469
|
+
abortRestoreTrashJobAsync(),
|
|
470
|
+
]);
|
|
471
|
+
for (const result of shutdownJoins) {
|
|
472
|
+
if (result.status === "rejected") {
|
|
473
|
+
console.warn(
|
|
474
|
+
"[storage] worker abort during shutdown failed:",
|
|
475
|
+
result.reason instanceof Error ? result.reason.message : result.reason,
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
try {
|
|
480
|
+
await drainStorageWorkers();
|
|
481
|
+
} catch (err) {
|
|
482
|
+
console.warn(
|
|
483
|
+
"[storage] worker drain during shutdown failed:",
|
|
484
|
+
err instanceof Error ? err.message : err,
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
setStorageCleanupPolicyLiveSink(null);
|
|
488
|
+
setStorageCleanupPolicyJobLiveApply(null);
|
|
489
|
+
} finally {
|
|
490
|
+
try {
|
|
491
|
+
await stopServerListener(s);
|
|
492
|
+
} finally {
|
|
493
|
+
await releaseServerStartupLifecycle(s);
|
|
494
|
+
// shutdownDraining is a process-lifetime latch. A stopped server must
|
|
495
|
+
// never resume admission merely because shutdown cleanup returned.
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|