@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
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Antigravity direct lane for the Messages ingress (`protocols.rollout.antigravityDirect`).
|
|
3
|
+
*
|
|
4
|
+
* The Messages ingress translates before it routes: the route is decided on the translated body's
|
|
5
|
+
* resolved model. So the lane is planned ahead of translation on the settings-only body
|
|
6
|
+
* (`anthropicSettingsTranslation`), whose model is that same resolved model, against a preview of
|
|
7
|
+
* the route; the conversation is decoded straight into the IR only when that preview is an
|
|
8
|
+
* eligible Antigravity route. The ingress then routes the settings-only body as usual and keeps
|
|
9
|
+
* the lane only if the settled route is still the one the plan was made for; otherwise it builds
|
|
10
|
+
* the full bridge translation, as it would have without the switch.
|
|
11
|
+
*
|
|
12
|
+
* Refusals stay the bridge's by construction: a settings error, or an undecodable proxy envelope
|
|
13
|
+
* (which the bridge retries through the native projection), returns no plan and the ingress takes
|
|
14
|
+
* its ordinary translation path, which answers exactly as before. Any other decode error is one
|
|
15
|
+
* the translator's walk raises with the same message at the same point
|
|
16
|
+
* (`tests/responses/protocol-messages-ir-parity.test.ts`).
|
|
17
|
+
*/
|
|
18
|
+
import { anthropicSettingsTranslation, AnthropicRequestError, type ClaudeCacheKeySource } from "../claude/inbound";
|
|
19
|
+
import { messagesToResponsesTranslation } from "../protocols/codecs/messages";
|
|
20
|
+
import {
|
|
21
|
+
MALFORMED_REASONING_SIGNATURE,
|
|
22
|
+
messagesConversationToIr,
|
|
23
|
+
messagesRouteEvidence,
|
|
24
|
+
withDirectMessagesConversation,
|
|
25
|
+
type MessagesIrConversation,
|
|
26
|
+
} from "../protocols/codecs/messages-ir";
|
|
27
|
+
import { resolveProtocolSettings } from "../protocols/settings";
|
|
28
|
+
import type { TranslatorBudget, TranslatorBufferKind } from "../lib/translator-budget";
|
|
29
|
+
import type { PolicyRequestEvidence } from "../routing/evaluator";
|
|
30
|
+
import { previewRouteModel, type RouteResult } from "../router";
|
|
31
|
+
import type { OcxClaudeCodeConfig, OcxConfig } from "../types";
|
|
32
|
+
import { antigravityMessagesDeclineReason, type AntigravityDirectDeclineReason } from "./antigravity-direct-eligibility";
|
|
33
|
+
import { cacheDiagnosticsObserving } from "./request-log";
|
|
34
|
+
import type { DirectRequestOption } from "./responses/core-options";
|
|
35
|
+
|
|
36
|
+
type Rec = Record<string, unknown>;
|
|
37
|
+
|
|
38
|
+
export interface MessagesDirectPlan {
|
|
39
|
+
/** The concrete route the plan was made for. */
|
|
40
|
+
providerName: string;
|
|
41
|
+
modelId: string;
|
|
42
|
+
/** The settings-only Responses body the core receives, and its prompt-cache key provenance. */
|
|
43
|
+
settingsBody: Rec;
|
|
44
|
+
cacheKeySource: ClaudeCacheKeySource;
|
|
45
|
+
conversation: MessagesIrConversation;
|
|
46
|
+
/** What the core would have read from the bridge body for policy routing. */
|
|
47
|
+
evidence: PolicyRequestEvidence;
|
|
48
|
+
/**
|
|
49
|
+
* Release the retained charges the plan's decode made. The ingress calls it when it abandons
|
|
50
|
+
* the plan for the full translation, which charges the same reasoning copies again.
|
|
51
|
+
*/
|
|
52
|
+
releaseDecodeCharges(): void;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The request budget, with the retained charges made through it recorded so a decode the ingress
|
|
57
|
+
* abandons can hand them back. Without that, the bridge translation that follows would be held to
|
|
58
|
+
* a budget already spent on a copy nobody keeps, and could answer 413 where the bridge alone fits.
|
|
59
|
+
*/
|
|
60
|
+
function recordingBudget(budget: TranslatorBudget): { budget: TranslatorBudget; release(): void } {
|
|
61
|
+
const charged = new Map<TranslatorBufferKind, number>();
|
|
62
|
+
const recording: TranslatorBudget = {
|
|
63
|
+
openCall: id => budget.openCall(id),
|
|
64
|
+
closeCall: id => budget.closeCall(id),
|
|
65
|
+
reserveTransient: (bytes, scope) => budget.reserveTransient(bytes, scope),
|
|
66
|
+
chargeRetained: (delta, scope) => {
|
|
67
|
+
budget.chargeRetained(delta, scope);
|
|
68
|
+
charged.set(scope.kind, (charged.get(scope.kind) ?? 0) + delta);
|
|
69
|
+
},
|
|
70
|
+
releaseRetained: (bytes, scope) => {
|
|
71
|
+
budget.releaseRetained(bytes, scope);
|
|
72
|
+
charged.set(scope.kind, (charged.get(scope.kind) ?? 0) - bytes);
|
|
73
|
+
},
|
|
74
|
+
observeAcceptedRequestCopy: bytes => budget.observeAcceptedRequestCopy(bytes),
|
|
75
|
+
observeExternallyCapped: (kind, bytes) => budget.observeExternallyCapped(kind, bytes),
|
|
76
|
+
snapshot: () => budget.snapshot(),
|
|
77
|
+
dispose: () => budget.dispose(),
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
budget: recording,
|
|
81
|
+
release: () => {
|
|
82
|
+
for (const [kind, bytes] of charged) if (bytes > 0) budget.releaseRetained(bytes, { kind });
|
|
83
|
+
charged.clear();
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Plan the direct lane for a Messages body, or return `undefined` to translate as before. Throws
|
|
90
|
+
* only what the translator's conversation walk throws for the same body.
|
|
91
|
+
*/
|
|
92
|
+
export function planMessagesAntigravityDirect(
|
|
93
|
+
body: unknown,
|
|
94
|
+
cc: OcxClaudeCodeConfig | undefined,
|
|
95
|
+
config: OcxConfig,
|
|
96
|
+
budget: TranslatorBudget,
|
|
97
|
+
): MessagesDirectPlan | undefined {
|
|
98
|
+
if (!resolveProtocolSettings(config).rollout.antigravityDirect) return undefined;
|
|
99
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) return undefined;
|
|
100
|
+
let settings: ReturnType<typeof anthropicSettingsTranslation>;
|
|
101
|
+
let route: RouteResult;
|
|
102
|
+
try {
|
|
103
|
+
settings = anthropicSettingsTranslation(body, cc);
|
|
104
|
+
route = previewRouteModel(config, settings.body.model as string);
|
|
105
|
+
} catch {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
const model = settings.body.model as string;
|
|
109
|
+
if (!messagesDirectRouteHolds(route, body as Rec, model, config)) return undefined;
|
|
110
|
+
const recorded = recordingBudget(budget);
|
|
111
|
+
let conversation: MessagesIrConversation;
|
|
112
|
+
try {
|
|
113
|
+
conversation = messagesConversationToIr(body, cc, recorded.budget, model);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
if (err instanceof AnthropicRequestError && err.message === MALFORMED_REASONING_SIGNATURE) {
|
|
116
|
+
// The bridge retries this body through the native projection; give it the whole budget.
|
|
117
|
+
recorded.release();
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
providerName: route.providerName,
|
|
124
|
+
modelId: route.modelId,
|
|
125
|
+
settingsBody: settings.body,
|
|
126
|
+
cacheKeySource: settings.cacheKeySource,
|
|
127
|
+
conversation,
|
|
128
|
+
evidence: messagesRouteEvidence(body),
|
|
129
|
+
releaseDecodeCharges: recorded.release,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Whether a route may carry this body on the direct lane, judged as the ingress judges it. */
|
|
134
|
+
export function messagesDirectRouteHolds(
|
|
135
|
+
route: Pick<RouteResult, "providerName" | "modelId" | "provider" | "combo" | "routeKind">,
|
|
136
|
+
body: Rec,
|
|
137
|
+
model: string,
|
|
138
|
+
config: OcxConfig,
|
|
139
|
+
): boolean {
|
|
140
|
+
return antigravityMessagesDeclineReason(route, body, model, config, { cacheDiagnostics: cacheDiagnosticsObserving() }) === undefined;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Whether the route the ingress settled is still the one `plan` was made for, and still eligible. */
|
|
144
|
+
export function messagesDirectPlanHolds(plan: MessagesDirectPlan, route: RouteResult, body: Rec, config: OcxConfig): boolean {
|
|
145
|
+
return route.providerName === plan.providerName && route.modelId === plan.modelId
|
|
146
|
+
&& messagesDirectRouteHolds(route, body, plan.settingsBody.model as string, config);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* The lane's decline for a bridged request's trace, when it says something about this route: with
|
|
151
|
+
* the switch off or a non-Antigravity target the path already explains the bridge.
|
|
152
|
+
*/
|
|
153
|
+
export function messagesDirectTraceDecline(
|
|
154
|
+
route: RouteResult,
|
|
155
|
+
body: unknown,
|
|
156
|
+
model: string,
|
|
157
|
+
config: OcxConfig,
|
|
158
|
+
): AntigravityDirectDeclineReason | undefined {
|
|
159
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) return undefined;
|
|
160
|
+
const reason = antigravityMessagesDeclineReason(route, body as Rec, model, config, { cacheDiagnostics: cacheDiagnosticsObserving() });
|
|
161
|
+
return reason === "rollout-disabled" || reason === "not-migrated" ? undefined : reason;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* The core option for a planned request. The bridge conversation is translated at most once, and
|
|
166
|
+
* only if the core asks for it (a reroute, or an ambiguous-reset judgment).
|
|
167
|
+
*/
|
|
168
|
+
export function messagesDirectRequestOption(
|
|
169
|
+
plan: MessagesDirectPlan,
|
|
170
|
+
body: unknown,
|
|
171
|
+
cc: OcxClaudeCodeConfig | undefined,
|
|
172
|
+
budget: TranslatorBudget,
|
|
173
|
+
): DirectRequestOption {
|
|
174
|
+
let bridge: Rec | undefined;
|
|
175
|
+
return {
|
|
176
|
+
protocol: "messages",
|
|
177
|
+
providerName: plan.providerName,
|
|
178
|
+
modelId: plan.modelId,
|
|
179
|
+
evidence: plan.evidence,
|
|
180
|
+
decode: base => withDirectMessagesConversation(
|
|
181
|
+
base,
|
|
182
|
+
plan.conversation,
|
|
183
|
+
modelId => messagesConversationToIr(body, cc, budget, modelId),
|
|
184
|
+
),
|
|
185
|
+
bridgeConversation: () => {
|
|
186
|
+
bridge ??= messagesToResponsesTranslation(body, cc, budget).body;
|
|
187
|
+
return {
|
|
188
|
+
input: bridge.input,
|
|
189
|
+
...(bridge.instructions !== undefined ? { instructions: bridge.instructions } : {}),
|
|
190
|
+
...(bridge.tools !== undefined ? { tools: bridge.tools } : {}),
|
|
191
|
+
};
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { anthropicErrorBody } from "../claude/outbound";
|
|
2
|
+
import { redactSecretString } from "../lib/redact";
|
|
3
|
+
import { sseFieldValue } from "../lib/sse-decoder";
|
|
4
|
+
import { TRANSLATOR_MAX_SSE_EVENT_BYTES, type TranslatorBudget } from "../lib/translator-budget";
|
|
5
|
+
import { UNDECLARED_TOOL_CALL_ERROR_CODE, undeclaredToolCallMessage } from "./responses-undeclared-tool-guard";
|
|
6
|
+
import { createSseBlockBuffer, sseDataPayload } from "./sse-payload-rewrite";
|
|
7
|
+
|
|
8
|
+
type Rec = Record<string, unknown>;
|
|
9
|
+
const isRec = (value: unknown): value is Rec => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
10
|
+
const NO_DECLARED_TOOLS: ReadonlySet<string> = new Set();
|
|
11
|
+
|
|
12
|
+
/** Inline system-message definitions extend an otherwise empty native catalog. */
|
|
13
|
+
export function nativeMessagesInlineToolNames(body: Rec): ReadonlySet<string> {
|
|
14
|
+
const definitions = new Set<string>();
|
|
15
|
+
const active = new Set<string>();
|
|
16
|
+
if (!Array.isArray(body.messages)) return active;
|
|
17
|
+
for (const message of body.messages) {
|
|
18
|
+
if (!isRec(message) || message.role !== "system" || !Array.isArray(message.content)) continue;
|
|
19
|
+
for (const block of message.content) {
|
|
20
|
+
if (!isRec(block) || !isRec(block.tool)) continue;
|
|
21
|
+
const tool = block.tool;
|
|
22
|
+
if (block.type === "tool_addition" && tool.type === "tool_definition" && isRec(tool.definition)
|
|
23
|
+
&& typeof tool.definition.name === "string" && tool.definition.name.length > 0) {
|
|
24
|
+
definitions.add(tool.definition.name);
|
|
25
|
+
active.add(tool.definition.name);
|
|
26
|
+
} else if (tool.type === "tool_reference" && typeof tool.name === "string") {
|
|
27
|
+
if (block.type === "tool_addition" && definitions.has(tool.name)) active.add(tool.name);
|
|
28
|
+
// Like native admission, only a permanent removal withdraws a declaration.
|
|
29
|
+
if (block.type === "tool_removal" && (message.clear_at === undefined || message.clear_at === "never")) active.delete(tool.name);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return active;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Inspect only native message content; opaque extension fields do not carry client calls. */
|
|
37
|
+
export function nativeMessagesClientToolName(value: unknown, declared: ReadonlySet<string> = NO_DECLARED_TOOLS): string | undefined {
|
|
38
|
+
if (!isRec(value)) return undefined;
|
|
39
|
+
const content = Array.isArray(value.content) ? value.content : [];
|
|
40
|
+
const block = content.find(item => isRec(item) && item.type === "tool_use"
|
|
41
|
+
&& (typeof item.name !== "string" || !declared.has(item.name)));
|
|
42
|
+
if (isRec(block)) return typeof block.name === "string" ? block.name : "<unnamed>";
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Used only when the current native request explicitly declares no client tools. */
|
|
47
|
+
export function guardNativeMessagesEmptyToolCatalog(
|
|
48
|
+
source: ReadableStream<Uint8Array>,
|
|
49
|
+
budget: TranslatorBudget,
|
|
50
|
+
onRefusal: (message: string) => void,
|
|
51
|
+
declared: ReadonlySet<string> = NO_DECLARED_TOOLS,
|
|
52
|
+
): ReadableStream<Uint8Array> {
|
|
53
|
+
const reader = source.getReader();
|
|
54
|
+
const decoder = new TextDecoder();
|
|
55
|
+
const encoder = new TextEncoder();
|
|
56
|
+
const scope = { kind: "live_transient" as const };
|
|
57
|
+
const buffer = createSseBlockBuffer(budget, bytes => {
|
|
58
|
+
if (bytes > TRANSLATOR_MAX_SSE_EVENT_BYTES) throw new Error("upstream SSE event exceeded the safe limit");
|
|
59
|
+
});
|
|
60
|
+
// Hosted tools share input_json_delta with client tools, but cannot grant client authority.
|
|
61
|
+
const permittedInputBlocks = new Set<number>();
|
|
62
|
+
let queuedBytes = 0;
|
|
63
|
+
let settled = false;
|
|
64
|
+
const releaseQueued = () => {
|
|
65
|
+
budget.releaseRetained(queuedBytes, scope);
|
|
66
|
+
queuedBytes = 0;
|
|
67
|
+
};
|
|
68
|
+
const clear = () => {
|
|
69
|
+
buffer.clear();
|
|
70
|
+
budget.releaseRetained(permittedInputBlocks.size * 32, scope);
|
|
71
|
+
permittedInputBlocks.clear();
|
|
72
|
+
};
|
|
73
|
+
const enqueue = (controller: ReadableStreamDefaultController<Uint8Array>, text: string) => {
|
|
74
|
+
const bytes = Buffer.byteLength(text);
|
|
75
|
+
const reservation = budget.reserveTransient(bytes, scope);
|
|
76
|
+
try {
|
|
77
|
+
controller.enqueue(encoder.encode(text));
|
|
78
|
+
reservation.commitRetained();
|
|
79
|
+
queuedBytes += bytes;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
reservation.release();
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const cancelReader = (reason?: unknown) => {
|
|
86
|
+
void reader.cancel(reason).catch(() => {});
|
|
87
|
+
};
|
|
88
|
+
const process = (controller: ReadableStreamDefaultController<Uint8Array>, block: string, delimiter: string) => {
|
|
89
|
+
const payload = sseDataPayload(block);
|
|
90
|
+
let data: unknown;
|
|
91
|
+
let terminal = false;
|
|
92
|
+
try { data = payload === null ? undefined : JSON.parse(payload); } catch {
|
|
93
|
+
// The buffered Messages collector concatenates data lines without separators. Inspect
|
|
94
|
+
// that representation too, so an invalid SSE split cannot become a valid folded tool call.
|
|
95
|
+
try { data = payload === null ? undefined : JSON.parse(payload.replace(/\n/g, "")); } catch { /* preserve opaque frames */ }
|
|
96
|
+
}
|
|
97
|
+
if (isRec(data)) {
|
|
98
|
+
const eventName = block.split(/\r\n|\r|\n/).map(line => sseFieldValue(line, "event"))
|
|
99
|
+
.filter(value => value !== null).at(-1)?.trim();
|
|
100
|
+
// Stream clients use the payload type; the buffered collector uses the event field.
|
|
101
|
+
const isEvent = (type: string) => data.type === type || eventName === type;
|
|
102
|
+
terminal = isEvent("message_stop") || isEvent("error");
|
|
103
|
+
let name = isEvent("message_start") ? nativeMessagesClientToolName(data.message, declared) : undefined;
|
|
104
|
+
if (isEvent("content_block_start") && isRec(data.content_block) && data.content_block.type === "tool_use"
|
|
105
|
+
&& (typeof data.content_block.name !== "string" || !declared.has(data.content_block.name))) {
|
|
106
|
+
name ??= typeof data.content_block.name === "string" ? data.content_block.name : "<unnamed>";
|
|
107
|
+
}
|
|
108
|
+
const index = typeof data.index === "number" && Number.isSafeInteger(data.index) ? data.index : undefined;
|
|
109
|
+
if (isEvent("content_block_delta") && isRec(data.delta) && data.delta.type === "input_json_delta"
|
|
110
|
+
&& (index === undefined || !permittedInputBlocks.has(index))) name ??= "<unnamed>";
|
|
111
|
+
if (name !== undefined) {
|
|
112
|
+
clear();
|
|
113
|
+
const message = redactSecretString(undeclaredToolCallMessage(name));
|
|
114
|
+
onRefusal(message);
|
|
115
|
+
enqueue(controller, `event: error\ndata: ${JSON.stringify(anthropicErrorBody(502, message, "api_error", UNDECLARED_TOOL_CALL_ERROR_CODE))}\n\n`);
|
|
116
|
+
settled = true;
|
|
117
|
+
cancelReader(new Error(message));
|
|
118
|
+
controller.close();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (isEvent("content_block_start") && index !== undefined && isRec(data.content_block)) {
|
|
122
|
+
if (permittedInputBlocks.delete(index)) budget.releaseRetained(32, scope);
|
|
123
|
+
if (data.content_block.type === "server_tool_use" || data.content_block.type === "mcp_tool_use"
|
|
124
|
+
|| data.content_block.type === "tool_use" && typeof data.content_block.name === "string" && declared.has(data.content_block.name)) {
|
|
125
|
+
budget.chargeRetained(32, scope);
|
|
126
|
+
permittedInputBlocks.add(index);
|
|
127
|
+
}
|
|
128
|
+
} else if (isEvent("content_block_stop") && index !== undefined && permittedInputBlocks.delete(index)) {
|
|
129
|
+
budget.releaseRetained(32, scope);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
enqueue(controller, block + delimiter);
|
|
133
|
+
if (terminal) {
|
|
134
|
+
settled = true;
|
|
135
|
+
clear();
|
|
136
|
+
cancelReader();
|
|
137
|
+
controller.close();
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
return new ReadableStream<Uint8Array>({
|
|
141
|
+
async pull(controller) {
|
|
142
|
+
releaseQueued();
|
|
143
|
+
if (settled) return;
|
|
144
|
+
try {
|
|
145
|
+
for (;;) {
|
|
146
|
+
const block = buffer.next();
|
|
147
|
+
if (block) {
|
|
148
|
+
buffer.compact();
|
|
149
|
+
process(controller, block.block, block.delimiter);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const { done, value } = await reader.read();
|
|
153
|
+
if (settled) return;
|
|
154
|
+
if (!done) {
|
|
155
|
+
buffer.append(decoder.decode(value, { stream: true }));
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
buffer.append(decoder.decode());
|
|
159
|
+
const tail = buffer.tail();
|
|
160
|
+
if (tail) process(controller, tail, "");
|
|
161
|
+
if (!settled) {
|
|
162
|
+
settled = true;
|
|
163
|
+
clear();
|
|
164
|
+
controller.close();
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (settled) return;
|
|
170
|
+
settled = true;
|
|
171
|
+
clear();
|
|
172
|
+
cancelReader(error);
|
|
173
|
+
controller.error(error);
|
|
174
|
+
} finally {
|
|
175
|
+
if (settled) releaseQueued();
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
cancel(reason) {
|
|
179
|
+
settled = true;
|
|
180
|
+
clear();
|
|
181
|
+
releaseQueued();
|
|
182
|
+
return reader.cancel(reason);
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|