@vellumai/assistant 0.8.1 → 0.8.2

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 (506) hide show
  1. package/ARCHITECTURE.md +2 -7
  2. package/Dockerfile +75 -1
  3. package/bun.lock +11 -1
  4. package/docker-entrypoint.sh +5 -0
  5. package/docker-init-apt-root.sh +94 -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 +325 -3
  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-wake-disk-pressure-callsite.test.ts +131 -0
  21. package/src/__tests__/anthropic-provider.test.ts +45 -0
  22. package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
  23. package/src/__tests__/app-executors.test.ts +220 -4
  24. package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
  25. package/src/__tests__/bundled-asset.test.ts +6 -6
  26. package/src/__tests__/channel-availability-routes.test.ts +206 -0
  27. package/src/__tests__/channel-delivery-store.test.ts +289 -1
  28. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
  29. package/src/__tests__/clawhub.test.ts +75 -16
  30. package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
  31. package/src/__tests__/config-schema.test.ts +21 -0
  32. package/src/__tests__/config-set-route.test.ts +80 -0
  33. package/src/__tests__/config-sounds-sync.test.ts +97 -0
  34. package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
  35. package/src/__tests__/context-search-conversations-source.test.ts +117 -2
  36. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
  37. package/src/__tests__/context-search-workspace-source.test.ts +7 -0
  38. package/src/__tests__/context-token-estimator.test.ts +1 -0
  39. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
  40. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
  41. package/src/__tests__/conversation-agent-loop-overflow.test.ts +92 -92
  42. package/src/__tests__/conversation-agent-loop.test.ts +2 -0
  43. package/src/__tests__/conversation-error.test.ts +42 -3
  44. package/src/__tests__/conversation-fork-crud.test.ts +82 -0
  45. package/src/__tests__/conversation-inference-profile-route.test.ts +40 -4
  46. package/src/__tests__/conversation-lifecycle.test.ts +173 -0
  47. package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
  48. package/src/__tests__/conversation-pairing.test.ts +54 -0
  49. package/src/__tests__/conversation-process-callsite.test.ts +4 -1
  50. package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
  51. package/src/__tests__/conversation-queue.test.ts +4 -1
  52. package/src/__tests__/conversation-runtime-assembly.test.ts +76 -9
  53. package/src/__tests__/conversation-slash-queue.test.ts +59 -1
  54. package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
  55. package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
  56. package/src/__tests__/conversation-sync-tags.test.ts +235 -0
  57. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  58. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  59. package/src/__tests__/credential-security-invariants.test.ts +3 -2
  60. package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
  61. package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
  62. package/src/__tests__/disk-pressure-tools.test.ts +1 -0
  63. package/src/__tests__/dm-backfill.test.ts +121 -10
  64. package/src/__tests__/document-tool-security.test.ts +258 -0
  65. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  66. package/src/__tests__/edit-propagation.test.ts +33 -0
  67. package/src/__tests__/empty-response-pipeline.test.ts +0 -4
  68. package/src/__tests__/external-plugin-loader.test.ts +60 -36
  69. package/src/__tests__/filing-service.test.ts +140 -0
  70. package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
  71. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
  72. package/src/__tests__/helpers/tar-fixtures.ts +39 -0
  73. package/src/__tests__/helpers/wait-for.ts +21 -0
  74. package/src/__tests__/history-repair-pipeline.test.ts +0 -3
  75. package/src/__tests__/history-repair.test.ts +73 -0
  76. package/src/__tests__/host-app-control-proxy.test.ts +266 -10
  77. package/src/__tests__/image-credentials.test.ts +1 -1
  78. package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
  79. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +1 -1
  80. package/src/__tests__/inference-profile-reaper.test.ts +4 -2
  81. package/src/__tests__/inference-profile-session-handler.test.ts +18 -6
  82. package/src/__tests__/inference-profile-session-ipc.test.ts +17 -5
  83. package/src/__tests__/injector-chain.test.ts +10 -8
  84. package/src/__tests__/install-skill-routing.test.ts +155 -37
  85. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +92 -3
  86. package/src/__tests__/list-messages-page-latest.test.ts +55 -0
  87. package/src/__tests__/llm-call-pipeline.test.ts +0 -3
  88. package/src/__tests__/llm-catalog-parity.test.ts +55 -13
  89. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +34 -0
  90. package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
  91. package/src/__tests__/llm-usage-store.test.ts +114 -0
  92. package/src/__tests__/managed-profile-guard.test.ts +31 -29
  93. package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
  94. package/src/__tests__/managed-store.test.ts +84 -192
  95. package/src/__tests__/media-generate-image.test.ts +1 -1
  96. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
  97. package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
  98. package/src/__tests__/oauth-commands-routes.test.ts +168 -16
  99. package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
  100. package/src/__tests__/openai-provider.test.ts +24 -0
  101. package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
  102. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
  103. package/src/__tests__/persistence-pipeline.test.ts +0 -2
  104. package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
  105. package/src/__tests__/platform.test.ts +2 -0
  106. package/src/__tests__/plugin-api-shim.test.ts +125 -0
  107. package/src/__tests__/plugin-bootstrap.test.ts +10 -36
  108. package/src/__tests__/plugin-external-api.test.ts +68 -0
  109. package/src/__tests__/plugin-registry.test.ts +0 -77
  110. package/src/__tests__/plugin-route-contribution.test.ts +0 -1
  111. package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
  112. package/src/__tests__/plugin-tool-contribution.test.ts +16 -15
  113. package/src/__tests__/plugin-types.test.ts +3 -13
  114. package/src/__tests__/process-message-background-slack.test.ts +8 -1
  115. package/src/__tests__/process-message-display-content.test.ts +421 -0
  116. package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
  117. package/src/__tests__/provider-error-scenarios.test.ts +111 -0
  118. package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +8 -8
  119. package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
  120. package/src/__tests__/schedule-routes.test.ts +50 -3
  121. package/src/__tests__/schedule-store.test.ts +94 -0
  122. package/src/__tests__/scheduler-reuse-conversation.test.ts +54 -7
  123. package/src/__tests__/schema-transforms.test.ts +20 -0
  124. package/src/__tests__/search-skills-unified.test.ts +0 -5
  125. package/src/__tests__/server-history-render.test.ts +43 -0
  126. package/src/__tests__/skill-load-feature-flag.test.ts +0 -12
  127. package/src/__tests__/skill-load-tool.test.ts +27 -89
  128. package/src/__tests__/skill-memory.test.ts +23 -3
  129. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
  130. package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
  131. package/src/__tests__/skills-install-extract.test.ts +49 -38
  132. package/src/__tests__/skills-install-staging.test.ts +159 -0
  133. package/src/__tests__/skills-uninstall.test.ts +9 -41
  134. package/src/__tests__/skills.test.ts +51 -58
  135. package/src/__tests__/slack-channel-config.test.ts +9 -0
  136. package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
  137. package/src/__tests__/system-prompt.test.ts +737 -63
  138. package/src/__tests__/terminal-tools.test.ts +28 -1
  139. package/src/__tests__/thread-backfill.test.ts +557 -27
  140. package/src/__tests__/title-generate-pipeline.test.ts +0 -13
  141. package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
  142. package/src/__tests__/tool-error-pipeline.test.ts +0 -3
  143. package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
  144. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  145. package/src/__tests__/tool-executor.test.ts +16 -4
  146. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
  147. package/src/__tests__/turn-events-store.test.ts +256 -0
  148. package/src/__tests__/twilio-routes.test.ts +4 -0
  149. package/src/__tests__/user-plugin-loader.test.ts +0 -7
  150. package/src/__tests__/voice-session-bridge.test.ts +198 -0
  151. package/src/__tests__/web-search-catalog-parity.test.ts +32 -10
  152. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +115 -3
  153. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +50 -0
  154. package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
  155. package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
  156. package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
  157. package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
  158. package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
  159. package/src/acp/resolve-agent.ts +1 -1
  160. package/src/agent/image-optimize.ts +13 -5
  161. package/src/calls/voice-session-bridge.ts +61 -42
  162. package/src/channels/types.ts +108 -0
  163. package/src/cli/__tests__/unknown-command.test.ts +24 -0
  164. package/src/cli/commands/__tests__/changelog.test.ts +304 -319
  165. package/src/cli/commands/__tests__/schedules.test.ts +491 -0
  166. package/src/cli/commands/changelog.ts +106 -42
  167. package/src/cli/commands/conversations.ts +102 -17
  168. package/src/cli/commands/default-action.ts +10 -53
  169. package/src/cli/commands/notifications.ts +329 -317
  170. package/src/cli/commands/plugins.ts +185 -0
  171. package/src/cli/commands/schedules.ts +391 -0
  172. package/src/cli/commands/telemetry.ts +40 -0
  173. package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
  174. package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
  175. package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
  176. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
  177. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
  178. package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
  179. package/src/cli/lib/cli-colors.ts +12 -0
  180. package/src/cli/lib/confirm-prompt.ts +79 -0
  181. package/src/cli/lib/install-from-github.ts +304 -0
  182. package/src/cli/lib/list-installed-plugins.ts +137 -0
  183. package/src/cli/lib/uninstall-plugin.ts +82 -0
  184. package/src/cli/lib/unknown-command.ts +111 -0
  185. package/src/cli/program.ts +38 -2
  186. package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
  187. package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
  188. package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
  189. package/src/config/bundled-skills/document/SKILL.md +23 -3
  190. package/src/config/bundled-skills/document/TOOLS.json +53 -0
  191. package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
  192. package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
  193. package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
  194. package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
  195. package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
  196. package/src/config/bundled-tool-registry.ts +6 -0
  197. package/src/config/feature-flag-registry.json +41 -1
  198. package/src/config/loader.ts +64 -38
  199. package/src/config/schema.ts +7 -10
  200. package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
  201. package/src/config/schemas/channels.ts +8 -0
  202. package/src/config/schemas/compaction.ts +28 -0
  203. package/src/config/schemas/heartbeat.ts +9 -0
  204. package/src/config/schemas/llm-request-logs.ts +31 -7
  205. package/src/config/schemas/llm.ts +3 -0
  206. package/src/config/schemas/memory-retrieval.ts +18 -0
  207. package/src/config/schemas/tools.ts +14 -0
  208. package/src/config/skills.ts +3 -96
  209. package/src/context/compactor.ts +1047 -0
  210. package/src/context/token-estimator.ts +2 -2
  211. package/src/context/window-manager.ts +197 -1520
  212. package/src/credential-execution/managed-catalog.ts +37 -0
  213. package/src/credential-health/credential-health-service.ts +280 -19
  214. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +34 -0
  215. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
  216. package/src/daemon/__tests__/conversation-tool-setup.test.ts +74 -0
  217. package/src/daemon/approval-generators.ts +8 -6
  218. package/src/daemon/config-watcher.ts +94 -31
  219. package/src/daemon/conversation-agent-loop.ts +169 -9
  220. package/src/daemon/conversation-error.ts +171 -37
  221. package/src/daemon/conversation-lifecycle.ts +53 -40
  222. package/src/daemon/conversation-messaging.ts +25 -6
  223. package/src/daemon/conversation-process.ts +49 -12
  224. package/src/daemon/conversation-runtime-assembly.ts +16 -1
  225. package/src/daemon/conversation-slash.ts +12 -5
  226. package/src/daemon/conversation-store.ts +11 -4
  227. package/src/daemon/conversation-tool-setup.ts +39 -7
  228. package/src/daemon/conversation.ts +33 -1
  229. package/src/daemon/external-plugins-bootstrap.ts +217 -181
  230. package/src/daemon/first-greeting.ts +22 -2
  231. package/src/daemon/handlers/config-model.ts +6 -5
  232. package/src/daemon/handlers/config-slack-channel.ts +15 -3
  233. package/src/daemon/handlers/shared.ts +14 -5
  234. package/src/daemon/handlers/skills.ts +111 -108
  235. package/src/daemon/history-repair.ts +28 -1
  236. package/src/daemon/host-app-control-proxy.ts +98 -23
  237. package/src/daemon/lifecycle.ts +45 -35
  238. package/src/daemon/meet-host-supervisor.ts +5 -4
  239. package/src/daemon/memory-v2-startup.ts +49 -0
  240. package/src/daemon/message-protocol.ts +1 -0
  241. package/src/daemon/message-types/conversations.ts +25 -0
  242. package/src/daemon/message-types/messages.ts +61 -0
  243. package/src/daemon/message-types/subagents.ts +1 -0
  244. package/src/daemon/message-types/sync.ts +1 -0
  245. package/src/daemon/pkb-reminder-builder.test.ts +1 -1
  246. package/src/daemon/pkb-reminder-builder.ts +1 -1
  247. package/src/daemon/plugin-source-watcher.ts +146 -0
  248. package/src/daemon/process-message.ts +21 -3
  249. package/src/daemon/server.ts +11 -2
  250. package/src/daemon/skill-memory-refresh.ts +29 -0
  251. package/src/documents/document-store.ts +221 -3
  252. package/src/embedded/plugin-api.ts +40 -0
  253. package/src/filing/filing-service.ts +39 -0
  254. package/src/heartbeat/__tests__/heartbeat-service.test.ts +91 -6
  255. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  256. package/src/heartbeat/heartbeat-service.ts +41 -0
  257. package/src/home/__tests__/feed-types.test.ts +40 -0
  258. package/src/home/feed-types.ts +22 -0
  259. package/src/home/post-connect-feed.ts +1 -0
  260. package/src/index.ts +18 -1
  261. package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
  262. package/src/mcp/client.ts +20 -4
  263. package/src/media/image-credentials.ts +3 -3
  264. package/src/memory/__tests__/bookmark-crud.test.ts +33 -27
  265. package/src/memory/__tests__/conversation-queries.test.ts +263 -0
  266. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
  267. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +119 -14
  268. package/src/memory/__tests__/message-content.test.ts +35 -0
  269. package/src/memory/bookmark-crud.ts +42 -10
  270. package/src/memory/context-search/sources/conversations.ts +62 -2
  271. package/src/memory/context-search/sources/workspace.ts +4 -0
  272. package/src/memory/conversation-crud.ts +63 -19
  273. package/src/memory/conversation-queries.ts +110 -10
  274. package/src/memory/db-init.ts +6 -0
  275. package/src/memory/delivery-crud.ts +152 -5
  276. package/src/memory/embedding-backend.ts +4 -4
  277. package/src/memory/external-conversation-store.ts +66 -5
  278. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
  279. package/src/memory/graph/conversation-graph-memory.ts +31 -15
  280. package/src/memory/graph/tools.ts +3 -3
  281. package/src/memory/indexer.ts +34 -29
  282. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +73 -0
  283. package/src/memory/jobs/embed-concept-page.ts +20 -11
  284. package/src/memory/jobs-worker.ts +6 -1
  285. package/src/memory/llm-request-log-source-clickhouse.ts +17 -10
  286. package/src/memory/llm-request-log-source.ts +19 -52
  287. package/src/memory/llm-usage-store.ts +125 -5
  288. package/src/memory/memory-retrospective-startup-cleanup.ts +72 -5
  289. package/src/memory/message-content.ts +1 -1
  290. package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
  291. package/src/memory/migrations/229-delete-private-conversations.test.ts +38 -1
  292. package/src/memory/migrations/229-delete-private-conversations.ts +7 -0
  293. package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
  294. package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
  295. package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
  296. package/src/memory/migrations/index.ts +6 -0
  297. package/src/memory/migrations/registry.ts +8 -0
  298. package/src/memory/onboarding-events-store.ts +106 -0
  299. package/src/memory/schema/bookmarks.ts +0 -2
  300. package/src/memory/schema/calls.ts +1 -0
  301. package/src/memory/schema/inference.ts +1 -3
  302. package/src/memory/schema/infrastructure.ts +12 -0
  303. package/src/memory/turn-events-store.ts +127 -2
  304. package/src/memory/v2/__tests__/activation.test.ts +0 -8
  305. package/src/memory/v2/__tests__/injection.test.ts +98 -8
  306. package/src/memory/v2/__tests__/migration.test.ts +87 -0
  307. package/src/memory/v2/__tests__/page-index.test.ts +83 -0
  308. package/src/memory/v2/__tests__/prompts-router.test.ts +58 -6
  309. package/src/memory/v2/__tests__/qdrant.test.ts +66 -3
  310. package/src/memory/v2/__tests__/router.test.ts +15 -0
  311. package/src/memory/v2/__tests__/skill-store.test.ts +387 -8
  312. package/src/memory/v2/injection.ts +32 -6
  313. package/src/memory/v2/migration.ts +49 -19
  314. package/src/memory/v2/page-index.ts +35 -5
  315. package/src/memory/v2/prompts/router.ts +11 -8
  316. package/src/memory/v2/prompts/sweep.ts +2 -2
  317. package/src/memory/v2/qdrant.ts +135 -7
  318. package/src/memory/v2/router.ts +9 -8
  319. package/src/memory/v2/skill-store.ts +120 -35
  320. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
  321. package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
  322. package/src/messaging/providers/slack/adapter.ts +43 -5
  323. package/src/messaging/providers/slack/client.ts +27 -0
  324. package/src/messaging/providers/slack/deep-link.ts +65 -0
  325. package/src/messaging/providers/slack/download.ts +104 -0
  326. package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
  327. package/src/messaging/providers/slack/message-metadata.ts +27 -0
  328. package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
  329. package/src/messaging/providers/slack/render-transcript.ts +69 -5
  330. package/src/messaging/providers/slack/types.ts +20 -1
  331. package/src/notifications/conversation-pairing.ts +2 -1
  332. package/src/notifications/decision-engine.ts +2 -1
  333. package/src/notifications/emit-signal.ts +20 -1
  334. package/src/notifications/home-feed-side-effect.ts +54 -0
  335. package/src/notifications/signal.ts +3 -1
  336. package/src/oauth/connection-resolver.ts +8 -4
  337. package/src/oauth/platform-connection.ts +6 -2
  338. package/src/oauth/seed-providers.ts +10 -1
  339. package/src/permissions/checker.ts +2 -0
  340. package/src/permissions/ipc-risk-types.ts +1 -0
  341. package/src/permissions/question-prompter.test.ts +416 -0
  342. package/src/permissions/question-prompter.ts +294 -0
  343. package/src/platform/client.test.ts +1 -1
  344. package/src/platform/client.ts +1 -1
  345. package/src/plugin-api/constants.ts +26 -0
  346. package/src/plugin-api/index.ts +34 -1
  347. package/src/plugin-api/types.ts +104 -22
  348. package/src/plugins/defaults/circuit-breaker.ts +0 -5
  349. package/src/plugins/defaults/compaction.ts +0 -4
  350. package/src/plugins/defaults/empty-response.ts +0 -2
  351. package/src/plugins/defaults/history-repair.ts +0 -2
  352. package/src/plugins/defaults/injectors.ts +36 -3
  353. package/src/plugins/defaults/llm-call.ts +0 -2
  354. package/src/plugins/defaults/memory-retrieval.ts +0 -1
  355. package/src/plugins/defaults/overflow-reduce.ts +0 -1
  356. package/src/plugins/defaults/persistence.ts +0 -2
  357. package/src/plugins/defaults/title-generate.ts +0 -5
  358. package/src/plugins/defaults/token-estimate.ts +0 -2
  359. package/src/plugins/defaults/tool-error.ts +0 -7
  360. package/src/plugins/defaults/tool-execute.ts +0 -2
  361. package/src/plugins/defaults/tool-result-truncate.ts +0 -4
  362. package/src/plugins/ensure-plugin-api-shim.ts +96 -0
  363. package/src/plugins/external-api.ts +104 -0
  364. package/src/plugins/external-plugin-loader.ts +105 -32
  365. package/src/plugins/feature-gate.ts +22 -0
  366. package/src/plugins/pipeline.ts +37 -0
  367. package/src/plugins/registry.ts +48 -80
  368. package/src/plugins/types.ts +31 -26
  369. package/src/plugins/user-loader.ts +21 -2
  370. package/src/proactive-artifact/aux-message-injector.ts +11 -0
  371. package/src/proactive-artifact/job.test.ts +37 -5
  372. package/src/prompts/__tests__/system-prompt.test.ts +12 -0
  373. package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
  374. package/src/prompts/normalize-onboarding.ts +27 -0
  375. package/src/prompts/sections.ts +302 -0
  376. package/src/prompts/system-prompt.ts +63 -166
  377. package/src/prompts/templates/BOOTSTRAP.md +17 -1
  378. package/src/prompts/templates/system-sections.ts +173 -0
  379. package/src/providers/__tests__/inference.test.ts +22 -7
  380. package/src/providers/anthropic/client.ts +28 -28
  381. package/src/providers/connection-resolution.ts +7 -0
  382. package/src/providers/inference/adapter-factory.ts +41 -4
  383. package/src/providers/inference/connections.ts +74 -29
  384. package/src/providers/inference/resolve-auth.ts +12 -4
  385. package/src/providers/model-catalog.ts +294 -12
  386. package/src/providers/openai/chat-completions-provider.ts +10 -2
  387. package/src/providers/openrouter/client.ts +7 -0
  388. package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
  389. package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
  390. package/src/providers/provider-availability.ts +17 -2
  391. package/src/providers/provider-catalog-visibility.ts +36 -0
  392. package/src/providers/registry.ts +22 -14
  393. package/src/providers/retry.ts +47 -1
  394. package/src/runtime/__tests__/agent-wake.test.ts +152 -0
  395. package/src/runtime/agent-wake.ts +42 -14
  396. package/src/runtime/auth/route-policy.ts +8 -1
  397. package/src/runtime/btw-sidechain.ts +2 -0
  398. package/src/runtime/http-types.ts +19 -0
  399. package/src/runtime/migrations/origin-mode.ts +1 -1
  400. package/src/runtime/pending-interactions.ts +1 -0
  401. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +17 -0
  402. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
  403. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +107 -20
  404. package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
  405. package/src/runtime/routes/__tests__/tts-routes.test.ts +64 -1
  406. package/src/runtime/routes/acp-routes-list.test.ts +143 -0
  407. package/src/runtime/routes/acp-routes.ts +5 -3
  408. package/src/runtime/routes/auth-routes.ts +1 -1
  409. package/src/runtime/routes/bookmark-routes.ts +5 -3
  410. package/src/runtime/routes/btw-routes.ts +5 -1
  411. package/src/runtime/routes/channel-availability-routes.ts +121 -0
  412. package/src/runtime/routes/conversation-cli-routes.ts +44 -3
  413. package/src/runtime/routes/conversation-list-routes.ts +3 -20
  414. package/src/runtime/routes/conversation-management-routes.ts +17 -42
  415. package/src/runtime/routes/conversation-query-routes.ts +40 -35
  416. package/src/runtime/routes/conversation-routes.ts +90 -11
  417. package/src/runtime/routes/documents-routes.ts +25 -86
  418. package/src/runtime/routes/group-routes.ts +5 -0
  419. package/src/runtime/routes/inbound-conversation.ts +28 -8
  420. package/src/runtime/routes/inbound-message-handler.ts +236 -41
  421. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +111 -0
  422. package/src/runtime/routes/inbound-stages/background-dispatch.ts +32 -1
  423. package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
  424. package/src/runtime/routes/index.ts +6 -0
  425. package/src/runtime/routes/inference-profile-session-handler.ts +17 -44
  426. package/src/runtime/routes/inference-profile-session-reaper.ts +7 -21
  427. package/src/runtime/routes/inference-provider-connection-routes.ts +65 -21
  428. package/src/runtime/routes/integrations/slack/share.ts +4 -52
  429. package/src/runtime/routes/integrations/slack/token.ts +43 -0
  430. package/src/runtime/routes/integrations/twilio.ts +6 -13
  431. package/src/runtime/routes/notification-routes.ts +1 -1
  432. package/src/runtime/routes/oauth-commands-routes.ts +105 -15
  433. package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
  434. package/src/runtime/routes/question-routes.ts +259 -0
  435. package/src/runtime/routes/rename-conversation-routes.ts +2 -33
  436. package/src/runtime/routes/schedule-routes.ts +4 -7
  437. package/src/runtime/routes/subagents-routes.ts +57 -18
  438. package/src/runtime/routes/telemetry-routes.ts +27 -0
  439. package/src/runtime/routes/tts-routes.ts +27 -2
  440. package/src/runtime/routes/workspace-routes.test.ts +43 -0
  441. package/src/runtime/routes/workspace-routes.ts +28 -0
  442. package/src/runtime/services/conversation-serializer.ts +39 -7
  443. package/src/runtime/sync/resource-sync-events.ts +93 -1
  444. package/src/schedule/schedule-store.ts +27 -2
  445. package/src/schedule/scheduler.ts +9 -1
  446. package/src/security/__tests__/untrusted-content.test.ts +86 -0
  447. package/src/security/untrusted-content.ts +93 -8
  448. package/src/skills/catalog-files.ts +1 -1
  449. package/src/skills/catalog-install.ts +233 -116
  450. package/src/skills/clawhub.ts +70 -13
  451. package/src/skills/managed-store.ts +4 -119
  452. package/src/skills/skillssh-registry.ts +27 -48
  453. package/src/subagent/manager.ts +15 -7
  454. package/src/telemetry/types.ts +113 -1
  455. package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
  456. package/src/telemetry/usage-telemetry-reporter.ts +113 -7
  457. package/src/tools/apps/executors.ts +58 -7
  458. package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
  459. package/src/tools/ask-question/ask-question-tool.ts +304 -0
  460. package/src/tools/browser/browser-execution.ts +15 -11
  461. package/src/tools/computer-use/definitions.ts +3 -3
  462. package/src/tools/credentials/vault.ts +1 -1
  463. package/src/tools/document/document-tool.ts +124 -1
  464. package/src/tools/filesystem/edit.ts +1 -1
  465. package/src/tools/filesystem/list.ts +1 -1
  466. package/src/tools/filesystem/read.ts +1 -1
  467. package/src/tools/filesystem/write.ts +5 -2
  468. package/src/tools/host-filesystem/transfer.ts +1 -1
  469. package/src/tools/host-terminal/host-shell.ts +1 -1
  470. package/src/tools/permission-checker.ts +1 -1
  471. package/src/tools/registry.ts +17 -7
  472. package/src/tools/schedule/create.ts +2 -2
  473. package/src/tools/schema-transforms.ts +7 -2
  474. package/src/tools/side-effects.ts +1 -0
  475. package/src/tools/skills/delete-managed.ts +4 -4
  476. package/src/tools/skills/execute.ts +1 -1
  477. package/src/tools/skills/scaffold-managed.ts +3 -2
  478. package/src/tools/subagent/notify-parent.ts +1 -1
  479. package/src/tools/system/request-permission.ts +2 -2
  480. package/src/tools/terminal/safe-env.ts +60 -1
  481. package/src/tools/tool-manifest.ts +2 -0
  482. package/src/tools/types.ts +72 -21
  483. package/src/tools/ui-surface/definitions.ts +6 -5
  484. package/src/tts/__tests__/provider-adapters.test.ts +76 -2
  485. package/src/tts/providers/elevenlabs-provider.ts +75 -1
  486. package/src/types/onboarding-context.ts +2 -0
  487. package/src/util/errors.ts +17 -0
  488. package/src/util/platform.ts +10 -0
  489. package/src/watcher/__tests__/engine.test.ts +22 -0
  490. package/src/watcher/engine.ts +6 -2
  491. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +80 -15
  492. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +35 -22
  493. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +3 -1
  494. package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
  495. package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
  496. package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
  497. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
  498. package/src/workspace/migrations/registry.ts +8 -0
  499. package/src/workspace/migrations/runner.ts +39 -9
  500. package/src/workspace/migrations/types.ts +4 -0
  501. package/examples/plugins/echo/bun.lock +0 -25
  502. package/src/__tests__/context-window-manager.test.ts +0 -2481
  503. package/src/context/__tests__/compact-prompt.test.ts +0 -63
  504. package/src/context/prompts/compact.md +0 -26
  505. package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
  506. /package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +0 -0
