@yansigit/opencodex 2.31.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/AGENTS_INSTALL.md +109 -0
- package/LICENSE +21 -0
- package/README.md +303 -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 +587 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
- package/gui/dist/assets/index-CGoDO3uO.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/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 +108 -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-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +1327 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +121 -0
- package/src/adapters/client-fingerprint.ts +65 -0
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +288 -0
- package/src/adapters/cursor/discovery.ts +333 -0
- package/src/adapters/cursor/effort-map.ts +151 -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/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +269 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1653 -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 +76 -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 +547 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +663 -0
- package/src/adapters/cursor/protobuf-events.ts +1381 -0
- package/src/adapters/cursor/protobuf-request.ts +1032 -0
- package/src/adapters/cursor/request-builder.ts +461 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +735 -0
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +79 -0
- package/src/adapters/cursor/types.ts +79 -0
- package/src/adapters/cursor.ts +322 -0
- package/src/adapters/google-antigravity-hosts.ts +48 -0
- package/src/adapters/google-antigravity-replay.ts +827 -0
- package/src/adapters/google-antigravity-tools.ts +105 -0
- package/src/adapters/google-antigravity-wire.ts +141 -0
- package/src/adapters/google-errors.ts +92 -0
- package/src/adapters/google-http.ts +460 -0
- package/src/adapters/google-tool-schema.ts +238 -0
- package/src/adapters/google-truncation.ts +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +1377 -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 +112 -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 +1936 -0
- package/src/adapters/mimo-free.ts +280 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1980 -0
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1911 -0
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +154 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +1986 -0
- package/src/chat/inbound.ts +319 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +266 -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 +205 -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 +615 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +107 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +578 -0
- package/src/claude/model-info.ts +174 -0
- package/src/claude/outbound.ts +926 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +302 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +737 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +299 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +290 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +213 -0
- package/src/cli/claude.ts +355 -0
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +47 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +127 -0
- package/src/cli/config-command.ts +209 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/dispatch.ts +585 -0
- package/src/cli/doctor.ts +1202 -0
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +213 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +973 -0
- package/src/cli/init.ts +211 -0
- package/src/cli/integrations.ts +260 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +245 -0
- package/src/cli/models.ts +422 -0
- package/src/cli/observe.ts +206 -0
- package/src/cli/opencode.ts +588 -0
- package/src/cli/provider-replit.ts +232 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +492 -0
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +422 -0
- package/src/cli/replit-gateway-key-input.ts +138 -0
- package/src/cli/root.ts +86 -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 +328 -0
- package/src/cli/system-command.ts +112 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +199 -0
- package/src/cli/v2.ts +268 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1704 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +47 -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 +544 -0
- package/src/codex/account-usability.ts +43 -0
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/agent-roles-sync.ts +225 -0
- package/src/codex/agent-roles.ts +238 -0
- package/src/codex/app-server-processes.ts +1143 -0
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +2147 -0
- package/src/codex/auth-collision.ts +109 -0
- package/src/codex/auth-context.ts +665 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +436 -0
- package/src/codex/catalog/bundled.ts +549 -0
- package/src/codex/catalog/effort.ts +446 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +664 -0
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +650 -0
- package/src/codex/catalog/provider-fetch.ts +2064 -0
- package/src/codex/catalog/sync.ts +1883 -0
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +14 -0
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -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/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1566 -0
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +108 -0
- package/src/codex/history-provider.ts +979 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1733 -0
- package/src/codex/injected-marker.ts +106 -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 +80 -0
- package/src/codex/journal.ts +225 -0
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +56 -0
- package/src/codex/main-account.ts +68 -0
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +273 -0
- package/src/codex/model-entitlements.ts +353 -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 +178 -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 +492 -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 +682 -0
- package/src/codex/paths.ts +144 -0
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +425 -0
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +573 -0
- package/src/codex/refresh.ts +62 -0
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +1888 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +2170 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +784 -0
- package/src/codex/sync.ts +319 -0
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +298 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +160 -0
- package/src/combos/index.ts +45 -0
- package/src/combos/request.ts +94 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +398 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +4041 -0
- package/src/fork/register.ts +3 -0
- package/src/generated/compatibility-version.json +3116 -0
- package/src/generated/model-metadata.ts +106 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +530 -0
- package/src/grok/inspect.ts +45 -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 +955 -0
- package/src/images/plan.ts +143 -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 +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -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 +195 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +346 -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 +130 -0
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +364 -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 +380 -0
- package/src/lib/errors.ts +406 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +270 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-outbound.ts +210 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +521 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +61 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +119 -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 +90 -0
- package/src/lib/token-estimate.ts +86 -0
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +400 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +392 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-atomic-replace.ts +156 -0
- package/src/lib/windows-elevation.ts +773 -0
- package/src/lib/windows-secret-acl.ts +854 -0
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +403 -0
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic-routing.ts +594 -0
- package/src/oauth/anthropic.ts +188 -0
- package/src/oauth/antigravity-routing.ts +151 -0
- package/src/oauth/callback-server.ts +300 -0
- package/src/oauth/chatgpt.ts +161 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +252 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +262 -0
- package/src/oauth/health.ts +407 -0
- package/src/oauth/index.ts +1504 -0
- package/src/oauth/key-providers.ts +124 -0
- package/src/oauth/kimi.ts +227 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -0
- package/src/oauth/local-token-detect.ts +130 -0
- package/src/oauth/log.ts +50 -0
- package/src/oauth/login-cli.ts +223 -0
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +728 -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 +695 -0
- package/src/providers/antigravity-quota.ts +216 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +74 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +82 -0
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +586 -0
- package/src/providers/fastwire.ts +501 -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 +449 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +243 -0
- package/src/providers/openai-tier-startup.ts +56 -0
- package/src/providers/openai-tiers.ts +423 -0
- package/src/providers/openai-virtual-models.ts +83 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +185 -0
- package/src/providers/quota.ts +2345 -0
- package/src/providers/registry.ts +2918 -0
- package/src/providers/replit/constants.ts +27 -0
- package/src/providers/replit/derive.ts +85 -0
- package/src/providers/replit/headers.ts +28 -0
- package/src/providers/replit/origin.ts +55 -0
- package/src/providers/replit/pair-install-response.ts +72 -0
- package/src/providers/replit/probe.ts +199 -0
- package/src/providers/replit/setup.ts +350 -0
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +103 -0
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +148 -0
- package/src/reasoning-effort.ts +183 -0
- package/src/responses/compaction.ts +142 -0
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +838 -0
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +165 -0
- package/src/responses/spill-store.ts +459 -0
- package/src/responses/state.ts +1433 -0
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +761 -0
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -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 +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +53 -0
- package/src/server/auth-cors.ts +751 -0
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +442 -0
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +1030 -0
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +190 -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 +568 -0
- package/src/server/index.ts +1813 -0
- package/src/server/lifecycle.ts +498 -0
- package/src/server/live.ts +717 -0
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +1433 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +193 -0
- package/src/server/management/body.ts +41 -0
- package/src/server/management/combo-routes.ts +263 -0
- package/src/server/management/config-routes.ts +835 -0
- package/src/server/management/context.ts +113 -0
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +586 -0
- package/src/server/management/model-routes.ts +560 -0
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +637 -0
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +1033 -0
- package/src/server/management/replit-provider-routes.ts +86 -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 +385 -0
- package/src/server/management/shared.ts +286 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +435 -0
- package/src/server/management/system-routes.ts +194 -0
- package/src/server/management/usage-summary-cache.ts +94 -0
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +314 -0
- package/src/server/management-auth.ts +482 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +328 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1209 -0
- package/src/server/request-decompress.ts +239 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1259 -0
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +551 -0
- package/src/server/responses/compact.ts +771 -0
- package/src/server/responses/core.ts +5389 -0
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +331 -0
- package/src/server/responses/fetch-helpers.ts +232 -0
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +251 -0
- package/src/server/responses/upstream-error.ts +53 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -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 +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +25 -0
- package/src/server/search.ts +201 -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 +315 -0
- package/src/server/startup-health-cache.ts +131 -0
- package/src/server/system-env.ts +484 -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 +472 -0
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +3575 -0
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -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 +757 -0
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +876 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +106 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +415 -0
- package/src/update/job.ts +1887 -0
- package/src/update/notify.ts +263 -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/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -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 +625 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +416 -0
- package/src/usage/log.ts +1223 -0
- package/src/usage/summary.ts +753 -0
- package/src/usage/totals.ts +14 -0
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +189 -0
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +131 -0
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +681 -0
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +195 -0
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +113 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +331 -0
- package/src/web-search/loop.ts +896 -0
- package/src/web-search/parse.ts +315 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/synthetic-tool.ts +47 -0
- package/src/web-search/xai-executor.ts +219 -0
|
@@ -0,0 +1,551 @@
|
|
|
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, toolChoiceToolPredicate } from "../../types";
|
|
30
|
+
import type { AdapterEvent, OcxConfig, OcxParsedRequest, OcxProviderConfig, OcxProviderContinuationState, OcxSubagentRole, 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 { compactRolesCatalog, enabledSubagentRoles } from "../../codex/agent-roles";
|
|
66
|
+
import { applyOpenAiVirtualModel, resolveOpenAiCompactModel } from "../../providers/openai-virtual-models";
|
|
67
|
+
import { isUsageDebugEnabled } from "../../usage/debug";
|
|
68
|
+
import { readJsonRequestBody, DecompressedBodyTooLargeError, UnsupportedContentEncodingError } from "../request-decompress";
|
|
69
|
+
import { resolveAdapter, resolveWireProtocolOverride } from "../adapter-resolve";
|
|
70
|
+
import { hasKeyPoolFailover, rotateProviderTransportOn429 } from "../../providers/key-failover";
|
|
71
|
+
import { shouldAttemptImageTierRetry } from "../image-retry";
|
|
72
|
+
import { resolveProviderTransport } from "../../providers/xai-transport";
|
|
73
|
+
import type { WsData } from "../ws-bridge";
|
|
74
|
+
import { registerTurn, trackStreamLifetime, unregisterTurn } from "../lifecycle";
|
|
75
|
+
import { redactSecretString } from "../../lib/redact";
|
|
76
|
+
import { readBoundedResponseBody } from "../../lib/bounded-body";
|
|
77
|
+
import { supportedLadderFor } from "../effort-policy";
|
|
78
|
+
import {
|
|
79
|
+
beginRequestAttempt,
|
|
80
|
+
catalogModelSupportsServiceTier,
|
|
81
|
+
finishRequestAttempt,
|
|
82
|
+
inspectResponseLogJson,
|
|
83
|
+
noteAttemptSend,
|
|
84
|
+
readConfiguredCodexServiceTier,
|
|
85
|
+
requestLogSpeedLabel,
|
|
86
|
+
sealRequestAttemptIdentity,
|
|
87
|
+
usageFromResponsesPayload,
|
|
88
|
+
type RequestLogContext,
|
|
89
|
+
} from "../request-log";
|
|
90
|
+
import type { AttemptRecoveryKind } from "../../usage/log";
|
|
91
|
+
import {
|
|
92
|
+
consumeForInspection,
|
|
93
|
+
consumeForResponseLogMetadata,
|
|
94
|
+
markNativePassthroughSseResponse,
|
|
95
|
+
relaySseWithFailedTail,
|
|
96
|
+
relayWithAbort,
|
|
97
|
+
sanitizePassthroughHeaders,
|
|
98
|
+
} from "../relay";
|
|
99
|
+
import { hasResponsesItemIdRepair, relaySseWithResponsesItemIdRepair } from "../responses-item-id-repair";
|
|
100
|
+
import type { EffectiveSubagentModel, EffectiveSubagentRoster, SpawnAgentSurface } from "../../codex/catalog";
|
|
101
|
+
import type { TranslatorBudget } from "../../lib/translator-budget";
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
export function buildToolBridgeMaps(parsed: OcxParsedRequest, budget?: TranslatorBudget): {
|
|
105
|
+
toolNsMap: Map<string, { namespace: string; name: string; freeform?: true }>;
|
|
106
|
+
declaredToolNames: Set<string>;
|
|
107
|
+
/** Declared parameter schema per request-visible tool name (#1611 integer repair). */
|
|
108
|
+
toolParameterSchemas: Map<string, Record<string, unknown>>;
|
|
109
|
+
freeformToolNames: Set<string>;
|
|
110
|
+
toolSearchToolNames: Set<string>;
|
|
111
|
+
} {
|
|
112
|
+
const toolNsMap = new Map<string, { namespace: string; name: string; freeform?: true }>();
|
|
113
|
+
const declaredToolNames = new Set<string>();
|
|
114
|
+
const toolParameterSchemas = new Map<string, Record<string, unknown>>();
|
|
115
|
+
const freeformToolNames = new Set<string>();
|
|
116
|
+
const toolSearchToolNames = new Set<string>();
|
|
117
|
+
const requestedTools = parsed.context.tools ?? [];
|
|
118
|
+
const toolAllowed = toolChoiceToolPredicate(parsed.options.toolChoice, requestedTools);
|
|
119
|
+
const authorizedTools = requestedTools.filter(toolAllowed);
|
|
120
|
+
for (const t of authorizedTools) {
|
|
121
|
+
// Upstream output is untrusted: only restore calls for tools the caller authorized.
|
|
122
|
+
const wireName = namespacedToolName(t.namespace, t.name);
|
|
123
|
+
budget?.chargeRetained(new TextEncoder().encode(wireName).byteLength, { kind: "retained_collectors" });
|
|
124
|
+
declaredToolNames.add(wireName);
|
|
125
|
+
// Retained by reference (the schema is already resident in parsed.context.tools),
|
|
126
|
+
// so this adds a map entry rather than a copy of every tool's parameters.
|
|
127
|
+
if (t.parameters && typeof t.parameters === "object") toolParameterSchemas.set(wireName, t.parameters);
|
|
128
|
+
if (t.namespace) {
|
|
129
|
+
budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([wireName, t.namespace, t.name])).byteLength, { kind: "retained_collectors" });
|
|
130
|
+
toolNsMap.set(wireName, { namespace: t.namespace, name: t.name, ...(t.freeform ? { freeform: true } : {}) });
|
|
131
|
+
}
|
|
132
|
+
if (t.freeform) {
|
|
133
|
+
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
134
|
+
freeformToolNames.add(t.name);
|
|
135
|
+
}
|
|
136
|
+
if (t.toolSearch) {
|
|
137
|
+
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
138
|
+
toolSearchToolNames.add(t.name);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Some routed providers echo a bare tool_choice selector instead of the flattened catalog
|
|
142
|
+
// name. Accept only selectors the client actually sent and only when the full request catalog
|
|
143
|
+
// contains one tool with that logical name.
|
|
144
|
+
const choice = parsed.options.toolChoice;
|
|
145
|
+
const bareChoiceNames = new Set(
|
|
146
|
+
choice && typeof choice === "object"
|
|
147
|
+
? ("allowedTools" in choice ? choice.allowedTools : [choice.name])
|
|
148
|
+
: [],
|
|
149
|
+
);
|
|
150
|
+
const bareNameCounts = new Map<string, number>();
|
|
151
|
+
for (const t of requestedTools) {
|
|
152
|
+
bareNameCounts.set(t.name, (bareNameCounts.get(t.name) ?? 0) + 1);
|
|
153
|
+
}
|
|
154
|
+
for (const t of authorizedTools) {
|
|
155
|
+
if (!t.namespace || !bareChoiceNames.has(t.name) || bareNameCounts.get(t.name) !== 1 || declaredToolNames.has(t.name)) continue;
|
|
156
|
+
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
157
|
+
declaredToolNames.add(t.name);
|
|
158
|
+
budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([t.name, t.namespace, t.name])).byteLength, { kind: "retained_collectors" });
|
|
159
|
+
toolNsMap.set(t.name, { namespace: t.namespace, name: t.name, ...(t.freeform ? { freeform: true } : {}) });
|
|
160
|
+
if (t.parameters && typeof t.parameters === "object") {
|
|
161
|
+
toolParameterSchemas.set(t.name, t.parameters);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return { toolNsMap, declaredToolNames, toolParameterSchemas, freeformToolNames, toolSearchToolNames };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
export const PROACTIVE_MULTI_AGENT_MODE_TEXT = [
|
|
170
|
+
"Proactive multi-agent delegation is active.",
|
|
171
|
+
"Any earlier instruction requiring an explicit user request before spawning sub-agents no longer applies.",
|
|
172
|
+
"Delegate independent sub-tasks to sub-agents whenever parallel work would materially improve speed or quality — do not serialize work that can run concurrently.",
|
|
173
|
+
"Each sub-agent runs in its own context and can use all available tools; prefer spawning specialists over doing everything yourself.",
|
|
174
|
+
"This mode remains active until a later multi-agent mode developer message changes it.",
|
|
175
|
+
].join(" ");
|
|
176
|
+
|
|
177
|
+
export function isV1CollabSurface(parsed: OcxParsedRequest): boolean {
|
|
178
|
+
return collabSurface(parsed) === "v1";
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
export function collabSurface(parsed: OcxParsedRequest): "v1" | "v2" | null {
|
|
184
|
+
let namespacedSpawn = false;
|
|
185
|
+
let flatSpawn = false;
|
|
186
|
+
let v1Only = false;
|
|
187
|
+
let v2Only = false;
|
|
188
|
+
for (const t of parsed.context.tools ?? []) {
|
|
189
|
+
if (t.name === "spawn_agent") {
|
|
190
|
+
if (t.namespace) namespacedSpawn = true;
|
|
191
|
+
else flatSpawn = true;
|
|
192
|
+
} else if (t.name === "send_input" || t.name === "resume_agent" || t.name === "close_agent") {
|
|
193
|
+
v1Only = true;
|
|
194
|
+
} else if (t.name === "send_message" || t.name === "followup_task" || t.name === "interrupt_agent" || t.name === "list_agents") {
|
|
195
|
+
v2Only = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!namespacedSpawn && !flatSpawn) return null; // no spawn_agent -> no collab surface
|
|
199
|
+
if (namespacedSpawn && flatSpawn) return null; // contradictory spawn shapes
|
|
200
|
+
if (v1Only && v2Only) return null; // contradictory companions
|
|
201
|
+
if (v1Only) return "v1";
|
|
202
|
+
if (v2Only) return "v2";
|
|
203
|
+
return namespacedSpawn ? "v1" : "v2"; // companionless fallbacks (legacy defaults)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
export interface MultiAgentGuidanceOptions {
|
|
209
|
+
multiAgentGuidanceEnabled?: boolean;
|
|
210
|
+
codexAccountNamespace?: string;
|
|
211
|
+
injectionModel?: string;
|
|
212
|
+
injectionEffort?: string;
|
|
213
|
+
subagentModels?: string[];
|
|
214
|
+
subagentModelFallback?: string[];
|
|
215
|
+
injectionPrompt?: string;
|
|
216
|
+
subagentRoles?: OcxSubagentRole[];
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
export interface MultiAgentGuidanceDeps {
|
|
222
|
+
resolveEffectiveSubagentRoster?: (
|
|
223
|
+
configuredModels: readonly string[],
|
|
224
|
+
surface: SpawnAgentSurface,
|
|
225
|
+
) => EffectiveSubagentRoster | Promise<EffectiveSubagentRoster>;
|
|
226
|
+
collectCatalogState?: () => { state: "fresh" | "stale" | "not_running" | "unknown" }
|
|
227
|
+
| Promise<{ state: "fresh" | "stale" | "not_running" | "unknown" }>;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async function defaultCollectCatalogState(): Promise<{ state: "fresh" | "stale" | "not_running" | "unknown" }> {
|
|
231
|
+
// Explicit override for tests and diagnostics: process state is global and
|
|
232
|
+
// would otherwise leak the host machine's app-server into hermetic tests.
|
|
233
|
+
const override = process.env.OPENCODEX_APP_SERVER_CATALOG_STATE_OVERRIDE;
|
|
234
|
+
if (override === "fresh" || override === "stale" || override === "not_running" || override === "unknown") {
|
|
235
|
+
return { state: override };
|
|
236
|
+
}
|
|
237
|
+
const { collectCodexAppServerCatalogStateForRequest } = await import("../../codex/app-server-processes");
|
|
238
|
+
return collectCodexAppServerCatalogStateForRequest();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
export async function resolveEffectiveSubagentRoster(
|
|
244
|
+
configuredModels: readonly string[],
|
|
245
|
+
surface: SpawnAgentSurface,
|
|
246
|
+
): Promise<EffectiveSubagentRoster> {
|
|
247
|
+
const { effectiveSubagentRoster } = await import("../../codex/catalog");
|
|
248
|
+
return effectiveSubagentRoster(configuredModels, surface);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Reuse one parsed catalog snapshot across every roster projection for this request. */
|
|
252
|
+
async function createRequestScopedSubagentRosterResolver(): Promise<NonNullable<
|
|
253
|
+
MultiAgentGuidanceDeps["resolveEffectiveSubagentRoster"]
|
|
254
|
+
>> {
|
|
255
|
+
const { effectiveSubagentRoster, readCatalog, readCodexCatalogPath } = await import("../../codex/catalog");
|
|
256
|
+
const catalogEntries = readCatalog(readCodexCatalogPath())?.models ?? [];
|
|
257
|
+
return (configuredModels, surface) =>
|
|
258
|
+
effectiveSubagentRoster(configuredModels, surface, catalogEntries);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
export async function multiAgentGuidanceText(
|
|
264
|
+
parsed: OcxParsedRequest,
|
|
265
|
+
options: MultiAgentGuidanceOptions = {},
|
|
266
|
+
deps: MultiAgentGuidanceDeps = {},
|
|
267
|
+
): Promise<string | null> {
|
|
268
|
+
if (options.multiAgentGuidanceEnabled === false) return null;
|
|
269
|
+
const {
|
|
270
|
+
injectionModel,
|
|
271
|
+
injectionEffort,
|
|
272
|
+
codexAccountNamespace,
|
|
273
|
+
subagentModels,
|
|
274
|
+
subagentModelFallback,
|
|
275
|
+
injectionPrompt,
|
|
276
|
+
subagentRoles,
|
|
277
|
+
} = options;
|
|
278
|
+
const activeAccountNamespace = codexAccountNamespace?.length
|
|
279
|
+
? codexAccountNamespace
|
|
280
|
+
: undefined;
|
|
281
|
+
const surface = collabSurface(parsed);
|
|
282
|
+
if (surface === null) return null;
|
|
283
|
+
|
|
284
|
+
if (surface === "v2") {
|
|
285
|
+
// #857: the disk catalog may be newer than the running app-server's
|
|
286
|
+
// in-memory copy. Advertising preferred models or a roster the running
|
|
287
|
+
// Codex cannot actually spawn makes spawn_agent reject the override, so
|
|
288
|
+
// suppress positive model claims while the state is stale or unknown.
|
|
289
|
+
const catalogState = await (deps.collectCatalogState ?? defaultCollectCatalogState)();
|
|
290
|
+
// #1354 / #1395: `collectCodexAppServerCatalogState()` folds every app-server
|
|
291
|
+
// owned by the current user into ONE global observation, and the inbound
|
|
292
|
+
// request carries no sender PID or catalog fingerprint. So a stale process A
|
|
293
|
+
// makes the global state `stale` even when this request came from a fresh
|
|
294
|
+
// process B, and `unknown` can be reached by a process-enumeration failure
|
|
295
|
+
// that says nothing about any particular server.
|
|
296
|
+
//
|
|
297
|
+
// Emitting "do not set model or reasoning_effort overrides" off that global
|
|
298
|
+
// observation prohibits options the active `spawn_agent` tool legitimately
|
|
299
|
+
// advertises, for a request we cannot attribute to the stale process. The
|
|
300
|
+
// safe behaviour is to withhold OpenCodex's own disk-derived claims —
|
|
301
|
+
// preferred model, roster, fallback, custom guidance — and stay silent about
|
|
302
|
+
// overrides, leaving the active tool schema authoritative.
|
|
303
|
+
//
|
|
304
|
+
// `fresh` and `not_running` are unchanged: there we can positively describe
|
|
305
|
+
// the catalog, so the guidance below still applies.
|
|
306
|
+
if (catalogState.state === "stale" || catalogState.state === "unknown") {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
// codex-rs supplies the Proactive text on v2; the proxy only adds model-designation
|
|
310
|
+
// guidance, and only when there is something concrete to designate: a configured
|
|
311
|
+
// injectionModel and/or a roster entry that resolves in the injected catalog.
|
|
312
|
+
const configuredForGuidance = [
|
|
313
|
+
...(subagentModels ?? []),
|
|
314
|
+
...(injectionModel ? [injectionModel] : []),
|
|
315
|
+
];
|
|
316
|
+
const resolveRoster = deps.resolveEffectiveSubagentRoster
|
|
317
|
+
?? await createRequestScopedSubagentRosterResolver();
|
|
318
|
+
const effective = await resolveRoster(configuredForGuidance, "v2");
|
|
319
|
+
// Resolve the roster and preferred roles independently so a bare native can project onto its
|
|
320
|
+
// generated account rows without making an unrelated provider/gpt-* row look equivalent.
|
|
321
|
+
// The intersection keeps both projections inside Codex's one global five-model window.
|
|
322
|
+
const candidateModels = new Set(effective.candidates.map(candidate => candidate.model));
|
|
323
|
+
const withinCandidateWindow = (candidate: EffectiveSubagentModel): boolean =>
|
|
324
|
+
candidateModels.has(candidate.model);
|
|
325
|
+
const configuredSubagents = subagentModels ?? [];
|
|
326
|
+
const subagentEffective = configuredSubagents.length > 0
|
|
327
|
+
? injectionModel
|
|
328
|
+
? await resolveRoster(configuredSubagents, "v2")
|
|
329
|
+
: effective
|
|
330
|
+
: undefined;
|
|
331
|
+
const preferredEffective = injectionModel
|
|
332
|
+
? configuredSubagents.length > 0
|
|
333
|
+
? await resolveRoster([injectionModel], "v2")
|
|
334
|
+
: effective
|
|
335
|
+
: undefined;
|
|
336
|
+
const explicitlyConfigured = (candidate: EffectiveSubagentModel): boolean =>
|
|
337
|
+
configuredSubagents.some(model =>
|
|
338
|
+
model.includes("/") && slugsEquivalent(model, candidate.model)
|
|
339
|
+
);
|
|
340
|
+
const allowedForCurrentRoute = (candidate: EffectiveSubagentModel): boolean =>
|
|
341
|
+
explicitlyConfigured(candidate)
|
|
342
|
+
|| !candidate.model.includes("/")
|
|
343
|
+
|| (activeAccountNamespace !== undefined
|
|
344
|
+
&& candidate.model.startsWith(`${activeAccountNamespace}/`));
|
|
345
|
+
const rosterModels = (subagentEffective?.advertised ?? [])
|
|
346
|
+
.filter(withinCandidateWindow)
|
|
347
|
+
.filter(allowedForCurrentRoute);
|
|
348
|
+
const roster = subagentRosterText(rosterModels);
|
|
349
|
+
const preferredCandidates = (preferredEffective?.advertised ?? []).filter(withinCandidateWindow);
|
|
350
|
+
const soleBarePreferred = preferredCandidates.length === 1
|
|
351
|
+
&& !preferredCandidates[0]!.model.includes("/")
|
|
352
|
+
? preferredCandidates[0]
|
|
353
|
+
: undefined;
|
|
354
|
+
const preferred = injectionModel?.includes("/")
|
|
355
|
+
? preferredCandidates[0]
|
|
356
|
+
: activeAccountNamespace
|
|
357
|
+
? preferredCandidates.find(candidate =>
|
|
358
|
+
candidate.model.startsWith(`${activeAccountNamespace}/`)
|
|
359
|
+
) ?? soleBarePreferred
|
|
360
|
+
: soleBarePreferred;
|
|
361
|
+
|
|
362
|
+
if (isInjectionDebugEnabled() && effective.excluded.length > 0) {
|
|
363
|
+
injectionDebugLog(`[opencodex] multi-agent guidance excluded: ${effective.excluded
|
|
364
|
+
.map(item => `${item.configured}:${item.reason}`)
|
|
365
|
+
.join(", ")}`);
|
|
366
|
+
}
|
|
367
|
+
const fallbackGuidance = subagentFallbackGuidanceText({ subagentModelFallback } as OcxConfig);
|
|
368
|
+
const visibleRoles = enabledSubagentRoles(subagentRoles).filter((role) => {
|
|
369
|
+
const match = effective.candidates.find(candidate =>
|
|
370
|
+
slugsEquivalent(candidate.model, role.model) || candidate.model === role.model,
|
|
371
|
+
);
|
|
372
|
+
if (!match) return false;
|
|
373
|
+
const matchesPreferred = Boolean(injectionModel)
|
|
374
|
+
&& (slugsEquivalent(match.model, injectionModel!) || match.model === injectionModel);
|
|
375
|
+
if (!withinCandidateWindow(match) || (!allowedForCurrentRoute(match) && !matchesPreferred)) return false;
|
|
376
|
+
if (role.effort && !match.efforts.includes(role.effort)) return false;
|
|
377
|
+
return true;
|
|
378
|
+
});
|
|
379
|
+
const customRolesText = compactRolesCatalog(visibleRoles, V2_GUIDANCE_CHAR_BUDGET);
|
|
380
|
+
if (!injectionModel && roster === "" && fallbackGuidance === "" && customRolesText === "") return null;
|
|
381
|
+
if (injectionPrompt) {
|
|
382
|
+
// Bare ids must resolve to a unique/current-route candidate. Preserve the legacy raw
|
|
383
|
+
// fallback only for explicit routed/account-qualified ids.
|
|
384
|
+
const promptModel = preferred?.model
|
|
385
|
+
?? (injectionModel?.includes("/") ? injectionModel : undefined);
|
|
386
|
+
return `<multi_agent_mode>${applyInjectionPlaceholders(injectionPrompt, promptModel, injectionEffort, roster, fallbackGuidance, customRolesText)}</multi_agent_mode>`;
|
|
387
|
+
}
|
|
388
|
+
if (!preferred && roster === "" && fallbackGuidance === "" && customRolesText === "") return null;
|
|
389
|
+
const preamble = "When the active spawn_agent tool supports optional \"model\" or \"reasoning_effort\" overrides, "
|
|
390
|
+
+ "use only models listed for this collaboration surface. "
|
|
391
|
+
+ "When setting either override, set fork_turns to \"none\" "
|
|
392
|
+
+ "(or a positive turn count such as \"3\"; full-history forks reject overrides) "
|
|
393
|
+
+ "and make the task message self-contained.";
|
|
394
|
+
let preferredText = "";
|
|
395
|
+
if (preferred) {
|
|
396
|
+
preferredText = ` Preferred sub-agent: model "${preferred.model}"`
|
|
397
|
+
+ (injectionEffort ? `, reasoning_effort "${injectionEffort}"` : "")
|
|
398
|
+
+ " — use it unless the user names another.";
|
|
399
|
+
}
|
|
400
|
+
const specialist = (catalog: string): string =>
|
|
401
|
+
catalog ? ` When spawning, use a named specialist: ${catalog}.` : "";
|
|
402
|
+
const rolesBudget = (withRoster: boolean): number => {
|
|
403
|
+
const wrapper = specialist("x").length - 1;
|
|
404
|
+
return V2_GUIDANCE_CHAR_BUDGET
|
|
405
|
+
- preamble.length
|
|
406
|
+
- preferredText.length
|
|
407
|
+
- fallbackGuidance.length
|
|
408
|
+
- (withRoster ? roster.length : 0)
|
|
409
|
+
- wrapper;
|
|
410
|
+
};
|
|
411
|
+
let rolesText = compactRolesCatalog(visibleRoles, Math.max(0, rolesBudget(true)));
|
|
412
|
+
let text = preamble + preferredText + fallbackGuidance + specialist(rolesText) + roster;
|
|
413
|
+
if (text.length > V2_GUIDANCE_CHAR_BUDGET) {
|
|
414
|
+
rolesText = compactRolesCatalog(visibleRoles, Math.max(0, rolesBudget(false)));
|
|
415
|
+
text = preamble + preferredText + fallbackGuidance + specialist(rolesText);
|
|
416
|
+
}
|
|
417
|
+
return `<multi_agent_mode>${text}</multi_agent_mode>`;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const effort = parsed.options.reasoning;
|
|
421
|
+
// v1 keeps only the upstream-parity behavior: Proactive text at the top tier
|
|
422
|
+
// (ultra arrives as max on the wire). No designation/roster payload here.
|
|
423
|
+
if (effort !== "max" && effort !== "ultra") return null;
|
|
424
|
+
return `<multi_agent_mode>${PROACTIVE_MULTI_AGENT_MODE_TEXT}</multi_agent_mode>`;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
export const V2_GUIDANCE_CHAR_BUDGET = 700;
|
|
430
|
+
|
|
431
|
+
export function applyInjectionPlaceholders(prompt: string, model?: string, effort?: string, roster?: string, fallback?: string, roles?: string): string {
|
|
432
|
+
return prompt
|
|
433
|
+
.replaceAll("{{model}}", model ?? "")
|
|
434
|
+
.replaceAll("{{effort}}", effort ?? "")
|
|
435
|
+
.replaceAll("{{roster}}", roster ?? "")
|
|
436
|
+
.replaceAll("{{fallback}}", fallback ?? "")
|
|
437
|
+
.replaceAll("{{roles}}", roles ?? "");
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
export function subagentRosterText(models: Array<{ model: string; efforts: string[] }>): string {
|
|
443
|
+
if (models.length === 0) return "";
|
|
444
|
+
const ladders = new Set(models.map(model => model.efforts.join("/")));
|
|
445
|
+
if (!ladders.has("") && ladders.size === 1) {
|
|
446
|
+
return ` Available models (reasoning_effort ${[...ladders][0]}): ${models
|
|
447
|
+
.map(model => `"${model.model}"`)
|
|
448
|
+
.join(", ")}.`;
|
|
449
|
+
}
|
|
450
|
+
const entries = models.map(model => model.efforts.length > 0
|
|
451
|
+
? `"${model.model}" (${model.efforts.join("/")})`
|
|
452
|
+
: `"${model.model}"`);
|
|
453
|
+
return ` Available models (valid reasoning_effort): ${entries.join(", ")}.`;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
459
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function generatedDeveloperText(item: unknown): string | undefined {
|
|
463
|
+
if (!isRecord(item) || item.type !== "message" || item.role !== "developer") return undefined;
|
|
464
|
+
if (!Array.isArray(item.content) || item.content.length !== 1) return undefined;
|
|
465
|
+
const [part] = item.content;
|
|
466
|
+
return isRecord(part) && part.type === "input_text" && typeof part.text === "string"
|
|
467
|
+
? part.text
|
|
468
|
+
: undefined;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function isGeneratedDeveloperItem(item: unknown, text: string): boolean {
|
|
472
|
+
return generatedDeveloperText(item) === text;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function isDeveloperPrefixItem(item: unknown): boolean {
|
|
476
|
+
if (!isRecord(item)) return false;
|
|
477
|
+
if (item.type === "additional_tools") return item.role === "developer";
|
|
478
|
+
const type = item.type ?? (typeof item.role === "string" ? "message" : undefined);
|
|
479
|
+
return type === "message" && (item.role === "system" || item.role === "developer");
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
function leadingDeveloperPrefixLength(items: readonly unknown[]): number {
|
|
483
|
+
let index = 0;
|
|
484
|
+
while (index < items.length && isDeveloperPrefixItem(items[index])) index += 1;
|
|
485
|
+
return index;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function isConversationalItem(item: unknown): boolean {
|
|
489
|
+
if (!isRecord(item)) return false;
|
|
490
|
+
if (item.type === "agent_message") return true;
|
|
491
|
+
const type = item.type ?? (typeof item.role === "string" ? "message" : undefined);
|
|
492
|
+
return type === "message" && (item.role === "user" || item.role === "assistant");
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
function statefulRawInsertionIndex(items: readonly unknown[], replayPrefixLen: number): number {
|
|
496
|
+
for (let index = replayPrefixLen; index < items.length; index += 1) {
|
|
497
|
+
if (isConversationalItem(items[index])) return index;
|
|
498
|
+
}
|
|
499
|
+
const last = items[items.length - 1];
|
|
500
|
+
return isRecord(last) && last.type === "compaction_trigger"
|
|
501
|
+
? items.length - 1
|
|
502
|
+
: items.length;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export function injectDeveloperMessage(parsed: OcxParsedRequest, text: string): void {
|
|
506
|
+
const raw = parsed._rawBody as { input?: unknown } | undefined;
|
|
507
|
+
const rawInput = raw && Array.isArray(raw.input) ? raw.input : undefined;
|
|
508
|
+
const replayPrefixLen = rawInput
|
|
509
|
+
? Math.min(parsed._replayPrefixLen ?? 0, rawInput.length)
|
|
510
|
+
: 0;
|
|
511
|
+
const devItem = { type: "message", role: "developer", content: [{ type: "input_text", text }] };
|
|
512
|
+
if (rawInput) {
|
|
513
|
+
const replayPrefix = rawInput.slice(0, replayPrefixLen);
|
|
514
|
+
const taggedGuidance = text.startsWith("<multi_agent_mode>") && text.endsWith("</multi_agent_mode>");
|
|
515
|
+
const lastTaggedGuidance = taggedGuidance
|
|
516
|
+
? replayPrefix.map(generatedDeveloperText)
|
|
517
|
+
.filter(item => item?.startsWith("<multi_agent_mode>") && item.endsWith("</multi_agent_mode>"))
|
|
518
|
+
.at(-1)
|
|
519
|
+
: undefined;
|
|
520
|
+
if (taggedGuidance ? lastTaggedGuidance === text : replayPrefix.some(item => isGeneratedDeveloperItem(item, text))) {
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
const statefulContinuation = parsed.previousResponseId !== undefined;
|
|
526
|
+
const message = { role: "developer" as const, content: text, timestamp: Date.now() };
|
|
527
|
+
const statefulRawIndex = statefulContinuation && rawInput
|
|
528
|
+
? statefulRawInsertionIndex(rawInput, replayPrefixLen)
|
|
529
|
+
: undefined;
|
|
530
|
+
|
|
531
|
+
// A previous_response_id delta can begin with tool/protocol items. Keep those first, then place
|
|
532
|
+
// changed guidance before the current conversation. Stateless requests keep guidance in the prefix.
|
|
533
|
+
if (statefulContinuation) {
|
|
534
|
+
const index = Math.min(
|
|
535
|
+
parsed._continuationConversationMessageIndex ?? parsed.context.messages.length,
|
|
536
|
+
parsed.context.messages.length,
|
|
537
|
+
);
|
|
538
|
+
parsed.context.messages.splice(index, 0, message);
|
|
539
|
+
} else {
|
|
540
|
+
const prefixLen = parsed.context.messages.findIndex(item => item.role !== "developer");
|
|
541
|
+
parsed.context.messages.splice(prefixLen < 0 ? parsed.context.messages.length : prefixLen, 0, message);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
if (rawInput) {
|
|
545
|
+
if (statefulContinuation) {
|
|
546
|
+
rawInput.splice(statefulRawIndex!, 0, devItem);
|
|
547
|
+
} else {
|
|
548
|
+
rawInput.splice(leadingDeveloperPrefixLength(rawInput), 0, devItem);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|