@iislee/opencodex 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +225 -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 +451 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-DTpMHS4F.js +67 -0
- package/gui/dist/assets/index-ZNVDE3C7.css +1 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/icons.svg +24 -0
- package/gui/dist/index.html +25 -0
- package/gui/dist/logo.png +0 -0
- package/gui/dist/provider-icons/alibaba-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/claude.svg +1 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/copilot.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/cursor.svg +2 -0
- package/gui/dist/provider-icons/deepseek-color.svg +1 -0
- package/gui/dist/provider-icons/discord.svg +1 -0
- package/gui/dist/provider-icons/firepass-color.svg +1 -0
- package/gui/dist/provider-icons/fireworks-color.svg +1 -0
- package/gui/dist/provider-icons/gemini-color.svg +1 -0
- package/gui/dist/provider-icons/gemini.svg +1 -0
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
- package/gui/dist/provider-icons/grok-color.svg +1 -0
- package/gui/dist/provider-icons/grok.svg +1 -0
- package/gui/dist/provider-icons/groq-color.svg +1 -0
- package/gui/dist/provider-icons/huggingface-color.svg +1 -0
- package/gui/dist/provider-icons/kimi-color.svg +1 -0
- package/gui/dist/provider-icons/kiro-color.svg +15 -0
- package/gui/dist/provider-icons/kiro.svg +14 -0
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
- package/gui/dist/provider-icons/mistral-color.svg +1 -0
- package/gui/dist/provider-icons/moonshot-color.svg +1 -0
- package/gui/dist/provider-icons/nvidia-color.svg +1 -0
- package/gui/dist/provider-icons/ollama-color.svg +1 -0
- package/gui/dist/provider-icons/openai.svg +1 -0
- package/gui/dist/provider-icons/opencode.svg +1 -0
- package/gui/dist/provider-icons/openrouter-color.svg +1 -0
- package/gui/dist/provider-icons/pi.svg +21 -0
- package/gui/dist/provider-icons/qianfan-color.svg +1 -0
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
- package/gui/dist/provider-icons/telegram.svg +1 -0
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/vllm-color.svg +1 -0
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
- package/package.json +102 -0
- package/src/AGENTS.md +28 -0
- package/src/adapters/anthropic-image-guard.ts +251 -0
- package/src/adapters/anthropic-image-normalize.ts +518 -0
- package/src/adapters/anthropic.ts +1003 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +72 -0
- package/src/adapters/client-fingerprint.ts +59 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/cursor-errors.ts +165 -0
- package/src/adapters/cursor/discovery.ts +276 -0
- package/src/adapters/cursor/effort-map.ts +127 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +211 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
- package/src/adapters/cursor/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +153 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1214 -0
- package/src/adapters/cursor/mcp-config.ts +42 -0
- package/src/adapters/cursor/mcp-manager.ts +333 -0
- package/src/adapters/cursor/message-mapper.ts +49 -0
- package/src/adapters/cursor/native-exec-common.ts +55 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +329 -0
- package/src/adapters/cursor/native-exec-mcp.ts +153 -0
- package/src/adapters/cursor/native-exec-network.ts +43 -0
- package/src/adapters/cursor/native-exec-shell.ts +548 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +576 -0
- package/src/adapters/cursor/protobuf-events.ts +563 -0
- package/src/adapters/cursor/protobuf-request.ts +714 -0
- package/src/adapters/cursor/request-builder.ts +255 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +505 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +57 -0
- package/src/adapters/cursor/types.ts +52 -0
- package/src/adapters/cursor.ts +196 -0
- package/src/adapters/google-antigravity-replay.ts +303 -0
- package/src/adapters/google-antigravity-wire.ts +108 -0
- package/src/adapters/google-errors.ts +85 -0
- package/src/adapters/google-http.ts +100 -0
- package/src/adapters/google-tool-schema.ts +173 -0
- package/src/adapters/google-truncation.ts +13 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +758 -0
- package/src/adapters/identity.ts +44 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +197 -0
- package/src/adapters/kiro-events.ts +179 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +96 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +215 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1898 -0
- package/src/adapters/mimo-free.ts +263 -0
- package/src/adapters/openai-chat.ts +1005 -0
- package/src/adapters/openai-responses.ts +1137 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-catalog-nudge.ts +71 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/bridge.ts +1619 -0
- package/src/chat/inbound.ts +295 -0
- package/src/chat/outbound.ts +765 -0
- package/src/claude/agents-inject.ts +243 -0
- package/src/claude/alias.ts +149 -0
- package/src/claude/auth-detect.ts +229 -0
- package/src/claude/auth-mode-migration.ts +32 -0
- package/src/claude/auth-mode.ts +62 -0
- package/src/claude/context-windows.ts +189 -0
- package/src/claude/desktop-3p-guard.ts +35 -0
- package/src/claude/desktop-3p-paths.ts +84 -0
- package/src/claude/desktop-3p.ts +381 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +70 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +509 -0
- package/src/claude/model-info.ts +151 -0
- package/src/claude/outbound.ts +872 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +268 -0
- package/src/cli/account-auth.ts +223 -0
- package/src/cli/account-extended.ts +350 -0
- package/src/cli/account.ts +275 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +184 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-desktop.ts +188 -0
- package/src/cli/claude.ts +286 -0
- package/src/cli/codex-shim-autorestore.ts +45 -0
- package/src/cli/combo.ts +119 -0
- package/src/cli/config-command.ts +145 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/doctor.ts +930 -0
- package/src/cli/export-command.ts +187 -0
- package/src/cli/help.ts +354 -0
- package/src/cli/index.ts +1113 -0
- package/src/cli/init.ts +224 -0
- package/src/cli/integrations.ts +142 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/internal-dispatch.ts +20 -0
- package/src/cli/models-runtime.ts +212 -0
- package/src/cli/models.ts +336 -0
- package/src/cli/observe.ts +117 -0
- package/src/cli/opencode.ts +586 -0
- package/src/cli/pi.ts +188 -0
- package/src/cli/provider-runtime.ts +162 -0
- package/src/cli/provider.ts +463 -0
- package/src/cli/runtime-api.ts +325 -0
- package/src/cli/star-prompt.ts +155 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +321 -0
- package/src/cli/sync-cloud.ts +283 -0
- package/src/cli/system-command.ts +112 -0
- package/src/cli/tray-proxy.ts +52 -0
- package/src/cli/v2.ts +173 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +377 -0
- package/src/clients/effective-status.ts +385 -0
- package/src/clients/probes/agy.ts +55 -0
- package/src/clients/probes/cc-switch.ts +110 -0
- package/src/clients/probes/claude.ts +90 -0
- package/src/clients/probes/codex.ts +125 -0
- package/src/clients/probes/grok.ts +29 -0
- package/src/clients/probes/opencode.ts +109 -0
- package/src/clients/probes/paseo.ts +55 -0
- package/src/clients/probes/pi.ts +55 -0
- package/src/cloud/onedrive-auth.ts +666 -0
- package/src/cloud/onedrive-graph.ts +108 -0
- package/src/cloud/settings.ts +75 -0
- package/src/cloud/sync.ts +212 -0
- package/src/cloud/types.ts +56 -0
- package/src/cloud/vault.ts +89 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +34 -0
- package/src/codex/account-lifecycle.ts +55 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +149 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +517 -0
- package/src/codex/account-usability.ts +20 -0
- package/src/codex/app-server-processes.ts +756 -0
- package/src/codex/auth-api.ts +1540 -0
- package/src/codex/auth-collision.ts +107 -0
- package/src/codex/auth-context.ts +352 -0
- package/src/codex/autostart-health.ts +149 -0
- package/src/codex/catalog/aggregation.ts +378 -0
- package/src/codex/catalog/bundled.ts +251 -0
- package/src/codex/catalog/effort.ts +355 -0
- package/src/codex/catalog/metadata.ts +180 -0
- package/src/codex/catalog/parsing.ts +456 -0
- package/src/codex/catalog/provider-fetch.ts +902 -0
- package/src/codex/catalog/sync.ts +620 -0
- package/src/codex/catalog.ts +12 -0
- package/src/codex/data/upstream-models.json +830 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +969 -0
- package/src/codex/history-migration-guardian.ts +102 -0
- package/src/codex/history-provider.ts +776 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject.ts +799 -0
- package/src/codex/injected-marker.ts +72 -0
- package/src/codex/journal.ts +163 -0
- package/src/codex/main-account-cache.ts +32 -0
- package/src/codex/main-account.ts +40 -0
- package/src/codex/model-cache.ts +227 -0
- package/src/codex/paths.ts +65 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +225 -0
- package/src/codex/project-config-warnings.ts +411 -0
- package/src/codex/quota.ts +411 -0
- package/src/codex/refresh.ts +53 -0
- package/src/codex/routing.ts +1477 -0
- package/src/codex/runtime.ts +538 -0
- package/src/codex/shim.ts +1189 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +469 -0
- package/src/codex/sync.ts +130 -0
- package/src/codex/warmup.ts +192 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/combos/failover.ts +140 -0
- package/src/combos/index.ts +41 -0
- package/src/combos/request.ts +62 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +326 -0
- package/src/config.ts +2356 -0
- package/src/generated/jawcode-model-metadata.ts +104 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +545 -0
- package/src/grok/status.ts +121 -0
- package/src/grok/sync.ts +103 -0
- package/src/grok/usage-hook/report.mjs +348 -0
- package/src/grok/usage-hook.ts +278 -0
- package/src/images/artifacts.ts +516 -0
- package/src/images/fulfill-video.ts +163 -0
- package/src/images/fulfill.ts +149 -0
- package/src/images/index.ts +4 -0
- package/src/images/loop.ts +829 -0
- package/src/images/plan.ts +133 -0
- package/src/images/synthetic-tool.ts +133 -0
- package/src/images/types.ts +41 -0
- package/src/images/xai-client.ts +141 -0
- package/src/images/xai-video-client.ts +163 -0
- package/src/index.ts +22 -0
- package/src/lib/abort.ts +146 -0
- package/src/lib/admin-secrets.ts +25 -0
- package/src/lib/admission.ts +83 -0
- package/src/lib/app-owned-memory-stores.ts +173 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +202 -0
- package/src/lib/bun-binary-validator.d.mts +3 -0
- package/src/lib/bun-binary-validator.mjs +18 -0
- package/src/lib/bun-runtime.ts +71 -0
- package/src/lib/bun-stream-caps.ts +126 -0
- package/src/lib/config-ownership.ts +360 -0
- package/src/lib/crash-guard.ts +344 -0
- package/src/lib/debug-log-buffer.ts +83 -0
- package/src/lib/debug-settings.ts +108 -0
- package/src/lib/debug.ts +31 -0
- package/src/lib/destination-policy.ts +316 -0
- package/src/lib/errors.ts +364 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/pinned-http.ts +151 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +165 -0
- package/src/lib/provider-outbound.ts +170 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +105 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +30 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +323 -0
- package/src/lib/state-store-registrations.ts +109 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/test-home-guard.ts +90 -0
- package/src/lib/token-estimate.ts +69 -0
- package/src/lib/translator-budget.ts +356 -0
- package/src/lib/upstream-retry.ts +239 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-elevation.ts +705 -0
- package/src/lib/windows-secret-acl.ts +514 -0
- package/src/lib/winsw.ts +375 -0
- package/src/oauth/anthropic-routing.ts +594 -0
- package/src/oauth/anthropic.ts +177 -0
- package/src/oauth/callback-server.ts +294 -0
- package/src/oauth/chatgpt.ts +150 -0
- package/src/oauth/cursor.ts +211 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +230 -0
- package/src/oauth/health.ts +399 -0
- package/src/oauth/index.ts +1174 -0
- package/src/oauth/key-providers.ts +108 -0
- package/src/oauth/kimi.ts +213 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +577 -0
- package/src/oauth/local-token-detect.ts +121 -0
- package/src/oauth/log.ts +48 -0
- package/src/oauth/login-cli.ts +163 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +630 -0
- package/src/oauth/token-guardian.ts +303 -0
- package/src/oauth/types.ts +62 -0
- package/src/oauth/xai.ts +241 -0
- package/src/pi/extensions.ts +72 -0
- package/src/pi/home.ts +42 -0
- package/src/pi/index.ts +40 -0
- package/src/pi/models.ts +278 -0
- package/src/pi/packages.ts +219 -0
- package/src/pi/settings.ts +365 -0
- package/src/pi/status.ts +68 -0
- package/src/pi/sync.ts +75 -0
- package/src/providers/alibaba-region-backup.ts +75 -0
- package/src/providers/alibaba-region-migration.ts +156 -0
- package/src/providers/alibaba-region-startup.ts +36 -0
- package/src/providers/antigravity-models.ts +205 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +64 -0
- package/src/providers/context-cap.ts +65 -0
- package/src/providers/derive.ts +339 -0
- package/src/providers/free-directory.ts +184 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/key-failover.ts +203 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery.ts +356 -0
- package/src/providers/openai-sidecar.ts +175 -0
- package/src/providers/openai-tier-startup.ts +27 -0
- package/src/providers/openai-tiers.ts +301 -0
- package/src/providers/openai-virtual-models.ts +82 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +150 -0
- package/src/providers/quota.ts +1260 -0
- package/src/providers/registry.ts +1600 -0
- package/src/providers/slug-codec.ts +67 -0
- package/src/providers/xai-transport.ts +141 -0
- package/src/reasoning-effort.ts +135 -0
- package/src/responses/compaction.ts +117 -0
- package/src/responses/parser.ts +656 -0
- package/src/responses/reasoning-envelope.ts +52 -0
- package/src/responses/schema.ts +159 -0
- package/src/responses/spill-store.ts +394 -0
- package/src/responses/state.ts +895 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/router.ts +425 -0
- package/src/server/adapter-resolve.ts +80 -0
- package/src/server/auth-cors.ts +530 -0
- package/src/server/chat-completions.ts +368 -0
- package/src/server/claude-messages.ts +914 -0
- package/src/server/effort-policy.ts +172 -0
- package/src/server/gui-static.ts +123 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +476 -0
- package/src/server/index.ts +1126 -0
- package/src/server/lifecycle.ts +227 -0
- package/src/server/live.ts +598 -0
- package/src/server/management/agent-settings-routes.ts +1169 -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/clients-routes.ts +63 -0
- package/src/server/management/cloud-sync-routes.ts +266 -0
- package/src/server/management/combo-routes.ts +220 -0
- package/src/server/management/config-routes.ts +422 -0
- package/src/server/management/context.ts +31 -0
- package/src/server/management/logs-usage-routes.ts +707 -0
- package/src/server/management/model-routes.ts +525 -0
- package/src/server/management/oauth-account-routes.ts +563 -0
- package/src/server/management/provider-routes.ts +556 -0
- package/src/server/management/shared.ts +277 -0
- package/src/server/management/sidebar-routes.ts +90 -0
- package/src/server/management/system-restart.ts +179 -0
- package/src/server/management/system-routes.ts +117 -0
- package/src/server/management/usage-summary-cache.ts +86 -0
- package/src/server/management-api.ts +215 -0
- package/src/server/management-auth.ts +267 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +116 -0
- package/src/server/proxy-liveness.ts +201 -0
- package/src/server/relay-eager.ts +313 -0
- package/src/server/relay.ts +1049 -0
- package/src/server/request-decompress.ts +132 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1046 -0
- package/src/server/responses/collaboration.ts +354 -0
- package/src/server/responses/compact.ts +384 -0
- package/src/server/responses/core.ts +2758 -0
- package/src/server/responses/encrypted-payload.ts +308 -0
- package/src/server/responses/fetch-helpers.ts +157 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/terminal-guard.ts +230 -0
- package/src/server/responses/upstream-error.ts +48 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +224 -0
- package/src/server/responses.ts +9 -0
- package/src/server/search.ts +136 -0
- package/src/server/sse-payload-rewrite.ts +175 -0
- package/src/server/startup-action-control.ts +308 -0
- package/src/server/startup-health-cache.ts +113 -0
- package/src/server/system-env.ts +413 -0
- package/src/server/windows-tcp-drop.ts +184 -0
- package/src/server/windows-tray-control.ts +41 -0
- package/src/server/ws-bridge.ts +471 -0
- package/src/service.ts +2554 -0
- package/src/stall-timeout.ts +20 -0
- package/src/storage/cleanup-job.ts +57 -0
- package/src/storage/cleanup.ts +3085 -0
- package/src/storage/policy-job.ts +457 -0
- package/src/storage/policy-scheduler.ts +40 -0
- package/src/storage/policy-worker.ts +59 -0
- package/src/storage/policy.ts +527 -0
- package/src/storage/restore-job.ts +299 -0
- package/src/storage/restore-worker.ts +58 -0
- package/src/storage/scanner.ts +238 -0
- package/src/storage/storage-mutation-coordinator.ts +139 -0
- package/src/storage/worker-lifecycle.ts +215 -0
- package/src/tray/assets/opencodex-tray-offline.ico +0 -0
- package/src/tray/assets/opencodex-tray-online.ico +0 -0
- package/src/tray/assets/opencodex-tray-warning.ico +0 -0
- package/src/tray/assets/opencodex-tray.png +0 -0
- package/src/tray/windows-tray.ps1 +290 -0
- package/src/tray/windows.ts +730 -0
- package/src/types.ts +1237 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +407 -0
- package/src/update/job.ts +1520 -0
- package/src/update/notify.ts +257 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -0
- package/src/update/tray-update-plan.d.mts +18 -0
- package/src/update/tray-update-plan.mjs +38 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +164 -0
- package/src/usage/log.ts +658 -0
- package/src/usage/summary.ts +585 -0
- package/src/usage/totals.ts +14 -0
- package/src/vision/anthropic-describe.ts +185 -0
- package/src/vision/describe.ts +125 -0
- package/src/vision/index.ts +467 -0
- package/src/web-search/anthropic-executor.ts +189 -0
- package/src/web-search/executor.ts +105 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/index.ts +196 -0
- package/src/web-search/loop.ts +664 -0
- package/src/web-search/parse.ts +220 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/synthetic-tool.ts +47 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hard reasoning-effort caps (devlog/260710_subagent_effort_intercept).
|
|
3
|
+
*
|
|
4
|
+
* Prompt-side effort designation (injectionEffort) is advisory only: codex-rs inherits the
|
|
5
|
+
* parent's effective effort when spawn_agent carries no model/effort args
|
|
6
|
+
* (multi_agents_common.rs resolve defaults), rejects overrides on full-history forks, and a
|
|
7
|
+
* non-empty agent-role file rebuilds the child Config and silently drops spawn-time
|
|
8
|
+
* model/effort. So a session whose config default is ultra leaks max-tier children whenever
|
|
9
|
+
* the parent model spawns bare. This module is the enforcement path: it rewrites the effort
|
|
10
|
+
* of proxied turns at the single choke point every HTTP/WS turn passes through
|
|
11
|
+
* (handleResponses), using the same dual-shape rewrite contract as nativeEffortClamp —
|
|
12
|
+
* parsed.options.reasoning feeds routed adapters, _rawBody.reasoning.effort feeds the
|
|
13
|
+
* ChatGPT passthrough serializer.
|
|
14
|
+
*/
|
|
15
|
+
import type { OcxConfig, OcxParsedRequest, OcxProviderConfig } from "../types";
|
|
16
|
+
import { modelInList } from "../types";
|
|
17
|
+
import { codexEffortRank, configuredReasoningEfforts, isCodexReasoningEffort, modelRecordValue } from "../reasoning-effort";
|
|
18
|
+
import { catalogModelEfforts } from "../codex/catalog";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* True when the request carries codex-rs's spawned-child markers, matched EXACTLY.
|
|
22
|
+
* Source of truth (openai/codex @ 6138909d): every collab-spawned child turn sends
|
|
23
|
+
* `x-openai-subagent: collab_spawn` (core/src/responses_metadata.rs) and embeds
|
|
24
|
+
* `"subagent_kind":"thread_spawn"` in the JSON `x-codex-turn-metadata` compatibility
|
|
25
|
+
* header. Both are checked: the WS bridge rebuilds internal requests from the
|
|
26
|
+
* FORWARD_HEADERS allowlist, so either header alone is sufficient evidence.
|
|
27
|
+
*
|
|
28
|
+
* Exact matching matters: upstream emits `x-openai-subagent` for OTHER internal
|
|
29
|
+
* turn categories too (review, compact, memory_consolidation, arbitrary "other"
|
|
30
|
+
* sources — responses_metadata.rs subagent_source). Those are maintenance turns,
|
|
31
|
+
* not spawned children, and must never trip subagentEffortCap.
|
|
32
|
+
*/
|
|
33
|
+
export function isThreadSpawnRequest(headers: Headers): boolean {
|
|
34
|
+
if (headers.get("x-openai-subagent") === "collab_spawn") return true;
|
|
35
|
+
const turnMeta = headers.get("x-codex-turn-metadata");
|
|
36
|
+
if (!turnMeta) return false;
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(turnMeta) as { subagent_kind?: unknown };
|
|
39
|
+
return parsed.subagent_kind === "thread_spawn";
|
|
40
|
+
} catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The effective ceiling for this turn, or undefined when no configured cap applies. */
|
|
46
|
+
export function effortCapFor(config: OcxConfig, subagent: boolean): string | undefined {
|
|
47
|
+
const caps: string[] = [];
|
|
48
|
+
if (config.effortCap && isCodexReasoningEffort(config.effortCap)) caps.push(config.effortCap);
|
|
49
|
+
if (subagent && config.subagentEffortCap && isCodexReasoningEffort(config.subagentEffortCap)) {
|
|
50
|
+
caps.push(config.subagentEffortCap);
|
|
51
|
+
}
|
|
52
|
+
if (caps.length === 0) return undefined;
|
|
53
|
+
return caps.reduce((low, cap) => (codexEffortRank(cap) < codexEffortRank(low) ? cap : low));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Whether the effort caps apply to this turn at all. Caps are a V2-surface feature
|
|
58
|
+
* (v1 sub-agents are pinned via explicit spawn args + injectionEffort prompting, so
|
|
59
|
+
* the ultra-default leak this module intercepts is v2-specific):
|
|
60
|
+
* - compaction turns are maintenance, not agent turns: they bypass caps entirely so
|
|
61
|
+
* native /v1/responses/compact (forwarded, never enters handleResponses) and routed
|
|
62
|
+
* compaction (synthesized internal request) get identical cap semantics.
|
|
63
|
+
* - multiAgentMode "v1" disables caps entirely (mirrors the GUI hiding the panel).
|
|
64
|
+
* - a main turn qualifies when its own tool list carries the v2 collab surface.
|
|
65
|
+
* - a CHILD turn is admitted by its spawned-child markers (isThreadSpawnRequest)
|
|
66
|
+
* REGARDLESS of tool surface: depth-limited leaves carry no collab tools (surface
|
|
67
|
+
* null) while children below the spawn-depth limit retain collab tools (spec_plan.rs
|
|
68
|
+
* leaf guard), so tool sniffing alone would cap siblings inconsistently.
|
|
69
|
+
* - a v1-surface MAIN turn (no child markers) never qualifies.
|
|
70
|
+
*/
|
|
71
|
+
export function effortCapAppliesTo(
|
|
72
|
+
surface: "v1" | "v2" | null,
|
|
73
|
+
headers: Headers,
|
|
74
|
+
config: OcxConfig,
|
|
75
|
+
compaction = false,
|
|
76
|
+
): boolean {
|
|
77
|
+
if (compaction) return false;
|
|
78
|
+
if (config.multiAgentMode === "v1") return false;
|
|
79
|
+
return surface === "v2" || isThreadSpawnRequest(headers);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The routed model's supported effort ladder for cap resolution, from the ROUTE's
|
|
84
|
+
* registry-merged provider (router.ts routedProviderConfig) — the persisted
|
|
85
|
+
* config.providers entry misses registry seeds, and bare ids can route via
|
|
86
|
+
* defaultModel/model-list/default-provider, so no "/" heuristic anywhere.
|
|
87
|
+
*
|
|
88
|
+
* - `[]` -> the model intentionally exposes no effort control (noReasoningModels or
|
|
89
|
+
* an explicitly empty configured ladder): cap resolution strips.
|
|
90
|
+
* - list -> sanitized + healed ladder (configuredReasoningEfforts).
|
|
91
|
+
* - undefined -> unknown. Includes the raw-nonempty-but-non-rankable case (e.g. a
|
|
92
|
+
* thinking-toggle ladder of ["enabled"]): sanitizing would flatten it to []
|
|
93
|
+
* and mis-classify it as "no effort control", so it stays unknown.
|
|
94
|
+
*
|
|
95
|
+
* Catalog fallback fires only for the ChatGPT-backend native passthrough IDENTITY
|
|
96
|
+
* (adapter "openai-responses" + authMode "forward", the fresh-install `openai`
|
|
97
|
+
* provider shape): the injected catalog is authoritative exactly for models Codex
|
|
98
|
+
* validates against that backend. A custom responses provider (key mode) serving a
|
|
99
|
+
* native-looking bare id must NOT inherit the unrelated native ladder.
|
|
100
|
+
*/
|
|
101
|
+
export function supportedLadderFor(route: { provider: OcxProviderConfig; modelId: string }): string[] | undefined {
|
|
102
|
+
const { provider, modelId } = route;
|
|
103
|
+
if (modelInList(provider.noReasoningModels, modelId)) return [];
|
|
104
|
+
const raw = modelRecordValue(provider.modelReasoningEfforts, modelId) ?? provider.reasoningEfforts;
|
|
105
|
+
if (raw !== undefined) {
|
|
106
|
+
const sanitized = configuredReasoningEfforts(provider, modelId) ?? [];
|
|
107
|
+
if (sanitized.length === 0 && raw.length > 0) return undefined;
|
|
108
|
+
return sanitized;
|
|
109
|
+
}
|
|
110
|
+
if (provider.adapter === "openai-responses" && provider.authMode === "forward") {
|
|
111
|
+
const efforts = catalogModelEfforts([modelId]).get(modelId);
|
|
112
|
+
if (efforts && efforts.length > 0) return efforts;
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Resolve the configured cap against the model's supported ladder. Returns the effective
|
|
119
|
+
* ceiling rung, or null when the turn must be STRIPPED of its effort entirely. The cap
|
|
120
|
+
* NEVER raises: when rankable rungs exist but none sits at or below the cap, the model
|
|
121
|
+
* cannot run within the ceiling, so the effort is stripped and the provider default
|
|
122
|
+
* applies (never a rung above the cap).
|
|
123
|
+
*/
|
|
124
|
+
export function resolveCappedEffort(cap: string, supported: readonly string[] | undefined): string | null {
|
|
125
|
+
if (supported === undefined) return cap;
|
|
126
|
+
const rankable = supported.filter(isCodexReasoningEffort);
|
|
127
|
+
if (rankable.length === 0) {
|
|
128
|
+
// Nonempty but non-rankable (e.g. ["enabled"]) -> unknown ladder, cap as-is.
|
|
129
|
+
// Genuinely empty -> no effort control at all -> strip.
|
|
130
|
+
return supported.length > 0 ? cap : null;
|
|
131
|
+
}
|
|
132
|
+
const capRank = codexEffortRank(cap);
|
|
133
|
+
let best: string | null = null;
|
|
134
|
+
for (const rung of rankable) {
|
|
135
|
+
const rank = codexEffortRank(rung);
|
|
136
|
+
if (rank <= capRank && (best === null || rank > codexEffortRank(best))) best = rung;
|
|
137
|
+
}
|
|
138
|
+
return best;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Cap the turn's reasoning effort in BOTH request shapes. Non-strip resolution only
|
|
143
|
+
* lowers: efforts at or below the resolved ceiling (and non-ladder/absent efforts) pass
|
|
144
|
+
* untouched. Strip resolution (model exposes no effort control, or no supported rung
|
|
145
|
+
* fits under the cap) removes whatever effort is present — regardless of its rank —
|
|
146
|
+
* from both shapes while preserving `reasoning.summary`. Returns the applied rewrite
|
|
147
|
+
* for request-log annotation (`to: "none"` on strip), or null when nothing changed.
|
|
148
|
+
*/
|
|
149
|
+
export function applyEffortCap(
|
|
150
|
+
parsed: OcxParsedRequest,
|
|
151
|
+
headers: Headers,
|
|
152
|
+
config: OcxConfig,
|
|
153
|
+
supported?: readonly string[] | undefined,
|
|
154
|
+
): { from: string; to: string; subagent: boolean } | null {
|
|
155
|
+
const subagent = isThreadSpawnRequest(headers);
|
|
156
|
+
const cap = effortCapFor(config, subagent);
|
|
157
|
+
if (!cap) return null;
|
|
158
|
+
const resolved = resolveCappedEffort(cap, supported);
|
|
159
|
+
const requested = parsed.options.reasoning;
|
|
160
|
+
const raw = parsed._rawBody as { reasoning?: { effort?: string } } | undefined;
|
|
161
|
+
if (resolved === null) {
|
|
162
|
+
if (!requested) return null;
|
|
163
|
+
parsed.options.reasoning = undefined;
|
|
164
|
+
if (raw?.reasoning && typeof raw.reasoning === "object") delete raw.reasoning.effort;
|
|
165
|
+
return { from: requested, to: "none", subagent };
|
|
166
|
+
}
|
|
167
|
+
if (!requested || !isCodexReasoningEffort(requested)) return null;
|
|
168
|
+
if (codexEffortRank(requested) <= codexEffortRank(resolved)) return null;
|
|
169
|
+
parsed.options.reasoning = resolved;
|
|
170
|
+
if (raw?.reasoning && typeof raw.reasoning === "object") raw.reasoning.effort = resolved;
|
|
171
|
+
return { from: requested, to: resolved, subagent };
|
|
172
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { extname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import { browserSecurityHeaders } from "./auth-cors";
|
|
4
|
+
import type { GuiSessionBootstrap } from "./management-auth";
|
|
5
|
+
|
|
6
|
+
/** opencodex version, read from the packaged package.json (same source as the server bootstrap). */
|
|
7
|
+
const VERSION = (() => {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version as string;
|
|
10
|
+
} catch {
|
|
11
|
+
return "0.0.0";
|
|
12
|
+
}
|
|
13
|
+
})();
|
|
14
|
+
|
|
15
|
+
const MIME_TYPES: Record<string, string> = {
|
|
16
|
+
".html": "text/html", ".js": "application/javascript", ".css": "text/css",
|
|
17
|
+
".json": "application/json", ".svg": "image/svg+xml", ".png": "image/png",
|
|
18
|
+
".ico": "image/x-icon",
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function findGuiDist(): string | null {
|
|
22
|
+
const candidates = [
|
|
23
|
+
join(import.meta.dir, "..", "..", "gui", "dist"),
|
|
24
|
+
join(import.meta.dir, "..", "..", "..", "gui", "dist"),
|
|
25
|
+
];
|
|
26
|
+
for (const c of candidates) {
|
|
27
|
+
if (existsSync(join(c, "index.html"))) return c;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function resolveGuiFilePath(guiDist: string, pathname: string): string | null {
|
|
33
|
+
let decodedPath: string;
|
|
34
|
+
try {
|
|
35
|
+
decodedPath = decodeURIComponent(pathname);
|
|
36
|
+
} catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (decodedPath.includes("\0")) return null;
|
|
40
|
+
|
|
41
|
+
const relativePath = decodedPath === "/" || decodedPath === ""
|
|
42
|
+
? "index.html"
|
|
43
|
+
: decodedPath.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
44
|
+
const root = resolve(guiDist);
|
|
45
|
+
const filePath = resolve(root, relativePath);
|
|
46
|
+
const rel = relative(root, filePath);
|
|
47
|
+
if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return null;
|
|
48
|
+
return filePath;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function isFile(path: string): boolean {
|
|
52
|
+
try {
|
|
53
|
+
return statSync(path).isFile();
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function htmlResponse(path: string, session?: GuiSessionBootstrap): Response {
|
|
60
|
+
let html = readFileSync(path, "utf8");
|
|
61
|
+
if (session) {
|
|
62
|
+
const bootstrap = [
|
|
63
|
+
`<meta name="opencodex-session-token" content="${session.token}">`,
|
|
64
|
+
`<meta name="opencodex-session-csrf" content="${session.csrfToken}">`,
|
|
65
|
+
`<meta name="opencodex-session-origin" content="${session.origin}">`,
|
|
66
|
+
].join("");
|
|
67
|
+
html = html.includes("</head>") ? html.replace("</head>", `${bootstrap}</head>`) : `${bootstrap}${html}`;
|
|
68
|
+
}
|
|
69
|
+
return new Response(html, {
|
|
70
|
+
headers: {
|
|
71
|
+
"Content-Type": "text/html",
|
|
72
|
+
"Cache-Control": "no-store",
|
|
73
|
+
Pragma: "no-cache",
|
|
74
|
+
...browserSecurityHeaders(),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function serveGuiFile(
|
|
80
|
+
pathname: string,
|
|
81
|
+
guiDist = findGuiDist(),
|
|
82
|
+
session?: GuiSessionBootstrap,
|
|
83
|
+
): Response | null {
|
|
84
|
+
if (!guiDist) return null;
|
|
85
|
+
const filePath = resolveGuiFilePath(guiDist, pathname);
|
|
86
|
+
if (!filePath) return null;
|
|
87
|
+
|
|
88
|
+
if (!isFile(filePath)) {
|
|
89
|
+
if (!extname(pathname)) {
|
|
90
|
+
const indexPath = join(guiDist, "index.html");
|
|
91
|
+
if (isFile(indexPath)) {
|
|
92
|
+
return htmlResponse(indexPath, session);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const ext = extname(filePath);
|
|
99
|
+
const contentType = MIME_TYPES[ext] || "application/octet-stream";
|
|
100
|
+
if (ext === ".html") return htmlResponse(filePath, session);
|
|
101
|
+
return new Response(Bun.file(filePath), {
|
|
102
|
+
headers: { "Content-Type": contentType, ...browserSecurityHeaders() },
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function rootFallbackPayload() {
|
|
107
|
+
return {
|
|
108
|
+
status: "ok",
|
|
109
|
+
service: "opencodex",
|
|
110
|
+
version: VERSION,
|
|
111
|
+
dashboard: {
|
|
112
|
+
available: false,
|
|
113
|
+
reason: "GUI build not found. Run `bun run build:gui` from the opencodex repo, or use `ocx gui` from a packaged install.",
|
|
114
|
+
},
|
|
115
|
+
endpoints: {
|
|
116
|
+
health: "/healthz",
|
|
117
|
+
models: "/v1/models",
|
|
118
|
+
responses: "/v1/responses",
|
|
119
|
+
chatCompletions: "/v1/chat/completions",
|
|
120
|
+
management: "/api/*",
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstream-413 tightened-retry gate (devlog/260714_image_normalization_pipeline/030).
|
|
3
|
+
*
|
|
4
|
+
* When Anthropic still rejects a normalized request with 413 request_too_large (budget
|
|
5
|
+
* estimate missed: giant text share, tool schemas, ...), the proxy rebuilds the SAME
|
|
6
|
+
* request with `imageTierBias: 1` — every image one ladder position lower — and retries
|
|
7
|
+
* exactly once. The decision logic lives here so it is unit-testable; the fetch loop in
|
|
8
|
+
* responses.ts consumes it.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { OcxParsedRequest } from "../types";
|
|
12
|
+
|
|
13
|
+
/** True when the parsed request carries at least one inline (data-URL) image. */
|
|
14
|
+
export function parsedHasInlineImage(parsed: OcxParsedRequest): boolean {
|
|
15
|
+
const messages = (parsed as { context?: { messages?: unknown[] } }).context?.messages ?? [];
|
|
16
|
+
for (const message of messages) {
|
|
17
|
+
const content = (message as { content?: unknown }).content;
|
|
18
|
+
if (!Array.isArray(content)) continue;
|
|
19
|
+
for (const part of content) {
|
|
20
|
+
const imageUrl = (part as { imageUrl?: unknown })?.imageUrl;
|
|
21
|
+
if (typeof imageUrl === "string" && imageUrl.startsWith("data:")) return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* One tier-biased rebuild per request (spiral guard), only for the anthropic adapter
|
|
29
|
+
* (others ignore imageTierBias — an identical retry would just duplicate cost), and only
|
|
30
|
+
* when the request actually carries inline images the bias can shrink.
|
|
31
|
+
*/
|
|
32
|
+
export function shouldAttemptImageTierRetry(args: {
|
|
33
|
+
status: number;
|
|
34
|
+
adapterName: string;
|
|
35
|
+
parsed: OcxParsedRequest;
|
|
36
|
+
alreadyAttempted: boolean;
|
|
37
|
+
}): boolean {
|
|
38
|
+
return args.status === 413
|
|
39
|
+
&& !args.alreadyAttempted
|
|
40
|
+
&& args.adapterName === "anthropic"
|
|
41
|
+
&& parsedHasInlineImage(args.parsed);
|
|
42
|
+
}
|