@vellumai/assistant 0.8.7 → 0.8.8

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 (387) hide show
  1. package/Dockerfile +20 -4
  2. package/docker-entrypoint.sh +4 -2
  3. package/docker-init-apt-root.sh +3 -1
  4. package/docker-kata-apt-env.sh +3 -1
  5. package/docker-kata-runtime-family.sh +12 -0
  6. package/docs/architecture/memory.md +1 -1
  7. package/docs/plugins.md +75 -79
  8. package/examples/plugins/echo/README.md +6 -12
  9. package/examples/plugins/echo/register.ts +0 -41
  10. package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
  11. package/openapi.yaml +3381 -348
  12. package/package.json +1 -1
  13. package/scripts/generate-openapi.ts +68 -41
  14. package/src/__tests__/agent-loop-exit-reason.test.ts +34 -39
  15. package/src/__tests__/agent-loop-provider-error-recording.test.ts +1 -1
  16. package/src/__tests__/agent-loop.test.ts +37 -87
  17. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
  18. package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
  19. package/src/__tests__/annotate-risk-options.test.ts +2 -3
  20. package/src/__tests__/anthropic-provider.test.ts +95 -2
  21. package/src/__tests__/assistant-event-hub.test.ts +25 -0
  22. package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
  23. package/src/__tests__/{conversation-stream-state.test.ts → assistant-stream-state.test.ts} +252 -91
  24. package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
  25. package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
  26. package/src/__tests__/btw-routes.test.ts +62 -3
  27. package/src/__tests__/build-persisted-content.test.ts +184 -0
  28. package/src/__tests__/catalog-files.test.ts +1 -1
  29. package/src/__tests__/clawhub-files.test.ts +1 -1
  30. package/src/__tests__/compaction-pipeline.test.ts +1 -1
  31. package/src/__tests__/compaction.benchmark.test.ts +0 -30
  32. package/src/__tests__/config-watcher.test.ts +1 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +57 -19
  34. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +6 -2
  35. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -4
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +313 -1136
  37. package/src/__tests__/conversation-agent-loop.test.ts +596 -1616
  38. package/src/__tests__/conversation-analysis-routes.test.ts +6 -0
  39. package/src/__tests__/conversation-history-web-search.test.ts +11 -1
  40. package/src/__tests__/conversation-pairing.test.ts +4 -31
  41. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +6 -0
  42. package/src/__tests__/conversation-provider-retry-repair.test.ts +26 -5
  43. package/src/__tests__/conversation-queue.test.ts +2 -0
  44. package/src/__tests__/conversation-routes-disk-view.test.ts +3 -0
  45. package/src/__tests__/conversation-routes-slash-commands.test.ts +6 -5
  46. package/src/__tests__/conversation-runtime-assembly.test.ts +170 -229
  47. package/src/__tests__/conversation-runtime-workspace.test.ts +3 -24
  48. package/src/__tests__/conversation-slash-commands.test.ts +8 -42
  49. package/src/__tests__/conversation-slash-queue.test.ts +6 -1
  50. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +84 -0
  51. package/src/__tests__/conversation-sync-tags.test.ts +27 -15
  52. package/src/__tests__/conversation-title-service.test.ts +135 -2
  53. package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
  54. package/src/__tests__/cross-provider-web-search.test.ts +214 -1
  55. package/src/__tests__/db-schedule-syntax-migration.test.ts +5 -0
  56. package/src/__tests__/dm-persistence.test.ts +5 -1
  57. package/src/__tests__/empty-response-hook.test.ts +304 -0
  58. package/src/__tests__/feature-flag-test-helpers.ts +2 -2
  59. package/src/__tests__/gemini-image-service.test.ts +13 -0
  60. package/src/__tests__/helpers/mock-provider.ts +110 -0
  61. package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
  62. package/src/__tests__/history-repair-hook.test.ts +1 -0
  63. package/src/__tests__/identity-intro-cache.test.ts +12 -100
  64. package/src/__tests__/identity-routes.test.ts +248 -7
  65. package/src/__tests__/inbound-slack-persistence.test.ts +5 -1
  66. package/src/__tests__/injector-background-turn.test.ts +2 -8
  67. package/src/__tests__/injector-chain.test.ts +106 -270
  68. package/src/__tests__/injector-disk-pressure.test.ts +3 -12
  69. package/src/__tests__/injector-document-comments.test.ts +2 -2
  70. package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
  71. package/src/__tests__/injector-v3-suppression.test.ts +31 -37
  72. package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
  73. package/src/__tests__/list-messages-page-latest.test.ts +60 -0
  74. package/src/__tests__/list-messages-tool-merge.test.ts +20 -0
  75. package/src/__tests__/llm-usage-store.test.ts +223 -1
  76. package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
  77. package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
  78. package/src/__tests__/native-web-search.test.ts +191 -0
  79. package/src/__tests__/onboarding-template-contract.test.ts +2 -0
  80. package/src/__tests__/openai-image-service.test.ts +17 -0
  81. package/src/__tests__/openai-provider.test.ts +31 -1
  82. package/src/__tests__/persist-unsendable-image.test.ts +215 -0
  83. package/src/__tests__/persistence-secret-redaction.test.ts +1 -0
  84. package/src/__tests__/pipeline-runner.test.ts +29 -39
  85. package/src/__tests__/pkb-autoinject.test.ts +2 -5
  86. package/src/__tests__/plugin-bootstrap.test.ts +13 -28
  87. package/src/__tests__/plugin-registry.test.ts +0 -27
  88. package/src/__tests__/plugin-types.test.ts +2 -125
  89. package/src/__tests__/process-message-display-content.test.ts +6 -2
  90. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
  91. package/src/__tests__/resolve-trust-class.test.ts +4 -4
  92. package/src/__tests__/runtime-events-sse-reconnect.test.ts +60 -23
  93. package/src/__tests__/schedule-routes.test.ts +603 -2
  94. package/src/__tests__/schedule-store.test.ts +41 -0
  95. package/src/__tests__/schedule-tools.test.ts +35 -0
  96. package/src/__tests__/server-history-render.test.ts +314 -1
  97. package/src/__tests__/skillssh-files.test.ts +1 -1
  98. package/src/__tests__/system-prompt.test.ts +20 -0
  99. package/src/__tests__/task-scheduler.test.ts +162 -1
  100. package/src/__tests__/terminal-tools.test.ts +6 -1
  101. package/src/__tests__/title-generate-hook.test.ts +319 -0
  102. package/src/__tests__/tool-error-hook.test.ts +278 -0
  103. package/src/__tests__/tool-preview-lifecycle.test.ts +468 -5
  104. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  105. package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
  106. package/src/__tests__/tool-result-truncation.test.ts +0 -2
  107. package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
  108. package/src/__tests__/ui-work-result-surface.test.ts +159 -0
  109. package/src/__tests__/usage-routes.test.ts +285 -1
  110. package/src/__tests__/user-plugin-loader.test.ts +2 -2
  111. package/src/__tests__/voice-session-bridge.test.ts +6 -3
  112. package/src/__tests__/web-search-backend-failure.test.ts +166 -0
  113. package/src/agent/loop.ts +346 -442
  114. package/src/api/events/assistant-thinking-delta.ts +33 -0
  115. package/src/api/events/tool-output-chunk.ts +45 -0
  116. package/src/api/events/tool-use-preview-start.ts +32 -0
  117. package/src/api/events/trace-event.ts +69 -0
  118. package/src/api/index.ts +48 -13
  119. package/src/api/responses/conversation-message.ts +368 -0
  120. package/src/avatar/__tests__/avatar-store.test.ts +34 -29
  121. package/src/cli/commands/__tests__/notifications.test.ts +58 -14
  122. package/src/cli/commands/notifications.ts +112 -60
  123. package/src/config/assistant-feature-flags.ts +22 -11
  124. package/src/config/bundled-skills/app-builder/SKILL.md +3 -20
  125. package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
  126. package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
  127. package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
  128. package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
  129. package/src/config/bundled-skills/document-editor/SKILL.md +1 -1
  130. package/src/config/bundled-skills/messaging/SKILL.md +0 -7
  131. package/src/config/feature-flag-cache.ts +3 -3
  132. package/src/config/feature-flag-registry.json +35 -3
  133. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  134. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
  135. package/src/config/schemas/llm.ts +1 -0
  136. package/src/config/schemas/memory-v2.ts +8 -0
  137. package/src/config/schemas/memory-v3.ts +8 -0
  138. package/src/config/schemas/platform.ts +8 -0
  139. package/src/config/seed-inference-profiles.ts +2 -2
  140. package/src/config/skills.ts +13 -0
  141. package/src/context/compactor.ts +1 -1
  142. package/src/context/strip-injections.ts +122 -0
  143. package/src/context/token-estimator.ts +23 -0
  144. package/src/context/tool-result-truncation.ts +0 -23
  145. package/src/context/window-manager.ts +3 -6
  146. package/src/credential-execution/executable-discovery.ts +16 -0
  147. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
  148. package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
  149. package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
  150. package/src/daemon/assistant-attachments.ts +1 -1
  151. package/src/daemon/config-watcher.ts +2 -2
  152. package/src/daemon/context-overflow-reducer.ts +0 -1
  153. package/src/daemon/conversation-agent-loop-handlers.ts +605 -153
  154. package/src/daemon/conversation-agent-loop.ts +281 -760
  155. package/src/daemon/conversation-history.ts +5 -4
  156. package/src/daemon/conversation-lifecycle.ts +3 -4
  157. package/src/daemon/conversation-messaging.ts +7 -6
  158. package/src/daemon/conversation-process.ts +11 -16
  159. package/src/daemon/conversation-runtime-assembly.ts +130 -347
  160. package/src/daemon/conversation-slash.ts +6 -25
  161. package/src/daemon/conversation-surfaces.ts +222 -4
  162. package/src/daemon/conversation-tool-setup.ts +2 -29
  163. package/src/daemon/conversation.ts +32 -14
  164. package/src/daemon/external-plugins-bootstrap.ts +9 -10
  165. package/src/daemon/handlers/config-a2a.ts +51 -36
  166. package/src/daemon/handlers/config-slack-channel.ts +20 -14
  167. package/src/daemon/handlers/config-telegram.ts +16 -2
  168. package/src/daemon/handlers/shared.ts +156 -84
  169. package/src/daemon/handlers/skills.ts +39 -10
  170. package/src/daemon/lifecycle.ts +4 -0
  171. package/src/daemon/message-types/apps.ts +1 -29
  172. package/src/daemon/message-types/messages.ts +9 -57
  173. package/src/daemon/message-types/skills.ts +2 -0
  174. package/src/daemon/message-types/surfaces.ts +136 -3
  175. package/src/daemon/now-scratchpad.ts +21 -0
  176. package/src/daemon/orphan-reaper.test.ts +210 -0
  177. package/src/daemon/orphan-reaper.ts +240 -0
  178. package/src/daemon/persist-unsendable-image.ts +117 -0
  179. package/src/daemon/process-message.ts +1 -3
  180. package/src/daemon/trace-emitter.ts +6 -4
  181. package/src/daemon/trust-context.ts +19 -0
  182. package/src/daemon/wake-target-adapter.ts +3 -1
  183. package/src/home/home-greeting-cache.ts +24 -1
  184. package/src/ipc/gateway-client.test.ts +2 -2
  185. package/src/ipc/gateway-client.ts +3 -3
  186. package/src/media/gemini-image-service.ts +15 -0
  187. package/src/media/openai-image-service.ts +14 -0
  188. package/src/media/types.ts +34 -0
  189. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
  190. package/src/memory/auth-fallback-events-store.ts +94 -0
  191. package/src/memory/conversation-title-service.ts +65 -41
  192. package/src/memory/db-init.ts +4 -0
  193. package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
  194. package/src/memory/graph/conversation-graph-memory.ts +65 -0
  195. package/src/memory/jobs-store.ts +33 -0
  196. package/src/memory/jobs-worker.ts +31 -4
  197. package/src/memory/llm-usage-store.ts +224 -50
  198. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
  199. package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
  200. package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
  201. package/src/memory/migrations/index.ts +2 -0
  202. package/src/memory/pkb/autoinject.ts +61 -0
  203. package/src/memory/pkb/context.ts +50 -0
  204. package/src/memory/pkb/types.ts +14 -0
  205. package/src/memory/schedule-attribution-sql.ts +104 -0
  206. package/src/memory/schema/infrastructure.ts +16 -0
  207. package/src/memory/usage-grouped-buckets.ts +6 -1
  208. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -1
  209. package/src/memory/v2/consolidation-job.ts +1 -1
  210. package/src/memory/v3/__tests__/health.test.ts +16 -0
  211. package/src/memory/v3/__tests__/orchestrate.test.ts +45 -9
  212. package/src/memory/v3/__tests__/provider-blocks.test.ts +13 -0
  213. package/src/memory/v3/__tests__/router.test.ts +101 -29
  214. package/src/memory/v3/__tests__/selector.test.ts +93 -27
  215. package/src/memory/v3/__tests__/shadow-plugin.test.ts +23 -5
  216. package/src/memory/v3/health.ts +0 -0
  217. package/src/memory/v3/llm-retry.ts +32 -0
  218. package/src/memory/v3/orchestrate.ts +26 -14
  219. package/src/memory/v3/provider-blocks.ts +15 -5
  220. package/src/memory/v3/router.ts +48 -42
  221. package/src/memory/v3/selector.ts +57 -42
  222. package/src/memory/v3/shadow-plugin.ts +47 -15
  223. package/src/memory/v3/types.ts +8 -0
  224. package/src/notifications/conversation-pairing.ts +8 -15
  225. package/src/notifications/decision-engine.ts +6 -3
  226. package/src/notifications/home-feed-side-effect.ts +12 -1
  227. package/src/permissions/prompter.ts +4 -0
  228. package/src/plugin-api/constants.ts +4 -0
  229. package/src/plugin-api/index.ts +8 -1
  230. package/src/plugin-api/types.ts +151 -1
  231. package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
  232. package/src/plugins/defaults/empty-response/register.ts +8 -13
  233. package/src/plugins/defaults/index.ts +1 -15
  234. package/src/plugins/defaults/injectors/register.ts +243 -74
  235. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +91 -0
  236. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
  237. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
  238. package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
  239. package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
  240. package/src/plugins/defaults/title-generate/package.json +1 -1
  241. package/src/plugins/defaults/title-generate/register.ts +18 -18
  242. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
  243. package/src/plugins/defaults/tool-error/package.json +1 -1
  244. package/src/plugins/defaults/tool-error/register.ts +9 -21
  245. package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
  246. package/src/plugins/defaults/tool-result-truncate/register.ts +10 -21
  247. package/src/plugins/defaults/tool-result-truncate/terminal.ts +37 -18
  248. package/src/plugins/pipeline.ts +6 -18
  249. package/src/plugins/registry.ts +8 -25
  250. package/src/plugins/types.ts +43 -474
  251. package/src/proactive-artifact/aux-message-injector.ts +3 -3
  252. package/src/proactive-artifact/job.test.ts +7 -12
  253. package/src/prompts/__tests__/system-prompt.test.ts +36 -0
  254. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +62 -0
  255. package/src/prompts/templates/BOOTSTRAP.md +2 -2
  256. package/src/prompts/templates/system-sections.ts +15 -0
  257. package/src/providers/anthropic/client.ts +37 -29
  258. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
  259. package/src/providers/openai/chat-completions-provider.ts +44 -0
  260. package/src/providers/openrouter/client.ts +1 -0
  261. package/src/providers/placeholder-sentinels.ts +35 -0
  262. package/src/runtime/__tests__/agent-wake.test.ts +5 -1
  263. package/src/runtime/agent-wake.ts +2 -2
  264. package/src/runtime/assistant-event-hub.ts +36 -6
  265. package/src/runtime/{conversation-stream-state.ts → assistant-stream-state.ts} +132 -58
  266. package/src/runtime/http-router.ts +16 -21
  267. package/src/runtime/http-types.ts +16 -70
  268. package/src/runtime/pending-interactions.ts +1 -0
  269. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
  270. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
  271. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
  272. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  273. package/src/runtime/routes/app-management-routes.ts +6 -117
  274. package/src/runtime/routes/app-routes.ts +13 -15
  275. package/src/runtime/routes/attachment-routes.ts +26 -15
  276. package/src/runtime/routes/avatar-routes.ts +26 -0
  277. package/src/runtime/routes/btw-routes.ts +29 -23
  278. package/src/runtime/routes/consolidation-routes.ts +120 -20
  279. package/src/runtime/routes/conversation-query-routes.ts +2 -0
  280. package/src/runtime/routes/conversation-routes.ts +358 -184
  281. package/src/runtime/routes/documents-routes.ts +4 -0
  282. package/src/runtime/routes/domain-routes.ts +51 -37
  283. package/src/runtime/routes/epoch-millis-range.ts +34 -0
  284. package/src/runtime/routes/events-routes.ts +28 -34
  285. package/src/runtime/routes/gateway-log-routes.ts +26 -4
  286. package/src/runtime/routes/heartbeat-routes.ts +32 -12
  287. package/src/runtime/routes/identity-intro-cache.ts +11 -34
  288. package/src/runtime/routes/identity-routes.ts +208 -17
  289. package/src/runtime/routes/image-generation-routes.ts +40 -2
  290. package/src/runtime/routes/index.ts +2 -0
  291. package/src/runtime/routes/integrations/a2a.ts +12 -10
  292. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
  293. package/src/runtime/routes/integrations/slack/channel.ts +4 -0
  294. package/src/runtime/routes/integrations/slack/share.ts +27 -6
  295. package/src/runtime/routes/integrations/telegram.ts +6 -0
  296. package/src/runtime/routes/integrations/twilio.ts +42 -0
  297. package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
  298. package/src/runtime/routes/log-export-routes.ts +8 -0
  299. package/src/runtime/routes/memory-v2-routes.ts +15 -8
  300. package/src/runtime/routes/memory-v3-routes.ts +50 -28
  301. package/src/runtime/routes/oauth-apps.ts +66 -12
  302. package/src/runtime/routes/oauth-providers.ts +44 -5
  303. package/src/runtime/routes/platform-routes.ts +81 -5
  304. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +6 -4
  305. package/src/runtime/routes/playground/force-compact.ts +1 -1
  306. package/src/runtime/routes/rename-conversation-routes.ts +5 -0
  307. package/src/runtime/routes/schedule-routes.ts +152 -42
  308. package/src/runtime/routes/secret-routes.ts +14 -2
  309. package/src/runtime/routes/skills-routes.ts +43 -14
  310. package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
  311. package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
  312. package/src/runtime/routes/trust-rules-routes.ts +26 -2
  313. package/src/runtime/routes/tts-routes.ts +35 -0
  314. package/src/runtime/routes/types.ts +66 -8
  315. package/src/runtime/routes/usage-routes.ts +47 -39
  316. package/src/runtime/routes/webhook-routes.ts +41 -2
  317. package/src/runtime/routes/workspace-routes.ts +4 -0
  318. package/src/runtime/services/__tests__/analyze-conversation.test.ts +6 -0
  319. package/src/runtime/services/analyze-conversation.ts +2 -2
  320. package/src/schedule/schedule-store.ts +20 -1
  321. package/src/schedule/schedule-usage-store.ts +83 -0
  322. package/src/schedule/scheduler.ts +12 -5
  323. package/src/skills/catalog-files.ts +2 -2
  324. package/src/skills/catalog-install.ts +3 -0
  325. package/src/skills/categories-cache.ts +118 -0
  326. package/src/skills/clawhub-files.ts +1 -2
  327. package/src/skills/skillssh-files.ts +1 -2
  328. package/src/telemetry/types.ts +29 -1
  329. package/src/telemetry/usage-telemetry-reporter.test.ts +112 -3
  330. package/src/telemetry/usage-telemetry-reporter.ts +57 -2
  331. package/src/tools/executor.ts +1 -53
  332. package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
  333. package/src/tools/network/__tests__/web-search.test.ts +11 -3
  334. package/src/tools/network/web-search-error.test.ts +248 -0
  335. package/src/tools/network/web-search-error.ts +267 -0
  336. package/src/tools/network/web-search.ts +207 -48
  337. package/src/tools/schedule/create.ts +2 -0
  338. package/src/tools/terminal/safe-env.ts +10 -1
  339. package/src/tools/ui-surface/definitions.ts +9 -1
  340. package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
  341. package/src/tts/provider-catalog.ts +76 -1
  342. package/src/util/mutex.ts +47 -0
  343. package/src/workspace/git-service.ts +1 -42
  344. package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
  345. package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
  346. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +93 -0
  347. package/src/workspace/migrations/registry.ts +6 -0
  348. package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
  349. package/src/__tests__/empty-response-pipeline.test.ts +0 -423
  350. package/src/__tests__/llm-call-pipeline.test.ts +0 -287
  351. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
  352. package/src/__tests__/persistence-pipeline.test.ts +0 -503
  353. package/src/__tests__/title-generate-pipeline.test.ts +0 -211
  354. package/src/__tests__/token-estimate-pipeline.test.ts +0 -479
  355. package/src/__tests__/tool-error-pipeline.test.ts +0 -241
  356. package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
  357. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -341
  358. package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
  359. package/src/gallery/default-gallery.ts +0 -1359
  360. package/src/gallery/gallery-manifest.ts +0 -28
  361. package/src/home/feature-gate.ts +0 -22
  362. package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +0 -22
  363. package/src/plugins/defaults/empty-response/terminal.ts +0 -106
  364. package/src/plugins/defaults/injectors/package.json +0 -15
  365. package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +0 -17
  366. package/src/plugins/defaults/llm-call/package.json +0 -15
  367. package/src/plugins/defaults/llm-call/register.ts +0 -45
  368. package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +0 -17
  369. package/src/plugins/defaults/memory-retrieval/package.json +0 -15
  370. package/src/plugins/defaults/memory-retrieval/register.ts +0 -181
  371. package/src/plugins/defaults/persistence/middlewares/persistence.ts +0 -19
  372. package/src/plugins/defaults/persistence/package.json +0 -15
  373. package/src/plugins/defaults/persistence/register.ts +0 -38
  374. package/src/plugins/defaults/persistence/terminal.ts +0 -83
  375. package/src/plugins/defaults/title-generate/terminal.ts +0 -31
  376. package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +0 -23
  377. package/src/plugins/defaults/token-estimate/package.json +0 -15
  378. package/src/plugins/defaults/token-estimate/register.ts +0 -34
  379. package/src/plugins/defaults/token-estimate/terminal.ts +0 -40
  380. package/src/plugins/defaults/tool-error/middlewares/toolError.ts +0 -21
  381. package/src/plugins/defaults/tool-error/terminal.ts +0 -47
  382. package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +0 -23
  383. package/src/plugins/defaults/tool-execute/package.json +0 -15
  384. package/src/plugins/defaults/tool-execute/register.ts +0 -49
  385. package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +0 -23
  386. package/src/plugins/defaults/tool-result-truncate/types.ts +0 -22
  387. package/src/skills/category-inference.ts +0 -111
