@vellumai/assistant 0.7.3 → 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/ARCHITECTURE.md +29 -28
- package/Dockerfile +6 -4
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +236 -9
- package/bun.lock +3 -0
- 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 +3 -1
- package/node_modules/@vellumai/ipc-server-utils/bun.lock +24 -0
- package/node_modules/@vellumai/ipc-server-utils/package.json +18 -0
- package/node_modules/@vellumai/ipc-server-utils/src/index.ts +6 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +430 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +221 -0
- package/node_modules/@vellumai/ipc-server-utils/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/openapi.yaml +4126 -959
- package/package.json +5 -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__/annotate-risk-options.test.ts +291 -0
- package/src/__tests__/anthropic-provider.test.ts +92 -2
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/approval-cascade.test.ts +8 -16
- package/src/__tests__/approval-routes-http.test.ts +6 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +12 -25
- 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-constants.test.ts +10 -1
- package/src/__tests__/call-controller.test.ts +127 -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 +88 -30
- 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 +345 -8
- 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-source.test.ts +3 -26
- 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-abort-tool-results.test.ts +1 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +3 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +5 -13
- 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 +2 -1
- 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 +22 -7
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -6
- package/src/__tests__/conversation-runtime-assembly.test.ts +19 -10
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +170 -9
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +73 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +59 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -7
- 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 +25 -22
- 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 +10 -34
- 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__/injector-chain.test.ts +24 -16
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +10 -7
- 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 +169 -67
- 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-decision-fallback.test.ts +91 -0
- package/src/__tests__/notification-decision-strategy.test.ts +22 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -1888
- 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 +164 -2
- 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-prompt-log-hygiene.test.ts +7 -5
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +7 -5
- package/src/__tests__/secret-response-routing.test.ts +7 -5
- package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
- package/src/__tests__/server-history-render.test.ts +82 -0
- 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-include-graph.test.ts +31 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skill-load-tool.test.ts +42 -16
- package/src/__tests__/skills.test.ts +39 -0
- 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__/tool-execution-pipeline.benchmark.test.ts +0 -42
- package/src/__tests__/tool-executor.test.ts +155 -0
- 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__/voice-session-bridge.test.ts +3 -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 +153 -0
- package/src/__tests__/workspace-migration-071-remove-safe-storage-release-note.test.ts +206 -0
- 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-safe-storage-limits-release.test.ts +15 -27
- 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/agent/loop.ts +11 -0
- package/src/approvals/guardian-decision-primitive.ts +0 -13
- package/src/approvals/guardian-request-resolvers.ts +19 -102
- package/src/calls/call-constants.ts +5 -8
- package/src/calls/call-controller.ts +130 -67
- package/src/calls/relay-server.ts +42 -1
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +24 -5
- 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 +163 -517
- package/src/cli/commands/notifications.ts +33 -7
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +182 -345
- 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-builder/SKILL.md +1 -3
- 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 +17 -17
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +148 -33
- 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 +33 -2
- 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 +111 -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 +56 -0
- package/src/daemon/conversation-agent-loop.ts +140 -107
- package/src/daemon/conversation-error.ts +21 -0
- package/src/daemon/conversation-lifecycle.ts +68 -13
- 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 +92 -26
- package/src/daemon/conversation-tool-setup.ts +33 -19
- package/src/daemon/conversation.ts +49 -10
- 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/shared.ts +26 -0
- 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 +97 -36
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/host-file-proxy.ts +1 -1
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/host-transfer-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +128 -114
- package/src/daemon/meet-host-supervisor.ts +15 -15
- package/src/daemon/memory-v2-startup.ts +62 -14
- 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 +28 -2
- 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/documents/document-store.ts +35 -1
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +42 -56
- 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 +149 -128
- 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 +148 -42
- 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/ipc/skill-server.ts +99 -42
- 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__/jobs-worker-v2-schedule.test.ts +10 -57
- 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 +40 -31
- package/src/memory/context-search/sources/memory.ts +9 -2
- 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__/conversation-graph-memory-v2-routing.test.ts +104 -61
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +11 -26
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +108 -14
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/graph-search.test.ts +6 -5
- package/src/memory/graph/graph-search.ts +3 -4
- package/src/memory/graph/retriever.test.ts +12 -7
- package/src/memory/graph/retriever.ts +4 -5
- package/src/memory/graph/tool-handlers.ts +20 -11
- package/src/memory/graph/tools.ts +48 -9
- package/src/memory/indexer.ts +18 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +120 -6
- package/src/memory/jobs/embed-concept-page.ts +261 -89
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +60 -7
- 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/pkb/pkb-search.test.ts +6 -5
- package/src/memory/pkb/pkb-search.ts +4 -5
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/qdrant-client.ts +3 -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 +5 -9
- 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 +46 -9
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +140 -163
- 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 +768 -33
- 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 +382 -9
- 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 +163 -8
- package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
- package/src/memory/v2/__tests__/static-context.test.ts +8 -35
- package/src/memory/v2/__tests__/sweep-job.test.ts +114 -33
- 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 +92 -86
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -115
- package/src/memory/v2/migration.ts +117 -20
- package/src/memory/v2/page-index.ts +191 -0
- package/src/memory/v2/page-store.ts +42 -0
- package/src/memory/v2/prompts/consolidation.ts +14 -7
- package/src/memory/v2/prompts/router.ts +192 -0
- package/src/memory/v2/qdrant.ts +307 -133
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +322 -0
- package/src/memory/v2/sim.ts +88 -34
- package/src/memory/v2/skill-store.ts +118 -29
- package/src/memory/v2/static-context.ts +20 -17
- package/src/memory/v2/sweep-job.ts +127 -102
- package/src/memory/v2/types.ts +16 -5
- 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 +61 -12
- package/src/notifications/decision-engine.ts +46 -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/gateway-threshold-reader.ts +116 -8
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/permissions/prompter.ts +86 -96
- package/src/permissions/secret-prompter.ts +31 -31
- 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 +20 -5
- 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 +63 -8
- package/src/proactive-artifact/job.ts +20 -2
- package/src/proactive-artifact/message-copy.ts +18 -1
- 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/templates/SOUL.md +13 -28
- 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 +304 -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/channel-approvals.ts +3 -2
- package/src/runtime/guardian-reply-router.ts +0 -10
- 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/pending-interactions.ts +19 -15
- 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 +147 -0
- 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 +7 -21
- 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/consolidation-routes.ts +8 -9
- 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 +373 -82
- 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-bash-routes.ts +2 -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/filing-routes.ts +2 -3
- 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 -7
- 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-item-routes.test.ts +3 -9
- package/src/runtime/routes/memory-item-routes.ts +5 -6
- package/src/runtime/routes/memory-v2-routes.ts +105 -404
- 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/skills/include-graph.ts +35 -13
- 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/document/document-tool.ts +20 -0
- package/src/tools/executor.ts +18 -2
- package/src/tools/memory/register.test.ts +10 -8
- 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 +28 -5
- package/src/tools/skills/load.ts +24 -20
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-name-aliases.ts +19 -0
- package/src/tools/types.ts +19 -1
- 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/067-release-notes-safe-storage-limits.ts +4 -62
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +34 -0
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +31 -0
- package/src/workspace/migrations/071-remove-safe-storage-release-note.ts +111 -0
- 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 +28 -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 -492
- 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 -1201
- 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 -477
- package/src/memory/graph/compaction.ts +0 -299
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -390,9 +390,11 @@ function isServerToolUseBlock(
|
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
/** Type-guard for web_search_tool_result blocks. */
|
|
393
|
-
function isWebSearchToolResultBlock(
|
|
394
|
-
|
|
395
|
-
|
|
393
|
+
function isWebSearchToolResultBlock(block: unknown): block is {
|
|
394
|
+
type: "web_search_tool_result";
|
|
395
|
+
tool_use_id: string;
|
|
396
|
+
content: unknown;
|
|
397
|
+
} {
|
|
396
398
|
return (
|
|
397
399
|
typeof block === "object" &&
|
|
398
400
|
block != null &&
|
|
@@ -401,52 +403,85 @@ function isWebSearchToolResultBlock(
|
|
|
401
403
|
}
|
|
402
404
|
|
|
403
405
|
/**
|
|
404
|
-
* Repair orphaned
|
|
405
|
-
*
|
|
406
|
-
*
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
*
|
|
406
|
+
* Repair orphaned server-side tool blocks within assistant messages. Server-
|
|
407
|
+
* side tools (e.g. web_search) are self-paired: the assistant message should
|
|
408
|
+
* contain both server_tool_use and its matching web_search_tool_result. Either
|
|
409
|
+
* side can go missing — a partial stream may drop the result, or a downstream
|
|
410
|
+
* step (history reload, message split, compaction) may drop the use block.
|
|
411
|
+
* Both cases trigger an Anthropic 400 on the next request, so this function
|
|
412
|
+
* handles both directions:
|
|
413
|
+
*
|
|
414
|
+
* - server_tool_use without paired result: inject a synthetic error result.
|
|
415
|
+
* - web_search_tool_result without paired server_tool_use: downgrade to a
|
|
416
|
+
* text block describing what was found so the model retains context.
|
|
410
417
|
*/
|
|
411
|
-
function
|
|
418
|
+
function repairOrphanedServerToolBlocks(
|
|
412
419
|
messages: Anthropic.MessageParam[],
|
|
413
420
|
): Anthropic.MessageParam[] {
|
|
414
421
|
return messages.map((msg) => {
|
|
415
422
|
if (msg.role !== "assistant") return msg;
|
|
416
423
|
const content = Array.isArray(msg.content) ? msg.content : [];
|
|
417
424
|
|
|
418
|
-
// Collect server_tool_use IDs and web_search_tool_result IDs in this message
|
|
419
425
|
const serverToolUseIds = new Set<string>();
|
|
420
|
-
const
|
|
426
|
+
const webSearchResultIds = new Set<string>();
|
|
421
427
|
for (const block of content) {
|
|
422
428
|
if (isServerToolUseBlock(block)) {
|
|
423
429
|
serverToolUseIds.add(block.id);
|
|
424
430
|
}
|
|
425
431
|
if (isWebSearchToolResultBlock(block)) {
|
|
426
|
-
|
|
432
|
+
webSearchResultIds.add(block.tool_use_id);
|
|
427
433
|
}
|
|
428
434
|
}
|
|
429
435
|
|
|
430
|
-
|
|
431
|
-
const orphanedIds: string[] = [];
|
|
436
|
+
const orphanServerToolUseIds = new Set<string>();
|
|
432
437
|
for (const id of serverToolUseIds) {
|
|
433
|
-
if (!
|
|
434
|
-
|
|
435
|
-
|
|
438
|
+
if (!webSearchResultIds.has(id)) orphanServerToolUseIds.add(id);
|
|
439
|
+
}
|
|
440
|
+
const orphanWebSearchResultIds = new Set<string>();
|
|
441
|
+
for (const id of webSearchResultIds) {
|
|
442
|
+
if (!serverToolUseIds.has(id)) orphanWebSearchResultIds.add(id);
|
|
436
443
|
}
|
|
437
444
|
|
|
438
|
-
if (
|
|
445
|
+
if (
|
|
446
|
+
orphanServerToolUseIds.size === 0 &&
|
|
447
|
+
orphanWebSearchResultIds.size === 0
|
|
448
|
+
) {
|
|
449
|
+
return msg;
|
|
450
|
+
}
|
|
439
451
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
452
|
+
if (orphanServerToolUseIds.size > 0) {
|
|
453
|
+
log.warn(
|
|
454
|
+
{
|
|
455
|
+
orphanedIds: Array.from(orphanServerToolUseIds),
|
|
456
|
+
blockCount: content.length,
|
|
457
|
+
},
|
|
458
|
+
"Injecting synthetic web_search_tool_result for orphaned server_tool_use blocks",
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
if (orphanWebSearchResultIds.size > 0) {
|
|
462
|
+
log.warn(
|
|
463
|
+
{
|
|
464
|
+
orphanedIds: Array.from(orphanWebSearchResultIds),
|
|
465
|
+
blockCount: content.length,
|
|
466
|
+
},
|
|
467
|
+
"Downgrading orphaned web_search_tool_result blocks to text",
|
|
468
|
+
);
|
|
469
|
+
}
|
|
444
470
|
|
|
445
|
-
// Insert a synthetic error web_search_tool_result after each orphaned server_tool_use
|
|
446
471
|
const repairedContent: Anthropic.ContentBlockParam[] = [];
|
|
447
472
|
for (const block of content) {
|
|
473
|
+
if (
|
|
474
|
+
isWebSearchToolResultBlock(block) &&
|
|
475
|
+
orphanWebSearchResultIds.has(block.tool_use_id)
|
|
476
|
+
) {
|
|
477
|
+
repairedContent.push({
|
|
478
|
+
type: "text",
|
|
479
|
+
text: formatOrphanedWebSearchResultAsText(block),
|
|
480
|
+
});
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
448
483
|
repairedContent.push(block);
|
|
449
|
-
if (isServerToolUseBlock(block) &&
|
|
484
|
+
if (isServerToolUseBlock(block) && orphanServerToolUseIds.has(block.id)) {
|
|
450
485
|
repairedContent.push({
|
|
451
486
|
type: "web_search_tool_result",
|
|
452
487
|
tool_use_id: block.id,
|
|
@@ -462,6 +497,38 @@ function repairOrphanedServerToolUse(
|
|
|
462
497
|
});
|
|
463
498
|
}
|
|
464
499
|
|
|
500
|
+
function formatOrphanedWebSearchResultAsText(block: {
|
|
501
|
+
tool_use_id: string;
|
|
502
|
+
content: unknown;
|
|
503
|
+
}): string {
|
|
504
|
+
const header = `[Orphaned web_search results (tool_use_id=${block.tool_use_id}):`;
|
|
505
|
+
if (!Array.isArray(block.content)) {
|
|
506
|
+
return `${header} (results unavailable)]`;
|
|
507
|
+
}
|
|
508
|
+
const entries: string[] = [];
|
|
509
|
+
for (const r of block.content) {
|
|
510
|
+
if (
|
|
511
|
+
typeof r !== "object" ||
|
|
512
|
+
r == null ||
|
|
513
|
+
(r as { type?: string }).type !== "web_search_result"
|
|
514
|
+
) {
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
const title =
|
|
518
|
+
typeof (r as { title?: unknown }).title === "string"
|
|
519
|
+
? (r as { title: string }).title
|
|
520
|
+
: "(untitled)";
|
|
521
|
+
const url =
|
|
522
|
+
typeof (r as { url?: unknown }).url === "string"
|
|
523
|
+
? (r as { url: string }).url
|
|
524
|
+
: "";
|
|
525
|
+
const idx = entries.length + 1;
|
|
526
|
+
entries.push(url ? `${idx}. ${title}\n ${url}` : `${idx}. ${title}`);
|
|
527
|
+
}
|
|
528
|
+
const body = entries.length > 0 ? entries.join("\n") : "(no results)";
|
|
529
|
+
return `${header}\n${body}]`;
|
|
530
|
+
}
|
|
531
|
+
|
|
465
532
|
/**
|
|
466
533
|
* Last-line-of-defense fix that ensures every assistant message with tool_use
|
|
467
534
|
* blocks has matching tool_result blocks in the immediately following user
|
|
@@ -859,7 +926,9 @@ export class AnthropicProvider implements Provider {
|
|
|
859
926
|
// assistant messages have original thinking with valid signatures
|
|
860
927
|
// — the API accepts them. No provider-side stripping needed.
|
|
861
928
|
|
|
862
|
-
sentMessages = ensureToolPairing(
|
|
929
|
+
sentMessages = ensureToolPairing(
|
|
930
|
+
repairOrphanedServerToolBlocks(formatted),
|
|
931
|
+
);
|
|
863
932
|
const {
|
|
864
933
|
effort,
|
|
865
934
|
speed,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Provider wrapper that routes each `sendMessage` call to a different
|
|
3
3
|
* underlying provider transport when the per-call `options.config.callSite`
|
|
4
|
-
* resolves to a
|
|
4
|
+
* resolves to a profile that names a `provider_connection` distinct from
|
|
5
|
+
* the default's.
|
|
5
6
|
*
|
|
6
7
|
* Without this wrapper the conversation-level provider transport is fixed at
|
|
7
8
|
* construction time, so a per-call-site `llm.callSites.<id>.provider`
|
|
@@ -11,18 +12,22 @@
|
|
|
11
12
|
* though the main agent runs on Anthropic" silently fail.
|
|
12
13
|
*
|
|
13
14
|
* `CallSiteRoutingProvider` consults `resolveCallSiteConfig` per call. When
|
|
14
|
-
* the resolved
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* stable identity.
|
|
15
|
+
* the resolved profile names a `provider_connection`, the wrapper resolves
|
|
16
|
+
* that connection and delegates the call to its bound Provider. Other
|
|
17
|
+
* Provider interface surface area (`name`, `tokenEstimationProvider`) is
|
|
18
|
+
* delegated to the default so wrappers further out (e.g. `RateLimitProvider`)
|
|
19
|
+
* still see a stable identity.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
23
23
|
|
|
24
24
|
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
25
25
|
import { getConfig } from "../config/loader.js";
|
|
26
|
+
import {
|
|
27
|
+
ConnectionResolutionError,
|
|
28
|
+
tryResolveProviderForConnectionName,
|
|
29
|
+
} from "./connection-resolution.js";
|
|
30
|
+
import type { ProvidersConfig } from "./registry.js";
|
|
26
31
|
import type {
|
|
27
32
|
Message,
|
|
28
33
|
Provider,
|
|
@@ -52,7 +57,25 @@ export class CallSiteRoutingProvider implements Provider {
|
|
|
52
57
|
|
|
53
58
|
constructor(
|
|
54
59
|
private readonly defaultProvider: Provider,
|
|
55
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Async hook invoked when the resolved profile names a
|
|
62
|
+
* `provider_connection`. Returning a Provider routes the call through
|
|
63
|
+
* that connection's auth; returning null signals a soft credential
|
|
64
|
+
* failure (no usable adapter) and the wrapper falls back to the
|
|
65
|
+
* default Provider for graceful per-call degradation. Hard config
|
|
66
|
+
* errors (lookup_failed / not_found / provider_mismatch) throw
|
|
67
|
+
* `ConnectionResolutionError` and propagate to the caller — those
|
|
68
|
+
* are misconfigurations that need to be fixed, not silently routed
|
|
69
|
+
* around.
|
|
70
|
+
*
|
|
71
|
+
* `expectedProvider` is the provider name the resolved profile
|
|
72
|
+
* declared. The hook verifies the connection's provider matches
|
|
73
|
+
* and throws on mismatch.
|
|
74
|
+
*/
|
|
75
|
+
private readonly resolveByConnection: (
|
|
76
|
+
connectionName: string,
|
|
77
|
+
expectedProvider: string,
|
|
78
|
+
) => Promise<Provider | null>,
|
|
56
79
|
) {
|
|
57
80
|
this.tokenEstimationProvider = defaultProvider.tokenEstimationProvider;
|
|
58
81
|
}
|
|
@@ -63,7 +86,7 @@ export class CallSiteRoutingProvider implements Provider {
|
|
|
63
86
|
systemPrompt?: string,
|
|
64
87
|
options?: SendMessageOptions,
|
|
65
88
|
): Promise<ProviderResponse> {
|
|
66
|
-
const target = this.selectProvider(options);
|
|
89
|
+
const target = await this.selectProvider(options);
|
|
67
90
|
const isRouted = target !== this.defaultProvider;
|
|
68
91
|
|
|
69
92
|
const doSend = async (): Promise<ProviderResponse> => {
|
|
@@ -91,12 +114,26 @@ export class CallSiteRoutingProvider implements Provider {
|
|
|
91
114
|
}
|
|
92
115
|
|
|
93
116
|
/**
|
|
94
|
-
* Pick the provider to route this call through.
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
117
|
+
* Pick the provider to route this call through.
|
|
118
|
+
*
|
|
119
|
+
* Resolution order:
|
|
120
|
+
* 1. No callSite → default provider (legacy short-circuit; no
|
|
121
|
+
* resolution work needed).
|
|
122
|
+
* 2. Resolved profile names a `provider_connection` → resolve through
|
|
123
|
+
* that connection's auth. Hard config errors propagate as throws.
|
|
124
|
+
* Soft credential failures fall back to the default Provider so
|
|
125
|
+
* a transient credential blip does not take a conversation
|
|
126
|
+
* offline.
|
|
127
|
+
* 3. Resolved profile's `provider` matches the default's name → reuse
|
|
128
|
+
* the default provider instance (no connection-aware lookup
|
|
129
|
+
* needed; the default IS the connection-aware route).
|
|
130
|
+
* 4. Resolved profile's `provider` differs from the default but no
|
|
131
|
+
* `provider_connection` is set → throw. This is a configuration
|
|
132
|
+
* bug: alternate-provider routing requires a connection.
|
|
98
133
|
*/
|
|
99
|
-
private selectProvider(
|
|
134
|
+
private async selectProvider(
|
|
135
|
+
options?: SendMessageOptions,
|
|
136
|
+
): Promise<Provider> {
|
|
100
137
|
const callSite = options?.config?.callSite;
|
|
101
138
|
if (!callSite) return this.defaultProvider;
|
|
102
139
|
|
|
@@ -104,11 +141,52 @@ export class CallSiteRoutingProvider implements Provider {
|
|
|
104
141
|
const resolved = resolveCallSiteConfig(callSite, getConfig().llm, {
|
|
105
142
|
overrideProfile,
|
|
106
143
|
});
|
|
144
|
+
|
|
145
|
+
if (resolved.provider_connection) {
|
|
146
|
+
const connectionProvider = await this.resolveByConnection(
|
|
147
|
+
resolved.provider_connection,
|
|
148
|
+
resolved.provider,
|
|
149
|
+
);
|
|
150
|
+
if (connectionProvider) return connectionProvider;
|
|
151
|
+
// Soft credential failure — the connection-resolution helper
|
|
152
|
+
// returned null because the underlying auth bundle yields no
|
|
153
|
+
// usable adapter (or threw transiently). Reuse the default for
|
|
154
|
+
// graceful per-call degradation.
|
|
155
|
+
return this.defaultProvider;
|
|
156
|
+
}
|
|
157
|
+
|
|
107
158
|
if (resolved.provider === this.defaultProvider.name) {
|
|
108
159
|
return this.defaultProvider;
|
|
109
160
|
}
|
|
110
161
|
|
|
111
|
-
|
|
112
|
-
|
|
162
|
+
throw new ConnectionResolutionError(
|
|
163
|
+
"<resolved-callsite>",
|
|
164
|
+
"missing_connection",
|
|
165
|
+
`call-site "${callSite}" resolves to provider "${resolved.provider}" but no provider_connection is set — alternate-provider routing requires a connection`,
|
|
166
|
+
);
|
|
113
167
|
}
|
|
114
168
|
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Wrap a base Provider with `CallSiteRoutingProvider` configured to route
|
|
172
|
+
* `provider_connection` references through the shared connection-resolution
|
|
173
|
+
* helper.
|
|
174
|
+
*
|
|
175
|
+
* `config` is threaded through to the connection lookup so the resolved
|
|
176
|
+
* connection's auth can read provider-config metadata (e.g. timeouts, model
|
|
177
|
+
* names).
|
|
178
|
+
*/
|
|
179
|
+
export function wrapWithCallSiteRouting(
|
|
180
|
+
base: Provider,
|
|
181
|
+
config: ProvidersConfig,
|
|
182
|
+
): Provider {
|
|
183
|
+
return new CallSiteRoutingProvider(
|
|
184
|
+
base,
|
|
185
|
+
(connectionName, expectedProvider) =>
|
|
186
|
+
tryResolveProviderForConnectionName(
|
|
187
|
+
connectionName,
|
|
188
|
+
config,
|
|
189
|
+
expectedProvider,
|
|
190
|
+
),
|
|
191
|
+
);
|
|
192
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection-aware provider resolution helpers.
|
|
3
|
+
*
|
|
4
|
+
* These wrap `resolveProviderFromConnection` (in `registry.ts`) with the
|
|
5
|
+
* DB lookup and lifecycle of a `provider_connection` reference. The
|
|
6
|
+
* canonical dispatch path (`provider-send-message.ts`) and each satellite
|
|
7
|
+
* site (subagent manager, daemon conversation/approval/guardian generators,
|
|
8
|
+
* rollup producer) use these helpers so that connection-awareness behaves
|
|
9
|
+
* identically across the codebase.
|
|
10
|
+
*
|
|
11
|
+
* Resolution policy:
|
|
12
|
+
* 1. The profile MUST name a `provider_connection`. The boot-time
|
|
13
|
+
* backfill ensures every profile has one; a missing connection name
|
|
14
|
+
* is a configuration bug.
|
|
15
|
+
* 2. Hard config errors (DB lookup throws, row not found, provider
|
|
16
|
+
* mismatch with the resolving profile) throw so misconfigurations
|
|
17
|
+
* surface immediately rather than silently rerouting.
|
|
18
|
+
* 3. Soft credential issues (`resolveProviderFromConnection` returns
|
|
19
|
+
* null because the credential isn't set in the vault, or the
|
|
20
|
+
* auth bundle yields no usable adapter) return null. Callers are
|
|
21
|
+
* free to treat null as "no provider available" and fall back to
|
|
22
|
+
* a graceful no-op (e.g. rollup producer skips, satellite throw
|
|
23
|
+
* with their own actionable message).
|
|
24
|
+
* 4. Transient failures inside the resolver (managed-proxy context
|
|
25
|
+
* lookup, credential read I/O) are caught and treated like a soft
|
|
26
|
+
* credential issue (return null). A transient blip should not take
|
|
27
|
+
* a conversation offline.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
31
|
+
import { getDb } from "../memory/db-connection.js";
|
|
32
|
+
import { getLogger } from "../util/logger.js";
|
|
33
|
+
import { getConnection } from "./inference/connections.js";
|
|
34
|
+
import type { ProvidersConfig } from "./registry.js";
|
|
35
|
+
import { resolveProviderFromConnection } from "./registry.js";
|
|
36
|
+
import type { Provider } from "./types.js";
|
|
37
|
+
|
|
38
|
+
const log = getLogger("providers/connection-resolution");
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Error raised when a `provider_connection` reference cannot be resolved
|
|
42
|
+
* because the configuration is broken (DB lookup throws, no such row, or
|
|
43
|
+
* the connection's provider does not match the resolving profile's
|
|
44
|
+
* declared provider). These are deterministic configuration bugs that
|
|
45
|
+
* should fail loudly rather than silently rerouting.
|
|
46
|
+
*/
|
|
47
|
+
export class ConnectionResolutionError extends Error {
|
|
48
|
+
constructor(
|
|
49
|
+
public readonly connectionName: string,
|
|
50
|
+
public readonly reason:
|
|
51
|
+
| "lookup_failed"
|
|
52
|
+
| "not_found"
|
|
53
|
+
| "provider_mismatch"
|
|
54
|
+
| "missing_connection",
|
|
55
|
+
message: string,
|
|
56
|
+
public readonly cause?: unknown,
|
|
57
|
+
) {
|
|
58
|
+
super(message);
|
|
59
|
+
this.name = "ConnectionResolutionError";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a Provider through a named `provider_connection`.
|
|
65
|
+
*
|
|
66
|
+
* Throws `ConnectionResolutionError` on hard config errors:
|
|
67
|
+
* - DB lookup throws (`lookup_failed`)
|
|
68
|
+
* - No connection row with this name (`not_found`)
|
|
69
|
+
* - Connection row's provider does not match `expectedProvider`
|
|
70
|
+
* (`provider_mismatch`) — protects against silent misroutes when a
|
|
71
|
+
* profile names provider X with a connection bound to provider Y.
|
|
72
|
+
*
|
|
73
|
+
* Returns null on soft credential issues:
|
|
74
|
+
* - `resolveProviderFromConnection` returned null (credential missing
|
|
75
|
+
* from vault, platform auth unavailable, adapter creation failure).
|
|
76
|
+
* - The resolver threw a transient failure (caught and downgraded to
|
|
77
|
+
* null). Callers handle null as "no provider available right now".
|
|
78
|
+
*
|
|
79
|
+
* `expectedProvider` is the provider name the resolving profile declared.
|
|
80
|
+
* Pass `undefined` to skip the mismatch check (callers that don't yet
|
|
81
|
+
* know the expected provider).
|
|
82
|
+
*/
|
|
83
|
+
export async function tryResolveProviderForConnectionName(
|
|
84
|
+
connectionName: string,
|
|
85
|
+
config: ProvidersConfig,
|
|
86
|
+
expectedProvider?: string,
|
|
87
|
+
): Promise<Provider | null> {
|
|
88
|
+
let connection;
|
|
89
|
+
try {
|
|
90
|
+
connection = getConnection(getDb(), connectionName);
|
|
91
|
+
} catch (err) {
|
|
92
|
+
throw new ConnectionResolutionError(
|
|
93
|
+
connectionName,
|
|
94
|
+
"lookup_failed",
|
|
95
|
+
`provider_connection lookup failed for "${connectionName}"`,
|
|
96
|
+
err,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (!connection) {
|
|
100
|
+
throw new ConnectionResolutionError(
|
|
101
|
+
connectionName,
|
|
102
|
+
"not_found",
|
|
103
|
+
`provider_connection "${connectionName}" not found in DB — check your config or run the boot-time backfill`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
if (expectedProvider && connection.provider !== expectedProvider) {
|
|
107
|
+
throw new ConnectionResolutionError(
|
|
108
|
+
connectionName,
|
|
109
|
+
"provider_mismatch",
|
|
110
|
+
`provider_connection "${connectionName}" has provider="${connection.provider}" but resolving profile declared provider="${expectedProvider}" — set the profile's provider_connection to a row matching its provider`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
// `resolveProviderFromConnection` reaches into auth resolution (credential
|
|
114
|
+
// reads, managed-proxy context). A transient failure there is a soft
|
|
115
|
+
// miss — log and return null so the caller can treat it the same as
|
|
116
|
+
// "no usable credentials". Hard config errors are thrown above; this
|
|
117
|
+
// catch is specifically for in-flight failures that should not take
|
|
118
|
+
// dispatch offline.
|
|
119
|
+
try {
|
|
120
|
+
return await resolveProviderFromConnection(connection, config);
|
|
121
|
+
} catch (err) {
|
|
122
|
+
log.warn(
|
|
123
|
+
{ err, connectionName },
|
|
124
|
+
"provider_connection auth resolution failed transiently — returning null",
|
|
125
|
+
);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Resolve the connection-aware default provider for the satellite
|
|
132
|
+
* construction-time path (subagent manager, conversation store,
|
|
133
|
+
* approval/guardian generators, rollup producer).
|
|
134
|
+
*
|
|
135
|
+
* Reads `config.llm.default.{provider, provider_connection}`.
|
|
136
|
+
*
|
|
137
|
+
* - Throws `ConnectionResolutionError` if the default profile has no
|
|
138
|
+
* `provider_connection` (boot-time backfill should have set one;
|
|
139
|
+
* a missing connection name is a configuration bug).
|
|
140
|
+
* - Throws on hard connection errors (lookup_failed, not_found,
|
|
141
|
+
* provider_mismatch).
|
|
142
|
+
* - Returns null on soft credential issues so satellites can early-
|
|
143
|
+
* out gracefully (rollup producer skips, others throw with their
|
|
144
|
+
* own message).
|
|
145
|
+
*/
|
|
146
|
+
export async function resolveDefaultProvider(
|
|
147
|
+
config: ProvidersConfig,
|
|
148
|
+
): Promise<Provider | null> {
|
|
149
|
+
const resolved = resolveCallSiteConfig("mainAgent", config.llm);
|
|
150
|
+
const connectionName = resolved.provider_connection;
|
|
151
|
+
if (!connectionName) {
|
|
152
|
+
throw new ConnectionResolutionError(
|
|
153
|
+
"<llm.default>",
|
|
154
|
+
"missing_connection",
|
|
155
|
+
`llm.default.provider_connection is unset — every profile must declare a provider_connection. The boot-time backfill in lifecycle.ts populates this field; if you see this error, the backfill did not run or the field was manually cleared.`,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return tryResolveProviderForConnectionName(
|
|
159
|
+
connectionName,
|
|
160
|
+
config,
|
|
161
|
+
resolved.provider,
|
|
162
|
+
);
|
|
163
|
+
}
|