@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
package/docs/plugins.md CHANGED
@@ -94,8 +94,6 @@ time. Its shape (see
94
94
  export interface PluginManifest {
95
95
  name: string; // kebab-case, unique
96
96
  version: string; // semver, informational
97
- provides?: Record<string, string>; // reserved; not consumed at runtime today
98
- requires: Record<string, string>; // capability → version required from the assistant
99
97
  requiresCredential?: string[]; // credential keys resolved before init()
100
98
  requiresFlag?: string[]; // feature flag keys that must all be enabled
101
99
  config?: unknown; // Zod-like parser for plugins.<name>
@@ -104,25 +102,45 @@ export interface PluginManifest {
104
102
 
105
103
  | Field | Required | Purpose |
106
104
  | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
107
- | `name` | yes | Unique plugin identifier. Duplicate names fail registration. Used as the directory under `<workspaceDir>/plugins-data/<name>/` and the attribution tag in logs. |
105
+ | `name` | yes | Unique plugin identifier. Duplicate names fail registration. Used as the directory under `<workspaceDir>/plugins-data/<name>/` and the attribution tag in logs. |
108
106
  | `version` | yes | Plugin's own semver. Informational — the registry does not compare it. |
109
- | `provides` | no | Reserved for future cross-plugin composition and not currently consumed by the assistant. Plugin authors may set this field, but no runtime code reads it yet — it is declared here so future cross-plugin work can land without a manifest version bump. Do not rely on it for any runtime behavior today. |
110
- | `requires` | yes | Must include `pluginRuntime: "v1"` at minimum. The registry checks every entry against `ASSISTANT_API_VERSIONS` and refuses to register plugins that ask for a capability or version the assistant does not expose. |
111
107
  | `requiresCredential` | no | Credential keys the plugin needs. The bootstrap resolves them via the credential store before `init()` runs and hands the values to the plugin in `ctx.credentials`. A missing credential fails startup with a clear error. |
112
108
  | `requiresFlag` | no | Assistant feature-flag keys that must all be ON for the plugin to activate. If any listed flag is disabled at bootstrap, the plugin is skipped entirely: `init()` is not invoked and no tools, routes, skills, or shutdown hooks are registered for it. See [Feature-flag gating](#feature-flag-gating) below. |
113
109
  | `config` | no | A parser-like validator (Zod schema, or any object with a `.parse(input)` method). If supplied, the bootstrap validates `config.plugins.<name>` through it before passing the result into `init()`. |
114
110
 
115
- The exposed capability table (`ASSISTANT_API_VERSIONS`) lives in
116
- [`registry.ts`](../src/plugins/registry.ts). It lists:
111
+ ### Host-compat: `peerDependencies["@vellumai/plugin-api"]`
117
112
 
118
- - `pluginRuntime` the base runtime every plugin must negotiate for.
119
- - `memoryApi`, `compactionApi`, `persistenceApi` top-level subsystem APIs.
120
- - One `*Api` entry per pipeline slot (e.g. `llmCallApi`, `toolExecuteApi`,
121
- `titleGenerateApi`, …).
113
+ Plugins declare which assistant versions they support via standard
114
+ `peerDependencies` in their `package.json`:
122
115
 
123
- Every entry is currently on `v1`. Removing or changing a version tag is a
124
- breaking change — plugins relying on it will fail to register until they
125
- update their `requires` map.
116
+ ```json
117
+ {
118
+ "name": "@me/my-logger",
119
+ "version": "1.2.3",
120
+ "peerDependencies": {
121
+ "@vellumai/plugin-api": "^0.8.0"
122
+ }
123
+ }
124
+ ```
125
+
126
+ At load time, the external-plugin loader resolves the assistant's running
127
+ version and runs `semver.satisfies(assistantVersion, range)` against the
128
+ declared range. The contract is currently soft while the plugin-installation
129
+ flow is in flux:
130
+
131
+ - **Range satisfied** — plugin loads.
132
+ - **Range not satisfied** — loader logs an error (`log.error`) and loads
133
+ the plugin anyway.
134
+ - **Range unparseable** — loader logs an error and loads the plugin anyway.
135
+ - **`@vellumai/plugin-api` peerDep absent** — loader logs a warning and
136
+ loads the plugin without a host-compat claim.
137
+
138
+ Once the install flow settles, the two error-logging branches above will
139
+ harden into hard rejections (with per-plugin isolation catching the
140
+ throw so one bad plugin can't brick the rest of the registry).
141
+
142
+ In-tree default plugins do not declare a peerDep — they ship with the
143
+ assistant binary and are version-locked by construction.
126
144
 
127
145
  ### Example manifest
128
146
 
@@ -130,11 +148,6 @@ update their `requires` map.
130
148
  const manifest: PluginManifest = {
131
149
  name: "my-logger",
132
150
  version: "1.2.3",
133
- provides: {},
134
- requires: {
135
- pluginRuntime: "v1",
136
- llmCallApi: "v1",
137
- },
138
151
  requiresCredential: ["LOGGER_API_KEY"],
139
152
  requiresFlag: ["my-logger-enabled"],
140
153
  config: z.object({
@@ -179,17 +192,33 @@ Feature Flags" section for the full procedure.
179
192
 
180
193
  ## Registration
181
194
 
182
- A plugin's `register.ts` calls `registerPlugin()` at module load time:
195
+ A plugin's `register.ts` calls `registerPlugin()` at module load time. The
196
+ function is exposed via the `globalThis.__vellumPluginRuntime` bridge so the
197
+ plugin file does not need to import from the daemon's source tree:
183
198
 
184
199
  ```typescript
185
- import { registerPlugin } from "<path-to-assistant>/src/plugins/registry.js";
186
200
  import type { Plugin } from "<path-to-assistant>/src/plugins/types.js";
187
201
 
202
+ interface VellumPluginRuntime {
203
+ readonly version: 1;
204
+ readonly registerPlugin: (plugin: Plugin) => void;
205
+ readonly assistantEventHub: import("<path-to-assistant>/src/runtime/assistant-event-hub.js").AssistantEventHub;
206
+ readonly getSecureKeyAsync: (account: string) => Promise<string | undefined>;
207
+ }
208
+
209
+ const runtime = (globalThis as { __vellumPluginRuntime?: VellumPluginRuntime })
210
+ .__vellumPluginRuntime;
211
+ if (!runtime || runtime.version !== 1) {
212
+ throw new Error(
213
+ "vellum plugin runtime not available — install a recent assistant build",
214
+ );
215
+ }
216
+ const { registerPlugin } = runtime;
217
+
188
218
  const myPlugin: Plugin = {
189
219
  manifest: {
190
220
  name: "my-plugin",
191
221
  version: "0.1.0",
192
- requires: { pluginRuntime: "v1" },
193
222
  },
194
223
  middleware: {
195
224
  /* ... */
@@ -199,6 +228,20 @@ const myPlugin: Plugin = {
199
228
  registerPlugin(myPlugin);
200
229
  ```
201
230
 
231
+ **Why the bridge?** When the daemon is a `bun --compile` binary, its modules
232
+ are bundled into the executable. Plugins that import the daemon's modules by
233
+ absolute path (`/abs/path/to/assistant/src/plugins/registry.js`) reload fresh
234
+ disk copies into a separate module graph, and any `registerPlugin()` call in
235
+ the plugin lands in a registry the daemon never reads. The
236
+ `globalThis.__vellumPluginRuntime` handle is the same instance the daemon's
237
+ bundled code holds onto, so plugin registrations always reach the right
238
+ place — whether the daemon was built with `bun --compile` or is running from
239
+ source.
240
+
241
+ Type-only imports (`import type { Plugin } from "..."`) remain free to use
242
+ absolute paths to the assistant source — the TypeScript compiler erases them
243
+ and they have no module-identity effect at runtime.
244
+
202
245
  **Rules:**
203
246
 
204
247
  - Exactly one `registerPlugin()` call per plugin. The registry rejects
@@ -210,6 +253,8 @@ registerPlugin(myPlugin);
210
253
  this plugin" — use `requiresFlag` or a guard inside `init()` instead.
211
254
  - The file runs before any lifecycle hooks. Keep it fast — heavy work
212
255
  belongs in `init()`.
256
+ - The bridge is installed by the daemon before `loadUserPlugins()` runs, so
257
+ the global is always present when a plugin's module body executes.
213
258
 
214
259
  ## Middleware patterns
215
260
 
@@ -419,7 +464,6 @@ Declare required credential keys in `manifest.requiresCredential`:
419
464
  const manifest: PluginManifest = {
420
465
  name: "my-plugin",
421
466
  version: "1.0.0",
422
- requires: { pluginRuntime: "v1" },
423
467
  requiresCredential: ["MY_PLUGIN_API_KEY"],
424
468
  };
425
469
  ```
@@ -458,7 +502,6 @@ const configSchema = z.object({
458
502
  const manifest: PluginManifest = {
459
503
  name: "my-plugin",
460
504
  version: "1.0.0",
461
- requires: { pluginRuntime: "v1" },
462
505
  config: configSchema,
463
506
  };
464
507
  ```
@@ -487,8 +530,8 @@ export interface PluginInitContext {
487
530
  credentials: Record<string, string>; // resolved credentials from requiresCredential
488
531
  logger: unknown; // pino child logger, tagged { plugin: <name> }
489
532
  pluginStorageDir: string; // <workspaceDir>/plugins-data/<name>/ (created by bootstrap)
490
- assistantVersion: string; // assistant semver
491
- apiVersions: Record<string, string[]>; // ASSISTANT_API_VERSIONS, for runtime checks
533
+ assistantVersion: string; // assistant semver — same value used by the loader
534
+ // against your peerDependencies range
492
535
  }
493
536
  ```
494
537
 
@@ -635,14 +678,6 @@ assistant's module graph.
635
678
  Do not add new HTTP endpoints to implement plugin-to-plugin messaging
636
679
  inside a single assistant process.
637
680
 
638
- `manifest.provides` is reserved as the hook for a future cross-plugin
639
- capability-negotiation protocol but is **not currently consumed by any
640
- runtime code**. Declaring `provides` today has no behavioral effect —
641
- plugins must not depend on it for capability discovery or any other
642
- runtime purpose. The field is intentionally retained on the manifest so
643
- that adding real consumers later does not require bumping
644
- `pluginRuntime` or any other capability version.
645
-
646
681
  ## Hot reload
647
682
 
648
683
  **Not supported in v1.** Registering a plugin takes effect at assistant
@@ -661,23 +696,29 @@ loop externally.
661
696
 
662
697
  ## Troubleshooting
663
698
 
664
- ### "plugin X must declare requires.pluginRuntime"
699
+ ### `external plugin X: peerDependencies["@vellumai/plugin-api"] requires "<range>" but assistant is <version> — loading anyway`
665
700
 
666
- The manifest's `requires` map is missing the `pluginRuntime` entry. Every
667
- plugin must negotiate against the base runtime:
701
+ Logged at `error` level. Your plugin's declared
702
+ `peerDependencies["@vellumai/plugin-api"]` range does not include the
703
+ running assistant's version. The plugin still loads while the install
704
+ flow is being shaped, but a future release will turn this into a hard
705
+ rejection. Either widen the range in your `package.json` (typically by
706
+ bumping the major in `^X.Y.Z`) or upgrade the assistant.
668
707
 
669
- ```typescript
670
- requires: { pluginRuntime: "v1" },
671
- ```
708
+ ### `external plugin X: peerDependencies["@vellumai/plugin-api"] is not a valid semver range — loading anyway`
709
+
710
+ Logged at `error` level, same lenient policy as above. The value declared
711
+ under `peerDependencies["@vellumai/plugin-api"]` is not parseable as a
712
+ semver range. Use a standard range expression such as `^0.8.0`,
713
+ `>=0.8.0 <0.10`, or an exact version.
672
714
 
673
- ### "plugin X requires Y@vN, assistant exposes (none|v...)"
715
+ ### `external plugin X missing plugin-api peerDependency loading without host-compat claim`
674
716
 
675
- The `requires` map names a capability the assistant does not expose, or
676
- asks for a version not listed under that capability. See
677
- `ASSISTANT_API_VERSIONS` in
678
- [`registry.ts`](../src/plugins/registry.ts) for the currently-exposed
679
- list. Either downgrade the required version or update your plugin to
680
- match.
717
+ Warning, not an error. Your plugin's `package.json` does not declare a
718
+ `peerDependencies["@vellumai/plugin-api"]` entry, so the loader has no
719
+ host-compat range to check and loads the plugin without that guard. Add
720
+ the peerDep so future assistant upgrades surface incompatibility before
721
+ the plugin runs.
681
722
 
682
723
  ### "plugin X is already registered"
683
724
 
package/docs/skills.md CHANGED
@@ -6,20 +6,22 @@ This document describes the security model for the Vellum Assistant skill system
6
6
 
7
7
  Skills extend the assistant's capabilities by providing instructions (via `SKILL.md`) and optional custom tools (via `TOOLS.json`). Skills can be **bundled** (shipped with the application), **managed** (user-installed via `scaffold_managed_skill`), **workspace** (project-local), or **extra** (additional directories configured by the user).
8
8
 
9
+ For managed skills, the installed source of truth is a valid directory at `~/.vellum/workspace/skills/<id>/` containing a top-level `SKILL.md` with standardized frontmatter. The assistant parses that frontmatter at startup and when skill directories change, then seeds Memory V2 skill entries under `skills/<id>` so the assistant can discover available skills from memory. The legacy `SKILLS.md` index is removed by workspace migration and is no longer created by install or scaffold paths.
10
+
9
11
  Because skills can introduce arbitrary tool behavior, they are subject to stricter permission defaults than core tools.
10
12
 
11
13
  ## Permission Defaults for Skill Tools
12
14
 
13
15
  Skill-origin tools follow a stricter default permission policy than core tools:
14
16
 
15
- | Scenario | Core tool behavior | Skill tool behavior |
16
- | ------------------------------------------------- | ----------------------------- | ------------------- |
17
+ | Scenario | Core tool behavior | Skill tool behavior |
18
+ | ------------------------------------------------- | ----------------------------------- | ------------------- |
17
19
  | Low risk, no matching rule | Auto-allowed (at default threshold) | **Prompted** |
18
- | Medium risk, no matching rule | Prompted | Prompted |
19
- | High risk, no matching rule | Prompted | Prompted |
20
- | Allow rule matches, non-high risk | Auto-allowed | Auto-allowed |
21
- | Allow rule matches, high risk, containerized bash | Auto-allowed (runtime check) | Auto-allowed |
22
- | Allow rule matches, high risk, other | Prompted | Prompted |
20
+ | Medium risk, no matching rule | Prompted | Prompted |
21
+ | High risk, no matching rule | Prompted | Prompted |
22
+ | Allow rule matches, non-high risk | Auto-allowed | Auto-allowed |
23
+ | Allow rule matches, high risk, containerized bash | Auto-allowed (runtime check) | Auto-allowed |
24
+ | Allow rule matches, high risk, other | Prompted | Prompted |
23
25
 
24
26
  Even if a skill's `TOOLS.json` declares `"risk": "low"` for one of its tools, the permission checker will prompt the user unless an explicit trust rule in `~/.vellum/protected/trust.json` allows it. This prevents third-party skill tools from silently auto-executing.
25
27
 
@@ -30,49 +30,49 @@ For the full plugin authoring guide, see
30
30
 
31
31
  ## Install locally
32
32
 
33
- The assistant scans `~/.vellum/plugins/*` for subdirectories containing a
33
+ The assistant scans `<workspaceDir>/plugins/*` (e.g.
34
+ `~/.vellum/workspace/plugins/`) for subdirectories containing a
34
35
  `register.{ts,js}` file and dynamic-imports each one during assistant
35
36
  startup. Dropping (or symlinking) this directory in place is enough to
36
37
  enable it.
37
38
 
38
- ### Option 1 symlink from the repo (recommended)
39
+ The plugin reads `registerPlugin` from `globalThis.__vellumPluginRuntime`,
40
+ which the daemon attaches before scanning plugins. This works against both
41
+ the `bun --compile`-bundled daemon binary AND a daemon running from
42
+ source — no special install procedure required either way.
43
+
44
+ ### Option 1 — symlink from the repo (simplest in-repo dev)
39
45
 
40
46
  From the repo root:
41
47
 
42
48
  ```bash
43
- mkdir -p ~/.vellum/plugins
44
- ln -s "$(pwd)/assistant/examples/plugins/echo" ~/.vellum/plugins/echo
49
+ mkdir -p ~/.vellum/workspace/plugins
50
+ ln -s "$(pwd)/assistant/examples/plugins/echo" ~/.vellum/workspace/plugins/echo
45
51
  ```
46
52
 
47
53
  Symlinks let you edit the plugin in-place and restart the assistant to
48
- pick up changes. **This is the only zero-edit install path** — the
49
- `register.ts` in this directory uses relative imports
50
- (`../../../src/plugins/registry.js`) that resolve into the in-repo
51
- assistant sources, so the file must stay reachable at that relative
52
- location.
53
-
54
- ### Option 2 standalone copy (requires edits)
55
-
56
- If you want a fully isolated install that does not depend on a local
57
- vellum-assistant checkout, a plain `cp -R` of this directory into
58
- `~/.vellum/plugins/echo/` will **not** work as-is: the relative imports
59
- in `register.ts` resolve to `~/.vellum/src/plugins/...`, which does not
60
- exist. The assistant does not currently publish the plugin API as an npm
61
- package, so to copy-and-adapt this template into a standalone plugin you
62
- must rewrite the imports in `register.ts` to point at an absolute path
63
- inside a vellum-assistant checkout, for example:
54
+ pick up changes.
55
+
56
+ ### Option 2 standalone copy
57
+
58
+ A plain `cp -R` of this directory into `~/.vellum/workspace/plugins/echo/`
59
+ works for the runtime imports (which go through the global bridge), but
60
+ the `import type` lines at the top of `register.ts` still resolve into
61
+ the in-repo assistant source tree. If your standalone copy lives outside
62
+ a vellum-assistant checkout, rewrite those `import type` paths to point
63
+ at an absolute path inside any checkout they're erased at compile time
64
+ and have no module-identity effect at runtime:
64
65
 
65
66
  ```ts
66
67
  // before (repo-local):
67
- import { registerPlugin } from "../../../src/plugins/registry.js";
68
+ import type { VellumPluginRuntime } from "../../../src/plugins/external-api.js";
69
+ import type { Plugin } from "../../../src/plugins/types.js";
68
70
  // after (standalone, edit to your checkout path):
69
- import { registerPlugin } from "/path/to/vellum-assistant/assistant/src/plugins/registry.js";
71
+ import type { VellumPluginRuntime } from "/path/to/vellum-assistant/assistant/src/plugins/external-api.js";
72
+ import type { Plugin } from "/path/to/vellum-assistant/assistant/src/plugins/types.js";
70
73
  ```
71
74
 
72
- Apply the same rewrite to the `import type` line that pulls from
73
- `../../../src/plugins/types.js`. Until a published package exists, the
74
- symlink recipe above is simpler and more portable for day-to-day
75
- development.
75
+ No runtime-import rewriting is needed the bridge already handles that.
76
76
 
77
77
  ### Restart the assistant
78
78
 
@@ -113,7 +113,7 @@ original error still propagates.
113
113
  Remove the symlink (or the copied directory) and restart the assistant:
114
114
 
115
115
  ```bash
116
- rm ~/.vellum/plugins/echo
116
+ rm ~/.vellum/workspace/plugins/echo
117
117
  vellum restart
118
118
  ```
119
119
 
@@ -9,6 +9,9 @@
9
9
  "engines": {
10
10
  "node": ">=20.12.0"
11
11
  },
12
+ "peerDependencies": {
13
+ "@vellumai/plugin-api": "^0.8.0"
14
+ },
12
15
  "devDependencies": {
13
16
  "@types/bun": "1.3.10",
14
17
  "@types/node": "25.5.0",
@@ -2,34 +2,26 @@
2
2
  * Echo plugin — observes every assistant pipeline and logs one structured
3
3
  * line per invocation to stderr.
4
4
  *
5
- * This plugin is bundled in the repository as an authoring reference. It is
6
- * not shipped with the assistant runtime; to try it locally, symlink this
7
- * directory into `~/.vellum/plugins/echo/` and restart the assistant. See
8
- * `README.md` in this directory for the full install recipe and
9
- * `assistant/docs/plugins.md` for general plugin authoring docs.
5
+ * Bundled in the repository as an authoring reference. To try it locally,
6
+ * symlink (or copy) this directory into `<workspaceDir>/plugins/echo/` and
7
+ * restart the assistant. See `README.md` in this directory for the install
8
+ * recipe and `assistant/docs/plugins.md` for general plugin authoring docs.
10
9
  *
11
- * ## IMPORTANT — imports below are REPO-LOCAL
10
+ * ## Runtime bridge
12
11
  *
13
- * The relative imports from `../../../src/plugins/...` resolve correctly
14
- * only while this file lives inside the vellum-assistant repo at
15
- * `assistant/examples/plugins/echo/`. The path walks back to
16
- * `assistant/src/plugins/` so the example compiles against the assistant's
17
- * in-repo types.
12
+ * The plugin reads `registerPlugin` from `globalThis.__vellumPluginRuntime`,
13
+ * a stable handle the daemon attaches at startup. This lets the same plugin
14
+ * file work whether the daemon is running from source (relative or absolute
15
+ * imports would resolve to the daemon's modules) or as a `bun --compile`
16
+ * binary (where absolute imports would load a disjoint disk copy with a
17
+ * separate registry instance). The bridge is documented in
18
+ * `assistant/src/plugins/external-api.ts`.
18
19
  *
19
- * If you copy (rather than symlink) this directory to
20
- * `~/.vellum/plugins/echo/`, these imports will fail because
21
- * `~/.vellum/src/plugins/...` does not exist. The assistant does not
22
- * currently publish the plugin API as an npm package, so the only
23
- * zero-edit install path is the symlink recipe (Option 1 in README.md).
24
- *
25
- * For a standalone copy that lives outside the repo, you must either:
26
- * - Point the imports at an absolute path into a vellum-assistant checkout
27
- * (`/path/to/vellum-assistant/assistant/src/plugins/registry.js`), or
28
- * - Rewrite the plugin to consume only the public types you need and drop
29
- * the direct registry import in favor of your own entry-point wiring.
30
- *
31
- * See README.md "Option 2 — standalone copy" for the recommended
32
- * standalone-template adaptation steps.
20
+ * Type imports below still come from the in-repo source tree. Types are
21
+ * erased at runtime, so they don't affect module identity — but they only
22
+ * resolve while this file lives inside the vellum-assistant checkout. For a
23
+ * standalone-copy install, rewrite the `import type` paths to absolute paths
24
+ * inside a checkout (or vendor only the types you need).
33
25
  *
34
26
  * ## Design
35
27
  *
@@ -48,7 +40,7 @@
48
40
  * user-plugin-loader contract (see `assistant/src/plugins/user-loader.ts`).
49
41
  */
50
42
 
51
- import { registerPlugin } from "../../../src/plugins/registry.js";
43
+ import type { VellumPluginRuntime } from "../../../src/plugins/external-api.js";
52
44
  import type {
53
45
  CircuitBreakerArgs,
54
46
  CircuitBreakerResult,
@@ -81,6 +73,15 @@ import type {
81
73
  TurnResult,
82
74
  } from "../../../src/plugins/types.js";
83
75
 
76
+ const runtime = (globalThis as { __vellumPluginRuntime?: VellumPluginRuntime })
77
+ .__vellumPluginRuntime;
78
+ if (!runtime || runtime.version !== 1) {
79
+ throw new Error(
80
+ "echo plugin: globalThis.__vellumPluginRuntime is missing or has an unexpected version — install a recent assistant build",
81
+ );
82
+ }
83
+ const { registerPlugin } = runtime;
84
+
84
85
  const PLUGIN_NAME = "echo";
85
86
 
86
87
  /**
@@ -136,9 +137,10 @@ function makeObserver<A, R>(
136
137
  * `PipelineMiddlewareMap` — all thin observers produced by `makeObserver`.
137
138
  *
138
139
  * Manifest:
139
- * - `requires.pluginRuntime: "v1"` satisfies the registry's mandatory
140
- * capability negotiation.
141
- * - `provides: {}` — the plugin exposes no capabilities to other plugins.
140
+ * - Host-compat range lives in `package.json` under
141
+ * `peerDependencies["@vellumai/plugin-api"]`. The external-plugin loader
142
+ * validates it against the running assistant version via
143
+ * `semver.satisfies()` before this file is even imported.
142
144
  * - No `requiresCredential` or `requiresFlag` — the plugin needs no external
143
145
  * state and runs unconditionally.
144
146
  */
@@ -146,8 +148,6 @@ const echoPlugin: Plugin = {
146
148
  manifest: {
147
149
  name: PLUGIN_NAME,
148
150
  version: "0.1.0",
149
- provides: {},
150
- requires: { pluginRuntime: "v1" },
151
151
  },
152
152
  middleware: {
153
153
  turn: makeObserver<TurnArgs, TurnResult>("turn"),