@vellumai/assistant 0.8.0 → 0.8.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/AGENTS.md +11 -0
- package/Dockerfile +5 -4
- package/README.md +2 -2
- package/docker-entrypoint.sh +16 -0
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/openapi.yaml +4847 -1698
- package/package.json +3 -1
- package/scripts/generate-openapi.ts +52 -4
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +107 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/anthropic-provider.test.ts +92 -2
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +14 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +198 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +42 -16
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-window-manager.test.ts +389 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +38 -0
- package/src/__tests__/conversation-fork-crud.test.ts +241 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +124 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +21 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +4 -4
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/external-plugin-loader.test.ts +458 -0
- package/src/__tests__/filing-service.test.ts +23 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -8
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/history-repair.test.ts +89 -0
- package/src/__tests__/host-app-control-proxy.test.ts +109 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +154 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +2 -2
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +15 -0
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +146 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/managed-profile-guard.test.ts +131 -2
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +711 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/plugin-bootstrap.test.ts +31 -2
- package/src/__tests__/plugin-route-contribution.test.ts +31 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
- package/src/__tests__/plugin-types.test.ts +13 -11
- package/src/__tests__/process-message-background-slack.test.ts +46 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +104 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skill-load-tool.test.ts +2 -4
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +145 -0
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +23 -4
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +1 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +593 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +414 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +346 -436
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +33 -7
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/program.ts +2 -4
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-tool-registry.ts +0 -2
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +76 -14
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/llm-request-logs.ts +57 -0
- package/src/config/schemas/llm.ts +52 -2
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/window-manager.ts +191 -5
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +79 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +23 -29
- package/src/daemon/config-watcher.ts +2 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +127 -97
- package/src/daemon/conversation-error.ts +21 -0
- package/src/daemon/conversation-lifecycle.ts +46 -5
- package/src/daemon/conversation-process.ts +36 -19
- package/src/daemon/conversation-runtime-assembly.ts +14 -5
- package/src/daemon/conversation-slash.ts +175 -23
- package/src/daemon/conversation-store.ts +17 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +24 -14
- package/src/daemon/conversation.ts +48 -9
- package/src/daemon/external-plugins-bootstrap.ts +18 -8
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +8 -126
- package/src/daemon/handlers/config-slack-channel.ts +10 -7
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/skills.ts +84 -5
- package/src/daemon/history-repair.ts +33 -6
- package/src/daemon/host-app-control-proxy.ts +44 -19
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +42 -43
- package/src/daemon/meet-host-supervisor.ts +15 -15
- package/src/daemon/memory-v2-startup.ts +9 -2
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +12 -9
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/sync.ts +60 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/process-message.ts +56 -23
- package/src/daemon/server.ts +23 -18
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +40 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +148 -127
- package/src/home/__tests__/feed-types.test.ts +63 -131
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +19 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +1 -3
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/bookmark-crud.ts +179 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +18 -6
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +13 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +312 -10
- package/src/memory/conversation-queries.ts +9 -5
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +2 -1
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +76 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +44 -5
- package/src/memory/indexer.ts +17 -0
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +13 -15
- package/src/memory/jobs/embed-concept-page.ts +45 -9
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +52 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +97 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +38 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +29 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -4
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +628 -10
- package/src/memory/v2/__tests__/migration.test.ts +7 -3
- package/src/memory/v2/__tests__/page-index.test.ts +277 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +72 -0
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +516 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +440 -109
- package/src/memory/v2/migration.ts +117 -20
- package/src/memory/v2/page-index.ts +191 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +192 -0
- package/src/memory/v2/qdrant.ts +100 -87
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +322 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +118 -29
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +2 -2
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +28 -1
- package/src/notifications/home-feed-side-effect.ts +111 -0
- package/src/notifications/signal.ts +5 -0
- package/src/permissions/checker.ts +12 -0
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/plugin-api/index.ts +13 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +62 -0
- package/src/plugins/defaults/injectors.ts +19 -3
- package/src/plugins/external-plugin-loader.ts +294 -0
- package/src/plugins/types.ts +46 -30
- package/src/plugins/user-loader.ts +64 -41
- package/src/proactive-artifact/job.test.ts +12 -4
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +105 -0
- package/src/prompts/system-prompt.ts +22 -1
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +288 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +95 -26
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +163 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +173 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +356 -0
- package/src/providers/inference/resolve-auth.ts +65 -0
- package/src/providers/model-catalog.ts +104 -6
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +143 -159
- package/src/providers/retry.ts +18 -10
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +35 -6
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +303 -8
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +1 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +2 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/acp-routes.ts +10 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +154 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +192 -0
- package/src/runtime/routes/conversation-management-routes.ts +30 -43
- package/src/runtime/routes/conversation-query-routes.ts +334 -86
- package/src/runtime/routes/conversation-routes.ts +31 -10
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +36 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/twilio.ts +1 -0
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +2 -0
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/schedule-routes.ts +82 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/tts-routes.ts +67 -0
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/scheduler.ts +200 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/secret-patterns.ts +3 -0
- package/src/sequence/engine.ts +38 -40
- package/src/subagent/manager.ts +20 -15
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +15 -4
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +13 -5
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/terminal/shell.ts +44 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +301 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +90 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/registry.ts +22 -0
- package/src/workspace/migrations/runner.ts +13 -2
- package/src/workspace/migrations/types.ts +13 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { describe, expect, test } from "bun:test";
|
|
3
|
+
|
|
4
|
+
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
5
|
+
|
|
6
|
+
import { migrateCreateProviderConnections } from "../../../memory/migrations/243-provider-connections.js";
|
|
7
|
+
import { migrateProviderConnectionStatusLabel } from "../../../memory/migrations/244-provider-connection-status-label.js";
|
|
8
|
+
import * as schema from "../../../memory/schema.js";
|
|
9
|
+
import {
|
|
10
|
+
createConnection,
|
|
11
|
+
disableManagedConnectionsForByokHatch,
|
|
12
|
+
getConnection,
|
|
13
|
+
listConnections,
|
|
14
|
+
seedCanonicalConnections,
|
|
15
|
+
updateConnection,
|
|
16
|
+
} from "../connections.js";
|
|
17
|
+
|
|
18
|
+
function createTestDb() {
|
|
19
|
+
const sqlite = new Database(":memory:");
|
|
20
|
+
sqlite.exec("PRAGMA journal_mode=WAL");
|
|
21
|
+
return drizzle(sqlite, { schema });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function bootDb() {
|
|
25
|
+
const db = createTestDb();
|
|
26
|
+
migrateCreateProviderConnections(db);
|
|
27
|
+
migrateProviderConnectionStatusLabel(db);
|
|
28
|
+
return db;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe("connection CRUD status + label defaults", () => {
|
|
32
|
+
test("new connection without status/label gets status=active and label=null", () => {
|
|
33
|
+
const db = bootDb();
|
|
34
|
+
const result = createConnection(db, {
|
|
35
|
+
name: "my-conn",
|
|
36
|
+
provider: "anthropic",
|
|
37
|
+
auth: { type: "platform" },
|
|
38
|
+
});
|
|
39
|
+
expect(result.ok).toBe(true);
|
|
40
|
+
if (result.ok) {
|
|
41
|
+
expect(result.connection.status).toBe("active");
|
|
42
|
+
expect(result.connection.label).toBeNull();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("createConnection passes explicit status and label", () => {
|
|
47
|
+
const db = bootDb();
|
|
48
|
+
const result = createConnection(db, {
|
|
49
|
+
name: "disabled-conn",
|
|
50
|
+
provider: "openai",
|
|
51
|
+
auth: { type: "platform" },
|
|
52
|
+
status: "disabled",
|
|
53
|
+
label: "My OpenAI",
|
|
54
|
+
});
|
|
55
|
+
expect(result.ok).toBe(true);
|
|
56
|
+
if (result.ok) {
|
|
57
|
+
expect(result.connection.status).toBe("disabled");
|
|
58
|
+
expect(result.connection.label).toBe("My OpenAI");
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("getConnection returns status and label from DB", () => {
|
|
63
|
+
const db = bootDb();
|
|
64
|
+
createConnection(db, {
|
|
65
|
+
name: "get-me",
|
|
66
|
+
provider: "gemini",
|
|
67
|
+
auth: { type: "platform" },
|
|
68
|
+
status: "disabled",
|
|
69
|
+
label: "Gemini Pro",
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const conn = getConnection(db, "get-me");
|
|
73
|
+
expect(conn).not.toBeNull();
|
|
74
|
+
expect(conn!.status).toBe("disabled");
|
|
75
|
+
expect(conn!.label).toBe("Gemini Pro");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("updateConnection updates status", () => {
|
|
79
|
+
const db = bootDb();
|
|
80
|
+
createConnection(db, {
|
|
81
|
+
name: "toggle-me",
|
|
82
|
+
provider: "anthropic",
|
|
83
|
+
auth: { type: "platform" },
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const result = updateConnection(db, "toggle-me", {
|
|
87
|
+
auth: { type: "platform" },
|
|
88
|
+
status: "disabled",
|
|
89
|
+
});
|
|
90
|
+
expect(result.ok).toBe(true);
|
|
91
|
+
if (result.ok) {
|
|
92
|
+
expect(result.connection.status).toBe("disabled");
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("updateConnection clears label when set to null", () => {
|
|
97
|
+
const db = bootDb();
|
|
98
|
+
createConnection(db, {
|
|
99
|
+
name: "clear-label",
|
|
100
|
+
provider: "openai",
|
|
101
|
+
auth: { type: "platform" },
|
|
102
|
+
label: "Old Label",
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const result = updateConnection(db, "clear-label", {
|
|
106
|
+
auth: { type: "platform" },
|
|
107
|
+
label: null,
|
|
108
|
+
});
|
|
109
|
+
expect(result.ok).toBe(true);
|
|
110
|
+
if (result.ok) {
|
|
111
|
+
expect(result.connection.label).toBeNull();
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
describe("seedCanonicalConnections labels", () => {
|
|
117
|
+
test("first boot seeds default labels on all three managed connections", () => {
|
|
118
|
+
const db = bootDb();
|
|
119
|
+
seedCanonicalConnections(db);
|
|
120
|
+
|
|
121
|
+
const conns = listConnections(db);
|
|
122
|
+
const byName = Object.fromEntries(conns.map((c) => [c.name, c]));
|
|
123
|
+
|
|
124
|
+
expect(byName["anthropic-managed"]?.label).toBe("Anthropic");
|
|
125
|
+
expect(byName["openai-managed"]?.label).toBe("OpenAI");
|
|
126
|
+
expect(byName["gemini-managed"]?.label).toBe("Google Gemini");
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test("second boot preserves user-customized label", () => {
|
|
130
|
+
const db = bootDb();
|
|
131
|
+
seedCanonicalConnections(db);
|
|
132
|
+
|
|
133
|
+
// User customizes the label.
|
|
134
|
+
updateConnection(db, "anthropic-managed", {
|
|
135
|
+
auth: { type: "platform" },
|
|
136
|
+
label: "Work Anthropic",
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Reboot.
|
|
140
|
+
seedCanonicalConnections(db);
|
|
141
|
+
|
|
142
|
+
const conn = getConnection(db, "anthropic-managed");
|
|
143
|
+
expect(conn?.label).toBe("Work Anthropic");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("second boot backfills default label when existing row has null label", () => {
|
|
147
|
+
const db = bootDb();
|
|
148
|
+
|
|
149
|
+
// `bootDb()` runs migration 243 which already inserted the three
|
|
150
|
+
// canonical rows with `label=null` (the label column was added by 244
|
|
151
|
+
// and defaults NULL for pre-existing rows). This matches the state
|
|
152
|
+
// every pre-label install carries forward into the boot that ships
|
|
153
|
+
// the label seed.
|
|
154
|
+
const before = getConnection(db, "anthropic-managed");
|
|
155
|
+
expect(before?.label).toBeNull();
|
|
156
|
+
|
|
157
|
+
seedCanonicalConnections(db);
|
|
158
|
+
|
|
159
|
+
const after = getConnection(db, "anthropic-managed");
|
|
160
|
+
expect(after?.label).toBe("Anthropic");
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("backfill leaves explicit empty-overwrite null untouched on subsequent boot", () => {
|
|
164
|
+
const db = bootDb();
|
|
165
|
+
seedCanonicalConnections(db);
|
|
166
|
+
|
|
167
|
+
// User clears the label (PATCH label: null).
|
|
168
|
+
updateConnection(db, "openai-managed", {
|
|
169
|
+
auth: { type: "platform" },
|
|
170
|
+
label: null,
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Subsequent boots refill it — there's no distinction between "user
|
|
174
|
+
// explicitly cleared" and "pre-seed row that never had one". Treating
|
|
175
|
+
// both as "fill with default" is intentional; users who want a blank
|
|
176
|
+
// label aren't a real cohort and we'd rather guarantee the default is
|
|
177
|
+
// present for everyone.
|
|
178
|
+
seedCanonicalConnections(db);
|
|
179
|
+
|
|
180
|
+
const conn = getConnection(db, "openai-managed");
|
|
181
|
+
expect(conn?.label).toBe("OpenAI");
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe("disableManagedConnectionsForByokHatch", () => {
|
|
186
|
+
test("flips all three canonical managed connections to status='disabled'", () => {
|
|
187
|
+
const db = bootDb();
|
|
188
|
+
seedCanonicalConnections(db);
|
|
189
|
+
|
|
190
|
+
// Sanity: seeded rows default to active.
|
|
191
|
+
expect(getConnection(db, "anthropic-managed")?.status).toBe("active");
|
|
192
|
+
expect(getConnection(db, "openai-managed")?.status).toBe("active");
|
|
193
|
+
expect(getConnection(db, "gemini-managed")?.status).toBe("active");
|
|
194
|
+
|
|
195
|
+
disableManagedConnectionsForByokHatch(db);
|
|
196
|
+
|
|
197
|
+
expect(getConnection(db, "anthropic-managed")?.status).toBe("disabled");
|
|
198
|
+
expect(getConnection(db, "openai-managed")?.status).toBe("disabled");
|
|
199
|
+
expect(getConnection(db, "gemini-managed")?.status).toBe("disabled");
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test("subsequent seedCanonicalConnections call does NOT re-flip a user-re-enabled connection", () => {
|
|
203
|
+
// Models the post-hatch lifecycle: at hatch we disable; the user
|
|
204
|
+
// later flips one back to active (e.g. after Vellum login). Every
|
|
205
|
+
// subsequent daemon boot runs seedCanonicalConnections — and that
|
|
206
|
+
// boot must NOT revert the user's choice. The hatch-disable helper
|
|
207
|
+
// is only ever called from the seedInferenceProfiles hatch branch,
|
|
208
|
+
// so it does not run on a non-hatch boot; this test confirms the
|
|
209
|
+
// ambient seed pass leaves status alone.
|
|
210
|
+
const db = bootDb();
|
|
211
|
+
seedCanonicalConnections(db);
|
|
212
|
+
disableManagedConnectionsForByokHatch(db);
|
|
213
|
+
|
|
214
|
+
// User re-enables anthropic post-hatch.
|
|
215
|
+
updateConnection(db, "anthropic-managed", {
|
|
216
|
+
auth: { type: "platform" },
|
|
217
|
+
status: "active",
|
|
218
|
+
});
|
|
219
|
+
expect(getConnection(db, "anthropic-managed")?.status).toBe("active");
|
|
220
|
+
|
|
221
|
+
// Simulate a normal restart: seedCanonicalConnections runs every boot,
|
|
222
|
+
// disableManagedConnectionsForByokHatch does NOT.
|
|
223
|
+
seedCanonicalConnections(db);
|
|
224
|
+
|
|
225
|
+
expect(getConnection(db, "anthropic-managed")?.status).toBe("active");
|
|
226
|
+
// The two the user didn't touch stay disabled.
|
|
227
|
+
expect(getConnection(db, "openai-managed")?.status).toBe("disabled");
|
|
228
|
+
expect(getConnection(db, "gemini-managed")?.status).toBe("disabled");
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("idempotent re-hatch leaves all three at disabled", () => {
|
|
232
|
+
// Workspace reset / re-hatch scenario: helper runs again and any
|
|
233
|
+
// user re-enable from before the reset is intentionally undone —
|
|
234
|
+
// re-hatch means re-onboard.
|
|
235
|
+
const db = bootDb();
|
|
236
|
+
seedCanonicalConnections(db);
|
|
237
|
+
disableManagedConnectionsForByokHatch(db);
|
|
238
|
+
|
|
239
|
+
updateConnection(db, "anthropic-managed", {
|
|
240
|
+
auth: { type: "platform" },
|
|
241
|
+
status: "active",
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
disableManagedConnectionsForByokHatch(db);
|
|
245
|
+
|
|
246
|
+
expect(getConnection(db, "anthropic-managed")?.status).toBe("disabled");
|
|
247
|
+
expect(getConnection(db, "openai-managed")?.status).toBe("disabled");
|
|
248
|
+
expect(getConnection(db, "gemini-managed")?.status).toBe("disabled");
|
|
249
|
+
});
|
|
250
|
+
});
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider adapter construction.
|
|
3
|
+
*
|
|
4
|
+
* One catalog-keyed factory table feeds two construction paths:
|
|
5
|
+
*
|
|
6
|
+
* - `buildProviderAdapter` returns a raw `Provider` instance for a given
|
|
7
|
+
* provider id + options. The caller wraps with `RetryProvider` /
|
|
8
|
+
* `UsageTrackingProvider` to match the boot-time vs per-connection
|
|
9
|
+
* wrapping conventions in `registry.ts`.
|
|
10
|
+
* - `createAdapterFromConnection` is the per-call dispatcher entry point.
|
|
11
|
+
* It resolves a `ResolvedAuth` into `AdapterCreateOpts`, validates
|
|
12
|
+
* keyless/keyed compatibility, and returns a fully-wrapped
|
|
13
|
+
* `Provider | null`.
|
|
14
|
+
*
|
|
15
|
+
* Adding a new provider:
|
|
16
|
+
* 1. Add an entry to `PROVIDER_CATALOG` in `model-catalog.ts`.
|
|
17
|
+
* 2. Implement the client in `src/providers/<id>/client.ts`.
|
|
18
|
+
* 3. Register the client in `ADAPTER_FACTORIES` below.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { AnthropicProvider } from "../anthropic/client.js";
|
|
22
|
+
import { FireworksProvider } from "../fireworks/client.js";
|
|
23
|
+
import { GeminiProvider } from "../gemini/client.js";
|
|
24
|
+
import { PROVIDER_CATALOG } from "../model-catalog.js";
|
|
25
|
+
import { OllamaProvider } from "../ollama/client.js";
|
|
26
|
+
import { OpenAIResponsesProvider } from "../openai/responses-provider.js";
|
|
27
|
+
import { OpenRouterProvider } from "../openrouter/client.js";
|
|
28
|
+
import { RetryProvider } from "../retry.js";
|
|
29
|
+
import type { Provider } from "../types.js";
|
|
30
|
+
import { UsageTrackingProvider } from "../usage-tracking.js";
|
|
31
|
+
import type { ResolvedAuth } from "./auth.js";
|
|
32
|
+
import type { ProviderConnection } from "./auth.js";
|
|
33
|
+
|
|
34
|
+
/** Unified construction opts. Adapters ignore fields they don't consume. */
|
|
35
|
+
export interface AdapterCreateOpts {
|
|
36
|
+
apiKey: string;
|
|
37
|
+
model: string;
|
|
38
|
+
streamTimeoutMs: number;
|
|
39
|
+
/** Set when an explicit base URL override or managed proxy is in play. */
|
|
40
|
+
baseURL?: string;
|
|
41
|
+
/** Forwarded to providers that wire native provider-side web search. */
|
|
42
|
+
useNativeWebSearch: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type AdapterFactory = (opts: AdapterCreateOpts) => Provider;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Catalog-keyed factory table. Each entry takes a unified
|
|
49
|
+
* `AdapterCreateOpts` and constructs the underlying provider client. The
|
|
50
|
+
* `id` field must match the corresponding `ProviderCatalogEntry.id` in
|
|
51
|
+
* `PROVIDER_CATALOG` — `PROVIDER_CATALOG_FACTORY_PARITY` enforces this at
|
|
52
|
+
* module-load time.
|
|
53
|
+
*/
|
|
54
|
+
const ADAPTER_FACTORIES: Record<string, AdapterFactory> = {
|
|
55
|
+
anthropic: ({ apiKey, model, streamTimeoutMs, baseURL, useNativeWebSearch }) =>
|
|
56
|
+
new AnthropicProvider(apiKey, model, {
|
|
57
|
+
useNativeWebSearch,
|
|
58
|
+
streamTimeoutMs,
|
|
59
|
+
...(baseURL ? { baseURL } : {}),
|
|
60
|
+
}),
|
|
61
|
+
openai: ({ apiKey, model, streamTimeoutMs, baseURL, useNativeWebSearch }) =>
|
|
62
|
+
new OpenAIResponsesProvider(apiKey, model, {
|
|
63
|
+
useNativeWebSearch,
|
|
64
|
+
streamTimeoutMs,
|
|
65
|
+
...(baseURL ? { baseURL } : {}),
|
|
66
|
+
}),
|
|
67
|
+
gemini: ({ apiKey, model, streamTimeoutMs, baseURL }) =>
|
|
68
|
+
new GeminiProvider(apiKey, model, {
|
|
69
|
+
streamTimeoutMs,
|
|
70
|
+
// Gemini routes managed proxies through `managedBaseUrl`, not `baseURL`.
|
|
71
|
+
...(baseURL ? { managedBaseUrl: baseURL } : {}),
|
|
72
|
+
}),
|
|
73
|
+
ollama: ({ apiKey, model, streamTimeoutMs }) =>
|
|
74
|
+
new OllamaProvider(model, {
|
|
75
|
+
// Empty string means keyless — Ollama's client treats undefined as
|
|
76
|
+
// "no key provided" and defaults its internal placeholder.
|
|
77
|
+
apiKey: apiKey || undefined,
|
|
78
|
+
streamTimeoutMs,
|
|
79
|
+
}),
|
|
80
|
+
fireworks: ({ apiKey, model, streamTimeoutMs }) =>
|
|
81
|
+
new FireworksProvider(apiKey, model, { streamTimeoutMs }),
|
|
82
|
+
openrouter: ({ apiKey, model, streamTimeoutMs, useNativeWebSearch }) =>
|
|
83
|
+
new OpenRouterProvider(apiKey, model, {
|
|
84
|
+
useNativeWebSearch,
|
|
85
|
+
streamTimeoutMs,
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Module-load parity guard. Surfaces a clear startup error if someone adds
|
|
91
|
+
* a catalog entry without a matching factory (or vice versa).
|
|
92
|
+
*/
|
|
93
|
+
const PROVIDER_CATALOG_FACTORY_PARITY = (() => {
|
|
94
|
+
const catalogIds = new Set(PROVIDER_CATALOG.map((entry) => entry.id));
|
|
95
|
+
const factoryIds = new Set(Object.keys(ADAPTER_FACTORIES));
|
|
96
|
+
const missingFactories = [...catalogIds].filter((id) => !factoryIds.has(id));
|
|
97
|
+
const orphanFactories = [...factoryIds].filter((id) => !catalogIds.has(id));
|
|
98
|
+
if (missingFactories.length > 0 || orphanFactories.length > 0) {
|
|
99
|
+
const parts: string[] = [];
|
|
100
|
+
if (missingFactories.length > 0) {
|
|
101
|
+
parts.push(`missing adapter factories: ${missingFactories.join(", ")}`);
|
|
102
|
+
}
|
|
103
|
+
if (orphanFactories.length > 0) {
|
|
104
|
+
parts.push(`orphan adapter factories: ${orphanFactories.join(", ")}`);
|
|
105
|
+
}
|
|
106
|
+
throw new Error(
|
|
107
|
+
`PROVIDER_CATALOG / ADAPTER_FACTORIES drift: ${parts.join("; ")}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
})();
|
|
112
|
+
|
|
113
|
+
// Reference the parity guard so unused-variable lint doesn't strip it.
|
|
114
|
+
void PROVIDER_CATALOG_FACTORY_PARITY;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Build a raw `Provider` instance from a provider id and unified opts.
|
|
118
|
+
*
|
|
119
|
+
* Returns null when no factory exists for the given provider id. The
|
|
120
|
+
* caller is responsible for wrapping (RetryProvider, UsageTrackingProvider).
|
|
121
|
+
*/
|
|
122
|
+
export function buildProviderAdapter(
|
|
123
|
+
providerId: string,
|
|
124
|
+
opts: AdapterCreateOpts,
|
|
125
|
+
): Provider | null {
|
|
126
|
+
const factory = ADAPTER_FACTORIES[providerId];
|
|
127
|
+
if (!factory) return null;
|
|
128
|
+
return factory(opts);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Build a Provider instance for a given connection + resolved auth.
|
|
133
|
+
*
|
|
134
|
+
* Returns null when the provider/auth combination is not usable
|
|
135
|
+
* (e.g. `none` auth on a keyed provider). The caller decides whether to
|
|
136
|
+
* log a warning or fall back to the global registry.
|
|
137
|
+
*/
|
|
138
|
+
export function createAdapterFromConnection(
|
|
139
|
+
connection: ProviderConnection,
|
|
140
|
+
resolvedAuth: ResolvedAuth,
|
|
141
|
+
opts: { model: string; streamTimeoutMs?: number; useNativeWebSearch?: boolean },
|
|
142
|
+
): Provider | null {
|
|
143
|
+
const { provider } = connection;
|
|
144
|
+
const entry = PROVIDER_CATALOG.find((e) => e.id === provider);
|
|
145
|
+
if (!entry) return null;
|
|
146
|
+
const isKeyless = entry.setupMode === "keyless";
|
|
147
|
+
|
|
148
|
+
// Keyed providers can't operate without a credential.
|
|
149
|
+
if (!isKeyless && resolvedAuth.kind === "none") return null;
|
|
150
|
+
|
|
151
|
+
const apiKey =
|
|
152
|
+
resolvedAuth.kind === "header"
|
|
153
|
+
? (resolvedAuth.headers["Authorization"] ?? "").replace(/^Bearer /, "")
|
|
154
|
+
: "";
|
|
155
|
+
const baseURL =
|
|
156
|
+
resolvedAuth.kind === "header" ? resolvedAuth.baseUrl : undefined;
|
|
157
|
+
|
|
158
|
+
const adapter = buildProviderAdapter(provider, {
|
|
159
|
+
apiKey,
|
|
160
|
+
model: opts.model,
|
|
161
|
+
streamTimeoutMs: opts.streamTimeoutMs ?? 1_800_000,
|
|
162
|
+
baseURL,
|
|
163
|
+
useNativeWebSearch: opts.useNativeWebSearch ?? false,
|
|
164
|
+
});
|
|
165
|
+
if (!adapter) return null;
|
|
166
|
+
|
|
167
|
+
const isProxy = baseURL !== undefined;
|
|
168
|
+
return new UsageTrackingProvider(
|
|
169
|
+
new RetryProvider(adapter, {
|
|
170
|
+
forwardUsageAttributionHeaders: isProxy,
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
173
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { PROVIDER_CATALOG } from "../model-catalog.js";
|
|
4
|
+
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Auth discriminated union (stored in provider_connections.auth as JSON)
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Auth configuration stored in the `provider_connections` table.
|
|
11
|
+
*
|
|
12
|
+
* v1 runtime-supported variants:
|
|
13
|
+
* - api_key: look up `credential` in vault, inject as bearer/provider header.
|
|
14
|
+
* - platform: route via Vellum managed proxy; no client-side credential.
|
|
15
|
+
* - none: no auth (e.g. Ollama running locally).
|
|
16
|
+
*
|
|
17
|
+
* v2 schema-accepted variants (runtime rejects with a clear "not yet shipped" error):
|
|
18
|
+
* - oauth_subscription: OAuth-based subscription auth.
|
|
19
|
+
* - service_account: service-account credentials (Vertex AI, Bedrock).
|
|
20
|
+
*/
|
|
21
|
+
export const AuthSchema = z.discriminatedUnion("type", [
|
|
22
|
+
z.object({
|
|
23
|
+
type: z.literal("api_key"),
|
|
24
|
+
credential: z.string().min(1),
|
|
25
|
+
}),
|
|
26
|
+
z.object({
|
|
27
|
+
type: z.literal("platform"),
|
|
28
|
+
}),
|
|
29
|
+
z.object({
|
|
30
|
+
type: z.literal("none"),
|
|
31
|
+
}),
|
|
32
|
+
z.object({
|
|
33
|
+
type: z.literal("oauth_subscription"),
|
|
34
|
+
credential: z.string().min(1),
|
|
35
|
+
}),
|
|
36
|
+
z.object({
|
|
37
|
+
type: z.literal("service_account"),
|
|
38
|
+
credential: z.string().min(1),
|
|
39
|
+
}),
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
export type Auth = z.infer<typeof AuthSchema>;
|
|
43
|
+
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// ResolvedAuth — what the dispatcher hands to each adapter
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The resolved form of an Auth, produced by the dispatcher before calling
|
|
50
|
+
* an adapter. Adapters are pure functions of (ResolvedAuth, request) → response
|
|
51
|
+
* and never access the vault themselves.
|
|
52
|
+
*/
|
|
53
|
+
export type ResolvedAuth =
|
|
54
|
+
| { kind: "header"; headers: Record<string, string>; baseUrl?: string }
|
|
55
|
+
| { kind: "runtime_proxy"; route: string }
|
|
56
|
+
| { kind: "none" };
|
|
57
|
+
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Valid provider identifiers — derived from PROVIDER_CATALOG
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
//
|
|
62
|
+
// PROVIDER_CATALOG (in `model-catalog.ts`) is the single source of truth for
|
|
63
|
+
// the closed set of inference-provider identifiers. The list below is
|
|
64
|
+
// derived at module load; adding a provider to the catalog automatically
|
|
65
|
+
// extends `VALID_CONNECTION_PROVIDERS` and `ConnectionProviderSchema`.
|
|
66
|
+
//
|
|
67
|
+
// Trade-off: because `PROVIDER_CATALOG` is a runtime value, the
|
|
68
|
+
// `ConnectionProvider` static type is `string` rather than a narrow
|
|
69
|
+
// literal-string union. Callers that need a narrowed value should parse
|
|
70
|
+
// through `ConnectionProviderSchema`, which still rejects unknown
|
|
71
|
+
// providers at runtime.
|
|
72
|
+
|
|
73
|
+
export const VALID_CONNECTION_PROVIDERS: readonly string[] =
|
|
74
|
+
PROVIDER_CATALOG.map((p) => p.id);
|
|
75
|
+
|
|
76
|
+
export type ConnectionProvider = string;
|
|
77
|
+
|
|
78
|
+
export const ConnectionProviderSchema = z.enum(
|
|
79
|
+
VALID_CONNECTION_PROVIDERS as readonly [string, ...string[]],
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Connection status
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
export const ConnectionStatusSchema = z.enum(["active", "disabled"]);
|
|
87
|
+
export type ConnectionStatus = z.infer<typeof ConnectionStatusSchema>;
|
|
88
|
+
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// Full connection shape used by CRUD layer
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
|
|
93
|
+
export const ProviderConnectionSchema = z.object({
|
|
94
|
+
name: z.string().min(1),
|
|
95
|
+
provider: ConnectionProviderSchema,
|
|
96
|
+
auth: AuthSchema,
|
|
97
|
+
status: ConnectionStatusSchema,
|
|
98
|
+
label: z.string().min(1).nullable(),
|
|
99
|
+
createdAt: z.number().int(),
|
|
100
|
+
updatedAt: z.number().int(),
|
|
101
|
+
/**
|
|
102
|
+
* Whether this row is a Vellum-managed connection (`anthropic-managed`,
|
|
103
|
+
* `openai-managed`, `gemini-managed`). Derived from
|
|
104
|
+
* `MANAGED_CONNECTION_NAMES` in `connections.ts` at serialize time; the
|
|
105
|
+
* DB column does not exist. Clients use this to render the read-only
|
|
106
|
+
* "Vellum" badge + view-only editor and to disable the delete affordance
|
|
107
|
+
* without mirroring the canonical name list locally.
|
|
108
|
+
*/
|
|
109
|
+
isManaged: z.boolean(),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export type ProviderConnection = z.infer<typeof ProviderConnectionSchema>;
|