@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,26 +1,44 @@
|
|
|
1
|
+
import type { DrizzleDb } from "../memory/db-connection.js";
|
|
2
|
+
import {
|
|
3
|
+
createConnection,
|
|
4
|
+
disableManagedConnectionsForByokHatch,
|
|
5
|
+
getConnection,
|
|
6
|
+
} from "../providers/inference/connections.js";
|
|
1
7
|
import { PROVIDER_CATALOG } from "../providers/model-catalog.js";
|
|
2
8
|
import { resolveModelIntent } from "../providers/model-intents.js";
|
|
3
9
|
import type { ModelIntent } from "../providers/types.js";
|
|
10
|
+
import { credentialKey } from "../security/credential-key.js";
|
|
11
|
+
import { getLogger } from "../util/logger.js";
|
|
4
12
|
import { loadRawConfig, saveRawConfig } from "./loader.js";
|
|
5
13
|
import {
|
|
6
14
|
DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS,
|
|
7
15
|
type ProfileEntry,
|
|
8
16
|
} from "./schemas/llm.js";
|
|
9
17
|
|
|
18
|
+
const log = getLogger("seed-inference-profiles");
|
|
19
|
+
|
|
20
|
+
const MANAGED_CONNECTION_NAME = "anthropic-managed";
|
|
21
|
+
const MANAGED_PROFILE_PROVIDER: NonNullable<ProfileEntry["provider"]> =
|
|
22
|
+
"anthropic";
|
|
23
|
+
|
|
10
24
|
/**
|
|
11
25
|
* Template for a daemon-managed inference profile. The profile's model is
|
|
12
26
|
* resolved at seed time from `PROVIDER_MODEL_INTENTS` so the catalog stays the
|
|
13
27
|
* single source of truth for "which model does this intent map to?".
|
|
14
28
|
*/
|
|
15
|
-
type ManagedProfileTemplate = Omit<
|
|
29
|
+
type ManagedProfileTemplate = Omit<
|
|
30
|
+
ProfileEntry,
|
|
31
|
+
"provider" | "model" | "provider_connection"
|
|
32
|
+
> & {
|
|
16
33
|
intent: ModelIntent;
|
|
17
34
|
};
|
|
18
35
|
|
|
19
36
|
/**
|
|
20
|
-
* Anthropic
|
|
21
|
-
*
|
|
37
|
+
* Managed Anthropic profiles. Overwritten on every daemon boot so Vellum can
|
|
38
|
+
* push model/config updates to customers in new releases. Platform overlays
|
|
39
|
+
* (`preserveProfileNames`) take precedence when present.
|
|
22
40
|
*/
|
|
23
|
-
const
|
|
41
|
+
const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
24
42
|
balanced: {
|
|
25
43
|
intent: "balanced",
|
|
26
44
|
source: "managed",
|
|
@@ -54,15 +72,15 @@ const ANTHROPIC_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
54
72
|
};
|
|
55
73
|
|
|
56
74
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
75
|
+
* User profile templates. Materialized at hatch time for off-platform
|
|
76
|
+
* installations. Each points at the user's personal provider connection
|
|
77
|
+
* (backed by their API key in CES).
|
|
60
78
|
*/
|
|
61
|
-
const
|
|
79
|
+
const USER_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
62
80
|
"custom-balanced": {
|
|
63
81
|
intent: "balanced",
|
|
64
82
|
source: "user",
|
|
65
|
-
label: "Balanced
|
|
83
|
+
label: "Balanced",
|
|
66
84
|
description: "Good balance of quality, cost, and speed",
|
|
67
85
|
maxTokens: 16000,
|
|
68
86
|
effort: "high",
|
|
@@ -72,7 +90,7 @@ const CUSTOM_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
72
90
|
"custom-quality-optimized": {
|
|
73
91
|
intent: "quality-optimized",
|
|
74
92
|
source: "user",
|
|
75
|
-
label: "Quality
|
|
93
|
+
label: "Quality",
|
|
76
94
|
description: "Best results with the most capable model",
|
|
77
95
|
maxTokens: 32000,
|
|
78
96
|
effort: "max",
|
|
@@ -82,7 +100,7 @@ const CUSTOM_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
82
100
|
"custom-cost-optimized": {
|
|
83
101
|
intent: "latency-optimized",
|
|
84
102
|
source: "user",
|
|
85
|
-
label: "Speed
|
|
103
|
+
label: "Speed",
|
|
86
104
|
description: "Fastest responses at lower cost",
|
|
87
105
|
maxTokens: 8192,
|
|
88
106
|
effort: "low",
|
|
@@ -92,41 +110,37 @@ const CUSTOM_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
92
110
|
};
|
|
93
111
|
|
|
94
112
|
export const MANAGED_PROFILE_NAMES = new Set(
|
|
95
|
-
Object.keys(
|
|
113
|
+
Object.keys(MANAGED_PROFILE_TEMPLATES),
|
|
96
114
|
);
|
|
97
115
|
|
|
98
|
-
const SEEDED_PROFILE_NAMES = new Set([
|
|
99
|
-
...Object.keys(ANTHROPIC_PROFILE_TEMPLATES),
|
|
100
|
-
...Object.keys(CUSTOM_PROFILE_TEMPLATES),
|
|
101
|
-
]);
|
|
102
|
-
|
|
103
|
-
const KNOWN_PROVIDERS = new Set(PROVIDER_CATALOG.map((entry) => entry.id));
|
|
104
|
-
|
|
105
116
|
export type SeedInferenceProfilesOptions = {
|
|
106
117
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* should remain authoritative for this boot.
|
|
118
|
+
* Profile names supplied by the platform/default overlay for this startup.
|
|
119
|
+
* Those entries are already on disk and should remain authoritative.
|
|
110
120
|
*/
|
|
111
121
|
preserveProfileNames?: Iterable<string>;
|
|
112
122
|
preserveActiveProfile?: boolean;
|
|
123
|
+
/** True when a hatch overlay was consumed this startup. */
|
|
124
|
+
isHatch?: boolean;
|
|
125
|
+
/** DB handle for creating user provider connections at hatch time. */
|
|
126
|
+
db?: DrizzleDb;
|
|
113
127
|
};
|
|
114
128
|
|
|
115
129
|
/**
|
|
116
|
-
* Seed
|
|
130
|
+
* Seed inference profiles into the workspace config.
|
|
131
|
+
*
|
|
132
|
+
* Runs on every daemon startup. Two responsibilities:
|
|
117
133
|
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* default provider is non-Anthropic, the 3 `custom-*` profiles are also
|
|
123
|
-
* materialized using `resolveModelIntent` against that provider, and
|
|
124
|
-
* `custom-balanced` becomes the active profile for fresh hatches.
|
|
134
|
+
* 1. **Managed profiles** (`balanced`, `quality-optimized`, `cost-optimized`):
|
|
135
|
+
* overwritten on every boot so Vellum can push model/config updates to
|
|
136
|
+
* customers. Each carries `provider_connection: "anthropic-managed"`.
|
|
137
|
+
* Platform overlays (`preserveProfileNames`) take precedence.
|
|
125
138
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
139
|
+
* 2. **User profiles** (`custom-balanced`, `custom-quality-optimized`,
|
|
140
|
+
* `custom-cost-optimized`): materialized once at hatch time for
|
|
141
|
+
* off-platform installations. Each points at a personal provider
|
|
142
|
+
* connection backed by the user's API key in CES. Subsequent boots
|
|
143
|
+
* leave these untouched — the user owns them.
|
|
130
144
|
*/
|
|
131
145
|
export function seedInferenceProfiles(
|
|
132
146
|
options: SeedInferenceProfilesOptions = {},
|
|
@@ -144,56 +158,131 @@ export function seedInferenceProfiles(
|
|
|
144
158
|
}
|
|
145
159
|
const profiles = llm.profiles as Record<string, Record<string, unknown>>;
|
|
146
160
|
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
const isKnownProvider = KNOWN_PROVIDERS.has(requestedProvider);
|
|
150
|
-
const resolvedProvider: NonNullable<ProfileEntry["provider"]> =
|
|
151
|
-
isKnownProvider
|
|
152
|
-
? (requestedProvider as NonNullable<ProfileEntry["provider"]>)
|
|
153
|
-
: "anthropic";
|
|
154
|
-
const isAnthropicDefault = resolvedProvider === "anthropic";
|
|
161
|
+
const isPlatform =
|
|
162
|
+
process.env.IS_PLATFORM === "true" || process.env.IS_PLATFORM === "1";
|
|
155
163
|
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
//
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
llm.default = defaultBlock;
|
|
166
|
-
}
|
|
164
|
+
// BYOK mode = off-platform installs. The user is bringing their own provider
|
|
165
|
+
// API key; managed profile labels get a " (Managed)" suffix to disambiguate
|
|
166
|
+
// from the personal "custom-*" profiles that share base labels. Managed
|
|
167
|
+
// profile + connection status is initially "disabled" so the picker doesn't
|
|
168
|
+
// offer an unusable platform-auth option on day one — but ONLY at hatch
|
|
169
|
+
// time, and ONLY when the entry isn't already in the user's config (i.e.
|
|
170
|
+
// first materialization). Post-hatch user toggles survive every subsequent
|
|
171
|
+
// boot.
|
|
172
|
+
const isByokMode = !isPlatform;
|
|
167
173
|
|
|
168
|
-
|
|
174
|
+
// 1. Managed profiles. Off-platform: overwrite on every boot so Vellum can
|
|
175
|
+
// push model/config updates in new releases. On-platform: insert only if
|
|
176
|
+
// absent — the platform controls profiles through overlays, and the
|
|
177
|
+
// overlay fragment is authoritative even when it omits fields the local
|
|
178
|
+
// template carries (e.g. an overlay supplying only provider/model/label
|
|
179
|
+
// must not get its maxTokens/thinking polluted from the template). The
|
|
180
|
+
// legacy migration-052 backfill that seeds label-less Anthropic
|
|
181
|
+
// defaults is healed by workspace migration 082
|
|
182
|
+
// (`backfill-managed-profile-labels`) rather than the seeder, so
|
|
183
|
+
// this skip path stays simple.
|
|
184
|
+
//
|
|
185
|
+
// Two user-editable fields survive the overwrite: `label` (display
|
|
186
|
+
// rename) and `status` (active/disabled toggle). The PUT route
|
|
187
|
+
// `/v1/config/llm/profiles/:name` lets users patch these on managed
|
|
188
|
+
// profiles without duplicating; we have to honor those edits across
|
|
189
|
+
// reseeds or they'd silently revert on every boot. Carry by
|
|
190
|
+
// key-presence rather than truthiness so an explicit `null` (user
|
|
191
|
+
// cleared the label) survives too. Codex P1 finding on PR #30362.
|
|
192
|
+
//
|
|
193
|
+
// BYOK seed defaults (off-platform only):
|
|
194
|
+
// • label: " (Managed)" suffix disambiguates managed profile labels
|
|
195
|
+
// from personal "custom-*" profiles that share base labels.
|
|
196
|
+
// Upgrade migration: existing installs that already have the bare
|
|
197
|
+
// template label ("Balanced" / "Quality" / "Speed") on disk get
|
|
198
|
+
// rewritten to the suffixed form. Any other previous label value
|
|
199
|
+
// (user-set custom string, explicit null, already-suffixed) is
|
|
200
|
+
// preserved as-is.
|
|
201
|
+
// • status: "disabled" on fresh materialization at hatch only —
|
|
202
|
+
// gated on (isHatch && !previous) so post-hatch boots and existing
|
|
203
|
+
// installs are never auto-disabled. A user re-enable persists
|
|
204
|
+
// across boots via the key-presence preservation below.
|
|
205
|
+
for (const [name, template] of Object.entries(MANAGED_PROFILE_TEMPLATES)) {
|
|
169
206
|
if (preservedProfileNames.has(name)) continue;
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
) {
|
|
184
|
-
continue;
|
|
207
|
+
if (isPlatform && readObject(profiles[name]) !== null) continue;
|
|
208
|
+
|
|
209
|
+
const previous = readObject(profiles[name]);
|
|
210
|
+
const effectiveTemplate: ManagedProfileTemplate = isByokMode
|
|
211
|
+
? { ...template, label: `${template.label} (Managed)` }
|
|
212
|
+
: template;
|
|
213
|
+
const next = materializeProfile(
|
|
214
|
+
effectiveTemplate,
|
|
215
|
+
MANAGED_PROFILE_PROVIDER,
|
|
216
|
+
MANAGED_CONNECTION_NAME,
|
|
217
|
+
) as Record<string, unknown>;
|
|
218
|
+
if (isByokMode && options.isHatch && !previous) {
|
|
219
|
+
next.status = "disabled";
|
|
185
220
|
}
|
|
186
|
-
|
|
221
|
+
if (previous) {
|
|
222
|
+
// Preserve user overrides on these whitelisted fields. The label path
|
|
223
|
+
// also runs the BYOK upgrade migration described above: if the on-disk
|
|
224
|
+
// label exactly equals the bare template default and we're in BYOK
|
|
225
|
+
// mode, rewrite to the suffixed effective label so existing installs
|
|
226
|
+
// get the disambiguation, not just fresh hatches.
|
|
227
|
+
if ("label" in previous) {
|
|
228
|
+
next.label =
|
|
229
|
+
isByokMode && previous.label === template.label
|
|
230
|
+
? effectiveTemplate.label
|
|
231
|
+
: previous.label;
|
|
232
|
+
}
|
|
233
|
+
if ("status" in previous) next.status = previous.status;
|
|
234
|
+
}
|
|
235
|
+
profiles[name] = next as ProfileEntry;
|
|
187
236
|
}
|
|
188
237
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
238
|
+
// 2. User profiles — only at hatch time for off-platform installations.
|
|
239
|
+
let userConnectionName: string | undefined;
|
|
240
|
+
if (options.isHatch && !isPlatform) {
|
|
241
|
+
// BYOK hatch: disable the three canonical managed connections so the
|
|
242
|
+
// picker doesn't surface unusable platform-auth options on day one.
|
|
243
|
+
// Runs only here, only at hatch — `seedCanonicalConnections` leaves
|
|
244
|
+
// `status` alone on subsequent boots so a post-hatch user re-enable
|
|
245
|
+
// persists.
|
|
246
|
+
if (options.db) {
|
|
247
|
+
disableManagedConnectionsForByokHatch(options.db);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const hatchProvider = readString(readObject(llm.default)?.provider);
|
|
251
|
+
if (hatchProvider && hatchProvider !== "ollama") {
|
|
252
|
+
userConnectionName = `${hatchProvider}-personal`;
|
|
253
|
+
|
|
254
|
+
if (options.db) {
|
|
255
|
+
if (!getConnection(options.db, userConnectionName)) {
|
|
256
|
+
const credName = credentialKey(hatchProvider, "api_key");
|
|
257
|
+
const result = createConnection(options.db, {
|
|
258
|
+
name: userConnectionName,
|
|
259
|
+
provider: hatchProvider,
|
|
260
|
+
auth: { type: "api_key", credential: credName },
|
|
261
|
+
label: personalConnectionLabel(hatchProvider),
|
|
262
|
+
});
|
|
263
|
+
if (!result.ok) {
|
|
264
|
+
log.warn(
|
|
265
|
+
{ provider: hatchProvider, error: result.error },
|
|
266
|
+
"Failed to create personal connection during hatch seeding",
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const provider =
|
|
273
|
+
hatchProvider as NonNullable<ProfileEntry["provider"]>;
|
|
274
|
+
for (const [name, template] of Object.entries(USER_PROFILE_TEMPLATES)) {
|
|
275
|
+
if (preservedProfileNames.has(name)) continue;
|
|
276
|
+
profiles[name] = materializeProfile(
|
|
277
|
+
template,
|
|
278
|
+
provider,
|
|
279
|
+
userConnectionName,
|
|
280
|
+
);
|
|
281
|
+
}
|
|
194
282
|
}
|
|
195
283
|
}
|
|
196
284
|
|
|
285
|
+
// Active profile resolution.
|
|
197
286
|
const requestedActiveProfile = readString(llm.activeProfile);
|
|
198
287
|
const requestedActiveEntry =
|
|
199
288
|
requestedActiveProfile !== undefined
|
|
@@ -203,80 +292,37 @@ export function seedInferenceProfiles(
|
|
|
203
292
|
const shouldPreserveActiveProfile =
|
|
204
293
|
options.preserveActiveProfile === true && requestedActiveExists;
|
|
205
294
|
|
|
206
|
-
// Decide whether the existing active profile is still appropriate. A managed
|
|
207
|
-
// profile whose provider no longer matches the resolved default goes stale
|
|
208
|
-
// (e.g. re-hatching anthropic→openai leaves `balanced` pointing at anthropic;
|
|
209
|
-
// re-hatching openai→anthropic leaves `custom-balanced` pointing at openai).
|
|
210
|
-
// Either direction should land the user on the new default's `balanced`
|
|
211
|
-
// counterpart rather than routing the main agent to a stale provider.
|
|
212
|
-
// User-created profiles are left alone — those are the user's choice.
|
|
213
|
-
let keepActiveProfile = shouldPreserveActiveProfile;
|
|
214
|
-
if (!keepActiveProfile && requestedActiveExists) {
|
|
215
|
-
const isSeededName = SEEDED_PROFILE_NAMES.has(requestedActiveProfile!);
|
|
216
|
-
const activeProvider = readString(requestedActiveEntry?.provider);
|
|
217
|
-
const managedActiveProviderMismatch =
|
|
218
|
-
isSeededName && activeProvider !== resolvedProvider;
|
|
219
|
-
keepActiveProfile = !managedActiveProviderMismatch;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
let activeProfileName: string;
|
|
223
|
-
if (keepActiveProfile) {
|
|
224
|
-
activeProfileName = requestedActiveProfile!;
|
|
225
|
-
} else {
|
|
226
|
-
activeProfileName = isAnthropicDefault ? "balanced" : "custom-balanced";
|
|
227
|
-
llm.activeProfile = activeProfileName;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Sync `llm.default.model` to the active profile's model so the providers
|
|
231
|
-
// registry sees a coherent provider/model pair. Only writes when the on-disk
|
|
232
|
-
// default model is missing or unambiguously belongs to a *different*
|
|
233
|
-
// provider's catalog (e.g. `claude-opus-4-7` paired with `provider: openai`).
|
|
234
|
-
// A user-supplied model not listed in any provider's catalog is preserved —
|
|
235
|
-
// ollama and openrouter expose far more models than `PROVIDER_CATALOG` lists,
|
|
236
|
-
// and silently overwriting `codellama`/`phi3`/etc. on every restart would
|
|
237
|
-
// break those users' configs. Skipped when the overlay owns the active
|
|
238
|
-
// profile (platform mode).
|
|
239
295
|
if (!shouldPreserveActiveProfile) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
unknown
|
|
246
|
-
>;
|
|
247
|
-
const currentModel = readString(defaultBlock.model);
|
|
248
|
-
const modelBelongsToOtherProvider =
|
|
249
|
-
currentModel !== undefined &&
|
|
250
|
-
PROVIDER_CATALOG.some(
|
|
251
|
-
(p) =>
|
|
252
|
-
p.id !== resolvedProvider &&
|
|
253
|
-
p.models.some((m) => m.id === currentModel),
|
|
254
|
-
);
|
|
255
|
-
const shouldOverwriteDefaultModel =
|
|
256
|
-
currentModel === undefined || modelBelongsToOtherProvider;
|
|
257
|
-
if (shouldOverwriteDefaultModel) {
|
|
258
|
-
defaultBlock.model = activeModel;
|
|
259
|
-
llm.default = defaultBlock;
|
|
260
|
-
}
|
|
296
|
+
if (options.isHatch) {
|
|
297
|
+
// Hatch = fresh setup. Pick the right default based on platform mode.
|
|
298
|
+
llm.activeProfile = userConnectionName ? "custom-balanced" : "balanced";
|
|
299
|
+
} else if (!requestedActiveExists) {
|
|
300
|
+
llm.activeProfile = "balanced";
|
|
261
301
|
}
|
|
262
302
|
}
|
|
263
303
|
|
|
304
|
+
// Profile ordering — ensure all seeded profiles appear in the order array.
|
|
264
305
|
const profileOrder = Array.isArray(llm.profileOrder)
|
|
265
306
|
? (llm.profileOrder as string[])
|
|
266
307
|
: [];
|
|
267
308
|
const orderSet = new Set(profileOrder);
|
|
268
|
-
const
|
|
269
|
-
...Object.keys(ANTHROPIC_PROFILE_TEMPLATES),
|
|
270
|
-
...(isAnthropicDefault ? [] : Object.keys(CUSTOM_PROFILE_TEMPLATES)),
|
|
271
|
-
];
|
|
272
|
-
for (const name of seededOrder) {
|
|
309
|
+
for (const name of Object.keys(MANAGED_PROFILE_TEMPLATES)) {
|
|
273
310
|
if (!orderSet.has(name)) {
|
|
274
311
|
profileOrder.push(name);
|
|
275
312
|
orderSet.add(name);
|
|
276
313
|
}
|
|
277
314
|
}
|
|
315
|
+
if (userConnectionName) {
|
|
316
|
+
for (const name of Object.keys(USER_PROFILE_TEMPLATES)) {
|
|
317
|
+
if (!orderSet.has(name)) {
|
|
318
|
+
profileOrder.push(name);
|
|
319
|
+
orderSet.add(name);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
278
323
|
llm.profileOrder = profileOrder;
|
|
279
324
|
|
|
325
|
+
// Tag any remaining profiles without a source as user-created.
|
|
280
326
|
for (const [name, profile] of Object.entries(profiles)) {
|
|
281
327
|
if (MANAGED_PROFILE_NAMES.has(name)) continue;
|
|
282
328
|
if (
|
|
@@ -294,11 +340,13 @@ export function seedInferenceProfiles(
|
|
|
294
340
|
function materializeProfile(
|
|
295
341
|
template: ManagedProfileTemplate,
|
|
296
342
|
provider: NonNullable<ProfileEntry["provider"]>,
|
|
343
|
+
connectionName: string,
|
|
297
344
|
): ProfileEntry {
|
|
298
345
|
const { intent, ...rest } = template;
|
|
299
346
|
return {
|
|
300
347
|
...rest,
|
|
301
348
|
provider,
|
|
349
|
+
provider_connection: connectionName,
|
|
302
350
|
model: resolveModelIntent(provider, intent),
|
|
303
351
|
};
|
|
304
352
|
}
|
|
@@ -312,3 +360,16 @@ function readObject(value: unknown): Record<string, unknown> | null {
|
|
|
312
360
|
function readString(value: unknown): string | undefined {
|
|
313
361
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
314
362
|
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Format the human-readable label seeded onto a personal provider connection
|
|
366
|
+
* at hatch time, e.g. `"Anthropic (Personal)"`. The display name is sourced
|
|
367
|
+
* from `PROVIDER_CATALOG` so it tracks the canonical provider directory; an
|
|
368
|
+
* unrecognised provider id falls back to the raw id with the suffix.
|
|
369
|
+
*/
|
|
370
|
+
function personalConnectionLabel(providerId: string): string {
|
|
371
|
+
const displayName =
|
|
372
|
+
PROVIDER_CATALOG.find((p) => p.id === providerId)?.displayName ??
|
|
373
|
+
providerId;
|
|
374
|
+
return `${displayName} (Personal)`;
|
|
375
|
+
}
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
import { emitContactChange } from "./contact-events.js";
|
|
11
11
|
import type {
|
|
12
12
|
AssistantContactMetadata,
|
|
13
|
-
AssistantSpecies,
|
|
14
13
|
ChannelPolicy,
|
|
15
14
|
ChannelStatus,
|
|
16
15
|
Contact,
|
|
@@ -1013,66 +1012,6 @@ function parseAssistantMetadata(
|
|
|
1013
1012
|
} as AssistantContactMetadata;
|
|
1014
1013
|
}
|
|
1015
1014
|
|
|
1016
|
-
/**
|
|
1017
|
-
* Validate that metadata matches the expected shape for the given species.
|
|
1018
|
-
* Enforces the invariant that makes the discriminated union cast in
|
|
1019
|
-
* parseAssistantMetadata safe.
|
|
1020
|
-
*/
|
|
1021
|
-
export function validateSpeciesMetadata(
|
|
1022
|
-
species: AssistantSpecies,
|
|
1023
|
-
metadata: Record<string, unknown> | null | undefined,
|
|
1024
|
-
): void {
|
|
1025
|
-
if (metadata == null) return;
|
|
1026
|
-
|
|
1027
|
-
if (species === "vellum") {
|
|
1028
|
-
if (typeof metadata.assistantId !== "string" || !metadata.assistantId) {
|
|
1029
|
-
throw new Error(
|
|
1030
|
-
'Vellum assistant metadata requires a non-empty "assistantId" string',
|
|
1031
|
-
);
|
|
1032
|
-
}
|
|
1033
|
-
if (typeof metadata.gatewayUrl !== "string" || !metadata.gatewayUrl) {
|
|
1034
|
-
throw new Error(
|
|
1035
|
-
'Vellum assistant metadata requires a non-empty "gatewayUrl" string',
|
|
1036
|
-
);
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
|
|
1041
|
-
export function upsertAssistantContactMetadata(params: {
|
|
1042
|
-
contactId: string;
|
|
1043
|
-
species: AssistantSpecies;
|
|
1044
|
-
metadata?: Record<string, unknown> | null;
|
|
1045
|
-
}): AssistantContactMetadata {
|
|
1046
|
-
validateSpeciesMetadata(params.species, params.metadata);
|
|
1047
|
-
|
|
1048
|
-
const db = getDb();
|
|
1049
|
-
const metadataJson =
|
|
1050
|
-
params.metadata != null ? JSON.stringify(params.metadata) : null;
|
|
1051
|
-
|
|
1052
|
-
db.insert(assistantContactMetadata)
|
|
1053
|
-
.values({
|
|
1054
|
-
contactId: params.contactId,
|
|
1055
|
-
species: params.species,
|
|
1056
|
-
metadata: metadataJson,
|
|
1057
|
-
})
|
|
1058
|
-
.onConflictDoUpdate({
|
|
1059
|
-
target: assistantContactMetadata.contactId,
|
|
1060
|
-
set: {
|
|
1061
|
-
species: params.species,
|
|
1062
|
-
metadata: metadataJson,
|
|
1063
|
-
},
|
|
1064
|
-
})
|
|
1065
|
-
.run();
|
|
1066
|
-
|
|
1067
|
-
const row = db
|
|
1068
|
-
.select()
|
|
1069
|
-
.from(assistantContactMetadata)
|
|
1070
|
-
.where(eq(assistantContactMetadata.contactId, params.contactId))
|
|
1071
|
-
.get();
|
|
1072
|
-
|
|
1073
|
-
return parseAssistantMetadata(row!);
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
1015
|
export function getAssistantContactMetadata(
|
|
1077
1016
|
contactId: string,
|
|
1078
1017
|
): AssistantContactMetadata | null {
|