@coseung2/opencodex 2.8.0-cs.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +219 -0
- package/assets/architecture.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/claude-code-models.gif +0 -0
- package/assets/codex-app-picker.png +0 -0
- package/bin/ocx-notch.mjs +78 -0
- package/bin/ocx.mjs +454 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-CAnnes06.js +67 -0
- package/gui/dist/assets/index-OY43ubAq.css +1 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/icons.svg +24 -0
- package/gui/dist/index.html +25 -0
- package/gui/dist/logo.png +0 -0
- package/gui/dist/provider-icons/alibaba-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/claude.svg +1 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/copilot.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/cursor.svg +2 -0
- package/gui/dist/provider-icons/deepseek-color.svg +1 -0
- package/gui/dist/provider-icons/discord.svg +1 -0
- package/gui/dist/provider-icons/firepass-color.svg +1 -0
- package/gui/dist/provider-icons/fireworks-color.svg +1 -0
- package/gui/dist/provider-icons/gemini-color.svg +1 -0
- package/gui/dist/provider-icons/gemini.svg +1 -0
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
- package/gui/dist/provider-icons/grok-color.svg +1 -0
- package/gui/dist/provider-icons/grok.svg +1 -0
- package/gui/dist/provider-icons/groq-color.svg +1 -0
- package/gui/dist/provider-icons/huggingface-color.svg +1 -0
- package/gui/dist/provider-icons/kimi-color.svg +1 -0
- package/gui/dist/provider-icons/kiro-color.svg +15 -0
- package/gui/dist/provider-icons/kiro.svg +14 -0
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
- package/gui/dist/provider-icons/mistral-color.svg +1 -0
- package/gui/dist/provider-icons/moonshot-color.svg +1 -0
- package/gui/dist/provider-icons/nvidia-color.svg +1 -0
- package/gui/dist/provider-icons/ollama-color.svg +1 -0
- package/gui/dist/provider-icons/openai.svg +1 -0
- package/gui/dist/provider-icons/opencode.svg +1 -0
- package/gui/dist/provider-icons/openrouter-color.svg +1 -0
- package/gui/dist/provider-icons/pi.svg +21 -0
- package/gui/dist/provider-icons/qianfan-color.svg +1 -0
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
- package/gui/dist/provider-icons/telegram.svg +1 -0
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/vllm-color.svg +1 -0
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
- package/package.json +107 -0
- package/packages/ocx-notch/README.md +55 -0
- package/packages/ocx-notch/THIRD_PARTY_NOTICES.md +45 -0
- package/src/AGENTS.md +28 -0
- package/src/adapters/anthropic-image-guard.ts +251 -0
- package/src/adapters/anthropic-image-normalize.ts +518 -0
- package/src/adapters/anthropic.ts +1003 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +72 -0
- package/src/adapters/client-fingerprint.ts +59 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/cursor-errors.ts +165 -0
- package/src/adapters/cursor/discovery.ts +276 -0
- package/src/adapters/cursor/effort-map.ts +127 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +211 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
- package/src/adapters/cursor/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +153 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1214 -0
- package/src/adapters/cursor/mcp-config.ts +42 -0
- package/src/adapters/cursor/mcp-manager.ts +333 -0
- package/src/adapters/cursor/message-mapper.ts +49 -0
- package/src/adapters/cursor/native-exec-common.ts +55 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +329 -0
- package/src/adapters/cursor/native-exec-mcp.ts +153 -0
- package/src/adapters/cursor/native-exec-network.ts +43 -0
- package/src/adapters/cursor/native-exec-shell.ts +548 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +576 -0
- package/src/adapters/cursor/protobuf-events.ts +563 -0
- package/src/adapters/cursor/protobuf-request.ts +714 -0
- package/src/adapters/cursor/request-builder.ts +255 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +505 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +57 -0
- package/src/adapters/cursor/types.ts +52 -0
- package/src/adapters/cursor.ts +196 -0
- package/src/adapters/google-antigravity-replay.ts +303 -0
- package/src/adapters/google-antigravity-wire.ts +108 -0
- package/src/adapters/google-errors.ts +85 -0
- package/src/adapters/google-http.ts +100 -0
- package/src/adapters/google-tool-schema.ts +173 -0
- package/src/adapters/google-truncation.ts +13 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +758 -0
- package/src/adapters/identity.ts +44 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +197 -0
- package/src/adapters/kiro-events.ts +179 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +96 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +215 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1898 -0
- package/src/adapters/mimo-free.ts +263 -0
- package/src/adapters/openai-chat.ts +1005 -0
- package/src/adapters/openai-responses.ts +1137 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-catalog-nudge.ts +71 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/bridge.ts +1619 -0
- package/src/chat/inbound.ts +295 -0
- package/src/chat/outbound.ts +765 -0
- package/src/claude/agents-inject.ts +243 -0
- package/src/claude/alias.ts +149 -0
- package/src/claude/auth-detect.ts +229 -0
- package/src/claude/auth-mode-migration.ts +32 -0
- package/src/claude/auth-mode.ts +62 -0
- package/src/claude/context-windows.ts +189 -0
- package/src/claude/desktop-3p-guard.ts +35 -0
- package/src/claude/desktop-3p-paths.ts +84 -0
- package/src/claude/desktop-3p.ts +381 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +70 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +509 -0
- package/src/claude/model-info.ts +151 -0
- package/src/claude/outbound.ts +872 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +268 -0
- package/src/cli/account-auth.ts +223 -0
- package/src/cli/account-extended.ts +350 -0
- package/src/cli/account.ts +275 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +184 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-desktop.ts +188 -0
- package/src/cli/claude.ts +286 -0
- package/src/cli/codex-shim-autorestore.ts +45 -0
- package/src/cli/combo.ts +119 -0
- package/src/cli/config-command.ts +145 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/doctor.ts +930 -0
- package/src/cli/export-command.ts +187 -0
- package/src/cli/help.ts +330 -0
- package/src/cli/index.ts +1103 -0
- package/src/cli/init.ts +224 -0
- package/src/cli/integrations.ts +142 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/internal-dispatch.ts +20 -0
- package/src/cli/models-runtime.ts +212 -0
- package/src/cli/models.ts +336 -0
- package/src/cli/observe.ts +117 -0
- package/src/cli/opencode.ts +586 -0
- package/src/cli/provider-runtime.ts +162 -0
- package/src/cli/provider.ts +463 -0
- package/src/cli/runtime-api.ts +325 -0
- package/src/cli/star-prompt.ts +134 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +321 -0
- package/src/cli/system-command.ts +114 -0
- package/src/cli/tray-proxy.ts +52 -0
- package/src/cli/v2.ts +173 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +377 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +34 -0
- package/src/codex/account-lifecycle.ts +55 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +149 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +517 -0
- package/src/codex/account-usability.ts +20 -0
- package/src/codex/app-server-processes.ts +756 -0
- package/src/codex/auth-api.ts +1540 -0
- package/src/codex/auth-collision.ts +107 -0
- package/src/codex/auth-context.ts +352 -0
- package/src/codex/autostart-health.ts +149 -0
- package/src/codex/catalog/aggregation.ts +378 -0
- package/src/codex/catalog/bundled.ts +251 -0
- package/src/codex/catalog/effort.ts +355 -0
- package/src/codex/catalog/metadata.ts +180 -0
- package/src/codex/catalog/parsing.ts +456 -0
- package/src/codex/catalog/provider-fetch.ts +902 -0
- package/src/codex/catalog/sync.ts +620 -0
- package/src/codex/catalog.ts +12 -0
- package/src/codex/data/upstream-models.json +830 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +969 -0
- package/src/codex/history-migration-guardian.ts +102 -0
- package/src/codex/history-provider.ts +776 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject.ts +799 -0
- package/src/codex/injected-marker.ts +72 -0
- package/src/codex/journal.ts +163 -0
- package/src/codex/main-account-cache.ts +32 -0
- package/src/codex/main-account.ts +40 -0
- package/src/codex/model-cache.ts +227 -0
- package/src/codex/paths.ts +65 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +225 -0
- package/src/codex/project-config-warnings.ts +411 -0
- package/src/codex/quota.ts +411 -0
- package/src/codex/refresh.ts +53 -0
- package/src/codex/routing.ts +1477 -0
- package/src/codex/runtime.ts +538 -0
- package/src/codex/shim.ts +1189 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +469 -0
- package/src/codex/sync.ts +130 -0
- package/src/codex/warmup.ts +192 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/combos/failover.ts +140 -0
- package/src/combos/index.ts +41 -0
- package/src/combos/request.ts +62 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +326 -0
- package/src/config.ts +2355 -0
- package/src/generated/jawcode-model-metadata.ts +104 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +519 -0
- package/src/grok/status.ts +121 -0
- package/src/grok/sync.ts +66 -0
- package/src/images/artifacts.ts +516 -0
- package/src/images/fulfill-video.ts +163 -0
- package/src/images/fulfill.ts +149 -0
- package/src/images/index.ts +4 -0
- package/src/images/loop.ts +829 -0
- package/src/images/plan.ts +133 -0
- package/src/images/synthetic-tool.ts +133 -0
- package/src/images/types.ts +41 -0
- package/src/images/xai-client.ts +141 -0
- package/src/images/xai-video-client.ts +163 -0
- package/src/index.ts +22 -0
- package/src/lib/abort.ts +146 -0
- package/src/lib/admin-secrets.ts +25 -0
- package/src/lib/admission.ts +83 -0
- package/src/lib/app-owned-memory-stores.ts +173 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +202 -0
- package/src/lib/bun-binary-validator.d.mts +3 -0
- package/src/lib/bun-binary-validator.mjs +18 -0
- package/src/lib/bun-runtime.ts +71 -0
- package/src/lib/bun-stream-caps.ts +126 -0
- package/src/lib/config-ownership.ts +360 -0
- package/src/lib/crash-guard.ts +344 -0
- package/src/lib/debug-log-buffer.ts +83 -0
- package/src/lib/debug-settings.ts +108 -0
- package/src/lib/debug.ts +31 -0
- package/src/lib/destination-policy.ts +316 -0
- package/src/lib/errors.ts +364 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/pinned-http.ts +151 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +165 -0
- package/src/lib/provider-outbound.ts +170 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +105 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +30 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +323 -0
- package/src/lib/state-store-registrations.ts +109 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/test-home-guard.ts +90 -0
- package/src/lib/token-estimate.ts +69 -0
- package/src/lib/translator-budget.ts +356 -0
- package/src/lib/upstream-retry.ts +239 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-elevation.ts +705 -0
- package/src/lib/windows-secret-acl.ts +514 -0
- package/src/lib/winsw.ts +375 -0
- package/src/oauth/anthropic-routing.ts +594 -0
- package/src/oauth/anthropic.ts +177 -0
- package/src/oauth/callback-server.ts +294 -0
- package/src/oauth/chatgpt.ts +150 -0
- package/src/oauth/cursor.ts +211 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +230 -0
- package/src/oauth/health.ts +399 -0
- package/src/oauth/index.ts +1173 -0
- package/src/oauth/key-providers.ts +108 -0
- package/src/oauth/kimi.ts +213 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +577 -0
- package/src/oauth/local-token-detect.ts +121 -0
- package/src/oauth/log.ts +48 -0
- package/src/oauth/login-cli.ts +163 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +630 -0
- package/src/oauth/token-guardian.ts +303 -0
- package/src/oauth/types.ts +62 -0
- package/src/oauth/xai.ts +241 -0
- package/src/providers/alibaba-region-backup.ts +75 -0
- package/src/providers/alibaba-region-migration.ts +156 -0
- package/src/providers/alibaba-region-startup.ts +36 -0
- package/src/providers/antigravity-models.ts +205 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +64 -0
- package/src/providers/context-cap.ts +65 -0
- package/src/providers/derive.ts +339 -0
- package/src/providers/free-directory.ts +184 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/key-failover.ts +203 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery.ts +356 -0
- package/src/providers/openai-sidecar.ts +175 -0
- package/src/providers/openai-tier-startup.ts +27 -0
- package/src/providers/openai-tiers.ts +301 -0
- package/src/providers/openai-virtual-models.ts +82 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +150 -0
- package/src/providers/quota.ts +1045 -0
- package/src/providers/registry.ts +1600 -0
- package/src/providers/slug-codec.ts +67 -0
- package/src/providers/xai-transport.ts +141 -0
- package/src/reasoning-effort.ts +135 -0
- package/src/responses/compaction.ts +117 -0
- package/src/responses/parser.ts +656 -0
- package/src/responses/reasoning-envelope.ts +52 -0
- package/src/responses/schema.ts +159 -0
- package/src/responses/spill-store.ts +394 -0
- package/src/responses/state.ts +895 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/router.ts +425 -0
- package/src/server/adapter-resolve.ts +80 -0
- package/src/server/auth-cors.ts +530 -0
- package/src/server/chat-completions.ts +368 -0
- package/src/server/claude-messages.ts +914 -0
- package/src/server/effort-policy.ts +172 -0
- package/src/server/gui-static.ts +123 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +476 -0
- package/src/server/index.ts +1126 -0
- package/src/server/lifecycle.ts +305 -0
- package/src/server/live.ts +598 -0
- package/src/server/management/agent-settings-routes.ts +1039 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +167 -0
- package/src/server/management/body.ts +35 -0
- package/src/server/management/combo-routes.ts +220 -0
- package/src/server/management/config-routes.ts +422 -0
- package/src/server/management/context.ts +31 -0
- package/src/server/management/logs-usage-routes.ts +516 -0
- package/src/server/management/model-routes.ts +525 -0
- package/src/server/management/oauth-account-routes.ts +561 -0
- package/src/server/management/provider-routes.ts +556 -0
- package/src/server/management/shared.ts +277 -0
- package/src/server/management/sidebar-routes.ts +88 -0
- package/src/server/management/system-restart.ts +179 -0
- package/src/server/management/system-routes.ts +117 -0
- package/src/server/management/usage-summary-cache.ts +86 -0
- package/src/server/management-api.ts +211 -0
- package/src/server/management-auth.ts +267 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +116 -0
- package/src/server/proxy-liveness.ts +201 -0
- package/src/server/relay-eager.ts +313 -0
- package/src/server/relay.ts +1060 -0
- package/src/server/request-decompress.ts +132 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1046 -0
- package/src/server/responses/collaboration.ts +354 -0
- package/src/server/responses/compact.ts +384 -0
- package/src/server/responses/core.ts +2756 -0
- package/src/server/responses/encrypted-payload.ts +308 -0
- package/src/server/responses/fetch-helpers.ts +157 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/terminal-guard.ts +230 -0
- package/src/server/responses/upstream-error.ts +48 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +224 -0
- package/src/server/responses.ts +9 -0
- package/src/server/search.ts +136 -0
- package/src/server/sse-payload-rewrite.ts +175 -0
- package/src/server/startup-action-control.ts +308 -0
- package/src/server/startup-health-cache.ts +113 -0
- package/src/server/system-env.ts +413 -0
- package/src/server/windows-tcp-drop.ts +184 -0
- package/src/server/windows-tray-control.ts +41 -0
- package/src/server/ws-bridge.ts +471 -0
- package/src/service.ts +2554 -0
- package/src/stall-timeout.ts +20 -0
- package/src/storage/cleanup-job.ts +57 -0
- package/src/storage/cleanup.ts +3085 -0
- package/src/storage/policy-job.ts +457 -0
- package/src/storage/policy-scheduler.ts +40 -0
- package/src/storage/policy-worker.ts +59 -0
- package/src/storage/policy.ts +527 -0
- package/src/storage/restore-job.ts +299 -0
- package/src/storage/restore-worker.ts +58 -0
- package/src/storage/scanner.ts +238 -0
- package/src/storage/storage-mutation-coordinator.ts +139 -0
- package/src/storage/worker-lifecycle.ts +215 -0
- package/src/tray/assets/opencodex-tray-offline.ico +0 -0
- package/src/tray/assets/opencodex-tray-online.ico +0 -0
- package/src/tray/assets/opencodex-tray-warning.ico +0 -0
- package/src/tray/assets/opencodex-tray.png +0 -0
- package/src/tray/windows-tray.ps1 +290 -0
- package/src/tray/windows.ts +730 -0
- package/src/types.ts +1237 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +392 -0
- package/src/update/job.ts +1513 -0
- package/src/update/notify.ts +257 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -0
- package/src/update/tray-update-plan.d.mts +18 -0
- package/src/update/tray-update-plan.mjs +38 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +164 -0
- package/src/usage/log.ts +658 -0
- package/src/usage/summary.ts +585 -0
- package/src/usage/totals.ts +14 -0
- package/src/vision/anthropic-describe.ts +185 -0
- package/src/vision/describe.ts +125 -0
- package/src/vision/index.ts +467 -0
- package/src/web-search/anthropic-executor.ts +189 -0
- package/src/web-search/executor.ts +105 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/index.ts +196 -0
- package/src/web-search/loop.ts +664 -0
- package/src/web-search/parse.ts +220 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/synthetic-tool.ts +47 -0
- package/vendor/ocx-notch/win32-x64/ocx-notch.exe +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import type { Server } from "bun";
|
|
2
|
+
import { bridgeToResponsesSSE, buildResponseJSON, formatErrorResponse, type ResponsesTerminalStatus } from "../../bridge";
|
|
3
|
+
import {
|
|
4
|
+
getConfigPath,
|
|
5
|
+
multiAgentGuidanceEnabled,
|
|
6
|
+
resolveEnvValue,
|
|
7
|
+
} from "../../config";
|
|
8
|
+
import { parseRequest } from "../../responses/parser";
|
|
9
|
+
import { buildCompactV1Output, COMPACT_PROMPT, decodeCompactionSummary, extractCompactUserMessages } from "../../responses/compaction";
|
|
10
|
+
import { FORWARD_HEADERS, sanitizeReasoningInputContent } from "../../adapters/openai-responses";
|
|
11
|
+
import { expandPreviousResponseInput, previousResponseProviderState, rememberResponseState } from "../../responses/state";
|
|
12
|
+
import { routeModel } from "../../router";
|
|
13
|
+
import {
|
|
14
|
+
advanceComboAfterFailure,
|
|
15
|
+
comboDefaultEffort,
|
|
16
|
+
comboFailureDecision,
|
|
17
|
+
comboIdFromRawBody,
|
|
18
|
+
concreteComboRequestBody,
|
|
19
|
+
getCombo,
|
|
20
|
+
isComboTargetInCooldown,
|
|
21
|
+
NoAvailableComboTargetsError,
|
|
22
|
+
noteComboSuccess,
|
|
23
|
+
parseRetryAfterMs,
|
|
24
|
+
pickComboTarget,
|
|
25
|
+
targetKey,
|
|
26
|
+
} from "../../combos";
|
|
27
|
+
import { isInjectionDebugEnabled } from "../../lib/debug-settings";
|
|
28
|
+
import { injectionDebugLog } from "../../lib/injection-debug-log";
|
|
29
|
+
import { modelInList, namespacedToolName } from "../../types";
|
|
30
|
+
import type { AdapterEvent, OcxConfig, OcxParsedRequest, OcxProviderConfig, OcxProviderContinuationState, OcxUsage } from "../../types";
|
|
31
|
+
import {
|
|
32
|
+
forceRefreshOAuthAccessSnapshot,
|
|
33
|
+
getOAuthCredentialApiBaseUrl,
|
|
34
|
+
getOAuthCredentialProjectId,
|
|
35
|
+
getValidAccessTokenSnapshot,
|
|
36
|
+
type OAuthAccessSnapshot,
|
|
37
|
+
UnsupportedOAuthProviderError,
|
|
38
|
+
} from "../../oauth";
|
|
39
|
+
import { buildWebSearchTool, planWebSearch, runWithWebSearch, shouldResolveOpenAiWebSearchSidecar } from "../../web-search";
|
|
40
|
+
import { describeImagesInPlace, planVisionSidecar, shouldResolveOpenAiVisionSidecar, stripImagesInPlace } from "../../vision";
|
|
41
|
+
import { createAdapterEventQueue, preflightAdapterEvents } from "../../adapters/run-turn-queue";
|
|
42
|
+
import {
|
|
43
|
+
applyCodexAuthContextToProvider,
|
|
44
|
+
CodexAccountCooldownError,
|
|
45
|
+
CodexAuthContextError,
|
|
46
|
+
CodexDirectAuthenticationError,
|
|
47
|
+
CodexPoolAuthenticationError,
|
|
48
|
+
CodexThreadAffinityExpiredError,
|
|
49
|
+
headersForCodexAuthContext,
|
|
50
|
+
isCodexAuthContextUsable,
|
|
51
|
+
resolveCodexAuthContext,
|
|
52
|
+
type CodexAuthContext,
|
|
53
|
+
} from "../../codex/auth-context";
|
|
54
|
+
import {
|
|
55
|
+
formatCodexProviderForLog,
|
|
56
|
+
recordCodexUpstreamOutcome,
|
|
57
|
+
type CodexUpstreamOutcome,
|
|
58
|
+
} from "../../codex/routing";
|
|
59
|
+
import { fetchWithResetRetry, fetchWithTransientRetry, applyUpstreamRecoveryInit } from "../../lib/upstream-retry";
|
|
60
|
+
import { ForwardAdmissionCredentialError, validateForwardAdmissionCredential } from "../auth-cors";
|
|
61
|
+
import { listOpenAiForwardSidecarCandidates, resolveFirstUsableOpenAiSidecar, type ResolvedOpenAiForwardSidecar } from "../../providers/openai-sidecar";
|
|
62
|
+
import { isCanonicalOpenAiForwardProvider } from "../../providers/openai-tiers";
|
|
63
|
+
import { slugsEquivalent } from "../../providers/slug-codec";
|
|
64
|
+
import { subagentFallbackGuidanceText } from "../../codex/subagent-model-fallback";
|
|
65
|
+
import { applyOpenAiVirtualModel, resolveOpenAiCompactModel } from "../../providers/openai-virtual-models";
|
|
66
|
+
import { isUsageDebugEnabled } from "../../usage/debug";
|
|
67
|
+
import { readJsonRequestBody, DecompressedBodyTooLargeError, UnsupportedContentEncodingError } from "../request-decompress";
|
|
68
|
+
import { resolveAdapter, resolveWireProtocolOverride } from "../adapter-resolve";
|
|
69
|
+
import { hasKeyPoolFailover, rotateProviderTransportOn429 } from "../../providers/key-failover";
|
|
70
|
+
import { shouldAttemptImageTierRetry } from "../image-retry";
|
|
71
|
+
import { resolveProviderTransport } from "../../providers/xai-transport";
|
|
72
|
+
import type { WsData } from "../ws-bridge";
|
|
73
|
+
import { registerTurn, trackStreamLifetime, unregisterTurn } from "../lifecycle";
|
|
74
|
+
import { redactSecretString } from "../../lib/redact";
|
|
75
|
+
import { readBoundedResponseBody } from "../../lib/bounded-body";
|
|
76
|
+
import { supportedLadderFor } from "../effort-policy";
|
|
77
|
+
import {
|
|
78
|
+
beginRequestAttempt,
|
|
79
|
+
catalogModelSupportsServiceTier,
|
|
80
|
+
finishRequestAttempt,
|
|
81
|
+
inspectResponseLogJson,
|
|
82
|
+
noteAttemptSend,
|
|
83
|
+
readConfiguredCodexServiceTier,
|
|
84
|
+
requestLogSpeedLabel,
|
|
85
|
+
sealRequestAttemptIdentity,
|
|
86
|
+
usageFromResponsesPayload,
|
|
87
|
+
type RequestLogContext,
|
|
88
|
+
} from "../request-log";
|
|
89
|
+
import type { AttemptRecoveryKind } from "../../usage/log";
|
|
90
|
+
import {
|
|
91
|
+
consumeForInspection,
|
|
92
|
+
consumeForResponseLogMetadata,
|
|
93
|
+
markNativePassthroughSseResponse,
|
|
94
|
+
relaySseWithFailedTail,
|
|
95
|
+
relayWithAbort,
|
|
96
|
+
sanitizePassthroughHeaders,
|
|
97
|
+
} from "../relay";
|
|
98
|
+
import { hasResponsesItemIdRepair, relaySseWithResponsesItemIdRepair } from "../responses-item-id-repair";
|
|
99
|
+
import type { EffectiveSubagentRoster, SpawnAgentSurface } from "../../codex/catalog";
|
|
100
|
+
import type { TranslatorBudget } from "../../lib/translator-budget";
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
export function buildToolBridgeMaps(parsed: OcxParsedRequest, budget?: TranslatorBudget): {
|
|
104
|
+
toolNsMap: Map<string, { namespace: string; name: string }>;
|
|
105
|
+
freeformToolNames: Set<string>;
|
|
106
|
+
toolSearchToolNames: Set<string>;
|
|
107
|
+
} {
|
|
108
|
+
const toolNsMap = new Map<string, { namespace: string; name: string }>();
|
|
109
|
+
const freeformToolNames = new Set<string>();
|
|
110
|
+
const toolSearchToolNames = new Set<string>();
|
|
111
|
+
for (const t of parsed.context.tools ?? []) {
|
|
112
|
+
if (t.namespace) {
|
|
113
|
+
const wireName = namespacedToolName(t.namespace, t.name);
|
|
114
|
+
budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([wireName, t.namespace, t.name])).byteLength, { kind: "retained_collectors" });
|
|
115
|
+
toolNsMap.set(wireName, { namespace: t.namespace, name: t.name });
|
|
116
|
+
}
|
|
117
|
+
if (t.freeform) {
|
|
118
|
+
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
119
|
+
freeformToolNames.add(t.name);
|
|
120
|
+
}
|
|
121
|
+
if (t.toolSearch) {
|
|
122
|
+
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
123
|
+
toolSearchToolNames.add(t.name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { toolNsMap, freeformToolNames, toolSearchToolNames };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
export const PROACTIVE_MULTI_AGENT_MODE_TEXT = [
|
|
132
|
+
"Proactive multi-agent delegation is active.",
|
|
133
|
+
"Any earlier instruction requiring an explicit user request before spawning sub-agents no longer applies.",
|
|
134
|
+
"Delegate independent sub-tasks to sub-agents whenever parallel work would materially improve speed or quality — do not serialize work that can run concurrently.",
|
|
135
|
+
"Each sub-agent runs in its own context and can use all available tools; prefer spawning specialists over doing everything yourself.",
|
|
136
|
+
"This mode remains active until a later multi-agent mode developer message changes it.",
|
|
137
|
+
].join(" ");
|
|
138
|
+
|
|
139
|
+
export function isV1CollabSurface(parsed: OcxParsedRequest): boolean {
|
|
140
|
+
return collabSurface(parsed) === "v1";
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
export function collabSurface(parsed: OcxParsedRequest): "v1" | "v2" | null {
|
|
146
|
+
let namespacedSpawn = false;
|
|
147
|
+
let flatSpawn = false;
|
|
148
|
+
let v1Only = false;
|
|
149
|
+
let v2Only = false;
|
|
150
|
+
for (const t of parsed.context.tools ?? []) {
|
|
151
|
+
if (t.name === "spawn_agent") {
|
|
152
|
+
if (t.namespace) namespacedSpawn = true;
|
|
153
|
+
else flatSpawn = true;
|
|
154
|
+
} else if (t.name === "send_input" || t.name === "resume_agent" || t.name === "close_agent") {
|
|
155
|
+
v1Only = true;
|
|
156
|
+
} else if (t.name === "send_message" || t.name === "followup_task" || t.name === "interrupt_agent" || t.name === "list_agents") {
|
|
157
|
+
v2Only = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!namespacedSpawn && !flatSpawn) return null; // no spawn_agent -> no collab surface
|
|
161
|
+
if (namespacedSpawn && flatSpawn) return null; // contradictory spawn shapes
|
|
162
|
+
if (v1Only && v2Only) return null; // contradictory companions
|
|
163
|
+
if (v1Only) return "v1";
|
|
164
|
+
if (v2Only) return "v2";
|
|
165
|
+
return namespacedSpawn ? "v1" : "v2"; // companionless fallbacks (legacy defaults)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
export interface MultiAgentGuidanceOptions {
|
|
171
|
+
multiAgentGuidanceEnabled?: boolean;
|
|
172
|
+
injectionModel?: string;
|
|
173
|
+
injectionEffort?: string;
|
|
174
|
+
subagentModels?: string[];
|
|
175
|
+
subagentModelFallback?: string[];
|
|
176
|
+
injectionPrompt?: string;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
export interface MultiAgentGuidanceDeps {
|
|
182
|
+
resolveEffectiveSubagentRoster?: (
|
|
183
|
+
configuredModels: readonly string[],
|
|
184
|
+
surface: SpawnAgentSurface,
|
|
185
|
+
) => EffectiveSubagentRoster | Promise<EffectiveSubagentRoster>;
|
|
186
|
+
collectCatalogState?: () => { state: "fresh" | "stale" | "not_running" | "unknown" };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function defaultCollectCatalogState(): Promise<{ state: "fresh" | "stale" | "not_running" | "unknown" }> {
|
|
190
|
+
// Explicit override for tests and diagnostics: process state is global and
|
|
191
|
+
// would otherwise leak the host machine's app-server into hermetic tests.
|
|
192
|
+
const override = process.env.OPENCODEX_APP_SERVER_CATALOG_STATE_OVERRIDE;
|
|
193
|
+
if (override === "fresh" || override === "stale" || override === "not_running" || override === "unknown") {
|
|
194
|
+
return { state: override };
|
|
195
|
+
}
|
|
196
|
+
const { collectCodexAppServerCatalogState } = await import("../../codex/app-server-processes");
|
|
197
|
+
return collectCodexAppServerCatalogState();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
export async function resolveEffectiveSubagentRoster(
|
|
203
|
+
configuredModels: readonly string[],
|
|
204
|
+
surface: SpawnAgentSurface,
|
|
205
|
+
): Promise<EffectiveSubagentRoster> {
|
|
206
|
+
const { effectiveSubagentRoster } = await import("../../codex/catalog");
|
|
207
|
+
return effectiveSubagentRoster(configuredModels, surface);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
export async function multiAgentGuidanceText(
|
|
213
|
+
parsed: OcxParsedRequest,
|
|
214
|
+
options: MultiAgentGuidanceOptions = {},
|
|
215
|
+
deps: MultiAgentGuidanceDeps = {},
|
|
216
|
+
): Promise<string | null> {
|
|
217
|
+
if (options.multiAgentGuidanceEnabled === false) return null;
|
|
218
|
+
const {
|
|
219
|
+
injectionModel,
|
|
220
|
+
injectionEffort,
|
|
221
|
+
subagentModels,
|
|
222
|
+
subagentModelFallback,
|
|
223
|
+
injectionPrompt,
|
|
224
|
+
} = options;
|
|
225
|
+
const surface = collabSurface(parsed);
|
|
226
|
+
if (surface === null) return null;
|
|
227
|
+
|
|
228
|
+
if (surface === "v2") {
|
|
229
|
+
// #857: the disk catalog may be newer than the running app-server's
|
|
230
|
+
// in-memory copy. Advertising preferred models or a roster the running
|
|
231
|
+
// Codex cannot actually spawn makes spawn_agent reject the override, so
|
|
232
|
+
// suppress positive model claims while the state is stale or unknown.
|
|
233
|
+
const catalogState = await (deps.collectCatalogState ?? defaultCollectCatalogState)();
|
|
234
|
+
if (catalogState.state === "stale" || catalogState.state === "unknown") {
|
|
235
|
+
return "<multi_agent_mode>The model catalog changed after Codex started; do not set "
|
|
236
|
+
+ "model or reasoning_effort overrides until Codex restarts.</multi_agent_mode>";
|
|
237
|
+
}
|
|
238
|
+
// codex-rs supplies the Proactive text on v2; the proxy only adds model-designation
|
|
239
|
+
// guidance, and only when there is something concrete to designate: a configured
|
|
240
|
+
// injectionModel and/or a roster entry that resolves in the injected catalog.
|
|
241
|
+
const configuredForGuidance = [
|
|
242
|
+
...(subagentModels ?? []),
|
|
243
|
+
...(injectionModel ? [injectionModel] : []),
|
|
244
|
+
];
|
|
245
|
+
const resolveRoster = deps.resolveEffectiveSubagentRoster ?? resolveEffectiveSubagentRoster;
|
|
246
|
+
const effective = await resolveRoster(configuredForGuidance, "v2");
|
|
247
|
+
const rosterModels = effective.advertised.filter(candidate =>
|
|
248
|
+
(subagentModels ?? []).some(model => slugsEquivalent(model, candidate.model))
|
|
249
|
+
);
|
|
250
|
+
const roster = subagentRosterText(rosterModels);
|
|
251
|
+
const preferred = injectionModel
|
|
252
|
+
? effective.candidates.find(candidate => slugsEquivalent(injectionModel, candidate.model))
|
|
253
|
+
: undefined;
|
|
254
|
+
|
|
255
|
+
if (isInjectionDebugEnabled() && effective.excluded.length > 0) {
|
|
256
|
+
injectionDebugLog(`[opencodex] multi-agent guidance excluded: ${effective.excluded
|
|
257
|
+
.map(item => `${item.configured}:${item.reason}`)
|
|
258
|
+
.join(", ")}`);
|
|
259
|
+
}
|
|
260
|
+
const fallbackGuidance = subagentFallbackGuidanceText({ subagentModelFallback } as OcxConfig);
|
|
261
|
+
if (!injectionModel && roster === "" && fallbackGuidance === "") return null;
|
|
262
|
+
if (injectionPrompt) {
|
|
263
|
+
return `<multi_agent_mode>${applyInjectionPlaceholders(injectionPrompt, injectionModel, injectionEffort, roster, fallbackGuidance)}</multi_agent_mode>`;
|
|
264
|
+
}
|
|
265
|
+
if (!preferred && roster === "" && fallbackGuidance === "") return null;
|
|
266
|
+
let text = "When the active spawn_agent tool supports optional \"model\" or \"reasoning_effort\" overrides, "
|
|
267
|
+
+ "use only models listed for this collaboration surface. "
|
|
268
|
+
+ "When setting either override, set fork_turns to \"none\" "
|
|
269
|
+
+ "(or a positive turn count such as \"3\"; full-history forks reject overrides) "
|
|
270
|
+
+ "and make the task message self-contained.";
|
|
271
|
+
if (preferred) {
|
|
272
|
+
text += ` Preferred sub-agent: model "${preferred.model}"`
|
|
273
|
+
+ (injectionEffort ? `, reasoning_effort "${injectionEffort}"` : "")
|
|
274
|
+
+ " — use it unless the user names another.";
|
|
275
|
+
}
|
|
276
|
+
text += fallbackGuidance;
|
|
277
|
+
text += roster;
|
|
278
|
+
if (text.length > V2_GUIDANCE_CHAR_BUDGET) {
|
|
279
|
+
// Roster is the only unbounded part — drop it before breaking the budget.
|
|
280
|
+
text = text.slice(0, text.length - roster.length);
|
|
281
|
+
}
|
|
282
|
+
return `<multi_agent_mode>${text}</multi_agent_mode>`;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const effort = parsed.options.reasoning;
|
|
286
|
+
// v1 keeps only the upstream-parity behavior: Proactive text at the top tier
|
|
287
|
+
// (ultra arrives as max on the wire). No designation/roster payload here.
|
|
288
|
+
if (effort !== "max" && effort !== "ultra") return null;
|
|
289
|
+
return `<multi_agent_mode>${PROACTIVE_MULTI_AGENT_MODE_TEXT}</multi_agent_mode>`;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
export const V2_GUIDANCE_CHAR_BUDGET = 700;
|
|
295
|
+
|
|
296
|
+
export function applyInjectionPlaceholders(prompt: string, model?: string, effort?: string, roster?: string, fallback?: string): string {
|
|
297
|
+
return prompt
|
|
298
|
+
.replaceAll("{{model}}", model ?? "")
|
|
299
|
+
.replaceAll("{{effort}}", effort ?? "")
|
|
300
|
+
.replaceAll("{{roster}}", roster ?? "")
|
|
301
|
+
.replaceAll("{{fallback}}", fallback ?? "");
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
export function subagentRosterText(models: Array<{ model: string; efforts: string[] }>): string {
|
|
307
|
+
if (models.length === 0) return "";
|
|
308
|
+
const ladders = new Set(models.map(model => model.efforts.join("/")));
|
|
309
|
+
if (!ladders.has("") && ladders.size === 1) {
|
|
310
|
+
return ` Available models (reasoning_effort ${[...ladders][0]}): ${models
|
|
311
|
+
.map(model => `"${model.model}"`)
|
|
312
|
+
.join(", ")}.`;
|
|
313
|
+
}
|
|
314
|
+
const entries = models.map(model => model.efforts.length > 0
|
|
315
|
+
? `"${model.model}" (${model.efforts.join("/")})`
|
|
316
|
+
: `"${model.model}"`);
|
|
317
|
+
return ` Available models (valid reasoning_effort): ${entries.join(", ")}.`;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
323
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function isGeneratedDeveloperItem(item: unknown, text: string): boolean {
|
|
327
|
+
if (!isRecord(item) || item.type !== "message" || item.role !== "developer") return false;
|
|
328
|
+
if (!Array.isArray(item.content) || item.content.length !== 1) return false;
|
|
329
|
+
const [part] = item.content;
|
|
330
|
+
return isRecord(part) && part.type === "input_text" && part.text === text;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export function injectDeveloperMessage(parsed: OcxParsedRequest, text: string): void {
|
|
334
|
+
const raw = parsed._rawBody as { input?: unknown } | undefined;
|
|
335
|
+
const devItem = { type: "message", role: "developer", content: [{ type: "input_text", text }] };
|
|
336
|
+
if (raw && Array.isArray(raw.input)) {
|
|
337
|
+
const replayPrefixLen = Math.min(parsed._replayPrefixLen ?? 0, raw.input.length);
|
|
338
|
+
if (raw.input.slice(0, replayPrefixLen).some(item => isGeneratedDeveloperItem(item, text))) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
parsed.context.messages.push({ role: "developer", content: text, timestamp: Date.now() });
|
|
344
|
+
if (raw && Array.isArray(raw.input)) {
|
|
345
|
+
// compaction_trigger must remain the final input item (codex-rs + ChatGPT backend both
|
|
346
|
+
// validate this). Insert the developer message BEFORE the trigger when present.
|
|
347
|
+
const last = raw.input[raw.input.length - 1];
|
|
348
|
+
if (last && typeof last === "object" && (last as { type?: string }).type === "compaction_trigger") {
|
|
349
|
+
raw.input.splice(raw.input.length - 1, 0, devItem);
|
|
350
|
+
} else {
|
|
351
|
+
raw.input.push(devItem);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|