@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.
Files changed (778) hide show
  1. package/AGENTS.md +11 -0
  2. package/ARCHITECTURE.md +29 -28
  3. package/Dockerfile +6 -4
  4. package/README.md +2 -2
  5. package/__tests__/permissions/gateway-threshold-reader.test.ts +236 -9
  6. package/bun.lock +3 -0
  7. package/docker-entrypoint.sh +16 -0
  8. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
  9. package/eslint-rules/cli-no-daemon-internals.js +283 -0
  10. package/eslint.config.mjs +12 -0
  11. package/knip.json +3 -1
  12. package/node_modules/@vellumai/ipc-server-utils/bun.lock +24 -0
  13. package/node_modules/@vellumai/ipc-server-utils/package.json +18 -0
  14. package/node_modules/@vellumai/ipc-server-utils/src/index.ts +6 -0
  15. package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +430 -0
  16. package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +221 -0
  17. package/node_modules/@vellumai/ipc-server-utils/tsconfig.json +20 -0
  18. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
  19. package/openapi.yaml +4126 -959
  20. package/package.json +5 -1
  21. package/scripts/generate-openapi.ts +52 -4
  22. package/scripts/sync-llm-catalog.ts +165 -0
  23. package/scripts/sync-web-search-catalog.ts +107 -0
  24. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
  25. package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
  26. package/src/__tests__/annotate-risk-options.test.ts +291 -0
  27. package/src/__tests__/anthropic-provider.test.ts +92 -2
  28. package/src/__tests__/app-control-flow.test.ts +7 -0
  29. package/src/__tests__/approval-cascade.test.ts +8 -16
  30. package/src/__tests__/approval-routes-http.test.ts +6 -0
  31. package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
  32. package/src/__tests__/auto-analysis-end-to-end.test.ts +12 -25
  33. package/src/__tests__/avatar-identity-sync.test.ts +87 -0
  34. package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
  35. package/src/__tests__/btw-routes.test.ts +1 -0
  36. package/src/__tests__/call-constants.test.ts +10 -1
  37. package/src/__tests__/call-controller.test.ts +127 -0
  38. package/src/__tests__/call-site-routing-provider.test.ts +172 -45
  39. package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
  40. package/src/__tests__/channel-policy.test.ts +12 -0
  41. package/src/__tests__/checker.test.ts +89 -0
  42. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +88 -30
  43. package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
  44. package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
  45. package/src/__tests__/config-loader-backfill.test.ts +526 -102
  46. package/src/__tests__/config-loader-corrupt.test.ts +68 -0
  47. package/src/__tests__/config-loader-platform-defaults.test.ts +345 -8
  48. package/src/__tests__/config-schema-cmd.test.ts +63 -29
  49. package/src/__tests__/config-schema.test.ts +14 -3
  50. package/src/__tests__/config-set-platform-guard.test.ts +75 -152
  51. package/src/__tests__/config-set-route.test.ts +198 -0
  52. package/src/__tests__/config-watcher.test.ts +6 -0
  53. package/src/__tests__/contacts-tools.test.ts +51 -199
  54. package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
  55. package/src/__tests__/context-search-agent-runner.test.ts +22 -138
  56. package/src/__tests__/context-search-conversations-source.test.ts +42 -16
  57. package/src/__tests__/context-search-fanout.test.ts +20 -157
  58. package/src/__tests__/context-search-memory-source.test.ts +3 -26
  59. package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
  60. package/src/__tests__/context-search-types.test.ts +7 -2
  61. package/src/__tests__/context-window-manager.test.ts +389 -1
  62. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -6
  63. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
  64. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
  65. package/src/__tests__/conversation-agent-loop.test.ts +3 -3
  66. package/src/__tests__/conversation-confirmation-signals.test.ts +5 -13
  67. package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
  68. package/src/__tests__/conversation-error.test.ts +38 -0
  69. package/src/__tests__/conversation-fork-crud.test.ts +241 -1
  70. package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
  71. package/src/__tests__/conversation-init.benchmark.test.ts +2 -1
  72. package/src/__tests__/conversation-lifecycle.test.ts +124 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
  74. package/src/__tests__/conversation-process-callsite.test.ts +22 -7
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -6
  76. package/src/__tests__/conversation-runtime-assembly.test.ts +19 -10
  77. package/src/__tests__/conversation-slash-commands.test.ts +194 -2
  78. package/src/__tests__/conversation-slash-unknown.test.ts +1 -6
  79. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +170 -9
  80. package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
  81. package/src/__tests__/conversation-surfaces-data-persist.test.ts +73 -1
  82. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +59 -0
  83. package/src/__tests__/conversation-workspace-injection.test.ts +1 -7
  84. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -7
  85. package/src/__tests__/credential-security-invariants.test.ts +5 -6
  86. package/src/__tests__/daemon-credential-client.test.ts +56 -1
  87. package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
  88. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
  89. package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
  90. package/src/__tests__/db-proxy-transaction.test.ts +206 -0
  91. package/src/__tests__/external-plugin-loader.test.ts +458 -0
  92. package/src/__tests__/filing-service.test.ts +25 -22
  93. package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
  94. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  95. package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
  96. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +10 -34
  97. package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
  98. package/src/__tests__/heartbeat-service.test.ts +50 -233
  99. package/src/__tests__/history-repair.test.ts +89 -0
  100. package/src/__tests__/host-app-control-proxy.test.ts +109 -1
  101. package/src/__tests__/host-app-control-routes.test.ts +247 -1
  102. package/src/__tests__/host-browser-proxy.test.ts +416 -20
  103. package/src/__tests__/host-browser-routes.test.ts +325 -33
  104. package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
  105. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
  106. package/src/__tests__/inference-profile-reaper.test.ts +154 -0
  107. package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
  108. package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
  109. package/src/__tests__/injector-chain.test.ts +24 -16
  110. package/src/__tests__/injector-pkb-v2-silenced.test.ts +10 -7
  111. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
  112. package/src/__tests__/install-skill-routing.test.ts +2 -2
  113. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +169 -67
  114. package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
  115. package/src/__tests__/llm-catalog-parity.test.ts +146 -0
  116. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
  117. package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
  118. package/src/__tests__/llm-resolver.test.ts +46 -0
  119. package/src/__tests__/managed-profile-guard.test.ts +131 -2
  120. package/src/__tests__/mcp-auth-routes.test.ts +1 -0
  121. package/src/__tests__/mcp-cli.test.ts +182 -220
  122. package/src/__tests__/mcp-health-check.test.ts +56 -27
  123. package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
  124. package/src/__tests__/message-complete-display-id.test.ts +175 -0
  125. package/src/__tests__/notification-decision-fallback.test.ts +91 -0
  126. package/src/__tests__/notification-decision-strategy.test.ts +22 -0
  127. package/src/__tests__/notification-platform-adapter.test.ts +229 -0
  128. package/src/__tests__/oauth-cli.test.ts +38 -1888
  129. package/src/__tests__/oauth-commands-routes.test.ts +711 -0
  130. package/src/__tests__/oauth-connect-routes.test.ts +174 -11
  131. package/src/__tests__/oauth-providers-routes.test.ts +14 -10
  132. package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
  133. package/src/__tests__/openai-responses-provider.test.ts +17 -0
  134. package/src/__tests__/plugin-bootstrap.test.ts +31 -2
  135. package/src/__tests__/plugin-route-contribution.test.ts +31 -3
  136. package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
  137. package/src/__tests__/plugin-types.test.ts +13 -11
  138. package/src/__tests__/process-message-background-slack.test.ts +46 -0
  139. package/src/__tests__/profile-entry-status.test.ts +43 -0
  140. package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
  141. package/src/__tests__/provider-registry-ollama.test.ts +12 -4
  142. package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
  143. package/src/__tests__/relay-server.test.ts +164 -2
  144. package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
  145. package/src/__tests__/schedule-retry.test.ts +56 -4
  146. package/src/__tests__/schedule-routes.test.ts +104 -0
  147. package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
  148. package/src/__tests__/scheduler-recurrence.test.ts +87 -34
  149. package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
  150. package/src/__tests__/scheduler-wake.test.ts +0 -63
  151. package/src/__tests__/secret-allowlist.test.ts +1 -0
  152. package/src/__tests__/secret-prompt-log-hygiene.test.ts +7 -5
  153. package/src/__tests__/secret-prompter-channel-fallback.test.ts +7 -5
  154. package/src/__tests__/secret-response-routing.test.ts +7 -5
  155. package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
  156. package/src/__tests__/server-history-render.test.ts +82 -0
  157. package/src/__tests__/shell-credential-ref.test.ts +95 -3
  158. package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
  159. package/src/__tests__/skill-include-graph.test.ts +31 -0
  160. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  161. package/src/__tests__/skill-load-tool.test.ts +42 -16
  162. package/src/__tests__/skills.test.ts +39 -0
  163. package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
  164. package/src/__tests__/suggestion-routes.test.ts +3 -3
  165. package/src/__tests__/sync-message-contract.test.ts +63 -0
  166. package/src/__tests__/task-scheduler.test.ts +88 -23
  167. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -42
  168. package/src/__tests__/tool-executor.test.ts +155 -0
  169. package/src/__tests__/update-bulletin-job.test.ts +96 -193
  170. package/src/__tests__/usage-cli.test.ts +11 -73
  171. package/src/__tests__/user-plugin-loader.test.ts +145 -0
  172. package/src/__tests__/vercel-config.test.ts +168 -0
  173. package/src/__tests__/voice-session-bridge.test.ts +3 -0
  174. package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
  175. package/src/__tests__/web-search.test.ts +303 -2
  176. package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
  177. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
  178. package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +153 -0
  179. package/src/__tests__/workspace-migration-071-remove-safe-storage-release-note.test.ts +206 -0
  180. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
  181. package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
  182. package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
  183. package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
  184. package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
  185. package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
  186. package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
  187. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +15 -27
  188. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
  189. package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
  190. package/src/acp/__tests__/helpers/which-stub.ts +4 -2
  191. package/src/acp/resolve-agent.test.ts +25 -0
  192. package/src/acp/resolve-agent.ts +13 -2
  193. package/src/acp/session-manager.ts +14 -0
  194. package/src/agent/loop.ts +11 -0
  195. package/src/approvals/guardian-decision-primitive.ts +0 -13
  196. package/src/approvals/guardian-request-resolvers.ts +19 -102
  197. package/src/calls/call-constants.ts +5 -8
  198. package/src/calls/call-controller.ts +130 -67
  199. package/src/calls/relay-server.ts +42 -1
  200. package/src/calls/relay-setup-router.ts +36 -0
  201. package/src/calls/types.ts +1 -0
  202. package/src/calls/voice-session-bridge.ts +24 -5
  203. package/src/channels/config.ts +14 -1
  204. package/src/channels/types.ts +1 -0
  205. package/src/cli/AGENTS.md +164 -4
  206. package/src/cli/__tests__/notifications.test.ts +54 -0
  207. package/src/cli/commands/__tests__/avatar.test.ts +540 -0
  208. package/src/cli/commands/__tests__/backup.test.ts +236 -776
  209. package/src/cli/commands/__tests__/cache.test.ts +1 -1
  210. package/src/cli/commands/__tests__/changelog.test.ts +593 -0
  211. package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
  212. package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
  213. package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
  214. package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
  215. package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
  216. package/src/cli/commands/__tests__/email-core.test.ts +579 -0
  217. package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
  218. package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
  219. package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
  220. package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
  221. package/src/cli/commands/__tests__/skills.test.ts +563 -0
  222. package/src/cli/commands/__tests__/status.test.ts +249 -0
  223. package/src/cli/commands/__tests__/stt.test.ts +320 -0
  224. package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
  225. package/src/cli/commands/__tests__/tts.test.ts +321 -0
  226. package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
  227. package/src/cli/commands/attachment.ts +8 -3
  228. package/src/cli/commands/audit.ts +95 -64
  229. package/src/cli/commands/auth.ts +61 -58
  230. package/src/cli/commands/avatar.ts +276 -390
  231. package/src/cli/commands/backup.ts +409 -505
  232. package/src/cli/commands/bash.ts +9 -5
  233. package/src/cli/commands/browser.ts +28 -9
  234. package/src/cli/commands/cache.ts +9 -4
  235. package/src/cli/commands/changelog.ts +414 -0
  236. package/src/cli/commands/channel-verification-sessions.ts +238 -317
  237. package/src/cli/commands/clients.ts +8 -3
  238. package/src/cli/commands/completions.ts +9 -9
  239. package/src/cli/commands/config.ts +102 -72
  240. package/src/cli/commands/contacts.ts +575 -696
  241. package/src/cli/commands/conversations-defer.ts +17 -69
  242. package/src/cli/commands/conversations-import.ts +90 -253
  243. package/src/cli/commands/conversations.ts +346 -436
  244. package/src/cli/commands/credential-execution.ts +9 -6
  245. package/src/cli/commands/credentials.ts +456 -736
  246. package/src/cli/commands/domain.ts +128 -206
  247. package/src/cli/commands/email.ts +606 -794
  248. package/src/cli/commands/gateway.ts +8 -1
  249. package/src/cli/commands/image-generation.ts +157 -205
  250. package/src/cli/commands/inference-providers.ts +352 -0
  251. package/src/cli/commands/inference-session.ts +415 -0
  252. package/src/cli/commands/inference.ts +87 -65
  253. package/src/cli/commands/keys.ts +8 -3
  254. package/src/cli/commands/mcp.ts +103 -287
  255. package/src/cli/commands/memory-v2.ts +163 -517
  256. package/src/cli/commands/notifications.ts +33 -7
  257. package/src/cli/commands/oauth/apps.ts +292 -261
  258. package/src/cli/commands/oauth/connect.ts +182 -345
  259. package/src/cli/commands/oauth/disconnect.ts +16 -215
  260. package/src/cli/commands/oauth/index.ts +49 -45
  261. package/src/cli/commands/oauth/mode.ts +43 -199
  262. package/src/cli/commands/oauth/ping.ts +17 -125
  263. package/src/cli/commands/oauth/providers.ts +732 -921
  264. package/src/cli/commands/oauth/request.ts +60 -350
  265. package/src/cli/commands/oauth/shared.ts +11 -121
  266. package/src/cli/commands/oauth/status.ts +31 -121
  267. package/src/cli/commands/oauth/token.ts +13 -55
  268. package/src/cli/commands/pending.ts +19 -10
  269. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
  270. package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
  271. package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
  272. package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
  273. package/src/cli/commands/platform/connect.ts +16 -80
  274. package/src/cli/commands/platform/disconnect.ts +14 -112
  275. package/src/cli/commands/platform/index.ts +177 -246
  276. package/src/cli/commands/routes.ts +153 -336
  277. package/src/cli/commands/sequence.ts +316 -360
  278. package/src/cli/commands/skills.ts +449 -671
  279. package/src/cli/commands/status.ts +58 -37
  280. package/src/cli/commands/stt.ts +94 -262
  281. package/src/cli/commands/task.ts +14 -40
  282. package/src/cli/commands/trust.ts +8 -3
  283. package/src/cli/commands/tts.ts +162 -167
  284. package/src/cli/commands/ui.ts +35 -42
  285. package/src/cli/commands/usage.ts +188 -126
  286. package/src/cli/commands/watchers.ts +8 -3
  287. package/src/cli/commands/webhooks.ts +99 -193
  288. package/src/cli/lib/__tests__/register-command.test.ts +85 -0
  289. package/src/cli/lib/daemon-credential-client.ts +4 -5
  290. package/src/cli/lib/nested-value.ts +44 -0
  291. package/src/cli/lib/open-browser.ts +36 -0
  292. package/src/cli/lib/register-command.ts +19 -0
  293. package/src/cli/lib/time-ago.ts +34 -0
  294. package/src/cli/program.ts +2 -4
  295. package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
  296. package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
  297. package/src/cli/utils/conversation-id.ts +30 -0
  298. package/src/cli/utils/parse-duration.ts +41 -0
  299. package/src/config/acp-defaults.test.ts +5 -1
  300. package/src/config/acp-defaults.ts +11 -4
  301. package/src/config/bundled-skills/acp/TOOLS.json +2 -2
  302. package/src/config/bundled-skills/app-builder/SKILL.md +1 -3
  303. package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
  304. package/src/config/bundled-skills/contacts/SKILL.md +12 -45
  305. package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
  306. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
  308. package/src/config/bundled-tool-registry.ts +0 -2
  309. package/src/config/feature-flag-registry.json +17 -17
  310. package/src/config/llm-resolver.ts +16 -1
  311. package/src/config/loader.ts +148 -33
  312. package/src/config/raw-config-utils.ts +2 -30
  313. package/src/config/schema.ts +4 -0
  314. package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
  315. package/src/config/schemas/call-site-catalog.ts +29 -7
  316. package/src/config/schemas/llm-request-logs.ts +57 -0
  317. package/src/config/schemas/llm.ts +52 -2
  318. package/src/config/schemas/memory-retrospective.ts +48 -0
  319. package/src/config/schemas/memory-v2.ts +33 -2
  320. package/src/config/schemas/memory.ts +4 -0
  321. package/src/config/schemas/services.ts +15 -12
  322. package/src/config/seed-inference-profiles.ts +195 -134
  323. package/src/contacts/contact-store.ts +0 -61
  324. package/src/context/window-manager.ts +191 -5
  325. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +111 -0
  326. package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
  327. package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
  328. package/src/daemon/approval-generators.ts +23 -29
  329. package/src/daemon/config-watcher.ts +2 -0
  330. package/src/daemon/conversation-agent-loop-handlers.ts +56 -0
  331. package/src/daemon/conversation-agent-loop.ts +140 -107
  332. package/src/daemon/conversation-error.ts +21 -0
  333. package/src/daemon/conversation-lifecycle.ts +68 -13
  334. package/src/daemon/conversation-process.ts +36 -19
  335. package/src/daemon/conversation-runtime-assembly.ts +14 -5
  336. package/src/daemon/conversation-slash.ts +175 -23
  337. package/src/daemon/conversation-store.ts +17 -10
  338. package/src/daemon/conversation-surfaces.ts +92 -26
  339. package/src/daemon/conversation-tool-setup.ts +33 -19
  340. package/src/daemon/conversation.ts +49 -10
  341. package/src/daemon/external-plugins-bootstrap.ts +18 -8
  342. package/src/daemon/guardian-action-generators.ts +7 -22
  343. package/src/daemon/handlers/config-model.ts +8 -126
  344. package/src/daemon/handlers/config-slack-channel.ts +10 -7
  345. package/src/daemon/handlers/config-vercel.ts +3 -1
  346. package/src/daemon/handlers/shared.ts +26 -0
  347. package/src/daemon/handlers/skills.ts +84 -5
  348. package/src/daemon/history-repair.ts +33 -6
  349. package/src/daemon/host-app-control-proxy.ts +44 -19
  350. package/src/daemon/host-bash-proxy.ts +85 -158
  351. package/src/daemon/host-browser-proxy.ts +97 -36
  352. package/src/daemon/host-cu-proxy.ts +1 -1
  353. package/src/daemon/host-file-proxy.ts +1 -1
  354. package/src/daemon/host-proxy-base.ts +13 -1
  355. package/src/daemon/host-proxy-preactivation.ts +25 -1
  356. package/src/daemon/host-transfer-proxy.ts +2 -2
  357. package/src/daemon/identity-helpers.ts +19 -0
  358. package/src/daemon/lifecycle.ts +128 -114
  359. package/src/daemon/meet-host-supervisor.ts +15 -15
  360. package/src/daemon/memory-v2-startup.ts +62 -14
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/bookmarks.ts +18 -0
  363. package/src/daemon/message-types/conversations.ts +12 -9
  364. package/src/daemon/message-types/messages.ts +28 -2
  365. package/src/daemon/message-types/sync.ts +60 -0
  366. package/src/daemon/pkb-reminder-builder.test.ts +54 -13
  367. package/src/daemon/pkb-reminder-builder.ts +21 -7
  368. package/src/daemon/process-message.ts +56 -23
  369. package/src/daemon/server.ts +23 -18
  370. package/src/daemon/shutdown-handlers.ts +0 -2
  371. package/src/daemon/tool-setup-types.ts +9 -0
  372. package/src/daemon/tool-side-effects.ts +6 -4
  373. package/src/daemon/wake-target-adapter.ts +11 -0
  374. package/src/documents/document-store.ts +35 -1
  375. package/src/export/transcript-formatter.ts +61 -2
  376. package/src/filing/filing-service.ts +42 -56
  377. package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
  378. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  379. package/src/heartbeat/heartbeat-service.ts +149 -128
  380. package/src/home/__tests__/feed-types.test.ts +63 -131
  381. package/src/home/__tests__/feed-writer.test.ts +77 -278
  382. package/src/home/__tests__/post-connect-feed.test.ts +9 -12
  383. package/src/home/feed-types.ts +19 -73
  384. package/src/home/feed-writer.ts +25 -156
  385. package/src/home/post-connect-feed.ts +1 -3
  386. package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
  387. package/src/ipc/__tests__/email-ipc.test.ts +506 -0
  388. package/src/ipc/__tests__/exit-helper.test.ts +104 -0
  389. package/src/ipc/__tests__/streaming-client.test.ts +237 -0
  390. package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
  391. package/src/ipc/assistant-server.ts +148 -42
  392. package/src/ipc/cli-client.ts +370 -50
  393. package/src/ipc/routes/db-proxy-transaction.ts +151 -0
  394. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
  395. package/src/ipc/skill-routes/events.ts +30 -3
  396. package/src/ipc/skill-server.ts +99 -42
  397. package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
  398. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
  399. package/src/live-voice/live-voice-session-manager.ts +11 -4
  400. package/src/live-voice/live-voice-session.ts +14 -6
  401. package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
  402. package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
  403. package/src/memory/__tests__/conversation-types.test.ts +36 -0
  404. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
  405. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +10 -57
  406. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
  407. package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
  408. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
  409. package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
  412. package/src/memory/bookmark-crud.ts +179 -0
  413. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
  414. package/src/memory/context-search/agent-protocol.ts +5 -1
  415. package/src/memory/context-search/agent-runner.ts +60 -85
  416. package/src/memory/context-search/limits.ts +1 -4
  417. package/src/memory/context-search/search.ts +23 -113
  418. package/src/memory/context-search/sources/conversations.ts +18 -6
  419. package/src/memory/context-search/sources/memory-v2.ts +40 -31
  420. package/src/memory/context-search/sources/memory.ts +9 -2
  421. package/src/memory/context-search/sources/workspace.ts +13 -10
  422. package/src/memory/context-search/types.ts +1 -1
  423. package/src/memory/conversation-bootstrap.ts +11 -0
  424. package/src/memory/conversation-crud.ts +312 -10
  425. package/src/memory/conversation-queries.ts +9 -5
  426. package/src/memory/conversation-title-service.ts +1 -0
  427. package/src/memory/conversation-types.ts +16 -0
  428. package/src/memory/db-init.ts +14 -0
  429. package/src/memory/embedding-backend.ts +2 -1
  430. package/src/memory/embedding-runtime-manager.ts +1 -2
  431. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +104 -61
  432. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +11 -26
  433. package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
  434. package/src/memory/graph/conversation-graph-memory.ts +108 -14
  435. package/src/memory/graph/extraction.ts +4 -0
  436. package/src/memory/graph/graph-memory-state-store.ts +16 -3
  437. package/src/memory/graph/graph-search.test.ts +6 -5
  438. package/src/memory/graph/graph-search.ts +3 -4
  439. package/src/memory/graph/retriever.test.ts +12 -7
  440. package/src/memory/graph/retriever.ts +4 -5
  441. package/src/memory/graph/tool-handlers.ts +20 -11
  442. package/src/memory/graph/tools.ts +48 -9
  443. package/src/memory/indexer.ts +18 -2
  444. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +120 -6
  445. package/src/memory/jobs/embed-concept-page.ts +261 -89
  446. package/src/memory/jobs-store.ts +51 -1
  447. package/src/memory/jobs-worker.ts +60 -7
  448. package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
  449. package/src/memory/llm-request-log-source-local.ts +26 -0
  450. package/src/memory/llm-request-log-source.ts +97 -0
  451. package/src/memory/llm-request-log-store.ts +1 -1
  452. package/src/memory/memory-retrospective-constants.ts +13 -0
  453. package/src/memory/memory-retrospective-enqueue.ts +114 -0
  454. package/src/memory/memory-retrospective-job.ts +351 -0
  455. package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
  456. package/src/memory/memory-retrospective-state.ts +162 -0
  457. package/src/memory/memory-retrospective-trigger-check.ts +91 -0
  458. package/src/memory/memory-v2-activation-log-store.ts +49 -5
  459. package/src/memory/memory-v2-concept-frequency.ts +4 -0
  460. package/src/memory/message-content.ts +38 -1
  461. package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
  462. package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
  463. package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
  464. package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
  465. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
  466. package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
  467. package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
  468. package/src/memory/migrations/242-message-bookmarks.ts +38 -0
  469. package/src/memory/migrations/243-provider-connections.ts +68 -0
  470. package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
  471. package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
  472. package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
  473. package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
  474. package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
  475. package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
  476. package/src/memory/migrations/index.ts +7 -0
  477. package/src/memory/pkb/pkb-search.test.ts +6 -5
  478. package/src/memory/pkb/pkb-search.ts +4 -5
  479. package/src/memory/published-pages-store.ts +16 -0
  480. package/src/memory/qdrant-client.ts +3 -0
  481. package/src/memory/schema/bookmarks.ts +38 -0
  482. package/src/memory/schema/conversations.ts +2 -0
  483. package/src/memory/schema/index.ts +2 -0
  484. package/src/memory/schema/inference.ts +29 -0
  485. package/src/memory/schema/memory-core.ts +9 -0
  486. package/src/memory/search/semantic.ts +5 -9
  487. package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
  488. package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
  489. package/src/memory/v2/__tests__/activation.test.ts +46 -9
  490. package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
  491. package/src/memory/v2/__tests__/consolidation-job.test.ts +140 -163
  492. package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
  493. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
  494. package/src/memory/v2/__tests__/injection.test.ts +768 -33
  495. package/src/memory/v2/__tests__/migration.test.ts +7 -3
  496. package/src/memory/v2/__tests__/page-index.test.ts +277 -0
  497. package/src/memory/v2/__tests__/page-store.test.ts +14 -1
  498. package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
  499. package/src/memory/v2/__tests__/qdrant.test.ts +382 -9
  500. package/src/memory/v2/__tests__/reranker.test.ts +4 -4
  501. package/src/memory/v2/__tests__/router.test.ts +516 -0
  502. package/src/memory/v2/__tests__/sim.test.ts +163 -8
  503. package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
  504. package/src/memory/v2/__tests__/static-context.test.ts +8 -35
  505. package/src/memory/v2/__tests__/sweep-job.test.ts +114 -33
  506. package/src/memory/v2/activation-store.ts +34 -5
  507. package/src/memory/v2/activation.ts +40 -27
  508. package/src/memory/v2/backfill-jobs.ts +17 -84
  509. package/src/memory/v2/consolidation-job.ts +92 -86
  510. package/src/memory/v2/frontmatter-sweep.ts +91 -0
  511. package/src/memory/v2/injection.ts +466 -115
  512. package/src/memory/v2/migration.ts +117 -20
  513. package/src/memory/v2/page-index.ts +191 -0
  514. package/src/memory/v2/page-store.ts +42 -0
  515. package/src/memory/v2/prompts/consolidation.ts +14 -7
  516. package/src/memory/v2/prompts/router.ts +192 -0
  517. package/src/memory/v2/qdrant.ts +307 -133
  518. package/src/memory/v2/reranker.ts +14 -7
  519. package/src/memory/v2/router.ts +322 -0
  520. package/src/memory/v2/sim.ts +88 -34
  521. package/src/memory/v2/skill-store.ts +118 -29
  522. package/src/memory/v2/static-context.ts +20 -17
  523. package/src/memory/v2/sweep-job.ts +127 -102
  524. package/src/memory/v2/types.ts +16 -5
  525. package/src/memory/validation.ts +13 -0
  526. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
  527. package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
  528. package/src/notifications/__tests__/signal-registry.test.ts +17 -0
  529. package/src/notifications/adapters/platform.ts +171 -0
  530. package/src/notifications/conversation-pairing.ts +2 -2
  531. package/src/notifications/copy-composer.ts +61 -12
  532. package/src/notifications/decision-engine.ts +46 -0
  533. package/src/notifications/destination-resolver.ts +21 -0
  534. package/src/notifications/emit-signal.ts +28 -1
  535. package/src/notifications/home-feed-side-effect.ts +111 -0
  536. package/src/notifications/signal.ts +5 -0
  537. package/src/permissions/checker.ts +12 -0
  538. package/src/permissions/gateway-threshold-reader.ts +116 -8
  539. package/src/permissions/ipc-risk-types.ts +2 -0
  540. package/src/permissions/prompter.ts +86 -96
  541. package/src/permissions/secret-prompter.ts +31 -31
  542. package/src/plugin-api/index.ts +13 -0
  543. package/src/plugin-api/package.json +12 -0
  544. package/src/plugin-api/types.ts +62 -0
  545. package/src/plugins/defaults/injectors.ts +20 -5
  546. package/src/plugins/external-plugin-loader.ts +294 -0
  547. package/src/plugins/types.ts +46 -30
  548. package/src/plugins/user-loader.ts +64 -41
  549. package/src/proactive-artifact/job.test.ts +63 -8
  550. package/src/proactive-artifact/job.ts +20 -2
  551. package/src/proactive-artifact/message-copy.ts +18 -1
  552. package/src/proactive-artifact/trigger-state.test.ts +9 -0
  553. package/src/proactive-artifact/trigger-state.ts +4 -0
  554. package/src/prompts/__tests__/system-prompt.test.ts +105 -0
  555. package/src/prompts/system-prompt.ts +22 -1
  556. package/src/prompts/templates/SOUL.md +13 -28
  557. package/src/prompts/update-bulletin-job.ts +61 -73
  558. package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
  559. package/src/providers/__tests__/inference.test.ts +288 -0
  560. package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
  561. package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
  562. package/src/providers/__tests__/retry-callsite.test.ts +14 -32
  563. package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
  564. package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
  565. package/src/providers/anthropic/client.ts +95 -26
  566. package/src/providers/call-site-routing.ts +94 -16
  567. package/src/providers/connection-resolution.ts +163 -0
  568. package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
  569. package/src/providers/inference/adapter-factory.ts +173 -0
  570. package/src/providers/inference/auth.ts +112 -0
  571. package/src/providers/inference/backfill.ts +196 -0
  572. package/src/providers/inference/connections.ts +356 -0
  573. package/src/providers/inference/resolve-auth.ts +65 -0
  574. package/src/providers/model-catalog.ts +104 -6
  575. package/src/providers/openai/responses-provider.ts +4 -2
  576. package/src/providers/provider-env-vars.ts +17 -7
  577. package/src/providers/provider-secret-catalog.ts +49 -30
  578. package/src/providers/provider-send-message.ts +41 -20
  579. package/src/providers/registry.ts +143 -159
  580. package/src/providers/retry.ts +18 -10
  581. package/src/providers/search-provider-catalog.ts +121 -0
  582. package/src/runtime/AGENTS.md +18 -5
  583. package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
  584. package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
  585. package/src/runtime/actor-trust-resolver.ts +32 -10
  586. package/src/runtime/agent-wake.ts +35 -6
  587. package/src/runtime/assistant-event-hub.ts +3 -85
  588. package/src/runtime/auth/route-policy.ts +304 -8
  589. package/src/runtime/auth/same-actor.ts +2 -0
  590. package/src/runtime/background-job-runner.ts +339 -0
  591. package/src/runtime/btw-sidechain.ts +1 -0
  592. package/src/runtime/channel-approvals.ts +3 -2
  593. package/src/runtime/guardian-reply-router.ts +0 -10
  594. package/src/runtime/http-router.ts +36 -1
  595. package/src/runtime/http-server.ts +31 -5
  596. package/src/runtime/http-types.ts +2 -0
  597. package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
  598. package/src/runtime/middleware/request-logger.ts +62 -1
  599. package/src/runtime/pending-interactions.ts +19 -15
  600. package/src/runtime/pre-first-message-gate.ts +83 -0
  601. package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
  602. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
  603. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
  604. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
  605. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
  606. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
  607. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
  608. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +147 -0
  609. package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
  610. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
  611. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  612. package/src/runtime/routes/acp-routes.ts +10 -8
  613. package/src/runtime/routes/app-management-routes.ts +228 -3
  614. package/src/runtime/routes/approval-routes.ts +7 -21
  615. package/src/runtime/routes/audit-routes.ts +43 -0
  616. package/src/runtime/routes/auth-routes.ts +72 -0
  617. package/src/runtime/routes/avatar-routes.ts +273 -20
  618. package/src/runtime/routes/backup-routes.ts +406 -2
  619. package/src/runtime/routes/bookmark-routes.ts +154 -0
  620. package/src/runtime/routes/channel-verification-routes.ts +2 -1
  621. package/src/runtime/routes/consolidation-routes.ts +8 -9
  622. package/src/runtime/routes/contact-routes.ts +0 -160
  623. package/src/runtime/routes/conversation-cli-routes.ts +192 -0
  624. package/src/runtime/routes/conversation-management-routes.ts +30 -43
  625. package/src/runtime/routes/conversation-query-routes.ts +373 -82
  626. package/src/runtime/routes/conversation-routes.ts +31 -10
  627. package/src/runtime/routes/conversations-import-routes.ts +229 -0
  628. package/src/runtime/routes/credential-routes.ts +540 -0
  629. package/src/runtime/routes/debug-bash-routes.ts +2 -0
  630. package/src/runtime/routes/debug-routes.ts +2 -2
  631. package/src/runtime/routes/document-pdf-renderer.ts +5 -1
  632. package/src/runtime/routes/domain-routes.ts +167 -0
  633. package/src/runtime/routes/email-routes.ts +603 -0
  634. package/src/runtime/routes/errors.ts +2 -2
  635. package/src/runtime/routes/events-routes.ts +192 -0
  636. package/src/runtime/routes/filing-routes.ts +2 -3
  637. package/src/runtime/routes/home-feed-routes.ts +6 -78
  638. package/src/runtime/routes/host-app-control-routes.ts +44 -2
  639. package/src/runtime/routes/host-browser-routes.ts +103 -22
  640. package/src/runtime/routes/http-adapter.ts +2 -0
  641. package/src/runtime/routes/identity-routes.ts +5 -0
  642. package/src/runtime/routes/image-generation-routes.ts +99 -0
  643. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
  644. package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
  645. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
  646. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -7
  647. package/src/runtime/routes/index.ts +36 -0
  648. package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
  649. package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
  650. package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
  651. package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
  652. package/src/runtime/routes/inference-send-routes.ts +115 -0
  653. package/src/runtime/routes/integrations/twilio.ts +1 -0
  654. package/src/runtime/routes/mcp-auth-routes.ts +283 -9
  655. package/src/runtime/routes/memory-item-routes.test.ts +3 -9
  656. package/src/runtime/routes/memory-item-routes.ts +5 -6
  657. package/src/runtime/routes/memory-v2-routes.ts +105 -404
  658. package/src/runtime/routes/notification-routes.ts +2 -0
  659. package/src/runtime/routes/oauth-apps.ts +112 -7
  660. package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
  661. package/src/runtime/routes/oauth-connect-routes.ts +67 -5
  662. package/src/runtime/routes/oauth-providers.ts +298 -8
  663. package/src/runtime/routes/platform-routes.ts +336 -0
  664. package/src/runtime/routes/playground/inject-failures.ts +2 -1
  665. package/src/runtime/routes/playground/reset-circuit.ts +2 -1
  666. package/src/runtime/routes/playground/state.ts +2 -1
  667. package/src/runtime/routes/publish-routes.ts +221 -0
  668. package/src/runtime/routes/schedule-routes.ts +82 -0
  669. package/src/runtime/routes/sequence-routes.ts +291 -0
  670. package/src/runtime/routes/settings-routes.ts +2 -10
  671. package/src/runtime/routes/skills-routes.ts +31 -1
  672. package/src/runtime/routes/stt-routes.ts +240 -3
  673. package/src/runtime/routes/surface-action-routes.ts +43 -7
  674. package/src/runtime/routes/tts-routes.ts +67 -0
  675. package/src/runtime/routes/types.ts +32 -0
  676. package/src/runtime/routes/user-routes-cli.ts +243 -0
  677. package/src/runtime/routes/webhook-routes.ts +165 -0
  678. package/src/runtime/sync/resource-sync-events.ts +25 -0
  679. package/src/runtime/sync/sync-publisher.test.ts +105 -0
  680. package/src/runtime/sync/sync-publisher.ts +21 -0
  681. package/src/schedule/scheduler.ts +200 -123
  682. package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
  683. package/src/security/secret-patterns.ts +3 -0
  684. package/src/sequence/engine.ts +38 -40
  685. package/src/skills/include-graph.ts +35 -13
  686. package/src/subagent/manager.ts +20 -15
  687. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
  688. package/src/tools/browser/browser-execution.ts +15 -4
  689. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
  690. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
  691. package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
  692. package/src/tools/browser/cdp-client/factory.ts +66 -5
  693. package/src/tools/browser/runtime-check.ts +77 -0
  694. package/src/tools/document/document-tool.ts +20 -0
  695. package/src/tools/executor.ts +18 -2
  696. package/src/tools/memory/register.test.ts +10 -8
  697. package/src/tools/memory/register.ts +9 -1
  698. package/src/tools/network/__tests__/web-search.test.ts +156 -0
  699. package/src/tools/network/web-search.ts +280 -37
  700. package/src/tools/permission-checker.ts +28 -5
  701. package/src/tools/skills/load.ts +24 -20
  702. package/src/tools/subagent/spawn.ts +3 -3
  703. package/src/tools/terminal/shell.ts +44 -0
  704. package/src/tools/tool-name-aliases.ts +19 -0
  705. package/src/tools/types.ts +19 -1
  706. package/src/usage/attribution.ts +3 -2
  707. package/src/util/pricing.ts +86 -160
  708. package/src/watcher/__tests__/engine.test.ts +301 -0
  709. package/src/watcher/constants.ts +7 -0
  710. package/src/watcher/engine.ts +90 -90
  711. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
  712. package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
  713. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
  714. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +4 -62
  715. package/src/workspace/migrations/069-seed-onboarding-threads.ts +34 -0
  716. package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +31 -0
  717. package/src/workspace/migrations/071-remove-safe-storage-release-note.ts +111 -0
  718. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
  719. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
  720. package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
  721. package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
  722. package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
  723. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
  724. package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
  725. package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
  726. package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
  727. package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
  728. package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
  729. package/src/workspace/migrations/registry.ts +28 -0
  730. package/src/workspace/migrations/runner.ts +13 -2
  731. package/src/workspace/migrations/types.ts +13 -3
  732. package/src/workspace/provider-commit-message-generator.ts +3 -2
  733. package/src/__tests__/context-search-pkb-source.test.ts +0 -492
  734. package/src/__tests__/credentials-cli.test.ts +0 -1225
  735. package/src/__tests__/memory-admin-recall.test.ts +0 -213
  736. package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
  737. package/src/cli/commands/__tests__/email-download.test.ts +0 -260
  738. package/src/cli/commands/__tests__/email-list.test.ts +0 -216
  739. package/src/cli/commands/__tests__/email-register.test.ts +0 -186
  740. package/src/cli/commands/__tests__/email-send.test.ts +0 -416
  741. package/src/cli/commands/__tests__/email-status.test.ts +0 -185
  742. package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
  743. package/src/cli/commands/__tests__/routes.test.ts +0 -562
  744. package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
  745. package/src/cli/commands/autonomy.ts +0 -365
  746. package/src/cli/commands/memory.ts +0 -424
  747. package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -1201
  748. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
  749. package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
  750. package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
  751. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
  752. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
  753. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
  754. package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
  755. package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
  756. package/src/cli/lib/daemon-avatar-client.ts +0 -37
  757. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
  758. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
  759. package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
  760. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
  761. package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
  762. package/src/home/__tests__/emit-feed-event.test.ts +0 -169
  763. package/src/home/__tests__/feed-population-integration.test.ts +0 -312
  764. package/src/home/__tests__/feed-scheduler.test.ts +0 -222
  765. package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
  766. package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
  767. package/src/home/__tests__/rollup-producer.test.ts +0 -507
  768. package/src/home/assistant-feed-authoring.ts +0 -135
  769. package/src/home/emit-feed-event.ts +0 -169
  770. package/src/home/feed-scheduler.ts +0 -281
  771. package/src/home/platform-gmail-digest.ts +0 -163
  772. package/src/home/rewrite-command-preview.ts +0 -66
  773. package/src/home/rewrite-feed-title.ts +0 -58
  774. package/src/home/rollup-producer.ts +0 -426
  775. package/src/memory/admin.ts +0 -326
  776. package/src/memory/context-search/sources/pkb.ts +0 -477
  777. package/src/memory/graph/compaction.ts +0 -299
  778. /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
