@vellumai/assistant 0.8.1 → 0.8.3

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 (630) hide show
  1. package/ARCHITECTURE.md +13 -19
  2. package/Dockerfile +75 -1
  3. package/bun.lock +11 -1
  4. package/docker-entrypoint.sh +17 -0
  5. package/docker-init-apt-root.sh +167 -0
  6. package/docker-kata-apt-env.sh +39 -0
  7. package/docs/plugins.md +88 -47
  8. package/docs/skills.md +9 -7
  9. package/examples/plugins/echo/README.md +27 -27
  10. package/examples/plugins/echo/package.json +3 -0
  11. package/examples/plugins/echo/register.ts +31 -31
  12. package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
  13. package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
  14. package/openapi.yaml +642 -5
  15. package/package.json +3 -1
  16. package/scripts/generate-openapi.ts +83 -10
  17. package/scripts/sync-llm-catalog.ts +2 -2
  18. package/scripts/sync-web-search-catalog.ts +47 -25
  19. package/src/__tests__/agent-image-optimize.test.ts +11 -3
  20. package/src/__tests__/agent-loop-exit-reason.test.ts +272 -0
  21. package/src/__tests__/agent-loop-provider-error-recording.test.ts +195 -0
  22. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
  23. package/src/__tests__/anthropic-provider.test.ts +45 -0
  24. package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
  25. package/src/__tests__/app-executors.test.ts +220 -4
  26. package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
  27. package/src/__tests__/bundled-asset.test.ts +6 -6
  28. package/src/__tests__/channel-availability-routes.test.ts +206 -0
  29. package/src/__tests__/channel-delivery-store.test.ts +289 -1
  30. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
  31. package/src/__tests__/clawhub.test.ts +75 -16
  32. package/src/__tests__/compactor-tail-resolution.test.ts +147 -0
  33. package/src/__tests__/config-get-vision-flag.test.ts +136 -0
  34. package/src/__tests__/config-loader-backfill.test.ts +115 -18
  35. package/src/__tests__/config-schema.test.ts +21 -0
  36. package/src/__tests__/config-set-route.test.ts +80 -0
  37. package/src/__tests__/config-sounds-sync.test.ts +97 -0
  38. package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
  39. package/src/__tests__/context-search-conversations-source.test.ts +117 -2
  40. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
  41. package/src/__tests__/context-search-workspace-source.test.ts +7 -0
  42. package/src/__tests__/context-token-estimator.test.ts +31 -65
  43. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
  44. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
  45. package/src/__tests__/conversation-agent-loop-overflow.test.ts +92 -92
  46. package/src/__tests__/conversation-agent-loop.test.ts +59 -1
  47. package/src/__tests__/conversation-error.test.ts +42 -3
  48. package/src/__tests__/conversation-fork-crud.test.ts +82 -0
  49. package/src/__tests__/conversation-inference-profile-route.test.ts +40 -4
  50. package/src/__tests__/conversation-lifecycle.test.ts +173 -0
  51. package/src/__tests__/conversation-media-retry.test.ts +19 -8
  52. package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
  53. package/src/__tests__/conversation-pairing.test.ts +54 -0
  54. package/src/__tests__/conversation-process-callsite.test.ts +4 -1
  55. package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
  56. package/src/__tests__/conversation-queue.test.ts +4 -1
  57. package/src/__tests__/conversation-runtime-assembly.test.ts +102 -13
  58. package/src/__tests__/conversation-slash-queue.test.ts +59 -1
  59. package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
  60. package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
  61. package/src/__tests__/conversation-sync-tags.test.ts +235 -0
  62. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  63. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  64. package/src/__tests__/credential-security-invariants.test.ts +3 -2
  65. package/src/__tests__/date-context.test.ts +45 -0
  66. package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
  67. package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
  68. package/src/__tests__/disk-pressure-tools.test.ts +1 -0
  69. package/src/__tests__/dm-backfill.test.ts +121 -10
  70. package/src/__tests__/document-tool-security.test.ts +258 -0
  71. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  72. package/src/__tests__/edit-propagation.test.ts +33 -0
  73. package/src/__tests__/empty-response-pipeline.test.ts +0 -4
  74. package/src/__tests__/external-plugin-loader.test.ts +151 -55
  75. package/src/__tests__/filing-service.test.ts +140 -0
  76. package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
  77. package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +0 -1
  78. package/src/__tests__/guardian-dispatch.test.ts +1 -0
  79. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
  80. package/src/__tests__/heartbeat-service.test.ts +24 -164
  81. package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
  82. package/src/__tests__/helpers/tar-fixtures.ts +39 -0
  83. package/src/__tests__/helpers/wait-for.ts +21 -0
  84. package/src/__tests__/history-repair-pipeline.test.ts +0 -3
  85. package/src/__tests__/history-repair.test.ts +73 -0
  86. package/src/__tests__/host-app-control-proxy.test.ts +507 -10
  87. package/src/__tests__/host-proxy-preactivation.test.ts +200 -13
  88. package/src/__tests__/image-credentials.test.ts +1 -1
  89. package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
  90. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +1 -1
  91. package/src/__tests__/inference-profile-reaper.test.ts +4 -2
  92. package/src/__tests__/inference-profile-session-handler.test.ts +18 -6
  93. package/src/__tests__/inference-profile-session-ipc.test.ts +17 -5
  94. package/src/__tests__/injector-background-turn.test.ts +153 -0
  95. package/src/__tests__/injector-chain.test.ts +15 -8
  96. package/src/__tests__/install-skill-routing.test.ts +155 -37
  97. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +99 -3
  98. package/src/__tests__/list-messages-page-latest.test.ts +55 -0
  99. package/src/__tests__/llm-call-pipeline.test.ts +0 -3
  100. package/src/__tests__/llm-callsite-catalog.test.ts +25 -0
  101. package/src/__tests__/llm-catalog-parity.test.ts +58 -13
  102. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +116 -0
  103. package/src/__tests__/llm-request-log-error-payload.test.ts +138 -0
  104. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +36 -0
  105. package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
  106. package/src/__tests__/llm-resolver.test.ts +255 -2
  107. package/src/__tests__/llm-usage-store.test.ts +114 -0
  108. package/src/__tests__/managed-profile-guard.test.ts +41 -29
  109. package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
  110. package/src/__tests__/managed-store.test.ts +84 -192
  111. package/src/__tests__/media-generate-image.test.ts +1 -1
  112. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
  113. package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
  114. package/src/__tests__/notification-decision-fallback.test.ts +0 -91
  115. package/src/__tests__/notification-decision-strategy.test.ts +14 -31
  116. package/src/__tests__/notification-deep-link.test.ts +15 -0
  117. package/src/__tests__/notification-guardian-path.test.ts +1 -2
  118. package/src/__tests__/notification-platform-adapter.test.ts +5 -4
  119. package/src/__tests__/notification-telegram-adapter.test.ts +1 -0
  120. package/src/__tests__/notification-vellum-adapter.test.ts +113 -0
  121. package/src/__tests__/oauth-commands-routes.test.ts +168 -16
  122. package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
  123. package/src/__tests__/openai-provider.test.ts +242 -3
  124. package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
  125. package/src/__tests__/openrouter-provider-only.test.ts +51 -3
  126. package/src/__tests__/openrouter-token-estimation.test.ts +34 -25
  127. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
  128. package/src/__tests__/persistence-pipeline.test.ts +0 -2
  129. package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +7 -2
  130. package/src/__tests__/platform.test.ts +2 -0
  131. package/src/__tests__/plugin-api-shim.test.ts +125 -0
  132. package/src/__tests__/plugin-bootstrap.test.ts +10 -36
  133. package/src/__tests__/plugin-external-api.test.ts +68 -0
  134. package/src/__tests__/plugin-registry.test.ts +0 -77
  135. package/src/__tests__/plugin-route-contribution.test.ts +0 -1
  136. package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
  137. package/src/__tests__/plugin-tool-contribution.test.ts +16 -15
  138. package/src/__tests__/plugin-types.test.ts +3 -13
  139. package/src/__tests__/process-message-background-slack.test.ts +8 -1
  140. package/src/__tests__/process-message-display-content.test.ts +421 -0
  141. package/src/__tests__/provider-catalog-visibility.test.ts +158 -0
  142. package/src/__tests__/provider-error-scenarios.test.ts +111 -0
  143. package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +33 -31
  144. package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
  145. package/src/__tests__/schedule-routes.test.ts +50 -3
  146. package/src/__tests__/schedule-store.test.ts +94 -0
  147. package/src/__tests__/scheduler-reuse-conversation.test.ts +54 -7
  148. package/src/__tests__/schema-transforms.test.ts +20 -0
  149. package/src/__tests__/search-skills-unified.test.ts +0 -5
  150. package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +1 -1
  151. package/src/__tests__/server-history-render.test.ts +43 -0
  152. package/src/__tests__/skill-load-feature-flag.test.ts +0 -12
  153. package/src/__tests__/skill-load-tool.test.ts +27 -89
  154. package/src/__tests__/skill-memory.test.ts +23 -3
  155. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
  156. package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
  157. package/src/__tests__/skills-install-extract.test.ts +49 -38
  158. package/src/__tests__/skills-install-staging.test.ts +159 -0
  159. package/src/__tests__/skills-uninstall.test.ts +9 -41
  160. package/src/__tests__/skills.test.ts +51 -58
  161. package/src/__tests__/slack-channel-config.test.ts +9 -0
  162. package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
  163. package/src/__tests__/system-prompt.test.ts +670 -63
  164. package/src/__tests__/terminal-tools.test.ts +28 -1
  165. package/src/__tests__/thread-backfill.test.ts +557 -27
  166. package/src/__tests__/title-generate-pipeline.test.ts +0 -13
  167. package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
  168. package/src/__tests__/tool-error-pipeline.test.ts +0 -3
  169. package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
  170. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  171. package/src/__tests__/tool-executor.test.ts +16 -4
  172. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
  173. package/src/__tests__/turn-events-store.test.ts +256 -0
  174. package/src/__tests__/twilio-routes.test.ts +4 -0
  175. package/src/__tests__/user-plugin-loader.test.ts +0 -7
  176. package/src/__tests__/voice-session-bridge.test.ts +198 -0
  177. package/src/__tests__/web-search-catalog-parity.test.ts +32 -10
  178. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +115 -3
  179. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +50 -0
  180. package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
  181. package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
  182. package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
  183. package/src/__tests__/workspace-migration-087-memory-router-balanced-profile.test.ts +228 -0
  184. package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
  185. package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
  186. package/src/a2a/__tests__/agent-card.test.ts +98 -0
  187. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +597 -0
  188. package/src/a2a/__tests__/protocol-helpers.test.ts +113 -0
  189. package/src/a2a/__tests__/task-store.test.ts +246 -0
  190. package/src/a2a/agent-card.ts +58 -0
  191. package/src/a2a/feature-gate.ts +8 -0
  192. package/src/a2a/protocol-constants.ts +21 -0
  193. package/src/a2a/protocol-errors.ts +50 -0
  194. package/src/a2a/protocol-types.ts +162 -0
  195. package/src/a2a/task-store.ts +168 -0
  196. package/src/acp/resolve-agent.ts +1 -1
  197. package/src/agent/image-optimize.ts +13 -5
  198. package/src/agent/loop.ts +167 -18
  199. package/src/calls/voice-session-bridge.ts +61 -42
  200. package/src/channels/config.ts +9 -0
  201. package/src/channels/types.ts +122 -0
  202. package/src/cli/__tests__/unknown-command.test.ts +24 -0
  203. package/src/cli/commands/__tests__/changelog.test.ts +304 -319
  204. package/src/cli/{__tests__ → commands/__tests__}/notifications.test.ts +201 -28
  205. package/src/cli/commands/__tests__/schedules.test.ts +960 -0
  206. package/src/cli/commands/changelog.ts +106 -42
  207. package/src/cli/commands/conversations.ts +102 -17
  208. package/src/cli/commands/default-action.ts +10 -53
  209. package/src/cli/commands/notifications.ts +388 -346
  210. package/src/cli/commands/plugins.ts +252 -0
  211. package/src/cli/commands/schedules.ts +683 -0
  212. package/src/cli/commands/telemetry.ts +40 -0
  213. package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
  214. package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
  215. package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
  216. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
  217. package/src/cli/lib/__tests__/search-plugins.test.ts +261 -0
  218. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
  219. package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
  220. package/src/cli/lib/cli-colors.ts +12 -0
  221. package/src/cli/lib/confirm-prompt.ts +79 -0
  222. package/src/cli/lib/install-from-github.ts +303 -0
  223. package/src/cli/lib/list-installed-plugins.ts +137 -0
  224. package/src/cli/lib/search-plugins.ts +163 -0
  225. package/src/cli/lib/uninstall-plugin.ts +82 -0
  226. package/src/cli/lib/unknown-command.ts +111 -0
  227. package/src/cli/program.ts +52 -2
  228. package/src/config/assistant-feature-flags.ts +24 -54
  229. package/src/config/bundled-skills/app-builder/SKILL.md +140 -22
  230. package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
  231. package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
  232. package/src/config/bundled-skills/document/SKILL.md +23 -3
  233. package/src/config/bundled-skills/document/TOOLS.json +53 -0
  234. package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
  235. package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
  236. package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
  237. package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
  238. package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
  239. package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
  240. package/src/config/bundled-tool-registry.ts +6 -0
  241. package/src/config/call-site-defaults.ts +105 -0
  242. package/src/config/feature-flag-registry.json +41 -9
  243. package/src/config/llm-resolver.ts +52 -1
  244. package/src/config/loader.ts +64 -38
  245. package/src/config/schema.ts +9 -10
  246. package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
  247. package/src/config/schemas/__tests__/memory-v2.test.ts +3 -3
  248. package/src/config/schemas/channels.ts +17 -0
  249. package/src/config/schemas/compaction.ts +28 -0
  250. package/src/config/schemas/conversations.ts +10 -0
  251. package/src/config/schemas/heartbeat.ts +23 -0
  252. package/src/config/schemas/llm-request-logs.ts +31 -7
  253. package/src/config/schemas/llm.ts +1 -0
  254. package/src/config/schemas/memory-retrieval.ts +18 -0
  255. package/src/config/schemas/memory-retrospective.ts +1 -1
  256. package/src/config/schemas/memory-v2.ts +4 -4
  257. package/src/config/schemas/memory.ts +3 -1
  258. package/src/config/schemas/tools.ts +14 -0
  259. package/src/config/seed-inference-profiles.ts +99 -29
  260. package/src/config/skills.ts +3 -96
  261. package/src/context/compactor.ts +1107 -0
  262. package/src/context/token-estimator.ts +34 -36
  263. package/src/context/window-manager.ts +197 -1520
  264. package/src/credential-execution/managed-catalog.ts +37 -0
  265. package/src/credential-health/credential-health-service.ts +280 -19
  266. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +33 -18
  267. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
  268. package/src/daemon/__tests__/conversation-tool-setup.test.ts +74 -0
  269. package/src/daemon/approval-generators.ts +8 -6
  270. package/src/daemon/config-watcher.ts +94 -31
  271. package/src/daemon/conversation-agent-loop-handlers.ts +78 -0
  272. package/src/daemon/conversation-agent-loop.ts +198 -11
  273. package/src/daemon/conversation-error.ts +171 -37
  274. package/src/daemon/conversation-lifecycle.ts +53 -40
  275. package/src/daemon/conversation-messaging.ts +25 -6
  276. package/src/daemon/conversation-process.ts +49 -12
  277. package/src/daemon/conversation-runtime-assembly.ts +25 -1
  278. package/src/daemon/conversation-slash.ts +12 -5
  279. package/src/daemon/conversation-store.ts +11 -4
  280. package/src/daemon/conversation-tool-setup.ts +39 -7
  281. package/src/daemon/conversation.ts +33 -8
  282. package/src/daemon/date-context.ts +40 -0
  283. package/src/daemon/external-plugins-bootstrap.ts +217 -181
  284. package/src/daemon/first-greeting.ts +22 -2
  285. package/src/daemon/guardian-action-generators.ts +1 -125
  286. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +248 -0
  287. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +154 -0
  288. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +133 -0
  289. package/src/daemon/handlers/__tests__/config-a2a.test.ts +95 -0
  290. package/src/daemon/handlers/config-a2a.ts +289 -0
  291. package/src/daemon/handlers/config-model.ts +6 -5
  292. package/src/daemon/handlers/config-slack-channel.ts +15 -3
  293. package/src/daemon/handlers/conversations.ts +1 -0
  294. package/src/daemon/handlers/shared.ts +14 -5
  295. package/src/daemon/handlers/skills.ts +111 -108
  296. package/src/daemon/history-repair.ts +28 -1
  297. package/src/daemon/host-app-control-proxy.ts +153 -27
  298. package/src/daemon/host-proxy-preactivation.ts +85 -18
  299. package/src/daemon/lifecycle.ts +89 -91
  300. package/src/daemon/meet-host-supervisor.ts +5 -4
  301. package/src/daemon/memory-v2-startup.ts +85 -0
  302. package/src/daemon/message-protocol.ts +1 -0
  303. package/src/daemon/message-types/conversations.ts +25 -0
  304. package/src/daemon/message-types/messages.ts +61 -0
  305. package/src/daemon/message-types/notifications.ts +21 -0
  306. package/src/daemon/message-types/subagents.ts +1 -0
  307. package/src/daemon/message-types/sync.ts +1 -0
  308. package/src/daemon/pkb-reminder-builder.test.ts +11 -54
  309. package/src/daemon/pkb-reminder-builder.ts +5 -20
  310. package/src/daemon/plugin-source-watcher.ts +146 -0
  311. package/src/daemon/process-message.ts +24 -3
  312. package/src/daemon/server.ts +11 -2
  313. package/src/daemon/skill-memory-refresh.ts +33 -0
  314. package/src/daemon/wake-target-adapter.ts +2 -0
  315. package/src/documents/document-store.ts +221 -3
  316. package/src/embedded/plugin-api.ts +40 -0
  317. package/src/export/__tests__/transcript-formatter.test.ts +121 -0
  318. package/src/export/transcript-formatter.ts +54 -20
  319. package/src/filing/filing-service.ts +39 -0
  320. package/src/heartbeat/__tests__/heartbeat-service.test.ts +135 -6
  321. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  322. package/src/heartbeat/heartbeat-service.ts +73 -189
  323. package/src/home/__tests__/feed-types.test.ts +80 -0
  324. package/src/home/feed-types.ts +36 -2
  325. package/src/home/post-connect-feed.ts +1 -0
  326. package/src/index.ts +18 -1
  327. package/src/ipc/cli-client.ts +147 -45
  328. package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
  329. package/src/mcp/client.ts +20 -4
  330. package/src/media/image-credentials.ts +3 -3
  331. package/src/memory/__tests__/bookmark-crud.test.ts +33 -27
  332. package/src/memory/__tests__/conversation-queries.test.ts +483 -0
  333. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
  334. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +2 -50
  335. package/src/memory/__tests__/memory-retrospective-job.test.ts +87 -4
  336. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +119 -14
  337. package/src/memory/__tests__/message-content.test.ts +35 -0
  338. package/src/memory/bookmark-crud.ts +42 -10
  339. package/src/memory/context-search/sources/conversations.ts +62 -2
  340. package/src/memory/context-search/sources/workspace.ts +4 -0
  341. package/src/memory/conversation-crud.ts +63 -19
  342. package/src/memory/conversation-queries.ts +197 -11
  343. package/src/memory/conversation-title-service.ts +26 -4
  344. package/src/memory/db-init.ts +12 -0
  345. package/src/memory/delivery-crud.ts +152 -5
  346. package/src/memory/embedding-backend.ts +4 -4
  347. package/src/memory/external-conversation-store.ts +66 -5
  348. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +150 -12
  349. package/src/memory/graph/conversation-graph-memory.ts +49 -21
  350. package/src/memory/graph/tools.ts +9 -40
  351. package/src/memory/indexer.ts +34 -29
  352. package/src/memory/invite-store.ts +53 -0
  353. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +73 -0
  354. package/src/memory/jobs/embed-concept-page.ts +20 -11
  355. package/src/memory/jobs-worker.ts +6 -1
  356. package/src/memory/llm-request-log-source-clickhouse.ts +24 -12
  357. package/src/memory/llm-request-log-source.ts +19 -52
  358. package/src/memory/llm-request-log-store.ts +92 -1
  359. package/src/memory/llm-usage-store.ts +125 -5
  360. package/src/memory/memory-retrospective-enqueue.ts +1 -20
  361. package/src/memory/memory-retrospective-job.ts +33 -6
  362. package/src/memory/memory-retrospective-startup-cleanup.ts +72 -5
  363. package/src/memory/message-content.ts +1 -1
  364. package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
  365. package/src/memory/migrations/229-delete-private-conversations.test.ts +38 -1
  366. package/src/memory/migrations/229-delete-private-conversations.ts +7 -0
  367. package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
  368. package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
  369. package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
  370. package/src/memory/migrations/250-provider-connection-base-url-and-models.ts +28 -0
  371. package/src/memory/migrations/251-a2a-tasks.ts +49 -0
  372. package/src/memory/migrations/252-llm-request-log-agent-loop-exit-reason.ts +32 -0
  373. package/src/memory/migrations/index.ts +9 -0
  374. package/src/memory/migrations/registry.ts +16 -0
  375. package/src/memory/onboarding-events-store.ts +106 -0
  376. package/src/memory/schema/a2a.ts +15 -0
  377. package/src/memory/schema/bookmarks.ts +0 -2
  378. package/src/memory/schema/calls.ts +1 -0
  379. package/src/memory/schema/index.ts +1 -0
  380. package/src/memory/schema/inference.ts +3 -3
  381. package/src/memory/schema/infrastructure.ts +13 -0
  382. package/src/memory/turn-events-store.ts +127 -2
  383. package/src/memory/v2/__tests__/activation-store.test.ts +25 -23
  384. package/src/memory/v2/__tests__/activation.test.ts +0 -8
  385. package/src/memory/v2/__tests__/cli-command-store.test.ts +404 -0
  386. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +25 -4
  387. package/src/memory/v2/__tests__/injection.test.ts +288 -11
  388. package/src/memory/v2/__tests__/migration.test.ts +87 -0
  389. package/src/memory/v2/__tests__/page-index.test.ts +83 -0
  390. package/src/memory/v2/__tests__/prompts-router.test.ts +58 -6
  391. package/src/memory/v2/__tests__/qdrant.test.ts +66 -3
  392. package/src/memory/v2/__tests__/router.test.ts +15 -0
  393. package/src/memory/v2/__tests__/skill-store.test.ts +387 -8
  394. package/src/memory/v2/__tests__/static-context.test.ts +12 -1
  395. package/src/memory/v2/activation-store.ts +14 -16
  396. package/src/memory/v2/cli-command-content.ts +19 -0
  397. package/src/memory/v2/cli-command-store.ts +304 -0
  398. package/src/memory/v2/frontmatter-sweep.ts +7 -1
  399. package/src/memory/v2/injection.ts +81 -26
  400. package/src/memory/v2/migration.ts +49 -19
  401. package/src/memory/v2/page-index.ts +63 -8
  402. package/src/memory/v2/prompts/router.ts +11 -8
  403. package/src/memory/v2/prompts/sweep.ts +2 -2
  404. package/src/memory/v2/qdrant.ts +135 -7
  405. package/src/memory/v2/router.ts +9 -8
  406. package/src/memory/v2/skill-store.ts +120 -35
  407. package/src/memory/v2/static-context.ts +4 -4
  408. package/src/memory/v2/types.ts +23 -0
  409. package/src/messaging/providers/a2a/__tests__/deliver.test.ts +274 -0
  410. package/src/messaging/providers/a2a/deliver.ts +156 -0
  411. package/src/messaging/providers/gmail/client.ts +9 -2
  412. package/src/messaging/providers/index.ts +11 -2
  413. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
  414. package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
  415. package/src/messaging/providers/slack/adapter.ts +43 -5
  416. package/src/messaging/providers/slack/client.ts +27 -0
  417. package/src/messaging/providers/slack/deep-link.ts +65 -0
  418. package/src/messaging/providers/slack/download.ts +104 -0
  419. package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
  420. package/src/messaging/providers/slack/message-metadata.ts +27 -0
  421. package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
  422. package/src/messaging/providers/slack/render-transcript.ts +69 -5
  423. package/src/messaging/providers/slack/types.ts +20 -1
  424. package/src/notifications/__tests__/broadcaster.test.ts +203 -0
  425. package/src/notifications/__tests__/decision-engine.test.ts +283 -0
  426. package/src/notifications/__tests__/deterministic-checks.test.ts +286 -0
  427. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
  428. package/src/notifications/__tests__/home-feed-side-effect.test.ts +430 -7
  429. package/src/notifications/adapters/macos.ts +12 -2
  430. package/src/notifications/broadcaster.ts +29 -4
  431. package/src/notifications/conversation-pairing.ts +2 -1
  432. package/src/notifications/copy-composer.ts +17 -64
  433. package/src/notifications/decision-engine.ts +113 -45
  434. package/src/notifications/deterministic-checks.ts +96 -0
  435. package/src/notifications/emit-signal.ts +21 -1
  436. package/src/notifications/home-feed-side-effect.ts +138 -5
  437. package/src/notifications/signal.ts +3 -5
  438. package/src/notifications/types.ts +8 -0
  439. package/src/oauth/connection-resolver.ts +8 -4
  440. package/src/oauth/platform-connection.test.ts +43 -3
  441. package/src/oauth/platform-connection.ts +19 -6
  442. package/src/oauth/seed-providers.ts +10 -1
  443. package/src/permissions/checker.ts +2 -0
  444. package/src/permissions/ipc-risk-types.ts +1 -0
  445. package/src/permissions/question-prompter.test.ts +416 -0
  446. package/src/permissions/question-prompter.ts +294 -0
  447. package/src/platform/client.test.ts +1 -1
  448. package/src/platform/client.ts +1 -1
  449. package/src/plugin-api/constants.ts +26 -0
  450. package/src/plugin-api/index.ts +34 -1
  451. package/src/plugin-api/types.ts +104 -22
  452. package/src/plugins/defaults/circuit-breaker.ts +0 -5
  453. package/src/plugins/defaults/compaction.ts +0 -4
  454. package/src/plugins/defaults/empty-response.ts +0 -2
  455. package/src/plugins/defaults/history-repair.ts +0 -2
  456. package/src/plugins/defaults/injectors.ts +74 -22
  457. package/src/plugins/defaults/llm-call.ts +0 -2
  458. package/src/plugins/defaults/memory-retrieval.ts +0 -1
  459. package/src/plugins/defaults/overflow-reduce.ts +0 -1
  460. package/src/plugins/defaults/persistence.ts +0 -2
  461. package/src/plugins/defaults/title-generate.ts +0 -5
  462. package/src/plugins/defaults/token-estimate.ts +0 -2
  463. package/src/plugins/defaults/tool-error.ts +0 -7
  464. package/src/plugins/defaults/tool-execute.ts +0 -2
  465. package/src/plugins/defaults/tool-result-truncate.ts +0 -4
  466. package/src/plugins/ensure-plugin-api-shim.ts +96 -0
  467. package/src/plugins/external-api.ts +104 -0
  468. package/src/plugins/external-plugin-loader.ts +187 -42
  469. package/src/plugins/feature-gate.ts +22 -0
  470. package/src/plugins/pipeline.ts +37 -0
  471. package/src/plugins/registry.ts +48 -80
  472. package/src/plugins/types.ts +40 -26
  473. package/src/plugins/user-loader.ts +21 -2
  474. package/src/proactive-artifact/aux-message-injector.ts +11 -0
  475. package/src/proactive-artifact/job.test.ts +37 -5
  476. package/src/prompts/__tests__/system-prompt.test.ts +10 -43
  477. package/src/prompts/__tests__/task-progress-hint-section.test.ts +95 -0
  478. package/src/prompts/normalize-onboarding.ts +27 -0
  479. package/src/prompts/sections.ts +302 -0
  480. package/src/prompts/system-prompt.ts +63 -174
  481. package/src/prompts/templates/BOOTSTRAP.md +17 -1
  482. package/src/prompts/templates/system-sections.ts +164 -0
  483. package/src/providers/__tests__/inference.test.ts +24 -7
  484. package/src/providers/anthropic/client.ts +28 -28
  485. package/src/providers/call-site-routing.ts +24 -6
  486. package/src/providers/connection-resolution.ts +68 -11
  487. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +74 -0
  488. package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +175 -0
  489. package/src/providers/inference/__tests__/connections-status-label.test.ts +15 -0
  490. package/src/providers/inference/adapter-factory.ts +32 -6
  491. package/src/providers/inference/auth.ts +12 -0
  492. package/src/providers/inference/backfill.ts +14 -1
  493. package/src/providers/inference/connections.ts +159 -34
  494. package/src/providers/inference/resolve-auth.ts +14 -4
  495. package/src/providers/model-catalog.ts +249 -12
  496. package/src/providers/model-intents.ts +3 -3
  497. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +235 -0
  498. package/src/providers/openai/chat-completions-provider.ts +169 -8
  499. package/src/providers/openrouter/client.ts +49 -4
  500. package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -2
  501. package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
  502. package/src/providers/provider-availability.ts +17 -2
  503. package/src/providers/provider-catalog-visibility.ts +38 -0
  504. package/src/providers/provider-send-message.ts +27 -12
  505. package/src/providers/registry.ts +52 -15
  506. package/src/providers/retry.ts +47 -1
  507. package/src/runtime/__tests__/agent-wake.test.ts +152 -0
  508. package/src/runtime/agent-wake.ts +103 -15
  509. package/src/runtime/auth/route-policy.ts +21 -1
  510. package/src/runtime/btw-sidechain.ts +2 -0
  511. package/src/runtime/http-server.ts +7 -16
  512. package/src/runtime/http-types.ts +19 -47
  513. package/src/runtime/migrations/origin-mode.ts +1 -1
  514. package/src/runtime/pending-interactions.ts +1 -0
  515. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +17 -0
  516. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +258 -0
  517. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
  518. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +172 -23
  519. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +275 -44
  520. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +12 -0
  521. package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
  522. package/src/runtime/routes/__tests__/tts-routes.test.ts +64 -1
  523. package/src/runtime/routes/acp-routes-list.test.ts +143 -0
  524. package/src/runtime/routes/acp-routes.ts +5 -3
  525. package/src/runtime/routes/auth-routes.ts +1 -1
  526. package/src/runtime/routes/bookmark-routes.ts +5 -3
  527. package/src/runtime/routes/btw-routes.ts +5 -1
  528. package/src/runtime/routes/channel-availability-routes.ts +126 -0
  529. package/src/runtime/routes/consolidation-routes.ts +100 -0
  530. package/src/runtime/routes/conversation-cli-routes.ts +44 -3
  531. package/src/runtime/routes/conversation-list-routes.ts +3 -20
  532. package/src/runtime/routes/conversation-management-routes.ts +17 -42
  533. package/src/runtime/routes/conversation-query-routes.ts +99 -35
  534. package/src/runtime/routes/conversation-routes.ts +97 -11
  535. package/src/runtime/routes/documents-routes.ts +25 -86
  536. package/src/runtime/routes/group-routes.ts +5 -0
  537. package/src/runtime/routes/inbound-conversation.ts +28 -8
  538. package/src/runtime/routes/inbound-message-handler.ts +236 -41
  539. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +111 -0
  540. package/src/runtime/routes/inbound-stages/background-dispatch.ts +32 -1
  541. package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
  542. package/src/runtime/routes/index.ts +8 -0
  543. package/src/runtime/routes/inference-profile-session-handler.ts +17 -44
  544. package/src/runtime/routes/inference-profile-session-reaper.ts +7 -21
  545. package/src/runtime/routes/inference-provider-connection-routes.ts +199 -22
  546. package/src/runtime/routes/integrations/a2a.ts +235 -0
  547. package/src/runtime/routes/integrations/slack/share.ts +4 -52
  548. package/src/runtime/routes/integrations/slack/token.ts +43 -0
  549. package/src/runtime/routes/integrations/twilio.ts +6 -13
  550. package/src/runtime/routes/llm-call-sites-routes.ts +11 -1
  551. package/src/runtime/routes/notification-routes.ts +1 -1
  552. package/src/runtime/routes/oauth-commands-routes.ts +105 -15
  553. package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
  554. package/src/runtime/routes/question-routes.ts +259 -0
  555. package/src/runtime/routes/rename-conversation-routes.ts +2 -33
  556. package/src/runtime/routes/schedule-routes.ts +4 -7
  557. package/src/runtime/routes/subagents-routes.ts +98 -18
  558. package/src/runtime/routes/telemetry-routes.ts +27 -0
  559. package/src/runtime/routes/tts-routes.ts +27 -2
  560. package/src/runtime/routes/workspace-routes.test.ts +43 -0
  561. package/src/runtime/routes/workspace-routes.ts +28 -0
  562. package/src/runtime/services/conversation-serializer.ts +39 -7
  563. package/src/runtime/sync/resource-sync-events.ts +93 -1
  564. package/src/schedule/schedule-store.ts +27 -2
  565. package/src/schedule/scheduler.ts +9 -1
  566. package/src/security/__tests__/untrusted-content.test.ts +86 -0
  567. package/src/security/untrusted-content.ts +93 -8
  568. package/src/skills/catalog-files.ts +1 -1
  569. package/src/skills/catalog-install.ts +233 -116
  570. package/src/skills/clawhub.ts +70 -13
  571. package/src/skills/managed-store.ts +4 -119
  572. package/src/skills/skillssh-registry.ts +27 -48
  573. package/src/subagent/manager.ts +17 -7
  574. package/src/telemetry/types.ts +113 -1
  575. package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
  576. package/src/telemetry/usage-telemetry-reporter.ts +113 -7
  577. package/src/tools/apps/executors.ts +58 -7
  578. package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
  579. package/src/tools/ask-question/ask-question-tool.ts +304 -0
  580. package/src/tools/browser/browser-execution.ts +15 -11
  581. package/src/tools/computer-use/definitions.ts +3 -3
  582. package/src/tools/credentials/vault.ts +1 -1
  583. package/src/tools/document/document-tool.ts +124 -1
  584. package/src/tools/filesystem/edit.ts +1 -1
  585. package/src/tools/filesystem/list.ts +1 -1
  586. package/src/tools/filesystem/read.ts +1 -1
  587. package/src/tools/filesystem/write.ts +5 -2
  588. package/src/tools/host-filesystem/transfer.ts +1 -1
  589. package/src/tools/host-terminal/host-shell.ts +1 -1
  590. package/src/tools/memory/register.ts +1 -9
  591. package/src/tools/permission-checker.ts +1 -1
  592. package/src/tools/registry.ts +17 -7
  593. package/src/tools/schedule/create.ts +2 -2
  594. package/src/tools/schema-transforms.ts +7 -2
  595. package/src/tools/side-effects.ts +1 -0
  596. package/src/tools/skills/delete-managed.ts +4 -4
  597. package/src/tools/skills/execute.ts +1 -1
  598. package/src/tools/skills/scaffold-managed.ts +3 -2
  599. package/src/tools/subagent/notify-parent.ts +1 -1
  600. package/src/tools/system/request-permission.ts +2 -2
  601. package/src/tools/terminal/safe-env.ts +60 -1
  602. package/src/tools/tool-manifest.ts +2 -0
  603. package/src/tools/types.ts +107 -21
  604. package/src/tools/ui-surface/definitions.ts +6 -5
  605. package/src/tts/__tests__/provider-adapters.test.ts +76 -2
  606. package/src/tts/providers/elevenlabs-provider.ts +75 -1
  607. package/src/types/onboarding-context.ts +2 -0
  608. package/src/util/errors.ts +17 -0
  609. package/src/util/platform.ts +10 -0
  610. package/src/watcher/__tests__/engine.test.ts +22 -0
  611. package/src/watcher/engine.ts +6 -2
  612. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +80 -15
  613. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +35 -22
  614. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +3 -1
  615. package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
  616. package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
  617. package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
  618. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
  619. package/src/workspace/migrations/087-memory-router-balanced-profile.ts +91 -0
  620. package/src/workspace/migrations/registry.ts +10 -0
  621. package/src/workspace/migrations/runner.ts +39 -9
  622. package/src/workspace/migrations/types.ts +4 -0
  623. package/examples/plugins/echo/bun.lock +0 -25
  624. package/src/__tests__/context-window-manager.test.ts +0 -2481
  625. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -441
  626. package/src/context/__tests__/compact-prompt.test.ts +0 -63
  627. package/src/context/prompts/compact.md +0 -26
  628. package/src/memory/graph/__tests__/remember-description.test.ts +0 -55
  629. package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
  630. package/src/runtime/guardian-action-conversation-turn.ts +0 -99