package/Dockerfile CHANGED
@@ -77,6 +77,7 @@ RUN apt-get update && apt-get install -y \
77
77
  debootstrap \
78
78
  debian-archive-keyring \
79
79
  debconf \
80
+ e2fsprogs \
80
81
  ffmpeg \
81
82
  fonts-freefont-ttf \
82
83
  g++ \
@@ -113,11 +114,13 @@ RUN apt-get update && apt-get install -y \
113
114
  libxtst6 \
114
115
  lsof \
115
116
  make \
117
+ mount \
116
118
  openssl \
117
119
  procps \
118
120
  python3 \
119
121
  sqlite3 \
120
122
  sudo \
123
+ util-linux \
121
124
  unzip \
122
125
  uuid-runtime \
123
126
  vim \
@@ -180,7 +183,8 @@ RUN printf '%s\n' \
180
183
  RUN printf '%s\n' \
181
184
  '#!/usr/bin/env sh' \
182
185
  'set -eu' \
183
- 'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
186
+ '. /app/assistant/docker-kata-runtime-family.sh' \
187
+ 'if ! vellum_is_kata_family_runtime; then' \
184
188
  ' exec /usr/bin/apt-get "$@"' \
185
189
  'fi' \
186
190
  'export DEBIAN_FRONTEND=noninteractive' \