@@ -1159,6 +1159,7 @@ export async function handleSurfaceAction(
1159
1159
  summary,
1160
1160
  submittedData: data,
1161
1161
  });
1162
+ markSurfaceCompleted(ctx, surfaceId, summary);
1162
1163
 
1163
1164
  // Cleanup and resolve — order matters: cleanup clears the timer
1164
1165
  // before resolve() unblocks the caller.
@@ -1505,20 +1506,6 @@ export async function handleSurfaceAction(
1505
1506
  surfaceData,
1506
1507
  );
1507
1508
 
1508
- // Forms are one-shot surfaces — auto-complete immediately so the client
1509
- // transitions from the "Submitting…" spinner to a completion chip without
1510
- // requiring the LLM to call ui_dismiss.
1511
- if (pending.surfaceType === "form") {
1512
- broadcastMessage({
1513
- type: "ui_surface_complete",
1514
- conversationId: ctx.conversationId,
1515
- surfaceId,
1516
- summary,
1517
- submittedData: mergedData,
1518
- });
1519
- markSurfaceCompleted(ctx, surfaceId, summary);
1520
- }
1521
-
1522
1509
  // Extract file attachments from action data so they are sent as proper
1523
1510
  // image/file content blocks instead of dumping base64 into the text.
1524
1511
  let pendingAttachments: UserMessageAttachment[] = [];
