@vellumai/assistant 0.7.0 → 0.7.1
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/ARCHITECTURE.md +6 -7
- package/Dockerfile +1 -0
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
- package/bun.lock +3 -0
- package/docs/architecture/security.md +18 -16
- package/knip.json +1 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/openapi.yaml +294 -107
- package/package.json +4 -2
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +6 -17
- package/src/__tests__/assistant-event-hub.test.ts +126 -77
- package/src/__tests__/assistant-event.test.ts +0 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
- package/src/__tests__/background-shell-host-bash.test.ts +34 -43
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/checker.test.ts +20 -34
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-watcher.test.ts +12 -0
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-lifecycle.test.ts +4 -4
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
- package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -4
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/cu-unified-flow.test.ts +33 -16
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +4 -1
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +289 -7
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-bash-proxy.test.ts +46 -122
- package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
- package/src/__tests__/host-browser-proxy.test.ts +111 -185
- package/src/__tests__/host-browser-routes.test.ts +45 -75
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
- package/src/__tests__/host-cu-proxy.test.ts +56 -111
- package/src/__tests__/host-file-proxy.test.ts +44 -98
- package/src/__tests__/host-file-read-tool.test.ts +42 -21
- package/src/__tests__/host-shell-tool.test.ts +33 -68
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy.test.ts +43 -53
- package/src/__tests__/http-user-message-parity.test.ts +0 -6
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -66
- package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +66 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
- package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +331 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -22
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +3 -12
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +0 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +9 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt.test.ts +115 -13
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
- package/src/__tests__/tool-executor.test.ts +12 -19
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/backup-worker.test.ts +36 -8
- package/src/backup/__tests__/paths.test.ts +2 -2
- package/src/backup/__tests__/restore.test.ts +45 -28
- package/src/backup/backup-worker.ts +36 -2
- package/src/backup/paths.ts +9 -6
- package/src/browser-session/events.ts +0 -9
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +0 -24
- package/src/calls/twilio-rest.ts +0 -38
- package/src/calls/twilio-routes.ts +1 -1
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +1 -36
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/backup.ts +4 -4
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +63 -5
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +231 -76
- package/src/cli/commands/keys.ts +4 -1
- package/src/cli/commands/memory-v2.ts +24 -52
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +14 -0
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
- package/src/config/env-registry.ts +12 -2
- package/src/config/env.ts +3 -14
- package/src/config/feature-flag-registry.json +30 -30
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +3 -3
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -5
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +31 -3
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +9 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +6 -6
- package/src/config/schemas/skills.ts +5 -5
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -17
- package/src/contacts/contacts-write.ts +1 -105
- package/src/context/window-manager.ts +44 -5
- package/src/credential-execution/process-manager.ts +34 -10
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
- package/src/daemon/conversation-agent-loop.ts +277 -36
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +83 -163
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +22 -28
- package/src/daemon/conversation-tool-setup.ts +3 -33
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +117 -233
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +23 -71
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-bash-proxy.ts +67 -45
- package/src/daemon/host-browser-proxy.ts +65 -27
- package/src/daemon/host-cu-proxy.ts +40 -39
- package/src/daemon/host-file-proxy.ts +58 -37
- package/src/daemon/host-transfer-proxy.ts +84 -46
- package/src/daemon/lifecycle.ts +49 -15
- package/src/daemon/message-types/conversations.ts +7 -0
- package/src/daemon/message-types/host-bash.ts +1 -0
- package/src/daemon/message-types/host-cu.ts +1 -0
- package/src/daemon/message-types/host-file.ts +1 -0
- package/src/daemon/message-types/host-transfer.ts +1 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +102 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -2
- package/src/daemon/tool-side-effects.ts +125 -107
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +3 -1
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
- package/src/heartbeat/heartbeat-service.ts +23 -5
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/relationship-state-writer.ts +16 -3
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +3 -10
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/manager.ts +0 -5
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/context-search/sources/memory-v2.ts +578 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +29 -4
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +3 -21
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
- package/src/memory/graph/conversation-graph-memory.ts +35 -13
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs-store.ts +0 -1
- package/src/memory/jobs-worker.ts +2 -16
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +24 -0
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +25 -0
- package/src/memory/search/semantic.ts +5 -16
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +289 -90
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +384 -15
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/static-context.test.ts +153 -0
- package/src/memory/v2/activation.ts +168 -97
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +14 -12
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +182 -58
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +118 -42
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/skill-store.ts +55 -7
- package/src/memory/v2/static-context.ts +62 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +122 -21
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +97 -0
- package/src/oauth/manual-token-connection.ts +30 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/config.ts +0 -74
- package/src/outbound-proxy/health.ts +0 -44
- package/src/outbound-proxy/index.ts +0 -22
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.ts +4 -1
- package/src/permissions/gateway-threshold-reader.ts +4 -1
- package/src/permissions/prompter.ts +9 -2
- package/src/permissions/secret-prompter.ts +21 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/system-prompt.ts +34 -70
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +541 -45
- package/src/runtime/assistant-event.ts +1 -6
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/route-policy.ts +11 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +22 -82
- package/src/runtime/http-types.ts +5 -0
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
- package/src/runtime/migrations/migration-transport.ts +46 -13
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +133 -79
- package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
- package/src/runtime/migrations/vbundle-importer.ts +7 -7
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
- package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
- package/src/runtime/migrations/vbundle-validator.ts +214 -41
- package/src/runtime/pending-interactions.ts +13 -4
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +45 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +120 -8
- package/src/runtime/routes/conversation-routes.ts +44 -528
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/documents-routes.ts +53 -18
- package/src/runtime/routes/events-routes.ts +59 -91
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/host-bash-routes.ts +3 -2
- package/src/runtime/routes/host-browser-routes.ts +9 -33
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +3 -2
- package/src/runtime/routes/host-transfer-routes.ts +11 -15
- package/src/runtime/routes/identity-routes.ts +78 -6
- package/src/runtime/routes/inbound-message-handler.ts +580 -137
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/index.ts +4 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/memory-v2-routes.ts +10 -15
- package/src/runtime/routes/migration-routes.ts +188 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +3 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/schedule/schedule-store.ts +0 -16
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +6 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
- package/src/telemetry/usage-telemetry-reporter.ts +3 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
- package/src/tools/browser/cdp-client/factory.ts +48 -76
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/executor.ts +44 -31
- package/src/tools/host-filesystem/edit.ts +3 -2
- package/src/tools/host-filesystem/read.ts +3 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +4 -3
- package/src/tools/host-filesystem/write.ts +3 -2
- package/src/tools/host-terminal/host-shell.ts +4 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/types.ts +12 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
* stable identity.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
23
|
+
|
|
22
24
|
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
23
25
|
import { getConfig } from "../config/loader.js";
|
|
24
26
|
import type {
|
|
@@ -30,14 +32,28 @@ import type {
|
|
|
30
32
|
} from "./types.js";
|
|
31
33
|
|
|
32
34
|
export class CallSiteRoutingProvider implements Provider {
|
|
33
|
-
public readonly name: string;
|
|
34
35
|
public readonly tokenEstimationProvider?: string;
|
|
35
36
|
|
|
37
|
+
// Per-call async context that tracks which provider is currently executing.
|
|
38
|
+
// Using AsyncLocalStorage instead of a plain instance field means concurrent
|
|
39
|
+
// sendMessage calls (e.g. the main agent turn and a title-generation call
|
|
40
|
+
// both in-flight at the same time on the same provider instance) each see
|
|
41
|
+
// their own value — no clobbering, no premature clear.
|
|
42
|
+
//
|
|
43
|
+
// During sendMessage, emitLlmCallStartedIfNeeded reads provider.name on the
|
|
44
|
+
// first text_delta (before the response completes). The getter below returns
|
|
45
|
+
// the async-context value so streaming trace events carry the routed
|
|
46
|
+
// provider's name, not the default's.
|
|
47
|
+
private readonly _activeProviderContext = new AsyncLocalStorage<string>();
|
|
48
|
+
|
|
49
|
+
get name(): string {
|
|
50
|
+
return this._activeProviderContext.getStore() ?? this.defaultProvider.name;
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
constructor(
|
|
37
54
|
private readonly defaultProvider: Provider,
|
|
38
55
|
private readonly getProviderByName: (name: string) => Provider | undefined,
|
|
39
56
|
) {
|
|
40
|
-
this.name = defaultProvider.name;
|
|
41
57
|
this.tokenEstimationProvider = defaultProvider.tokenEstimationProvider;
|
|
42
58
|
}
|
|
43
59
|
|
|
@@ -48,7 +64,30 @@ export class CallSiteRoutingProvider implements Provider {
|
|
|
48
64
|
options?: SendMessageOptions,
|
|
49
65
|
): Promise<ProviderResponse> {
|
|
50
66
|
const target = this.selectProvider(options);
|
|
51
|
-
|
|
67
|
+
const isRouted = target !== this.defaultProvider;
|
|
68
|
+
|
|
69
|
+
const doSend = async (): Promise<ProviderResponse> => {
|
|
70
|
+
const response = await target.sendMessage(
|
|
71
|
+
messages,
|
|
72
|
+
tools,
|
|
73
|
+
systemPrompt,
|
|
74
|
+
options,
|
|
75
|
+
);
|
|
76
|
+
// Also stamp actualProvider on the response so that handleUsage /
|
|
77
|
+
// llm_call_finished (which read event.actualProvider, not provider.name)
|
|
78
|
+
// attribute the call to the right provider.
|
|
79
|
+
if (isRouted && response.actualProvider == null) {
|
|
80
|
+
return { ...response, actualProvider: target.name };
|
|
81
|
+
}
|
|
82
|
+
return response;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Run inside the async context so that any code reading provider.name
|
|
86
|
+
// during streaming (e.g. emitLlmCallStartedIfNeeded on text_delta) sees
|
|
87
|
+
// the routed provider's name for this specific call, not the default.
|
|
88
|
+
return isRouted
|
|
89
|
+
? this._activeProviderContext.run(target.name, doSend)
|
|
90
|
+
: doSend();
|
|
52
91
|
}
|
|
53
92
|
|
|
54
93
|
/**
|
|
@@ -30,10 +30,20 @@ const GEMINI_CONTEXT_OVERFLOW_TOKEN_PATTERNS =
|
|
|
30
30
|
const GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE =
|
|
31
31
|
"context_engineering_is_the_way_to_go";
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
function isGemini3Model(model: string): boolean {
|
|
34
34
|
return model.startsWith("gemini-3") || model.startsWith("models/gemini-3");
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
function stripGeminiHttpOptions(
|
|
38
|
+
config: genai.GenerateContentConfig,
|
|
39
|
+
): genai.GenerateContentConfig {
|
|
40
|
+
const { httpOptions: _httpOptions, ...rest } =
|
|
41
|
+
config as genai.GenerateContentConfig & {
|
|
42
|
+
httpOptions?: unknown;
|
|
43
|
+
};
|
|
44
|
+
return rest;
|
|
45
|
+
}
|
|
46
|
+
|
|
37
47
|
/**
|
|
38
48
|
* Detect Gemini's context-overflow signals on an `ApiError`. Gemini surfaces
|
|
39
49
|
* this condition via its "RESOURCE_EXHAUSTED" category. The Gemini SDK's
|
|
@@ -162,6 +172,9 @@ export class GeminiProvider implements Provider {
|
|
|
162
172
|
const configObj = config as Record<string, unknown> | undefined;
|
|
163
173
|
const maxTokens = configObj?.max_tokens as number | undefined;
|
|
164
174
|
const modelOverride = configObj?.model as string | undefined;
|
|
175
|
+
const usageAttributionHeaders = configObj?.usageAttributionHeaders as
|
|
176
|
+
| Record<string, string>
|
|
177
|
+
| undefined;
|
|
165
178
|
const activeModel = modelOverride ?? this.model;
|
|
166
179
|
|
|
167
180
|
try {
|
|
@@ -193,6 +206,9 @@ export class GeminiProvider implements Provider {
|
|
|
193
206
|
const { signal: timeoutSignal, cleanup: cleanupTimeout } =
|
|
194
207
|
createStreamTimeout(this.streamTimeoutMs, signal);
|
|
195
208
|
geminiConfig.abortSignal = timeoutSignal;
|
|
209
|
+
if (usageAttributionHeaders) {
|
|
210
|
+
geminiConfig.httpOptions = { headers: usageAttributionHeaders };
|
|
211
|
+
}
|
|
196
212
|
|
|
197
213
|
// Accumulate from streaming chunks
|
|
198
214
|
let fullText = "";
|
|
@@ -296,7 +312,7 @@ export class GeminiProvider implements Provider {
|
|
|
296
312
|
const rawRequest = {
|
|
297
313
|
model: activeModel,
|
|
298
314
|
contents: geminiContents,
|
|
299
|
-
config: geminiConfig,
|
|
315
|
+
config: stripGeminiHttpOptions(geminiConfig),
|
|
300
316
|
};
|
|
301
317
|
const rawResponse = {
|
|
302
318
|
model: responseModel,
|
|
@@ -92,8 +92,3 @@ export async function managedFallbackEnabledFor(
|
|
|
92
92
|
if (!meta?.managed) return false;
|
|
93
93
|
return await hasManagedProxyPrereqs();
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
/** @internal Test-only: reset the cached managed-proxy-enabled flag. */
|
|
97
|
-
export function _resetManagedProxyEnabledCache(): void {
|
|
98
|
-
_managedProxyEnabled = false;
|
|
99
|
-
}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
export type LongContextMode =
|
|
2
|
+
| "native-model"
|
|
3
|
+
| "provider-request-option"
|
|
4
|
+
| "unsupported";
|
|
5
|
+
|
|
1
6
|
export interface CatalogModel {
|
|
2
7
|
id: string;
|
|
3
8
|
displayName: string;
|
|
4
9
|
contextWindowTokens?: number;
|
|
5
10
|
maxOutputTokens?: number;
|
|
11
|
+
defaultContextWindowTokens?: number;
|
|
12
|
+
longContextPricingThresholdTokens?: number;
|
|
13
|
+
longContextMode?: LongContextMode;
|
|
6
14
|
supportsThinking?: boolean;
|
|
7
15
|
supportsCaching?: boolean;
|
|
8
16
|
supportsVision?: boolean;
|
|
@@ -15,6 +23,31 @@ export interface CatalogModel {
|
|
|
15
23
|
};
|
|
16
24
|
}
|
|
17
25
|
|
|
26
|
+
const DEFAULT_CONTEXT_WINDOW_TOKENS = 200000;
|
|
27
|
+
const OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS = 272000;
|
|
28
|
+
|
|
29
|
+
function catalogModel(model: CatalogModel): CatalogModel {
|
|
30
|
+
const configuredDefaultContextWindowTokens =
|
|
31
|
+
model.defaultContextWindowTokens ?? DEFAULT_CONTEXT_WINDOW_TOKENS;
|
|
32
|
+
const defaultContextWindowTokens =
|
|
33
|
+
model.contextWindowTokens === undefined
|
|
34
|
+
? configuredDefaultContextWindowTokens
|
|
35
|
+
: Math.min(
|
|
36
|
+
configuredDefaultContextWindowTokens,
|
|
37
|
+
model.contextWindowTokens,
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
...model,
|
|
42
|
+
defaultContextWindowTokens,
|
|
43
|
+
longContextMode:
|
|
44
|
+
model.longContextMode ??
|
|
45
|
+
((model.contextWindowTokens ?? 0) > DEFAULT_CONTEXT_WINDOW_TOKENS
|
|
46
|
+
? "native-model"
|
|
47
|
+
: "unsupported"),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
18
51
|
export interface ProviderCatalogEntry {
|
|
19
52
|
id: string;
|
|
20
53
|
displayName: string;
|
|
@@ -33,8 +66,26 @@ export interface ProviderCatalogEntry {
|
|
|
33
66
|
};
|
|
34
67
|
}
|
|
35
68
|
|
|
36
|
-
/**
|
|
37
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Canonical assistant catalog for inference provider metadata and models.
|
|
71
|
+
* `meta/llm-provider-catalog.json` mirrors the client-facing subset and is
|
|
72
|
+
* kept in parity by `llm-catalog-parity.test.ts`; native-client fallbacks
|
|
73
|
+
* mirror only the startup-critical display/setup/context metadata.
|
|
74
|
+
*
|
|
75
|
+
* Model limits verified 2026-04-30 against official provider docs:
|
|
76
|
+
* - Anthropic model overview and context window docs:
|
|
77
|
+
* https://platform.claude.com/docs/en/about-claude/models/overview
|
|
78
|
+
* https://platform.claude.com/docs/en/build-with-claude/context-windows
|
|
79
|
+
* - OpenAI model comparison and model detail docs:
|
|
80
|
+
* https://developers.openai.com/api/docs/models/compare
|
|
81
|
+
* https://developers.openai.com/api/docs/models
|
|
82
|
+
* - Google Gemini model docs:
|
|
83
|
+
* https://ai.google.dev/gemini-api/docs/models
|
|
84
|
+
*
|
|
85
|
+
* contextWindowTokens is the maximum known input context. maxOutputTokens is
|
|
86
|
+
* the maximum standard synchronous Messages/Responses output limit.
|
|
87
|
+
*/
|
|
88
|
+
const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
38
89
|
{
|
|
39
90
|
id: "anthropic",
|
|
40
91
|
displayName: "Anthropic",
|
|
@@ -52,8 +103,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
52
103
|
{
|
|
53
104
|
id: "claude-opus-4-7",
|
|
54
105
|
displayName: "Claude Opus 4.7",
|
|
55
|
-
contextWindowTokens:
|
|
56
|
-
maxOutputTokens:
|
|
106
|
+
contextWindowTokens: 1000000,
|
|
107
|
+
maxOutputTokens: 128000,
|
|
108
|
+
longContextPricingThresholdTokens: 200000,
|
|
57
109
|
supportsThinking: true,
|
|
58
110
|
supportsCaching: true,
|
|
59
111
|
supportsVision: true,
|
|
@@ -68,8 +120,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
68
120
|
{
|
|
69
121
|
id: "claude-opus-4-6",
|
|
70
122
|
displayName: "Claude Opus 4.6",
|
|
71
|
-
contextWindowTokens:
|
|
72
|
-
maxOutputTokens:
|
|
123
|
+
contextWindowTokens: 1000000,
|
|
124
|
+
maxOutputTokens: 128000,
|
|
125
|
+
longContextPricingThresholdTokens: 200000,
|
|
73
126
|
supportsThinking: true,
|
|
74
127
|
supportsCaching: true,
|
|
75
128
|
supportsVision: true,
|
|
@@ -84,8 +137,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
84
137
|
{
|
|
85
138
|
id: "claude-sonnet-4-6",
|
|
86
139
|
displayName: "Claude Sonnet 4.6",
|
|
87
|
-
contextWindowTokens:
|
|
140
|
+
contextWindowTokens: 1000000,
|
|
88
141
|
maxOutputTokens: 64000,
|
|
142
|
+
longContextPricingThresholdTokens: 200000,
|
|
89
143
|
supportsThinking: true,
|
|
90
144
|
supportsCaching: true,
|
|
91
145
|
supportsVision: true,
|
|
@@ -101,7 +155,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
101
155
|
id: "claude-haiku-4-5-20251001",
|
|
102
156
|
displayName: "Claude Haiku 4.5",
|
|
103
157
|
contextWindowTokens: 200000,
|
|
104
|
-
maxOutputTokens:
|
|
158
|
+
maxOutputTokens: 64000,
|
|
105
159
|
supportsThinking: true,
|
|
106
160
|
supportsCaching: true,
|
|
107
161
|
supportsVision: true,
|
|
@@ -137,6 +191,8 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
137
191
|
displayName: "GPT-5.5",
|
|
138
192
|
contextWindowTokens: 1050000,
|
|
139
193
|
maxOutputTokens: 128000,
|
|
194
|
+
longContextPricingThresholdTokens:
|
|
195
|
+
OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
140
196
|
supportsThinking: true,
|
|
141
197
|
supportsCaching: true,
|
|
142
198
|
supportsVision: true,
|
|
@@ -147,11 +203,29 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
147
203
|
cacheReadPer1mTokens: 0.5,
|
|
148
204
|
},
|
|
149
205
|
},
|
|
206
|
+
{
|
|
207
|
+
id: "gpt-5.5-pro",
|
|
208
|
+
displayName: "GPT-5.5 Pro",
|
|
209
|
+
contextWindowTokens: 1050000,
|
|
210
|
+
maxOutputTokens: 128000,
|
|
211
|
+
longContextPricingThresholdTokens:
|
|
212
|
+
OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
213
|
+
supportsThinking: true,
|
|
214
|
+
supportsCaching: true,
|
|
215
|
+
supportsVision: true,
|
|
216
|
+
supportsToolUse: true,
|
|
217
|
+
pricing: {
|
|
218
|
+
inputPer1mTokens: 30.0,
|
|
219
|
+
outputPer1mTokens: 180.0,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
150
222
|
{
|
|
151
223
|
id: "gpt-5.4",
|
|
152
224
|
displayName: "GPT-5.4",
|
|
153
|
-
contextWindowTokens:
|
|
225
|
+
contextWindowTokens: 1050000,
|
|
154
226
|
maxOutputTokens: 128000,
|
|
227
|
+
longContextPricingThresholdTokens:
|
|
228
|
+
OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
155
229
|
supportsThinking: true,
|
|
156
230
|
supportsCaching: true,
|
|
157
231
|
supportsVision: true,
|
|
@@ -187,9 +261,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
187
261
|
supportsVision: true,
|
|
188
262
|
supportsToolUse: true,
|
|
189
263
|
pricing: {
|
|
190
|
-
inputPer1mTokens: 0.
|
|
191
|
-
outputPer1mTokens:
|
|
192
|
-
cacheReadPer1mTokens: 0.
|
|
264
|
+
inputPer1mTokens: 0.75,
|
|
265
|
+
outputPer1mTokens: 4.5,
|
|
266
|
+
cacheReadPer1mTokens: 0.075,
|
|
193
267
|
},
|
|
194
268
|
},
|
|
195
269
|
{
|
|
@@ -232,6 +306,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
232
306
|
displayName: "Gemini 3.1 Pro Preview",
|
|
233
307
|
contextWindowTokens: 1048576,
|
|
234
308
|
maxOutputTokens: 65536,
|
|
309
|
+
longContextPricingThresholdTokens: 200000,
|
|
235
310
|
supportsThinking: true,
|
|
236
311
|
supportsCaching: true,
|
|
237
312
|
supportsVision: true,
|
|
@@ -247,6 +322,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
247
322
|
displayName: "Gemini 3.1 Pro Preview (Custom Tools)",
|
|
248
323
|
contextWindowTokens: 1048576,
|
|
249
324
|
maxOutputTokens: 65536,
|
|
325
|
+
longContextPricingThresholdTokens: 200000,
|
|
250
326
|
supportsThinking: true,
|
|
251
327
|
supportsCaching: true,
|
|
252
328
|
supportsVision: true,
|
|
@@ -320,8 +396,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
320
396
|
{
|
|
321
397
|
id: "gemini-2.5-pro",
|
|
322
398
|
displayName: "Gemini 2.5 Pro",
|
|
323
|
-
contextWindowTokens:
|
|
399
|
+
contextWindowTokens: 1048576,
|
|
324
400
|
maxOutputTokens: 65536,
|
|
401
|
+
longContextPricingThresholdTokens: 200000,
|
|
325
402
|
supportsThinking: true,
|
|
326
403
|
supportsCaching: true,
|
|
327
404
|
supportsVision: true,
|
|
@@ -426,8 +503,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
426
503
|
{
|
|
427
504
|
id: "anthropic/claude-opus-4.7",
|
|
428
505
|
displayName: "Claude Opus 4.7",
|
|
429
|
-
contextWindowTokens:
|
|
430
|
-
maxOutputTokens:
|
|
506
|
+
contextWindowTokens: 1000000,
|
|
507
|
+
maxOutputTokens: 128000,
|
|
508
|
+
longContextPricingThresholdTokens: 200000,
|
|
431
509
|
supportsThinking: true,
|
|
432
510
|
supportsCaching: true,
|
|
433
511
|
supportsVision: true,
|
|
@@ -442,8 +520,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
442
520
|
{
|
|
443
521
|
id: "anthropic/claude-opus-4.6",
|
|
444
522
|
displayName: "Claude Opus 4.6",
|
|
445
|
-
contextWindowTokens:
|
|
446
|
-
maxOutputTokens:
|
|
523
|
+
contextWindowTokens: 1000000,
|
|
524
|
+
maxOutputTokens: 128000,
|
|
525
|
+
longContextPricingThresholdTokens: 200000,
|
|
447
526
|
supportsThinking: true,
|
|
448
527
|
supportsCaching: true,
|
|
449
528
|
supportsVision: true,
|
|
@@ -458,8 +537,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
458
537
|
{
|
|
459
538
|
id: "anthropic/claude-sonnet-4.6",
|
|
460
539
|
displayName: "Claude Sonnet 4.6",
|
|
461
|
-
contextWindowTokens:
|
|
540
|
+
contextWindowTokens: 1000000,
|
|
462
541
|
maxOutputTokens: 64000,
|
|
542
|
+
longContextPricingThresholdTokens: 200000,
|
|
463
543
|
supportsThinking: true,
|
|
464
544
|
supportsCaching: true,
|
|
465
545
|
supportsVision: true,
|
|
@@ -475,7 +555,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
475
555
|
id: "anthropic/claude-haiku-4.5",
|
|
476
556
|
displayName: "Claude Haiku 4.5",
|
|
477
557
|
contextWindowTokens: 200000,
|
|
478
|
-
maxOutputTokens:
|
|
558
|
+
maxOutputTokens: 64000,
|
|
479
559
|
supportsThinking: true,
|
|
480
560
|
supportsCaching: true,
|
|
481
561
|
supportsVision: true,
|
|
@@ -677,6 +757,12 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
677
757
|
},
|
|
678
758
|
];
|
|
679
759
|
|
|
760
|
+
export const PROVIDER_CATALOG: ProviderCatalogEntry[] =
|
|
761
|
+
RAW_PROVIDER_CATALOG.map((entry) => ({
|
|
762
|
+
...entry,
|
|
763
|
+
models: entry.models.map(catalogModel),
|
|
764
|
+
}));
|
|
765
|
+
|
|
680
766
|
/** Check if a model ID is in the catalog for a given provider. */
|
|
681
767
|
export function isModelInCatalog(provider: string, modelId: string): boolean {
|
|
682
768
|
const entry = PROVIDER_CATALOG.find((p) => p.id === provider);
|
|
@@ -139,6 +139,9 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
139
139
|
const maxTokens = configObj?.max_tokens as number | undefined;
|
|
140
140
|
const modelOverride = configObj?.model as string | undefined;
|
|
141
141
|
const effort = configObj?.effort as string | undefined;
|
|
142
|
+
const usageAttributionHeaders = configObj?.usageAttributionHeaders as
|
|
143
|
+
| Record<string, string>
|
|
144
|
+
| undefined;
|
|
142
145
|
|
|
143
146
|
try {
|
|
144
147
|
const openaiMessages = this.toOpenAIMessages(messages, systemPrompt);
|
|
@@ -196,6 +199,9 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
196
199
|
try {
|
|
197
200
|
const stream = await this.client.chat.completions.create(params, {
|
|
198
201
|
signal: timeoutSignal,
|
|
202
|
+
...(usageAttributionHeaders
|
|
203
|
+
? { headers: usageAttributionHeaders }
|
|
204
|
+
: {}),
|
|
199
205
|
});
|
|
200
206
|
|
|
201
207
|
for await (const chunk of stream) {
|
|
@@ -130,6 +130,9 @@ export class OpenAIResponsesProvider implements Provider {
|
|
|
130
130
|
const modelOverride = configObj?.model as string | undefined;
|
|
131
131
|
const effort = configObj?.effort as string | undefined;
|
|
132
132
|
const verbosity = configObj?.verbosity as string | undefined;
|
|
133
|
+
const usageAttributionHeaders = configObj?.usageAttributionHeaders as
|
|
134
|
+
| Record<string, string>
|
|
135
|
+
| undefined;
|
|
133
136
|
|
|
134
137
|
try {
|
|
135
138
|
const input = this.toResponsesInput(messages);
|
|
@@ -222,11 +225,14 @@ export class OpenAIResponsesProvider implements Provider {
|
|
|
222
225
|
const responsesApi = this.client.responses as unknown as {
|
|
223
226
|
stream(
|
|
224
227
|
p: Record<string, unknown>,
|
|
225
|
-
o: { signal: AbortSignal },
|
|
228
|
+
o: { signal: AbortSignal; headers?: Record<string, string> },
|
|
226
229
|
): AsyncIterable<ResponsesStreamEvent>;
|
|
227
230
|
};
|
|
228
231
|
const stream = responsesApi.stream(params, {
|
|
229
232
|
signal: timeoutSignal,
|
|
233
|
+
...(usageAttributionHeaders
|
|
234
|
+
? { headers: usageAttributionHeaders }
|
|
235
|
+
: {}),
|
|
230
236
|
});
|
|
231
237
|
|
|
232
238
|
for await (const event of stream) {
|
|
@@ -13,12 +13,13 @@ import type {
|
|
|
13
13
|
Message,
|
|
14
14
|
Provider,
|
|
15
15
|
ProviderResponse,
|
|
16
|
+
SendMessageOptions,
|
|
17
|
+
ToolDefinition,
|
|
16
18
|
ToolUseContent,
|
|
17
19
|
} from "./types.js";
|
|
18
20
|
|
|
19
21
|
// Re-export the typed context-overflow error so callsites that dispatch on
|
|
20
22
|
// this category do not need to reach into `./types.js` directly.
|
|
21
|
-
export { ContextOverflowError, isContextOverflowError } from "./types.js";
|
|
22
23
|
|
|
23
24
|
export interface ConfiguredProviderResult {
|
|
24
25
|
provider: Provider;
|
|
@@ -33,6 +34,44 @@ export interface ConfiguredProviderResult {
|
|
|
33
34
|
*/
|
|
34
35
|
let lazyInitPromise: Promise<void> | null = null;
|
|
35
36
|
|
|
37
|
+
export class CallSiteConfiguredProvider implements Provider {
|
|
38
|
+
public readonly name: string;
|
|
39
|
+
public readonly tokenEstimationProvider?: string;
|
|
40
|
+
|
|
41
|
+
constructor(
|
|
42
|
+
private readonly inner: Provider,
|
|
43
|
+
private readonly callSite: LLMCallSite,
|
|
44
|
+
private readonly overrideProfile?: string,
|
|
45
|
+
) {
|
|
46
|
+
this.name = inner.name;
|
|
47
|
+
this.tokenEstimationProvider = inner.tokenEstimationProvider;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
sendMessage(
|
|
51
|
+
messages: Message[],
|
|
52
|
+
tools?: ToolDefinition[],
|
|
53
|
+
systemPrompt?: string,
|
|
54
|
+
options?: SendMessageOptions,
|
|
55
|
+
): Promise<ProviderResponse> {
|
|
56
|
+
const config = options?.config;
|
|
57
|
+
if (config?.callSite) {
|
|
58
|
+
return this.inner.sendMessage(messages, tools, systemPrompt, options);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return this.inner.sendMessage(messages, tools, systemPrompt, {
|
|
62
|
+
...options,
|
|
63
|
+
config: {
|
|
64
|
+
...config,
|
|
65
|
+
callSite: this.callSite,
|
|
66
|
+
...(config?.overrideProfile === undefined &&
|
|
67
|
+
this.overrideProfile !== undefined
|
|
68
|
+
? { overrideProfile: this.overrideProfile }
|
|
69
|
+
: {}),
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
36
75
|
/**
|
|
37
76
|
* Resolve the configured provider with full selection metadata.
|
|
38
77
|
* If providers haven't been initialized yet (e.g. non-daemon code paths),
|
|
@@ -77,7 +116,11 @@ export async function resolveConfiguredProvider(
|
|
|
77
116
|
try {
|
|
78
117
|
const provider = getProvider(inferenceProvider);
|
|
79
118
|
return {
|
|
80
|
-
provider
|
|
119
|
+
provider: new CallSiteConfiguredProvider(
|
|
120
|
+
provider,
|
|
121
|
+
callSite,
|
|
122
|
+
opts.overrideProfile,
|
|
123
|
+
),
|
|
81
124
|
configuredProviderName: inferenceProvider,
|
|
82
125
|
};
|
|
83
126
|
} catch {
|
|
@@ -12,7 +12,13 @@ import type {
|
|
|
12
12
|
const log = getLogger("rate-limit");
|
|
13
13
|
|
|
14
14
|
export class RateLimitProvider implements Provider {
|
|
15
|
-
|
|
15
|
+
// Delegate name dynamically so that wrapper providers (e.g.
|
|
16
|
+
// CallSiteRoutingProvider) whose name getter reflects per-call async context
|
|
17
|
+
// (AsyncLocalStorage) are reached correctly during streaming — rather than
|
|
18
|
+
// returning a stale snapshot captured at construction time.
|
|
19
|
+
get name(): string {
|
|
20
|
+
return this.inner.name;
|
|
21
|
+
}
|
|
16
22
|
|
|
17
23
|
get tokenEstimationProvider(): string | undefined {
|
|
18
24
|
return this.inner.tokenEstimationProvider;
|
|
@@ -25,7 +31,6 @@ export class RateLimitProvider implements Provider {
|
|
|
25
31
|
private readonly config: RateLimitConfig,
|
|
26
32
|
sharedRequestTimestamps?: number[],
|
|
27
33
|
) {
|
|
28
|
-
this.name = inner.name;
|
|
29
34
|
this.requestTimestamps = sharedRequestTimestamps ?? [];
|
|
30
35
|
}
|
|
31
36
|
|
|
@@ -14,12 +14,13 @@ import { OpenAIResponsesProvider } from "./openai/client.js";
|
|
|
14
14
|
import { OpenRouterProvider } from "./openrouter/client.js";
|
|
15
15
|
import { RetryProvider } from "./retry.js";
|
|
16
16
|
import type { Provider } from "./types.js";
|
|
17
|
+
import { UsageTrackingProvider } from "./usage-tracking.js";
|
|
17
18
|
|
|
18
19
|
const providers = new Map<string, Provider>();
|
|
19
20
|
const routingSources = new Map<string, "user-key" | "managed-proxy">();
|
|
20
21
|
|
|
21
22
|
function registerProvider(name: string, provider: Provider): void {
|
|
22
|
-
providers.set(name, provider);
|
|
23
|
+
providers.set(name, new UsageTrackingProvider(provider));
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
export function getProvider(name: string): Provider {
|
|
@@ -40,14 +41,6 @@ export function getProviderRoutingSource(
|
|
|
40
41
|
return routingSources.get(name);
|
|
41
42
|
}
|
|
42
43
|
|
|
43
|
-
/**
|
|
44
|
-
* Return the default model for a given provider name.
|
|
45
|
-
* Falls back to the Anthropic default if the provider name is unknown.
|
|
46
|
-
*/
|
|
47
|
-
export function getDefaultModel(providerName: string): string {
|
|
48
|
-
return getProviderDefaultModel(providerName);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
44
|
export interface ProvidersConfig {
|
|
52
45
|
services: {
|
|
53
46
|
inference: {
|
|
@@ -171,6 +164,10 @@ export async function initializeProviders(
|
|
|
171
164
|
? { baseURL: anthropicCreds.baseURL }
|
|
172
165
|
: {}),
|
|
173
166
|
}),
|
|
167
|
+
{
|
|
168
|
+
forwardUsageAttributionHeaders:
|
|
169
|
+
anthropicCreds.source === "managed-proxy",
|
|
170
|
+
},
|
|
174
171
|
),
|
|
175
172
|
);
|
|
176
173
|
routingSources.set("anthropic", anthropicCreds.source);
|
|
@@ -188,6 +185,10 @@ export async function initializeProviders(
|
|
|
188
185
|
streamTimeoutMs,
|
|
189
186
|
...(openaiCreds.baseURL ? { baseURL: openaiCreds.baseURL } : {}),
|
|
190
187
|
}),
|
|
188
|
+
{
|
|
189
|
+
forwardUsageAttributionHeaders:
|
|
190
|
+
openaiCreds.source === "managed-proxy",
|
|
191
|
+
},
|
|
191
192
|
),
|
|
192
193
|
);
|
|
193
194
|
routingSources.set("openai", openaiCreds.source);
|
|
@@ -206,6 +207,10 @@ export async function initializeProviders(
|
|
|
206
207
|
? { managedBaseUrl: geminiCreds.baseURL }
|
|
207
208
|
: {}),
|
|
208
209
|
}),
|
|
210
|
+
{
|
|
211
|
+
forwardUsageAttributionHeaders:
|
|
212
|
+
geminiCreds.source === "managed-proxy",
|
|
213
|
+
},
|
|
209
214
|
),
|
|
210
215
|
);
|
|
211
216
|
routingSources.set("gemini", geminiCreds.source);
|