@@ -195,7 +199,8 @@ RUN printf '%s\n' \
195
199
  printf '%s\n' \
196
200
  '#!/usr/bin/env sh' \
197
201
  'set -eu' \
198
- 'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
202
+ '. /app/assistant/docker-kata-runtime-family.sh' \
203
+ 'if ! vellum_is_kata_family_runtime; then' \
199
204
  ' exec /usr/bin/apt "$@"' \
200
205
  'fi' \
201
206
  'export DEBIAN_FRONTEND=noninteractive' \
@@ -210,7 +215,8 @@ RUN printf '%s\n' \
210
215
  printf '%s\n' \
211
216
  '#!/usr/bin/env sh' \
212
217
  'set -eu' \
213
- 'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
218
+ '. /app/assistant/docker-kata-runtime-family.sh' \
219
+ 'if ! vellum_is_kata_family_runtime; then' \
214
220
  ' exec /usr/bin/dpkg "$@"' \
215
221
  'fi' \
216
222
  'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
@@ -236,7 +242,17 @@ ENV IS_CONTAINERIZED=true
236
242
  # and the generated meet-join manifest from the builder stage.
237
243
  COPY --from=builder /app /app
238
244
 
239
- RUN chmod +x /app/assistant/docker-entrypoint.sh /app/assistant/docker-init-apt-root.sh /app/assistant/docker-kata-apt-env.sh
245
+ COPY packages/block-volume-bootstrap/scripts/*.sh /usr/local/bin/
246
+
247
+ RUN chmod +x \
248
+ /app/assistant/docker-entrypoint.sh \
249
+ /app/assistant/docker-init-apt-root.sh \
250
+ /app/assistant/docker-kata-apt-env.sh \
251
+ /app/assistant/docker-kata-runtime-family.sh \
252
+ /usr/local/bin/vellum-block-volume-common.sh \
253
+ /usr/local/bin/vellum-block-volume-init.sh \
254
+ /usr/local/bin/vellum-block-volume-mount.sh \
255
+ /usr/local/bin/vellum-block-volume-resize.sh
240
256
 
241
257
  # Run the daemon + http server
242
258
  CMD ["/app/assistant/docker-entrypoint.sh"]
@@ -6,9 +6,11 @@ set -eu
6
6
  chmod 1777 /tmp 2>/dev/null || true
7
7
 
8
8
  KATA_APT_INIT_PID=""
9
- if [ "${VELLUM_SANDBOX_RUNTIME:-}" = "kata" ] && [ -x /app/assistant/docker-init-apt-root.sh ]; then
9
+ . /app/assistant/docker-kata-runtime-family.sh
10
+
11
+ if vellum_is_kata_family_runtime && [ -x /app/assistant/docker-init-apt-root.sh ]; then
10
12
  export VELLUM_APT_DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"
11
- # Warm the chroot used by kata apt wrappers without blocking assistant readiness.
13
+ # Warm the chroot used by Kata-family apt wrappers without blocking assistant readiness.
12
14
  /app/assistant/docker-init-apt-root.sh &
13
15
  KATA_APT_INIT_PID="$!"
14
16
  fi
@@ -10,7 +10,9 @@ LOCK_DIR="${DATA_ROOT}.rootfs-init.lock"
10
10
  LOCK_PID="${LOCK_DIR}/pid"
11
11
  HOST_PATH="/usr/sbin:/usr/bin:/sbin:/bin"
12
12
 
13
- if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then
13
+ . /app/assistant/docker-kata-runtime-family.sh
14
+
15
+ if ! vellum_is_kata_family_runtime; then
14
16
  exit 0
15
17
  fi
16
18
 
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env sh
2
2
 
3
- if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then
3
+ . /app/assistant/docker-kata-runtime-family.sh
4
+
5
+ if ! vellum_is_kata_family_runtime; then
4
6
  return 0 2>/dev/null || exit 0
5
7
  fi
6
8
 
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env sh
2
+
3
+ vellum_is_kata_family_runtime() {
4
+ case "${VELLUM_SANDBOX_RUNTIME:-}" in
5
+ kata|firecracker|cloud-hypervisor)
6
+ return 0
7
+ ;;
8
+ *)
9
+ return 1
10
+ ;;
11
+ esac
12
+ }
@@ -244,7 +244,7 @@ graph TB
244
244
 
245
245
  Normal context compaction (the "Context Window Management" subgraph above) runs proactively as the conversation approaches the token limit, using cooldown guards and a severity-pressure override to balance compaction frequency against cost. This is the primary defense against context overflow.
246
246
 
247
- When compaction alone is insufficient — either because the conversation grew too fast between turns or because a single turn contains extremely large payloads — the overflow recovery pipeline takes over. The pipeline's first tier (forced compaction) reuses the same `maybeCompact()` summarization machinery but with emergency parameters: `force: true` bypasses cooldown guards, `minKeepRecentUserTurns: 0` allows summarizing even the most recent history, and `targetInputTokensOverride` sets a tighter budget. Subsequent tiers (tool-result truncation, media stubbing, injection downgrade) apply progressively more aggressive payload reduction without involving the summarizer.
247
+ When compaction alone is insufficient — either because the conversation grew too fast between turns or because a single turn contains extremely large payloads — the overflow recovery pipeline takes over. The pipeline's first tier (forced compaction) reuses the same `maybeCompact()` summarization machinery but with emergency parameters: `force: true` bypasses cooldown guards and `minKeepRecentUserTurns: 0` allows summarizing even the most recent history. The reducer drives convergence toward a tighter budget by re-invoking each tier until the estimated tokens fall under its `targetTokens` ceiling. Subsequent tiers (tool-result truncation, media stubbing, injection downgrade) apply progressively more aggressive payload reduction without involving the summarizer.
248
248
 
249
249
  If all four reducer tiers are exhausted, the overflow policy resolver determines whether to compress the latest user turn. All sessions — interactive and non-interactive alike — auto-compress the latest turn without prompting. The only explicit opt-out is setting `contextWindow.overflowRecovery.interactiveLatestTurnCompression` (or `nonInteractiveLatestTurnCompression`) to `"drop"`, which short-circuits to a graceful failure instead. Disabling overflow recovery entirely (`contextWindow.overflowRecovery.enabled: false`) also yields a graceful failure.
250
250
 
package/docs/plugins.md CHANGED
@@ -27,6 +27,7 @@ wired surface.
27
27
  - [Manifest](#manifest)
28
28
  - [Registration](#registration)
29
29
  - [Middleware patterns](#middleware-patterns)
30
+ - [Hooks](#hooks)
30
31
  - [Pipeline reference](#pipeline-reference)
31
32
  - [Timeouts](#timeouts)
32
33
  - [Strict-fail semantics](#strict-fail-semantics)
@@ -49,14 +50,14 @@ wired surface.
49
50
 
50
51
  ## What a plugin can contribute today
51
52
 
52
- | Surface | Where | Discovery |
53
- | ----------------------- | ------------------------- | ------------------------------------------------- |
54
- | Pipeline middleware | `plugin.middleware` | keyed by pipeline name in `PipelineMiddlewareMap` |
55
- | Model-visible tools | `plugin.tools` | each `PluginToolRegistration` |
56
- | HTTP routes | `plugin.routes` | each `PluginRouteRegistration` |
57
- | Skills | `plugin.skills` | each `PluginSkillRegistration` |
58
- | System-prompt injectors | `plugin.injectors` | each `Injector` |
59
- | Lifecycle | `init()` / `onShutdown()` | methods on the `Plugin` object |
53
+ | Surface | Where | Discovery |
54
+ | -------------------------- | ------------------- | ------------------------------------------------- |
55
+ | Pipeline middleware | `plugin.middleware` | keyed by pipeline name in `PipelineMiddlewareMap` |
56
+ | Model-visible tools | `plugin.tools` | each `PluginToolRegistration` |
57
+ | HTTP routes | `plugin.routes` | each `PluginRouteRegistration` |
58
+ | Skills | `plugin.skills` | each `PluginSkillRegistration` |
59
+ | System-prompt injectors | `plugin.injectors` | each `Injector` |
60
+ | Lifecycle & per-turn hooks | `plugin.hooks` | keyed by hook name (`init`, `shutdown`, …) |
60
61
 
61
62
  The modern schema wires only **hooks** and **tools**; the middleware
62
63
  pipelines, routes, skills, and injectors above are the surfaces that still
@@ -85,9 +86,8 @@ The `Plugin` shape is declared in
85
86
  ```typescript
86
87
  export interface Plugin {
87
88
  manifest: PluginManifest;
88
- init?(ctx: PluginInitContext): Promise<void>;
89
- onShutdown?(): Promise<void>;
90
- tools?: PluginToolRegistration[];
89
+ hooks?: PluginHooks;
90
+ tools?: Tool[];
91
91
  routes?: PluginRouteRegistration[];
92
92
  skills?: PluginSkillRegistration[];
93
93
  injectors?: Injector[];
@@ -96,8 +96,9 @@ export interface Plugin {
96
96
  ```
97
97
 
98
98
  Every field except `manifest` is optional. A plugin that only contributes
99
- middleware doesn't need tools or routes; a plugin that only contributes a
100
- skill can omit middleware entirely.
99
+ a hook doesn't need tools or routes; a plugin that only contributes a
100
+ skill can omit everything else. Lifecycle and per-turn behavior live under
101
+ `hooks` (see [Hooks](#hooks)).
101
102
 
102
103
  ## Where plugins live
103
104
 
@@ -310,7 +311,7 @@ terminal runs at the innermost layer. See
310
311
  [`assistant/src/plugins/pipeline.ts`](../src/plugins/pipeline.ts) for the
311
312
  composition algorithm.
312
313
 
313
- Four common patterns emerge from that signature:
314
+ Five common patterns emerge from that signature:
314
315
 
315
316
  ### Observe-only
316
317
 
@@ -319,8 +320,8 @@ return the result unchanged. Wrap the call in `try`/`finally` so your
319
320
  observer runs on both success and failure paths.
320
321
 
321
322
  ```typescript
322
- const observer: Middleware<ToolExecuteArgs, ToolExecuteResult> =
323
- async function observeToolExecute(args, next, ctx) {
323
+ const observer: Middleware<MemoryArgs, MemoryResult> =
324
+ async function observeRetrieval(args, next, ctx) {
324
325
  const start = performance.now();
325
326
  let outcome: "success" | "error" = "success";
326
327
  try {
@@ -330,27 +331,22 @@ const observer: Middleware<ToolExecuteArgs, ToolExecuteResult> =
330
331
  throw err;
331
332
  } finally {
332
333
  const ms = Math.round(performance.now() - start);
333
- console.error(JSON.stringify({ tool: args.name, ms, outcome }));
334
+ console.error(
335
+ JSON.stringify({ conversationId: args.conversationId, ms, outcome }),
336
+ );
334
337
  }
335
338
  };
336
339
  ```
337
340
 
338
341
  ### Transform input
339
342
 
340
- Rewrite `args` before calling downstream. Useful for request shimming
341
- (adding headers, redacting inputs, picking a different provider).
343
+ Rewrite `args` before calling downstream. Useful for reshaping the inputs
344
+ (forcing an untrusted read, narrowing the turn the retriever sees).
342
345
 
343
346
  ```typescript
344
- const addHeader: Middleware<LLMCallArgs, LLMCallResult> =
345
- async function addHeader(args, next, ctx) {
346
- const tagged = {
347
- ...args,
348
- options: {
349
- ...args.options,
350
- config: { ...args.options?.config, requestId: ctx.requestId },
351
- },
352
- };
353
- return next(tagged);
347
+ const untrustedRead: Middleware<MemoryArgs, MemoryResult> =
348
+ async function untrustedRead(args, next, ctx) {
349
+ return next({ ...args, trustContext: undefined });
354
350
  };
355
351
  ```
356
352
 
@@ -359,14 +355,14 @@ const addHeader: Middleware<LLMCallArgs, LLMCallResult> =
359
355
  Call `next(args)` first, then modify the result before returning.
360
356
 
361
357
  ```typescript
362
- const redactPII: Middleware<LLMCallArgs, LLMCallResult> =
363
- async function redactPII(args, next, ctx) {
364
- const response = await next(args);
365
- return {
366
- ...response,
367
- content: response.content.map(redactBlock),
368
- };
369
- };
358
+ const dropNow: Middleware<MemoryArgs, MemoryResult> = async function dropNow(
359
+ args,
360
+ next,
361
+ ctx,
362
+ ) {
363
+ const result = await next(args);
364
+ return { ...result, nowContent: null };
365
+ };
370
366
  ```
371
367
 
372
368
  ### Short-circuit
@@ -376,10 +372,11 @@ terminal and any inner middleware are skipped. Use this to stub, cache,
376
372
  or mock a pipeline.
377
373
 
378
374
  ```typescript
379
- const cacheHit: Middleware<LLMCallArgs, LLMCallResult> =
380
- async function cacheHit(args, next, ctx) {
381
- const cached = await lookupCache(args);
382
- if (cached) return cached;
375
+ const skipUntrusted: Middleware<MemoryArgs, MemoryResult> =
376
+ async function skipUntrusted(args, next, ctx) {
377
+ if (!isTrusted(ctx.trust)) {
378
+ return { pkbContent: null, nowContent: null, graphResult: null };
379
+ }
383
380
  return next(args);
384
381
  };
385
382
  ```
@@ -391,10 +388,10 @@ through any outer middleware unchanged — there is no internal
391
388
  `try`/`catch` around user middleware.
392
389
 
393
390
  ```typescript
394
- const denyIfUnauthorized: Middleware<ToolExecuteArgs, ToolExecuteResult> =
395
- async function denyIfUnauthorized(args, next, ctx) {
396
- if (!isAuthorizedFor(args.name, ctx.trust)) {
397
- throw new Error(`tool ${args.name} denied by policy`);
391
+ const denyIfUntrusted: Middleware<CompactionArgs, CompactionResult> =
392
+ async function denyIfUntrusted(args, next, ctx) {
393
+ if (!isTrusted(ctx.trust)) {
394
+ throw new Error(`compaction denied by policy`);
398
395
  }
399
396
  return next(args);
400
397
  };
@@ -407,30 +404,40 @@ pipeline runner pulls `Function.name` into its `chain` log field so
407
404
  operators can see the registered chain at a glance:
408
405
 
409
406
  ```
410
- plugin.pipeline pipeline=llmCall chain=["observeLlm","addHeader","defaultLlmCall"] durationMs=1840 outcome=success
407
+ plugin.pipeline pipeline=compaction chain=["observeCompaction","defaultCompaction"] durationMs=1840 outcome=success
411
408
  ```
412
409
 
410
+ ## Hooks
411
+
412
+ Hooks are the **modern** lifecycle surface: a plugin contributes one
413
+ function per phase under `plugin.hooks`, keyed by hook name. The wired
414
+ hook names live in [`HOOKS`](../src/plugin-api/constants.ts); the context
415
+ shapes and a full authoring walkthrough live in the
416
+ [experimental plugin guide](../../experimental/plugins/README.md#hooks).
417
+
418
+ Every hook implements `PluginHookFn` — it receives a context and either
419
+ mutates it in place (returning `void`) or returns a replacement. Hooks
420
+ from multiple plugins chain in registration order, and defaults register
421
+ first.
422
+
423
+ | Hook | Fires | Context |
424
+ | -------------------- | ----------------------------------------------------------------- | ------------------------- |
425
+ | `init` | Once when the plugin is registered. | `PluginInitContext` |
426
+ | `shutdown` | Once when the plugin is torn down. | `PluginShutdownContext` |
427
+ | `user-prompt-submit` | Once per user turn, before the agent loop receives the messages. | `UserPromptSubmitContext` |
428
+ | `post-tool-use` | Once per tool result, before it joins the provider-bound history. | `PostToolUseContext` |
429
+ | `stop` | Once per run when the model yields a turn with no tool calls. | `StopContext` |
430
+
413
431
  ## Pipeline reference
414
432
 
415
433
  Every pipeline slot and its purpose. Type details live in
416
434
  [`types.ts`](../src/plugins/types.ts).
417
435
 
418
- | Pipeline | Purpose |
419
- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
420
- | `turn` | The outermost wrapper around a single assistant turn. Middleware here sees everything a turn does end-to-end. |
421
- | `llmCall` | Every call to `Provider.sendMessage`. Input carries `messages` and `options` (with `tools`, `systemPrompt`, `config`, `onEvent`, `signal` inside). |
422
- | `toolExecute` | Every `ToolExecutor.execute` call. Input carries `name`, `input`, and the full `ToolContext`. |
423
- | `memoryRetrieval` | PKB, NOW.md, and memory-graph retrieval for a turn. Output is a merged `MemoryResult`. |
424
- | `historyRepair` | The pre-run repair pass on the message history. Wraps `repairHistory`. |
425
- | `tokenEstimate` | The token-count estimate used for budgeting. Wraps `estimatePromptTokensRaw`. |
426
- | `compaction` | The conversation-compaction step. Wraps `ContextWindowManager.maybeCompact`. |
427
- | `overflowReduce` | The reducer tier loop invoked when a turn blows the context budget. |
428
- | `persistence` | Every message CRUD op (`add` / `update` / `delete`). Discriminated by `args.op`. |
429
- | `titleGenerate` | Conversation title generation. Fire-and-forget by default. |
430
- | `toolResultTruncate` | The per-tool-result truncation step that fits a tool's output into the context window. |
431
- | `emptyResponse` | The decision about what to do when the model returns an empty turn (nudge / accept / error). |
432
- | `toolError` | The decision about what to do when one or more tool calls errored on a turn. |
433
- | `circuitBreaker` | The compaction circuit breaker. Tracks consecutive-failure state, decides whether to open the circuit. |
436
+ | Pipeline | Purpose |
437
+ | ---------------- | ------------------------------------------------------------------------------------------------------ |
438
+ | `compaction` | The conversation-compaction step. Wraps `ContextWindowManager.maybeCompact`. |
439
+ | `overflowReduce` | The reducer tier loop invoked when a turn blows the context budget. |
440
+ | `circuitBreaker` | The compaction circuit breaker. Tracks consecutive-failure state, decides whether to open the circuit. |
434
441
 
435
442
  ## Timeouts
436
443
 
@@ -441,22 +448,11 @@ duration. See
441
448
  [`assistant/src/plugins/pipeline.ts`](../src/plugins/pipeline.ts) for the
442
449
  current values.
443
450
 
444
- | Pipeline | Timeout | Rationale |
445
- | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------- |
446
- | `turn` | none | Turn duration is bounded by the downstream `llmCall` / `toolExecute` timeouts, not a pipeline-level timer. |
447
- | `llmCall` | none | Deferred to the provider's HTTP timeout so network hiccups surface as provider errors, not pipeline timeouts. |
448
- | `toolExecute` | none | Deferred to the per-tool timeout already enforced by `ToolExecutor`. |
449
- | `memoryRetrieval` | 5000 ms | Memory reads may hit Qdrant and disk; 5 s leaves slack for cold caches without blocking the turn indefinitely. |
450
- | `historyRepair` | 1000 ms | CPU-bound list walk — should finish in a few ms. |
451
- | `tokenEstimate` | 1000 ms | Same — CPU-bound, should return instantly. |
452
- | `compaction` | 30000 ms | Summarization involves a provider call; mirrors the pipeline-level budget for LLM-backed operations. |
453
- | `overflowReduce` | 30000 ms | Iterative compaction; matches the `compaction` budget since each tier step may invoke it. |
454
- | `persistence` | 10000 ms | SQLite writes, Qdrant deletes, and disk syncs. 10 s is generous for the slowest op (batched segment inserts). |
455
- | `titleGenerate` | 30000 ms | Provider-backed. Fire-and-forget, but the budget exists so a stuck call doesn't leak forever. |
456
- | `toolResultTruncate` | 1000 ms | Pure string op. |
457
- | `emptyResponse` | 500 ms | Decision logic only — must be near-instant. |
458
- | `toolError` | 500 ms | Decision logic only — must be near-instant. |
459
- | `circuitBreaker` | 500 ms | Numeric state update — must be near-instant. |
451
+ | Pipeline | Timeout | Rationale |
452
+ | ---------------- | -------- | ---------------------------------------------------------------------------------------------------- |
453
+ | `compaction` | 30000 ms | Summarization involves a provider call; mirrors the pipeline-level budget for LLM-backed operations. |
454
+ | `overflowReduce` | 30000 ms | Iterative compaction; matches the `compaction` budget since each tier step may invoke it. |
455
+ | `circuitBreaker` | 500 ms | Numeric state update must be near-instant. |
460
456
 
461
457
  `null` timeouts skip the timer entirely. Finite timeouts arm a
462
458
  `setTimeout` that races the pipeline via `Promise.race`.
@@ -793,7 +789,7 @@ Every pipeline invocation emits one structured line tagged
793
789
 
794
790
  | Field | Meaning |
795
791
  | ------------------------------------------ | ----------------------------------------------------------------------- |
796
- | `pipeline` | Pipeline name (`llmCall`, `toolExecute`, …). |
792
+ | `pipeline` | Pipeline name (`compaction`, `overflowReduce`, …). |
797
793
  | `chain` | Ordered list of middleware function names, outermost first. |
798
794
  | `durationMs` | Total time spent in the composed chain. |
799
795
  | `outcome` | `"success"`, `"error"`, or `"timeout"`. |
@@ -4,8 +4,8 @@ Minimal example plugin. Observes every assistant pipeline and logs one JSON
4
4
  line per invocation to `stderr`:
5
5
 
6
6
  ```json
7
- {"plugin":"echo","pipeline":"toolExecute","durationMs":42,"outcome":"success"}
8
- {"plugin":"echo","pipeline":"llmCall","durationMs":1873,"outcome":"success"}
7
+ {"plugin":"echo","pipeline":"compaction","durationMs":1590,"outcome":"success"}
8
+ {"plugin":"echo","pipeline":"overflowReduce","durationMs":42,"outcome":"success"}
9
9
  ```
10
10
 
11
11
  Use this as a starting point for writing your own plugin, or as a quick way
@@ -18,10 +18,8 @@ For the full plugin authoring guide, see
18
18
  ## What it does
19
19
 
20
20
  - Registers one observer middleware per slot in
21
- `PipelineMiddlewareMap` — `turn`, `llmCall`, `toolExecute`,
22
- `memoryRetrieval`, `historyRepair`, `tokenEstimate`, `compaction`,
23
- `overflowReduce`, `persistence`, `titleGenerate`, `toolResultTruncate`,
24
- `emptyResponse`, `toolError`, and `circuitBreaker`.
21
+ `PipelineMiddlewareMap` — `compaction`, `overflowReduce`, and
22
+ `circuitBreaker`.
25
23
  - Each middleware calls `next(args)` to pass the request through unchanged,
26
24
  measures wall-clock duration, and emits one line to `stderr` whether the
27
25
  downstream succeeded or threw.
@@ -96,12 +94,8 @@ tail -f ~/.vellum/daemon.log
96
94
  You should see one line per pipeline invocation, similar to:
97
95
 
98
96
  ```json
99
- {"plugin":"echo","pipeline":"persistence","durationMs":3,"outcome":"success"}
100
- {"plugin":"echo","pipeline":"tokenEstimate","durationMs":1,"outcome":"success"}
101
- {"plugin":"echo","pipeline":"memoryRetrieval","durationMs":64,"outcome":"success"}
102
- {"plugin":"echo","pipeline":"historyRepair","durationMs":0,"outcome":"success"}
103
- {"plugin":"echo","pipeline":"llmCall","durationMs":1520,"outcome":"success"}
104
- {"plugin":"echo","pipeline":"turn","durationMs":1590,"outcome":"success"}
97
+ {"plugin":"echo","pipeline":"compaction","durationMs":1590,"outcome":"success"}
98
+ {"plugin":"echo","pipeline":"overflowReduce","durationMs":42,"outcome":"success"}
105
99
  ```
106
100
 
107
101
  If a pipeline throws (for example, a tool that errors out), you'll see a
@@ -40,37 +40,15 @@
40
40
  * user-plugin-loader contract (see `assistant/src/plugins/user-loader.ts`).
41
41
  */