@@ -1648,6 +1635,21 @@ export async function handleSurfaceAction(
1648
1635
  return;
1649
1636
  }
1650
1637
 
1638
+ // One-shot interactive surfaces — auto-complete now that the message has
1639
+ // been accepted. Deferred until after rejection check so the surface stays
1640
+ // active and retryable if the queue was full.
1641
+ const ONE_SHOT_SURFACE_TYPES = ["form", "confirmation", "file_upload"];
1642
+ if (ONE_SHOT_SURFACE_TYPES.includes(pending.surfaceType)) {
1643
+ broadcastMessage({
1644
+ type: "ui_surface_complete",
1645
+ conversationId: ctx.conversationId,
1646
+ surfaceId,
1647
+ summary,
1648
+ submittedData: mergedDataForText,
1649
+ });
1650
+ markSurfaceCompleted(ctx, surfaceId, summary);
1651
+ }
1652
+
1651
1653
  // One-shot: clear accumulated state now that the message has been accepted.
1652
1654
  // Deferred until after rejection check so state is preserved for retry on rejection.
1653
1655
  if (accumulatedState && Object.keys(accumulatedState).length > 0) {
@@ -2021,14 +2023,6 @@ export async function surfaceProxyResolver(
2021
2023
 
2022
2024
  // Route app-control proxy tools (all app_control_* tool variants)
2023
2025
  if (toolName.startsWith("app_control_")) {
2024
- if (!ctx.hostAppControlProxy || !ctx.hostAppControlProxy.isAvailable()) {
2025
- return {
2026
- content:
2027
- "App control is not available — enable the `app-control` feature flag and connect a macOS client.",
2028
- isError: true,
2029
- };
2030
- }
2031
-
2032
2026
  // `app_control_stop` resolves immediately: tear down the proxy without
2033
2027
  // a client round-trip. Mirrors CU's terminal-tool short-circuit
2034
2028
  // (`computer_use_done` / `computer_use_respond`). Clear the
@@ -2037,15 +2031,85 @@ export async function surfaceProxyResolver(
2037
2031
  // instead of dispatching against a torn-down proxy, and so a sibling
2038
2032
  // conversation can acquire the released singleton lock without the
2039
2033
  // disposed proxy still being addressable.
2034
+ //
2035
+ // Run this BEFORE the isAvailable() gate so a disconnected client
2036
+ // doesn't strand the singleton lock — stop is local-only.
2040
2037
  if (toolName === "app_control_stop") {
2041
- if (ctx.setHostAppControlProxy) {
2042
- ctx.setHostAppControlProxy(undefined);
2043
- } else {
2044
- ctx.hostAppControlProxy.dispose();
2038
+ if (ctx.hostAppControlProxy) {
2039
+ if (ctx.setHostAppControlProxy) {
2040
+ ctx.setHostAppControlProxy(undefined);
2041
+ } else {
2042
+ ctx.hostAppControlProxy.dispose();
2043
+ }
2045
2044
  }
2046
2045
  return { content: "App control stopped.", isError: false };
2047
2046
  }
2048
2047
 
2048
+ if (!ctx.hostAppControlProxy || !ctx.hostAppControlProxy.isAvailable()) {
2049
+ return {
2050
+ content:
2051
+ "App control is not available — enable the `app-control` feature flag and connect a macOS client.",
2052
+ isError: true,
2053
+ };
2054
+ }
2055
+
2056
+ // Resolve target client. Mirrors the host_cu block above: validate
2057
+ // explicit target_client_id (existence, capability, same-actor), then
2058
+ // multi-client guard when no target is supplied. App-control is
2059
+ // single-client-only at the host (one active session per macOS
2060
+ // machine), so a broadcast across multiple capable clients would fire
2061
+ // the same input on every machine.
2062
+ let targetClientId: string | undefined =
2063
+ typeof input.target_client_id === "string" &&
2064
+ input.target_client_id !== ""
2065
+ ? input.target_client_id
2066
+ : undefined;
2067
+
2068
+ const sourceActorPrincipalId = ctx.trustContext?.guardianPrincipalId;
2069
+ if (targetClientId != null) {
2070
+ const client = assistantEventHub.getClientById(targetClientId);
2071
+ if (!client) {
2072
+ return {
2073
+ content: `No connected client with id '${targetClientId}'. Run \`assistant clients list --capability host_app_control\` to see available clients.`,
2074
+ isError: true,
2075
+ };
2076
+ }
2077
+ if (!client.capabilities.includes("host_app_control")) {
2078
+ return {
2079
+ content: `Client '${targetClientId}' does not support host_app_control. Run \`assistant clients list --capability host_app_control\` to see available clients.`,
2080
+ isError: true,
2081
+ };
2082
+ }
2083
+ const rejection = enforceSameActorOrErrorResult({
2084
+ hub: assistantEventHub,
2085
+ sourceActorPrincipalId,
2086
+ targetClientId,
2087
+ op: "host_app_control",
2088
+ });
2089
+ if (rejection) return rejection;
2090
+ }
2091
+
2092
+ if (targetClientId == null) {
2093
+ const allAcClients =
2094
+ assistantEventHub.listClientsByCapability("host_app_control");
2095
+ const sameUserAcClients = allAcClients.filter(
2096
+ (c) => c.actorPrincipalId === sourceActorPrincipalId,
2097
+ );
2098
+ if (sameUserAcClients.length > 1) {
2099
+ return {
2100
+ content: `Error: multiple clients support host_app_control. Specify which client to target with \`target_client_id\`. Run \`assistant clients list --capability host_app_control\` to see client IDs and labels.`,
2101
+ isError: true,
2102
+ };
2103
+ }
2104
+ // When cross-user host_app_control clients are connected, auto-
2105
+ // resolve to the unique same-user client. Otherwise the proxy would
2106
+ // dispatch untargeted and the action could reach a cross-user
2107
+ // client. Belt-and-suspenders: the proxy re-checks same-user.
2108
+ if (sameUserAcClients.length === 1 && allAcClients.length > 1) {
2109
+ targetClientId = sameUserAcClients[0].clientId;
2110
+ }
2111
+ }
2112
+
2049
2113
  // The TS `HostAppControlInput` (and the Swift mirror) is a discriminated
2050
2114
  // union on `tool` ("start" | "observe" | "press" | …). The agent's raw
2051
2115
  // tool input only carries the action-specific payload (app, x/y, text,
@@ -2064,6 +2128,8 @@ export async function surfaceProxyResolver(
2064
2128
  inputWithTool,
2065
2129
  ctx.conversationId,
2066
2130
  signal ?? new AbortController().signal,
2131
+ sourceActorPrincipalId,
2132
+ targetClientId,
2067
2133
  );
2068
2134
  }
2069
2135
 
@@ -30,6 +30,7 @@ import {
30
30
  ACTIVITY_SKIP_SET,
31
31
  injectActivityField,
32
32
  } from "../tools/schema-transforms.js";
33
+ import { resolveToolNameAlias } from "../tools/tool-name-aliases.js";
33
34
  import {
34
35
  isDiskPressureCleanupToolName,
35
36
  type ProxyApprovalCallback,
@@ -122,7 +123,9 @@ export function createToolExecutor(
122
123
  toolUseId?: string,
123
124
  turnContext?: import("../plugins/types.js").TurnContext,
124
125
  ) => {
125
- if (isDoordashCommand(name, input)) {
126
+ const executionName = resolveToolNameAlias(name, ctx.allowedToolNames);
127
+
128
+ if (isDoordashCommand(executionName, input)) {
126
129
  markDoordashStepInProgress(ctx, input);
127
130
  }
128
131
 
@@ -153,6 +156,7 @@ export function createToolExecutor(
153
156
  onOutput,
154
157
  signal: ctx.abortController?.signal,
155
158
  allowedToolNames: ctx.allowedToolNames,
159
+ forcePromptSideEffects: ctx.forcePromptSideEffects,
156
160
  diskPressureCleanupModeActive: ctx.diskPressureCleanupModeActive,
157
161
  toolUseId,
158
162
  isPlatformHosted: getIsPlatform(),
@@ -208,8 +212,9 @@ export function createToolExecutor(
208
212
  // route through the full executor pipeline so the underlying tool's
209
213
  // risk level, permission checks, hooks, and lifecycle events all fire
210
214
  // with the real tool name.
211
- if (name === "skill_execute") {
212
- const toolName = typeof input.tool === "string" ? input.tool : "";
215
+ if (executionName === "skill_execute") {
216
+ const rawToolName = typeof input.tool === "string" ? input.tool : "";
217
+ const toolName = resolveToolNameAlias(rawToolName, ctx.allowedToolNames);
213
218
  const rawToolInput =
214
219
  input.input != null && typeof input.input === "object"
215
220
  ? (input.input as Record<string, unknown>)
@@ -242,7 +247,7 @@ export function createToolExecutor(
242
247
  }
243
248
 
244
249
  const result = await executor.execute(
245
- name,
250
+ executionName,
246
251
  input,
247
252
  toolContext,
248
253
  turnContext,
@@ -251,7 +256,7 @@ export function createToolExecutor(
251
256
  ctx.approvedViaPromptThisTurn = true;
252
257
  }
253
258
 
254
- runPostExecutionSideEffects(name, input, result, { ctx });
259
+ runPostExecutionSideEffects(executionName, input, result, { ctx });
255
260
 
256
261
  return result;
257
262
  };
@@ -357,26 +362,35 @@ export const HOST_TOOL_TO_CAPABILITY = new Map<string, HostProxyCapability>([
357
362
  export const HOST_TOOL_NAMES = new Set(HOST_TOOL_TO_CAPABILITY.keys());
358
363
  /**
359
364
  * Capabilities eligible for cross-client exposure on non-host-proxy
360
- * transports (e.g. web, ios routing to a connected macOS client).
365
+ * transports (e.g. web, ios routing to a connected capable client).
361
366
  * Adding a capability here exposes ALL tools that map to it (per
362
367
  * HOST_TOOL_TO_CAPABILITY) on non-host-proxy transports — the daemon then
363
368
  * routes the actual invocation to the connected capable client via the
364
369
  * proxy's targetClientId path.
365
370
  *
371
+ * All members below adopt the same-actor enforcement pattern: the proxy
372
+ * binds the request to a specific client id + actor principal id at
373
+ * dispatch time, and the corresponding result route requires the
374
+ * submitting client to present an `x-vellum-client-id` matching the
375
+ * captured target plus an `x-vellum-actor-principal-id` matching the
376
+ * captured actor (see `enforceSameActorOrThrow` in
377
+ * `runtime/auth/same-actor.ts`).
378
+ *
366
379
  * Inclusions:
367
380
  * - host_bash (Phase 1, PR #29322)
368
381
  * - host_file (Phases 2 & 3, PRs #29398 + #29440)
382
+ * - host_browser (PR #27489 executor parity + PR #29829 cross-client
383
+ * exposure with same-actor guard at proxy dispatch and result route)
369
384
  *
370
385
  * Exclusions:
371
- * - host_browser: chrome-extension is its own executor; web turns don't
372
- * have a CDP target model. Re-evaluate when host browser via macOS
373
- * host proxy ships (PR #27489).
374
- * - host_app_control, host_cu: not in HOST_TOOL_TO_CAPABILITY
375
- * (skill-routed).
386
+ * - host_app_control, host_cu: not in HOST_TOOL_TO_CAPABILITY (skill-routed).
387
+ * Their cross-client exposure is handled at the skill preactivation layer
388
+ * via `preactivateHostProxySkills` see host-proxy-preactivation.ts.
376
389
  */
377
390
  const CROSS_CLIENT_EXPOSED_CAPABILITIES = new Set<HostProxyCapability>([
378
391
  "host_bash",
379
392
  "host_file",
393
+ "host_browser",
380
394
  ]);
381
395
  const CLIENT_CAPABILITY_TOOL_NAMES = new Set(["app_open"]);
382
396
  const PLATFORM_TOOL_NAMES = new Set(["request_system_permission"]);
@@ -413,15 +427,15 @@ export function isToolActiveForContext(
413
427
  // transport cannot service this capability, the tool is filtered out.
414
428
  if (transport && capability && !supportsHostProxy(transport, capability)) {
415
429
  // Cross-client exception: allow host tools whose capabilities have
416
- // cross-client routing infrastructure (Phases 1–3) to be exposed for
417
- // non-host-proxy transports (e.g. "web", "ios") when at least one
418
- // capable client is connected via the event hub. Members of
419
- // CROSS_CLIENT_EXPOSED_CAPABILITIES (host_bash, host_file) qualify;
420
- // host_browser is intentionally excluded (chrome-extension is its
421
- // own executor and web turns don't have a CDP target model).
430
+ // cross-client routing infrastructure (Phases 1–3 plus host_browser
431
+ // via PR #27489) to be exposed for non-host-proxy transports (e.g.
432
+ // "web", "ios") when at least one capable client is connected via
433
+ // the event hub. Members of CROSS_CLIENT_EXPOSED_CAPABILITIES
434
+ // (host_bash, host_file, host_browser) qualify.
422
435
  // chrome-extension transport is excluded as a security boundary
423
- // (extension only gets host_browser); hasNoClient turns are excluded
424
- // (no interactive approval UI available).
436
+ // (extension only gets host_browser via its own executor path);
437
+ // hasNoClient turns are excluded (no interactive approval UI
438
+ // available).
425
439
  if (
426
440
  capability &&
427
441
  CROSS_CLIENT_EXPOSED_CAPABILITIES.has(capability) &&
@@ -27,6 +27,7 @@ import {
27
27
  contextWindowConfigFromEffective,
28
28
  resolveEffectiveContextWindow,
29
29
  } from "../config/llm-context-resolution.js";
30
+ import { resolveCallSiteConfig } from "../config/llm-resolver.js";
30
31
  import { getConfig } from "../config/loader.js";
31
32
  import type { LLMCallSite, Speed } from "../config/schemas/llm.js";
32
33
  import type { ContextWindowConfig } from "../config/types.js";
@@ -53,6 +54,7 @@ import {
53
54
  getConversationOriginChannel,
54
55
  getConversationOverrideProfileFromRow,
55
56
  } from "../memory/conversation-crud.js";
57
+ import { isBackgroundConversationType } from "../memory/conversation-types.js";
56
58
  import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
57
59
  import { PermissionPrompter } from "../permissions/prompter.js";
58
60
  import { SecretPrompter } from "../permissions/secret-prompter.js";
@@ -119,8 +121,9 @@ import {
119
121
  } from "./conversation-tool-setup.js";
120
122
  import { refreshWorkspaceTopLevelContextIfNeeded as refreshWorkspaceImpl } from "./conversation-workspace.js";
121
123
  import { canonicalizeTimeZone } from "./date-context.js";
122
- import type { HostAppControlProxy } from "./host-app-control-proxy.js";
124
+ import { HostAppControlProxy } from "./host-app-control-proxy.js";
123
125
  import { HostCuProxy } from "./host-cu-proxy.js";
126
+ import { shouldAttachHostProxyForCapability } from "./host-proxy-preactivation.js";
124
127
  import type {
125
128
  ServerMessage,
126
129
  SurfaceData,
@@ -233,6 +236,14 @@ export class Conversation {
233
236
  };
234
237
  /** @internal */ surfaceActionRequestIds = new Set<string>();
235
238
  /** @internal */ approvedViaPromptThisTurn = false;
239
+ /**
240
+ * When true, side-effect tools must prompt even if a trust/allow rule
241
+ * would auto-allow. Set by non-interactive callers (e.g. non-guardian
242
+ * phone voice) so their auto-deny handler reliably sees a
243
+ * `confirmation_request` event. See ToolSetupContext.forcePromptSideEffects.
244
+ * @internal
245
+ */
246
+ forcePromptSideEffects = false;
236
247
  /** @internal */ pendingSurfaceActions = new Map<
237
248
  string,
238
249
  { surfaceType: SurfaceType }
@@ -424,7 +435,8 @@ export class Conversation {
424
435
  );
425
436
 
426
437
  const config = getConfig();
427
- this.streamThinking = config.llm.default.thinking.streamThinking ?? false;
438
+ const resolvedMainAgent = resolveCallSiteConfig("mainAgent", config.llm);
439
+ this.streamThinking = resolvedMainAgent.thinking.streamThinking ?? false;
428
440
 
429
441
  // CES (Credential Execution Service) — use the shared server-level client.
430
442
  // The CES sidecar accepts exactly one bootstrap connection, so the
@@ -463,6 +475,9 @@ export class Conversation {
463
475
  channelPersona: persona.channelPersona,
464
476
  userSlug: persona.userSlug,
465
477
  onboardingContext: this.getOnboardingContext(),
478
+ isBackgroundConversation: isBackgroundConversationType(
479
+ getConversation(this.conversationId)?.conversationType,
480
+ ),
466
481
  });
467
482
  })(),
468
483
  };
@@ -476,20 +491,19 @@ export class Conversation {
476
491
  };
477
492
 
478
493
  const fastModeEnabled = isAssistantFeatureFlagEnabled("fast-mode", config);
479
- const resolvedSpeed = speedOverride ?? config.llm.default.speed;
480
- const llmDefault = config.llm.default;
494
+ const resolvedSpeed = speedOverride ?? resolvedMainAgent.speed;
481
495
  const initialContextWindow = resolveEffectiveContextWindow({
482
496
  llm: config.llm,
483
497
  callSite: "mainAgent",
484
498
  });
485
499
  const initialContextWindowConfig = contextWindowConfigFromEffective(
486
- llmDefault.contextWindow,
500
+ resolvedMainAgent.contextWindow,
487
501
  initialContextWindow,
488
502
  );
489
503
 
490
504
  const agentLoopConfig: Partial<AgentLoopConfig> = {
491
- thinking: llmDefault.thinking,
492
- effort: llmDefault.effort,
505
+ thinking: resolvedMainAgent.thinking,
506
+ effort: resolvedMainAgent.effort,
493
507
  ...(fastModeEnabled && resolvedSpeed === "fast"
494
508
  ? { speed: resolvedSpeed }
495
509
  : {}),
@@ -551,6 +565,9 @@ export class Conversation {
551
565
  channelPersona: persona.channelPersona,
552
566
  userSlug: persona.userSlug,
553
567
  onboardingContext: this.getOnboardingContext(),
568
+ isBackgroundConversation: isBackgroundConversationType(
569
+ getConversation(this.conversationId)?.conversationType,
570
+ ),
554
571
  });
555
572
  })();
556
573
  const tools = buildToolDefinitions();
@@ -943,6 +960,23 @@ export class Conversation {
943
960
  this.hostAppControlProxy = proxy;
944
961
  }
945
962
 
963
+ ensureHostProxiesForTurn(
964
+ sourceInterface: import("../channels/types.js").InterfaceId | undefined,
965
+ ): void {
966
+ if (
967
+ shouldAttachHostProxyForCapability("host_cu", sourceInterface) &&
968
+ !this.hostCuProxy
969
+ ) {
970
+ this.setHostCuProxy(new HostCuProxy());
971
+ }
972
+ if (
973
+ shouldAttachHostProxyForCapability("host_app_control", sourceInterface) &&
974
+ !this.hostAppControlProxy
975
+ ) {
976
+ this.setHostAppControlProxy(new HostAppControlProxy(this.conversationId));
977
+ }
978
+ }
979
+
946
980
  // ── Server-authoritative state signals ─────────────────────────────
947
981
 
948
982
  emitConfirmationStateChanged(
@@ -991,7 +1025,9 @@ export class Conversation {
991
1025
  }
992
1026
  }
993
1027
 
994
- async forceCompact(): Promise<ContextWindowResult> {
1028
+ async forceCompact(options?: {
1029
+ targetInputTokensOverride?: number;
1030
+ }): Promise<ContextWindowResult> {
995
1031
  const conversationRow = getConversation(this.conversationId);
996
1032
  const overrideProfile =
997
1033
  getConversationOverrideProfileFromRow(conversationRow) ?? null;
@@ -1007,7 +1043,9 @@ export class Conversation {
1007
1043
  }
1008
1044
  ).updateConfig?.(
1009
1045
  contextWindowConfigFromEffective(
1010
- config.llm.default.contextWindow,
1046
+ resolveCallSiteConfig("mainAgent", config.llm, {
1047
+ overrideProfile: overrideProfile ?? undefined,
1048
+ }).contextWindow,
1011
1049
  effectiveContextWindow,
1012
1050
  ),
1013
1051
  );
@@ -1037,6 +1075,7 @@ export class Conversation {
1037
1075
  conversationOriginChannel:
1038
1076
  getConversationOriginChannel(this.conversationId) ?? undefined,
1039
1077
  overrideProfile,
1078
+ targetInputTokensOverride: options?.targetInputTokensOverride,
1040
1079
  },
1041
1080
  );
1042
1081
  // Track circuit-breaker state for user-initiated `/compact` and other
@@ -1052,7 +1091,7 @@ export class Conversation {
1052
1091
  );
1053
1092
  }
1054
1093
  if (result.compacted) {
1055
- applyCompactionResult(this, result, this.sendToClient, null, {
1094
+ await applyCompactionResult(this, result, this.sendToClient, null, {
1056
1095
  slackContextCompactionWatermarkTs: getSlackCompactionWatermarkForPrefix(
1057
1096
  slackChronologicalContext,
1058
1097
  result.compactedMessages,
@@ -69,6 +69,7 @@ import {
69
69
  type Plugin,
70
70
  PluginExecutionError,
71
71
  type PluginInitContext,
72
+ type PluginShutdownContext,
72
73
  type PluginSkillRegistration,
73
74
  } from "../plugins/types.js";
74
75
  import {
@@ -218,8 +219,16 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
218
219
  // server), the latter drops the plugin's entry from the Map (so
219
220
  // `getMiddlewaresFor` / `getInjectors` don't re-enter an uninitialized
220
221
  // plugin on the next pipeline invocation).
222
+ // Shutdown context is identical for every plugin in this boot — construct
223
+ // once and reuse across the bootstrap-failure rollback and the normal
224
+ // shutdown hook below. Only `assistantVersion` is exposed today; future
225
+ // additions live on {@link PluginShutdownContext}.
226
+ const shutdownContext: PluginShutdownContext = {
227
+ assistantVersion: ctx.assistantVersion,
228
+ };
229
+
221
230
  async function rollbackPlugin(active: ActivePlugin): Promise<void> {
222
- await teardownPlugin(active, "bootstrap-failed");
231
+ await teardownPlugin(active, "bootstrap-failed", shutdownContext);
223
232
  unregisterPlugin(active.plugin.manifest.name);
224
233
  }
225
234
 
@@ -309,9 +318,9 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
309
318
  apiVersions: ASSISTANT_API_VERSIONS,
310
319
  };
311
320
 
312
- if (plugin.init) {
321
+ if (plugin.hooks?.init) {
313
322
  try {
314
- await plugin.init(initContext);
323
+ await plugin.hooks.init(initContext);
315
324
  } catch (err) {
316
325
  throw new PluginExecutionError(
317
326
  `plugin ${name} init() failed: ${
@@ -445,7 +454,7 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
445
454
  const shutdownSnapshot: ActivePlugin[] = [...activePlugins];
446
455
  registerShutdownHook("plugins", async (reason) => {
447
456
  for (let i = shutdownSnapshot.length - 1; i >= 0; i--) {
448
- await teardownPlugin(shutdownSnapshot[i]!, reason);
457
+ await teardownPlugin(shutdownSnapshot[i]!, reason, shutdownContext);
449
458
  }
450
459
  });
451
460
  }
@@ -473,6 +482,7 @@ interface ActivePlugin {
473
482
  async function teardownPlugin(
474
483
  active: ActivePlugin,
475
484
  reason: string,
485
+ shutdownContext: PluginShutdownContext,
476
486
  ): Promise<void> {
477
487
  const { plugin, routeHandles } = active;
478
488
  const name = plugin.manifest.name;
@@ -504,17 +514,17 @@ async function teardownPlugin(
504
514
  );
505
515
  }
506
516
 
507
- if (plugin.onShutdown) {
517
+ if (plugin.hooks?.shutdown) {
508
518
  try {
509
- await plugin.onShutdown();
519
+ await plugin.hooks.shutdown(shutdownContext);
510
520
  } catch (err) {
511
- // Swallow — we want every plugin's onShutdown to get a chance to run
521
+ // Swallow — we want every plugin's shutdown to get a chance to run
512
522
  // even when an earlier one throws. The outer runShutdownHooks already
513
523
  // logs at hook level, but the plugin-name attribution here is what
514
524
  // operators read first.
515
525
  log.warn(
516
526
  { err, plugin: name, reason },
517
- "plugin onShutdown failed (continuing with remaining plugins)",
527
+ "plugin shutdown hook failed (continuing with remaining plugins)",
518
528
  );
519
529
  }
520
530
  }
@@ -1,7 +1,6 @@
1
- import { CallSiteRoutingProvider } from "../providers/call-site-routing.js";
1
+ import { loadConfig } from "../config/loader.js";
2
+ import { wrapWithCallSiteRouting } from "../providers/call-site-routing.js";
2
3
  import { getConfiguredProvider } from "../providers/provider-send-message.js";
3
- import { getProvider } from "../providers/registry.js";
4
- import type { Provider } from "../providers/types.js";
5
4
  import {
6
5
  buildGuardianActionGenerationPrompt,
7
6
  getGuardianActionFallbackMessage,
@@ -32,8 +31,10 @@ export function createGuardianActionCopyGenerator(): GuardianActionCopyGenerator
32
31
  if (!baseProvider) return null;
33
32
  // Wrap so the per-call `callSite` can route to a different provider
34
33
  // transport when `llm.callSites.guardianQuestionCopy.provider` overrides
35
- // the default. Without this, callSite only affects request metadata.
36
- const provider = wrapWithCallSiteRouting(baseProvider);
34
+ // the default. Connection-aware: when the resolved profile names a
35
+ // `provider_connection`, that connection's auth wins over the legacy
36
+ // registry lookup. See `wrapWithCallSiteRouting`.
37
+ const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
37
38
 
38
39
  const fallbackText =
39
40
  options.fallbackText?.trim() || getGuardianActionFallbackMessage(context);
@@ -135,7 +136,7 @@ export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpC
135
136
  if (!baseProvider) {
136
137
  throw new Error("No configured provider available for follow-up conversation");
137
138
  }
138
- const provider = wrapWithCallSiteRouting(baseProvider);
139
+ const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
139
140
 
140
141
  const userPrompt = [
141
142
  `Original question from the voice call: "${context.questionText}"`,
@@ -192,19 +193,3 @@ export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpC
192
193
  return result;
193
194
  };
194
195
  }
195
-
196
- /**
197
- * Wrap a base Provider so per-call `callSite` metadata can route the actual
198
- * transport to a different provider when `llm.callSites.<id>.provider`
199
- * differs from the default. Without this wrapper, only request metadata
200
- * reflects the callSite — the HTTP transport stays bound to the default.
201
- */
202
- function wrapWithCallSiteRouting(base: Provider): Provider {
203
- return new CallSiteRoutingProvider(base, (name) => {
204
- try {
205
- return getProvider(name);
206
- } catch {
207
- return undefined;
208
- }
209
- });
210
- }