package/ARCHITECTURE.md CHANGED
@@ -1227,9 +1227,8 @@ graph TB
1227
1227
 
1228
1228
  subgraph "2. Persist (Filesystem)"
1229
1229
  SCAFFOLD["scaffold_managed_skill<br/>───────────────<br/>RiskLevel: High<br/>Requires user consent"]
1230
- MANAGED_STORE["managed-store.ts<br/>───────────────<br/>validateManagedSkillId()<br/>buildSkillMarkdown()<br/>createManagedSkill()<br/>upsertSkillsIndexEntry()"]
1230
+ MANAGED_STORE["managed-store.ts<br/>───────────────<br/>validateManagedSkillId()<br/>buildSkillMarkdown()<br/>createManagedSkill()"]
1231
1231
  SKILL_DIR["~/.vellum/workspace/skills/&lt;id&gt;/<br/>SKILL.md (frontmatter + body)"]
1232
- INDEX["~/.vellum/workspace/skills/<br/>SKILLS.md (index)"]
1233
1232
  end
1234
1233
 
1235
1234
  subgraph "3. Load & Use"
@@ -1240,7 +1239,6 @@ graph TB
1240
1239
  subgraph "4. Delete"
1241
1240
  DELETE["delete_managed_skill<br/>───────────────<br/>RiskLevel: High<br/>Requires user consent"]
