@iislee/opencodex 2.11.0 → 2.35.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/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -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/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- 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 +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- 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 +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -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 +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -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 +622 -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 +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- 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-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -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/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -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/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- 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 +33 -5
- 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.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- 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 +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -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 +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- 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 +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- 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 +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- 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 +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- 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 +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- 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/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- 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 +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- 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 +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- 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 +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless SSE block rewrite that backfills the `annotations` field on
|
|
3
|
+
* `output_text` content parts in Responses SSE events.
|
|
4
|
+
*
|
|
5
|
+
* The Responses API spec defines `annotations` as a required field on
|
|
6
|
+
* `OutputTextContent` (it is `Vec<Annotation>`, not `Option<Vec>`). Some
|
|
7
|
+
* upstream relays omit it when there are no annotations, which is technically
|
|
8
|
+
* spec-non-compliant. Strict deserializers — any client that follows the
|
|
9
|
+
* schema without `#[serde(default)]` on that field — fail with
|
|
10
|
+
* `missing field `annotations`` when the field is absent.
|
|
11
|
+
*
|
|
12
|
+
* This rewrite scans every SSE event for output_text content parts — whether
|
|
13
|
+
* they appear in item.content[], part, or response.output[].content[] — and
|
|
14
|
+
* adds annotations: [] if missing.
|
|
15
|
+
*
|
|
16
|
+
* Stateless: no retained buffers, no lifecycle tracking, no fail-closed.
|
|
17
|
+
* Existing values are always authoritative; only absent fields are added.
|
|
18
|
+
* The field is always valid on the wire, so adding it when absent is safe
|
|
19
|
+
* for all clients including Codex CLI/App.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
replaceSseDataPayload,
|
|
24
|
+
sseDataPayload,
|
|
25
|
+
type SseBlockRewrite,
|
|
26
|
+
} from "../sse-payload-rewrite";
|
|
27
|
+
import { isCompactionItemType } from "../../responses/compaction";
|
|
28
|
+
|
|
29
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
30
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Wire prefixes for Responses output item ids, matching OpenAI's id shapes. */
|
|
34
|
+
const ITEM_ID_PREFIXES: Readonly<Record<string, string>> = {
|
|
35
|
+
message: "msg_",
|
|
36
|
+
reasoning: "rs_",
|
|
37
|
+
function_call: "fc_",
|
|
38
|
+
custom_tool_call: "ctc_",
|
|
39
|
+
// A routed tool_search lowering is restored to `tool_search_call` without an id, so this
|
|
40
|
+
// backfill is what names it. The generic `item_` fallback is not merely cosmetic here:
|
|
41
|
+
// `stripInvalidItemIds` in the Responses adapter deletes any id whose prefix does not match
|
|
42
|
+
// the type, so an `item_`-named tool_search_call silently loses its id on the NEXT turn and
|
|
43
|
+
// the client sees an item it cannot correlate. The prefixes here must stay a superset of the
|
|
44
|
+
// ones that serializer enforces.
|
|
45
|
+
tool_search_call: "tsc_",
|
|
46
|
+
web_search_call: "ws_",
|
|
47
|
+
file_search_call: "fs_",
|
|
48
|
+
code_interpreter_call: "ci_",
|
|
49
|
+
computer_call: "cc_",
|
|
50
|
+
// The Responses wire type is `image_generation_call`; `image_gen_call` is kept only so a
|
|
51
|
+
// relay that emits the short spelling is not silently demoted to the generic `item_`.
|
|
52
|
+
image_generation_call: "ig_",
|
|
53
|
+
image_gen_call: "ig_",
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Backfill a required id on an output item when absent. Strict Responses
|
|
58
|
+
* decoders (e.g. grok-build serde types) fail with "missing field id" when a
|
|
59
|
+
* message or reasoning item has no id, which some upstream relays omit. The
|
|
60
|
+
* generated id is deterministic per (type, output index) so it stays stable
|
|
61
|
+
* across streaming events that reference the same item.
|
|
62
|
+
*/
|
|
63
|
+
function backfillItemId(item: Record<string, unknown>, slot: ItemIdSlot): Record<string, unknown> {
|
|
64
|
+
if (typeof item.id === "string" && item.id.length > 0) return item;
|
|
65
|
+
const type = typeof item.type === "string" ? item.type : "";
|
|
66
|
+
const prefix = Object.prototype.hasOwnProperty.call(ITEM_ID_PREFIXES, type) ? ITEM_ID_PREFIXES[type] : "item_";
|
|
67
|
+
return { ...item, id: prefix + "ocx_" + (slot.kind === "index" ? String(slot.index) : "fallback_" + slot.ordinal) };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Which namespace a synthesized id comes from.
|
|
72
|
+
*
|
|
73
|
+
* Keeping the fallback counter in the SAME numeric namespace as real output indexes only
|
|
74
|
+
* pushed the collision out of reach rather than removing it: a response whose real index
|
|
75
|
+
* happened to be 1_000_001 would produce the same id as the first malformed-index fallback,
|
|
76
|
+
* and a duplicate id is exactly what this backfill exists to prevent. The namespaces are now
|
|
77
|
+
* lexically disjoint, so no index value can ever collide with a fallback.
|
|
78
|
+
*/
|
|
79
|
+
type ItemIdSlot = { kind: "index"; index: number } | { kind: "fallback"; ordinal: number };
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Monotonic ordinal for an event whose `output_index` is absent or malformed.
|
|
83
|
+
*
|
|
84
|
+
* Process-global rather than per-response because this module is stateless by design and the
|
|
85
|
+
* value only has to be unique, not meaningful. It carries its own `fallback_` namespace, so
|
|
86
|
+
* uniqueness no longer depends on a real index never reaching some arbitrary ceiling.
|
|
87
|
+
*/
|
|
88
|
+
let syntheticItemOrdinal = 0;
|
|
89
|
+
function nextSyntheticItemSlot(): ItemIdSlot {
|
|
90
|
+
syntheticItemOrdinal += 1;
|
|
91
|
+
return { kind: "fallback", ordinal: syntheticItemOrdinal };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Backfill `status` on a message output item if missing.
|
|
96
|
+
*
|
|
97
|
+
* The Responses API spec defines `status` as a required field on
|
|
98
|
+
* `OutputMessage`. Some upstream relays omit it, which causes strict
|
|
99
|
+
* deserializers (e.g. grok-build's serde types) to fail with
|
|
100
|
+
* `missing field 'status'`. Only message items carry this field in the
|
|
101
|
+
* Responses schema; reasoning, function_call, and other item types do not.
|
|
102
|
+
*
|
|
103
|
+
* The value is inferred from the event context: `output_item.added` and
|
|
104
|
+
* `response.created` / `response.in_progress` mean the message is still
|
|
105
|
+
* being generated (`in_progress`); `output_item.done` and
|
|
106
|
+
* `response.completed` / `response.incomplete` mean the message is
|
|
107
|
+
* finalized (`completed` / `incomplete` respectively).
|
|
108
|
+
*
|
|
109
|
+
* Returns the same object reference if no change is needed.
|
|
110
|
+
*/
|
|
111
|
+
function backfillItemStatus(item: Record<string, unknown>, inferredStatus: string): Record<string, unknown> {
|
|
112
|
+
if (item.type !== "message") return item;
|
|
113
|
+
if ("status" in item) return item;
|
|
114
|
+
return { ...item, status: inferredStatus };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Backfill annotations: [] on an output_text content part if missing.
|
|
119
|
+
* Returns the same object reference if no change is needed.
|
|
120
|
+
*/
|
|
121
|
+
function backfillOutputTextPart(part: Record<string, unknown>): Record<string, unknown> {
|
|
122
|
+
if (part.type !== "output_text") return part;
|
|
123
|
+
// Only add annotations when the key is entirely absent — preserve any
|
|
124
|
+
// existing value (even null or a malformed type) so we never overwrite
|
|
125
|
+
// what the upstream actually sent.
|
|
126
|
+
if ("annotations" in part) return part;
|
|
127
|
+
return { ...part, annotations: [] };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Walk a content array and backfill output_text parts.
|
|
132
|
+
* Returns the same array reference if nothing changed.
|
|
133
|
+
*/
|
|
134
|
+
function backfillContentArray(content: unknown): unknown {
|
|
135
|
+
if (!Array.isArray(content)) return content;
|
|
136
|
+
let changed = false;
|
|
137
|
+
const repaired = content.map((part) => {
|
|
138
|
+
if (!isPlainObject(part)) return part;
|
|
139
|
+
const next = backfillOutputTextPart(part);
|
|
140
|
+
if (next !== part) changed = true;
|
|
141
|
+
return next;
|
|
142
|
+
});
|
|
143
|
+
return changed ? repaired : content;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Walk an output item and backfill output_text parts in its content.
|
|
148
|
+
* Also backfills a missing required id and status on the item itself.
|
|
149
|
+
* Returns the same object reference if nothing changed.
|
|
150
|
+
*/
|
|
151
|
+
function backfillOutputItem(item: unknown, slot: ItemIdSlot, inferredStatus: string): unknown {
|
|
152
|
+
if (!isPlainObject(item)) return item;
|
|
153
|
+
// The compact wire family is the `/v1/responses/compact` format, not a Responses output item.
|
|
154
|
+
// Those items have no `id` in that contract, so synthesizing one changes a response body the
|
|
155
|
+
// client compares exactly — and the client replays the item on every later turn, where the
|
|
156
|
+
// minting backend rejects it as modified. The backfill exists to satisfy strict Responses
|
|
157
|
+
// decoders; a shape those decoders never see is outside its remit.
|
|
158
|
+
if (isCompactionItemType(item.type)) return item;
|
|
159
|
+
const content = item.content;
|
|
160
|
+
const repaired = backfillContentArray(content);
|
|
161
|
+
const withId = backfillItemId(item, slot);
|
|
162
|
+
const withStatus = backfillItemStatus(withId, inferredStatus);
|
|
163
|
+
if (repaired === content && withStatus === item) return item;
|
|
164
|
+
return { ...withStatus, ...(repaired === content ? {} : { content: repaired }) };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Walk a response object's output[] and backfill output_text parts.
|
|
169
|
+
*
|
|
170
|
+
* `inferredItemStatus` is the status to backfill on message items that lack
|
|
171
|
+
* one — derived from the event type so `output_item.added` / `response.created`
|
|
172
|
+
* gets `in_progress` while `output_item.done` / `response.completed` gets
|
|
173
|
+
* `completed`.
|
|
174
|
+
*
|
|
175
|
+
* Deliberately does NOT backfill `created_at`. #2639 proposed it for the same
|
|
176
|
+
* strict-decoder reason as `status`, but the proxy also relays some upstream
|
|
177
|
+
* responses verbatim, and `tests/server-combo-failover-e2e.test.ts` asserts a
|
|
178
|
+
* combo backup response is returned byte-exact. Injecting a field the upstream
|
|
179
|
+
* never sent breaks that contract. Both cannot hold for the same body, so the
|
|
180
|
+
* `created_at` half needs its own decision about which contract yields; it is
|
|
181
|
+
* not a detail to slip in beside `status`.
|
|
182
|
+
*
|
|
183
|
+
* Returns the same object reference if nothing changed.
|
|
184
|
+
*/
|
|
185
|
+
function backfillResponseOutput(response: unknown, inferredItemStatus: string): unknown {
|
|
186
|
+
if (!isPlainObject(response)) return response;
|
|
187
|
+
const output = response.output;
|
|
188
|
+
if (!Array.isArray(output)) return response;
|
|
189
|
+
let changed = false;
|
|
190
|
+
const repaired = output.map((item, idx) => {
|
|
191
|
+
if (!isPlainObject(item)) return item;
|
|
192
|
+
const next = backfillOutputItem(item, { kind: "index", index: idx }, inferredItemStatus);
|
|
193
|
+
if (next !== item) changed = true;
|
|
194
|
+
return next;
|
|
195
|
+
});
|
|
196
|
+
return changed ? { ...response, output: repaired } : response;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Infer the status to backfill on a message item from the event type.
|
|
201
|
+
*
|
|
202
|
+
* `output_item.added` means the item is still being generated (`in_progress`);
|
|
203
|
+
* `output_item.done` means it is finalized (`completed`). Response-level events
|
|
204
|
+
* infer from the response's own status field — which is authoritative when present.
|
|
205
|
+
* If the response status is also absent, the event type itself determines the phase:
|
|
206
|
+
* `response.created` / `response.in_progress` → `in_progress`,
|
|
207
|
+
* `response.completed` → `completed`, `response.incomplete` → `incomplete`.
|
|
208
|
+
*/
|
|
209
|
+
function inferredStatusForEventType(eventType: string): string {
|
|
210
|
+
if (eventType === "response.output_item.added") return "in_progress";
|
|
211
|
+
if (eventType === "response.output_item.done") return "completed";
|
|
212
|
+
if (eventType === "response.created" || eventType === "response.in_progress") return "in_progress";
|
|
213
|
+
// `queued` is a real Responses lifecycle status: the response exists but has not
|
|
214
|
+
// started generating. Without this row it falls through to the `completed`
|
|
215
|
+
// default below, which would mark an unstarted message as finished.
|
|
216
|
+
if (eventType === "response.queued") return "in_progress";
|
|
217
|
+
if (eventType === "response.incomplete" || eventType === "response.failed") return "incomplete";
|
|
218
|
+
return "completed";
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Map a response-level lifecycle status to a valid OutputMessage status.
|
|
223
|
+
*
|
|
224
|
+
* `OutputMessage.status` accepts only `in_progress`, `completed`, or
|
|
225
|
+
* `incomplete`. Response-level statuses like `failed` or `cancelled` have no
|
|
226
|
+
* direct message-level equivalent, but `incomplete` is the correct semantic
|
|
227
|
+
* mapping: the message did not finish generating. Writing `completed` would
|
|
228
|
+
* assert something the upstream never claimed — a client branching on
|
|
229
|
+
* `status === "completed"` would treat a truncated message as whole.
|
|
230
|
+
*/
|
|
231
|
+
function messageStatusFromResponseStatus(status: string): string | null {
|
|
232
|
+
if (status === "in_progress" || status === "completed" || status === "incomplete") return status;
|
|
233
|
+
// A queued response has not begun generating, so its message items are
|
|
234
|
+
// in_progress — never completed. Returning null here would fall back to the
|
|
235
|
+
// event-type inference, whose default is `completed`.
|
|
236
|
+
if (status === "queued") return "in_progress";
|
|
237
|
+
if (status === "failed" || status === "cancelled") return "incomplete";
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Statelessly rewrite one SSE event: backfill annotations
|
|
243
|
+
* on any output_text content part found in the event payload.
|
|
244
|
+
*/
|
|
245
|
+
function rewriteEvent(event: Record<string, unknown>): Record<string, unknown> {
|
|
246
|
+
const type = typeof event.type === "string" ? event.type : "";
|
|
247
|
+
const inferredItemStatus = inferredStatusForEventType(type);
|
|
248
|
+
let next = event;
|
|
249
|
+
let changed = false;
|
|
250
|
+
|
|
251
|
+
// output_item.added / output_item.done: item.content[] -> output_text parts
|
|
252
|
+
if ((type === "response.output_item.added" || type === "response.output_item.done")
|
|
253
|
+
&& isPlainObject(event.item)) {
|
|
254
|
+
const rawIndex = event.output_index;
|
|
255
|
+
// A malformed or absent `output_index` must not collapse to 0: two such events would then
|
|
256
|
+
// both synthesize `msg_ocx_0`, and duplicate ids are the very thing this backfill exists to
|
|
257
|
+
// prevent. Fall back to a per-process counter so the synthesized id stays unique. Position
|
|
258
|
+
// is not recoverable in that case, but a unique id is what strict decoders require, and a
|
|
259
|
+
// well-formed stream still gets the stable index-derived id.
|
|
260
|
+
const item = typeof rawIndex === "number" && Number.isInteger(rawIndex) && rawIndex >= 0
|
|
261
|
+
? backfillOutputItem(event.item, { kind: "index", index: rawIndex }, inferredItemStatus)
|
|
262
|
+
: backfillOutputItem(event.item, nextSyntheticItemSlot(), inferredItemStatus);
|
|
263
|
+
if (item !== event.item) {
|
|
264
|
+
next = { ...next, item };
|
|
265
|
+
changed = true;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// content_part.added / content_part.done: part -> output_text
|
|
270
|
+
if ((type === "response.content_part.added" || type === "response.content_part.done")
|
|
271
|
+
&& isPlainObject(event.part)) {
|
|
272
|
+
const part = backfillOutputTextPart(event.part);
|
|
273
|
+
if (part !== event.part) {
|
|
274
|
+
next = { ...next, part };
|
|
275
|
+
changed = true;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// response.created / in_progress / completed / incomplete / failed:
|
|
280
|
+
// response.output[].content[] -> output_text parts
|
|
281
|
+
if (isPlainObject(event.response)) {
|
|
282
|
+
// For response-level events, prefer the response's own status when it is a valid
|
|
283
|
+
// OutputMessage status. Response lifecycle statuses like "failed" or "cancelled"
|
|
284
|
+
// have no message-level equivalent — fall back to the event-type inference instead.
|
|
285
|
+
const responseStatus = typeof event.response.status === "string"
|
|
286
|
+
? messageStatusFromResponseStatus(event.response.status) ?? inferredItemStatus
|
|
287
|
+
: inferredItemStatus;
|
|
288
|
+
const response = backfillResponseOutput(event.response, responseStatus);
|
|
289
|
+
if (response !== event.response) {
|
|
290
|
+
next = { ...next, response };
|
|
291
|
+
changed = true;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return changed ? next : event;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Create a stateless SSE block rewrite that backfills annotations and
|
|
300
|
+
* message status on output_text content parts and message items.
|
|
301
|
+
* Unconditional: both are required canonical Responses fields, so adding
|
|
302
|
+
* them when absent is safe for all clients.
|
|
303
|
+
*/
|
|
304
|
+
export function createResponsesFieldBackfillBlockRewrite(): SseBlockRewrite {
|
|
305
|
+
const rewrite: SseBlockRewrite = (block: string): readonly string[] => {
|
|
306
|
+
const payload = sseDataPayload(block);
|
|
307
|
+
if (payload === null) return [block];
|
|
308
|
+
let event: unknown;
|
|
309
|
+
try {
|
|
310
|
+
event = JSON.parse(payload);
|
|
311
|
+
} catch {
|
|
312
|
+
return [block];
|
|
313
|
+
}
|
|
314
|
+
if (!isPlainObject(event)) return [block];
|
|
315
|
+
const rewritten = rewriteEvent(event);
|
|
316
|
+
if (rewritten === event) return [block];
|
|
317
|
+
return [replaceSseDataPayload(block, JSON.stringify(rewritten))];
|
|
318
|
+
};
|
|
319
|
+
return rewrite;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Backfill annotations on a non-streaming Responses JSON
|
|
324
|
+
* object. Mirrors the SSE block rewrite for the bounded-JSON passthrough
|
|
325
|
+
* path. Returns the original string if no change is needed.
|
|
326
|
+
*/
|
|
327
|
+
export function backfillResponsesFieldsJson(payload: string): string {
|
|
328
|
+
let response: unknown;
|
|
329
|
+
try {
|
|
330
|
+
response = JSON.parse(payload);
|
|
331
|
+
} catch {
|
|
332
|
+
return payload;
|
|
333
|
+
}
|
|
334
|
+
if (!isPlainObject(response)) return payload;
|
|
335
|
+
// For a non-streaming response, derive the item status from the response's own
|
|
336
|
+
// status field when it is a valid OutputMessage status; fall back to "completed".
|
|
337
|
+
const inferredItemStatus = typeof response.status === "string"
|
|
338
|
+
? messageStatusFromResponseStatus(response.status) ?? "completed"
|
|
339
|
+
: "completed";
|
|
340
|
+
const repaired = backfillResponseOutput(response, inferredItemStatus);
|
|
341
|
+
if (repaired === response) return payload;
|
|
342
|
+
return JSON.stringify(repaired);
|
|
343
|
+
}
|
|
@@ -117,7 +117,7 @@ export function analyzeTerminalTurn(parsed: OcxParsedRequest, events: readonly A
|
|
|
117
117
|
return { decision: "continue", reason: "suspicious_no_tool", assistantText: text, userText, hasToolCall };
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
function assistantMessageFromEvents(events: readonly AdapterEvent[]): OcxAssistantMessage | undefined {
|
|
120
|
+
function assistantMessageFromEvents(events: readonly AdapterEvent[], timestamp: number): OcxAssistantMessage | undefined {
|
|
121
121
|
let text = "";
|
|
122
122
|
let thinking = "";
|
|
123
123
|
let signature: string | undefined;
|
|
@@ -134,14 +134,18 @@ function assistantMessageFromEvents(events: readonly AdapterEvent[]): OcxAssista
|
|
|
134
134
|
}
|
|
135
135
|
if (text) content.push({ type: "text", text });
|
|
136
136
|
if (content.length === 0) return undefined;
|
|
137
|
-
return { role: "assistant", content, timestamp
|
|
137
|
+
return { role: "assistant", content, timestamp };
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
export function buildContinuationRequest(parsed: OcxParsedRequest, events: readonly AdapterEvent[]): OcxParsedRequest {
|
|
141
141
|
const messages = [...parsed.context.messages];
|
|
142
|
-
|
|
142
|
+
// One clock read for the whole rebuild. Two Date.now() calls could straddle a millisecond
|
|
143
|
+
// boundary, which made the retained-heartbeat contract test fail intermittently in CI on a
|
|
144
|
+
// 1ms skew between the assistant message and the nudge that follows it.
|
|
145
|
+
const timestamp = Date.now();
|
|
146
|
+
const assistant = assistantMessageFromEvents(events, timestamp);
|
|
143
147
|
if (assistant) messages.push(assistant);
|
|
144
|
-
messages.push({ role: "developer", content: TERMINAL_GUARD_NUDGE, timestamp
|
|
148
|
+
messages.push({ role: "developer", content: TERMINAL_GUARD_NUDGE, timestamp });
|
|
145
149
|
return { ...parsed, context: { ...parsed.context, messages } };
|
|
146
150
|
}
|
|
147
151
|
|
|
@@ -153,6 +157,16 @@ export interface GuardedEventStreamOptions {
|
|
|
153
157
|
maxAutoContinuations?: number;
|
|
154
158
|
}
|
|
155
159
|
|
|
160
|
+
/**
|
|
161
|
+
* Events that are useful to the downstream stream consumer but carry no state used by the
|
|
162
|
+
* terminal-continuation decision or its rebuilt request. Keep them out of the retained event
|
|
163
|
+
* list so adapter liveness markers and arbitrarily large tool-argument fragments cannot make
|
|
164
|
+
* the guard's per-turn memory grow without adding any continuation semantics.
|
|
165
|
+
*/
|
|
166
|
+
export function isTerminalGuardPassthroughOnly(event: AdapterEvent): boolean {
|
|
167
|
+
return event.type === "heartbeat" || event.type === "tool_call_delta";
|
|
168
|
+
}
|
|
169
|
+
|
|
156
170
|
function mergeUsage(first: OcxUsage | undefined, second: OcxUsage | undefined): OcxUsage | undefined {
|
|
157
171
|
if (!first) return second;
|
|
158
172
|
if (!second) return first;
|
|
@@ -193,9 +207,16 @@ export async function* guardTerminalEventStream(options: GuardedEventStreamOptio
|
|
|
193
207
|
const seen: AdapterEvent[] = [];
|
|
194
208
|
let terminalSeen = false;
|
|
195
209
|
for await (const event of source) {
|
|
210
|
+
// Liveness markers and tool argument fragments are passed through to the bridge, but
|
|
211
|
+
// neither analyzeTerminalTurn nor buildContinuationRequest consumes them. Retaining the
|
|
212
|
+
// fragments would duplicate arbitrarily large argument payloads in `seen` for no effect.
|
|
213
|
+
if (isTerminalGuardPassthroughOnly(event)) {
|
|
214
|
+
yield event;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
196
217
|
if (event.type === "done") {
|
|
197
218
|
terminalSeen = true;
|
|
198
|
-
const analysis = options.adapterName === "anthropic"
|
|
219
|
+
const analysis = (options.adapterName === "anthropic" || options.adapterName === "openai-chat")
|
|
199
220
|
? analyzeTerminalTurn(parsed, seen)
|
|
200
221
|
: { decision: "pass" as const };
|
|
201
222
|
const normalStop = event.stopReason !== "max_tokens" && event.stopReason !== "content_filter";
|
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* #553 looking for an adapter URL bug that does not exist. Name the likely cause and the
|
|
6
6
|
* command that settles it.
|
|
7
7
|
*/
|
|
8
|
+
import { RequestPacingQueueOverloadError } from "../../providers/request-pacing";
|
|
9
|
+
|
|
8
10
|
export function describeUpstreamConnectFailure(err: unknown, connectMs: number): string {
|
|
11
|
+
// Local pacing admission is not a transport failure. Let the outer response boundary
|
|
12
|
+
// preserve its retryable 429 identity instead of laundering it into a 502.
|
|
13
|
+
if (err instanceof RequestPacingQueueOverloadError) throw err;
|
|
9
14
|
if (err instanceof Error && err.name === "TimeoutError") {
|
|
10
15
|
return `Provider connect timeout after ${connectMs}ms`;
|
|
11
16
|
}
|