@bitkyc08/opencodex 2.84.0 → 2.87.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/README.md +0 -4
- package/bin/ocx.mjs +61 -3
- package/gui/dist/assets/App-ZfYbLHkB.js +58 -0
- package/gui/dist/assets/App-wT3mXqFz.css +1 -0
- package/gui/dist/assets/{Tray-C9TGtwad.js → Tray-DCd-A1az.js} +1 -1
- package/gui/dist/assets/index-CfYDMj34.js +94 -0
- package/gui/dist/assets/index-DPeB9HpV.css +1 -0
- package/gui/dist/assets/quota-summary-ChvmKGOk.js +1 -0
- package/gui/dist/index.html +2 -2
- package/package.json +1 -2
- package/src/adapters/anthropic/beta-allowlist.ts +91 -11
- package/src/adapters/anthropic/beta-body-pairs.ts +93 -0
- package/src/adapters/anthropic/client-identity.ts +1 -1
- package/src/adapters/anthropic/passthrough.ts +16 -3
- package/src/adapters/anthropic-progress.ts +84 -0
- package/src/adapters/anthropic.ts +108 -21
- package/src/adapters/azure.ts +19 -1
- package/src/adapters/base.ts +2 -0
- package/src/adapters/claude-cli/adapter.ts +111 -23
- package/src/adapters/claude-cli/profiles.ts +2 -1
- package/src/adapters/claude-cli/stable-replay.ts +108 -0
- package/src/adapters/claude-cli/usage-admission.ts +230 -0
- package/src/adapters/client-fingerprint.ts +24 -0
- package/src/adapters/coding-agent/protocol.ts +1 -1
- package/src/adapters/coding-agent/turn.ts +40 -11
- package/src/adapters/cursor/arg-codec.ts +17 -5
- package/src/adapters/cursor/catalog.ts +8 -0
- package/src/adapters/cursor/effort-map.ts +3 -0
- package/src/adapters/cursor/freeform-args.ts +75 -0
- package/src/adapters/cursor/protobuf-events.ts +36 -23
- package/src/adapters/dsh-account.ts +97 -0
- package/src/adapters/google-antigravity-wire.ts +22 -1
- package/src/adapters/google.ts +37 -10
- package/src/adapters/openai-chat/messages.ts +4 -3
- package/src/adapters/openai-chat/passthrough.ts +8 -2
- package/src/adapters/openai-chat/reasoning-replay.ts +52 -0
- package/src/adapters/openai-chat/response-events.ts +59 -1
- package/src/adapters/openai-chat.ts +8 -5
- package/src/adapters/openai-responses/compaction-search-history.ts +14 -7
- package/src/adapters/openai-responses/passthrough.ts +57 -125
- package/src/adapters/openai-responses/request-strips.ts +25 -3
- package/src/adapters/openai-responses/transport.ts +81 -0
- package/src/adapters/qoder/adapter.ts +44 -3
- package/src/adapters/registry.ts +5 -0
- package/src/adapters/zed.ts +26 -1
- package/src/advisor/activity.ts +55 -0
- package/src/advisor/budget.ts +62 -0
- package/src/advisor/consult.ts +223 -0
- package/src/advisor/context.ts +238 -0
- package/src/advisor/disclosure.ts +20 -0
- package/src/advisor/evidence-tool.ts +21 -0
- package/src/advisor/evidence.ts +117 -0
- package/src/advisor/runtime.ts +353 -0
- package/src/advisor/settings.ts +144 -0
- package/src/advisor/state.ts +369 -0
- package/src/advisor/synthetic-tool.ts +33 -0
- package/src/bridge/errors.ts +24 -1
- package/src/bridge/internal.ts +3 -1
- package/src/bridge/response-json.ts +18 -3
- package/src/bridge/sse.ts +58 -8
- package/src/bridge/terminal-refusal.ts +59 -0
- package/src/chat/inbound.ts +30 -6
- package/src/chat/outbound.ts +5 -0
- package/src/claude/desktop-3p-library.ts +72 -7
- package/src/claude/desktop-3p.ts +75 -19
- package/src/claude/desktop-first-party.ts +1 -1
- package/src/claude/desktop-picker-platform.ts +4 -0
- package/src/claude/desktop-picker-profile.ts +11 -4
- package/src/claude/desktop-picker.ts +15 -8
- package/src/claude/desktop-profile.ts +10 -1
- package/src/claude/desktop-remote-store-io.ts +5 -3
- package/src/claude/desktop-system-proxy.ts +50 -4
- package/src/claude/inbound-content-options.ts +11 -0
- package/src/claude/inbound.ts +154 -50
- package/src/claude/intercept/local-ca.ts +8 -1
- package/src/claude/intercept/picker-ca-startup.ts +2 -1
- package/src/claude/intercept/picker-runtime.ts +6 -5
- package/src/claude/intercept/picker-trust-windows.ts +338 -0
- package/src/claude/intercept/picker-trust.ts +19 -0
- package/src/claude/intercept/port-policy.ts +30 -0
- package/src/claude/intercept/runtime.ts +97 -94
- package/src/claude/model-default-settings.ts +154 -0
- package/src/claude/model-info.ts +7 -7
- package/src/claude/outbound.ts +51 -19
- package/src/cli/account-api.ts +1 -0
- package/src/cli/account-policy-dto.ts +6 -0
- package/src/cli/account-policy.ts +34 -5
- package/src/cli/account-preservation.ts +44 -0
- package/src/cli/account.ts +8 -2
- package/src/cli/advisor.ts +165 -0
- package/src/cli/auxiliary-listener-preflight.ts +37 -0
- package/src/cli/capabilities-accounts.ts +20 -1
- package/src/cli/capabilities-agents-routing.ts +23 -2
- package/src/cli/capabilities-base.ts +39 -11
- package/src/cli/capabilities-observe-system.ts +63 -3
- package/src/cli/capabilities-provider-models.ts +11 -0
- package/src/cli/chatgpt-command.ts +35 -14
- package/src/cli/claude.ts +46 -6
- package/src/cli/codex-cli-update.ts +151 -41
- package/src/cli/codex-provider.ts +44 -0
- package/src/cli/combo-input.ts +10 -1
- package/src/cli/combo-result.ts +1 -1
- package/src/cli/combo.ts +2 -1
- package/src/cli/cross-home-owner.ts +17 -14
- package/src/cli/dispatch.ts +30 -5
- package/src/cli/doctor.ts +15 -1
- package/src/cli/ensure-desktop-cold-start.ts +382 -0
- package/src/cli/export-command.ts +1 -1
- package/src/cli/help.ts +4 -2
- package/src/cli/index.ts +14 -5
- package/src/cli/integration-plan-dto.ts +3 -0
- package/src/cli/log-history.ts +172 -0
- package/src/cli/models-runtime-subcommands.ts +1 -0
- package/src/cli/models-runtime.ts +72 -8
- package/src/cli/observe-stream.ts +2 -0
- package/src/cli/observe.ts +16 -4
- package/src/cli/provider.ts +27 -5
- package/src/cli/registry.ts +41 -9
- package/src/cli/restart-scope.ts +3 -1
- package/src/cli/runtime-api.ts +5 -3
- package/src/cli/system-command.ts +40 -8
- package/src/cli/uninstall-client-state.ts +32 -0
- package/src/cli/usage-compare.ts +309 -0
- package/src/cli/usage-model-search.ts +4 -4
- package/src/cli/usage-report.ts +2 -2
- package/src/cli/v2.ts +1 -1
- package/src/client/machine-listener.ts +1 -3
- package/src/client/runtime.ts +1 -0
- package/src/clients/client-path.ts +51 -0
- package/src/clients/config-export/contracts.ts +3 -1
- package/src/clients/config-export/model-metadata.ts +3 -2
- package/src/clients/config-export/qoder.ts +93 -0
- package/src/clients/config-export.ts +35 -48
- package/src/clients/gentle-shell-path.ts +87 -0
- package/src/codex/account-auto-switch.ts +2 -0
- package/src/codex/account-identity.ts +29 -0
- package/src/codex/account-label.ts +1 -1
- package/src/codex/account-lifecycle.ts +21 -5
- package/src/codex/account-preservation.ts +28 -0
- package/src/codex/account-use-remaining.ts +23 -0
- package/src/codex/app-server-processes.ts +97 -7
- package/src/codex/app-server-restart-service.ts +55 -4
- package/src/codex/auth-api/account-list.ts +4 -0
- package/src/codex/auth-api/account-pause-group.ts +6 -50
- package/src/codex/auth-api/account-preservation.ts +57 -0
- package/src/codex/auth-api/pool-mode-gate.ts +5 -2
- package/src/codex/auth-api/routes.ts +8 -0
- package/src/codex/auth-api/use-remaining-route.ts +36 -0
- package/src/codex/auth-api.ts +0 -1
- package/src/codex/auth-context.ts +81 -7
- package/src/codex/autostart-health.ts +4 -0
- package/src/codex/catalog/auto-review.ts +20 -3
- package/src/codex/catalog/build-entries.ts +19 -2
- package/src/codex/catalog/combo-member.ts +14 -5
- package/src/codex/catalog/configured-tiers.ts +50 -0
- package/src/codex/catalog/effort.ts +4 -1
- package/src/codex/catalog/gather-capture.ts +2 -0
- package/src/codex/catalog/metadata.ts +11 -9
- package/src/codex/catalog/model-hints.ts +42 -19
- package/src/codex/catalog/model-visibility.ts +3 -1
- package/src/codex/catalog/native-ultrafast.ts +106 -0
- package/src/codex/catalog/parsing.ts +35 -86
- package/src/codex/catalog/provider-models.ts +40 -34
- package/src/codex/catalog/retained-sync.ts +2 -0
- package/src/codex/catalog/routed-gather.ts +33 -16
- package/src/codex/catalog/vendor-context.ts +82 -0
- package/src/codex/cli-install-provenance.ts +105 -17
- package/src/codex/cli-update-plan.ts +545 -0
- package/src/codex/config-write-lock.ts +63 -4
- package/src/codex/convergence.ts +2 -0
- package/src/codex/desktop-app/picker-freshness.ts +96 -0
- package/src/codex/desktop-app/types.ts +2 -0
- package/src/codex/desktop-app/windows.ts +29 -16
- package/src/codex/desktop-app-restart.ts +25 -2
- package/src/codex/desktop-compatibility/certificate-service.ts +99 -0
- package/src/codex/desktop-compatibility/certificate-store.ts +193 -0
- package/src/codex/desktop-compatibility/connection-store.ts +87 -0
- package/src/codex/desktop-compatibility/installed-build.ts +73 -0
- package/src/codex/desktop-compatibility/json-body.ts +29 -0
- package/src/codex/desktop-compatibility/native-identity.ts +62 -0
- package/src/codex/desktop-compatibility/relay-listener.ts +93 -0
- package/src/codex/desktop-compatibility/routing-binding.ts +10 -0
- package/src/codex/desktop-compatibility/routing-preflight.ts +69 -0
- package/src/codex/desktop-compatibility/runtime-ownership.ts +28 -0
- package/src/codex/desktop-compatibility/runtime.ts +182 -0
- package/src/codex/desktop-compatibility/service.ts +30 -0
- package/src/codex/desktop-compatibility/startup-settings.ts +50 -0
- package/src/codex/desktop-compatibility/usage-activation.ts +86 -0
- package/src/codex/desktop-compatibility/usage-controlled-fetch.ts +59 -0
- package/src/codex/desktop-compatibility/usage-controller.ts +107 -0
- package/src/codex/desktop-compatibility/usage-policy.ts +59 -0
- package/src/codex/desktop-compatibility/usage-refresh.ts +33 -0
- package/src/codex/desktop-compatibility/usage-sse-controller.ts +86 -0
- package/src/codex/desktop-compatibility/windows-activation-source.ts +44 -0
- package/src/codex/desktop-compatibility/windows-certificate-trust.ts +81 -0
- package/src/codex/desktop-compatibility/windows-key-protection.ts +165 -0
- package/src/codex/desktop-compatibility/windows-package-command.ts +86 -0
- package/src/codex/desktop-compatibility/windows-package-launch.ts +28 -0
- package/src/codex/features.ts +85 -45
- package/src/codex/history-provider.ts +1 -1
- package/src/codex/inject/config-write-section.ts +4 -1
- package/src/codex/inject/history-failure.ts +27 -0
- package/src/codex/inject/remove.ts +18 -6
- package/src/codex/inject/restore.ts +24 -2
- package/src/codex/inject/routing-classify.ts +4 -3
- package/src/codex/inject.ts +18 -27
- package/src/codex/journal.ts +16 -1
- package/src/codex/main-account-hard-lock.ts +30 -1
- package/src/codex/main-account.ts +99 -15
- package/src/codex/native-main-refresh-mode.ts +217 -0
- package/src/codex/native-profile-startup.ts +1 -1
- package/src/codex/ocx-compaction-history.ts +12 -10
- package/src/codex/paths.ts +86 -1
- package/src/codex/provider-routing.ts +174 -0
- package/src/codex/refresh.ts +2 -2
- package/src/codex/routing/health-store.ts +2 -2
- package/src/codex/routing/pool-recovery.ts +79 -0
- package/src/codex/routing/selection.ts +4 -3
- package/src/codex/routing/thread-affinity.ts +1 -1
- package/src/codex/shim-diagnostics.ts +6 -0
- package/src/codex/shim-overlay.ts +7 -2
- package/src/codex/signed-in-identity.ts +43 -0
- package/src/codex/subagent-model-fallback.ts +1 -1
- package/src/codex/sync.ts +6 -1
- package/src/codex/user-identity.ts +16 -5
- package/src/codex/windows-local-appdata.ts +84 -0
- package/src/combos/failover.ts +6 -1
- package/src/combos/index.ts +1 -0
- package/src/combos/resolve.ts +46 -10
- package/src/combos/types.ts +15 -0
- package/src/config/diagnostics.ts +35 -7
- package/src/config/live-reconcile.ts +51 -2
- package/src/config/load-degrade.ts +23 -1
- package/src/config/opencode-wire-upgrade.ts +54 -0
- package/src/config/opencode-zen-upgrade.ts +52 -0
- package/src/config/owner-registry.ts +22 -17
- package/src/config/paths.ts +10 -3
- package/src/config/provider-validation.ts +45 -2
- package/src/config/schema/config-schema.ts +39 -0
- package/src/config/schema/desktop-compatibility.ts +9 -0
- package/src/config/schema/leaf-validators.ts +39 -9
- package/src/config/schema/main-account-hard-lock-fallback.ts +26 -0
- package/src/config/schema/native-reasoning-retention.ts +26 -0
- package/src/config.ts +2 -0
- package/src/generated/compatibility-version.json +962 -350
- package/src/generated/model-metadata.ts +1 -1
- package/src/grok/sync.ts +1 -1
- package/src/images/loop.ts +46 -8
- package/src/integrations/catalog-refresh.ts +1 -1
- package/src/integrations/config-io.ts +20 -2
- package/src/integrations/journal.ts +15 -1
- package/src/integrations/mutation-plan.ts +2 -0
- package/src/integrations/registry.ts +15 -0
- package/src/integrations/store.ts +3 -0
- package/src/integrations/writer.ts +10 -1
- package/src/lib/advisor-activation.ts +16 -0
- package/src/lib/background-work.ts +65 -0
- package/src/lib/bounded-file-read.ts +58 -0
- package/src/lib/bun-path-runtime.d.mts +10 -1
- package/src/lib/bun-path-runtime.mjs +62 -3
- package/src/lib/codex-restart-contract.ts +15 -0
- package/src/lib/desktop-proxy-route.ts +30 -0
- package/src/lib/desktop-upstream-tunnel.ts +72 -0
- package/src/lib/empty-tool-catalog.ts +62 -0
- package/src/lib/errors.ts +26 -3
- package/src/lib/gcp-adc.ts +96 -9
- package/src/lib/gcp-credential-input.ts +12 -0
- package/src/lib/lab-live-route-production.ts +5 -0
- package/src/lib/local-internal-call-capability.ts +55 -0
- package/src/lib/opaque-proxy-tunnel.ts +217 -0
- package/src/lib/package-tree-integrity.ts +2 -2
- package/src/lib/redact.ts +2 -2
- package/src/lib/socks5-fetch.ts +48 -71
- package/src/lib/socks5-handshake.ts +112 -0
- package/src/lib/translator-budget.ts +7 -1
- package/src/oauth/account-quota-rank.ts +69 -2
- package/src/oauth/anthropic-account-refusal.ts +20 -2
- package/src/oauth/anthropic-oauth-definitions.ts +3 -1
- package/src/oauth/anthropic-routing.ts +1 -21
- package/src/oauth/anthropic.ts +38 -7
- package/src/oauth/callback-server.ts +27 -1
- package/src/oauth/chatgpt-device.ts +1 -1
- package/src/oauth/chatgpt-shared.ts +83 -0
- package/src/oauth/chatgpt.ts +8 -72
- package/src/oauth/dsh.ts +203 -0
- package/src/oauth/generic-account-failover.ts +62 -12
- package/src/oauth/generic-session-affinity.ts +125 -0
- package/src/oauth/index.ts +188 -111
- package/src/oauth/kiro-device-login.ts +2 -1
- package/src/oauth/kiro.ts +7 -1
- package/src/oauth/local-token-detect.ts +21 -1
- package/src/oauth/login-cli-errors.ts +44 -0
- package/src/oauth/login-cli.ts +69 -7
- package/src/oauth/login-flow-state.ts +371 -23
- package/src/oauth/meta-muse-errors.ts +41 -0
- package/src/oauth/meta-muse-keychain.ts +52 -0
- package/src/oauth/meta-muse.ts +51 -84
- package/src/oauth/model-discovery-auth.ts +3 -0
- package/src/oauth/pool-settings-capability.ts +4 -2
- package/src/oauth/refresh-flight-retirement.ts +48 -0
- package/src/oauth/session-affinity-key.ts +23 -0
- package/src/oauth/store-anthropic-instance.ts +9 -2
- package/src/oauth/store.ts +12 -5
- package/src/protocols/codecs/chat-ir.ts +467 -0
- package/src/protocols/codecs/chat.ts +10 -1
- package/src/protocols/codecs/messages-ir.ts +500 -0
- package/src/protocols/encoders/adapter-events.ts +5 -4
- package/src/protocols/encoders/messages.ts +9 -6
- package/src/protocols/features.ts +10 -2
- package/src/protocols/path.ts +11 -1
- package/src/protocols/plan-snapshot.ts +39 -16
- package/src/protocols/plan.ts +9 -1
- package/src/protocols/provider-summary.ts +2 -1
- package/src/protocols/settings.ts +8 -0
- package/src/providers/antigravity-account-roster.ts +102 -0
- package/src/providers/antigravity-models.ts +85 -7
- package/src/providers/api-key-cooldowns.ts +49 -0
- package/src/providers/api-key-resolve.ts +11 -6
- package/src/providers/api-key-response-ownership.ts +57 -0
- package/src/providers/api-key-selection.ts +31 -6
- package/src/providers/api-keys.ts +214 -3
- package/src/providers/claude-cli-usage.ts +96 -0
- package/src/providers/dsh-account-destination.ts +31 -0
- package/src/providers/dsh-account-models.ts +41 -0
- package/src/providers/gcp-credential-cleanup.ts +59 -0
- package/src/providers/key-failover.ts +54 -50
- package/src/providers/key-store.ts +7 -2
- package/src/providers/model-rename-fields.ts +5 -0
- package/src/providers/model-rename-migration.ts +7 -5
- package/src/providers/openai-tiers-destination.ts +11 -2
- package/src/providers/openai-tiers.ts +5 -12
- package/src/providers/opencode-go-transport.ts +3 -1
- package/src/providers/quota/account-cache.ts +6 -5
- package/src/providers/quota/account-row.ts +34 -0
- package/src/providers/quota/antigravity.ts +28 -7
- package/src/providers/quota/dsh-account.ts +70 -0
- package/src/providers/quota/vendor-probes-oauth.ts +1 -93
- package/src/providers/quota-types.ts +2 -0
- package/src/providers/quota.ts +14 -20
- package/src/providers/registry/entries-core.ts +44 -14
- package/src/providers/registry/entries-extended.ts +19 -0
- package/src/providers/registry/types.ts +1 -1
- package/src/providers/request-pacing.ts +77 -19
- package/src/providers/routed-config.ts +339 -0
- package/src/providers/service-tier.ts +2 -1
- package/src/quota/window-mapping.ts +5 -2
- package/src/responses/anthropic-progress.ts +34 -0
- package/src/responses/assistant-replay.ts +35 -0
- package/src/responses/compaction-history-framing.ts +65 -0
- package/src/responses/compaction.ts +6 -1
- package/src/responses/incomplete-reason.ts +31 -0
- package/src/responses/parser.ts +78 -22
- package/src/responses/reasoning-envelope.ts +4 -0
- package/src/responses/reasoning-replay-cache.ts +24 -2
- package/src/responses/reasoning-retention.ts +173 -0
- package/src/responses/retained-compaction.ts +46 -0
- package/src/responses/schema.ts +23 -0
- package/src/responses/state.ts +32 -29
- package/src/router.ts +8 -321
- package/src/routing/health.ts +37 -22
- package/src/routing/history/build-file.ts +92 -0
- package/src/routing/history/indexer.ts +254 -221
- package/src/routing/history/ingest.ts +242 -0
- package/src/routing/history/rebuild-job.ts +111 -0
- package/src/routing/history/rebuild-protocol.ts +15 -0
- package/src/routing/history/rebuild-worker.ts +34 -0
- package/src/routing/profile.ts +1 -1
- package/src/server/admission-model-scope.ts +21 -1
- package/src/server/antigravity-direct-eligibility.ts +208 -0
- package/src/server/auth-cors.ts +15 -0
- package/src/server/chat-completions.ts +82 -10
- package/src/server/chat-native-reasoning.ts +123 -0
- package/src/server/chat-native-sse.ts +110 -7
- package/src/server/chat-native.ts +76 -17
- package/src/server/claude-messages.ts +164 -433
- package/src/server/effort-policy.ts +1 -1
- package/src/server/images.ts +15 -2
- package/src/server/index/desktop-compatibility-startup.ts +56 -0
- package/src/server/index/model-alias-id.ts +36 -0
- package/src/server/index/optional-listeners.ts +2 -0
- package/src/server/index/serve-options.ts +11 -3
- package/src/server/index/startup-warnings.ts +11 -0
- package/src/server/index/websocket-handler.ts +9 -0
- package/src/server/index.ts +14 -11
- package/src/server/inference/advisor-diagnostics.ts +31 -0
- package/src/server/inference/client-encoder-delivery.ts +6 -5
- package/src/server/login-shell-path.ts +146 -0
- package/src/server/management/advisor-routes.ts +202 -0
- package/src/server/management/agent-settings-routes.ts +22 -4
- package/src/server/management/claude-desktop-picker-routes.ts +1 -1
- package/src/server/management/combo-routes.ts +176 -50
- package/src/server/management/companion-routes.ts +4 -0
- package/src/server/management/config-routes.ts +77 -6
- package/src/server/management/context.ts +4 -0
- package/src/server/management/cursor-integration-routes.ts +1 -1
- package/src/server/management/desktop-compatibility-routes.ts +46 -0
- package/src/server/management/desktop-compatibility-runtime-routes.ts +46 -0
- package/src/server/management/desktop-compatibility-settings-routes.ts +27 -0
- package/src/server/management/model-routes.ts +13 -8
- package/src/server/management/model-rows.ts +14 -0
- package/src/server/management/native-integration-routes.ts +2 -7
- package/src/server/management/native-reasoning-retention-routes.ts +41 -0
- package/src/server/management/oauth-account-routes.ts +87 -14
- package/src/server/management/protocol-settings-patch.ts +1 -0
- package/src/server/management/provider-gcp-credential-routes.ts +29 -0
- package/src/server/management/provider-key-pacing-routes.ts +31 -0
- package/src/server/management/provider-overwrite-carry.ts +7 -0
- package/src/server/management/provider-routes.ts +25 -30
- package/src/server/management/route-registry.ts +21 -1
- package/src/server/management/sibling-guard.ts +1 -0
- package/src/server/management-api.ts +9 -1
- package/src/server/messages-antigravity-direct.ts +195 -0
- package/src/server/messages-native-tool-guard.ts +185 -0
- package/src/server/messages-native.ts +106 -22
- package/src/server/messages-shared.ts +431 -0
- package/src/server/relay.ts +1 -1
- package/src/server/request-log-terminal-status.ts +1 -1
- package/src/server/request-log.ts +13 -1
- package/src/server/responses/account-change-state.ts +8 -2
- package/src/server/responses/adapter-continuation.ts +48 -19
- package/src/server/responses/adapter-delivery.ts +43 -8
- package/src/server/responses/adapter-dispatch.ts +48 -4
- package/src/server/responses/advisor-plan-slot.ts +27 -0
- package/src/server/responses/advisor-retention.ts +117 -0
- package/src/server/responses/advisor-slot.ts +368 -0
- package/src/server/responses/code-mode-collab-surface.ts +116 -8
- package/src/server/responses/codex-ws-wire.ts +15 -8
- package/src/server/responses/compact.ts +303 -125
- package/src/server/responses/compaction-recovery.ts +18 -10
- package/src/server/responses/compaction-retention.ts +61 -0
- package/src/server/responses/context-overflow.ts +11 -6
- package/src/server/responses/core-auth.ts +6 -0
- package/src/server/responses/core-codex-account.ts +11 -1
- package/src/server/responses/core-combo-failure.ts +12 -1
- package/src/server/responses/core-combo.ts +141 -36
- package/src/server/responses/core-errors.ts +3 -3
- package/src/server/responses/core-lifetime.ts +7 -2
- package/src/server/responses/core-normalize.ts +11 -0
- package/src/server/responses/core-opaque-recovery.ts +35 -0
- package/src/server/responses/core-options.ts +51 -0
- package/src/server/responses/core-pipeline.ts +141 -0
- package/src/server/responses/core-replay.ts +25 -6
- package/src/server/responses/core.ts +3 -116
- package/src/server/responses/fetch-helpers.ts +73 -19
- package/src/server/responses/main-hard-lock-routing.ts +109 -0
- package/src/server/responses/native-response-control.ts +4 -2
- package/src/server/responses/passthrough-delivery.ts +19 -11
- package/src/server/responses/passthrough-dispatch.ts +29 -16
- package/src/server/responses/request-prepare.ts +144 -17
- package/src/server/responses/request-sidecar-auth.ts +2 -2
- package/src/server/responses/request-transport.ts +120 -27
- package/src/server/responses/response-effects.ts +1 -0
- package/src/server/responses/run-turn-execution.ts +166 -38
- package/src/server/responses/sidecar-execution.ts +98 -5
- package/src/server/responses/terminal-guard.ts +4 -17
- package/src/server/responses-undeclared-tool-guard.ts +30 -9
- package/src/server/startup-action-control.ts +16 -2
- package/src/server/startup-health-cache.ts +1 -0
- package/src/service/auth-preflight.ts +71 -0
- package/src/service/cli.ts +4 -2
- package/src/service/definition.ts +97 -0
- package/src/service/desktop-startup.ts +14 -0
- package/src/service/guards.ts +1 -61
- package/src/service/health-sentinel-linux.ts +112 -0
- package/src/service/health-sentinel-main.ts +99 -61
- package/src/service/health-sentinel-probe.ts +24 -7
- package/src/service/health.ts +5 -89
- package/src/service/launchd.ts +27 -7
- package/src/service/logging.ts +135 -0
- package/src/service/repair.ts +2 -1
- package/src/service/state.ts +7 -8
- package/src/service/systemd.ts +1 -1
- package/src/service/windows-guarded-manager.ts +2 -1
- package/src/service/windows-ops.ts +1 -1
- package/src/service/windows-scheduler.ts +2 -7
- package/src/service/windows-taskxml.ts +2 -2
- package/src/service/windows-wscript.ts +14 -0
- package/src/service.ts +4 -2
- package/src/sidecar/auth.ts +2 -0
- package/src/tray/windows-tray.ps1 +43 -24
- package/src/types/config.ts +124 -6
- package/src/types/opencode-go.ts +61 -0
- package/src/types/opencode-zen.ts +29 -0
- package/src/types/provider.ts +39 -6
- package/src/types/request.ts +38 -2
- package/src/types/tools.ts +2 -0
- package/src/types/wire.ts +29 -37
- package/src/types.ts +1 -0
- package/src/update/async-check.ts +1 -1
- package/src/update/badge.ts +2 -2
- package/src/update/index.ts +88 -15
- package/src/update/job-supervised-restart.ts +107 -0
- package/src/update/job.ts +32 -32
- package/src/update/notify.ts +1 -1
- package/src/update/npm-invocation.mjs +12 -2
- package/src/update/refresh-scheduler.ts +2 -2
- package/src/update/supervised-recovery.d.mts +27 -0
- package/src/update/supervised-recovery.mjs +157 -0
- package/src/usage/cache-diagnostic.ts +2 -0
- package/src/usage/cost.ts +48 -12
- package/src/usage/expected-prices.ts +15 -0
- package/src/usage/ledger-retention.ts +2 -1
- package/src/usage/ledger-scanner.ts +6 -5
- package/src/usage/log.ts +17 -8
- package/src/usage/summary.ts +22 -9
- package/src/usage/user-cost-overlays.ts +14 -19
- package/src/usage/user-cost-validation.ts +38 -0
- package/src/vision/eligibility.ts +13 -0
- package/src/web-search/gemini-executor.ts +2 -2
- package/src/web-search/loop.ts +55 -5
- package/src/web-search/progress-stream.ts +4 -1
- package/src/web-search/run-turn-loop.ts +9 -1
- package/assets/sponsors/packycode.png +0 -0
- package/gui/dist/assets/App-CSJvmjNs.css +0 -1
- package/gui/dist/assets/App-CZtqiGcw.js +0 -56
- package/gui/dist/assets/index-BB6uK6tU.css +0 -1
- package/gui/dist/assets/index-CTm4l-HQ.js +0 -94
- package/gui/dist/assets/quota-summary-BbEeRfPY.js +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createPhysicalSendReporter } from "../lib/request-execution-budget";
|
|
2
2
|
import { createInferenceSendBudget } from "./inference/context";
|
|
3
|
+
import { observeAdvisorNativeReasoning } from "./inference/advisor-diagnostics";
|
|
3
4
|
import { buildOpenAIChatPassthroughRequest, createOpenAIChatAdapter } from "../adapters/openai-chat";
|
|
4
5
|
import type { AdapterRequest, ProviderAdapter } from "../adapters/base";
|
|
5
6
|
import { isNativeChatRouteEligible } from "./chat-native-eligibility";
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
isCyberPolicyCode,
|
|
19
20
|
isCyberPolicyMessage,
|
|
20
21
|
SEND_BUDGET_EXHAUSTED_CODE,
|
|
22
|
+
UNDECLARED_TOOL_CALL_ERROR_CODE,
|
|
21
23
|
} from "../lib/errors";
|
|
22
24
|
import { reportDispatchSends, type RequestExecutionBudget, type SingleUseDispatchPermit } from "../lib/request-execution-budget";
|
|
23
25
|
import type { AdmissionLease } from "../lib/admission";
|
|
@@ -54,10 +56,13 @@ import {
|
|
|
54
56
|
rateLimitRetryDelayMs,
|
|
55
57
|
rateLimitRetryPolicyFor,
|
|
56
58
|
rotateProviderTransportOn429,
|
|
59
|
+
rotateProviderTransportOn401,
|
|
57
60
|
transientRetryPolicyFor,
|
|
58
61
|
} from "../providers/key-failover";
|
|
59
62
|
import { fastPolicyForModel } from "../providers/service-tier";
|
|
63
|
+
import { RequestPacingQueueOverloadError } from "../providers/request-pacing";
|
|
60
64
|
import { stampApiKeyAccountLabel } from "../providers/label";
|
|
65
|
+
import { distributedKeyPhysicalFetch, distributedKeyResponseOwner } from "../providers/api-key-response-ownership";
|
|
61
66
|
import { providerApiKeySelectionIsCurrent, resolveCurrentProviderApiKeyTransport } from "../providers/api-key-selection";
|
|
62
67
|
import { enrichOpenCodeZenFreeTierMessage } from "../providers/opencode-zen-rate-limit";
|
|
63
68
|
import type { OcxProviderTransport } from "../providers/xai-transport";
|
|
@@ -74,7 +79,7 @@ import {
|
|
|
74
79
|
recordAttemptCredentialSource,
|
|
75
80
|
type RequestLogContext,
|
|
76
81
|
} from "./request-log";
|
|
77
|
-
import { jsonCompletionSse, nativeChatSse, structuredError, usageFromChat } from "./chat-native-sse";
|
|
82
|
+
import { chatResponseHasUndeclaredToolCalls, UNDECLARED_CHAT_TOOL_MESSAGE, jsonCompletionSse, nativeChatSse, structuredError, usageFromChat } from "./chat-native-sse";
|
|
78
83
|
import { beginInferenceAttempt, type InferenceAttempt } from "./inference/attempt";
|
|
79
84
|
import { createFinalRequestLog } from "./inference/final-log";
|
|
80
85
|
import { registerTurn, unregisterTurn } from "./lifecycle";
|
|
@@ -82,6 +87,7 @@ import { attachRequestSpendTracker } from "./responses/request-spend";
|
|
|
82
87
|
import { workflowRefusalResponse } from "./workflow-refusal";
|
|
83
88
|
import type { ComboProtocolSource } from "./responses/core-combo-native";
|
|
84
89
|
import type { ProtocolEnvelope } from "../protocols/envelope";
|
|
90
|
+
import { nativeChatReplayScope, bindNativeChatReplayScope, nativeChatReasoningCapture } from "./chat-native-reasoning";
|
|
85
91
|
|
|
86
92
|
export { isNativeChatRouteEligible, nativeChatDeclineReason } from "./chat-native-eligibility";
|
|
87
93
|
|
|
@@ -275,9 +281,15 @@ export async function runNativeChatAttempt(
|
|
|
275
281
|
): Promise<Response> {
|
|
276
282
|
const { req, config, logCtx, logIds, route, requestedModel, requestedStream, translatorBudget, finishLog } = execution;
|
|
277
283
|
const { sendBudget } = execution;
|
|
284
|
+
const clientDeclaredEmptyToolCatalog = Array.isArray(execution.chatBody.tools) && execution.chatBody.tools.length === 0;
|
|
285
|
+
const declaredLegacyFunctionNames = new Set<string>(clientDeclaredEmptyToolCatalog && Array.isArray(execution.chatBody.functions)
|
|
286
|
+
? execution.chatBody.functions.flatMap(fn => isRec(fn) && typeof fn.name === "string" && fn.name.length > 0 ? [fn.name] : [])
|
|
287
|
+
: []);
|
|
278
288
|
const { attempt } = attemptHandle;
|
|
279
|
-
|
|
289
|
+
let outputDelivered = false;
|
|
290
|
+
const notifyFirstOutput = execution.onFirstOutput
|
|
280
291
|
?? (logIds ? () => recordFirstOutput(logCtx, logIds.start) : undefined);
|
|
292
|
+
const onFirstOutput = () => { outputDelivered = true; notifyFirstOutput?.(); };
|
|
281
293
|
const fail = (status: number, message: string, type?: string, code?: string | null): Response => {
|
|
282
294
|
const safeMessage = redactSecretString(message);
|
|
283
295
|
finishLog(status, safeMessage);
|
|
@@ -313,14 +325,23 @@ export async function runNativeChatAttempt(
|
|
|
313
325
|
// assigned before the transport pin in core.ts.
|
|
314
326
|
// Transport variant: the bare picker answers with the persisted row, which for a built-in
|
|
315
327
|
// provider carries no adapter id or base URL until routedProviderConfig backfills it.
|
|
316
|
-
|
|
317
|
-
|
|
328
|
+
try {
|
|
329
|
+
const proactiveKeyProvider = selectProactiveApiKeyTransport(config, route.providerName, route.provider);
|
|
330
|
+
if (proactiveKeyProvider) route.provider = proactiveKeyProvider;
|
|
331
|
+
} catch (error) {
|
|
332
|
+
cleanupAbort(); upstream.abort();
|
|
333
|
+
if (!(error instanceof RequestPacingQueueOverloadError)) throw error;
|
|
334
|
+
const refusal = fail(429, error.message, "rate_limit_error");
|
|
335
|
+
refusal.headers.set("Retry-After", String(error.retryAfterSeconds));
|
|
336
|
+
return refusal;
|
|
337
|
+
}
|
|
318
338
|
let activeProvider: OcxProviderConfig = route.provider;
|
|
319
339
|
stampApiKeyAccountLabel(logCtx, route.providerName, activeProvider);
|
|
320
340
|
const spendTracker = sendBudget ? undefined : attachRequestSpendTracker(req, logCtx);
|
|
321
341
|
const physicalBudget = sendBudget ?? createInferenceSendBudget(req, logCtx);
|
|
322
342
|
let activeAdapter: ProviderAdapter = createOpenAIChatAdapter(activeProvider);
|
|
323
343
|
let activeRequest: AdapterRequest;
|
|
344
|
+
const replayScope = nativeChatReplayScope(req.headers);
|
|
324
345
|
let retainedRequestBytes = 0;
|
|
325
346
|
const releaseRetainedRequest = () => {
|
|
326
347
|
if (retainedRequestBytes === 0) return;
|
|
@@ -333,8 +354,9 @@ export async function runNativeChatAttempt(
|
|
|
333
354
|
retainedRequestBytes = bytes;
|
|
334
355
|
};
|
|
335
356
|
const buildActiveRequest = () => {
|
|
357
|
+
bindNativeChatReplayScope(replayScope, activeProvider, route.providerName, route.modelId);
|
|
336
358
|
recordAttemptCredentialSource(attempt, route.providerName, activeProvider, activeAdapter.name);
|
|
337
|
-
|
|
359
|
+
const request = buildOpenAIChatPassthroughRequest(
|
|
338
360
|
activeProvider,
|
|
339
361
|
execution.chatBody,
|
|
340
362
|
route.modelId,
|
|
@@ -342,7 +364,10 @@ export async function runNativeChatAttempt(
|
|
|
342
364
|
fastPolicyForModel(activeProvider, route.modelId, route.providerName, "chat"),
|
|
343
365
|
config.fastMode,
|
|
344
366
|
route.providerName,
|
|
367
|
+
replayScope,
|
|
345
368
|
);
|
|
369
|
+
observeAdvisorNativeReasoning(req.headers, logCtx, request.body);
|
|
370
|
+
return request;
|
|
346
371
|
};
|
|
347
372
|
try {
|
|
348
373
|
activeRequest = buildActiveRequest();
|
|
@@ -421,9 +446,10 @@ export async function runNativeChatAttempt(
|
|
|
421
446
|
} else if (!spendTracker?.charge()) throw new NativeChatSpendRefusal();
|
|
422
447
|
};
|
|
423
448
|
|
|
449
|
+
let responseOwnsDistributedKey = true;
|
|
424
450
|
const send = async (
|
|
425
451
|
request: AdapterRequest,
|
|
426
|
-
recovery?: "rate-limit-429" | "key-429" | UpstreamSendRecovery,
|
|
452
|
+
recovery?: "rate-limit-429" | "key-429" | "key-401" | UpstreamSendRecovery,
|
|
427
453
|
singleShot = false,
|
|
428
454
|
): Promise<Response> => {
|
|
429
455
|
try {
|
|
@@ -453,9 +479,16 @@ export async function runNativeChatAttempt(
|
|
|
453
479
|
onPhysicalDispatch: comboReceipt
|
|
454
480
|
? () => { if (!physicalBudget.spendEnforced) settleNonEnforcedSend(request.url); }
|
|
455
481
|
: undefined,
|
|
456
|
-
dispatchOverride: async (_input, init, execute) => {
|
|
457
|
-
|
|
458
|
-
|
|
482
|
+
dispatchOverride: async (_input, init, execute, reacquirePacing) => {
|
|
483
|
+
for (let attempt = 0; !providerApiKeySelectionIsCurrent(config, route.providerName, activeProvider); attempt++) {
|
|
484
|
+
if (outputDelivered) throw new Error("Provider key selection is unavailable during the native Chat turn");
|
|
485
|
+
if (attempt >= 3) throw new Error("Provider key selection changed repeatedly before native Chat dispatch");
|
|
486
|
+
let current = resolveCurrentProviderApiKeyTransport(config, route.providerName, activeProvider);
|
|
487
|
+
if (!current && activeProvider.requestPacing?.enabled
|
|
488
|
+
&& (activeProvider.requestPacing.keys || activeProvider.requestPacing.keySelection === "round-robin")) {
|
|
489
|
+
const fresh = resolveCurrentProviderApiKeyTransport(config, route.providerName, { ...activeProvider, _apiKeyAttempt: undefined });
|
|
490
|
+
if (fresh) current = selectProactiveApiKeyTransport(config, route.providerName, fresh) ?? fresh;
|
|
491
|
+
}
|
|
459
492
|
if (!current || !isNativeChatRouteEligible({ ...route, provider: current }, execution.chatBody, config)) {
|
|
460
493
|
throw new Error("Provider key selection is no longer available for native Chat");
|
|
461
494
|
}
|
|
@@ -467,6 +500,11 @@ export async function runNativeChatAttempt(
|
|
|
467
500
|
activeRequest = buildActiveRequest();
|
|
468
501
|
try { retainRequest(activeRequest); }
|
|
469
502
|
catch (error) { activeRequest.releaseBodyObservation?.(); throw error; }
|
|
503
|
+
if (current.requestPacing?.enabled
|
|
504
|
+
&& (current.requestPacing.keys || current.requestPacing.keySelection === "round-robin")) {
|
|
505
|
+
if (!reacquirePacing) throw new Error("Refreshed native Chat dispatch requires pacing readmission");
|
|
506
|
+
await reacquirePacing(current, route.modelId);
|
|
507
|
+
}
|
|
470
508
|
}
|
|
471
509
|
// The retry closure may still hold a pre-pacing request. Replace its entire
|
|
472
510
|
// wire shape, not just Authorization, and retain transport recovery flags.
|
|
@@ -495,7 +533,8 @@ export async function runNativeChatAttempt(
|
|
|
495
533
|
// A reselected provider transport is still a physical send: the connection policy
|
|
496
534
|
// and manual-redirect ownership wrap the selected implementation (#4992).
|
|
497
535
|
dispatched = await sendWithConnectionPolicy(
|
|
498
|
-
(activeProvider as OcxProviderTransport).fetch ?? execute,
|
|
536
|
+
distributedKeyPhysicalFetch((activeProvider as OcxProviderTransport).fetch ?? execute,
|
|
537
|
+
route.providerName, activeProvider, request.url),
|
|
499
538
|
request.url,
|
|
500
539
|
applyUpstreamRecoveryInit({
|
|
501
540
|
...init, method: request.method, headers, body: request.body,
|
|
@@ -510,6 +549,8 @@ export async function runNativeChatAttempt(
|
|
|
510
549
|
try { if (physicalBudget.spendEnforced) spendReport(1); }
|
|
511
550
|
finally { spendReport.close?.(); }
|
|
512
551
|
}
|
|
552
|
+
responseOwnsDistributedKey = !activeProvider._apiKeyAttempt?.distributed
|
|
553
|
+
|| distributedKeyResponseOwner(dispatched, config, route.providerName) !== null;
|
|
513
554
|
if (!dispatched.ok) await recordKeyAttemptFailure(logCtx, dispatched, init.signal ?? upstream.signal);
|
|
514
555
|
return dispatched;
|
|
515
556
|
},
|
|
@@ -566,8 +607,11 @@ export async function runNativeChatAttempt(
|
|
|
566
607
|
}
|
|
567
608
|
// Same reason as above, plus a second one: rotating here would write a cooldown against
|
|
568
609
|
// a key that rate-limited nothing, and that false signal outlives the request.
|
|
569
|
-
while (response.status === 429
|
|
570
|
-
|
|
610
|
+
while ((response.status === 429 || (response.status === 401 && activeProvider._apiKeyAttempt?.distributed))
|
|
611
|
+
&& responseOwnsDistributedKey && !isNonReplayableResponse(response) && hasKeyPoolFailover(activeProvider)) {
|
|
612
|
+
const failureStatus = response.status;
|
|
613
|
+
const rotate = failureStatus === 401 ? rotateProviderTransportOn401 : rotateProviderTransportOn429;
|
|
614
|
+
const rotated = rotate(config, route.providerName, activeProvider, {
|
|
571
615
|
retryAfter: response.headers.get("retry-after"),
|
|
572
616
|
now: Date.now(),
|
|
573
617
|
attemptedKey: activeProvider.apiKey,
|
|
@@ -586,7 +630,7 @@ export async function runNativeChatAttempt(
|
|
|
586
630
|
releaseRetainedRequest();
|
|
587
631
|
activeRequest = buildActiveRequest();
|
|
588
632
|
retainRequest(activeRequest);
|
|
589
|
-
response = await send(activeRequest, "key-429");
|
|
633
|
+
response = await send(activeRequest, failureStatus === 401 ? "key-401" : "key-429");
|
|
590
634
|
}
|
|
591
635
|
} catch (error) {
|
|
592
636
|
releaseRetainedRequest();
|
|
@@ -594,6 +638,11 @@ export async function runNativeChatAttempt(
|
|
|
594
638
|
upstream.abort();
|
|
595
639
|
if (req.signal.aborted) return fail(499, "Client cancelled request", "client_cancelled");
|
|
596
640
|
const sendError = error instanceof UpstreamRetryEvidenceError ? error.cause : error;
|
|
641
|
+
if (sendError instanceof RequestPacingQueueOverloadError) {
|
|
642
|
+
const refusal = fail(429, sendError.message, "rate_limit_error");
|
|
643
|
+
refusal.headers.set("Retry-After", String(sendError.retryAfterSeconds));
|
|
644
|
+
return refusal;
|
|
645
|
+
}
|
|
597
646
|
if (sendError instanceof SendBudgetExhaustedError) {
|
|
598
647
|
// A decision this process made, answered as the Responses path answers it: 429, not 502.
|
|
599
648
|
return fail(429, sendError.message, SEND_BUDGET_EXHAUSTED_CODE, SEND_BUDGET_EXHAUSTED_CODE);
|
|
@@ -704,6 +753,7 @@ export async function runNativeChatAttempt(
|
|
|
704
753
|
}
|
|
705
754
|
|
|
706
755
|
const contentType = response.headers.get("content-type")?.toLowerCase() ?? "";
|
|
756
|
+
const reasoningCapture = nativeChatReasoningCapture(activeProvider, route.modelId, replayScope, translatorBudget);
|
|
707
757
|
if (contentType.includes("text/event-stream") && response.body) {
|
|
708
758
|
if (requestedStream) transferTurnToStream();
|
|
709
759
|
let terminalStatus: number | undefined;
|
|
@@ -740,7 +790,10 @@ export async function runNativeChatAttempt(
|
|
|
740
790
|
signal: upstream.signal,
|
|
741
791
|
stallTimeoutSec: config.stallTimeoutSec,
|
|
742
792
|
localUpstream: isLocalUpstream(activeProvider.baseUrl),
|
|
793
|
+
clientDeclaredEmptyToolCatalog,
|
|
794
|
+
declaredLegacyFunctionNames,
|
|
743
795
|
onFirstOutput,
|
|
796
|
+
onChunk: reasoningCapture.observe,
|
|
744
797
|
onUsage: usage => {
|
|
745
798
|
if (!recordKeyWireAttemptUsage(logCtx, usage)) {
|
|
746
799
|
logCtx.usage = usage;
|
|
@@ -748,6 +801,7 @@ export async function runNativeChatAttempt(
|
|
|
748
801
|
}
|
|
749
802
|
},
|
|
750
803
|
onTerminal: (status: number, message?: string) => {
|
|
804
|
+
reasoningCapture.finish(status < 400);
|
|
751
805
|
terminalStatus = status;
|
|
752
806
|
if (!requestedStream) return;
|
|
753
807
|
try {
|
|
@@ -758,8 +812,9 @@ export async function runNativeChatAttempt(
|
|
|
758
812
|
releaseStreamTurn();
|
|
759
813
|
}
|
|
760
814
|
},
|
|
761
|
-
|
|
762
|
-
|
|
815
|
+
onCancel: () => {
|
|
816
|
+
reasoningCapture.finish(false);
|
|
817
|
+
if (requestedStream) {
|
|
763
818
|
try {
|
|
764
819
|
cleanupAbort();
|
|
765
820
|
upstream.abort();
|
|
@@ -767,8 +822,8 @@ export async function runNativeChatAttempt(
|
|
|
767
822
|
} finally {
|
|
768
823
|
releaseStreamTurn();
|
|
769
824
|
}
|
|
770
|
-
}
|
|
771
|
-
}
|
|
825
|
+
}
|
|
826
|
+
},
|
|
772
827
|
});
|
|
773
828
|
if (requestedStream) {
|
|
774
829
|
return new Response(stream, {
|
|
@@ -833,6 +888,7 @@ export async function runNativeChatAttempt(
|
|
|
833
888
|
if (error) return fail(error.status ?? 502, error.message, error.type, error.code);
|
|
834
889
|
const completion = chatCompletionJson(parsedJson);
|
|
835
890
|
if (!completion) return fail(502, "upstream response contained no choices", "upstream_error");
|
|
891
|
+
reasoningCapture.json(completion);
|
|
836
892
|
const usage = usageFromChat(completion.usage);
|
|
837
893
|
if (usage) {
|
|
838
894
|
if (!recordKeyWireAttemptUsage(logCtx, usage)) {
|
|
@@ -840,6 +896,9 @@ export async function runNativeChatAttempt(
|
|
|
840
896
|
attempt.usage = usage;
|
|
841
897
|
}
|
|
842
898
|
}
|
|
899
|
+
if (clientDeclaredEmptyToolCatalog && chatResponseHasUndeclaredToolCalls(completion, declaredLegacyFunctionNames)) {
|
|
900
|
+
return fail(502, UNDECLARED_CHAT_TOOL_MESSAGE, "upstream_error", UNDECLARED_TOOL_CALL_ERROR_CODE);
|
|
901
|
+
}
|
|
843
902
|
onFirstOutput?.();
|
|
844
903
|
try {
|
|
845
904
|
const serialized = requestedStream
|