1242
1241
  RM_DIR["rmSync skill directory"]
1243
- RM_INDEX["removeSkillsIndexEntry()"]
1244
1242
  end
1245
1243
 
1246
1244
  subgraph "File Watcher"
@@ -1257,17 +1255,14 @@ graph TB
1257
1255
 
1258
1256
  SCAFFOLD --> MANAGED_STORE
1259
1257
  MANAGED_STORE --> SKILL_DIR
1260
- MANAGED_STORE --> INDEX
1261
1258
 
1262
1259
  SKILL_DIR --> WATCHER
1263
- INDEX --> WATCHER
1264
1260
  WATCHER --> EVICT
1265
1261
 
1266
1262
  SKILL_DIR --> SKILL_LOAD
1267
1263
  SKILL_LOAD --> SESSION
1268
1264
 
1269
1265
  DELETE --> RM_DIR
1270
- DELETE --> RM_INDEX
1271
1266
  RM_DIR --> WATCHER
1272
1267
  ```
1273
1268
 
@@ -1275,7 +1270,7 @@ graph TB
1275
1270
 
1276
1271
  - `evaluate_typescript_code` always forces `sandbox.enabled = true` regardless of global config.
1277
1272
  - Snippet contract: must export `default` or `run` with signature `(input: unknown) => unknown | Promise<unknown>`.
1278
- - Managed-store writes are atomic (tmp file + rename) to prevent partial `SKILL.md` or `SKILLS.md` files.
1273
+ - Managed-store writes are atomic (tmp file + rename) to prevent partial `SKILL.md` files.
1279
1274
  - After persist or delete, the file watcher triggers conversation eviction; the next turn runs in a fresh conversation. The model's system prompt instructs it to continue normally.
1280
1275
  - macOS UI shows Inspect and Delete controls for managed skills only (source = "managed").
1281
1276
  - `skill_load` resolves the recursive include graph (via `include-graph.ts`) before emitting output. Missing children are listed as suggested skills without child `<loaded_skill>` markers; cycles still produce `isError: true` with no marker. Valid includes produce an "Included Skills (immediate)" metadata section showing child ID, name, description, and path.
package/Dockerfile CHANGED
@@ -73,6 +73,9 @@ RUN apt-get update && apt-get install -y \
73
73
  bubblewrap \
74
74
  ca-certificates \
75
75
  curl \
76
+ debootstrap \
77
+ debian-archive-keyring \
78
+ debconf \
76
79
  ffmpeg \
77
80
  fonts-freefont-ttf \
78
81
  g++ \
@@ -117,6 +120,7 @@ RUN apt-get update && apt-get install -y \
117
120
  unzip \
118
121
  uuid-runtime \
119
122
  vim \
123
+ wget \
120
124
  xclip \
121
125
  xdg-utils \
122
126
  && rm -rf /var/lib/apt/lists/*
@@ -147,6 +151,76 @@ ENV PATH="${BUN_INSTALL}/bin:${PATH}"
147
151
  ENV PYTHONUSERBASE="/home/assistant/.python"
148
152
  ENV PATH="${PYTHONUSERBASE}/bin:${PATH}"
149
153
 
154
+ RUN printf '%s\n' \
155
+ 'if [ -r /app/assistant/docker-kata-apt-env.sh ]; then' \
156
+ ' . /app/assistant/docker-kata-apt-env.sh' \
157
+ 'fi' \
158
+ > /etc/profile.d/vellum-kata-apt-root.sh && \
159
+ printf '%s\n' \
160
+ '' \
161
+ 'if [ -r /etc/profile.d/vellum-kata-apt-root.sh ]; then' \
162
+ ' . /etc/profile.d/vellum-kata-apt-root.sh' \
163
+ 'fi' \
164
+ >> /etc/bash.bashrc && \
165
+ printf '%s\n' \
166
+ '' \
167
+ 'if [ -r /etc/profile.d/vellum-kata-apt-root.sh ]; then' \
168
+ ' . /etc/profile.d/vellum-kata-apt-root.sh' \
169
+ 'fi' \
170
+ >> /root/.bashrc && \
171
+ printf '%s\n' \
172
+ '' \
173
+ 'if [ -r /etc/profile.d/vellum-kata-apt-root.sh ]; then' \
174
+ ' . /etc/profile.d/vellum-kata-apt-root.sh' \
175
+ 'fi' \
176
+ >> /home/assistant/.bashrc && \
177
+ chown assistant:assistant /home/assistant/.bashrc
178
+
179
+ RUN printf '%s\n' \
180
+ '#!/usr/bin/env sh' \
181
+ 'set -eu' \
182
+ 'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
183
+ ' exec /usr/bin/apt-get "$@"' \
184
+ 'fi' \
185
+ 'export DEBIAN_FRONTEND=noninteractive' \
186
+ 'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
187
+ '/app/assistant/docker-init-apt-root.sh' \
188
+ 'if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt-get" ] && [ -f "${DATA_ROOT}/.rootfs-initialized" ] && ! grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then' \
189
+ ' exec chroot "${DATA_ROOT}" /usr/bin/apt-get "$@"' \
190
+ 'fi' \
191
+ 'exec /usr/bin/apt-get "$@"' \
192
+ > /usr/local/bin/apt-get && \
193
+ chmod +x /usr/local/bin/apt-get && \
194
+ printf '%s\n' \
195
+ '#!/usr/bin/env sh' \
196
+ 'set -eu' \
197
+ 'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
198
+ ' exec /usr/bin/apt "$@"' \
199
+ 'fi' \
200
+ 'export DEBIAN_FRONTEND=noninteractive' \
201
+ 'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
202
+ '/app/assistant/docker-init-apt-root.sh' \
203
+ 'if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt" ] && [ -f "${DATA_ROOT}/.rootfs-initialized" ] && ! grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then' \
204
+ ' exec chroot "${DATA_ROOT}" /usr/bin/apt "$@"' \
205
+ 'fi' \
206
+ 'exec /usr/bin/apt "$@"' \
207
+ > /usr/local/bin/apt && \
208
+ chmod +x /usr/local/bin/apt && \
209
+ printf '%s\n' \
210
+ '#!/usr/bin/env sh' \
211
+ 'set -eu' \
212
+ 'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
213
+ ' exec /usr/bin/dpkg "$@"' \
214
+ 'fi' \
215
+ 'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
216
+ '/app/assistant/docker-init-apt-root.sh' \
217
+ 'if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/dpkg" ] && [ -f "${DATA_ROOT}/.rootfs-initialized" ] && ! grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then' \
218
+ ' exec chroot "${DATA_ROOT}" /usr/bin/dpkg "$@"' \
219
+ 'fi' \
220
+ 'exec /usr/bin/dpkg "$@"' \
221
+ > /usr/local/bin/dpkg && \
222
+ chmod +x /usr/local/bin/dpkg
223
+
150
224
  # Ensure the CES bootstrap socket volume is writable by the non-root CES user.
151
225
  RUN mkdir -p /run/ces-bootstrap && chmod 777 /run/ces-bootstrap
152
226
 
@@ -161,7 +235,7 @@ ENV IS_CONTAINERIZED=true
161
235
  # and the generated meet-join manifest from the builder stage.
162
236
  COPY --from=builder /app /app
163
237
 
164
- RUN chmod +x /app/assistant/docker-entrypoint.sh
238
+ RUN chmod +x /app/assistant/docker-entrypoint.sh /app/assistant/docker-init-apt-root.sh /app/assistant/docker-kata-apt-env.sh
165
239
 
166
240
  # Run the daemon + http server
167
241
  CMD ["/app/assistant/docker-entrypoint.sh"]
package/bun.lock CHANGED
@@ -37,6 +37,7 @@
37
37
  "playwright": "1.58.2",
38
38
  "postgres": "3.4.8",
39
39
  "rrule": "2.8.1",
40
+ "semver": "7.8.0",
40
41
  "stemmer": "2.0.1",
41
42
  "tar-stream": "3.1.7",
42
43
  "tldts": "7.0.25",
@@ -48,6 +49,7 @@
48
49
  "@types/archiver": "7.0.0",
49
50
  "@types/bun": "1.3.10",
50
51
  "@types/node": "25.5.0",
52
+ "@types/semver": "7.5.8",
51
53
  "@types/uuid": "10.0.0",
52
54
  "drizzle-kit": "0.30.6",
53
55
  "eslint": "10.0.3",
@@ -388,6 +390,8 @@
388
390
 
389
391
  "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
390
392
 
393
+ "@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="],
394
+
391
395
  "@types/tedious": ["@types/tedious@4.0.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw=="],
392
396
 
393
397
  "@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="],
@@ -1080,7 +1084,7 @@
1080
1084
 
1081
1085
  "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="],
1082
1086
 
1083
- "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1087
+ "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="],
1084
1088
 
1085
1089
  "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
1086
1090
 
@@ -1248,6 +1252,8 @@
1248
1252
 
1249
1253
  "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
1250
1254
 
1255
+ "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1256
+
1251
1257
  "@vellumai/ces-client/@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
1252
1258
 
1253
1259
  "@vellumai/ces-client/@vellumai/service-contracts": ["@vellumai/service-contracts@file:../packages/service-contracts", { "dependencies": { "zod": "4.3.6" }, "devDependencies": { "@types/bun": "1.2.4", "typescript": "5.7.3" } }],
@@ -1274,6 +1280,8 @@
1274
1280
 
1275
1281
  "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
1276
1282
 
1283
+ "gel/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1284
+
1277
1285
  "glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
1278
1286
 
1279
1287
  "jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
@@ -1380,6 +1388,8 @@
1380
1388
 
1381
1389
  "detective-typescript/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="],
1382
1390
 
1391
+ "detective-typescript/@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1392
+
1383
1393
  "glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
1384
1394
 
1385
1395
  "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
@@ -5,6 +5,11 @@ set -eu
5
5
  # processes (the `assistant` user, bun's tmpdir, scratch writes) can use it.
6
6
  chmod 1777 /tmp 2>/dev/null || true
7
7
 
8
+ if [ "${VELLUM_SANDBOX_RUNTIME:-}" = "kata" ] && [ -x /app/assistant/docker-init-apt-root.sh ]; then
9
+ . /app/assistant/docker-kata-apt-env.sh
10
+ /app/assistant/docker-init-apt-root.sh
11
+ fi
12
+
8
13
  if [ "$(id -u)" = "0" ] && [ "${VELLUM_WORKSPACE_DIR:-}" = "/workspace" ] && [ -d /workspace ]; then
9
14
  git config --global --add safe.directory /workspace >/dev/null 2>&1 || true
10
15
  git config --global --add safe.directory '/workspace/*' >/dev/null 2>&1 || true
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"
5
+ SENTINEL="${DATA_ROOT}/.rootfs-initialized"
6
+ HOST_PATH="/usr/sbin:/usr/bin:/sbin:/bin"
7
+
8
+ if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then
9
+ exit 0
10
+ fi
11
+
12
+ # Bootstrap the alternate root with the host toolchain so the wrapper
13
+ # binaries in /usr/local/bin do not recurse back into this script.
14
+ export PATH="${HOST_PATH}"
15
+
16
+ check_sane_mount() {
17
+ target="$1"
18
+ probe_dev="${target}/.apt-test-dev-null"
19
+ probe_exec="${target}/.apt-test-exec"
20
+ shell_path="/bin/sh"
21
+
22
+ mkdir -p "${target}"
23
+
24
+ if ! mknod "${probe_dev}" c 1 3 2>/dev/null || ! echo test >"${probe_dev}"; then
25
+ rm -f "${probe_dev}"
26
+ : >"${probe_dev}"
27
+ if ! mount -o bind /dev/null "${probe_dev}" >/dev/null 2>&1; then
28
+ rm -f "${probe_dev}"
29
+ return 1
30
+ fi
31
+ if ! echo test >"${probe_dev}"; then
32
+ umount "${probe_dev}" >/dev/null 2>&1 || true
33
+ rm -f "${probe_dev}"
34
+ return 1
35
+ fi
36
+ umount "${probe_dev}" >/dev/null 2>&1 || true
37
+ fi
38
+ rm -f "${probe_dev}"
39
+
40
+ if [ ! -x "${shell_path}" ]; then
41
+ shell_path="$(command -v sh)"
42
+ fi
43
+
44
+ cat >"${probe_exec}" <<EOF
45
+ #! ${shell_path}
46
+ :
47
+ EOF
48
+ chmod +x "${probe_exec}"
49
+ if ! "${probe_exec}" >/dev/null 2>&1; then
50
+ rm -f "${probe_exec}"
51
+ return 1
52
+ fi
53
+ rm -f "${probe_exec}"
54
+
55
+ return 0
56
+ }
57
+
58
+ if [ -f "${SENTINEL}" ] && [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt-get" ]; then
59
+ exit 0
60
+ fi
61
+
62
+ if grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then
63
+ echo "Warning: ${DATA_ROOT} is mounted noexec; skipping persistent apt rootfs bootstrap" >&2
64
+ exit 0
65
+ fi
66
+
67
+ if ! check_sane_mount "${DATA_ROOT}"; then
68
+ echo "Warning: ${DATA_ROOT} cannot host a chrootable apt rootfs here; falling back to image-root apt installs" >&2
69
+ exit 0
70
+ fi
71
+
72
+ if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt-get" ]; then
73
+ touch "${SENTINEL}"
74
+ exit 0
75
+ fi
76
+
77
+ SUITE="${VELLUM_APT_DATA_SUITE:-}"
78
+ if [ -z "${SUITE}" ] && [ -r /etc/os-release ]; then
79
+ # shellcheck disable=SC1091
80
+ . /etc/os-release
81
+ SUITE="${VERSION_CODENAME:-trixie}"
82
+ fi
83
+ if [ -z "${SUITE}" ]; then
84
+ SUITE="trixie"
85
+ fi
86
+
87
+ MIRROR="${VELLUM_APT_DATA_MIRROR:-http://deb.debian.org/debian}"
88
+ ARCH="$(/usr/bin/dpkg --print-architecture)"
89
+
90
+ mkdir -p "${DATA_ROOT}"
91
+
92
+ debootstrap --variant=minbase --arch="${ARCH}" "${SUITE}" "${DATA_ROOT}" "${MIRROR}"
93
+
94
+ touch "${SENTINEL}"
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env sh
2
+
3
+ if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then
4
+ return 0 2>/dev/null || exit 0
5
+ fi
6
+
7
+ export VELLUM_APT_DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"
8
+
9
+ _vellum_kata_append_path() {
10
+ case ":${PATH:-}:" in
11
+ *":$1:"*) ;;
12
+ *) PATH="${PATH:+${PATH}:}$1" ;;
13
+ esac
14
+ }
15
+
16
+ _vellum_kata_prepend_library_path() {
17
+ case ":${LD_LIBRARY_PATH:-}:" in
18
+ *":$1:"*) ;;
19
+ *) LD_LIBRARY_PATH="$1${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" ;;
20
+ esac
21
+ }
22
+
23
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/bin"
24
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/local/sbin"
25
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/local/bin"
26
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/sbin"
27
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/bin"
28
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/sbin"
29
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/games"
30
+ _vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/games"
31
+ export PATH
32
+
33
+ _vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/lib/aarch64-linux-gnu"
34
+ _vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/lib/x86_64-linux-gnu"
35
+ _vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/lib"
36
+ _vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/local/lib"
37
+ export LD_LIBRARY_PATH
38
+
39
+ unset -f _vellum_kata_append_path _vellum_kata_prepend_library_path
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