@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
@@ -1,31 +0,0 @@
1
- /**
2
- * Default `titleGenerate` behavior: kicks off conversation-title generation.
3
- *
4
- * This module is side-effect free: importing it does not register any plugin.
5
- *
6
- * Delegates to {@link queueGenerateConversationTitle}, which schedules title
7
- * generation as fire-and-forget background work and falls back to a
8
- * deterministic placeholder on failure.
9
- */
10
-
11
- import { queueGenerateConversationTitle } from "../../../memory/conversation-title-service.js";
12
- import type { TitleArgs, TitleResult } from "../../types.js";
13
-
14
- /**
15
- * Invoke the title-generation service with the provided arguments. Exported
16
- * for tests that want to exercise the default directly.
17
- *
18
- * Returns an empty result — the service is fire-and-forget and surfaces its
19
- * output through `onTitleUpdated`.
20
- */
21
- export async function defaultTitleGenerateTerminal(
22
- args: TitleArgs,
23
- ): Promise<TitleResult> {
24
- queueGenerateConversationTitle({
25
- conversationId: args.conversationId,
26
- provider: args.provider,
27
- userMessage: args.userMessage,
28
- onTitleUpdated: args.onTitleUpdated,
29
- });
30
- return {};
31
- }
@@ -1,23 +0,0 @@
1
- import type {
2
- EstimateArgs,
3
- EstimateResult,
4
- Middleware,
5
- } from "../../../types.js";
6
-
7
- /**
8
- * Passthrough middleware for the `tokenEstimate` pipeline. Forwards to
9
- * `next(args)` unchanged; the actual estimate lives in the terminal handler
10
- * (`../terminal.ts`), wired in at the `runPipeline` call sites in
11
- * `daemon/conversation-agent-loop.ts`.
12
- *
13
- * Defaults register at the OUTERMOST onion position, so deciding here without
14
- * calling `next` would shadow every later-registered plugin. The passthrough
15
- * lets user middleware that wraps the default (e.g. a doubler, a
16
- * provider-native `countTokens` override) participate normally.
17
- */
18
- const passthrough: Middleware<EstimateArgs, EstimateResult> = async (
19
- args,
20
- next,
21
- ) => next(args);
22
-
23
- export default passthrough;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-token-estimate",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in token-estimate pipeline with a passthrough implementation.",
5
- "private": true,
6
- "license": "MIT",
7
- "type": "module",
8
- "main": "./register.ts",
9
- "engines": {
10
- "node": ">=20.12.0"
11
- },
12
- "peerDependencies": {
13
- "@vellumai/plugin-api": "^0.8.0"
14
- }
15
- }
@@ -1,34 +0,0 @@
1
- /**
2
- * Default `tokenEstimate` plugin.
3
- *
4
- * The plugin's middleware is a passthrough — it calls `next(args)` and returns
5
- * the result unchanged. The actual estimate lives in the terminal handler in
6
- * `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
7
- * `runPipeline` call sites in `daemon/conversation-agent-loop.ts`. This
8
- * separation matters: the default plugin is registered before any user plugin
9
- * (defaults load first in `bootstrapPlugins()`), which puts it at the
10
- * OUTERMOST position of the onion chain. If the default middleware were to
11
- * invoke the terminal directly without calling `next`, it would shadow every
12
- * later-registered plugin. The passthrough lets user middleware that wraps the
13
- * default (e.g. a doubler, a provider-native `countTokens` override)
14
- * participate normally.
15
- */
16
-
17
- import { type Plugin } from "../../types.js";
18
- import tokenEstimate from "./middlewares/tokenEstimate.js";
19
- import pkg from "./package.json" with { type: "json" };
20
-
21
- /**
22
- * Default `tokenEstimate` plugin. Registered by
23
- * {@link bootstrapPlugins} on daemon startup so the pipeline always has a
24
- * terminal handler even when no other plugin contributes one.
25
- */
26
- export const defaultTokenEstimatePlugin: Plugin = {
27
- manifest: {
28
- name: pkg.name,
29
- version: pkg.version,
30
- },
31
- middleware: {
32
- tokenEstimate,
33
- },
34
- };
@@ -1,40 +0,0 @@
1
- /**
2
- * Default `tokenEstimate` behavior: estimates the prompt token count used by
3
- * the overflow gate.
4
- *
5
- * This module is side-effect free: importing it does not register any plugin.
6
- *
7
- * Delegates to
8
- * {@link estimatePromptTokens}, which applies the EWMA calibration correction
9
- * recorded from past provider responses. Preflight + mid-loop checks must use
10
- * the calibrated estimate — the calibrated value keeps the overflow gate
11
- * consistent with the convergence path in the reducer. The pre-send
12
- * calibration capture in `agent/loop.ts` still uses `estimatePromptTokensRaw`
13
- * on purpose — the calibrator must learn against the raw estimate so the EWMA
14
- * converges against provider ground truth rather than chasing its own
15
- * corrected output. This path produces the user-facing estimate; calibration
16
- * capture stays separate.
17
- */
18
-
19
- import {
20
- estimatePromptTokens,
21
- estimateToolsTokens,
22
- } from "../../../context/token-estimator.js";
23
- import type { EstimateArgs, EstimateResult } from "../../types.js";
24
-
25
- /**
26
- * Compute the tool token budget from `args.tools` and delegate to
27
- * {@link estimatePromptTokens} with the canonical provider key, applying the
28
- * EWMA calibration correction. Exported so the agent loop can call it directly
29
- * and tests can verify the default behavior.
30
- */
31
- export const defaultTokenEstimateTerminal = async (
32
- args: EstimateArgs,
33
- ): Promise<EstimateResult> => {
34
- const toolTokenBudget =
35
- args.tools.length > 0 ? estimateToolsTokens(args.tools) : 0;
36
- return estimatePromptTokens(args.history, args.systemPrompt, {
37
- providerName: args.providerName,
38
- toolTokenBudget,
39
- });
40
- };
@@ -1,21 +0,0 @@
1
- import type {
2
- Middleware,
3
- ToolErrorArgs,
4
- ToolErrorDecision,
5
- } from "../../../types.js";
6
-
7
- /**
8
- * Passthrough middleware for the `toolError` pipeline. Forwards to `next(args)`
9
- * so later-registered user plugins still participate in the onion chain; the
10
- * actual nudge-decision logic lives in the terminal handler (`../terminal.ts`),
11
- * wired in at the `runPipeline` call site in `agent/loop.ts`.
12
- *
13
- * Named explicitly so the pipeline's structured log record carries
14
- * `"defaultToolErrorMiddleware"` in `chain` instead of an anonymous entry.
15
- */
16
- const defaultToolErrorMiddleware: Middleware<ToolErrorArgs, ToolErrorDecision> =
17
- async function defaultToolErrorMiddleware(args, next) {
18
- return next(args);
19
- };
20
-
21
- export default defaultToolErrorMiddleware;
@@ -1,47 +0,0 @@
1
- /**
2
- * Default `toolError` behavior: decides whether to nudge the LLM after a tool
3
- * call fails.
4
- *
5
- * This module is side-effect free: importing it does not register any plugin.
6
- *
7
- * The canonical nudge decision: when the current turn produced at least one
8
- * failed tool result, append a system-notice block to the tool results that
9
- * coaches the LLM to either retry with corrected parameters (for recoverable
10
- * errors) or report the failure to the user (for unrecoverable ones). Once
11
- * the consecutive-error-turn counter exceeds the caller-supplied cap, the
12
- * nudge is skipped — the error is likely not something the LLM can fix on
13
- * its own and continuing to nudge only burns tokens.
14
- */
15
-
16
- import type { ToolErrorArgs, ToolErrorDecision } from "../../types.js";
17
-
18
- /**
19
- * Canonical nudge text. Kept as a module-level constant so tests and future
20
- * plugins can match it without duplicating the string.
21
- */
22
- export const DEFAULT_TOOL_ERROR_NUDGE_TEXT =
23
- "<system_notice>One or more tool calls returned an error. If the error looks recoverable (e.g. missing or invalid parameters), fix the parameters and retry. If the error is clearly unrecoverable (e.g. a service is down, a resource does not exist, or a permission is permanently denied), report it to the user.</system_notice>";
24
-
25
- /**
26
- * Nudge iff the current turn had an error AND the consecutive-error counter is
27
- * within the cap. Once the cap is breached the caller should stop appending
28
- * the nudge (the error is likely unrecoverable and the LLM already had
29
- * multiple attempts to correct it).
30
- *
31
- * Exported so the agent loop can call it directly and tests can verify the
32
- * decision logic.
33
- */
34
- export const defaultToolErrorTerminal = async (
35
- args: ToolErrorArgs,
36
- ): Promise<ToolErrorDecision> => {
37
- if (
38
- args.hasToolError &&
39
- args.consecutiveErrorTurns <= args.maxConsecutiveErrorNudges
40
- ) {
41
- return {
42
- action: "nudge",
43
- nudgeText: DEFAULT_TOOL_ERROR_NUDGE_TEXT,
44
- };
45
- }
46
- return { action: "skip" };
47
- };
@@ -1,23 +0,0 @@
1
- import type {
2
- Middleware,
3
- ToolExecuteArgs,
4
- ToolExecuteResult,
5
- } from "../../../types.js";
6
-
7
- /**
8
- * Passthrough middleware for the `toolExecute` pipeline. Forwards to
9
- * `next(args)` and returns the downstream result unchanged. The original
10
- * `ToolExecutor.execute` behavior runs in the terminal bound at the call site,
11
- * so this default makes the pipeline shape explicit without introducing any
12
- * behavior of its own: the chain `[defaultMiddleware] → terminal` composes
13
- * identically to `[] → terminal`.
14
- *
15
- * Named so the pipeline runner's `chain` log entry reads `defaultToolExecute`
16
- * instead of `anonymous`.
17
- */
18
- const defaultToolExecute: Middleware<ToolExecuteArgs, ToolExecuteResult> =
19
- async function defaultToolExecute(args, next) {
20
- return next(args);
21
- };
22
-
23
- export default defaultToolExecute;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-tool-execute",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in tool-execute pipeline with a passthrough implementation.",
5
- "private": true,
6
- "license": "MIT",
7
- "type": "module",
8
- "main": "./register.ts",
9
- "engines": {
10
- "node": ">=20.12.0"
11
- },
12
- "peerDependencies": {
13
- "@vellumai/plugin-api": "^0.8.0"
14
- }
15
- }
@@ -1,49 +0,0 @@
1
- /**
2
- * Default `toolExecute` plugin — a no-argument passthrough that preserves
3
- * the behavior `ToolExecutor.execute` had before the pipeline wrapper was
4
- * introduced.
5
- *
6
- * Design
7
- * ------
8
- * The public {@link ToolExecutor.execute} method invokes
9
- * {@link runPipeline} with the terminal bound to an internal
10
- * `executeInternal` method (the original execute body, refactored to avoid
11
- * recursion). Because the terminal IS the original behavior, the default
12
- * plugin's `middleware.toolExecute` is a thin passthrough: it forwards to
13
- * `next(args)` and returns the downstream result unchanged.
14
- *
15
- * This matches the convention set by PR 15 (`default-llm-call.ts`) for
16
- * `llmCall` — the default plugin makes the pipeline shape explicit without
17
- * introducing any behavior of its own. When no third-party plugins are
18
- * registered the chain is `[defaultMiddleware] → terminal`, which composes
19
- * identically to `[] → terminal`, so the shell-integration tests (which
20
- * never register the default) stay unchanged-green.
21
- *
22
- * Why a dedicated plugin at all?
23
- * ------------------------------
24
- * - It signals publicly that `toolExecute` is a supported pipeline slot with
25
- * a concrete contract.
26
- * - Registration order determines onion order. If a third-party plugin
27
- * wraps `toolExecute`, the runtime should boot with the default present
28
- * (as the innermost passthrough) so the chain visibly contains a
29
- * canonical terminator regardless of which third parties load.
30
- */
31
-
32
- import { type Plugin } from "../../types.js";
33
- import defaultToolExecute from "./middlewares/toolExecute.js";
34
- import pkg from "./package.json" with { type: "json" };
35
-
36
- /**
37
- * The default `toolExecute` plugin. Exported as a module constant that the
38
- * defaults aggregator registers centrally; tests may register it explicitly to
39
- * cover the on-by-default execution path.
40
- */
41
- export const defaultToolExecutePlugin: Plugin = {
42
- manifest: {
43
- name: pkg.name,
44
- version: pkg.version,
45
- },
46
- middleware: {
47
- toolExecute: defaultToolExecute,
48
- },
49
- };
@@ -1,23 +0,0 @@
1
- import type { Middleware } from "../../../types.js";
2
- import type {
3
- ToolResultTruncateArgs,
4
- ToolResultTruncateResult,
5
- } from "../types.js";
6
-
7
- /**
8
- * Passthrough middleware for the `toolResultTruncate` pipeline. Forwards to
9
- * `next(args)` unchanged; the actual truncation lives in the terminal handler
10
- * (`../terminal.ts`), wired in at the `runPipeline` call site in
11
- * `agent/loop.ts`.
12
- *
13
- * Defaults register at the OUTERMOST onion position, so deciding here without
14
- * calling `next` would shadow every later-registered plugin (including
15
- * hot-reloaded ones). Routing through `next(args)` lets user middleware
16
- * participate normally.
17
- */
18
- const passthrough: Middleware<
19
- ToolResultTruncateArgs,
20
- ToolResultTruncateResult
21
- > = async (args, next) => next(args);
22
-
23
- export default passthrough;
@@ -1,22 +0,0 @@
1
- /**
2
- * Argument and result shapes for the default `toolResultTruncate` behavior.
3
- */
4
-
5
- /**
6
- * Input to tool-result truncation: the raw tool-result text and the character
7
- * budget the caller computed from the context-window share.
8
- */
9
- export type ToolResultTruncateArgs = {
10
- readonly content: string;
11
- readonly maxChars: number;
12
- };
13
-
14
- /**
15
- * Output of tool-result truncation: the (possibly truncated) content and a
16
- * boolean indicating whether the input was actually shortened. Callers use
17
- * `truncated` for telemetry / warnings.
18
- */
19
- export type ToolResultTruncateResult = {
20
- readonly content: string;
21
- readonly truncated: boolean;
22
- };
@@ -1,111 +0,0 @@
1
- /**
2
- * Skill category inference — ports the Swift `inferCategory` logic from
3
- * `ConstellationView.swift` to TypeScript for server-side use.
4
- *
5
- * Pure function with no side effects or external dependencies.
6
- */
7
-
8
- export type SkillCategory =
9
- | "communication"
10
- | "productivity"
11
- | "development"
12
- | "media"
13
- | "automation"
14
- | "webSocial"
15
- | "knowledge"
16
- | "integration";
17
-
18
- const CATEGORY_KEYWORDS: [SkillCategory, string[]][] = [
19
- [
20
- "communication",
21
- [
22
- "email",
23
- "message",
24
- "messaging",
25
- "chat",
26
- "phone",
27
- "phone call",
28
- "voice call",
29
- "video call",
30
- "contact",
31
- "notification",
32
- "followup",
33
- "slack",
34
- "telegram",
35
- ],
36
- ],
37
- [
38
- "productivity",
39
- [
40
- "task",
41
- "calendar",
42
- "reminder",
43
- "schedule",
44
- "document",
45
- "playbook",
46
- "notion",
47
- ],
48
- ],
49
- [
50
- "development",
51
- [
52
- "code",
53
- "app builder",
54
- "github",
55
- "developer",
56
- "programming",
57
- "debug",
58
- "typescript",
59
- "frontend",
60
- "subagent",
61
- "api mapping",
62
- "cli discovery",
63
- ],
64
- ],
65
- ["automation", ["browser", "computer use", "macos", "watcher", "automat"]],
66
- [
67
- "media",
68
- ["image", "screen", "media", "transcri", "video", "audio", "recording"],
69
- ],
70
- [
71
- "webSocial",
72
- [
73
- "x.com",
74
- "twitter",
75
- "public ingress",
76
- "influencer",
77
- "doordash",
78
- "amazon",
79
- "restaurant",
80
- ],
81
- ],
82
- [
83
- "knowledge",
84
- [
85
- "knowledge",
86
- "weather",
87
- "start the day",
88
- "skills catalog",
89
- "self upgrade",
90
- "briefing",
91
- ],
92
- ],
93
- ["integration", ["oauth", "setup", "configure", "connect", "webhook"]],
94
- ];
95
-
96
- export function inferCategory(
97
- name: string,
98
- description: string,
99
- ): SkillCategory {
100
- const combined = `${name} ${description}`.toLowerCase();
101
-
102
- for (const [category, keywords] of CATEGORY_KEYWORDS) {
103
- for (const keyword of keywords) {
104
- if (combined.includes(keyword)) {
105
- return category;
106
- }
107
- }
108
- }
109
-
110
- return "knowledge";
111
- }