@coseung2/opencodex 2.8.0-cs.1
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/LICENSE +21 -0
- package/README.md +219 -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-notch.mjs +78 -0
- package/bin/ocx.mjs +454 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-CAnnes06.js +67 -0
- package/gui/dist/assets/index-OY43ubAq.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/antigravity.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/claude.svg +1 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/copilot.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/cursor.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/gemini.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-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/kiro.svg +14 -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 +1 -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 +107 -0
- package/packages/ocx-notch/README.md +55 -0
- package/packages/ocx-notch/THIRD_PARTY_NOTICES.md +45 -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.ts +1003 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +72 -0
- package/src/adapters/client-fingerprint.ts +59 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/cursor-errors.ts +165 -0
- package/src/adapters/cursor/discovery.ts +276 -0
- package/src/adapters/cursor/effort-map.ts +127 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +211 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
- package/src/adapters/cursor/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +153 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1214 -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 +55 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +329 -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 +548 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +576 -0
- package/src/adapters/cursor/protobuf-events.ts +563 -0
- package/src/adapters/cursor/protobuf-request.ts +714 -0
- package/src/adapters/cursor/request-builder.ts +255 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +505 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +57 -0
- package/src/adapters/cursor/types.ts +52 -0
- package/src/adapters/cursor.ts +196 -0
- package/src/adapters/google-antigravity-replay.ts +303 -0
- package/src/adapters/google-antigravity-wire.ts +108 -0
- package/src/adapters/google-errors.ts +85 -0
- package/src/adapters/google-http.ts +100 -0
- package/src/adapters/google-tool-schema.ts +173 -0
- package/src/adapters/google-truncation.ts +13 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +758 -0
- package/src/adapters/identity.ts +44 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +197 -0
- package/src/adapters/kiro-events.ts +179 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +96 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +215 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1898 -0
- package/src/adapters/mimo-free.ts +263 -0
- package/src/adapters/openai-chat.ts +1005 -0
- package/src/adapters/openai-responses.ts +1137 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-catalog-nudge.ts +71 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/bridge.ts +1619 -0
- package/src/chat/inbound.ts +295 -0
- package/src/chat/outbound.ts +765 -0
- package/src/claude/agents-inject.ts +243 -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 +189 -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 +381 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +70 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +509 -0
- package/src/claude/model-info.ts +151 -0
- package/src/claude/outbound.ts +872 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +268 -0
- package/src/cli/account-auth.ts +223 -0
- package/src/cli/account-extended.ts +350 -0
- package/src/cli/account.ts +275 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +184 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-desktop.ts +188 -0
- package/src/cli/claude.ts +286 -0
- package/src/cli/codex-shim-autorestore.ts +45 -0
- package/src/cli/combo.ts +119 -0
- package/src/cli/config-command.ts +145 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/doctor.ts +930 -0
- package/src/cli/export-command.ts +187 -0
- package/src/cli/help.ts +330 -0
- package/src/cli/index.ts +1103 -0
- package/src/cli/init.ts +224 -0
- package/src/cli/integrations.ts +142 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/internal-dispatch.ts +20 -0
- package/src/cli/models-runtime.ts +212 -0
- package/src/cli/models.ts +336 -0
- package/src/cli/observe.ts +117 -0
- package/src/cli/opencode.ts +586 -0
- package/src/cli/provider-runtime.ts +162 -0
- package/src/cli/provider.ts +463 -0
- package/src/cli/runtime-api.ts +325 -0
- package/src/cli/star-prompt.ts +134 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +321 -0
- package/src/cli/system-command.ts +114 -0
- package/src/cli/tray-proxy.ts +52 -0
- package/src/cli/v2.ts +173 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +377 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +34 -0
- package/src/codex/account-lifecycle.ts +55 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +149 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +517 -0
- package/src/codex/account-usability.ts +20 -0
- package/src/codex/app-server-processes.ts +756 -0
- package/src/codex/auth-api.ts +1540 -0
- package/src/codex/auth-collision.ts +107 -0
- package/src/codex/auth-context.ts +352 -0
- package/src/codex/autostart-health.ts +149 -0
- package/src/codex/catalog/aggregation.ts +378 -0
- package/src/codex/catalog/bundled.ts +251 -0
- package/src/codex/catalog/effort.ts +355 -0
- package/src/codex/catalog/metadata.ts +180 -0
- package/src/codex/catalog/parsing.ts +456 -0
- package/src/codex/catalog/provider-fetch.ts +902 -0
- package/src/codex/catalog/sync.ts +620 -0
- package/src/codex/catalog.ts +12 -0
- package/src/codex/data/upstream-models.json +830 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +969 -0
- package/src/codex/history-migration-guardian.ts +102 -0
- package/src/codex/history-provider.ts +776 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject.ts +799 -0
- package/src/codex/injected-marker.ts +72 -0
- package/src/codex/journal.ts +163 -0
- package/src/codex/main-account-cache.ts +32 -0
- package/src/codex/main-account.ts +40 -0
- package/src/codex/model-cache.ts +227 -0
- package/src/codex/paths.ts +65 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +225 -0
- package/src/codex/project-config-warnings.ts +411 -0
- package/src/codex/quota.ts +411 -0
- package/src/codex/refresh.ts +53 -0
- package/src/codex/routing.ts +1477 -0
- package/src/codex/runtime.ts +538 -0
- package/src/codex/shim.ts +1189 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +469 -0
- package/src/codex/sync.ts +130 -0
- package/src/codex/warmup.ts +192 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/combos/failover.ts +140 -0
- package/src/combos/index.ts +41 -0
- package/src/combos/request.ts +62 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +326 -0
- package/src/config.ts +2355 -0
- package/src/generated/jawcode-model-metadata.ts +104 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +519 -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 +829 -0
- package/src/images/plan.ts +133 -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/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 +173 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +202 -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 +71 -0
- package/src/lib/bun-stream-caps.ts +126 -0
- package/src/lib/config-ownership.ts +360 -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 +316 -0
- package/src/lib/errors.ts +364 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/pinned-http.ts +151 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +165 -0
- package/src/lib/provider-outbound.ts +170 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +105 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +30 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +323 -0
- package/src/lib/state-store-registrations.ts +109 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/test-home-guard.ts +90 -0
- package/src/lib/token-estimate.ts +69 -0
- package/src/lib/translator-budget.ts +356 -0
- package/src/lib/upstream-retry.ts +239 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-elevation.ts +705 -0
- package/src/lib/windows-secret-acl.ts +514 -0
- package/src/lib/winsw.ts +375 -0
- package/src/oauth/anthropic-routing.ts +594 -0
- package/src/oauth/anthropic.ts +177 -0
- package/src/oauth/callback-server.ts +294 -0
- package/src/oauth/chatgpt.ts +150 -0
- package/src/oauth/cursor.ts +211 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +230 -0
- package/src/oauth/health.ts +399 -0
- package/src/oauth/index.ts +1173 -0
- package/src/oauth/key-providers.ts +108 -0
- package/src/oauth/kimi.ts +213 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +577 -0
- package/src/oauth/local-token-detect.ts +121 -0
- package/src/oauth/log.ts +48 -0
- package/src/oauth/login-cli.ts +163 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +630 -0
- package/src/oauth/token-guardian.ts +303 -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 +205 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +64 -0
- package/src/providers/context-cap.ts +65 -0
- package/src/providers/derive.ts +339 -0
- package/src/providers/free-directory.ts +184 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/key-failover.ts +203 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery.ts +356 -0
- package/src/providers/openai-sidecar.ts +175 -0
- package/src/providers/openai-tier-startup.ts +27 -0
- package/src/providers/openai-tiers.ts +301 -0
- package/src/providers/openai-virtual-models.ts +82 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +150 -0
- package/src/providers/quota.ts +1045 -0
- package/src/providers/registry.ts +1600 -0
- package/src/providers/slug-codec.ts +67 -0
- package/src/providers/xai-transport.ts +141 -0
- package/src/reasoning-effort.ts +135 -0
- package/src/responses/compaction.ts +117 -0
- package/src/responses/parser.ts +656 -0
- package/src/responses/reasoning-envelope.ts +52 -0
- package/src/responses/schema.ts +159 -0
- package/src/responses/spill-store.ts +394 -0
- package/src/responses/state.ts +895 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/router.ts +425 -0
- package/src/server/adapter-resolve.ts +80 -0
- package/src/server/auth-cors.ts +530 -0
- package/src/server/chat-completions.ts +368 -0
- package/src/server/claude-messages.ts +914 -0
- package/src/server/effort-policy.ts +172 -0
- package/src/server/gui-static.ts +123 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +476 -0
- package/src/server/index.ts +1126 -0
- package/src/server/lifecycle.ts +305 -0
- package/src/server/live.ts +598 -0
- package/src/server/management/agent-settings-routes.ts +1039 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +167 -0
- package/src/server/management/body.ts +35 -0
- package/src/server/management/combo-routes.ts +220 -0
- package/src/server/management/config-routes.ts +422 -0
- package/src/server/management/context.ts +31 -0
- package/src/server/management/logs-usage-routes.ts +516 -0
- package/src/server/management/model-routes.ts +525 -0
- package/src/server/management/oauth-account-routes.ts +561 -0
- package/src/server/management/provider-routes.ts +556 -0
- package/src/server/management/shared.ts +277 -0
- package/src/server/management/sidebar-routes.ts +88 -0
- package/src/server/management/system-restart.ts +179 -0
- package/src/server/management/system-routes.ts +117 -0
- package/src/server/management/usage-summary-cache.ts +86 -0
- package/src/server/management-api.ts +211 -0
- package/src/server/management-auth.ts +267 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +116 -0
- package/src/server/proxy-liveness.ts +201 -0
- package/src/server/relay-eager.ts +313 -0
- package/src/server/relay.ts +1060 -0
- package/src/server/request-decompress.ts +132 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1046 -0
- package/src/server/responses/collaboration.ts +354 -0
- package/src/server/responses/compact.ts +384 -0
- package/src/server/responses/core.ts +2756 -0
- package/src/server/responses/encrypted-payload.ts +308 -0
- package/src/server/responses/fetch-helpers.ts +157 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/terminal-guard.ts +230 -0
- package/src/server/responses/upstream-error.ts +48 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +224 -0
- package/src/server/responses.ts +9 -0
- package/src/server/search.ts +136 -0
- package/src/server/sse-payload-rewrite.ts +175 -0
- package/src/server/startup-action-control.ts +308 -0
- package/src/server/startup-health-cache.ts +113 -0
- package/src/server/system-env.ts +413 -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 +471 -0
- package/src/service.ts +2554 -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 +290 -0
- package/src/tray/windows.ts +730 -0
- package/src/types.ts +1237 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +392 -0
- package/src/update/job.ts +1513 -0
- package/src/update/notify.ts +257 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -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 +0 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +164 -0
- package/src/usage/log.ts +658 -0
- package/src/usage/summary.ts +585 -0
- package/src/usage/totals.ts +14 -0
- package/src/vision/anthropic-describe.ts +185 -0
- package/src/vision/describe.ts +125 -0
- package/src/vision/index.ts +467 -0
- package/src/web-search/anthropic-executor.ts +189 -0
- package/src/web-search/executor.ts +105 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/index.ts +196 -0
- package/src/web-search/loop.ts +664 -0
- package/src/web-search/parse.ts +220 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/synthetic-tool.ts +47 -0
- package/vendor/ocx-notch/win32-x64/ocx-notch.exe +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { flushResponseState } from "../responses/state";
|
|
2
|
+
import { setStorageCleanupPolicyLiveSink } from "../storage/policy";
|
|
3
|
+
import {
|
|
4
|
+
abortStorageCleanupPolicyJobAsync,
|
|
5
|
+
setStorageCleanupPolicyJobLiveApply,
|
|
6
|
+
} from "../storage/policy-job";
|
|
7
|
+
import { abortRestoreTrashJobAsync } from "../storage/restore-job";
|
|
8
|
+
import { stopStorageCleanupScheduler } from "../storage/policy-scheduler";
|
|
9
|
+
import { stopStateStoreSweeper } from "../lib/state-store-sweeper";
|
|
10
|
+
import {
|
|
11
|
+
cancelQueuedStorageWorkerSpawns,
|
|
12
|
+
drainStorageWorkers,
|
|
13
|
+
} from "../storage/worker-lifecycle";
|
|
14
|
+
import { createAdmissionGate, type AdmissionLease, type AdmissionMetrics } from "../lib/admission";
|
|
15
|
+
import { codexWebSocketAdmissionMetrics } from "../codex/websocket-registry";
|
|
16
|
+
import { storageMutationAdmissionMetrics } from "../storage/storage-mutation-coordinator";
|
|
17
|
+
import { storageWorkerAdmissionMetrics } from "../storage/worker-lifecycle";
|
|
18
|
+
import {
|
|
19
|
+
backgroundShellAdmissionMetrics,
|
|
20
|
+
beginBackgroundShellShutdown,
|
|
21
|
+
terminateAllBackgroundShells,
|
|
22
|
+
} from "../adapters/cursor/native-exec-shell";
|
|
23
|
+
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Active turn tracking + graceful shutdown drain
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
export const MAX_ACTIVE_TURNS = 256;
|
|
29
|
+
const turnGate = createAdmissionGate("active_turns", MAX_ACTIVE_TURNS);
|
|
30
|
+
export interface ActiveTurnLease extends AdmissionLease {
|
|
31
|
+
bindAbortController(ac: AbortController): void;
|
|
32
|
+
isTransferred(): boolean;
|
|
33
|
+
}
|
|
34
|
+
const activeTurns = new Map<AbortController, ActiveTurnLease>();
|
|
35
|
+
const admittedTurns = new Set<ActiveTurnLease>();
|
|
36
|
+
const knownTurnControllers = new WeakSet<AbortController>();
|
|
37
|
+
let turnReleaseMisses = 0;
|
|
38
|
+
let draining = false;
|
|
39
|
+
let recyclingForExit = false;
|
|
40
|
+
let _serverRef: ReturnType<typeof Bun.serve> | undefined;
|
|
41
|
+
|
|
42
|
+
export function setServerRef(server: ReturnType<typeof Bun.serve> | undefined): void { _serverRef = server; }
|
|
43
|
+
export function setDraining(value: boolean): void { draining = value; }
|
|
44
|
+
export function tryAdmitTurn(): ActiveTurnLease | null {
|
|
45
|
+
const gateLease = turnGate.tryAcquire();
|
|
46
|
+
if (!gateLease) return null;
|
|
47
|
+
const controllers = new Set<AbortController>();
|
|
48
|
+
let active = true;
|
|
49
|
+
let transferred = false;
|
|
50
|
+
const lease: ActiveTurnLease = {
|
|
51
|
+
bindAbortController(ac) {
|
|
52
|
+
knownTurnControllers.add(ac);
|
|
53
|
+
if (!active) {
|
|
54
|
+
ac.abort(new Error("turn already settled"));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
transferred = true;
|
|
58
|
+
controllers.add(ac);
|
|
59
|
+
activeTurns.set(ac, lease);
|
|
60
|
+
},
|
|
61
|
+
isTransferred() { return transferred; },
|
|
62
|
+
release() {
|
|
63
|
+
if (!active) return;
|
|
64
|
+
active = false;
|
|
65
|
+
admittedTurns.delete(lease);
|
|
66
|
+
for (const controller of controllers) {
|
|
67
|
+
if (activeTurns.get(controller) === lease) activeTurns.delete(controller);
|
|
68
|
+
}
|
|
69
|
+
controllers.clear();
|
|
70
|
+
gateLease.release();
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
admittedTurns.add(lease);
|
|
74
|
+
return lease;
|
|
75
|
+
}
|
|
76
|
+
export function registerTurn(ac: AbortController, lease?: AdmissionLease): void {
|
|
77
|
+
if (lease && "bindAbortController" in lease) (lease as ActiveTurnLease).bindAbortController(ac);
|
|
78
|
+
}
|
|
79
|
+
export function unregisterTurn(ac: AbortController): void {
|
|
80
|
+
const lease = activeTurns.get(ac);
|
|
81
|
+
if (!lease) {
|
|
82
|
+
if (knownTurnControllers.has(ac)) return;
|
|
83
|
+
turnReleaseMisses += 1;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
lease.release();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const DEFAULT_TERMINAL_TURN_LEASE_MS = 15_000;
|
|
90
|
+
|
|
91
|
+
export type ActiveTurnFinishReason =
|
|
92
|
+
| "inspection_settled"
|
|
93
|
+
| "upstream_abort"
|
|
94
|
+
| "terminal_lease_expired";
|
|
95
|
+
|
|
96
|
+
export type TrackedActiveTurn = {
|
|
97
|
+
finish(reason?: ActiveTurnFinishReason): void;
|
|
98
|
+
noteProtocolTerminal(): void;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Track the controller that owns the actual upstream request.
|
|
103
|
+
*
|
|
104
|
+
* A valid protocol terminal starts a bounded bookkeeping lease because the
|
|
105
|
+
* native response branch is intentionally not JS-wrapped on some platforms and
|
|
106
|
+
* a tee inspection reader may never settle. Lease expiry releases admission
|
|
107
|
+
* only; it never aborts the upstream or the client response.
|
|
108
|
+
*/
|
|
109
|
+
export function trackActiveTurnLease(
|
|
110
|
+
ac: AbortController,
|
|
111
|
+
lease?: AdmissionLease,
|
|
112
|
+
options: {
|
|
113
|
+
terminalLeaseMs?: number;
|
|
114
|
+
onFinish?: (reason: ActiveTurnFinishReason) => void;
|
|
115
|
+
} = {},
|
|
116
|
+
): TrackedActiveTurn {
|
|
117
|
+
const terminalLeaseMs = Math.max(
|
|
118
|
+
0,
|
|
119
|
+
options.terminalLeaseMs ?? DEFAULT_TERMINAL_TURN_LEASE_MS,
|
|
120
|
+
);
|
|
121
|
+
let finished = false;
|
|
122
|
+
let terminalTimer: ReturnType<typeof setTimeout> | undefined;
|
|
123
|
+
|
|
124
|
+
const finish = (
|
|
125
|
+
reason: ActiveTurnFinishReason = "inspection_settled",
|
|
126
|
+
): void => {
|
|
127
|
+
if (finished) return;
|
|
128
|
+
finished = true;
|
|
129
|
+
if (terminalTimer !== undefined) {
|
|
130
|
+
clearTimeout(terminalTimer);
|
|
131
|
+
terminalTimer = undefined;
|
|
132
|
+
}
|
|
133
|
+
ac.signal.removeEventListener("abort", onAbort);
|
|
134
|
+
unregisterTurn(ac);
|
|
135
|
+
try {
|
|
136
|
+
options.onFinish?.(reason);
|
|
137
|
+
} catch {
|
|
138
|
+
// Observability must never break lifecycle teardown.
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
const onAbort = () => finish("upstream_abort");
|
|
142
|
+
|
|
143
|
+
const noteProtocolTerminal = (): void => {
|
|
144
|
+
if (finished || terminalTimer !== undefined) return;
|
|
145
|
+
if (terminalLeaseMs === 0) {
|
|
146
|
+
finish("terminal_lease_expired");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
terminalTimer = setTimeout(
|
|
150
|
+
() => finish("terminal_lease_expired"),
|
|
151
|
+
terminalLeaseMs,
|
|
152
|
+
);
|
|
153
|
+
(terminalTimer as { unref?: () => void }).unref?.();
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
registerTurn(ac, lease);
|
|
157
|
+
if (ac.signal.aborted) {
|
|
158
|
+
finish("upstream_abort");
|
|
159
|
+
} else {
|
|
160
|
+
ac.signal.addEventListener("abort", onAbort, { once: true });
|
|
161
|
+
if (ac.signal.aborted) onAbort();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return { finish, noteProtocolTerminal };
|
|
165
|
+
}
|
|
166
|
+
export function isDraining(): boolean { return draining; }
|
|
167
|
+
export function getActiveTurnCount(): number { return turnGate.metrics().active; }
|
|
168
|
+
export function activeRegistryMetrics(): Record<string, AdmissionMetrics> {
|
|
169
|
+
const turns = turnGate.metrics();
|
|
170
|
+
return {
|
|
171
|
+
activeTurns: { ...turns, releaseMisses: turns.releaseMisses + turnReleaseMisses },
|
|
172
|
+
codexWebSockets: codexWebSocketAdmissionMetrics(),
|
|
173
|
+
cursorBackgroundShells: backgroundShellAdmissionMetrics(),
|
|
174
|
+
storageHomeSlots: storageMutationAdmissionMetrics(),
|
|
175
|
+
storageWorkerReservations: storageWorkerAdmissionMetrics(),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function abortAndReleaseAllTurns(reason: unknown = new Error("server shutdown")): void {
|
|
180
|
+
const owners = [...admittedTurns];
|
|
181
|
+
for (const owner of owners) {
|
|
182
|
+
const controllers = [...activeTurns].filter(([, lease]) => lease === owner).map(([controller]) => controller);
|
|
183
|
+
for (const controller of controllers) controller.abort(reason);
|
|
184
|
+
owner.release();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Live listen port of the Bun server, when started. */
|
|
188
|
+
export function getServerListenPort(): number | undefined {
|
|
189
|
+
const port = _serverRef?.port;
|
|
190
|
+
return typeof port === "number" && port > 0 ? port : undefined;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Mark this process as a recycle (dashboard drain-and-restart). Exit cleanup
|
|
194
|
+
* must keep Codex/Grok/system-env injection so the replacement process inherits
|
|
195
|
+
* a working fence — unlike an intentional `ocx stop` teardown.
|
|
196
|
+
*/
|
|
197
|
+
export function markRecyclingForExit(): void { recyclingForExit = true; }
|
|
198
|
+
export function isRecyclingForExit(): boolean { return recyclingForExit; }
|
|
199
|
+
|
|
200
|
+
export function trackStreamLifetime(
|
|
201
|
+
body: ReadableStream<Uint8Array>,
|
|
202
|
+
ac: AbortController,
|
|
203
|
+
onDone?: () => void,
|
|
204
|
+
lease?: AdmissionLease,
|
|
205
|
+
): ReadableStream<Uint8Array> {
|
|
206
|
+
registerTurn(ac, lease);
|
|
207
|
+
const reader = body.getReader();
|
|
208
|
+
let closed = false;
|
|
209
|
+
const finish = () => {
|
|
210
|
+
if (closed) return;
|
|
211
|
+
closed = true;
|
|
212
|
+
unregisterTurn(ac);
|
|
213
|
+
onDone?.();
|
|
214
|
+
};
|
|
215
|
+
return new ReadableStream<Uint8Array>({
|
|
216
|
+
async pull(controller) {
|
|
217
|
+
try {
|
|
218
|
+
const { done, value } = await reader.read();
|
|
219
|
+
if (done) { finish(); controller.close(); return; }
|
|
220
|
+
controller.enqueue(value);
|
|
221
|
+
} catch (err) {
|
|
222
|
+
finish();
|
|
223
|
+
try { controller.error(err); } catch { /* already closed */ }
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
cancel(reason) {
|
|
227
|
+
finish();
|
|
228
|
+
ac.abort(reason);
|
|
229
|
+
reader.cancel(reason).catch(() => {});
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export async function drainAndShutdown(
|
|
235
|
+
server: ReturnType<typeof Bun.serve> | undefined,
|
|
236
|
+
timeoutMs: number,
|
|
237
|
+
): Promise<void> {
|
|
238
|
+
const s = server ?? _serverRef;
|
|
239
|
+
draining = true;
|
|
240
|
+
beginBackgroundShellShutdown();
|
|
241
|
+
try {
|
|
242
|
+
const deadline = Date.now() + timeoutMs;
|
|
243
|
+
while (admittedTurns.size > 0 && Date.now() < deadline) {
|
|
244
|
+
await Bun.sleep(100);
|
|
245
|
+
}
|
|
246
|
+
if (admittedTurns.size > 0) {
|
|
247
|
+
console.warn(`⚠️ Aborting ${admittedTurns.size} in-flight turn(s) after ${timeoutMs}ms deadline`);
|
|
248
|
+
abortAndReleaseAllTurns(new Error("server shutdown"));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const shellDrain = await Promise.allSettled([terminateAllBackgroundShells()]);
|
|
252
|
+
const shellResult = shellDrain[0]!;
|
|
253
|
+
if (shellResult.status === "rejected") {
|
|
254
|
+
console.warn("[cursor] background shell drain failed", { rejected: 1 });
|
|
255
|
+
} else if (shellResult.value.unresolved > 0 || shellResult.value.killFailures > 0) {
|
|
256
|
+
console.warn("[cursor] background shell drain incomplete", shellResult.value);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Debounced replay-state snapshot may still be pending; flush so the last completed turn's
|
|
260
|
+
// previous_response_id chain survives the restart this shutdown is usually part of.
|
|
261
|
+
const responseStateFlush = await Promise.allSettled([flushResponseState()]);
|
|
262
|
+
if (responseStateFlush[0]?.status === "rejected") {
|
|
263
|
+
console.warn("[responses] state flush during shutdown failed");
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Tear down opt-in storage policy timers / worker / live-config sink so they cannot fire after stop.
|
|
267
|
+
// Await worker thread exit: on Windows, a still-exiting Bun Worker under
|
|
268
|
+
// `bun test --isolate` panics the whole process at the next realm reclaim.
|
|
269
|
+
// Abort each job independently so one wedged join cannot skip the other,
|
|
270
|
+
// then drain leftovers; failures must not prevent `server.stop`.
|
|
271
|
+
stopStorageCleanupScheduler();
|
|
272
|
+
stopStateStoreSweeper();
|
|
273
|
+
cancelQueuedStorageWorkerSpawns();
|
|
274
|
+
const shutdownJoins = await Promise.allSettled([
|
|
275
|
+
abortStorageCleanupPolicyJobAsync(),
|
|
276
|
+
abortRestoreTrashJobAsync(),
|
|
277
|
+
]);
|
|
278
|
+
for (const result of shutdownJoins) {
|
|
279
|
+
if (result.status === "rejected") {
|
|
280
|
+
console.warn(
|
|
281
|
+
"[storage] worker abort during shutdown failed:",
|
|
282
|
+
result.reason instanceof Error ? result.reason.message : result.reason,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
await drainStorageWorkers();
|
|
288
|
+
} catch (err) {
|
|
289
|
+
console.warn(
|
|
290
|
+
"[storage] worker drain during shutdown failed:",
|
|
291
|
+
err instanceof Error ? err.message : err,
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
setStorageCleanupPolicyLiveSink(null);
|
|
295
|
+
setStorageCleanupPolicyJobLiveApply(null);
|
|
296
|
+
} finally {
|
|
297
|
+
try {
|
|
298
|
+
// Bun's Server.stop returns Promise<void>; fire-and-forget races the next
|
|
299
|
+
// isolate reclaim / follow-on listen the same way unterminated Workers did.
|
|
300
|
+
if (s) await s.stop(true);
|
|
301
|
+
} finally {
|
|
302
|
+
draining = false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|