42
42
 
43
- import type {
44
- ToolResultTruncateArgs,
45
- ToolResultTruncateResult,
46
- } from "../../../src/plugins/defaults/tool-result-truncate/types.js";
47
43
  import type { VellumPluginRuntime } from "../../../src/plugins/external-api.js";
48
44
  import type {
49
45
  CircuitBreakerArgs,
50
46
  CircuitBreakerResult,
51
47
  CompactionArgs,
52
48
  CompactionResult,
53
- EmptyResponseArgs,
54
- EmptyResponseResult,
55
- LLMCallArgs,
56
- LLMCallResult,
57
- MemoryArgs,
58
- MemoryResult,
59
49
  OverflowReduceArgs,
60
50
  OverflowReduceResult,
61
- PersistArgs,
62
- PersistResult,
63
51
  Plugin,
64
- TitleArgs,
65
- TitleResult,
66
- TokenEstimateArgs,
67
- TokenEstimateResult,
68
- ToolErrorArgs,
69
- ToolErrorResult,
70
- ToolExecuteArgs,
71
- ToolExecuteResult,
72
- TurnArgs,
73
- TurnResult,
74
52
  } from "../../../src/plugins/types.js";
75
53
 
76
54
  const runtime = (globalThis as { __vellumPluginRuntime?: VellumPluginRuntime })