@@ -20,6 +20,7 @@ import type { AssistantConfig } from "../config/schema.js";
20
20
  import { seedInferenceProfiles } from "../config/seed-inference-profiles.js";
21
21
  import type { CesClient } from "../credential-execution/client.js";
22
22
  import { createCesClient } from "../credential-execution/client.js";
23
+ import { refreshManagedConnectionCache } from "../credential-execution/managed-catalog.js";
23
24
  import {
24
25
  type CesProcessManager,
25
26
  CesUnavailableError,
@@ -48,17 +49,19 @@ import { startMemoryJobsWorker } from "../memory/jobs-worker.js";
48
49
  import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
49
50
  import { QdrantManager } from "../memory/qdrant-manager.js";
50
51
  import { rotateToolInvocations } from "../memory/tool-usage-store.js";
52
+ import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
51
53
  import {
52
54
  emitNotificationSignal,
53
55
  registerBroadcastFn,
54
56
  } from "../notifications/emit-signal.js";
55
57
  import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
56
58
  import { seedOAuthProviders } from "../oauth/seed-providers.js";
59
+ import { installPluginRuntime } from "../plugins/external-api.js";
57
60
  import { loadUserPlugins } from "../plugins/user-loader.js";
58
61
  import { backfillGuardIfNeeded } from "../proactive-artifact/index.js";
59
62
  import { ensurePromptFiles } from "../prompts/system-prompt.js";
60
63
  import { runProviderConnectionsBackfill } from "../providers/inference/backfill.js";
61
- import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
64
+ import { resolveManagedProxyContext } from "../providers/platform-proxy/context.js";
62
65
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
63
66
  import {
64
67
  initAuthSigningKey,
@@ -74,7 +77,10 @@ import {
74
77
  setCesClient,
75
78
  setCesReconnect,
76
79
  } from "../security/secure-keys.js";
77
- import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
80
+ import {
81
+ setUsageTelemetryReporter,
82
+ UsageTelemetryReporter,
83
+ } from "../telemetry/usage-telemetry-reporter.js";
78
84
  import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
79
85
  import { getDeviceId } from "../util/device-id.js";
80
86
  import { getLogger, initLogger } from "../util/logger.js";
@@ -91,10 +97,6 @@ import {
91
97
  import { WorkspaceHeartbeatService } from "../workspace/heartbeat-service.js";
92
98
  import { WORKSPACE_MIGRATIONS } from "../workspace/migrations/registry.js";
93
99
  import { runWorkspaceMigrations } from "../workspace/migrations/runner.js";
94
- import {
95
- createApprovalConversationGenerator,
96
- createApprovalCopyGenerator,
97
- } from "./approval-generators.js";
98
100
  import {
99
101
  cleanupPidFile,
100
102
  cleanupPidFileIfOwner,
@@ -106,15 +108,11 @@ import {
106
108
  stopDiskPressureGuard,
107
109
  } from "./disk-pressure-guard.js";
108
110
  import { bootstrapPlugins } from "./external-plugins-bootstrap.js";
109
- import {
110
- createGuardianActionCopyGenerator,
111
- createGuardianFollowUpConversationGenerator,
112
- } from "./guardian-action-generators.js";
113
111
  import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
114
112
  import { installAssistantSymlink } from "./install-symlink.js";
115
113
  import {
116
114
  maybeRebuildMemoryV2Concepts,
117
- maybeSeedMemoryV2Skills,
115
+ rebuildBm25CorpusStatsAndReseedSkills,
118
116
  } from "./memory-v2-startup.js";
119
117
  import { processMessage } from "./process-message.js";
120
118
  import { runProfilerSweep } from "./profiler-run-store.js";
@@ -126,6 +124,7 @@ import {
126
124
  import { seedInterfaceFiles } from "./seed-files.js";
127
125
  import { DaemonServer } from "./server.js";
128
126
  import { installShutdownHandlers } from "./shutdown-handlers.js";
127
+ import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
129
128
 
130
129
  const log = getLogger("lifecycle");
131
130
  let diskPressureStartupSampleTimer: ReturnType<typeof setTimeout> | null = null;
@@ -316,6 +315,35 @@ export async function runDaemon(): Promise<void> {
316
315
  const signingKey = resolveSigningKey();
317
316
  initAuthSigningKey(signingKey);
318
317
 
318
+ // Start the runtime HTTP server early so /healthz answers ASAP.
319
+ let runtimeHttp: RuntimeHttpServer | null = null;
320
+ const httpPort = getRuntimeHttpPort();
321
+ const httpHostname = getRuntimeHttpHost();
322
+ log.info({ httpPort }, "Daemon startup: starting runtime HTTP server");
323
+
324
+ runtimeHttp = new RuntimeHttpServer({
325
+ port: httpPort,
326
+ hostname: httpHostname,
327
+ });
328
+
329
+ // Isolated try/catch around start() — a bind failure (port in use,
330
+ // permission denied, fd exhaustion) must not tear down the rest of
331
+ // daemon startup. The daemon falls back to IPC-only operation when
332
+ // runtimeHttp is null.
333
+ try {
334
+ await runtimeHttp.start();
335
+ log.info(
336
+ { port: httpPort, hostname: httpHostname },
337
+ "Daemon startup: runtime HTTP server listening",
338
+ );
339
+ } catch (err) {
340
+ log.warn(
341
+ { err, port: httpPort },
342
+ "Failed to start runtime HTTP server, continuing without it",
343
+ );
344
+ runtimeHttp = null;
345
+ }
346
+
319
347
  // Pre-populate feature flag overrides so subsequent sync
320
348
  // isAssistantFeatureFlagEnabled() calls have data. Fired non-blocking
321
349
  // so a slow or unreachable gateway doesn't delay daemon startup (the
@@ -504,6 +532,25 @@ export async function runDaemon(): Promise<void> {
504
532
  }
505
533
  } // end if (dbReady)
506
534
 
535
+ // Populate the managed-connection cache so buildIntegrationSection()
536
+ // can include platform-managed OAuth connections (e.g. Twitter) in the
537
+ // system prompt's "Connected Services" section from the first turn.
538
+ // This is an HTTP-only call with no DB dependency, so it runs regardless
539
+ // of dbReady. A periodic refresh keeps the cache current when users
540
+ // connect/disconnect managed providers while the assistant is running.
541
+ void refreshManagedConnectionCache().catch((err) =>
542
+ log.warn(
543
+ { err },
544
+ "Managed connection cache refresh failed — continuing startup",
545
+ ),
546
+ );
547
+ const MANAGED_CONNECTION_REFRESH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
548
+ setInterval(() => {
549
+ void refreshManagedConnectionCache().catch((err) =>
550
+ log.warn({ err }, "Periodic managed connection cache refresh failed"),
551
+ );
552
+ }, MANAGED_CONNECTION_REFRESH_INTERVAL_MS);
553
+
507
554
  // Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
508
555
  // into the workspace config file before profile seeding and the first
509
556
  // loadConfig() call so onboarding/platform preferences are visible to the
@@ -565,6 +612,7 @@ export async function runDaemon(): Promise<void> {
565
612
  let telemetryReporter: UsageTelemetryReporter | null = null;
566
613
  if (collectUsageData) {
567
614
  telemetryReporter = new UsageTelemetryReporter();
615
+ setUsageTelemetryReporter(telemetryReporter);
568
616
  telemetryReporter.start();
569
617
  log.info("Usage telemetry reporter started");
570
618
  }
@@ -648,6 +696,12 @@ export async function runDaemon(): Promise<void> {
648
696
  });
649
697
  }
650
698
 
699
+ // Install the `globalThis.__vellumPluginRuntime` bridge before scanning
700
+ // for user plugins. Plugins that touch the bridge from their module body
701
+ // would throw without this — see `plugins/external-api.ts` for the
702
+ // rationale (compiled-binary module identity).
703
+ installPluginRuntime();
704
+
651
705
  // Populate the registry with user plugins from `<workspaceDir>/plugins/*`
652
706
  // AFTER first-party plugins have already registered via their static
653
707
  // side-effect imports. User plugins may fail to load individually; a
@@ -829,46 +883,16 @@ export async function runDaemon(): Promise<void> {
829
883
  })();
830
884
  }
831
885
 
832
- // Build the BM25 corpus stats (per-token document frequencies and
833
- // average document length) used by the v2 sparse channel. Without
834
- // this, document-side sparse embeddings fall back to legacy TF-only
835
- // weighting via the chicken-and-egg guard in
836
- // `embed-concept-page.ts`. Fire-and-forget for the same reason as
837
- // PKB reconcile — the stats are an optional optimization, never a
838
- // boot-blocking dependency.
839
- void (async () => {
840
- try {
841
- const { rebuildConceptPageCorpusStats } =
842
- await import("../memory/v2/sparse-bm25.js");
843
- await rebuildConceptPageCorpusStats(getWorkspaceDir());
844
- log.info("Memory v2 BM25 corpus stats built");
845
- } catch (err) {
846
- log.warn(
847
- { err },
848
- "BM25 corpus-stats rebuild failed — sparse channel will fall back to TF-only until next rebuild",
849
- );
850
- }
851
- })();
852
-
853
- // Validate every concept page's frontmatter against the strict
854
- // schema and emit a `warn` per offender. Surfaces schema drift
855
- // (unknown keys, type mismatches) at boot time instead of waiting
856
- // for the failure to manifest as a silent V2 retrieval no-op when
857
- // a bad page first lands in a conversation's top-K. Fire-and-forget
858
- // and the sweep itself never throws — defense in depth via the
859
- // outer try/catch.
860
- void (async () => {
861
- try {
862
- const { sweepConceptPageFrontmatter } =
863
- await import("../memory/v2/frontmatter-sweep.js");
864
- await sweepConceptPageFrontmatter(getWorkspaceDir());
865
- } catch (err) {
866
- log.warn(
867
- { err },
868
- "Concept page frontmatter sweep threw — continuing startup",
869
- );
870
- }
871
- })();
886
+ void rebuildBm25CorpusStatsAndReseedSkills(config);
887
+
888
+ try {
889
+ await sweepConceptPageFrontmatter(config, getWorkspaceDir());
890
+ } catch (err) {
891
+ log.warn(
892
+ { err },
893
+ "Concept page frontmatter sweep threw — continuing startup",
894
+ );
895
+ }
872
896
  }
873
897
 
874
898
  log.info("Daemon startup: starting memory worker");
@@ -876,20 +900,10 @@ export async function runDaemon(): Promise<void> {
876
900
 
877
901
  // Seed capability graph nodes (new memory graph system)
878
902
  try {
879
- const {
880
- seedSkillGraphNodes,
881
- seedCliGraphNodes,
882
- seedUninstalledCatalogSkillMemories,
883
- } = await import("../memory/graph/capability-seed.js");
884
- seedSkillGraphNodes();
885
- maybeSeedMemoryV2Skills(config);
903
+ const { seedCliGraphNodes } =
904
+ await import("../memory/graph/capability-seed.js");
905
+ refreshSkillCapabilityMemories(config);
886
906
  await seedCliGraphNodes();
887
- void seedUninstalledCatalogSkillMemories().catch((err) =>
888
- log.warn(
889
- { err },
890
- "Uninstalled catalog skill memory seeding failed — continuing",
891
- ),
892
- );
893
907
  } catch (err) {
894
908
  log.warn({ err }, "Graph capability seeding failed — continuing");
895
909
  }
@@ -999,24 +1013,12 @@ export async function runDaemon(): Promise<void> {
999
1013
  },
1000
1014
  );
1001
1015
 
1002
- // Start the runtime HTTP server for optional REST API access.
1003
- // Defaults to port 7821.
1004
- let runtimeHttp: RuntimeHttpServer | null = null;
1005
- const httpPort = getRuntimeHttpPort();
1006
- log.info({ httpPort }, "Daemon startup: starting runtime HTTP server");
1007
-
1008
- const hostname = getRuntimeHttpHost();
1009
-
1010
- runtimeHttp = new RuntimeHttpServer({
1011
- port: httpPort,
1012
- hostname,
1013
- approvalCopyGenerator: createApprovalCopyGenerator(),
1014
- approvalConversationGenerator: createApprovalConversationGenerator(),
1015
- guardianActionCopyGenerator: createGuardianActionCopyGenerator(),
1016
- guardianFollowUpConversationGenerator:
1017
- createGuardianFollowUpConversationGenerator(),
1018
- });
1019
-
1016
+ // Wire up the runtime HTTP server's deferred dependencies. The server
1017
+ // itself was bound early in runDaemon (right after the auth signing key
1018
+ // was loaded) so /healthz and /readyz already answer 200 OK; these
1019
+ // registrations attach the live DaemonServer / CES / relay handlers to
1020
+ // the running routes. They're module-level state, so they're effective
1021
+ // even when the HTTP server failed to bind (IPC clients still work).
1020
1022
  registerSecretsDeps({
1021
1023
  getCesClient: () => server.getCesClient(),
1022
1024
  onProviderCredentialsChanged: () =>
@@ -1033,8 +1035,9 @@ export async function runDaemon(): Promise<void> {
1033
1035
  log.warn({ err }, "Background Qdrant init failed"),
1034
1036
  );
1035
1037
 
1036
- // Inject voice bridge deps BEFORE attempting to start the HTTP server.
1037
- // The bridge must be available even when the HTTP server fails to bind.
1038
+ // Inject voice bridge deps so route handlers + the relay pipeline can
1039
+ // resolve a conversation by ID once a call lands. Module-level state,
1040
+ // so available even when the HTTP server failed to bind.
1038
1041
  setVoiceBridgeDeps({
1039
1042
  getOrCreateConversation: (conversationId, _transport) =>
1040
1043
  server.getConversationForMessages(conversationId),
@@ -1053,7 +1056,6 @@ export async function runDaemon(): Promise<void> {
1053
1056
  },
1054
1057
  });
1055
1058
  try {
1056
- await runtimeHttp.start();
1057
1059
  setRelayBroadcast((msg) => broadcastMessage(msg));
1058
1060
  setPointerMessageProcessor(
1059
1061
  async (conversationId, instruction, requiredFacts) => {
@@ -1191,14 +1193,10 @@ export async function runDaemon(): Promise<void> {
1191
1193
  },
1192
1194
  );
1193
1195
  server.broadcastStatus();
1194
- log.info(
1195
- { port: httpPort, hostname },
1196
- "Daemon startup: runtime HTTP server listening",
1197
- );
1198
1196
  } catch (err) {
1199
1197
  log.warn(
1200
- { err, port: httpPort },
1201
- "Failed to start runtime HTTP server, continuing without it",
1198
+ { err },
1199
+ "Failed to wire runtime HTTP server deps, continuing without them",
1202
1200
  );
1203
1201
  runtimeHttp = null;
1204
1202
  }
@@ -254,10 +254,11 @@ export class MeetHostSupervisor {
254
254
  }
255
255
 
256
256
  /**
257
- * Ensure the meet-host child is spawned, the IPC handshake has been
258
- * received, and the manifest hash validated. Idempotent: a second
259
- * call while the child is already running is a no-op; a second call
260
- * during an in-flight spawn awaits the same promise.
257
+ * Ensure the meet-host child is spawned and the IPC handshake has
258
+ * been received. Idempotent: a second call while the child is
259
+ * already running is a no-op; a second call during an in-flight
260
+ * spawn awaits the same promise. Manifest hash validation is
261
+ * currently dormant (see {@link notifyHandshake}).
261
262
  */
262
263
  ensureRunning(): Promise<void> {
263
264
  if (this.shuttingDown) {
@@ -35,6 +35,91 @@ export function maybeSeedMemoryV2Skills(config: AssistantConfig): void {
35
35
  );
36
36
  }
37
37
 
38
+ /**
39
+ * Fire-and-forget seed of the v2 CLI-subcommand entries (indexed alongside
40
+ * concept pages and skills in `memory_v2_concept_pages` under the
41
+ * `cli-commands/<name>` slug prefix). Dynamic import keeps v2 code out of the
42
+ * startup graph when the gate is off. Never awaits — startup must not block.
43
+ */
44
+ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
45
+ if (!config.memory.v2.enabled) return;
46
+ void import("../memory/v2/cli-command-store.js")
47
+ .then(({ seedV2CliCommandEntries }) => seedV2CliCommandEntries())
48
+ .catch((err) => log.warn({ err }, "Failed to seed v2 CLI-command entries"));
49
+ }
50
+
51
+ /**
52
+ * Build the v2 BM25 corpus stats (per-token document frequencies + avg doc
53
+ * length), then re-seed the v2 skill entries so any skills written during
54
+ * cold start with the legacy TF encoder get rewritten with stemmed BM25
55
+ * vectors. The cold-start window exists because the very first
56
+ * `maybeSeedMemoryV2Skills` call can race ahead of the corpus-stats build —
57
+ * `skill-store.runSeedOnce` falls back to `generateSparseEmbedding` while
58
+ * `getConceptPageCorpusStats()` is still `null`, leaving stored skill
59
+ * sparse vectors in a different hash space than the BM25 query vectors
60
+ * callers issue (see `simBatch`, `activation.selectCandidates`). Reseeding
61
+ * here closes that gap without operator intervention.
62
+ *
63
+ * Fire-and-forget by design — startup must not block on either step. The
64
+ * reseed depends on the corpus-stats build, so a corpus-stats failure
65
+ * short-circuits and skips the reseed (the BM25 vectors it would produce
66
+ * would be wrong without fresh stats). Both steps log and swallow their own
67
+ * errors so neither blocks startup.
68
+ */
69
+ export async function rebuildBm25CorpusStatsAndReseedSkills(
70
+ config: AssistantConfig,
71
+ ): Promise<void> {
72
+ if (!config.memory.v2.enabled) return;
73
+
74
+ try {
75
+ const { rebuildConceptPageCorpusStats } =
76
+ await import("../memory/v2/sparse-bm25.js");
77
+ await rebuildConceptPageCorpusStats(getWorkspaceDir());
78
+ log.info("Memory v2 BM25 corpus stats built");
79
+ } catch (err) {
80
+ log.warn(
81
+ { err },
82
+ "BM25 corpus-stats rebuild failed — sparse channel will fall back to TF-only until next rebuild",
83
+ );
84
+ return;
85
+ }
86
+
87
+ // Skills and CLI commands share the unified collection but are independent
88
+ // catalogs — reseed in parallel so the second one isn't gated on the first.
89
+ await Promise.all([
90
+ (async () => {
91
+ try {
92
+ const { seedV2SkillEntries } =
93
+ await import("../memory/v2/skill-store.js");
94
+ await seedV2SkillEntries({ throwOnError: true });
95
+ log.info(
96
+ "Memory v2 skill embeddings re-seeded with BM25 vectors after corpus-stats build",
97
+ );
98
+ } catch (err) {
99
+ log.warn(
100
+ { err },
101
+ "Failed to re-seed v2 skill entries after BM25 corpus-stats build — skills seeded during cold start may keep TF-only sparse vectors until next reseed",
102
+ );
103
+ }
104
+ })(),
105
+ (async () => {
106
+ try {
107
+ const { seedV2CliCommandEntries } =
108
+ await import("../memory/v2/cli-command-store.js");
109
+ await seedV2CliCommandEntries({ throwOnError: true });
110
+ log.info(
111
+ "Memory v2 CLI-command embeddings re-seeded with BM25 vectors after corpus-stats build",
112
+ );
113
+ } catch (err) {
114
+ log.warn(
115
+ { err },
116
+ "Failed to re-seed v2 CLI-command entries after BM25 corpus-stats build — entries seeded during cold start may keep TF-only sparse vectors until next reseed",
117
+ );
118
+ }
119
+ })(),
120
+ ]);
121
+ }
122
+
38
123
  /**
39
124
  * Reconcile the v2 concept-page Qdrant collection with the expected schema
40
125
  * and enqueue `memory_v2_reembed` when the collection is missing data.
@@ -149,6 +149,7 @@ import type {
149
149
  export interface SubagentEvent {
150
150
  type: "subagent_event";
151
151
  subagentId: string;
152
+ conversationId: string;
152
153
  event: ServerMessage;
153
154
  }
154
155
 
@@ -224,9 +224,18 @@ export interface ConversationTitleUpdated {
224
224
  interface ChannelBinding {
225
225
  sourceChannel: ChannelId;
226
226
  externalChatId: string;
227
+ externalThreadId?: string | null;
227
228
  externalUserId?: string | null;
228
229
  displayName?: string | null;
229
230
  username?: string | null;
231
+ slackThread?: {
232
+ channelId: string;
233
+ threadTs: string;
234
+ link?: {
235
+ appUrl?: string;
236
+ webUrl?: string;
237
+ };
238
+ };
230
239
  }
231
240
 
232
241
  /** Attention state metadata for a conversation's latest assistant message. */
@@ -411,6 +420,7 @@ export interface HistoryResponse {
411
420
  status: "running" | "completed" | "failed" | "aborted";
412
421
  error?: string;
413
422
  conversationId?: string;
423
+ objective?: string;
414
424
  };
415
425
  /** True when text or tool result content was truncated due to maxTextChars/maxToolResultChars. */
416
426
  wasTruncated?: boolean;
@@ -535,6 +545,7 @@ export type ConversationErrorCode =
535
545
  | "PROVIDER_ORDERING"
536
546
  | "PROVIDER_WEB_SEARCH"
537
547
  | "PROVIDER_NOT_CONFIGURED"
548
+ | "PROVIDER_INVALID_KEY"
538
549
  | "MANAGED_KEY_INVALID"
539
550
  | "CONTEXT_TOO_LARGE"
540
551
  | "CONVERSATION_ABORTED"
@@ -552,6 +563,20 @@ export interface ConversationErrorMessage {
552
563
  debugDetails?: string;
553
564
  /** Machine-readable error category for log report metadata and triage. */
554
565
  errorCategory?: string;
566
+ /**
567
+ * Name of the `provider_connections` row in play when the error occurred.
568
+ * Surfaced by the macOS chat banner so users know which connection to fix
569
+ * (e.g. an invalid API key on `my-anthropic`). Optional because some
570
+ * errors fire before a connection is resolved.
571
+ */
572
+ connectionName?: string;
573
+ /**
574
+ * Name of the resolved profile (`llm.activeProfile` or per-call override)
575
+ * in play when the error occurred. Lets the macOS chat banner point
576
+ * users at the right profile even when the connection name is generic.
577
+ * Optional because some errors fire before a profile is resolved.
578
+ */
579
+ profileName?: string;
555
580
  }
556
581
 
557
582
  /** Reason the conversation list was invalidated. */
@@ -235,6 +235,66 @@ export interface SecretRequest {
235
235
  allowOneTimeSend?: boolean;
236
236
  }
237
237
 
238
+ export interface QuestionOption {
239
+ id: string;
240
+ label: string;
241
+ description?: string;
242
+ }
243
+
244
+ /**
245
+ * One entry in a batched ask-question request.
246
+ *
247
+ * `id` is daemon-assigned (e.g. `q1`, `q2`...) — the LLM neither sees nor
248
+ * supplies it. It exists so the client has a stable handle to post the
249
+ * user's answer back against. See `QuestionRequest` for the batching
250
+ * contract.
251
+ */
252
+ export interface QuestionEntry {
253
+ id: string;
254
+ question: string;
255
+ description?: string;
256
+ /** LLM-supplied options, capped at 4. The client always renders a fixed
257
+ * 5th "Type something else" slot wired to a free-text response — so this
258
+ * array never represents the full choice set the user sees. */
259
+ options: QuestionOption[];
260
+ /** Optional placeholder shown in the free-text input. */
261
+ freeTextPlaceholder?: string;
262
+ }
263
+
264
+ /**
265
+ * A single broadcast that carries either one or a small batch (≤5) of
266
+ * clarifying questions. The whole batch is one card lifecycle on the client:
267
+ * one render, one state machine, one response submission.
268
+ *
269
+ * Wire-compat plan: both shapes are populated on every broadcast.
270
+ * - `questions[]` is the canonical shape new clients should consume.
271
+ * - The flat `question` / `description` / `options` / `freeTextPlaceholder`
272
+ * fields mirror `questions[0]` for backwards compat with the existing
273
+ * web client, which keys off the flat fields. Once that client adopts
274
+ * `questions[]`, the flat fields can be dropped (separate cleanup).
275
+ *
276
+ * Daemon callers that don't supply a batch get a one-element `questions`
277
+ * array synthesized from the flat fields.
278
+ */
279
+ export interface QuestionRequest {
280
+ type: "question_request";
281
+ requestId: string;
282
+ /** Batched-question payload. Always populated (single questions are sent
283
+ * as a one-element array). Each entry's `id` is daemon-assigned. */
284
+ questions: QuestionEntry[];
285
+ /** Legacy: mirrors `questions[0].question`. Kept populated for clients
286
+ * that haven't adopted the batched `questions[]` shape yet. */
287
+ question: string;
288
+ /** Legacy: mirrors `questions[0].description`. */
289
+ description?: string;
290
+ /** Legacy: mirrors `questions[0].options`. */
291
+ options: QuestionOption[];
292
+ /** Legacy: mirrors `questions[0].freeTextPlaceholder`. */
293
+ freeTextPlaceholder?: string;
294
+ conversationId?: string;
295
+ toolUseId?: string;
296
+ }
297
+
238
298
  export interface MessageComplete {
239
299
  type: "message_complete";
240
300
  conversationId?: string;
@@ -430,6 +490,7 @@ export type _MessagesServerMessages =
430
490
  | ToolResult
431
491
  | ConfirmationRequest
432
492
  | SecretRequest
493
+ | QuestionRequest
433
494
  | MessageComplete
434
495
  | ErrorMessage
435
496
  | MessageQueued
@@ -14,6 +14,20 @@ export interface NotificationIntent {
14
14
  * Clients not bound to this guardian should ignore the notification.
15
15
  */
16
16
  targetGuardianPrincipalId?: string;
17
+ /**
18
+ * When true, the client must NOT post this intent to the OS notification
19
+ * surface (`UNUserNotificationCenter` on macOS). Non-banner side effects
20
+ * (guardian filtering, fallback dedup, mark-unseen + history catch-up on
21
+ * the paired conversation) still run. The home-feed inbox entry is
22
+ * written independently by `home-feed-side-effect.ts` and is unaffected
23
+ * by this flag.
24
+ *
25
+ * Set by the server based on `attentionHints.urgency`: true for
26
+ * `low`/`medium`, false for `high`/`critical`. The notification center
27
+ * is the always-on canonical inbox; the OS banner is reserved for
28
+ * signals the user opted into push for (urgency >= high).
29
+ */
30
+ silent?: boolean;
17
31
  }
18
32
 
19
33
  /** Server push — broadcast when a notification creates a new vellum conversation. */
@@ -39,6 +53,13 @@ export interface NotificationConversationCreated {
39
53
  * conversation is attributed correctly.
40
54
  */
41
55
  source?: string;
56
+ /**
57
+ * Mirrors `NotificationIntent.silent`. When true the client must not
58
+ * post a fallback OS banner for this conversation — the sidebar entry
59
+ * still appears, but the always-on inbox is the only surfaced channel.
60
+ * Derived from the originating signal's `attentionHints.urgency`.
61
+ */
62
+ silent?: boolean;
42
63
  }
43
64
 
44
65
  /** Client ack sent after UNUserNotificationCenter.add() completes (or fails). */
@@ -26,6 +26,7 @@ export interface SubagentDetailResponse {
26
26
  type: "subagent_detail_response";
27
27
  subagentId: string;
28
28
  objective?: string;
29
+ usage?: UsageStats;
29
30
  events: Array<{
30
31
  type: string;
31
32
  content: string;
@@ -5,6 +5,7 @@ export const SYNC_TAGS = {
5
5
  assistantIdentity: "assistant:self:identity",
6
6
  assistantConfig: "assistant:self:config",
7
7
  assistantSounds: "assistant:self:sounds",
8
+ assistantSchedules: "assistant:self:schedules",
8
9
  conversationsList: "conversations:list",
9
10
  } as const;
10
11