@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,183 @@
|
|
|
1
|
+
import type { OcxProviderConfig } from "./types";
|
|
2
|
+
import { modelInList } from "./types";
|
|
3
|
+
|
|
4
|
+
// Descriptions mirror the upstream bundled models.json canonical wording (openai/codex PR #31684).
|
|
5
|
+
export const CODEX_REASONING_LEVELS: { effort: string; description: string }[] = [
|
|
6
|
+
{ effort: "low", description: "Fast responses with lighter reasoning" },
|
|
7
|
+
{ effort: "medium", description: "Balances speed and reasoning depth for everyday tasks" },
|
|
8
|
+
{ effort: "high", description: "Greater reasoning depth for complex problems" },
|
|
9
|
+
{ effort: "xhigh", description: "Extra high reasoning depth for complex problems" },
|
|
10
|
+
{ effort: "max", description: "Maximum reasoning depth for the hardest problems" },
|
|
11
|
+
{ effort: "ultra", description: "Maximum reasoning with automatic task delegation" },
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
const CODEX_REASONING_ORDER = CODEX_REASONING_LEVELS.map(l => l.effort);
|
|
15
|
+
const CODEX_REASONING_SET = new Set(CODEX_REASONING_ORDER);
|
|
16
|
+
|
|
17
|
+
/** True when `effort` is a member of the Codex reasoning ladder (low..ultra). */
|
|
18
|
+
export function isCodexReasoningEffort(effort: string): boolean {
|
|
19
|
+
return CODEX_REASONING_SET.has(effort);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* True for ladder members plus the `none`/`minimal` sentinels. Both are valid declared
|
|
24
|
+
* efforts (OpenAI accepts `minimal`; Codex validates `none` against
|
|
25
|
+
* `supported_reasoning_levels` for no-reasoning subagent spawns, #883/#962) but are NOT
|
|
26
|
+
* part of the low..ultra ladder: they never appear in default ladders, ranks, or clamps
|
|
27
|
+
* (`minimal` is mapped to `low` on the wire by requestToCodexEffort).
|
|
28
|
+
*/
|
|
29
|
+
export function isDeclaredReasoningEffort(effort: string): boolean {
|
|
30
|
+
return effort === "none" || effort === "minimal" || CODEX_REASONING_SET.has(effort);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Reorder any declared subset (low..ultra, plus the optional `none`/`minimal` sentinels
|
|
35
|
+
* first, in that order) into canonical order and drop duplicates. Catalog
|
|
36
|
+
* `supported_reasoning_levels` follow the input order and the fallback default picks the
|
|
37
|
+
* first entry, so a caller-chosen order would otherwise leak into the catalog.
|
|
38
|
+
*/
|
|
39
|
+
export function canonicalizeReasoningEfforts(values: readonly string[]): string[] {
|
|
40
|
+
const seen = new Set(values);
|
|
41
|
+
const ordered = CODEX_REASONING_ORDER.filter(effort => seen.has(effort));
|
|
42
|
+
const sentinels = ["none", "minimal"].filter(effort => seen.has(effort));
|
|
43
|
+
return [...sentinels, ...ordered];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Reasoning ladder accepted for the OpenAI vision sidecar. `ultra` is deliberately excluded:
|
|
48
|
+
* the vision describer is a single helper call, and `ultra` would be collapsed to `max` by the
|
|
49
|
+
* upstream client boundary anyway.
|
|
50
|
+
*/
|
|
51
|
+
export const VISION_REASONING_EFFORTS = ["low", "medium", "high", "xhigh", "max"] as const;
|
|
52
|
+
export type VisionReasoningEffort = typeof VISION_REASONING_EFFORTS[number];
|
|
53
|
+
|
|
54
|
+
/** True when `effort` is one of the vision sidecar's supported Responses reasoning levels. */
|
|
55
|
+
export function isVisionReasoningEffort(effort: unknown): effort is VisionReasoningEffort {
|
|
56
|
+
return typeof effort === "string" && (VISION_REASONING_EFFORTS as readonly string[]).includes(effort);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Normalize a persisted/configured vision reasoning value. Invalid values (hand-edited config,
|
|
61
|
+
* stale files) degrade to `undefined` so the caller falls back to the documented default instead
|
|
62
|
+
* of forwarding an upstream-rejected effort.
|
|
63
|
+
*/
|
|
64
|
+
export function sanitizeVisionReasoning(effort: unknown): VisionReasoningEffort | undefined {
|
|
65
|
+
return isVisionReasoningEffort(effort) ? effort : undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Position of `effort` in the Codex ladder (low=0 .. ultra=5), or -1 when not a ladder member. */
|
|
69
|
+
export function codexEffortRank(effort: string): number {
|
|
70
|
+
return CODEX_REASONING_ORDER.indexOf(effort);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function modelRecordValue<T>(record: Record<string, T> | undefined, modelId: string): T | undefined {
|
|
74
|
+
if (!record) return undefined;
|
|
75
|
+
if (Object.prototype.hasOwnProperty.call(record, modelId)) return record[modelId];
|
|
76
|
+
const colon = modelId.indexOf(":");
|
|
77
|
+
if (colon > 0) {
|
|
78
|
+
const family = modelId.slice(0, colon);
|
|
79
|
+
if (Object.prototype.hasOwnProperty.call(record, family)) return record[family];
|
|
80
|
+
}
|
|
81
|
+
const folded = modelId.toLowerCase();
|
|
82
|
+
for (const [key, value] of Object.entries(record)) {
|
|
83
|
+
if (key.toLowerCase() === folded) return value;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function sanitizeCodexReasoningEfforts(efforts: readonly string[] | undefined): string[] | undefined {
|
|
89
|
+
if (efforts === undefined) return undefined;
|
|
90
|
+
const seen = new Set<string>();
|
|
91
|
+
const out: string[] = [];
|
|
92
|
+
for (const effort of efforts) {
|
|
93
|
+
// `none`/`minimal` are valid declared sentinels, kept and sorted first (rank -1); they
|
|
94
|
+
// never appear in the default ladder.
|
|
95
|
+
if ((effort !== "none" && effort !== "minimal" && !CODEX_REASONING_SET.has(effort)) || seen.has(effort)) continue;
|
|
96
|
+
seen.add(effort);
|
|
97
|
+
out.push(effort);
|
|
98
|
+
}
|
|
99
|
+
return out.sort((a, b) => CODEX_REASONING_ORDER.indexOf(a) - CODEX_REASONING_ORDER.indexOf(b));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Provider/model configured reasoning levels for the Codex catalog. `undefined` means “no override”,
|
|
104
|
+
* while an empty array means “intentionally expose no effort control for this model”.
|
|
105
|
+
*/
|
|
106
|
+
export function configuredReasoningEfforts(provider: OcxProviderConfig, modelId: string): string[] | undefined {
|
|
107
|
+
if (modelInList(provider.noReasoningModels, modelId)) return [];
|
|
108
|
+
const modelEfforts = modelRecordValue(provider.modelReasoningEfforts, modelId);
|
|
109
|
+
if (modelEfforts !== undefined) return healMappedTiers(provider, modelId, sanitizeCodexReasoningEfforts(modelEfforts) ?? []);
|
|
110
|
+
if (provider.reasoningEfforts !== undefined) return healMappedTiers(provider, modelId, sanitizeCodexReasoningEfforts(provider.reasoningEfforts) ?? []);
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Stale-ladder self-heal: a registry wire map is authoritative evidence of the upstream tiers
|
|
116
|
+
* it can emit. Merge Codex-native map values into an older persisted ladder so newly documented
|
|
117
|
+
* tiers appear without rewriting the user's config. Non-Codex values such as enabled/disabled
|
|
118
|
+
* and Kimi's none sentinel are ignored here; they remain request-only wire aliases.
|
|
119
|
+
*/
|
|
120
|
+
function healMappedTiers(provider: OcxProviderConfig, modelId: string, efforts: string[]): string[] {
|
|
121
|
+
if (efforts.length === 0) return efforts;
|
|
122
|
+
const wireMap = reasoningEffortMapFor(provider, modelId);
|
|
123
|
+
if (!wireMap) return efforts;
|
|
124
|
+
const mappedTiers = Object.values(wireMap).filter(isCodexReasoningEffort);
|
|
125
|
+
if (mappedTiers.length === 0) return efforts;
|
|
126
|
+
return sanitizeCodexReasoningEfforts([...efforts, ...mappedTiers]) ?? efforts;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function requestToCodexEffort(requested: string): string | undefined {
|
|
130
|
+
if (requested === "none") return undefined;
|
|
131
|
+
if (requested === "minimal") return "low";
|
|
132
|
+
return CODEX_REASONING_SET.has(requested) ? requested : undefined;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function clampToSupportedCodexEffort(requested: string, supported: readonly string[]): string | undefined {
|
|
136
|
+
if (supported.length === 0) return undefined;
|
|
137
|
+
const codex = requestToCodexEffort(requested);
|
|
138
|
+
if (!codex) return undefined;
|
|
139
|
+
if (supported.includes(codex)) return codex;
|
|
140
|
+
|
|
141
|
+
const requestedRank = CODEX_REASONING_ORDER.indexOf(codex);
|
|
142
|
+
let best = supported[0];
|
|
143
|
+
let bestRank = CODEX_REASONING_ORDER.indexOf(best);
|
|
144
|
+
for (const effort of supported) {
|
|
145
|
+
const rank = CODEX_REASONING_ORDER.indexOf(effort);
|
|
146
|
+
if (rank <= requestedRank && rank >= bestRank) {
|
|
147
|
+
best = effort;
|
|
148
|
+
bestRank = rank;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// If every supported tier is above the requested tier, choose the lowest supported tier.
|
|
152
|
+
return best;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function reasoningEffortMapFor(provider: OcxProviderConfig, modelId: string): Record<string, string> | undefined {
|
|
156
|
+
return modelRecordValue(provider.modelReasoningEffortMap, modelId) ?? provider.reasoningEffortMap;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Translate Codex's reasoning label into the provider's real wire value. Prefer identity labels
|
|
161
|
+
* (`xhigh` stays `xhigh`, `max` stays `max`); provider maps are only for real upstream aliases.
|
|
162
|
+
*/
|
|
163
|
+
export function mapReasoningEffort(provider: OcxProviderConfig, modelId: string, requested: string | undefined): string | undefined {
|
|
164
|
+
if (!requested) return undefined;
|
|
165
|
+
if (modelInList(provider.noReasoningModels, modelId)) return undefined;
|
|
166
|
+
|
|
167
|
+
// Upstream codex-rs converts ultra -> max before ANY provider request (core/src/client.rs
|
|
168
|
+
// `reasoning_effort_for_request`), so "ultra" must never influence the provider wire — not even
|
|
169
|
+
// through a raw alias. Apply the boundary before alias/clamp resolution.
|
|
170
|
+
const boundary = requested === "ultra" ? "max" : requested;
|
|
171
|
+
|
|
172
|
+
const wireMap = reasoningEffortMapFor(provider, modelId);
|
|
173
|
+
if (wireMap && Object.prototype.hasOwnProperty.call(wireMap, boundary)) return wireMap[boundary];
|
|
174
|
+
|
|
175
|
+
const supported = configuredReasoningEfforts(provider, modelId);
|
|
176
|
+
const codexEffort = supported !== undefined ? clampToSupportedCodexEffort(boundary, supported) : requestToCodexEffort(boundary);
|
|
177
|
+
if (!codexEffort) return undefined;
|
|
178
|
+
|
|
179
|
+
// Belt for the odd config where the supported ladder is ultra-only and the clamp lands on it.
|
|
180
|
+
const wire = codexEffort === "ultra" ? "max" : codexEffort;
|
|
181
|
+
if (wireMap && Object.prototype.hasOwnProperty.call(wireMap, wire)) return wireMap[wire];
|
|
182
|
+
return wire;
|
|
183
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote compaction v2 support for ROUTED providers.
|
|
3
|
+
*
|
|
4
|
+
* Codex decides "this provider supports remote compaction" by provider name (built-in `OpenAI`),
|
|
5
|
+
* and Design B points that provider at this proxy — so Codex sends remote compaction v2 requests
|
|
6
|
+
* for EVERY routed model. The request is a normal /responses call whose input ends with
|
|
7
|
+
* `{"type":"compaction_trigger"}`; codex-rs `collect_compaction_output` then requires the stream
|
|
8
|
+
* to carry EXACTLY ONE `{"type":"compaction","encrypted_content":...}` output item
|
|
9
|
+
* (compact_remote_v2.rs) or it fatals with "expected exactly one compaction output item".
|
|
10
|
+
*
|
|
11
|
+
* Routed models cannot produce OpenAI's encrypted blob, so the proxy runs the model as a plain
|
|
12
|
+
* summarizer and wraps the summary text in a transparent envelope: `ocx1:` + base64(utf8 summary).
|
|
13
|
+
* Codex stores the item and replays it in later input; the parser decodes our envelope back into
|
|
14
|
+
* plain text for routed models. Real OpenAI-encrypted blobs (no `ocx1:` prefix) are opaque —
|
|
15
|
+
* routed models get a short "history was compacted" note instead.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export const OCX_COMPACTION_PREFIX = "ocx1:";
|
|
19
|
+
|
|
20
|
+
/** Mirrors codex-rs core/templates/compact/prompt.md (the local-compaction instruction). */
|
|
21
|
+
export const COMPACT_PROMPT = `You are performing a CONTEXT CHECKPOINT COMPACTION. Create a handoff summary for another LLM that will resume the task.
|
|
22
|
+
|
|
23
|
+
Include:
|
|
24
|
+
- Current progress and key decisions made
|
|
25
|
+
- Important context, constraints, or user preferences
|
|
26
|
+
- What remains to be done (clear next steps)
|
|
27
|
+
- Any critical data, examples, or references needed to continue
|
|
28
|
+
|
|
29
|
+
Be concise, structured, and focused on helping the next LLM seamlessly continue the work.`;
|
|
30
|
+
|
|
31
|
+
/** Mirrors codex-rs core/templates/compact/summary_prefix.md (framing for a replayed summary). */
|
|
32
|
+
export const SUMMARY_PREFIX = "Another language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis:";
|
|
33
|
+
|
|
34
|
+
export const OPAQUE_COMPACTION_NOTE = "[earlier conversation was compacted; the summary is stored in a format this model cannot read]";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Item types in the compact wire family. Each carries an `encrypted_content` blob the client
|
|
38
|
+
* replays verbatim on every later turn, and the minting backend verifies it is unmodified.
|
|
39
|
+
*
|
|
40
|
+
* Keep this the only enumeration: a copy that listed just `compaction` let the response-side
|
|
41
|
+
* field backfill synthesize ids into the other two, which the client then replayed as "modified
|
|
42
|
+
* from the compact response".
|
|
43
|
+
*/
|
|
44
|
+
const COMPACTION_ITEM_TYPES: ReadonlySet<string> = new Set([
|
|
45
|
+
"compaction",
|
|
46
|
+
"compaction_summary",
|
|
47
|
+
"context_compaction",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
export function isCompactionItemType(type: unknown): boolean {
|
|
51
|
+
return typeof type === "string" && COMPACTION_ITEM_TYPES.has(type);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function encodeCompactionSummary(summary: string): string {
|
|
55
|
+
return OCX_COMPACTION_PREFIX + Buffer.from(summary, "utf-8").toString("base64");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Decode an `ocx1:` envelope; returns null for real (OpenAI-encrypted) blobs or garbage. */
|
|
59
|
+
export function decodeCompactionSummary(encryptedContent: string): string | null {
|
|
60
|
+
if (!encryptedContent.startsWith(OCX_COMPACTION_PREFIX)) return null;
|
|
61
|
+
try {
|
|
62
|
+
return Buffer.from(encryptedContent.slice(OCX_COMPACTION_PREFIX.length), "base64").toString("utf-8");
|
|
63
|
+
} catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Render a replayed compaction item as plain user-visible text for a routed model. */
|
|
69
|
+
export function compactionItemToText(encryptedContent: string | undefined): string {
|
|
70
|
+
const decoded = typeof encryptedContent === "string" ? decodeCompactionSummary(encryptedContent) : null;
|
|
71
|
+
return decoded ? `${SUMMARY_PREFIX}\n\n${decoded}` : OPAQUE_COMPACTION_NOTE;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Remote compaction v1 (`POST /responses/compact`, unary) — codex-rs installs the returned
|
|
76
|
+
* `{"output":[ResponseItem...]}` as the REPLACEMENT history (compact_remote.rs
|
|
77
|
+
* process_compacted_history). Mirror codex-rs local `build_compacted_history`: recent real user
|
|
78
|
+
* messages within a token budget, then one user message `SUMMARY_PREFIX\n<summary>`. Plain user
|
|
79
|
+
* message items parse as real user messages on the codex side (event_mapping parse_user_message);
|
|
80
|
+
* contextual wrappers are filtered there, and v2-style `compaction` items are NOT expected here.
|
|
81
|
+
*/
|
|
82
|
+
|
|
83
|
+
/** codex-rs compact.rs COMPACT_USER_MESSAGE_MAX_TOKENS = 20k tokens (~4 chars/token). */
|
|
84
|
+
const COMPACT_V1_RETAINED_CHAR_BUDGET = 20_000 * 4;
|
|
85
|
+
|
|
86
|
+
/** Extract plain-text user messages from a Responses `input` array (for v1 compact retention). */
|
|
87
|
+
export function extractCompactUserMessages(input: unknown): string[] {
|
|
88
|
+
if (!Array.isArray(input)) return [];
|
|
89
|
+
const out: string[] = [];
|
|
90
|
+
for (const item of input) {
|
|
91
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) continue;
|
|
92
|
+
const rec = item as { type?: string; role?: string; content?: unknown };
|
|
93
|
+
if (rec.type !== undefined && rec.type !== "message") continue;
|
|
94
|
+
if (rec.role !== "user") continue;
|
|
95
|
+
let text = "";
|
|
96
|
+
if (typeof rec.content === "string") text = rec.content;
|
|
97
|
+
else if (Array.isArray(rec.content)) {
|
|
98
|
+
text = rec.content
|
|
99
|
+
.map(b => {
|
|
100
|
+
if (!b || typeof b !== "object") return "";
|
|
101
|
+
const block = b as { type?: string; text?: string };
|
|
102
|
+
return (block.type === "input_text" || block.type === "text") && typeof block.text === "string" ? block.text : "";
|
|
103
|
+
})
|
|
104
|
+
.join("");
|
|
105
|
+
}
|
|
106
|
+
if (text.trim().length > 0) out.push(text);
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function compactUserMessageItem(text: string): Record<string, unknown> {
|
|
112
|
+
return { type: "message", role: "user", content: [{ type: "input_text", text }] };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Build the v1 compact `output` array: retained recent user messages + the summary message. */
|
|
116
|
+
export function buildCompactV1Output(userMessages: string[], summary: string): Record<string, unknown>[] {
|
|
117
|
+
const selected: string[] = [];
|
|
118
|
+
let remaining = COMPACT_V1_RETAINED_CHAR_BUDGET;
|
|
119
|
+
for (let i = userMessages.length - 1; i >= 0 && remaining > 0; i--) {
|
|
120
|
+
const msg = userMessages[i];
|
|
121
|
+
if (msg.length <= remaining) {
|
|
122
|
+
selected.push(msg);
|
|
123
|
+
remaining -= msg.length;
|
|
124
|
+
} else {
|
|
125
|
+
// Budget partially covers this older message: keep its tail (most recent context) and stop.
|
|
126
|
+
let tailStart = msg.length - remaining;
|
|
127
|
+
// Never start the retained tail on a lone LOW surrogate: the pair's
|
|
128
|
+
// other half would be lost and encoding substitutes U+FFFD.
|
|
129
|
+
if (tailStart > 0 && tailStart < msg.length) {
|
|
130
|
+
const first = msg.charCodeAt(tailStart);
|
|
131
|
+
if (first >= 0xdc00 && first <= 0xdfff) tailStart += 1;
|
|
132
|
+
}
|
|
133
|
+
selected.push(msg.slice(tailStart));
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
selected.reverse();
|
|
138
|
+
// codex-rs compact.rs uses "{SUMMARY_PREFIX}\n{summary}" (single newline) and detects stored
|
|
139
|
+
// summaries by that exact prefix — keep the same shape.
|
|
140
|
+
const summaryText = summary.trim().length > 0 ? `${SUMMARY_PREFIX}\n${summary}` : "(no summary available)";
|
|
141
|
+
return [...selected.map(compactUserMessageItem), compactUserMessageItem(summaryText)];
|
|
142
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { namespacedToolName } from "../types";
|
|
2
|
+
import { collectResponsesToolGroups } from "./tool-groups";
|
|
3
|
+
|
|
4
|
+
const ROUTED_CUSTOM_TOOL_PASSTHROUGH = new Set(["apply_patch"]);
|
|
5
|
+
const BUILTIN_FUNCTIONS_NAMESPACE = "functions";
|
|
6
|
+
|
|
7
|
+
function routedCustomToolPassesThrough(
|
|
8
|
+
name: string,
|
|
9
|
+
supportsResponsesCustomTools: boolean | undefined,
|
|
10
|
+
): boolean {
|
|
11
|
+
return supportsResponsesCustomTools !== false && ROUTED_CUSTOM_TOOL_PASSTHROUGH.has(name);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
15
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function customToolInput(argumentsText: unknown): string {
|
|
19
|
+
if (typeof argumentsText !== "string") return "";
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(argumentsText) as unknown;
|
|
22
|
+
if (isPlainObject(parsed) && typeof parsed.input === "string") return parsed.input;
|
|
23
|
+
} catch { /* malformed arguments stay visible to the client */ }
|
|
24
|
+
return argumentsText;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function customToolWireName(namespace: string | undefined, name: string): string {
|
|
28
|
+
return namespace === BUILTIN_FUNCTIONS_NAMESPACE ? name : namespacedToolName(namespace, name);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Final upstream identity of a call, including a namespace restored by an earlier rewrite. */
|
|
32
|
+
export function routedCustomToolWireName(value: unknown): string | undefined {
|
|
33
|
+
if (!isPlainObject(value) || typeof value.name !== "string") return undefined;
|
|
34
|
+
return customToolWireName(
|
|
35
|
+
typeof value.namespace === "string" ? value.namespace : undefined,
|
|
36
|
+
value.name,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Names of converted custom declarations after namespace lowering. Restoration uses these exact
|
|
42
|
+
* wire identities so same-named function and custom children in different namespaces stay distinct.
|
|
43
|
+
*/
|
|
44
|
+
function collectRoutedCustomToolWireNames(
|
|
45
|
+
body: unknown,
|
|
46
|
+
supportsResponsesCustomTools?: boolean,
|
|
47
|
+
): Set<string> {
|
|
48
|
+
const names = new Set<string>();
|
|
49
|
+
const groups = collectResponsesToolGroups(body);
|
|
50
|
+
const bareWireNames = new Set<string>();
|
|
51
|
+
for (const group of groups) {
|
|
52
|
+
for (const tool of group) {
|
|
53
|
+
if (
|
|
54
|
+
isPlainObject(tool)
|
|
55
|
+
&& tool.type !== "namespace"
|
|
56
|
+
&& typeof tool.name === "string"
|
|
57
|
+
) bareWireNames.add(tool.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
for (const group of groups) {
|
|
62
|
+
for (const tool of group) {
|
|
63
|
+
if (!isPlainObject(tool)) continue;
|
|
64
|
+
if (
|
|
65
|
+
tool.type === "custom"
|
|
66
|
+
&& typeof tool.name === "string"
|
|
67
|
+
&& !routedCustomToolPassesThrough(tool.name, supportsResponsesCustomTools)
|
|
68
|
+
) {
|
|
69
|
+
names.add(tool.name);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (tool.type !== "namespace" || typeof tool.name !== "string" || !Array.isArray(tool.tools)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
for (const child of tool.tools) {
|
|
76
|
+
if (
|
|
77
|
+
isPlainObject(child)
|
|
78
|
+
&& child.type === "custom"
|
|
79
|
+
&& typeof child.name === "string"
|
|
80
|
+
&& !routedCustomToolPassesThrough(child.name, supportsResponsesCustomTools)
|
|
81
|
+
&& !(tool.name === BUILTIN_FUNCTIONS_NAMESPACE && bareWireNames.has(child.name))
|
|
82
|
+
) names.add(customToolWireName(tool.name, child.name));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return names;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function customToolItemId(id: unknown): unknown {
|
|
90
|
+
if (typeof id !== "string") return id;
|
|
91
|
+
return id.startsWith("fc_") ? `ctc_${id.slice(3)}` : id;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function collectRoutedCustomToolNames(
|
|
95
|
+
body: unknown,
|
|
96
|
+
supportsResponsesCustomTools?: boolean,
|
|
97
|
+
): Set<string> {
|
|
98
|
+
const names = new Set<string>();
|
|
99
|
+
const visit = (value: unknown): void => {
|
|
100
|
+
if (Array.isArray(value)) {
|
|
101
|
+
for (const entry of value) visit(entry);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!isPlainObject(value)) return;
|
|
105
|
+
if (
|
|
106
|
+
value.type === "custom"
|
|
107
|
+
&& typeof value.name === "string"
|
|
108
|
+
&& !routedCustomToolPassesThrough(value.name, supportsResponsesCustomTools)
|
|
109
|
+
) {
|
|
110
|
+
names.add(value.name);
|
|
111
|
+
}
|
|
112
|
+
for (const entry of Object.values(value)) visit(entry);
|
|
113
|
+
};
|
|
114
|
+
visit(body);
|
|
115
|
+
return names;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function collectConvertedCallIds(value: unknown, names: ReadonlySet<string>, out: Set<string>): void {
|
|
119
|
+
if (Array.isArray(value)) {
|
|
120
|
+
for (const entry of value) collectConvertedCallIds(entry, names, out);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!isPlainObject(value)) return;
|
|
124
|
+
if (
|
|
125
|
+
(value.type === "custom_tool_call" || value.type === "function_call")
|
|
126
|
+
&& typeof value.name === "string"
|
|
127
|
+
&& names.has(value.name)
|
|
128
|
+
&& typeof value.call_id === "string"
|
|
129
|
+
) {
|
|
130
|
+
out.add(value.call_id);
|
|
131
|
+
}
|
|
132
|
+
for (const entry of Object.values(value)) collectConvertedCallIds(entry, names, out);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function rewriteForUpstream(
|
|
136
|
+
value: unknown,
|
|
137
|
+
names: ReadonlySet<string>,
|
|
138
|
+
callIds: ReadonlySet<string>,
|
|
139
|
+
): unknown {
|
|
140
|
+
if (Array.isArray(value)) return value.map(entry => rewriteForUpstream(entry, names, callIds));
|
|
141
|
+
if (!isPlainObject(value)) return value;
|
|
142
|
+
|
|
143
|
+
if (value.type === "custom" && typeof value.name === "string" && names.has(value.name)) {
|
|
144
|
+
const { format: _format, ...rest } = value;
|
|
145
|
+
const isDefinition = typeof value.description === "string"
|
|
146
|
+
|| isPlainObject(value.format)
|
|
147
|
+
|| isPlainObject(value.parameters);
|
|
148
|
+
if (!isDefinition) return { ...rest, type: "function" };
|
|
149
|
+
const inputDescription = value.name === "exec"
|
|
150
|
+
? "JavaScript source for unified exec. Use await tools.exec_command(...) for shell commands and text(...) to return textual output; do not provide a bare shell command."
|
|
151
|
+
: "Raw input for this client-executed custom tool.";
|
|
152
|
+
return {
|
|
153
|
+
...rest,
|
|
154
|
+
type: "function",
|
|
155
|
+
parameters: {
|
|
156
|
+
type: "object",
|
|
157
|
+
properties: {
|
|
158
|
+
input: {
|
|
159
|
+
type: "string",
|
|
160
|
+
description: inputDescription,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
required: ["input"],
|
|
164
|
+
additionalProperties: false,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (
|
|
170
|
+
value.type === "custom_tool_call"
|
|
171
|
+
&& typeof value.name === "string"
|
|
172
|
+
&& names.has(value.name)
|
|
173
|
+
) {
|
|
174
|
+
const { input, id: _id, ...rest } = value;
|
|
175
|
+
return {
|
|
176
|
+
...rest,
|
|
177
|
+
type: "function_call",
|
|
178
|
+
arguments: JSON.stringify({ input: typeof input === "string" ? input : "" }),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (
|
|
183
|
+
value.type === "custom_tool_call_output"
|
|
184
|
+
&& typeof value.call_id === "string"
|
|
185
|
+
&& callIds.has(value.call_id)
|
|
186
|
+
) {
|
|
187
|
+
return { ...value, type: "function_call_output" };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
let changed = false;
|
|
191
|
+
const next: Record<string, unknown> = {};
|
|
192
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
193
|
+
const rewritten = rewriteForUpstream(entry, names, callIds);
|
|
194
|
+
next[key] = rewritten;
|
|
195
|
+
changed ||= rewritten !== entry;
|
|
196
|
+
}
|
|
197
|
+
return changed ? next : value;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function rewriteRoutedCustomToolsForUpstream(
|
|
201
|
+
body: unknown,
|
|
202
|
+
supportsResponsesCustomTools?: boolean,
|
|
203
|
+
): {
|
|
204
|
+
body: unknown;
|
|
205
|
+
names: Set<string>;
|
|
206
|
+
} {
|
|
207
|
+
const conversionNames = collectRoutedCustomToolNames(body, supportsResponsesCustomTools);
|
|
208
|
+
const names = collectRoutedCustomToolWireNames(body, supportsResponsesCustomTools);
|
|
209
|
+
if (conversionNames.size === 0) return { body, names };
|
|
210
|
+
const callIds = new Set<string>();
|
|
211
|
+
collectConvertedCallIds(body, conversionNames, callIds);
|
|
212
|
+
return { body: rewriteForUpstream(body, conversionNames, callIds), names };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function restoreRoutedCustomCalls(
|
|
216
|
+
value: unknown,
|
|
217
|
+
names: ReadonlySet<string>,
|
|
218
|
+
): { value: unknown; changed: boolean } {
|
|
219
|
+
if (Array.isArray(value)) {
|
|
220
|
+
let changed = false;
|
|
221
|
+
const restored = value.map(entry => {
|
|
222
|
+
const result = restoreRoutedCustomCalls(entry, names);
|
|
223
|
+
changed ||= result.changed;
|
|
224
|
+
return result.value;
|
|
225
|
+
});
|
|
226
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
227
|
+
}
|
|
228
|
+
if (!isPlainObject(value)) return { value, changed: false };
|
|
229
|
+
|
|
230
|
+
let changed = false;
|
|
231
|
+
const restored: Record<string, unknown> = {};
|
|
232
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
233
|
+
const result = restoreRoutedCustomCalls(entry, names);
|
|
234
|
+
restored[key] = result.value;
|
|
235
|
+
changed ||= result.changed;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const wireName = routedCustomToolWireName(value);
|
|
239
|
+
if (value.type === "function_call" && wireName !== undefined && names.has(wireName)) {
|
|
240
|
+
restored.type = "custom_tool_call";
|
|
241
|
+
restored.id = customToolItemId(value.id);
|
|
242
|
+
restored.input = customToolInput(value.arguments);
|
|
243
|
+
delete restored.arguments;
|
|
244
|
+
changed = true;
|
|
245
|
+
}
|
|
246
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function restoreRoutedCustomCallsInJson(
|
|
250
|
+
text: string,
|
|
251
|
+
names: ReadonlySet<string>,
|
|
252
|
+
): string {
|
|
253
|
+
if (names.size === 0) return text;
|
|
254
|
+
let payload: unknown;
|
|
255
|
+
try {
|
|
256
|
+
payload = JSON.parse(text);
|
|
257
|
+
} catch {
|
|
258
|
+
return text;
|
|
259
|
+
}
|
|
260
|
+
const restored = restoreRoutedCustomCalls(payload, names);
|
|
261
|
+
return restored.changed ? JSON.stringify(restored.value) : text;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function unwrapRoutedCustomToolArguments(argumentsText: unknown): string {
|
|
265
|
+
return customToolInput(argumentsText);
|
|
266
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Hosted tools rejected by specific native model slugs. */
|
|
2
|
+
const UNSUPPORTED_HOSTED_TOOLS: ReadonlyArray<{ match: (model: string) => boolean; tools: ReadonlySet<string> }> = [
|
|
3
|
+
{ match: model => model.includes("codex-spark"), tools: new Set(["image_generation", "tool_search"]) },
|
|
4
|
+
];
|
|
5
|
+
|
|
6
|
+
/** True when forwarding this hosted tool to the model would be rejected upstream. */
|
|
7
|
+
export function isHostedToolUnsupportedForModel(modelId: string, tool: string): boolean {
|
|
8
|
+
return UNSUPPORTED_HOSTED_TOOLS.some(entry => entry.match(modelId) && entry.tools.has(tool));
|
|
9
|
+
}
|