@@ -150,29 +128,10 @@ const echoPlugin: Plugin = {
150
128
  version: "0.1.0",
151
129
  },
152
130
  middleware: {
153
- turn: makeObserver<TurnArgs, TurnResult>("turn"),
154
- llmCall: makeObserver<LLMCallArgs, LLMCallResult>("llmCall"),
155
- toolExecute: makeObserver<ToolExecuteArgs, ToolExecuteResult>(
156
- "toolExecute",
157
- ),
158
- memoryRetrieval: makeObserver<MemoryArgs, MemoryResult>("memoryRetrieval"),
159
- tokenEstimate: makeObserver<TokenEstimateArgs, TokenEstimateResult>(
160
- "tokenEstimate",
161
- ),
162
131
  compaction: makeObserver<CompactionArgs, CompactionResult>("compaction"),
163
132
  overflowReduce: makeObserver<OverflowReduceArgs, OverflowReduceResult>(
164
133
  "overflowReduce",
165
134
  ),
166
- persistence: makeObserver<PersistArgs, PersistResult>("persistence"),
167
- titleGenerate: makeObserver<TitleArgs, TitleResult>("titleGenerate"),
168
- toolResultTruncate: makeObserver<
169
- ToolResultTruncateArgs,
170
- ToolResultTruncateResult
171
- >("toolResultTruncate"),
172
- emptyResponse: makeObserver<EmptyResponseArgs, EmptyResponseResult>(
173
- "emptyResponse",
174
- ),
175
- toolError: makeObserver<ToolErrorArgs, ToolErrorResult>("toolError"),
176
135
  circuitBreaker: makeObserver<CircuitBreakerArgs, CircuitBreakerResult>(
177
136
  "circuitBreaker",
178
137
  ),
@@ -16,9 +16,9 @@
16
16
  * Moving the fully typed discriminated union into this package would
17
17
  * require relocating `assistant/src/daemon/message-types/` and its
18
18
  * cross-file type dependencies (`channels/types.ts`,
19
- * `skills/skillssh-registry.ts`, `runtime/guardian-decision-types.ts`,
20
- * `gallery/gallery-manifest.ts`). That is out of scope for PR 3 of the
21
- * skill-isolation plan and is tracked for later iteration.
19
+ * `skills/skillssh-registry.ts`, `runtime/guardian-decision-types.ts`).
20
+ * That is out of scope for PR 3 of the skill-isolation plan and is
21
+ * tracked for later iteration.
22
22
  */
23
23
 
24
24
  /**