@remodex/rmx 1.0.2
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 +91 -0
- package/LICENSE +21 -0
- package/README.md +242 -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 +584 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-CZqebSPQ.css +1 -0
- package/gui/dist/assets/index-CkETtt7P.js +71 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/fonts/google-sans-cyrillic.woff2 +0 -0
- package/gui/dist/fonts/google-sans-latin.woff2 +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 +118 -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 +1205 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +83 -0
- package/src/adapters/client-fingerprint.ts +59 -0
- package/src/adapters/command-code.ts +453 -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 +139 -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/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 +1235 -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 +59 -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 +548 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +604 -0
- package/src/adapters/cursor/protobuf-events.ts +735 -0
- package/src/adapters/cursor/protobuf-request.ts +719 -0
- package/src/adapters/cursor/request-builder.ts +280 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +621 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +57 -0
- package/src/adapters/cursor/types.ts +59 -0
- package/src/adapters/cursor.ts +196 -0
- package/src/adapters/google-antigravity-replay.ts +520 -0
- package/src/adapters/google-antigravity-wire.ts +140 -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 +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +859 -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 +104 -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 +1924 -0
- package/src/adapters/mimo-free.ts +263 -0
- package/src/adapters/openai-chat.ts +1265 -0
- package/src/adapters/openai-responses.ts +1309 -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/android-remote/assets.ts +218 -0
- package/src/android-remote/attachments.ts +168 -0
- package/src/android-remote/auth.ts +237 -0
- package/src/android-remote/cloudflare-provisioning.ts +409 -0
- package/src/android-remote/cloudflare-secret.ts +106 -0
- package/src/android-remote/cloudflare-tunnel.ts +488 -0
- package/src/android-remote/cloudflared.ts +286 -0
- package/src/android-remote/codex-app-server.ts +565 -0
- package/src/android-remote/desktop-history-page.ts +936 -0
- package/src/android-remote/desktop-ipc.ts +3643 -0
- package/src/android-remote/desktop-ownership-store.ts +98 -0
- package/src/android-remote/desktop-project-registration.ts +129 -0
- package/src/android-remote/desktop-session-stream.ts +1110 -0
- package/src/android-remote/desktop-workspace-state.ts +443 -0
- package/src/android-remote/file-change-parser.ts +112 -0
- package/src/android-remote/gateway.ts +9108 -0
- package/src/android-remote/mutation-store.ts +299 -0
- package/src/android-remote/projection.ts +1780 -0
- package/src/android-remote/queued-turn-store.ts +248 -0
- package/src/android-remote/session-command-recovery.ts +1384 -0
- package/src/android-remote/store.ts +466 -0
- package/src/android-remote/thread-reconciliation.ts +133 -0
- package/src/android-remote/thread-source-paths.ts +307 -0
- package/src/android-remote/thread-stream.ts +546 -0
- package/src/android-remote/turn-activity.ts +235 -0
- package/src/android-remote/user-message-identity.ts +94 -0
- package/src/bridge.ts +1793 -0
- package/src/chat/inbound.ts +295 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +267 -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 +601 -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 +519 -0
- package/src/claude/model-info.ts +154 -0
- package/src/claude/outbound.ts +898 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +296 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +476 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +297 -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 +211 -0
- package/src/cli/claude.ts +302 -0
- package/src/cli/codex-shim-autorestore.ts +45 -0
- package/src/cli/codex-shim-readiness.ts +69 -0
- package/src/cli/combo.ts +124 -0
- package/src/cli/config-command.ts +183 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/desktop-first-run.ts +25 -0
- package/src/cli/doctor.ts +1022 -0
- package/src/cli/export-command.ts +201 -0
- package/src/cli/help.ts +370 -0
- package/src/cli/index.ts +1565 -0
- package/src/cli/init.ts +224 -0
- package/src/cli/integrations.ts +225 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/internal-dispatch.ts +35 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/models-runtime.ts +224 -0
- package/src/cli/models.ts +340 -0
- package/src/cli/observe.ts +170 -0
- package/src/cli/opencode.ts +587 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +476 -0
- package/src/cli/ready.ts +301 -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 +321 -0
- package/src/cli/system-command.ts +196 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +205 -0
- package/src/cli/v2.ts +200 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1109 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +34 -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 +517 -0
- package/src/codex/account-usability.ts +40 -0
- package/src/codex/admission.ts +263 -0
- package/src/codex/app-server-processes.ts +799 -0
- package/src/codex/auth-api.ts +2098 -0
- package/src/codex/auth-collision.ts +107 -0
- package/src/codex/auth-context.ts +480 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +471 -0
- package/src/codex/catalog/bundled.ts +533 -0
- package/src/codex/catalog/effort.ts +432 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +287 -0
- package/src/codex/catalog/native-models.ts +7 -0
- package/src/codex/catalog/parsing.ts +503 -0
- package/src/codex/catalog/provider-fetch.ts +2267 -0
- package/src/codex/catalog/sync.ts +1606 -0
- package/src/codex/catalog-admission.ts +197 -0
- package/src/codex/catalog-refresh-status.ts +87 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +15 -0
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +593 -0
- package/src/codex/convergence.ts +580 -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/desktop-client-processes.ts +521 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1091 -0
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +347 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +115 -0
- package/src/codex/history-provider.ts +1075 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +204 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +257 -0
- package/src/codex/inject.ts +1857 -0
- package/src/codex/injected-marker.ts +79 -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 +105 -0
- package/src/codex/journal.ts +172 -0
- package/src/codex/main-account-cache.ts +56 -0
- package/src/codex/main-account.ts +40 -0
- package/src/codex/management-convergence.ts +114 -0
- package/src/codex/model-cache.ts +267 -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 +167 -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 +348 -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 +691 -0
- package/src/codex/paths.ts +78 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +426 -0
- package/src/codex/prompt-journal.ts +311 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/provider-adoption.ts +242 -0
- package/src/codex/quota-rejection.ts +224 -0
- package/src/codex/quota.ts +494 -0
- package/src/codex/refresh.ts +60 -0
- package/src/codex/routing.ts +1855 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +1215 -0
- package/src/codex/subagent-defaults.ts +557 -0
- package/src/codex/subagent-model-fallback.ts +560 -0
- package/src/codex/sync.ts +238 -0
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +374 -0
- package/src/codex/warmup.ts +192 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +140 -0
- package/src/combos/index.ts +44 -0
- package/src/combos/request.ts +64 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +392 -0
- package/src/config.ts +3270 -0
- package/src/generated/model-metadata.ts +144 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +540 -0
- package/src/grok/inspect.ts +45 -0
- package/src/grok/status.ts +127 -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 +922 -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/integrations/config-io.ts +151 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +108 -0
- package/src/integrations/serialize.ts +235 -0
- package/src/integrations/state.ts +290 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer.ts +492 -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 +242 -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 +127 -0
- package/src/lib/config-ownership.ts +438 -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/local-management-attestation.ts +51 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/pinned-http.ts +182 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-environment.ts +470 -0
- package/src/lib/provider-outbound.ts +203 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +510 -0
- package/src/lib/remodex-home.ts +616 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/service-secrets.ts +178 -0
- package/src/lib/shadow-call.ts +54 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +109 -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 +98 -0
- package/src/lib/token-estimate.ts +69 -0
- package/src/lib/translator-budget.ts +366 -0
- package/src/lib/upstream-reachability.ts +91 -0
- package/src/lib/upstream-retry.ts +508 -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 +817 -0
- package/src/lib/windows-user-principal.ts +283 -0
- package/src/lib/winsw.ts +402 -0
- package/src/model-sources.ts +73 -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/command-code.ts +239 -0
- package/src/oauth/cursor.ts +231 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +230 -0
- package/src/oauth/health.ts +443 -0
- package/src/oauth/index.ts +1280 -0
- package/src/oauth/key-providers.ts +128 -0
- package/src/oauth/kimi.ts +213 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -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 +655 -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 +317 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +64 -0
- package/src/providers/codex-capacity.ts +288 -0
- package/src/providers/command-code-efforts.ts +85 -0
- package/src/providers/context-cap.ts +73 -0
- package/src/providers/derive.ts +451 -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 +361 -0
- package/src/providers/openai-sidecar.ts +235 -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 +83 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +179 -0
- package/src/providers/quota.ts +1942 -0
- package/src/providers/reasoning-capabilities.ts +336 -0
- package/src/providers/registry.ts +2375 -0
- package/src/providers/slug-codec.ts +74 -0
- package/src/providers/xai-transport.ts +149 -0
- package/src/reasoning-effort.ts +243 -0
- package/src/responses/compaction.ts +124 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/parser.ts +714 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +106 -0
- package/src/responses/schema.ts +159 -0
- package/src/responses/spill-store.ts +431 -0
- package/src/responses/state.ts +1039 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/router.ts +802 -0
- package/src/routing/analytics.ts +377 -0
- package/src/routing/capability.ts +205 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +444 -0
- package/src/routing/health.ts +401 -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 +424 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +686 -0
- package/src/server/adapter-resolve.ts +83 -0
- package/src/server/auth-cors.ts +606 -0
- package/src/server/chat-completions.ts +379 -0
- package/src/server/claude-messages.ts +980 -0
- package/src/server/effort-policy.ts +251 -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 +485 -0
- package/src/server/index.ts +1633 -0
- package/src/server/lifecycle.ts +482 -0
- package/src/server/live.ts +609 -0
- package/src/server/management/agent-settings-routes.ts +1180 -0
- package/src/server/management/android-remote-routes.ts +390 -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 +244 -0
- package/src/server/management/config-routes.ts +602 -0
- package/src/server/management/context.ts +88 -0
- package/src/server/management/integration-routes.ts +538 -0
- package/src/server/management/logs-usage-routes.ts +516 -0
- package/src/server/management/model-routes.ts +519 -0
- package/src/server/management/model-rows.ts +143 -0
- package/src/server/management/native-integration-routes.ts +781 -0
- package/src/server/management/oauth-account-routes.ts +573 -0
- package/src/server/management/provider-routes.ts +781 -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 +384 -0
- package/src/server/management/shared.ts +277 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +433 -0
- package/src/server/management/system-routes.ts +141 -0
- package/src/server/management/usage-summary-cache.ts +86 -0
- package/src/server/management-api.ts +269 -0
- package/src/server/management-auth.ts +353 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +326 -0
- package/src/server/proxy-stop.ts +92 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1179 -0
- package/src/server/request-decompress.ts +132 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1072 -0
- package/src/server/responses/collaboration.ts +409 -0
- package/src/server/responses/compact.ts +710 -0
- package/src/server/responses/core.ts +3561 -0
- package/src/server/responses/encrypted-payload.ts +308 -0
- package/src/server/responses/fetch-helpers.ts +171 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/policy-fallback.ts +152 -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 +272 -0
- package/src/server/responses-json-events.ts +52 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses.ts +10 -0
- package/src/server/search.ts +181 -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 +308 -0
- package/src/server/startup-health-cache.ts +119 -0
- package/src/server/system-env.ts +418 -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 +470 -0
- package/src/service-manager-probe.ts +824 -0
- package/src/service.ts +3011 -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 +738 -0
- package/src/types.ts +1531 -0
- package/src/update/badge.ts +72 -0
- package/src/update/desktop-release.ts +1620 -0
- package/src/update/index.ts +402 -0
- package/src/update/job.ts +1906 -0
- package/src/update/notify.ts +261 -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/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 +283 -0
- package/src/usage/log.ts +695 -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 +127 -0
- package/src/vision/index.ts +558 -0
- package/src/vision/reasoning.ts +55 -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 +791 -0
- package/src/web-search/parse.ts +235 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/synthetic-tool.ts +47 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
export const TRANSLATOR_MAX_CALL_ARGUMENT_BYTES = 2 * 1024 * 1024;
|
|
2
|
+
export const TRANSLATOR_MAX_TURN_BYTES = 32 * 1024 * 1024;
|
|
3
|
+
export const TRANSLATOR_MAX_SSE_EVENT_BYTES = 32 * 1024 * 1024;
|
|
4
|
+
export const CURSOR_MAX_CONNECT_FRAME_BYTES = 32 * 1024 * 1024;
|
|
5
|
+
export const CURSOR_MAX_EFFECTIVE_CONNECT_PAYLOAD_BYTES = 16 * 1024 * 1024;
|
|
6
|
+
export const CURSOR_TRANSPORT_MAX_BUFFERED_BYTES = 32 * 1024 * 1024;
|
|
7
|
+
export const CURSOR_TRANSPORT_RESUME_BYTES = 16 * 1024 * 1024;
|
|
8
|
+
export const CURSOR_MAX_PENDING_FRAMES = 1024;
|
|
9
|
+
export const CURSOR_PENDING_FRAMES_RESUME = 512;
|
|
10
|
+
export const MAX_PENDING_IMAGE_FULFILLMENTS = 64;
|
|
11
|
+
export const MAX_PENDING_OAUTH_MUTATIONS = 128;
|
|
12
|
+
|
|
13
|
+
export type TranslatorBufferKind =
|
|
14
|
+
| "tool_args"
|
|
15
|
+
| "retained_collectors"
|
|
16
|
+
| "live_transient"
|
|
17
|
+
| "reasoning"
|
|
18
|
+
| "item_ids"
|
|
19
|
+
| "tool_search_sources"
|
|
20
|
+
| "cursor_transport"
|
|
21
|
+
| "cursor_kv"
|
|
22
|
+
| "request_copies";
|
|
23
|
+
|
|
24
|
+
export type ExternallyCappedKind = "passthrough_serialization" | "mcp_payload";
|
|
25
|
+
|
|
26
|
+
export class TranslatorBudgetExceededError extends Error {
|
|
27
|
+
readonly code = "translation_buffer_limit";
|
|
28
|
+
|
|
29
|
+
constructor(readonly kind: TranslatorBufferKind, readonly limitBytes: number) {
|
|
30
|
+
super(`translator ${kind} buffer exceeded ${limitBytes} bytes`);
|
|
31
|
+
this.name = "TranslatorBudgetExceededError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function isTranslatorBudgetExceededError(error: unknown): error is TranslatorBudgetExceededError {
|
|
36
|
+
return error instanceof TranslatorBudgetExceededError
|
|
37
|
+
|| (error instanceof Error && (error as { code?: unknown }).code === "translation_buffer_limit");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface TranslatorBudgetSnapshot {
|
|
41
|
+
currentBytes: number;
|
|
42
|
+
highWaterBytes: number;
|
|
43
|
+
activeCalls: number;
|
|
44
|
+
overflows: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface TranslatorBudgetOptions {
|
|
48
|
+
maxCallArgumentBytes?: number;
|
|
49
|
+
maxTurnBytes?: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface TranslatorTransientReservation {
|
|
53
|
+
commitRetained(): void;
|
|
54
|
+
release(): void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface TranslatorBudget {
|
|
58
|
+
openCall(id: string): void;
|
|
59
|
+
closeCall(id: string): void;
|
|
60
|
+
reserveTransient(
|
|
61
|
+
bytes: number,
|
|
62
|
+
scope: { kind: TranslatorBufferKind; callId?: string },
|
|
63
|
+
): TranslatorTransientReservation;
|
|
64
|
+
chargeRetained(delta: number, scope: { kind: TranslatorBufferKind; callId?: string }): void;
|
|
65
|
+
releaseRetained(bytes: number, scope: { kind: TranslatorBufferKind; callId?: string }): void;
|
|
66
|
+
observeAcceptedRequestCopy(bytes: number): () => void;
|
|
67
|
+
observeExternallyCapped(kind: ExternallyCappedKind, bytes: number): () => void;
|
|
68
|
+
snapshot(): TranslatorBudgetSnapshot;
|
|
69
|
+
dispose(): void;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const retainedEventOwnership = new WeakMap<object, { budget: TranslatorBudget; bytes: number }>();
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Charge a materialized adapter-event batch and attach its lease to the events themselves.
|
|
76
|
+
* A copied event array (for example terminal-guard collection) preserves the event objects, so
|
|
77
|
+
* the response builder can consume each source lease immediately after its replacement lands.
|
|
78
|
+
*/
|
|
79
|
+
export function retainTranslatedEventBatch<T extends object>(events: T[], budget: TranslatorBudget): void {
|
|
80
|
+
if (events.length === 0) return;
|
|
81
|
+
const serialized = events.map(event => JSON.stringify(event));
|
|
82
|
+
const totalBytes = Buffer.byteLength(`[${serialized.join(",")}]`);
|
|
83
|
+
budget.chargeRetained(totalBytes, { kind: "retained_collectors" });
|
|
84
|
+
for (let index = 0; index < events.length; index++) {
|
|
85
|
+
const delimiterBytes = index === events.length - 1 ? 2 : 1;
|
|
86
|
+
retainedEventOwnership.set(events[index]!, {
|
|
87
|
+
budget,
|
|
88
|
+
bytes: Buffer.byteLength(serialized[index]!) + delimiterBytes,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Transfer one charged adapter event to the response builder's newly materialized owner. */
|
|
94
|
+
export function releaseTranslatedEvent(event: object, budget: TranslatorBudget): void {
|
|
95
|
+
const ownership = retainedEventOwnership.get(event);
|
|
96
|
+
if (!ownership || ownership.budget !== budget) return;
|
|
97
|
+
retainedEventOwnership.delete(event);
|
|
98
|
+
budget.releaseRetained(ownership.bytes, { kind: "retained_collectors" });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const liveBudgets = new Set<Budget>();
|
|
102
|
+
let aggregateCurrentBytes = 0;
|
|
103
|
+
let aggregateActiveCalls = 0;
|
|
104
|
+
let aggregateHighWaterBytes = 0;
|
|
105
|
+
let aggregateOverflows = 0;
|
|
106
|
+
|
|
107
|
+
function normalizeBytes(bytes: number): number {
|
|
108
|
+
return Number.isFinite(bytes) && bytes > 0 ? Math.floor(bytes) : 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function observeAggregate(): void {
|
|
112
|
+
aggregateHighWaterBytes = Math.max(aggregateHighWaterBytes, aggregateCurrentBytes);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
class Budget implements TranslatorBudget {
|
|
116
|
+
private readonly calls = new Map<string, { logicalBytes: number; physicalBytes: number }>();
|
|
117
|
+
private readonly charged = new Map<TranslatorBufferKind, number>();
|
|
118
|
+
private hardChargedBytes = 0;
|
|
119
|
+
private observedBytes = 0;
|
|
120
|
+
private currentBytes = 0;
|
|
121
|
+
private highWaterBytes = 0;
|
|
122
|
+
private overflowCount = 0;
|
|
123
|
+
private disposed = false;
|
|
124
|
+
|
|
125
|
+
constructor(
|
|
126
|
+
private readonly maxCallArgumentBytes: number,
|
|
127
|
+
private readonly maxTurnBytes: number,
|
|
128
|
+
) {}
|
|
129
|
+
|
|
130
|
+
private chargedBytes(): number {
|
|
131
|
+
return this.hardChargedBytes;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
observedCurrentBytes(): number {
|
|
135
|
+
return this.currentBytes;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
private changed(): void {
|
|
139
|
+
const nextBytes = this.hardChargedBytes + this.observedBytes;
|
|
140
|
+
aggregateCurrentBytes += nextBytes - this.currentBytes;
|
|
141
|
+
this.currentBytes = nextBytes;
|
|
142
|
+
this.highWaterBytes = Math.max(this.highWaterBytes, nextBytes);
|
|
143
|
+
observeAggregate();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private reject(kind: TranslatorBufferKind, limitBytes: number): never {
|
|
147
|
+
this.overflowCount += 1;
|
|
148
|
+
aggregateOverflows += 1;
|
|
149
|
+
throw new TranslatorBudgetExceededError(kind, limitBytes);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private admit(kind: TranslatorBufferKind, bytes: number): number {
|
|
153
|
+
const admitted = normalizeBytes(bytes);
|
|
154
|
+
if (this.chargedBytes() + admitted > this.maxTurnBytes) this.reject(kind, this.maxTurnBytes);
|
|
155
|
+
return admitted;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
openCall(id: string): void {
|
|
159
|
+
if (!this.calls.has(id)) {
|
|
160
|
+
this.calls.set(id, { logicalBytes: 0, physicalBytes: 0 });
|
|
161
|
+
aggregateActiveCalls += 1;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
closeCall(id: string): void {
|
|
166
|
+
const call = this.calls.get(id);
|
|
167
|
+
if (!call) return;
|
|
168
|
+
this.hardChargedBytes = Math.max(0, this.hardChargedBytes - call.physicalBytes);
|
|
169
|
+
this.calls.delete(id);
|
|
170
|
+
aggregateActiveCalls = Math.max(0, aggregateActiveCalls - 1);
|
|
171
|
+
this.changed();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
reserveTransient(
|
|
175
|
+
bytes: number,
|
|
176
|
+
scope: { kind: TranslatorBufferKind; callId?: string },
|
|
177
|
+
): TranslatorTransientReservation {
|
|
178
|
+
const admitted = normalizeBytes(bytes);
|
|
179
|
+
if (scope.callId && admitted > this.maxCallArgumentBytes) {
|
|
180
|
+
this.reject("tool_args", this.maxCallArgumentBytes);
|
|
181
|
+
}
|
|
182
|
+
this.admit(scope.kind, admitted);
|
|
183
|
+
this.charged.set(scope.kind, (this.charged.get(scope.kind) ?? 0) + admitted);
|
|
184
|
+
this.hardChargedBytes += admitted;
|
|
185
|
+
this.changed();
|
|
186
|
+
let state: "reserved" | "committed" | "released" = "reserved";
|
|
187
|
+
return {
|
|
188
|
+
commitRetained: () => {
|
|
189
|
+
if (state !== "reserved") return;
|
|
190
|
+
state = "committed";
|
|
191
|
+
if (!scope.callId) return;
|
|
192
|
+
const call = this.calls.get(scope.callId) ?? { logicalBytes: 0, physicalBytes: 0 };
|
|
193
|
+
this.charged.set(scope.kind, Math.max(0, (this.charged.get(scope.kind) ?? 0) - admitted));
|
|
194
|
+
call.logicalBytes = admitted;
|
|
195
|
+
call.physicalBytes += admitted;
|
|
196
|
+
this.calls.set(scope.callId, call);
|
|
197
|
+
this.changed();
|
|
198
|
+
},
|
|
199
|
+
release: () => {
|
|
200
|
+
if (state !== "reserved") return;
|
|
201
|
+
state = "released";
|
|
202
|
+
this.charged.set(scope.kind, Math.max(0, (this.charged.get(scope.kind) ?? 0) - admitted));
|
|
203
|
+
this.hardChargedBytes = Math.max(0, this.hardChargedBytes - admitted);
|
|
204
|
+
this.changed();
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
chargeRetained(delta: number, scope: { kind: TranslatorBufferKind; callId?: string }): void {
|
|
210
|
+
const admitted = normalizeBytes(delta);
|
|
211
|
+
if (scope.callId) {
|
|
212
|
+
const call = this.calls.get(scope.callId) ?? { logicalBytes: 0, physicalBytes: 0 };
|
|
213
|
+
if (call.logicalBytes + admitted > this.maxCallArgumentBytes) {
|
|
214
|
+
this.reject("tool_args", this.maxCallArgumentBytes);
|
|
215
|
+
}
|
|
216
|
+
this.admit(scope.kind, admitted);
|
|
217
|
+
call.logicalBytes += admitted;
|
|
218
|
+
call.physicalBytes += admitted;
|
|
219
|
+
this.calls.set(scope.callId, call);
|
|
220
|
+
} else {
|
|
221
|
+
this.admit(scope.kind, admitted);
|
|
222
|
+
this.charged.set(scope.kind, (this.charged.get(scope.kind) ?? 0) + admitted);
|
|
223
|
+
}
|
|
224
|
+
this.hardChargedBytes += admitted;
|
|
225
|
+
this.changed();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
releaseRetained(bytes: number, scope: { kind: TranslatorBufferKind; callId?: string }): void {
|
|
229
|
+
const released = normalizeBytes(bytes);
|
|
230
|
+
if (scope.callId) {
|
|
231
|
+
const call = this.calls.get(scope.callId);
|
|
232
|
+
if (call) {
|
|
233
|
+
const actual = Math.min(released, call.physicalBytes);
|
|
234
|
+
call.physicalBytes -= actual;
|
|
235
|
+
this.hardChargedBytes = Math.max(0, this.hardChargedBytes - actual);
|
|
236
|
+
}
|
|
237
|
+
} else {
|
|
238
|
+
const current = this.charged.get(scope.kind) ?? 0;
|
|
239
|
+
const actual = Math.min(released, current);
|
|
240
|
+
this.charged.set(scope.kind, current - actual);
|
|
241
|
+
this.hardChargedBytes = Math.max(0, this.hardChargedBytes - actual);
|
|
242
|
+
}
|
|
243
|
+
this.changed();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private observe(bytes: number): () => void {
|
|
247
|
+
const observed = normalizeBytes(bytes);
|
|
248
|
+
this.observedBytes += observed;
|
|
249
|
+
this.changed();
|
|
250
|
+
let released = false;
|
|
251
|
+
return () => {
|
|
252
|
+
if (released) return;
|
|
253
|
+
released = true;
|
|
254
|
+
this.observedBytes = Math.max(0, this.observedBytes - observed);
|
|
255
|
+
this.changed();
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
observeAcceptedRequestCopy(bytes: number): () => void {
|
|
260
|
+
return this.observe(bytes);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
observeExternallyCapped(_kind: ExternallyCappedKind, bytes: number): () => void {
|
|
264
|
+
return this.observe(bytes);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
snapshot(): TranslatorBudgetSnapshot {
|
|
268
|
+
return {
|
|
269
|
+
currentBytes: this.observedCurrentBytes(),
|
|
270
|
+
highWaterBytes: this.highWaterBytes,
|
|
271
|
+
activeCalls: this.calls.size,
|
|
272
|
+
overflows: this.overflowCount,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
dispose(): void {
|
|
277
|
+
if (this.disposed) return;
|
|
278
|
+
this.disposed = true;
|
|
279
|
+
aggregateActiveCalls = Math.max(0, aggregateActiveCalls - this.calls.size);
|
|
280
|
+
aggregateCurrentBytes = Math.max(0, aggregateCurrentBytes - this.currentBytes);
|
|
281
|
+
this.calls.clear();
|
|
282
|
+
this.charged.clear();
|
|
283
|
+
this.hardChargedBytes = 0;
|
|
284
|
+
this.observedBytes = 0;
|
|
285
|
+
this.currentBytes = 0;
|
|
286
|
+
liveBudgets.delete(this);
|
|
287
|
+
observeAggregate();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function createTranslatorBudget(options: TranslatorBudgetOptions = {}): TranslatorBudget {
|
|
292
|
+
const budget = new Budget(
|
|
293
|
+
options.maxCallArgumentBytes ?? TRANSLATOR_MAX_CALL_ARGUMENT_BYTES,
|
|
294
|
+
options.maxTurnBytes ?? TRANSLATOR_MAX_TURN_BYTES,
|
|
295
|
+
);
|
|
296
|
+
liveBudgets.add(budget);
|
|
297
|
+
observeAggregate();
|
|
298
|
+
return budget;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export function translatorObservedBufferSnapshot(): {
|
|
302
|
+
currentBytes: number;
|
|
303
|
+
highWaterBytes: number;
|
|
304
|
+
active: number;
|
|
305
|
+
} {
|
|
306
|
+
return {
|
|
307
|
+
currentBytes: aggregateCurrentBytes,
|
|
308
|
+
highWaterBytes: aggregateHighWaterBytes,
|
|
309
|
+
active: aggregateActiveCalls,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/** Internal diagnostics used by focused tests; never registered with app-owned memory. */
|
|
314
|
+
export function translatorObservedOverflowCount(): number {
|
|
315
|
+
return aggregateOverflows;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/** Test-only: proves owned default budgets are disposed on every stream-death path. */
|
|
319
|
+
export function translatorLiveBudgetCountForTests(): number {
|
|
320
|
+
return liveBudgets.size;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/** Test-only: proves no charge survives against a disposed budget (cancel race). */
|
|
324
|
+
export function translatorAggregateCurrentBytesForTests(): number {
|
|
325
|
+
return aggregateCurrentBytes;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** Clears process-wide translator diagnostics and disposes leaked test budgets. */
|
|
329
|
+
export function resetTranslatorAggregateForTests(): void {
|
|
330
|
+
for (const budget of liveBudgets) budget.dispose();
|
|
331
|
+
aggregateCurrentBytes = 0;
|
|
332
|
+
aggregateActiveCalls = 0;
|
|
333
|
+
aggregateHighWaterBytes = 0;
|
|
334
|
+
aggregateOverflows = 0;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export function finalizeTranslatorBudgetResponse(response: Response, budget: TranslatorBudget): Response {
|
|
338
|
+
if (!response.body) {
|
|
339
|
+
budget.dispose();
|
|
340
|
+
return response;
|
|
341
|
+
}
|
|
342
|
+
const reader = response.body.getReader();
|
|
343
|
+
let finalized = false;
|
|
344
|
+
const finalize = () => {
|
|
345
|
+
if (finalized) return;
|
|
346
|
+
finalized = true;
|
|
347
|
+
budget.dispose();
|
|
348
|
+
};
|
|
349
|
+
return new Response(new ReadableStream<Uint8Array>({
|
|
350
|
+
async pull(controller) {
|
|
351
|
+
try {
|
|
352
|
+
const result = await reader.read();
|
|
353
|
+
if (result.done) {
|
|
354
|
+
finalize();
|
|
355
|
+
controller.close();
|
|
356
|
+
} else controller.enqueue(result.value);
|
|
357
|
+
} catch (error) {
|
|
358
|
+
finalize();
|
|
359
|
+
controller.error(error);
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
async cancel(reason) {
|
|
363
|
+
try { await reader.cancel(reason); } finally { finalize(); }
|
|
364
|
+
},
|
|
365
|
+
}), { status: response.status, statusText: response.statusText, headers: response.headers });
|
|
366
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification of upstream fetch rejections that occur before any request
|
|
3
|
+
* bytes can reach the origin: DNS resolution failure and TCP connect refusal.
|
|
4
|
+
*
|
|
5
|
+
* Issue #914: these failures are machine/network-wide, not account-specific —
|
|
6
|
+
* every Codex pool account shares the provider host, so rotating accounts
|
|
7
|
+
* cannot repair them. The transport layer previously mapped every non-timeout
|
|
8
|
+
* rejection to `connect_error`, and at `upstreamFailoverThreshold` that streak
|
|
9
|
+
* soft-avoided a healthy account and cleared thread affinity.
|
|
10
|
+
*
|
|
11
|
+
* Bun collapses DNS failure and TCP refusal into one label class
|
|
12
|
+
* (`ConnectionRefused` / `FailedToOpenSocket`, errno 0); Node's undici emits
|
|
13
|
+
* the classic `ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `ENETUNREACH` /
|
|
14
|
+
* `ENETDOWN` / `EHOSTUNREACH` shapes. Both shapes are matched here, on `code`
|
|
15
|
+
* values only, through a bounded cause chain. Message substrings are never
|
|
16
|
+
* trusted (a message-only match is a negative case), and labels that can also
|
|
17
|
+
* appear after the origin saw the credential — `ECONNRESET`, `EPIPE`, TLS
|
|
18
|
+
* errors, unknown shapes — deliberately stay outside the set.
|
|
19
|
+
*
|
|
20
|
+
* Classifier semantics extracted from PR #966 (Yuxin-Qiao) with attribution;
|
|
21
|
+
* sidecar blast radius intentionally not inherited.
|
|
22
|
+
*
|
|
23
|
+
* MUST stay a leaf module: imports nothing from server.ts or adapters.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { UpstreamRetryEvidenceError } from "./upstream-retry";
|
|
27
|
+
|
|
28
|
+
export const PRE_CONNECT_REACHABILITY_CODES = new Set([
|
|
29
|
+
// Bun: DNS failure and TCP refusal share this class.
|
|
30
|
+
"ConnectionRefused",
|
|
31
|
+
"FailedToOpenSocket",
|
|
32
|
+
// Node undici / classic Node shapes.
|
|
33
|
+
"ECONNREFUSED",
|
|
34
|
+
"ENOTFOUND",
|
|
35
|
+
"EAI_AGAIN",
|
|
36
|
+
"ENETUNREACH",
|
|
37
|
+
"ENETDOWN",
|
|
38
|
+
"EHOSTUNREACH",
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
/** Upper bound on how far `cause` chains are inspected. */
|
|
42
|
+
export const MAX_REACHABILITY_CAUSE_DEPTH = 3;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* True when the rejection (or a bounded `cause` of it) carries a proven
|
|
46
|
+
* pre-connection reachability code. Never matches message text.
|
|
47
|
+
*/
|
|
48
|
+
export function isPreConnectReachabilityError(err: unknown): boolean {
|
|
49
|
+
let current: unknown = err;
|
|
50
|
+
const seen = new Set<unknown>();
|
|
51
|
+
for (let depth = 0; depth < MAX_REACHABILITY_CAUSE_DEPTH; depth++) {
|
|
52
|
+
if (!(current instanceof Error) || seen.has(current)) return false;
|
|
53
|
+
seen.add(current);
|
|
54
|
+
const code = (current as { code?: unknown }).code;
|
|
55
|
+
if (typeof code === "string" && PRE_CONNECT_REACHABILITY_CODES.has(code)) return true;
|
|
56
|
+
current = current.cause;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type TransportFailureKind = "timeout" | "connect_neutral" | "connect_error";
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Shared transport rejection classification for Codex pool upstream sends.
|
|
65
|
+
* Timeouts keep their existing identity (account-transient); proven pre-connect
|
|
66
|
+
* reachability failures become account-neutral; everything else (ECONNRESET,
|
|
67
|
+
* EPIPE, TLS, unknown shapes) keeps the existing `connect_error`
|
|
68
|
+
* account-attributed behavior.
|
|
69
|
+
*/
|
|
70
|
+
export function classifyTransportFailureKind(err: unknown): TransportFailureKind {
|
|
71
|
+
const evidence = err instanceof UpstreamRetryEvidenceError ? err : undefined;
|
|
72
|
+
const rejection = evidence ? evidence.cause : err;
|
|
73
|
+
if (rejection instanceof Error && rejection.name === "TimeoutError") return "timeout";
|
|
74
|
+
if (isPreConnectReachabilityError(rejection)) {
|
|
75
|
+
// A transient upstream response (5xx) or a credential-visible connection
|
|
76
|
+
// reset before the rejection proves the host and credential path were
|
|
77
|
+
// reached: the failure is account-attributable, never the pre-connection
|
|
78
|
+
// neutral class (issue #914 review).
|
|
79
|
+
if (evidence && (evidence.transientStatuses.length > 0 || evidence.resetSeen)) return "connect_error";
|
|
80
|
+
return "connect_neutral";
|
|
81
|
+
}
|
|
82
|
+
return "connect_error";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Stable `code` carried by a transport rejection, when there is one. */
|
|
86
|
+
export function transportErrorCode(err: unknown): string | undefined {
|
|
87
|
+
const rejection = err instanceof UpstreamRetryEvidenceError ? err.cause : err;
|
|
88
|
+
if (!(rejection instanceof Error)) return undefined;
|
|
89
|
+
const code = (rejection as { code?: unknown }).code;
|
|
90
|
+
return typeof code === "string" && code !== "" ? code : undefined;
|
|
91
|
+
}
|