@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
|
@@ -1,24 +1,35 @@
|
|
|
1
|
+
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
2
|
+
import { type LLMConfig } from "../config/schemas/llm.js";
|
|
1
3
|
import { getProviderKeyAsync } from "../security/secure-keys.js";
|
|
2
4
|
import { ProviderNotConfiguredError } from "../util/errors.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
5
|
+
import { getLogger } from "../util/logger.js";
|
|
6
|
+
import {
|
|
7
|
+
buildProviderAdapter,
|
|
8
|
+
createAdapterFromConnection,
|
|
9
|
+
} from "./inference/adapter-factory.js";
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Per-connection provider cache (mix-and-match support)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
import type { ProviderConnection } from "./inference/auth.js";
|
|
14
|
+
import { resolveAuth } from "./inference/resolve-auth.js";
|
|
6
15
|
import {
|
|
7
16
|
buildManagedBaseUrl,
|
|
8
17
|
resolveManagedProxyContext,
|
|
9
18
|
} from "./managed-proxy/context.js";
|
|
10
|
-
import { isModelInCatalog } from "./model-catalog.js";
|
|
19
|
+
import { isModelInCatalog, PROVIDER_CATALOG } from "./model-catalog.js";
|
|
11
20
|
import { getProviderDefaultModel } from "./model-intents.js";
|
|
12
|
-
import { OllamaProvider } from "./ollama/client.js";
|
|
13
|
-
import { OpenAIResponsesProvider } from "./openai/client.js";
|
|
14
|
-
import { OpenRouterProvider } from "./openrouter/client.js";
|
|
15
21
|
import { RetryProvider } from "./retry.js";
|
|
16
22
|
import type { Provider } from "./types.js";
|
|
17
23
|
import { UsageTrackingProvider } from "./usage-tracking.js";
|
|
18
24
|
|
|
25
|
+
const log = getLogger("provider-registry");
|
|
26
|
+
|
|
19
27
|
const providers = new Map<string, Provider>();
|
|
20
28
|
const routingSources = new Map<string, "user-key" | "managed-proxy">();
|
|
21
29
|
|
|
30
|
+
/** Per-connection provider cache, keyed by connection name. */
|
|
31
|
+
const connectionProviders = new Map<string, Provider>();
|
|
32
|
+
|
|
22
33
|
function registerProvider(name: string, provider: Provider): void {
|
|
23
34
|
providers.set(name, new UsageTrackingProvider(provider));
|
|
24
35
|
}
|
|
@@ -43,9 +54,7 @@ export function getProviderRoutingSource(
|
|
|
43
54
|
|
|
44
55
|
export interface ProvidersConfig {
|
|
45
56
|
services: {
|
|
46
|
-
inference:
|
|
47
|
-
mode: "managed" | "your-own";
|
|
48
|
-
};
|
|
57
|
+
inference: Record<string, never>;
|
|
49
58
|
"image-generation": {
|
|
50
59
|
mode: "managed" | "your-own";
|
|
51
60
|
provider: string;
|
|
@@ -56,25 +65,15 @@ export interface ProvidersConfig {
|
|
|
56
65
|
provider: string;
|
|
57
66
|
};
|
|
58
67
|
};
|
|
59
|
-
llm:
|
|
60
|
-
default: {
|
|
61
|
-
provider: string;
|
|
62
|
-
model: string;
|
|
63
|
-
};
|
|
64
|
-
};
|
|
68
|
+
llm: LLMConfig;
|
|
65
69
|
timeouts?: { providerStreamTimeoutSec?: number };
|
|
66
70
|
}
|
|
67
71
|
|
|
68
72
|
function resolveModel(config: ProvidersConfig, providerName: string): string {
|
|
69
|
-
const
|
|
70
|
-
const
|
|
73
|
+
const resolved = resolveCallSiteConfig("mainAgent", config.llm);
|
|
74
|
+
const inferenceProvider = resolved.provider;
|
|
75
|
+
const inferenceModel = resolved.model;
|
|
71
76
|
if (inferenceProvider === providerName) {
|
|
72
|
-
// If a non-Anthropic provider is selected but the configured model is
|
|
73
|
-
// still an Anthropic catalog model (current or previous default), use a
|
|
74
|
-
// provider-appropriate fallback instead. Checking the full Anthropic
|
|
75
|
-
// catalog rather than only the current default prevents stale persisted
|
|
76
|
-
// defaults (e.g. claude-opus-4-6) from being sent to non-Anthropic APIs
|
|
77
|
-
// after the catalog default changes.
|
|
78
77
|
if (
|
|
79
78
|
providerName !== "anthropic" &&
|
|
80
79
|
isModelInCatalog("anthropic", inferenceModel)
|
|
@@ -87,50 +86,27 @@ function resolveModel(config: ProvidersConfig, providerName: string): string {
|
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
/**
|
|
90
|
-
* Resolve provider credentials
|
|
91
|
-
*
|
|
92
|
-
*
|
|
89
|
+
* Resolve provider credentials. User key takes precedence; managed proxy is
|
|
90
|
+
* used as a fallback when platform prerequisites are available.
|
|
91
|
+
*
|
|
92
|
+
* The routing decision is now derived from credential availability rather than
|
|
93
|
+
* the removed `services.inference.mode` config field.
|
|
93
94
|
*/
|
|
94
95
|
async function resolveProviderCredentials(
|
|
95
96
|
providerName: string,
|
|
96
|
-
mode: "managed" | "your-own",
|
|
97
97
|
): Promise<{
|
|
98
98
|
apiKey: string;
|
|
99
99
|
baseURL?: string;
|
|
100
100
|
source: "user-key" | "managed-proxy";
|
|
101
101
|
} | null> {
|
|
102
|
-
if (mode === "managed") {
|
|
103
|
-
// In managed mode, try managed proxy first, then fall back to user key
|
|
104
|
-
const managedBaseUrl = await buildManagedBaseUrl(providerName);
|
|
105
|
-
if (managedBaseUrl) {
|
|
106
|
-
const ctx = await resolveManagedProxyContext();
|
|
107
|
-
return {
|
|
108
|
-
apiKey: ctx.assistantApiKey,
|
|
109
|
-
baseURL: managedBaseUrl,
|
|
110
|
-
source: "managed-proxy",
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
// Managed proxy unavailable for this provider; fall back to user key
|
|
114
|
-
const userKey = await getProviderKeyAsync(providerName);
|
|
115
|
-
if (userKey) {
|
|
116
|
-
return { apiKey: userKey, source: "user-key" };
|
|
117
|
-
}
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
// "your-own" mode: check user key first, then try managed proxy fallback
|
|
121
102
|
const userKey = await getProviderKeyAsync(providerName);
|
|
122
103
|
if (userKey) {
|
|
123
104
|
return { apiKey: userKey, source: "user-key" };
|
|
124
105
|
}
|
|
125
|
-
// Fall back to managed proxy even in your-own mode (backwards compat)
|
|
126
106
|
const managedBaseUrl = await buildManagedBaseUrl(providerName);
|
|
127
107
|
if (managedBaseUrl) {
|
|
128
108
|
const ctx = await resolveManagedProxyContext();
|
|
129
|
-
return {
|
|
130
|
-
apiKey: ctx.assistantApiKey,
|
|
131
|
-
baseURL: managedBaseUrl,
|
|
132
|
-
source: "managed-proxy",
|
|
133
|
-
};
|
|
109
|
+
return { apiKey: ctx.assistantApiKey, baseURL: managedBaseUrl, source: "managed-proxy" };
|
|
134
110
|
}
|
|
135
111
|
return null;
|
|
136
112
|
}
|
|
@@ -140,126 +116,134 @@ export async function initializeProviders(
|
|
|
140
116
|
): Promise<void> {
|
|
141
117
|
providers.clear();
|
|
142
118
|
routingSources.clear();
|
|
119
|
+
connectionProviders.clear();
|
|
143
120
|
|
|
144
121
|
const streamTimeoutMs =
|
|
145
122
|
(config.timeouts?.providerStreamTimeoutSec ?? 1800) * 1000;
|
|
146
|
-
const inferenceMode = config.services.inference.mode;
|
|
147
123
|
const useNativeWebSearch =
|
|
148
124
|
config.services["web-search"].provider === "inference-provider-native";
|
|
125
|
+
const mainAgentProvider = resolveCallSiteConfig("mainAgent", config.llm)
|
|
126
|
+
.provider;
|
|
127
|
+
|
|
128
|
+
for (const entry of PROVIDER_CATALOG) {
|
|
129
|
+
const isKeyless = entry.setupMode === "keyless";
|
|
130
|
+
|
|
131
|
+
// Credential resolution: user key first, managed proxy second. Keyless
|
|
132
|
+
// providers (e.g. ollama) skip both — they only need to be configured as
|
|
133
|
+
// the mainAgent provider, or have a key present (rare keyed-mode), to
|
|
134
|
+
// boot. Boot order matches catalog order; routingSources tracks which
|
|
135
|
+
// credential surface served each provider.
|
|
136
|
+
let apiKey = "";
|
|
137
|
+
let baseURL: string | undefined;
|
|
138
|
+
let source: "user-key" | "managed-proxy" = "user-key";
|
|
139
|
+
if (isKeyless) {
|
|
140
|
+
const key = await getProviderKeyAsync(entry.id);
|
|
141
|
+
const isConfiguredMainAgent = mainAgentProvider === entry.id;
|
|
142
|
+
if (!key && !isConfiguredMainAgent) continue;
|
|
143
|
+
apiKey = key ?? "";
|
|
144
|
+
} else {
|
|
145
|
+
const creds = await resolveProviderCredentials(entry.id);
|
|
146
|
+
if (!creds) continue;
|
|
147
|
+
apiKey = creds.apiKey;
|
|
148
|
+
baseURL = creds.baseURL;
|
|
149
|
+
source = creds.source;
|
|
150
|
+
}
|
|
149
151
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
forwardUsageAttributionHeaders:
|
|
169
|
-
anthropicCreds.source === "managed-proxy",
|
|
170
|
-
},
|
|
171
|
-
),
|
|
172
|
-
);
|
|
173
|
-
routingSources.set("anthropic", anthropicCreds.source);
|
|
174
|
-
}
|
|
152
|
+
const model = resolveModel(config, entry.id);
|
|
153
|
+
const adapter = buildProviderAdapter(entry.id, {
|
|
154
|
+
apiKey,
|
|
155
|
+
model,
|
|
156
|
+
streamTimeoutMs,
|
|
157
|
+
baseURL,
|
|
158
|
+
useNativeWebSearch,
|
|
159
|
+
});
|
|
160
|
+
if (!adapter) {
|
|
161
|
+
// Catalog declares a provider with no factory entry. The parity guard
|
|
162
|
+
// in adapter-factory.ts catches this at module load, so reaching here
|
|
163
|
+
// means a future refactor regressed the invariant.
|
|
164
|
+
log.error(
|
|
165
|
+
{ providerId: entry.id },
|
|
166
|
+
"Catalog entry has no adapter factory — skipping",
|
|
167
|
+
);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
175
170
|
|
|
176
|
-
// OpenAI
|
|
177
|
-
const openaiCreds = await resolveProviderCredentials("openai", inferenceMode);
|
|
178
|
-
if (openaiCreds) {
|
|
179
|
-
const model = resolveModel(config, "openai");
|
|
180
171
|
registerProvider(
|
|
181
|
-
|
|
182
|
-
new RetryProvider(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
streamTimeoutMs,
|
|
186
|
-
...(openaiCreds.baseURL ? { baseURL: openaiCreds.baseURL } : {}),
|
|
187
|
-
}),
|
|
188
|
-
{
|
|
189
|
-
forwardUsageAttributionHeaders:
|
|
190
|
-
openaiCreds.source === "managed-proxy",
|
|
191
|
-
},
|
|
192
|
-
),
|
|
172
|
+
entry.id,
|
|
173
|
+
new RetryProvider(adapter, {
|
|
174
|
+
forwardUsageAttributionHeaders: source === "managed-proxy",
|
|
175
|
+
}),
|
|
193
176
|
);
|
|
194
|
-
routingSources.set(
|
|
177
|
+
routingSources.set(entry.id, source);
|
|
195
178
|
}
|
|
179
|
+
}
|
|
196
180
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
const model = resolveModel(config, "gemini");
|
|
201
|
-
registerProvider(
|
|
202
|
-
"gemini",
|
|
203
|
-
new RetryProvider(
|
|
204
|
-
new GeminiProvider(geminiCreds.apiKey, model, {
|
|
205
|
-
streamTimeoutMs,
|
|
206
|
-
...(geminiCreds.baseURL
|
|
207
|
-
? { managedBaseUrl: geminiCreds.baseURL }
|
|
208
|
-
: {}),
|
|
209
|
-
}),
|
|
210
|
-
{
|
|
211
|
-
forwardUsageAttributionHeaders:
|
|
212
|
-
geminiCreds.source === "managed-proxy",
|
|
213
|
-
},
|
|
214
|
-
),
|
|
215
|
-
);
|
|
216
|
-
routingSources.set("gemini", geminiCreds.source);
|
|
217
|
-
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// Per-connection provider resolution (mix-and-match support)
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
218
184
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
185
|
+
/**
|
|
186
|
+
* Resolve a provider instance for a named `provider_connection`.
|
|
187
|
+
*
|
|
188
|
+
* Results are cached in `connectionProviders` for the lifetime of the
|
|
189
|
+
* current `initializeProviders` invocation (cleared on next boot). This
|
|
190
|
+
* prevents redundant vault reads for repeated calls to the same connection.
|
|
191
|
+
*
|
|
192
|
+
* Returns null when:
|
|
193
|
+
* - The connection doesn't exist in the DB
|
|
194
|
+
* - Auth resolution fails (missing credential, platform unavailable, v2 type)
|
|
195
|
+
* - The provider/auth combination yields no usable adapter
|
|
196
|
+
*/
|
|
197
|
+
export async function resolveProviderFromConnection(
|
|
198
|
+
connection: ProviderConnection,
|
|
199
|
+
config: ProvidersConfig,
|
|
200
|
+
): Promise<Provider | null> {
|
|
201
|
+
const cached = connectionProviders.get(connection.name);
|
|
202
|
+
if (cached) return cached;
|
|
203
|
+
|
|
204
|
+
const authResult = await resolveAuth(connection.auth, connection.provider);
|
|
205
|
+
if (!authResult.ok) {
|
|
206
|
+
const err = authResult.error;
|
|
207
|
+
if (err.code === "not_implemented") {
|
|
208
|
+
log.warn(
|
|
209
|
+
{ connectionName: connection.name, authType: err.authType },
|
|
210
|
+
`Auth type '${err.authType}' is not yet implemented (v2). ` +
|
|
211
|
+
"Update the connection to use 'api_key', 'platform', or 'none'.",
|
|
212
|
+
);
|
|
213
|
+
} else if (err.code === "credential_not_found") {
|
|
214
|
+
log.warn(
|
|
215
|
+
{ connectionName: connection.name, credential: err.credential },
|
|
216
|
+
`Credential '${err.credential}' not found in vault for connection '${connection.name}'.`,
|
|
217
|
+
);
|
|
218
|
+
} else {
|
|
219
|
+
log.warn(
|
|
220
|
+
{ connectionName: connection.name },
|
|
221
|
+
`Platform auth unavailable for connection '${connection.name}'.`,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
233
225
|
}
|
|
234
226
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
"fireworks",
|
|
241
|
-
new RetryProvider(
|
|
242
|
-
new FireworksProvider(fireworksKey, model, {
|
|
243
|
-
streamTimeoutMs,
|
|
244
|
-
}),
|
|
245
|
-
),
|
|
246
|
-
);
|
|
247
|
-
routingSources.set("fireworks", "user-key");
|
|
248
|
-
}
|
|
227
|
+
const streamTimeoutMs =
|
|
228
|
+
(config.timeouts?.providerStreamTimeoutSec ?? 1800) * 1000;
|
|
229
|
+
const useNativeWebSearch =
|
|
230
|
+
config.services["web-search"].provider === "inference-provider-native";
|
|
231
|
+
const model = resolveModel(config, connection.provider);
|
|
249
232
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
useNativeWebSearch,
|
|
259
|
-
streamTimeoutMs,
|
|
260
|
-
}),
|
|
261
|
-
),
|
|
262
|
-
);
|
|
263
|
-
routingSources.set("openrouter", "user-key");
|
|
233
|
+
const provider = createAdapterFromConnection(connection, authResult.resolved, {
|
|
234
|
+
model,
|
|
235
|
+
streamTimeoutMs,
|
|
236
|
+
useNativeWebSearch,
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
if (provider) {
|
|
240
|
+
connectionProviders.set(connection.name, provider);
|
|
264
241
|
}
|
|
242
|
+
|
|
243
|
+
return provider;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** Clear per-connection provider cache (called by initializeProviders on boot). */
|
|
247
|
+
export function clearConnectionProviderCache(): void {
|
|
248
|
+
connectionProviders.clear();
|
|
265
249
|
}
|
package/src/providers/retry.ts
CHANGED
|
@@ -205,16 +205,8 @@ function normalizeSendMessageOptions(
|
|
|
205
205
|
) {
|
|
206
206
|
nextConfig.temperature = resolved.temperature;
|
|
207
207
|
}
|
|
208
|
-
if (nextConfig.thinking === undefined) {
|
|
209
|
-
|
|
210
|
-
// discriminated wire-format (`{ type: "adaptive" | "disabled" }`).
|
|
211
|
-
// Without this conversion, `thinking` arrives at `AnthropicProvider`
|
|
212
|
-
// with a shape the SDK doesn't accept (`ThinkingConfigParam` requires
|
|
213
|
-
// a `type` discriminator).
|
|
214
|
-
const thinking = normalizeThinkingConfigForWire(resolved.thinking);
|
|
215
|
-
if (thinking !== undefined) {
|
|
216
|
-
nextConfig.thinking = thinking;
|
|
217
|
-
}
|
|
208
|
+
if (nextConfig.thinking === undefined && resolved.thinking !== undefined) {
|
|
209
|
+
nextConfig.thinking = resolved.thinking;
|
|
218
210
|
}
|
|
219
211
|
// Forward OpenRouter-only routing preferences so `OpenRouterProvider` can
|
|
220
212
|
// translate `openrouter.only` into the wire-format `provider: { only: [...] }`
|
|
@@ -236,6 +228,22 @@ function normalizeSendMessageOptions(
|
|
|
236
228
|
// "Extra inputs are not permitted".
|
|
237
229
|
}
|
|
238
230
|
|
|
231
|
+
// Convert schema-shape `{ enabled, streamThinking }` into Anthropic's
|
|
232
|
+
// discriminated wire-format (`{ type: "adaptive" | "disabled" }`).
|
|
233
|
+
// `AnthropicProvider`'s SDK requires a `type` discriminator, and downstream
|
|
234
|
+
// forced-tool/temperature conflict checks compare against the wire shape.
|
|
235
|
+
// Applies to both the resolver path above and pass-through callers (e.g.
|
|
236
|
+
// `host.providers.llm.complete`) that supply `thinking` directly without a
|
|
237
|
+
// `callSite`.
|
|
238
|
+
if (nextConfig.thinking !== undefined) {
|
|
239
|
+
const normalized = normalizeThinkingConfigForWire(nextConfig.thinking);
|
|
240
|
+
if (normalized === undefined) {
|
|
241
|
+
delete nextConfig.thinking;
|
|
242
|
+
} else {
|
|
243
|
+
nextConfig.thinking = normalized;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
239
247
|
// thinking is Anthropic-specific on the wire; OpenRouter reads it as a
|
|
240
248
|
// signal for its unified reasoning parameter. Strip it for other providers.
|
|
241
249
|
if (
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical catalog of built-in web-search providers.
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth that drives:
|
|
5
|
+
*
|
|
6
|
+
* 1. The config-schema enum (`VALID_WEB_SEARCH_PROVIDERS` in
|
|
7
|
+
* `assistant/src/config/schemas/services.ts`).
|
|
8
|
+
* 2. The search-provider env-var map (`SEARCH_PROVIDER_ENV_VAR_NAMES`
|
|
9
|
+
* in `provider-env-vars.ts`).
|
|
10
|
+
* 3. The API-key provider set (`SEARCH_API_KEY_PROVIDERS` in
|
|
11
|
+
* `provider-secret-catalog.ts`).
|
|
12
|
+
* 4. (Indirect, via `meta/web-search-provider-catalog.json` generated by
|
|
13
|
+
* `assistant/scripts/sync-web-search-catalog.ts`) the CLI mirror in
|
|
14
|
+
* `cli/src/shared/provider-env-vars.ts` and the web vendored catalog
|
|
15
|
+
* in `vellum-assistant-platform`.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors the pattern from `model-catalog.ts` (Provider Expansion Phase 3
|
|
18
|
+
* for LLM providers). When introducing a new built-in web-search provider,
|
|
19
|
+
* the daemon-side changes collapse to:
|
|
20
|
+
*
|
|
21
|
+
* 1. Add a new executor in `tools/network/web-search.ts`.
|
|
22
|
+
* 2. Register an adapter in the `WEB_SEARCH_ADAPTERS` table.
|
|
23
|
+
* 3. Add an entry to this catalog.
|
|
24
|
+
* 4. Run `bun run sync:web-search-catalog` to regenerate
|
|
25
|
+
* `meta/web-search-provider-catalog.json`.
|
|
26
|
+
*
|
|
27
|
+
* The split between adapter (which carries the executor) and catalog (which
|
|
28
|
+
* carries metadata) keeps the catalog purely declarative — adding an entry
|
|
29
|
+
* never forces a code rebuild downstream and the JSON projection stays
|
|
30
|
+
* trivial.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
export type SearchProviderKind = "managed" | "byok";
|
|
34
|
+
|
|
35
|
+
export interface SearchProviderCatalogEntry {
|
|
36
|
+
/** Stable provider identifier. Matches config + secret-catalog values. */
|
|
37
|
+
readonly id: string;
|
|
38
|
+
/** Short display name used by picker UIs. */
|
|
39
|
+
readonly displayName: string;
|
|
40
|
+
/**
|
|
41
|
+
* Optional long display name for prose contexts (marketing docs,
|
|
42
|
+
* privacy notices). Defaults to {@link displayName} when omitted.
|
|
43
|
+
*/
|
|
44
|
+
readonly displayNameLong?: string;
|
|
45
|
+
/** Authentication style. `managed` providers are routed through the
|
|
46
|
+
* inference provider; `byok` providers require a user-supplied key. */
|
|
47
|
+
readonly kind: SearchProviderKind;
|
|
48
|
+
/** Placeholder shown in the API-key input. BYOK providers only. */
|
|
49
|
+
readonly apiKeyPrefix?: string;
|
|
50
|
+
/** Environment variable name carrying the API key. BYOK providers only. */
|
|
51
|
+
readonly envVar?: string;
|
|
52
|
+
/** Secret-catalog key (the bare provider name accepted by
|
|
53
|
+
* `getProviderKeyAsync`). BYOK providers only. */
|
|
54
|
+
readonly secretKey?: string;
|
|
55
|
+
/** Position in the daemon fallback chain (lower = earlier). BYOK only. */
|
|
56
|
+
readonly fallbackOrder?: number;
|
|
57
|
+
/** Privacy-policy URL surfaced in marketing data-sharing docs.
|
|
58
|
+
* BYOK providers only. */
|
|
59
|
+
readonly privacyPolicyUrl?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const SEARCH_PROVIDER_CATALOG: readonly SearchProviderCatalogEntry[] = [
|
|
63
|
+
{
|
|
64
|
+
id: "inference-provider-native",
|
|
65
|
+
displayName: "Provider Native",
|
|
66
|
+
kind: "managed",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: "perplexity",
|
|
70
|
+
displayName: "Perplexity",
|
|
71
|
+
kind: "byok",
|
|
72
|
+
apiKeyPrefix: "pplx-...",
|
|
73
|
+
envVar: "PERPLEXITY_API_KEY",
|
|
74
|
+
secretKey: "perplexity",
|
|
75
|
+
fallbackOrder: 1,
|
|
76
|
+
privacyPolicyUrl: "https://www.perplexity.ai/hub/legal/privacy-policy",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: "brave",
|
|
80
|
+
displayName: "Brave",
|
|
81
|
+
displayNameLong: "Brave Search",
|
|
82
|
+
kind: "byok",
|
|
83
|
+
apiKeyPrefix: "BSA...",
|
|
84
|
+
envVar: "BRAVE_API_KEY",
|
|
85
|
+
secretKey: "brave",
|
|
86
|
+
fallbackOrder: 2,
|
|
87
|
+
privacyPolicyUrl: "https://search.brave.com/help/privacy-policy",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "tavily",
|
|
91
|
+
displayName: "Tavily",
|
|
92
|
+
kind: "byok",
|
|
93
|
+
apiKeyPrefix: "tvly-...",
|
|
94
|
+
envVar: "TAVILY_API_KEY",
|
|
95
|
+
secretKey: "tavily",
|
|
96
|
+
fallbackOrder: 3,
|
|
97
|
+
privacyPolicyUrl: "https://tavily.com/privacy",
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
/** Provider ids accepted by the web-search config schema. */
|
|
102
|
+
export const SEARCH_PROVIDER_IDS: readonly string[] = SEARCH_PROVIDER_CATALOG.map(
|
|
103
|
+
(p) => p.id,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
/** Catalog entries that store an API key under their bare provider name. */
|
|
107
|
+
export const BYOK_SEARCH_PROVIDERS: readonly SearchProviderCatalogEntry[] =
|
|
108
|
+
SEARCH_PROVIDER_CATALOG.filter((p) => p.kind === "byok");
|
|
109
|
+
|
|
110
|
+
/** BYOK provider ids, ordered by `fallbackOrder` (ascending). */
|
|
111
|
+
export const SEARCH_PROVIDER_FALLBACK_ORDER: readonly string[] = BYOK_SEARCH_PROVIDERS
|
|
112
|
+
.slice()
|
|
113
|
+
.sort((a, b) => (a.fallbackOrder ?? 0) - (b.fallbackOrder ?? 0))
|
|
114
|
+
.map((p) => p.id);
|
|
115
|
+
|
|
116
|
+
/** Look up a single catalog entry by id. Returns `undefined` if unknown. */
|
|
117
|
+
export function getSearchProvider(
|
|
118
|
+
id: string,
|
|
119
|
+
): SearchProviderCatalogEntry | undefined {
|
|
120
|
+
return SEARCH_PROVIDER_CATALOG.find((p) => p.id === id);
|
|
121
|
+
}
|
package/src/runtime/AGENTS.md
CHANGED
|
@@ -12,6 +12,10 @@ The single HTTP send endpoint is `POST /v1/messages`. Key behaviors:
|
|
|
12
12
|
|
|
13
13
|
Do NOT add new send endpoints. All message ingress should go through `POST /v1/messages` (HTTP).
|
|
14
14
|
|
|
15
|
+
### SSE backpressure shedding must be observable
|
|
16
|
+
|
|
17
|
+
SSE handlers built on `ReadableStream` shed slow subscribers when `controller.desiredSize <= 0` to keep daemon memory bounded. Every shed site must emit a log line + Sentry capture so the daemon-side shed can be time-correlated with the client-side idle watchdog (otherwise stalls are invisible from both sides). See [WHATWG Streams — Backpressure](https://streams.spec.whatwg.org/#pipe-chains) and [Node `monitorEventLoopDelay`](https://nodejs.org/api/perf_hooks.html#perf_hooksmonitoreventloopdelayoptions).
|
|
18
|
+
|
|
15
19
|
### GET handler idempotency
|
|
16
20
|
|
|
17
21
|
GET handlers must be safe and side-effect-free — they must not enqueue background jobs, mutate database state, or trigger writes. If a feature needs server-initiated work in response to a client request, use an explicit POST endpoint or a push-based flow (SSE event → client refetch). See [RFC 9110 §9.2.1 — Safe Methods](https://httpwg.org/specs/rfc9110.html#safe.methods).
|
|
@@ -65,6 +69,15 @@ Host browser allows the assistant to proxy CDP (Chrome DevTools Protocol) JSON-R
|
|
|
65
69
|
- `POST /v1/host-browser-result` — `{ requestId, content, isError }`
|
|
66
70
|
- **Tracking**: Uses the same `pending-interactions` tracker as the other host proxy types, with `kind: "host_browser"`. Registration happens in `conversation-routes.ts` and the route handler is in `host-browser-routes.ts`.
|
|
67
71
|
|
|
72
|
+
### Host app-control (desktop proxy native-app control)
|
|
73
|
+
|
|
74
|
+
Host app-control allows the assistant to proxy app-control actions (target a specific application by bundle ID or process name, capture window screenshots, drive UI) to the desktop host via the client, following the same pattern as host bash, host file, host CU, and host browser. App-control sessions are per-conversation, so the proxy reference lives on `Conversation.hostAppControlProxy` rather than as a singleton.
|
|
75
|
+
|
|
76
|
+
- **Discovery**: Clients discover pending host app-control requests via SSE events (`host_app_control_request`) which include a `requestId`.
|
|
77
|
+
- **Resolution**: Clients execute the app-control action on the host and respond via:
|
|
78
|
+
- `POST /v1/host-app-control-result` — `{ requestId, state, pngBase64?, windowBounds?, executionResult?, executionError? }`. `state` is one of `"running" | "missing" | "minimized"`.
|
|
79
|
+
- **Tracking**: Uses the same `pending-interactions` tracker as the other host proxy types, with `kind: "host_app_control"`. The route handler is in `host-app-control-routes.ts` and forwards the payload to the owning conversation's `hostAppControlProxy.resolve()`. Late delivery is tolerated — the route returns 200 even when no pending interaction matches (e.g. the conversation was disposed before the client reported back).
|
|
80
|
+
|
|
68
81
|
### `chrome-extension` interface (Phase 2)
|
|
69
82
|
|
|
70
83
|
The `chrome-extension` interface in `INTERFACE_IDS` is a non-interactive transport that supports only the `host_browser` capability — it does NOT support `host_bash`, `host_file`, or `host_cu`. This is encoded in `supportsHostProxy(id, capability)`: passing a capability argument returns `true` for `chrome-extension` only when the capability is `host_browser`; the no-arg form returns `false` for `chrome-extension` (so legacy desktop-only call sites that assume full-desktop proxy availability continue to gate correctly).
|
|
@@ -83,11 +96,11 @@ See `docs/browser-use-architecture-phase2.md` for the full wire diagram and comp
|
|
|
83
96
|
|
|
84
97
|
On macOS-originated turns, the CDP factory (`tools/browser/cdp-client/factory.ts`) evaluates three browser backends in strict priority order. Each candidate is tried lazily; if the first command fails with a transport-level error, the factory falls over to the next candidate. CDP protocol errors (the browser understood the command but rejected it) do NOT trigger failover.
|
|
85
98
|
|
|
86
|
-
| Priority | Backend | Condition
|
|
87
|
-
| -------- | -------------------------- |
|
|
88
|
-
| 1 | **Extension / host proxy** | `hostBrowserProxy` present AND `isAvailable()` returns `true`. On macOS, the proxy is always provisioned. On other interfaces, requires an active hub subscriber with `host_browser` capability
|
|
89
|
-
| 2 | **cdp-inspect** | (a) `hostBrowser.cdpInspect.enabled` is `true` in config, OR (b) `transportInterface === "macos"` AND `desktopAuto.enabled` is `true` (default) AND the cooldown from a prior failure is not active
|
|
90
|
-
| 3 | **Local** | Always present as the final fallback
|
|
99
|
+
| Priority | Backend | Condition | Transport |
|
|
100
|
+
| -------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
101
|
+
| 1 | **Extension / host proxy** | `hostBrowserProxy` present AND `isAvailable()` returns `true`. On macOS, the proxy is always provisioned. On other interfaces, requires an active hub subscriber with `host_browser` capability | WS via `ChromeExtensionRegistry` (self-hosted), SSE via `assistantEventHub` with `targetCapability: "host_browser"` (cloud extension or macOS) |
|
|
102
|
+
| 2 | **cdp-inspect** | (a) `hostBrowser.cdpInspect.enabled` is `true` in config, OR (b) `transportInterface === "macos"` AND `desktopAuto.enabled` is `true` (default) AND the cooldown from a prior failure is not active | Direct CDP WebSocket to `localhost:9222` |
|
|
103
|
+
| 3 | **Local** | Always present as the final fallback | In-process Playwright CDP via `browserManager` |
|
|
91
104
|
|
|
92
105
|
**Transport selection for the extension/host-proxy backend:**
|
|
93
106
|
|