@vellumai/assistant 0.6.4 → 0.6.5
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/.prettierignore +5 -0
- package/ARCHITECTURE.md +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +14 -1
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +17 -1
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +230 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +52 -1
- package/src/runtime/http-types.ts +23 -1
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -20,15 +20,11 @@ mock.module("../security/secure-keys.js", () => ({
|
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
function cloneConfig(): AssistantConfig {
|
|
22
22
|
const cfg = structuredClone(DEFAULT_CONFIG);
|
|
23
|
-
cfg.
|
|
23
|
+
cfg.llm.default.provider = "anthropic";
|
|
24
24
|
cfg.workspaceGit.commitMessageLLM = {
|
|
25
25
|
...cfg.workspaceGit.commitMessageLLM,
|
|
26
26
|
enabled: true,
|
|
27
|
-
useConfiguredProvider: true,
|
|
28
|
-
providerFastModelOverrides: {},
|
|
29
27
|
timeoutMs: 5000,
|
|
30
|
-
maxTokens: 120,
|
|
31
|
-
temperature: 0.2,
|
|
32
28
|
maxFilesInPrompt: 30,
|
|
33
29
|
maxDiffBytes: 12000,
|
|
34
30
|
minRemainingTurnBudgetMs: 1000,
|
|
@@ -140,17 +136,6 @@ describe("ProviderCommitMessageGenerator", () => {
|
|
|
140
136
|
expect(result.reason).toBe("disabled");
|
|
141
137
|
});
|
|
142
138
|
|
|
143
|
-
// 2. useConfiguredProvider false
|
|
144
|
-
test('useConfiguredProvider false → returns deterministic, reason "disabled"', async () => {
|
|
145
|
-
currentConfig.workspaceGit.commitMessageLLM.useConfiguredProvider = false;
|
|
146
|
-
const gen = getCommitMessageGenerator();
|
|
147
|
-
const result = await gen.generateCommitMessage(baseContext, {
|
|
148
|
-
changedFiles: baseContext.changedFiles,
|
|
149
|
-
});
|
|
150
|
-
expect(result.source).toBe("deterministic");
|
|
151
|
-
expect(result.reason).toBe("disabled");
|
|
152
|
-
});
|
|
153
|
-
|
|
154
139
|
// 3. missing API key
|
|
155
140
|
test('missing API key → returns deterministic, reason "missing_provider_api_key"', async () => {
|
|
156
141
|
mockSecureKeys = {};
|
|
@@ -221,7 +206,7 @@ describe("ProviderCommitMessageGenerator", () => {
|
|
|
221
206
|
});
|
|
222
207
|
|
|
223
208
|
// 6. LLM success
|
|
224
|
-
test('LLM success → returns LLM message, source "llm",
|
|
209
|
+
test('LLM success → returns LLM message, source "llm", callSite passed', async () => {
|
|
225
210
|
const commitMsg = "feat: add new feature";
|
|
226
211
|
mockSendMessage.mockResolvedValueOnce(makeSuccessResponse(commitMsg));
|
|
227
212
|
const gen = getCommitMessageGenerator();
|
|
@@ -232,29 +217,13 @@ describe("ProviderCommitMessageGenerator", () => {
|
|
|
232
217
|
expect(result.message).toBe(commitMsg);
|
|
233
218
|
expect(result.reason).toBeUndefined();
|
|
234
219
|
|
|
235
|
-
// Verify the
|
|
220
|
+
// Verify the callSite was passed so the provider's RetryProvider routes
|
|
221
|
+
// through `resolveCallSiteConfig` for model/max_tokens/temperature.
|
|
236
222
|
const callArgs = mockSendMessage.mock.calls[0];
|
|
237
|
-
const options = callArgs[3] as {
|
|
238
|
-
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
// 7. fast-model override
|
|
242
|
-
test("fast-model override → uses override instead of default", async () => {
|
|
243
|
-
currentConfig.workspaceGit.commitMessageLLM.providerFastModelOverrides = {
|
|
244
|
-
anthropic: "claude-sonnet-4-20250514",
|
|
223
|
+
const options = callArgs[3] as {
|
|
224
|
+
config: { callSite: string };
|
|
245
225
|
};
|
|
246
|
-
|
|
247
|
-
mockSendMessage.mockResolvedValueOnce(makeSuccessResponse(commitMsg));
|
|
248
|
-
const gen = getCommitMessageGenerator();
|
|
249
|
-
const result = await gen.generateCommitMessage(baseContext, {
|
|
250
|
-
changedFiles: baseContext.changedFiles,
|
|
251
|
-
});
|
|
252
|
-
expect(result.source).toBe("llm");
|
|
253
|
-
expect(result.message).toBe(commitMsg);
|
|
254
|
-
|
|
255
|
-
const callArgs = mockSendMessage.mock.calls[0];
|
|
256
|
-
const options = callArgs[3] as { config: { model: string } };
|
|
257
|
-
expect(options.config.model).toBe("claude-sonnet-4-20250514");
|
|
226
|
+
expect(options.config.callSite).toBe("commitMessage");
|
|
258
227
|
});
|
|
259
228
|
|
|
260
229
|
// 8. LLM timeout
|
|
@@ -330,53 +299,16 @@ describe("ProviderCommitMessageGenerator", () => {
|
|
|
330
299
|
expect(result.message).toBe("b".repeat(72) + body);
|
|
331
300
|
});
|
|
332
301
|
|
|
333
|
-
// 12.
|
|
334
|
-
|
|
335
|
-
|
|
302
|
+
// 12. Ollama (keyless provider) — passes the API-key preflight even without
|
|
303
|
+
// a stored secret, then succeeds because the call-site resolver supplies
|
|
304
|
+
// the model from `llm.default`/`llm.callSites.commitMessage`.
|
|
305
|
+
test("Ollama (keyless) — succeeds because call-site resolver supplies the model", async () => {
|
|
306
|
+
currentConfig.llm.default.provider = "ollama";
|
|
336
307
|
mockSecureKeys = {};
|
|
337
308
|
resolvedProvider = {
|
|
338
309
|
provider: mockProvider,
|
|
339
310
|
configuredProviderName: "ollama",
|
|
340
311
|
};
|
|
341
|
-
const gen = getCommitMessageGenerator();
|
|
342
|
-
const result = await gen.generateCommitMessage(baseContext, {
|
|
343
|
-
changedFiles: baseContext.changedFiles,
|
|
344
|
-
});
|
|
345
|
-
expect(result.source).toBe("deterministic");
|
|
346
|
-
expect(result.reason).toBe("missing_fast_model");
|
|
347
|
-
expect(result.reason).not.toBe("missing_provider_api_key");
|
|
348
|
-
expect(mockSendMessage).not.toHaveBeenCalled();
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
// 13. Unknown provider without fast model default → missing_fast_model, no provider call
|
|
352
|
-
test('Unknown provider without fast model default → returns deterministic, reason "missing_fast_model"', async () => {
|
|
353
|
-
(currentConfig.services.inference as Record<string, unknown>).provider =
|
|
354
|
-
"exotic-provider";
|
|
355
|
-
mockSecureKeys = { "exotic-provider": "sk-exotic" };
|
|
356
|
-
resolvedProvider = {
|
|
357
|
-
provider: mockProvider,
|
|
358
|
-
configuredProviderName: "exotic-provider",
|
|
359
|
-
};
|
|
360
|
-
const gen = getCommitMessageGenerator();
|
|
361
|
-
const result = await gen.generateCommitMessage(baseContext, {
|
|
362
|
-
changedFiles: baseContext.changedFiles,
|
|
363
|
-
});
|
|
364
|
-
expect(result.source).toBe("deterministic");
|
|
365
|
-
expect(result.reason).toBe("missing_fast_model");
|
|
366
|
-
expect(mockSendMessage).not.toHaveBeenCalled();
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
// 14. Fast-model override enables LLM path for provider without built-in default
|
|
370
|
-
test("fast-model override enables LLM path for provider without built-in default", async () => {
|
|
371
|
-
currentConfig.services.inference.provider = "ollama";
|
|
372
|
-
mockSecureKeys = {}; // Ollama is keyless
|
|
373
|
-
resolvedProvider = {
|
|
374
|
-
provider: mockProvider,
|
|
375
|
-
configuredProviderName: "ollama",
|
|
376
|
-
};
|
|
377
|
-
currentConfig.workspaceGit.commitMessageLLM.providerFastModelOverrides = {
|
|
378
|
-
ollama: "llama3.2:3b",
|
|
379
|
-
};
|
|
380
312
|
const commitMsg = "fix: local model commit";
|
|
381
313
|
mockSendMessage.mockResolvedValueOnce(makeSuccessResponse(commitMsg));
|
|
382
314
|
const gen = getCommitMessageGenerator();
|
|
@@ -385,10 +317,8 @@ describe("ProviderCommitMessageGenerator", () => {
|
|
|
385
317
|
});
|
|
386
318
|
expect(result.source).toBe("llm");
|
|
387
319
|
expect(result.message).toBe(commitMsg);
|
|
388
|
-
|
|
389
|
-
// Verify the override model was passed
|
|
390
320
|
const callArgs = mockSendMessage.mock.calls[0];
|
|
391
|
-
const options = callArgs[3] as { config: {
|
|
392
|
-
expect(options.config.
|
|
321
|
+
const options = callArgs[3] as { config: { callSite: string } };
|
|
322
|
+
expect(options.config.callSite).toBe("commitMessage");
|
|
393
323
|
});
|
|
394
324
|
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { describe, expect, test } from "bun:test";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Scope guard for `meta/provider-env-vars.json`.
|
|
7
|
+
*
|
|
8
|
+
* Since the LLM-provider env-var map moved into `PROVIDER_CATALOG` (see
|
|
9
|
+
* `assistant/src/providers/model-catalog.ts` and the `getLlmProviderEnvVar`
|
|
10
|
+
* helper in `assistant/src/providers/provider-env-vars.ts`), this JSON file
|
|
11
|
+
* must contain only **search-provider** env vars. Any LLM entries sneaking
|
|
12
|
+
* back in here would reintroduce the duplicated source of truth this
|
|
13
|
+
* refactor removed.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
interface ProviderEnvVarsRegistry {
|
|
17
|
+
version: number;
|
|
18
|
+
providers: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function loadRegistry(): ProviderEnvVarsRegistry {
|
|
22
|
+
const repoRoot = join(process.cwd(), "..");
|
|
23
|
+
const path = join(repoRoot, "meta", "provider-env-vars.json");
|
|
24
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe("provider-env-vars.json scope", () => {
|
|
28
|
+
test("schema is version 2", () => {
|
|
29
|
+
const json = loadRegistry();
|
|
30
|
+
expect(json.version).toBe(2);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("providers map contains exactly brave and perplexity", () => {
|
|
34
|
+
const json = loadRegistry();
|
|
35
|
+
const keys = Object.keys(json.providers).sort();
|
|
36
|
+
expect(keys).toEqual(["brave", "perplexity"]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("no LLM-provider entries leak into the search-provider registry", () => {
|
|
40
|
+
const json = loadRegistry();
|
|
41
|
+
const llmProviderIds = [
|
|
42
|
+
"anthropic",
|
|
43
|
+
"openai",
|
|
44
|
+
"gemini",
|
|
45
|
+
"fireworks",
|
|
46
|
+
"openrouter",
|
|
47
|
+
];
|
|
48
|
+
for (const id of llmProviderIds) {
|
|
49
|
+
expect(json.providers[id]).toBeUndefined();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -109,11 +109,12 @@ mock.module("../util/retry.js", () => {
|
|
|
109
109
|
|
|
110
110
|
import { RetryProvider } from "../providers/retry.js";
|
|
111
111
|
import { createStreamTimeout } from "../providers/stream-timeout.js";
|
|
112
|
-
import
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
112
|
+
import {
|
|
113
|
+
ContextOverflowError,
|
|
114
|
+
type Message,
|
|
115
|
+
type Provider,
|
|
116
|
+
type ProviderEvent,
|
|
117
|
+
type ProviderResponse,
|
|
117
118
|
} from "../providers/types.js";
|
|
118
119
|
import { ProviderError } from "../util/errors.js";
|
|
119
120
|
import { DEFAULT_MAX_RETRIES } from "../util/retry.js";
|
|
@@ -217,6 +218,47 @@ describe("RetryProvider — rate limit backoff", () => {
|
|
|
217
218
|
}
|
|
218
219
|
});
|
|
219
220
|
|
|
221
|
+
test("tags final error with retriesExhausted=true after retry loop gives up (JARVIS-513)", async () => {
|
|
222
|
+
// Transient socket flap from Bun's native fetch: wrapped in a
|
|
223
|
+
// ProviderError but still network-retryable via message pattern match.
|
|
224
|
+
const inner = makeFailing(
|
|
225
|
+
new ProviderError(
|
|
226
|
+
"Anthropic request failed: The socket connection was closed unexpectedly",
|
|
227
|
+
"anthropic",
|
|
228
|
+
),
|
|
229
|
+
);
|
|
230
|
+
const provider = new RetryProvider(inner);
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
await provider.sendMessage(MESSAGES);
|
|
234
|
+
expect(true).toBe(false);
|
|
235
|
+
} catch (err) {
|
|
236
|
+
const flag = (err as Error & { retriesExhausted?: boolean })
|
|
237
|
+
.retriesExhausted;
|
|
238
|
+
expect(flag).toBe(true);
|
|
239
|
+
// Retry loop should have used all attempts before surrendering.
|
|
240
|
+
expect(inner.calls).toBe(DEFAULT_MAX_RETRIES + 1);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test("does NOT tag retriesExhausted on non-retryable errors (no retry was attempted)", async () => {
|
|
245
|
+
// ProviderError without statusCode and without a retryable pattern: the
|
|
246
|
+
// retry loop short-circuits on the first attempt. No "exhaustion"
|
|
247
|
+
// occurred, so the marker must stay unset.
|
|
248
|
+
const inner = makeFailing(new ProviderError("model not found", "test"));
|
|
249
|
+
const provider = new RetryProvider(inner);
|
|
250
|
+
|
|
251
|
+
try {
|
|
252
|
+
await provider.sendMessage(MESSAGES);
|
|
253
|
+
expect(true).toBe(false);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
const flag = (err as Error & { retriesExhausted?: boolean })
|
|
256
|
+
.retriesExhausted;
|
|
257
|
+
expect(flag).toBeUndefined();
|
|
258
|
+
expect(inner.calls).toBe(1);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
|
|
220
262
|
test("uses retryAfterMs from ProviderError when present", async () => {
|
|
221
263
|
const error = new ProviderError("rate limited", "anthropic", 429, {
|
|
222
264
|
retryAfterMs: 30_000,
|
|
@@ -277,6 +319,58 @@ describe("RetryProvider — rate limit backoff", () => {
|
|
|
277
319
|
});
|
|
278
320
|
});
|
|
279
321
|
|
|
322
|
+
// ---------------------------------------------------------------------------
|
|
323
|
+
// RetryProvider — ContextOverflowError short-circuit
|
|
324
|
+
// ---------------------------------------------------------------------------
|
|
325
|
+
|
|
326
|
+
describe("RetryProvider — ContextOverflowError short-circuit", () => {
|
|
327
|
+
test("does NOT retry ContextOverflowError even when statusCode is 429", async () => {
|
|
328
|
+
// Gemini/Vertex can surface context overflow as a 429 RESOURCE_EXHAUSTED.
|
|
329
|
+
// Retrying is deterministic waste — the oversized prompt won't shrink.
|
|
330
|
+
const error = new ContextOverflowError("prompt too long", "gemini", {
|
|
331
|
+
statusCode: 429,
|
|
332
|
+
actualTokens: 250_000,
|
|
333
|
+
maxTokens: 200_000,
|
|
334
|
+
});
|
|
335
|
+
const inner = makeFailing(error);
|
|
336
|
+
const provider = new RetryProvider(inner);
|
|
337
|
+
|
|
338
|
+
await expect(provider.sendMessage(MESSAGES)).rejects.toBeInstanceOf(
|
|
339
|
+
ContextOverflowError,
|
|
340
|
+
);
|
|
341
|
+
// 1 call, no retries — must short-circuit before the 429 retry branch.
|
|
342
|
+
expect(inner.calls).toBe(1);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
test("does NOT retry ContextOverflowError with default statusCode 400", async () => {
|
|
346
|
+
// Anthropic / OpenAI-compatible providers surface overflow as 400. Same
|
|
347
|
+
// deterministic-failure rule: never retry.
|
|
348
|
+
const error = new ContextOverflowError("prompt is too long", "anthropic");
|
|
349
|
+
const inner = makeFailing(error);
|
|
350
|
+
const provider = new RetryProvider(inner);
|
|
351
|
+
|
|
352
|
+
await expect(provider.sendMessage(MESSAGES)).rejects.toBeInstanceOf(
|
|
353
|
+
ContextOverflowError,
|
|
354
|
+
);
|
|
355
|
+
expect(inner.calls).toBe(1);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("still retries a plain ProviderError with statusCode 429 (non-overflow)", async () => {
|
|
359
|
+
// Rate-limit 429s that are NOT overflow must continue to retry — this is
|
|
360
|
+
// the regression guard for the short-circuit's scope.
|
|
361
|
+
const inner = makeFailing(
|
|
362
|
+
new ProviderError("rate limited", "anthropic", 429),
|
|
363
|
+
);
|
|
364
|
+
const provider = new RetryProvider(inner);
|
|
365
|
+
|
|
366
|
+
await expect(provider.sendMessage(MESSAGES)).rejects.toThrow(
|
|
367
|
+
"rate limited",
|
|
368
|
+
);
|
|
369
|
+
// 1 initial + DEFAULT_MAX_RETRIES retries
|
|
370
|
+
expect(inner.calls).toBe(DEFAULT_MAX_RETRIES + 1);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
|
|
280
374
|
// ---------------------------------------------------------------------------
|
|
281
375
|
// RetryProvider — server error retries
|
|
282
376
|
// ---------------------------------------------------------------------------
|
|
@@ -447,6 +541,41 @@ describe("RetryProvider — network error retries", () => {
|
|
|
447
541
|
);
|
|
448
542
|
expect(inner.calls).toBe(1);
|
|
449
543
|
});
|
|
544
|
+
|
|
545
|
+
test("does NOT retry a ProviderError tagged with abortReason", async () => {
|
|
546
|
+
// Defensive: if any future retryable pattern matches an error carrying
|
|
547
|
+
// a daemon/user-initiated abortReason, the abortReason guard in
|
|
548
|
+
// providers/retry.ts:isRetryableError must still short-circuit it.
|
|
549
|
+
const inner = makeFailing(
|
|
550
|
+
new ProviderError(
|
|
551
|
+
"Anthropic request failed: socket closed unexpectedly",
|
|
552
|
+
"anthropic",
|
|
553
|
+
undefined,
|
|
554
|
+
{ abortReason: { kind: "user_cancel", source: "test" } },
|
|
555
|
+
),
|
|
556
|
+
);
|
|
557
|
+
const provider = new RetryProvider(inner);
|
|
558
|
+
|
|
559
|
+
await expect(provider.sendMessage(MESSAGES)).rejects.toThrow(
|
|
560
|
+
"socket closed",
|
|
561
|
+
);
|
|
562
|
+
expect(inner.calls).toBe(1);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
test("does NOT retry 'Anthropic stream timed out' (inner streamTimeoutMs fired)", async () => {
|
|
566
|
+
const inner = makeFailing(
|
|
567
|
+
new ProviderError(
|
|
568
|
+
"Anthropic API error: Anthropic stream timed out after 1800s (inner streamTimeoutMs)",
|
|
569
|
+
"anthropic",
|
|
570
|
+
),
|
|
571
|
+
);
|
|
572
|
+
const provider = new RetryProvider(inner);
|
|
573
|
+
|
|
574
|
+
await expect(provider.sendMessage(MESSAGES)).rejects.toThrow(
|
|
575
|
+
"stream timed out",
|
|
576
|
+
);
|
|
577
|
+
expect(inner.calls).toBe(1);
|
|
578
|
+
});
|
|
450
579
|
});
|
|
451
580
|
|
|
452
581
|
// ---------------------------------------------------------------------------
|
|
@@ -611,7 +740,7 @@ describe("RetryProvider — streaming response handling", () => {
|
|
|
611
740
|
callCount++;
|
|
612
741
|
if (callCount <= 1) {
|
|
613
742
|
throw new ProviderError(
|
|
614
|
-
'Anthropic API error
|
|
743
|
+
'Anthropic API error: {"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}',
|
|
615
744
|
"anthropic",
|
|
616
745
|
undefined,
|
|
617
746
|
);
|
|
@@ -65,7 +65,7 @@ import {
|
|
|
65
65
|
function makeProvidersConfig(provider: string, model: string): ProvidersConfig {
|
|
66
66
|
return {
|
|
67
67
|
services: {
|
|
68
|
-
inference: { mode: "your-own"
|
|
68
|
+
inference: { mode: "your-own" },
|
|
69
69
|
"image-generation": {
|
|
70
70
|
mode: "your-own",
|
|
71
71
|
provider: "gemini",
|
|
@@ -73,6 +73,7 @@ function makeProvidersConfig(provider: string, model: string): ProvidersConfig {
|
|
|
73
73
|
},
|
|
74
74
|
"web-search": { mode: "your-own", provider: "inference-provider-native" },
|
|
75
75
|
},
|
|
76
|
+
llm: { default: { provider, model } },
|
|
76
77
|
};
|
|
77
78
|
}
|
|
78
79
|
|
|
@@ -90,7 +91,7 @@ const DIRECT_OR_MANAGED_PROVIDER_KEYS: string[] = [
|
|
|
90
91
|
"fireworks",
|
|
91
92
|
"openrouter",
|
|
92
93
|
];
|
|
93
|
-
const MANAGED_FALLBACK_PROVIDERS: string[] = ["anthropic", "gemini"];
|
|
94
|
+
const MANAGED_FALLBACK_PROVIDERS: string[] = ["anthropic", "gemini", "openai"];
|
|
94
95
|
|
|
95
96
|
function enableManagedProxy() {
|
|
96
97
|
mockPlatformBaseUrl = PLATFORM_BASE;
|
|
@@ -172,14 +173,18 @@ describe("managed proxy integration — credential precedence", () => {
|
|
|
172
173
|
},
|
|
173
174
|
);
|
|
174
175
|
|
|
175
|
-
test("managed bootstrap registers anthropic and gemini
|
|
176
|
+
test("managed bootstrap registers anthropic, openai, and gemini", async () => {
|
|
176
177
|
enableManagedProxy();
|
|
177
178
|
mockProviderKeys = {};
|
|
178
179
|
await initializeProviders(makeProvidersConfig("anthropic", "test-model"));
|
|
179
|
-
expect(listProviders()).toEqual(
|
|
180
|
+
expect(listProviders()).toEqual(
|
|
181
|
+
expect.arrayContaining(["anthropic", "openai", "gemini"]),
|
|
182
|
+
);
|
|
183
|
+
expect(listProviders()).toHaveLength(3);
|
|
180
184
|
expect(getProviderRoutingSource("anthropic")).toBe("managed-proxy");
|
|
185
|
+
expect(getProviderRoutingSource("openai")).toBe("managed-proxy");
|
|
181
186
|
expect(getProviderRoutingSource("gemini")).toBe("managed-proxy");
|
|
182
|
-
for (const p of ["
|
|
187
|
+
for (const p of ["fireworks", "openrouter"]) {
|
|
183
188
|
expect(getProviderRoutingSource(p)).toBeUndefined();
|
|
184
189
|
}
|
|
185
190
|
});
|
|
@@ -205,6 +210,23 @@ describe("managed proxy integration — credential precedence", () => {
|
|
|
205
210
|
expect(baseURL).toContain("/v1/runtime-proxy/anthropic");
|
|
206
211
|
});
|
|
207
212
|
|
|
213
|
+
test("managed openai uses openai proxy path", async () => {
|
|
214
|
+
enableManagedProxy();
|
|
215
|
+
mockProviderKeys = {};
|
|
216
|
+
await initializeProviders(makeProvidersConfig("openai", "gpt-4o"));
|
|
217
|
+
|
|
218
|
+
const provider = getProvider("openai");
|
|
219
|
+
|
|
220
|
+
// Unwrap RetryProvider → OpenAIResponsesProvider to inspect the OpenAI
|
|
221
|
+
// SDK client's baseURL.
|
|
222
|
+
const retryInner = (provider as any).inner;
|
|
223
|
+
const openaiClient = (retryInner as any).client;
|
|
224
|
+
|
|
225
|
+
expect(openaiClient).toBeDefined();
|
|
226
|
+
const baseURL: string = openaiClient.baseURL;
|
|
227
|
+
expect(baseURL).toContain("/v1/runtime-proxy/openai");
|
|
228
|
+
});
|
|
229
|
+
|
|
208
230
|
test("managed gemini uses gemini proxy path", async () => {
|
|
209
231
|
enableManagedProxy();
|
|
210
232
|
mockProviderKeys = {};
|
|
@@ -242,16 +264,18 @@ describe("managed proxy integration — credential precedence", () => {
|
|
|
242
264
|
});
|
|
243
265
|
|
|
244
266
|
describe("mixed: some user keys + managed fallback fills gaps", () => {
|
|
245
|
-
test("user key for anthropic routes direct and managed fallback
|
|
267
|
+
test("user key for anthropic routes direct and managed fallback fills openai and gemini", async () => {
|
|
246
268
|
enableManagedProxy();
|
|
247
269
|
setUserKeysFor("anthropic");
|
|
248
270
|
await initializeProviders(makeProvidersConfig("anthropic", "test-model"));
|
|
249
271
|
const registered = listProviders();
|
|
250
272
|
expect(registered).toContain("anthropic");
|
|
251
273
|
expect(getProviderRoutingSource("anthropic")).toBe("user-key");
|
|
274
|
+
expect(registered).toContain("openai");
|
|
275
|
+
expect(getProviderRoutingSource("openai")).toBe("managed-proxy");
|
|
252
276
|
expect(registered).toContain("gemini");
|
|
253
277
|
expect(getProviderRoutingSource("gemini")).toBe("managed-proxy");
|
|
254
|
-
for (const p of ["
|
|
278
|
+
for (const p of ["fireworks", "openrouter"]) {
|
|
255
279
|
expect(registered).not.toContain(p);
|
|
256
280
|
expect(getProviderRoutingSource(p)).toBeUndefined();
|
|
257
281
|
}
|
|
@@ -268,6 +292,7 @@ describe("managed proxy integration — credential precedence", () => {
|
|
|
268
292
|
expect(getProviderRoutingSource("anthropic")).toBe("managed-proxy");
|
|
269
293
|
expect(registered).toContain("gemini");
|
|
270
294
|
expect(getProviderRoutingSource("gemini")).toBe("managed-proxy");
|
|
295
|
+
// OpenAI has a user key so it's user-key, not managed-proxy
|
|
271
296
|
for (const p of ["fireworks", "openrouter"]) {
|
|
272
297
|
expect(registered).not.toContain(p);
|
|
273
298
|
expect(getProviderRoutingSource(p)).toBeUndefined();
|
|
@@ -307,8 +332,8 @@ describe("managed proxy integration — ollama exclusion", () => {
|
|
|
307
332
|
});
|
|
308
333
|
|
|
309
334
|
describe("managed proxy integration — constants integrity", () => {
|
|
310
|
-
test("anthropic and gemini have metadata with managed=true and a proxyPath", () => {
|
|
311
|
-
for (const provider of ["anthropic", "gemini"]) {
|
|
335
|
+
test("anthropic, openai, and gemini have metadata with managed=true and a proxyPath", () => {
|
|
336
|
+
for (const provider of ["anthropic", "openai", "gemini"]) {
|
|
312
337
|
const meta = MANAGED_PROVIDER_META[provider];
|
|
313
338
|
expect(meta).toBeDefined();
|
|
314
339
|
expect(meta.managed).toBe(true);
|
|
@@ -329,8 +354,14 @@ describe("managed proxy integration — constants integrity", () => {
|
|
|
329
354
|
);
|
|
330
355
|
});
|
|
331
356
|
|
|
332
|
-
test("openai
|
|
333
|
-
|
|
357
|
+
test("openai routes through openai proxy path", () => {
|
|
358
|
+
expect(MANAGED_PROVIDER_META.openai.proxyPath).toBe(
|
|
359
|
+
"/v1/runtime-proxy/openai",
|
|
360
|
+
);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
test("fireworks and openrouter are not managed proxy capable", () => {
|
|
364
|
+
for (const provider of ["fireworks", "openrouter"]) {
|
|
334
365
|
expect(MANAGED_PROVIDER_META[provider].managed).toBe(false);
|
|
335
366
|
expect(MANAGED_PROVIDER_META[provider].proxyPath).toBeUndefined();
|
|
336
367
|
}
|
|
@@ -19,8 +19,6 @@ describe("provider registry (ollama)", () => {
|
|
|
19
19
|
services: {
|
|
20
20
|
inference: {
|
|
21
21
|
mode: "your-own",
|
|
22
|
-
provider: "ollama",
|
|
23
|
-
model: "claude-opus-4-6",
|
|
24
22
|
},
|
|
25
23
|
"image-generation": {
|
|
26
24
|
mode: "your-own",
|
|
@@ -32,6 +30,7 @@ describe("provider registry (ollama)", () => {
|
|
|
32
30
|
provider: "inference-provider-native",
|
|
33
31
|
},
|
|
34
32
|
},
|
|
33
|
+
llm: { default: { provider: "ollama", model: "claude-opus-4-6" } },
|
|
35
34
|
});
|
|
36
35
|
|
|
37
36
|
const provider = getProvider("ollama");
|