@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,132 @@
|
|
|
1
|
+
import { collectResponsesToolGroups } from "../responses/tool-groups";
|
|
2
|
+
import { relaySseWithPayloadRewrite, type SsePayloadRewrite } from "./sse-payload-rewrite";
|
|
3
|
+
import type { TranslatorBudget } from "../lib/translator-budget";
|
|
4
|
+
|
|
5
|
+
interface NamespacedTool {
|
|
6
|
+
namespace: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const IMAGE_GEN_NAMESPACE = "image_gen";
|
|
11
|
+
const IMAGE_GEN_DOTTED_PREFIX = `${IMAGE_GEN_NAMESPACE}.`;
|
|
12
|
+
|
|
13
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
14
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Restrict the generic bridge map to Codex's standalone image namespace and accept the dotted
|
|
19
|
+
* alias emitted by earlier compatibility attempts. Legacy flat dotted declarations are recovered
|
|
20
|
+
* from the raw request because the generic parser does not assign them a namespace. Exact declared
|
|
21
|
+
* names avoid splitting arbitrary double-underscore function names that belong to unrelated tools.
|
|
22
|
+
*/
|
|
23
|
+
export function imageGenToolCallAliases(
|
|
24
|
+
toolNsMap: ReadonlyMap<string, NamespacedTool>,
|
|
25
|
+
requestBody?: unknown,
|
|
26
|
+
translatorBudget?: TranslatorBudget,
|
|
27
|
+
): Map<string, NamespacedTool> {
|
|
28
|
+
const aliases = new Map<string, NamespacedTool>();
|
|
29
|
+
const retainAlias = (key: string, tool: NamespacedTool) => {
|
|
30
|
+
if (aliases.has(key)) {
|
|
31
|
+
aliases.set(key, tool);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
translatorBudget?.chargeRetained(
|
|
35
|
+
Buffer.byteLength(key) + Buffer.byteLength(tool.namespace) + Buffer.byteLength(tool.name),
|
|
36
|
+
{ kind: "request_copies" },
|
|
37
|
+
);
|
|
38
|
+
aliases.set(key, tool);
|
|
39
|
+
};
|
|
40
|
+
for (const [wireName, tool] of toolNsMap) {
|
|
41
|
+
if (tool.namespace !== IMAGE_GEN_NAMESPACE) continue;
|
|
42
|
+
retainAlias(wireName, tool);
|
|
43
|
+
retainAlias(`${tool.namespace}.${tool.name}`, tool);
|
|
44
|
+
}
|
|
45
|
+
for (const group of collectResponsesToolGroups(requestBody)) {
|
|
46
|
+
for (const tool of group) {
|
|
47
|
+
if (
|
|
48
|
+
!isPlainObject(tool)
|
|
49
|
+
|| tool.type !== "function"
|
|
50
|
+
|| typeof tool.name !== "string"
|
|
51
|
+
|| !tool.name.startsWith(IMAGE_GEN_DOTTED_PREFIX)
|
|
52
|
+
|| tool.name.length === IMAGE_GEN_DOTTED_PREFIX.length
|
|
53
|
+
) continue;
|
|
54
|
+
const localName = tool.name.slice(IMAGE_GEN_DOTTED_PREFIX.length);
|
|
55
|
+
const target = { namespace: IMAGE_GEN_NAMESPACE, name: localName };
|
|
56
|
+
retainAlias(`${IMAGE_GEN_NAMESPACE}__${localName}`, target);
|
|
57
|
+
retainAlias(tool.name, target);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return aliases;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Recursively restore only exact image-gen function-call aliases in a parsed Responses payload. */
|
|
64
|
+
function restoreImageGenCalls(
|
|
65
|
+
value: unknown,
|
|
66
|
+
aliases: ReadonlyMap<string, NamespacedTool>,
|
|
67
|
+
): { value: unknown; changed: boolean } {
|
|
68
|
+
if (Array.isArray(value)) {
|
|
69
|
+
let changed = false;
|
|
70
|
+
const restored = value.map(entry => {
|
|
71
|
+
const result = restoreImageGenCalls(entry, aliases);
|
|
72
|
+
changed ||= result.changed;
|
|
73
|
+
return result.value;
|
|
74
|
+
});
|
|
75
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
76
|
+
}
|
|
77
|
+
if (!isPlainObject(value)) return { value, changed: false };
|
|
78
|
+
|
|
79
|
+
let changed = false;
|
|
80
|
+
const restored: Record<string, unknown> = {};
|
|
81
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
82
|
+
const result = restoreImageGenCalls(entry, aliases);
|
|
83
|
+
restored[key] = result.value;
|
|
84
|
+
changed ||= result.changed;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const name = typeof value.name === "string" ? value.name : undefined;
|
|
88
|
+
const target = value.type === "function_call" && name ? aliases.get(name) : undefined;
|
|
89
|
+
if (target) {
|
|
90
|
+
restored.name = target.name;
|
|
91
|
+
restored.namespace = target.namespace;
|
|
92
|
+
changed = true;
|
|
93
|
+
}
|
|
94
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Restore image-gen function calls in a non-streaming Responses JSON document. */
|
|
98
|
+
export function restoreImageGenCallsInJson(
|
|
99
|
+
text: string,
|
|
100
|
+
aliases: ReadonlyMap<string, NamespacedTool>,
|
|
101
|
+
): string {
|
|
102
|
+
if (aliases.size === 0) return text;
|
|
103
|
+
let payload: unknown;
|
|
104
|
+
try {
|
|
105
|
+
payload = JSON.parse(text);
|
|
106
|
+
} catch {
|
|
107
|
+
return text;
|
|
108
|
+
}
|
|
109
|
+
const restored = restoreImageGenCalls(payload, aliases);
|
|
110
|
+
return restored.changed ? JSON.stringify(restored.value) : text;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Payload rewrite for composition with other client-facing SSE transforms. */
|
|
114
|
+
export function createImageGenCallRestoreRewrite(
|
|
115
|
+
aliases: ReadonlyMap<string, NamespacedTool>,
|
|
116
|
+
): SsePayloadRewrite | undefined {
|
|
117
|
+
if (aliases.size === 0) return undefined;
|
|
118
|
+
return (payload) => restoreImageGenCallsInJson(payload, aliases);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Restore upstream-safe image-gen aliases only on the client-facing SSE branch. The inspection and
|
|
123
|
+
* continuation-cache branch must retain raw upstream names so a replay can be sent back unchanged.
|
|
124
|
+
*/
|
|
125
|
+
export function relaySseWithImageGenCallRestore(
|
|
126
|
+
body: ReadableStream<Uint8Array>,
|
|
127
|
+
aliases: ReadonlyMap<string, NamespacedTool>,
|
|
128
|
+
translatorBudget: TranslatorBudget,
|
|
129
|
+
): ReadableStream<Uint8Array> {
|
|
130
|
+
const rewrite = createImageGenCallRestoreRewrite(aliases);
|
|
131
|
+
return rewrite ? relaySseWithPayloadRewrite(body, rewrite, translatorBudget) : body;
|
|
132
|
+
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import type { ResponsesItemIdRepairConfig } from "../types";
|
|
3
|
+
import { relaySseWithPayloadRewrite, type SsePayloadRewrite } from "./sse-payload-rewrite";
|
|
4
|
+
import type { TranslatorBudget } from "../lib/translator-budget";
|
|
5
|
+
|
|
6
|
+
type RepairableItemType = "message" | "reasoning";
|
|
7
|
+
|
|
8
|
+
interface ResponsesItemIdRepairState {
|
|
9
|
+
readonly repairMissingTerminalIds: boolean;
|
|
10
|
+
readonly repairInvalidIds: boolean;
|
|
11
|
+
readonly placeholders: Record<RepairableItemType, ReadonlySet<string>>;
|
|
12
|
+
readonly outputIds: Record<RepairableItemType, Map<number, string>>;
|
|
13
|
+
/** JSON [outputIndex, rawId] -> canonical id, for exact item_id rewrites on part/delta events. */
|
|
14
|
+
readonly rawIds: Map<string, string>;
|
|
15
|
+
readonly scope: string;
|
|
16
|
+
readonly budget?: TranslatorBudget;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const REPAIRABLE_PREFIXES: Record<RepairableItemType, string> = {
|
|
20
|
+
message: "msg_",
|
|
21
|
+
reasoning: "rs_",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const ITEM_ID_EVENT_TYPES: Readonly<Record<string, RepairableItemType>> = {
|
|
25
|
+
"response.content_part.added": "message",
|
|
26
|
+
"response.content_part.done": "message",
|
|
27
|
+
"response.output_text.annotation.added": "message",
|
|
28
|
+
"response.output_text.delta": "message",
|
|
29
|
+
"response.output_text.done": "message",
|
|
30
|
+
"response.refusal.delta": "message",
|
|
31
|
+
"response.refusal.done": "message",
|
|
32
|
+
"response.reasoning_summary_part.added": "reasoning",
|
|
33
|
+
"response.reasoning_summary_part.done": "reasoning",
|
|
34
|
+
"response.reasoning_summary_text.delta": "reasoning",
|
|
35
|
+
"response.reasoning_summary_text.done": "reasoning",
|
|
36
|
+
"response.reasoning_text.delta": "reasoning",
|
|
37
|
+
"response.reasoning_text.done": "reasoning",
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
41
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function asOutputIndex(value: unknown): number | null {
|
|
45
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function repairableItemType(item: Record<string, unknown>): RepairableItemType | null {
|
|
49
|
+
return item.type === "message" || item.type === "reasoning" ? item.type : null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function mintCanonicalId(type: RepairableItemType, scope: string, outputIndex: number): string {
|
|
53
|
+
return `${REPAIRABLE_PREFIXES[type]}ocx_${scope}_${outputIndex}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function createRepairState(config: ResponsesItemIdRepairConfig, budget?: TranslatorBudget): ResponsesItemIdRepairState {
|
|
57
|
+
const state = {
|
|
58
|
+
repairMissingTerminalIds: config.repairMissingTerminalIds === true,
|
|
59
|
+
repairInvalidIds: config.repairInvalidIds === true,
|
|
60
|
+
placeholders: {
|
|
61
|
+
message: new Set(config.message ?? []),
|
|
62
|
+
reasoning: new Set(config.reasoning ?? []),
|
|
63
|
+
},
|
|
64
|
+
outputIds: {
|
|
65
|
+
message: new Map<number, string>(),
|
|
66
|
+
reasoning: new Map<number, string>(),
|
|
67
|
+
},
|
|
68
|
+
rawIds: new Map<string, string>(),
|
|
69
|
+
scope: randomUUID().replace(/-/g, ""),
|
|
70
|
+
budget,
|
|
71
|
+
};
|
|
72
|
+
budget?.chargeRetained(new TextEncoder().encode(JSON.stringify({
|
|
73
|
+
message: [...state.placeholders.message],
|
|
74
|
+
reasoning: [...state.placeholders.reasoning],
|
|
75
|
+
scope: state.scope,
|
|
76
|
+
})).byteLength, { kind: "item_ids" });
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function rememberMappedId(
|
|
81
|
+
state: ResponsesItemIdRepairState,
|
|
82
|
+
outputIndex: number,
|
|
83
|
+
item: Record<string, unknown>,
|
|
84
|
+
): string | null {
|
|
85
|
+
const type = repairableItemType(item);
|
|
86
|
+
if (!type) return null;
|
|
87
|
+
const existing = state.outputIds[type].get(outputIndex);
|
|
88
|
+
if (existing) return existing;
|
|
89
|
+
const rawId = typeof item.id === "string" ? item.id : undefined;
|
|
90
|
+
if (!rawId) return null;
|
|
91
|
+
const mapped = state.placeholders[type].has(rawId)
|
|
92
|
+
? mintCanonicalId(type, state.scope, outputIndex)
|
|
93
|
+
: state.repairInvalidIds && !rawId.startsWith(REPAIRABLE_PREFIXES[type])
|
|
94
|
+
// An existing id without the canonical msg_/rs_ prefix (bare UUIDs from
|
|
95
|
+
// DeepSeek's Responses route) leaves Codex stuck on Thinking (#938).
|
|
96
|
+
? mintCanonicalId(type, state.scope, outputIndex)
|
|
97
|
+
: state.repairMissingTerminalIds
|
|
98
|
+
? rawId
|
|
99
|
+
: null;
|
|
100
|
+
if (!mapped) return null;
|
|
101
|
+
state.budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([outputIndex, rawId, mapped])).byteLength, { kind: "item_ids" });
|
|
102
|
+
state.outputIds[type].set(outputIndex, mapped);
|
|
103
|
+
// Keyed by (index, rawId): an upstream that reuses one placeholder id across
|
|
104
|
+
// several items must not collapse them into the last item's canonical id.
|
|
105
|
+
if (rawId !== mapped) state.rawIds.set(JSON.stringify([outputIndex, rawId]), mapped);
|
|
106
|
+
return mapped;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function rewriteOutputItem(
|
|
110
|
+
state: ResponsesItemIdRepairState,
|
|
111
|
+
outputIndex: number,
|
|
112
|
+
item: Record<string, unknown>,
|
|
113
|
+
): { item: Record<string, unknown>; changed: boolean } {
|
|
114
|
+
const mapped = rememberMappedId(state, outputIndex, item);
|
|
115
|
+
if (!mapped) return { item, changed: false };
|
|
116
|
+
const currentId = typeof item.id === "string" ? item.id : undefined;
|
|
117
|
+
if (currentId === mapped) return { item, changed: false };
|
|
118
|
+
if (currentId === undefined && !state.repairMissingTerminalIds) return { item, changed: false };
|
|
119
|
+
return { item: { ...item, id: mapped }, changed: true };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function rewriteItemIdField(
|
|
123
|
+
state: ResponsesItemIdRepairState,
|
|
124
|
+
event: Record<string, unknown>,
|
|
125
|
+
outputIndex: number,
|
|
126
|
+
): { event: Record<string, unknown>; changed: boolean } {
|
|
127
|
+
const eventType = typeof event.type === "string" ? ITEM_ID_EVENT_TYPES[event.type] : undefined;
|
|
128
|
+
if (!eventType) return { event, changed: false };
|
|
129
|
+
const currentId = typeof event.item_id === "string" ? event.item_id : undefined;
|
|
130
|
+
// content_part.* events are shared between message and reasoning items (DeepSeek's
|
|
131
|
+
// streamed reasoning wraps its text in content parts), so the static event-type map
|
|
132
|
+
// can point at the wrong id table. The rewrite is therefore exact-only when the
|
|
133
|
+
// event carries an item_id: it fires when (output_index, item_id) names an id the
|
|
134
|
+
// item stream already repaired, and otherwise leaves the event alone — an unknown
|
|
135
|
+
// id belongs to an item this repair never touched (function_call, already-canonical
|
|
136
|
+
// ids), and guessing by index could borrow a sibling item's identity. The index
|
|
137
|
+
// table serves only events with NO item_id, where repairMissingTerminalIds
|
|
138
|
+
// explicitly opts into the positional guess (the pre-existing contract).
|
|
139
|
+
if (currentId !== undefined) {
|
|
140
|
+
const mapped = state.rawIds.get(JSON.stringify([outputIndex, currentId]));
|
|
141
|
+
if (!mapped || currentId === mapped) return { event, changed: false };
|
|
142
|
+
return { event: { ...event, item_id: mapped }, changed: true };
|
|
143
|
+
}
|
|
144
|
+
if (!state.repairMissingTerminalIds) return { event, changed: false };
|
|
145
|
+
const mapped = state.outputIds[eventType].get(outputIndex);
|
|
146
|
+
if (!mapped) return { event, changed: false };
|
|
147
|
+
return { event: { ...event, item_id: mapped }, changed: true };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function rewriteResponseSnapshot(
|
|
151
|
+
state: ResponsesItemIdRepairState,
|
|
152
|
+
response: Record<string, unknown>,
|
|
153
|
+
): { response: Record<string, unknown>; changed: boolean } {
|
|
154
|
+
if (!Array.isArray(response.output)) return { response, changed: false };
|
|
155
|
+
let changed = false;
|
|
156
|
+
const output = response.output.map((item, outputIndex) => {
|
|
157
|
+
if (!isPlainObject(item)) return item;
|
|
158
|
+
const rewritten = rewriteOutputItem(state, outputIndex, item);
|
|
159
|
+
changed = changed || rewritten.changed;
|
|
160
|
+
return rewritten.item;
|
|
161
|
+
});
|
|
162
|
+
return changed ? { response: { ...response, output }, changed: true } : { response, changed: false };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function repairEventPayload(
|
|
166
|
+
payload: string,
|
|
167
|
+
state: ResponsesItemIdRepairState,
|
|
168
|
+
): string {
|
|
169
|
+
let event: unknown;
|
|
170
|
+
try {
|
|
171
|
+
event = JSON.parse(payload);
|
|
172
|
+
} catch {
|
|
173
|
+
return payload;
|
|
174
|
+
}
|
|
175
|
+
if (!isPlainObject(event)) return payload;
|
|
176
|
+
|
|
177
|
+
let changed = false;
|
|
178
|
+
let nextEvent = event;
|
|
179
|
+
const outputIndex = asOutputIndex(event.output_index);
|
|
180
|
+
if (outputIndex !== null && isPlainObject(event.item)) {
|
|
181
|
+
const rewritten = rewriteOutputItem(state, outputIndex, event.item);
|
|
182
|
+
if (rewritten.changed) {
|
|
183
|
+
nextEvent = { ...nextEvent, item: rewritten.item };
|
|
184
|
+
changed = true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (outputIndex !== null) {
|
|
188
|
+
const rewritten = rewriteItemIdField(state, nextEvent, outputIndex);
|
|
189
|
+
if (rewritten.changed) {
|
|
190
|
+
nextEvent = rewritten.event;
|
|
191
|
+
changed = true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (isPlainObject(event.response)) {
|
|
195
|
+
const rewritten = rewriteResponseSnapshot(state, event.response);
|
|
196
|
+
if (rewritten.changed) {
|
|
197
|
+
nextEvent = { ...nextEvent, response: rewritten.response };
|
|
198
|
+
changed = true;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (!changed) return payload;
|
|
202
|
+
const rewritten = JSON.stringify(nextEvent);
|
|
203
|
+
const bytes = new TextEncoder().encode(rewritten).byteLength;
|
|
204
|
+
const reservation = state.budget?.reserveTransient(bytes, { kind: "item_ids" });
|
|
205
|
+
reservation?.commitRetained();
|
|
206
|
+
if (state.budget) queueMicrotask(() => state.budget?.releaseRetained(bytes, { kind: "item_ids" }));
|
|
207
|
+
return rewritten;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* [Decision Log]
|
|
212
|
+
* - 목적과 의도: 일부 openai-responses 호환 게이트웨이가 재사용/누락하는 message·reasoning item id를
|
|
213
|
+
* downstream SSE에서만 선택적으로 보정해 Codex Desktop 카드 상관관계를 안정화한다.
|
|
214
|
+
* - 기존 구현 및 제약 조건: 기본 passthrough는 바이트 단위 그대로 relay되고, local replay 상태는 raw
|
|
215
|
+
* upstream 응답을 기억한다. function_call id / call_id는 upstream 의미가 있으므로 절대 바꾸면 안 된다.
|
|
216
|
+
* - 검토한 주요 대안: 모든 passthrough SSE를 항상 재작성하기, raw inspect 분기까지 함께 재작성하기,
|
|
217
|
+
* function_call 포함 전체 item id를 정규화하기.
|
|
218
|
+
* - 선택한 방식: provider-local opt-in 설정이 있을 때만 client-facing SSE 분기에 한정해 exact
|
|
219
|
+
* message/reasoning placeholder id와 missing terminal id를 item type + output_index 기준으로 보정하고,
|
|
220
|
+
* event-level item_id는 명시적인 message/reasoning lifecycle allowlist에서만 바꾼다.
|
|
221
|
+
* - 다른 대안 대신 이 방식을 선택한 이유: disabled-by-default byte-for-byte passthrough를 유지하면서,
|
|
222
|
+
* previous_response_id replay는 raw upstream snapshot을 계속 사용해 synthetic id가 upstream으로
|
|
223
|
+
* 역류하지 않게 막을 수 있다.
|
|
224
|
+
* - 장점, 단점 및 영향: 기본 경로는 변하지 않는다. malformed stream이 output_index를 다른 item
|
|
225
|
+
* type에 재사용해도 function_call id/call_id는 보존된다. opt-in 게이트웨이는 sequential streams에서도
|
|
226
|
+
* 고유한 canonical id를 얻지만, 보정이 필요한 경우에만 JS stream 재작성 비용을 지불한다.
|
|
227
|
+
*/
|
|
228
|
+
/** Stateful payload rewrite for composition with other client-facing SSE transforms. */
|
|
229
|
+
export function createResponsesItemIdPayloadRewrite(
|
|
230
|
+
config: ResponsesItemIdRepairConfig,
|
|
231
|
+
budget?: TranslatorBudget,
|
|
232
|
+
): SsePayloadRewrite {
|
|
233
|
+
const state = createRepairState(config, budget);
|
|
234
|
+
return (payload) => repairEventPayload(payload, state);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function relaySseWithResponsesItemIdRepair(
|
|
238
|
+
body: ReadableStream<Uint8Array>,
|
|
239
|
+
config: ResponsesItemIdRepairConfig,
|
|
240
|
+
budget: TranslatorBudget,
|
|
241
|
+
): ReadableStream<Uint8Array> {
|
|
242
|
+
return relaySseWithPayloadRewrite(body, createResponsesItemIdPayloadRewrite(config, budget), budget);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export function hasResponsesItemIdRepair(config: ResponsesItemIdRepairConfig | undefined): boolean {
|
|
246
|
+
return config?.repairMissingTerminalIds === true
|
|
247
|
+
|| config?.repairInvalidIds === true
|
|
248
|
+
|| (config?.message?.length ?? 0) > 0
|
|
249
|
+
|| (config?.reasoning?.length ?? 0) > 0;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Client-facing id normalization for a WHOLE bounded-JSON Responses object.
|
|
254
|
+
*
|
|
255
|
+
* The bounded-JSON policy (#875) answers a streaming client by synthesizing SSE
|
|
256
|
+
* from a completed JSON body, and reframes the same body into events for WS
|
|
257
|
+
* turns. Neither path goes through the SSE relay, so neither picks up the SSE
|
|
258
|
+
* item-id rewrite — a provider that needs id repair would get it on a streaming
|
|
259
|
+
* response and silently lose it the moment the reliability policy switched the
|
|
260
|
+
* upstream to bounded JSON. This applies the same rewrite to the object so all
|
|
261
|
+
* three paths agree. Raw recorded state is untouched: recording happens before
|
|
262
|
+
* any normalization.
|
|
263
|
+
*/
|
|
264
|
+
export function repairResponsesJsonItemIds(
|
|
265
|
+
response: Record<string, unknown>,
|
|
266
|
+
config: ResponsesItemIdRepairConfig,
|
|
267
|
+
budget?: TranslatorBudget,
|
|
268
|
+
): Record<string, unknown> {
|
|
269
|
+
const state = createRepairState(config, budget);
|
|
270
|
+
const rewritten = rewriteResponseSnapshot(state, response);
|
|
271
|
+
return rewritten.changed ? rewritten.response : response;
|
|
272
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared bounded-JSON → Responses event sequence (#875): the same pure event
|
|
3
|
+
* list used by the WebSocket bridge (sendResponsesJsonAsEvents) and by the
|
|
4
|
+
* HTTP SSE synthesis for models whose reliability policy forces a bounded
|
|
5
|
+
* JSON upstream. One algorithm, two serializations — no duplicated drift.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type ResponsesJsonEventFrame = Record<string, unknown>;
|
|
9
|
+
|
|
10
|
+
export const MAX_SYNTHESIZED_OUTPUT_ITEMS = 10_000;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The canonical minimal sequence Codex commits: response.created (empty
|
|
14
|
+
* output, in_progress) → one response.output_item.done per output item → a
|
|
15
|
+
* status-preserving terminal (completed / failed / incomplete).
|
|
16
|
+
*/
|
|
17
|
+
export function responsesJsonEventSequence(
|
|
18
|
+
response: Record<string, unknown>,
|
|
19
|
+
rewritePayload?: (payload: Record<string, unknown>) => Record<string, unknown>,
|
|
20
|
+
): ResponsesJsonEventFrame[] {
|
|
21
|
+
return [...iterateResponsesJsonEvents(response, rewritePayload)];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function* iterateResponsesJsonEvents(
|
|
25
|
+
response: Record<string, unknown>,
|
|
26
|
+
rewritePayload?: (payload: Record<string, unknown>) => Record<string, unknown>,
|
|
27
|
+
): Generator<ResponsesJsonEventFrame> {
|
|
28
|
+
const rewrite = rewritePayload ?? ((payload: Record<string, unknown>) => payload);
|
|
29
|
+
const output = Array.isArray(response.output) ? response.output : [];
|
|
30
|
+
if (output.length > MAX_SYNTHESIZED_OUTPUT_ITEMS) {
|
|
31
|
+
throw new RangeError(
|
|
32
|
+
`Responses JSON output contains ${output.length} items; maximum is ${MAX_SYNTHESIZED_OUTPUT_ITEMS}`,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
const finalStatus = response.status === "failed" || response.status === "incomplete"
|
|
36
|
+
? response.status
|
|
37
|
+
: "completed";
|
|
38
|
+
yield rewrite({
|
|
39
|
+
type: "response.created",
|
|
40
|
+
response: { ...response, status: "in_progress", output: [] },
|
|
41
|
+
});
|
|
42
|
+
for (const [outputIndex, item] of output.entries()) {
|
|
43
|
+
yield rewrite({
|
|
44
|
+
type: "response.output_item.done",
|
|
45
|
+
output_index: outputIndex,
|
|
46
|
+
item,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
yield rewrite({
|
|
50
|
+
type: `response.${finalStatus}`,
|
|
51
|
+
response: { ...response, status: finalStatus },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Serialize the event sequence as one SSE body with exactly one
|
|
57
|
+
* `data: [DONE]\n\n` trailer.
|
|
58
|
+
*/
|
|
59
|
+
export function responsesJsonToSseBody(
|
|
60
|
+
response: Record<string, unknown>,
|
|
61
|
+
rewritePayload?: (payload: Record<string, unknown>) => Record<string, unknown>,
|
|
62
|
+
): string {
|
|
63
|
+
const frames = responsesJsonEventSequence(response, rewritePayload)
|
|
64
|
+
.map(frame => `data: ${JSON.stringify(frame)}\n\n`);
|
|
65
|
+
return `${frames.join("")}data: [DONE]\n\n`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Stream synthesized SSE frames without retaining the expanded body in memory. */
|
|
69
|
+
export function responsesJsonToSseStream(
|
|
70
|
+
response: Record<string, unknown>,
|
|
71
|
+
rewritePayload?: (payload: Record<string, unknown>) => Record<string, unknown>,
|
|
72
|
+
): ReadableStream<Uint8Array> {
|
|
73
|
+
const output = Array.isArray(response.output) ? response.output : [];
|
|
74
|
+
if (output.length > MAX_SYNTHESIZED_OUTPUT_ITEMS) {
|
|
75
|
+
throw new RangeError(
|
|
76
|
+
`Responses JSON output contains ${output.length} items; maximum is ${MAX_SYNTHESIZED_OUTPUT_ITEMS}`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
const frames = iterateResponsesJsonEvents(response, rewritePayload);
|
|
80
|
+
const encoder = new TextEncoder();
|
|
81
|
+
return new ReadableStream({
|
|
82
|
+
pull(controller) {
|
|
83
|
+
const next = frames.next();
|
|
84
|
+
controller.enqueue(encoder.encode(
|
|
85
|
+
next.done ? "data: [DONE]\n\n" : `data: ${JSON.stringify(next.value)}\n\n`,
|
|
86
|
+
));
|
|
87
|
+
if (next.done) controller.close();
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SsePayloadRewrite } from "./sse-payload-rewrite";
|
|
2
|
+
|
|
3
|
+
function rewriteResponseObjectModel(value: unknown, responseModelId: string): boolean {
|
|
4
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
5
|
+
const response = value as Record<string, unknown>;
|
|
6
|
+
if (typeof response.model !== "string" || response.model === responseModelId) return false;
|
|
7
|
+
response.model = responseModelId;
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Rewrite only existing Responses model metadata; unrelated and malformed payloads stay byte-identical. */
|
|
12
|
+
export function rewriteResponsesModelJson(json: string, responseModelId: string): string {
|
|
13
|
+
let parsed: unknown;
|
|
14
|
+
try {
|
|
15
|
+
parsed = JSON.parse(json);
|
|
16
|
+
} catch {
|
|
17
|
+
return json;
|
|
18
|
+
}
|
|
19
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return json;
|
|
20
|
+
const record = parsed as Record<string, unknown>;
|
|
21
|
+
const rootChanged = rewriteResponseObjectModel(record, responseModelId);
|
|
22
|
+
const nestedChanged = rewriteResponseObjectModel(record.response, responseModelId);
|
|
23
|
+
const changed = rootChanged || nestedChanged;
|
|
24
|
+
return changed ? JSON.stringify(record) : json;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createResponsesModelPayloadRewrite(responseModelId: string): SsePayloadRewrite {
|
|
28
|
+
return payload => rewriteResponsesModelJson(payload, responseModelId);
|
|
29
|
+
}
|