@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,432 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync } from "node:fs";
|
|
4
|
+
import { delimiter, dirname, join, resolve } from "node:path";
|
|
5
|
+
import { atomicWriteFile, expandUserPath, getConfigDir, websocketsEnabled } from "../../config";
|
|
6
|
+
import { CODEX_CONFIG_PATH, CODEX_MODELS_CACHE_PATH, DEFAULT_CATALOG_PATH, readRootTomlString, resolveCodexConfigPath } from "../paths";
|
|
7
|
+
import { clearModelCache, DEFAULT_MODEL_CACHE_TTL_MS, getFreshCached, getStaleCached, isModelsFetchCoolingDown, markModelsFetchFailure, setCached } from "../model-cache";
|
|
8
|
+
import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
|
|
9
|
+
import type { OcxConfig, OcxProviderConfig } from "../../types";
|
|
10
|
+
import { modelInList } from "../../types";
|
|
11
|
+
import { CODEX_REASONING_LEVELS, CODEX_REASONING_PRESETS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
|
|
12
|
+
import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
|
|
13
|
+
import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
|
|
14
|
+
import { getProviderRegistryEntry } from "../../providers/registry";
|
|
15
|
+
import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
|
|
16
|
+
import { routedSlug, slugEquals, slugsEquivalent } from "../../providers/slug-codec";
|
|
17
|
+
import { CODEX_GPT5_IDENTITY_LINE } from "../../adapters/identity";
|
|
18
|
+
import { filterCursorConfiguredModelsByLiveDiscovery } from "../../adapters/cursor/discovery";
|
|
19
|
+
import { fetchCursorUsableModels } from "../../adapters/cursor/live-models";
|
|
20
|
+
import { isCanonicalOpenAiForwardProvider, OPENAI_API_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers";
|
|
21
|
+
import {
|
|
22
|
+
COMBO_NAMESPACE,
|
|
23
|
+
comboModelId,
|
|
24
|
+
getCombo,
|
|
25
|
+
listComboIds,
|
|
26
|
+
targetKey,
|
|
27
|
+
} from "../../combos";
|
|
28
|
+
import type { NormalizedComboConfig } from "../../combos/types";
|
|
29
|
+
import { providerDestinationResolvedError } from "../../lib/destination-policy";
|
|
30
|
+
import { redactSecretString, redactUserPath } from "../../lib/redact";
|
|
31
|
+
import upstreamModelsSnapshot from "../data/upstream-models.json";
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
import { readCatalog, readCodexCatalogPath } from "./parsing";
|
|
35
|
+
import type { CatalogModel, RawEntry } from "./parsing";
|
|
36
|
+
import { UPSTREAM_NATIVE_ENTRIES } from "./metadata";
|
|
37
|
+
import { loadBundledCodexCatalog } from "./bundled";
|
|
38
|
+
import type { BundledCatalogDeps, ReadonlyRawCatalog } from "./bundled";
|
|
39
|
+
import { deriveEntry } from "./sync";
|
|
40
|
+
import {
|
|
41
|
+
formatClampLogLines,
|
|
42
|
+
formatRuntimeLogLine,
|
|
43
|
+
displayCodexRuntimePath,
|
|
44
|
+
persistEffortClamp,
|
|
45
|
+
resolveAndPersistCodexRuntime,
|
|
46
|
+
type EffortClampDiagnostic,
|
|
47
|
+
} from "../runtime";
|
|
48
|
+
|
|
49
|
+
export function nativeEffortClamp(slug: string, effort: string | undefined): string | null {
|
|
50
|
+
if (!effort || (effort !== "max" && effort !== "ultra")) return null;
|
|
51
|
+
if (slug.includes("/")) return null; // routed models map efforts in their adapters
|
|
52
|
+
const entry = UPSTREAM_NATIVE_ENTRIES.get(slug);
|
|
53
|
+
const levels = Array.isArray(entry?.supported_reasoning_levels)
|
|
54
|
+
? entry.supported_reasoning_levels as Array<{ effort?: string }>
|
|
55
|
+
: [];
|
|
56
|
+
if (levels.length === 0) {
|
|
57
|
+
// Not snapshot-covered. gpt-5.6 natives have a REAL max rung (ensureGpt56ReasoningLevels
|
|
58
|
+
// restores it even off-snapshot) -> never clamp. Every other bare native (gpt-5.5/5.4/
|
|
59
|
+
// 5.4-mini/5.3-codex-spark and future old-ladder slugs) really stops at xhigh — the
|
|
60
|
+
// ChatGPT backend error names exactly none..xhigh — so clamp the synthetic top tier.
|
|
61
|
+
return isGpt56NativeSlug(slug) ? null : "xhigh";
|
|
62
|
+
}
|
|
63
|
+
const supported = levels.flatMap(l => typeof l.effort === "string" ? [l.effort] : []);
|
|
64
|
+
if (supported.includes(effort)) return null;
|
|
65
|
+
const rank = ["minimal", "low", "medium", "high", "xhigh", "max"];
|
|
66
|
+
const highest = supported
|
|
67
|
+
.filter(e => rank.includes(e))
|
|
68
|
+
.sort((a, b) => rank.indexOf(a) - rank.indexOf(b))
|
|
69
|
+
.at(-1);
|
|
70
|
+
return highest ?? null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function shouldApplyNativeEffortClamp(
|
|
74
|
+
providerName: string,
|
|
75
|
+
provider: OcxProviderConfig,
|
|
76
|
+
requestedModelId: string,
|
|
77
|
+
): boolean {
|
|
78
|
+
return !requestedModelId.includes("/")
|
|
79
|
+
&& providerName === OPENAI_CODEX_PROVIDER_ID
|
|
80
|
+
&& isCanonicalOpenAiForwardProvider(provider);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function catalogModelEfforts(slugs: readonly string[]): Map<string, string[]> {
|
|
84
|
+
const out = new Map<string, string[]>();
|
|
85
|
+
if (slugs.length === 0) return out;
|
|
86
|
+
const catalog = readCatalog(readCodexCatalogPath());
|
|
87
|
+
if (!catalog) return out;
|
|
88
|
+
for (const entry of catalog.models ?? []) {
|
|
89
|
+
if (typeof entry.slug !== "string") continue;
|
|
90
|
+
// Tolerate raw legacy config slugs (`provider/vendor/model`) against the
|
|
91
|
+
// Codex-facing encoded catalog slug (`provider/vendor-model`).
|
|
92
|
+
const callerSlug = slugs.find(s => slugsEquivalent(s, entry.slug as string));
|
|
93
|
+
if (callerSlug === undefined) continue;
|
|
94
|
+
const levels = Array.isArray(entry.supported_reasoning_levels)
|
|
95
|
+
? entry.supported_reasoning_levels as Array<{ effort?: string }>
|
|
96
|
+
: [];
|
|
97
|
+
const efforts = levels.flatMap(l => typeof l.effort === "string" ? [l.effort] : []);
|
|
98
|
+
if (efforts.length > 0) out.set(callerSlug, efforts);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function catalogEntryEfforts(entry: RawEntry): string[] {
|
|
104
|
+
const levels = Array.isArray(entry.supported_reasoning_levels)
|
|
105
|
+
? entry.supported_reasoning_levels as Array<{ effort?: string }>
|
|
106
|
+
: [];
|
|
107
|
+
return levels.flatMap(level => typeof level.effort === "string" ? [level.effort] : []);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const ROUTED_REASONING_LEVELS = [...CODEX_REASONING_LEVELS];
|
|
111
|
+
|
|
112
|
+
export function applyCatalogModelMetadata(entry: RawEntry, model?: CatalogModel): void {
|
|
113
|
+
if (!model) return;
|
|
114
|
+
// This marker survives strict catalog normalization and lets sync distinguish a stale
|
|
115
|
+
// bare combo alias from a genuine native model row.
|
|
116
|
+
if (model.provider === COMBO_NAMESPACE) entry.owned_by = model.owned_by ?? COMBO_NAMESPACE;
|
|
117
|
+
// displayName is DISPLAY-ONLY: it relabels the picker row but never touches the routing
|
|
118
|
+
// slug, alias, or provider. deriveEntry already stamped the slug as display_name; a
|
|
119
|
+
// configured displayName overrides just the label. Custom-model inputs reject `/`; combos
|
|
120
|
+
// validate their bounded display label independently. Natives never reach here (no CatalogModel),
|
|
121
|
+
// so genuine upstream marketing names are preserved untouched.
|
|
122
|
+
const displayName = typeof model.displayName === "string" ? model.displayName.trim() : "";
|
|
123
|
+
if (displayName) entry.display_name = displayName;
|
|
124
|
+
if (typeof model.contextWindow === "number" && model.contextWindow > 0) {
|
|
125
|
+
entry.context_window = model.contextWindow;
|
|
126
|
+
entry.max_context_window = model.contextWindow;
|
|
127
|
+
entry.auto_compact_token_limit = Math.min(
|
|
128
|
+
Math.floor(model.contextWindow * 0.9),
|
|
129
|
+
model.maxInputTokens ?? Number.POSITIVE_INFINITY,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
if (Array.isArray(model.inputModalities) && model.inputModalities.length > 0) {
|
|
133
|
+
entry.input_modalities = model.inputModalities;
|
|
134
|
+
}
|
|
135
|
+
if (typeof model.supportsVerbosity === "boolean") {
|
|
136
|
+
entry.support_verbosity = model.supportsVerbosity;
|
|
137
|
+
}
|
|
138
|
+
if (typeof model.supportsReasoningSummaries === "boolean") {
|
|
139
|
+
entry.supports_reasoning_summaries = model.supportsReasoningSummaries;
|
|
140
|
+
}
|
|
141
|
+
// `normalizeRoutedCatalogEntry` deliberately removes native service-tier
|
|
142
|
+
// fields inherited from the GPT template. Re-add only the tiers explicitly
|
|
143
|
+
// declared by this provider/model, including explicit empty arrays so a
|
|
144
|
+
// model such as gpt-5.4-mini cannot accidentally inherit Fast metadata.
|
|
145
|
+
if (model.serviceTiers !== undefined) {
|
|
146
|
+
entry.service_tiers = model.serviceTiers.map((tier) => ({
|
|
147
|
+
id: tier.id,
|
|
148
|
+
name: tier.name,
|
|
149
|
+
...(tier.description ? { description: tier.description } : {}),
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
if (model.additionalSpeedTiers !== undefined) {
|
|
153
|
+
entry.additional_speed_tiers = [...model.additionalSpeedTiers];
|
|
154
|
+
}
|
|
155
|
+
if (model.defaultServiceTier !== undefined) {
|
|
156
|
+
entry.default_service_tier = model.defaultServiceTier;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function applyReasoningLevels(
|
|
161
|
+
entry: RawEntry,
|
|
162
|
+
effortsOverride?: string[],
|
|
163
|
+
defaultOverride?: string,
|
|
164
|
+
preserveExact = false,
|
|
165
|
+
): void {
|
|
166
|
+
let efforts = sanitizeCodexReasoningEfforts(effortsOverride) ?? ROUTED_REASONING_LEVELS.map(l => l.effort);
|
|
167
|
+
const exactEfforts = preserveExact || efforts.some(effort => effort === "none" || effort === "minimal");
|
|
168
|
+
// Legacy/native compatibility paths may add mock top tiers so older subagent surfaces can
|
|
169
|
+
// validate a `max` override; provider-routed callers pass preserveExact=true and never take
|
|
170
|
+
// this branch. The routed wire remains honest through adapter-owned effort clamping, while
|
|
171
|
+
// native requests use nativeEffortClamp (max -> the model's real top rung).
|
|
172
|
+
if (!exactEfforts && efforts.length > 0) {
|
|
173
|
+
const additions: string[] = [];
|
|
174
|
+
if (!efforts.includes("max")) additions.push("max");
|
|
175
|
+
if (!efforts.includes("ultra")) additions.push("ultra");
|
|
176
|
+
if (additions.length > 0) efforts = sanitizeCodexReasoningEfforts([...efforts, ...additions]) ?? efforts;
|
|
177
|
+
}
|
|
178
|
+
const byEffort = new Map(
|
|
179
|
+
(Array.isArray(entry.supported_reasoning_levels) ? entry.supported_reasoning_levels : [])
|
|
180
|
+
.map((l: { effort?: string }) => [l.effort, l]),
|
|
181
|
+
);
|
|
182
|
+
entry.supported_reasoning_levels = efforts.map(effort => {
|
|
183
|
+
const native = byEffort.get(effort);
|
|
184
|
+
if (native) return native;
|
|
185
|
+
// Description lookup uses the FULL ladder so an opt-in effort outside the routed default
|
|
186
|
+
// (e.g. "ultra") still renders its canonical description.
|
|
187
|
+
return CODEX_REASONING_PRESETS.find(l => l.effort === effort) ?? { effort, description: `${effort} reasoning` };
|
|
188
|
+
});
|
|
189
|
+
if (efforts.length === 0) {
|
|
190
|
+
delete entry.default_reasoning_level;
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
entry.default_reasoning_level = defaultOverride && efforts.includes(defaultOverride)
|
|
194
|
+
? defaultOverride
|
|
195
|
+
: efforts.includes("medium") ? "medium" : efforts.includes("high") ? "high" : efforts[0];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function isGpt56NativeSlug(slug: string): boolean {
|
|
199
|
+
return !slug.includes("/") && slug.startsWith("gpt-5.6-");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function ensureGpt56ReasoningLevels(entry: RawEntry): void {
|
|
203
|
+
const levels = Array.isArray(entry.supported_reasoning_levels)
|
|
204
|
+
? entry.supported_reasoning_levels as Array<{ effort?: string }>
|
|
205
|
+
: [];
|
|
206
|
+
const out = [...levels];
|
|
207
|
+
// max is a real native rung on the 5.6 family — always restored; ultra always advertised.
|
|
208
|
+
for (const effort of ["max", "ultra"]) {
|
|
209
|
+
if (out.some(level => level.effort === effort)) continue;
|
|
210
|
+
out.push(CODEX_REASONING_LEVELS.find(level => level.effort === effort)
|
|
211
|
+
?? { effort, description: `${effort} reasoning` });
|
|
212
|
+
}
|
|
213
|
+
entry.supported_reasoning_levels = out;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export function ensureUltraReasoningLevel(entry: RawEntry): void {
|
|
217
|
+
const levels = Array.isArray(entry.supported_reasoning_levels)
|
|
218
|
+
? entry.supported_reasoning_levels as Array<{ effort?: string }>
|
|
219
|
+
: [];
|
|
220
|
+
if (levels.length === 0) return;
|
|
221
|
+
const wanted = ["max", "ultra"];
|
|
222
|
+
for (const effort of wanted) {
|
|
223
|
+
if (levels.some(level => level.effort === effort)) continue;
|
|
224
|
+
levels.push(
|
|
225
|
+
CODEX_REASONING_LEVELS.find(level => level.effort === effort)
|
|
226
|
+
?? { effort, description: `${effort} reasoning` },
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
entry.supported_reasoning_levels = levels;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Derive the installed Codex effort vocabulary from caller-observed bundled catalog bytes. */
|
|
233
|
+
export function supportedCodexReasoningEffortsFromObservedCatalog(
|
|
234
|
+
catalog: ReadonlyRawCatalog | null,
|
|
235
|
+
): ReadonlySet<string> | null {
|
|
236
|
+
if (!catalog) return null;
|
|
237
|
+
const efforts = new Set<string>();
|
|
238
|
+
for (const model of catalog.models ?? []) {
|
|
239
|
+
if (typeof model.slug !== "string" || model.slug.includes("/")) continue;
|
|
240
|
+
const levels = Array.isArray(model.supported_reasoning_levels) ? model.supported_reasoning_levels : [];
|
|
241
|
+
for (const level of levels) {
|
|
242
|
+
const effort = (level as { effort?: unknown })?.effort;
|
|
243
|
+
if (typeof effort === "string") efforts.add(effort);
|
|
244
|
+
}
|
|
245
|
+
if (typeof model.default_reasoning_level === "string") efforts.add(model.default_reasoning_level);
|
|
246
|
+
}
|
|
247
|
+
return efforts.size > 0 ? efforts : null;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export function codexSupportedReasoningEfforts(deps: BundledCatalogDeps = {}): ReadonlySet<string> | null {
|
|
251
|
+
return supportedCodexReasoningEffortsFromObservedCatalog(loadBundledCodexCatalog(deps));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export function clampedDefaultEffort(original: string, surviving: readonly string[]): string {
|
|
255
|
+
if (surviving.length === 0) return "medium";
|
|
256
|
+
const ranked = [...surviving]
|
|
257
|
+
.map(effort => ({ effort, rank: codexEffortRank(effort) }))
|
|
258
|
+
.sort((a, b) => a.rank - b.rank);
|
|
259
|
+
const originalRank = codexEffortRank(original);
|
|
260
|
+
const atOrBelow = ranked.filter(item => item.rank >= 0 && item.rank <= originalRank);
|
|
261
|
+
return (atOrBelow.at(-1) ?? ranked[0]!).effort;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function clampEntryToCodexSupportedEfforts(
|
|
265
|
+
entry: RawEntry,
|
|
266
|
+
supported: ReadonlySet<string> | null,
|
|
267
|
+
): void {
|
|
268
|
+
if (!supported) return;
|
|
269
|
+
const levels = Array.isArray(entry.supported_reasoning_levels)
|
|
270
|
+
? entry.supported_reasoning_levels as Array<{ effort?: string }>
|
|
271
|
+
: null;
|
|
272
|
+
if (levels && levels.length > 0) {
|
|
273
|
+
const kept = levels.filter(level => typeof level?.effort === "string" && supported.has(level.effort));
|
|
274
|
+
entry.supported_reasoning_levels = kept.length > 0
|
|
275
|
+
? kept
|
|
276
|
+
: CODEX_REASONING_LEVELS
|
|
277
|
+
.filter(level => level.effort === "low" || level.effort === "medium" || level.effort === "high")
|
|
278
|
+
.map(level => ({ ...level }));
|
|
279
|
+
}
|
|
280
|
+
const currentDefault = entry.default_reasoning_level;
|
|
281
|
+
if (typeof currentDefault === "string" && !supported.has(currentDefault)) {
|
|
282
|
+
const surviving = (Array.isArray(entry.supported_reasoning_levels) ? entry.supported_reasoning_levels : [])
|
|
283
|
+
.flatMap(level => typeof (level as { effort?: string })?.effort === "string"
|
|
284
|
+
? [(level as { effort: string }).effort]
|
|
285
|
+
: []);
|
|
286
|
+
entry.default_reasoning_level = clampedDefaultEffort(currentDefault, surviving);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export interface ObservedCatalogEffortClamp {
|
|
291
|
+
readonly removedEfforts: readonly string[];
|
|
292
|
+
readonly affectedModels: readonly string[];
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export interface CatalogEffortClampOptions {
|
|
296
|
+
/**
|
|
297
|
+
* Keep provider-routed rows byte-for-byte capability accurate.
|
|
298
|
+
*
|
|
299
|
+
* The bundled Codex catalog is an observation of native OpenAI models, not a declaration of
|
|
300
|
+
* the parser's complete effort vocabulary. In particular, a native row may omit `none` or
|
|
301
|
+
* `minimal` even though the Codex protocol accepts both (and accepts future custom values).
|
|
302
|
+
* Routed rows therefore must not be clamped against that native-only observation. Native and
|
|
303
|
+
* account-bound rows still use the observed clamp for compatibility with older clients.
|
|
304
|
+
*/
|
|
305
|
+
readonly preserveRoutedCapabilities?: boolean;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Return true for a provider-owned routed catalog row, excluding generated native account rows
|
|
310
|
+
* and combo aliases. The latter are governed by native/combo capability rules and are not
|
|
311
|
+
* ordinary provider rows even when their public slug contains a slash.
|
|
312
|
+
*/
|
|
313
|
+
function isProviderRoutedCatalogEntry(entry: RawEntry): boolean {
|
|
314
|
+
const slug = typeof entry.slug === "string" ? entry.slug : "";
|
|
315
|
+
if (!slug.includes("/")) return false;
|
|
316
|
+
if (slug.startsWith(`${COMBO_NAMESPACE}/`)) return false;
|
|
317
|
+
if (entry.opencodex_catalog_kind === "account-selector-v1") return false;
|
|
318
|
+
if (entry.opencodex_catalog_kind === "combo-native-alias-v1") return false;
|
|
319
|
+
if (entry.owned_by === "combo") return false;
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/** Apply an already-observed runtime ladder without probing, logging, or writing diagnostics. */
|
|
324
|
+
export function clampCatalogModelsToObservedCodexSupport(
|
|
325
|
+
models: RawEntry[],
|
|
326
|
+
supported: ReadonlySet<string> | null,
|
|
327
|
+
options: CatalogEffortClampOptions = {},
|
|
328
|
+
): ObservedCatalogEffortClamp {
|
|
329
|
+
if (!supported) return { removedEfforts: [], affectedModels: [] };
|
|
330
|
+
|
|
331
|
+
const removed = new Set<string>();
|
|
332
|
+
const affected: string[] = [];
|
|
333
|
+
for (const entry of models) {
|
|
334
|
+
if (options.preserveRoutedCapabilities && isProviderRoutedCatalogEntry(entry)) continue;
|
|
335
|
+
const before = new Set(
|
|
336
|
+
(Array.isArray(entry.supported_reasoning_levels) ? entry.supported_reasoning_levels : [])
|
|
337
|
+
.flatMap(level => typeof (level as { effort?: string })?.effort === "string"
|
|
338
|
+
? [(level as { effort: string }).effort]
|
|
339
|
+
: []),
|
|
340
|
+
);
|
|
341
|
+
const beforeDefault = typeof entry.default_reasoning_level === "string"
|
|
342
|
+
? entry.default_reasoning_level
|
|
343
|
+
: null;
|
|
344
|
+
clampEntryToCodexSupportedEfforts(entry, supported);
|
|
345
|
+
const after = new Set(
|
|
346
|
+
(Array.isArray(entry.supported_reasoning_levels) ? entry.supported_reasoning_levels : [])
|
|
347
|
+
.flatMap(level => typeof (level as { effort?: string })?.effort === "string"
|
|
348
|
+
? [(level as { effort: string }).effort]
|
|
349
|
+
: []),
|
|
350
|
+
);
|
|
351
|
+
const afterDefault = typeof entry.default_reasoning_level === "string"
|
|
352
|
+
? entry.default_reasoning_level
|
|
353
|
+
: null;
|
|
354
|
+
const lost = [...before].filter(effort => !after.has(effort));
|
|
355
|
+
const defaultClamped = Boolean(beforeDefault && beforeDefault !== afterDefault);
|
|
356
|
+
if (lost.length > 0 || defaultClamped) {
|
|
357
|
+
for (const effort of lost) removed.add(effort);
|
|
358
|
+
if (defaultClamped && beforeDefault) removed.add(beforeDefault);
|
|
359
|
+
if (typeof entry.slug === "string") affected.push(entry.slug);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return {
|
|
364
|
+
removedEfforts: [...removed].sort(),
|
|
365
|
+
affectedModels: affected,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export function clampCatalogModelsToCodexSupport(
|
|
370
|
+
models: RawEntry[],
|
|
371
|
+
deps: BundledCatalogDeps = {},
|
|
372
|
+
options: CatalogEffortClampOptions = {},
|
|
373
|
+
): RawEntry[] {
|
|
374
|
+
const supported = codexSupportedReasoningEfforts(deps);
|
|
375
|
+
if (!supported) {
|
|
376
|
+
if (!deps.commandCandidates) persistEffortClamp(null, { configDir: deps.configDir });
|
|
377
|
+
return models;
|
|
378
|
+
}
|
|
379
|
+
const clamp = clampCatalogModelsToObservedCodexSupport(models, supported, options);
|
|
380
|
+
|
|
381
|
+
let runtimePath = "codex";
|
|
382
|
+
let runtimeVersion: string | null = null;
|
|
383
|
+
if (!deps.commandCandidates) {
|
|
384
|
+
try {
|
|
385
|
+
const resolved = resolveAndPersistCodexRuntime({
|
|
386
|
+
execFileSync: deps.execFileSync,
|
|
387
|
+
configDir: deps.configDir,
|
|
388
|
+
env: deps.env,
|
|
389
|
+
platform: deps.platform,
|
|
390
|
+
existsSync: deps.existsSync,
|
|
391
|
+
readFileSync: deps.readFileSync,
|
|
392
|
+
now: deps.now,
|
|
393
|
+
discoverAlternatives: deps.discoverAlternatives,
|
|
394
|
+
});
|
|
395
|
+
runtimePath = resolved.runtime.command;
|
|
396
|
+
runtimeVersion = resolved.runtime.version;
|
|
397
|
+
process.stderr.write(`${formatRuntimeLogLine(resolved.runtime)}\n`);
|
|
398
|
+
if (resolved.persistError) {
|
|
399
|
+
console.warn(`[Remodex] Codex runtime selection could not be persisted; a later sync may pick a different binary.`);
|
|
400
|
+
}
|
|
401
|
+
if (
|
|
402
|
+
resolved.replacedConfigured
|
|
403
|
+
&& resolved.replacedConfigured.from.command !== resolved.runtime.command
|
|
404
|
+
) {
|
|
405
|
+
console.warn(`[Remodex] Preferred Codex runtime is unavailable.`);
|
|
406
|
+
console.warn(
|
|
407
|
+
`[Remodex] Falling back from ${displayCodexRuntimePath(resolved.replacedConfigured.from.command)} to ${displayCodexRuntimePath(runtimePath)}.`,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
} catch (error) {
|
|
411
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
412
|
+
const redacted = redactUserPath(redactSecretString(message)).slice(0, 200);
|
|
413
|
+
console.warn(`[Remodex] Codex runtime resolve failed during catalog clamp: ${redacted}`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (clamp.removedEfforts.length > 0) {
|
|
418
|
+
const diagnostic: EffortClampDiagnostic = {
|
|
419
|
+
runtimePath,
|
|
420
|
+
runtimeVersion,
|
|
421
|
+
removedEfforts: [...clamp.removedEfforts],
|
|
422
|
+
affectedModels: [...clamp.affectedModels],
|
|
423
|
+
};
|
|
424
|
+
for (const line of formatClampLogLines(diagnostic)) console.warn(line);
|
|
425
|
+
if (!deps.commandCandidates) persistEffortClamp(diagnostic, { configDir: deps.configDir });
|
|
426
|
+
deps.onEffortClamp?.(diagnostic);
|
|
427
|
+
} else if (!deps.commandCandidates) {
|
|
428
|
+
persistEffortClamp(null, { configDir: deps.configDir });
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
return models;
|
|
432
|
+
}
|