@vellumai/assistant 0.10.1 → 0.10.2-dev.202606241651.2d2b40d

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 (367) hide show
  1. package/docs/workspace-tools.md +42 -33
  2. package/eslint-rules/cli-no-daemon-internals.js +6 -0
  3. package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +91 -0
  4. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +31 -0
  5. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
  6. package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
  7. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +17 -0
  8. package/openapi.yaml +74 -1
  9. package/package.json +1 -1
  10. package/scripts/test.sh +36 -15
  11. package/src/__tests__/actor-token-service.test.ts +36 -14
  12. package/src/__tests__/agent-loop-override-profile.test.ts +1 -0
  13. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
  14. package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
  15. package/src/__tests__/annotate-activity-metadata.test.ts +2 -0
  16. package/src/__tests__/annotate-risk-options.test.ts +2 -0
  17. package/src/__tests__/approval-cascade.test.ts +2 -0
  18. package/src/__tests__/background-workers-disk-pressure.test.ts +2 -0
  19. package/src/__tests__/btw-routes.test.ts +2 -0
  20. package/src/__tests__/build-persisted-content.test.ts +2 -0
  21. package/src/__tests__/call-controller.test.ts +19 -0
  22. package/src/__tests__/channel-guardian.test.ts +94 -58
  23. package/src/__tests__/channel-reply-delivery.test.ts +2 -0
  24. package/src/__tests__/compaction-events.test.ts +2 -0
  25. package/src/__tests__/compaction.benchmark.test.ts +2 -0
  26. package/src/__tests__/compactor-call-site-logging.test.ts +2 -0
  27. package/src/__tests__/compactor-low-watermark-cut.test.ts +2 -0
  28. package/src/__tests__/compactor-preserved-tail-count.test.ts +2 -0
  29. package/src/__tests__/compactor-summary-call-truncation.test.ts +2 -0
  30. package/src/__tests__/compactor-web-search-strip.test.ts +2 -0
  31. package/src/__tests__/computer-use-tools.test.ts +13 -0
  32. package/src/__tests__/config-loader-backfill.test.ts +5 -1
  33. package/src/__tests__/config-schema.test.ts +1 -0
  34. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +31 -29
  35. package/src/__tests__/contacts-relay-reads.test.ts +13 -15
  36. package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
  37. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -0
  38. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  39. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -0
  40. package/src/__tests__/conversation-agent-loop.test.ts +7 -0
  41. package/src/__tests__/conversation-analysis-routes.test.ts +2 -0
  42. package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -0
  43. package/src/__tests__/conversation-confirmation-signals.test.ts +2 -0
  44. package/src/__tests__/conversation-history-web-search.test.ts +2 -0
  45. package/src/__tests__/conversation-load-history-repair.test.ts +2 -0
  46. package/src/__tests__/conversation-load-history-stripped.test.ts +2 -0
  47. package/src/__tests__/conversation-pairing.test.ts +2 -0
  48. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +2 -0
  49. package/src/__tests__/conversation-process-callsite.test.ts +2 -0
  50. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
  51. package/src/__tests__/conversation-queue.test.ts +91 -0
  52. package/src/__tests__/conversation-routes-guardian-reply.test.ts +14 -0
  53. package/src/__tests__/conversation-routes-slash-commands.test.ts +14 -0
  54. package/src/__tests__/conversation-slash-queue.test.ts +2 -0
  55. package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
  56. package/src/__tests__/conversation-speed-override.test.ts +2 -0
  57. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +65 -0
  58. package/src/__tests__/conversation-title-service.test.ts +2 -0
  59. package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
  60. package/src/__tests__/conversation-usage.test.ts +2 -0
  61. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
  62. package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
  63. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
  64. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  65. package/src/__tests__/db-migration-rollback.test.ts +205 -171
  66. package/src/__tests__/db-test-helpers.ts +5 -4
  67. package/src/__tests__/deterministic-verification-control-plane.test.ts +4 -2
  68. package/src/__tests__/disk-pressure-guard.test.ts +41 -0
  69. package/src/__tests__/dm-persistence.test.ts +2 -0
  70. package/src/__tests__/emit-signal-routing-intent.test.ts +10 -5
  71. package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
  72. package/src/__tests__/filing-service.test.ts +2 -0
  73. package/src/__tests__/guardian-binding-drift-heal.test.ts +75 -10
  74. package/src/__tests__/guardian-dispatch.test.ts +95 -1
  75. package/src/__tests__/guardian-outbound-http.test.ts +13 -0
  76. package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
  77. package/src/__tests__/heartbeat-service.test.ts +2 -0
  78. package/src/__tests__/helpers/channel-test-adapter.ts +1 -7
  79. package/src/__tests__/host-app-control-routes.test.ts +24 -30
  80. package/src/__tests__/host-bash-routes.test.ts +31 -41
  81. package/src/__tests__/host-browser-routes.test.ts +26 -32
  82. package/src/__tests__/host-cu-proxy.test.ts +299 -0
  83. package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
  84. package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
  85. package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
  86. package/src/__tests__/http-user-message-parity.test.ts +167 -8
  87. package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
  88. package/src/__tests__/invite-redemption-service.test.ts +43 -0
  89. package/src/__tests__/llm-context-normalization.test.ts +105 -0
  90. package/src/__tests__/llm-usage-store.test.ts +25 -0
  91. package/src/__tests__/media-stream-server-integration.test.ts +127 -0
  92. package/src/__tests__/memory-retrieval-hook.test.ts +2 -0
  93. package/src/__tests__/messaging-send-tool.test.ts +2 -0
  94. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  95. package/src/__tests__/native-web-search.test.ts +2 -0
  96. package/src/__tests__/non-member-access-request.test.ts +189 -17
  97. package/src/__tests__/notification-broadcaster.test.ts +4 -0
  98. package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
  99. package/src/__tests__/notification-deep-link.test.ts +6 -0
  100. package/src/__tests__/notification-guardian-path.test.ts +19 -0
  101. package/src/__tests__/outbound-slack-persistence.test.ts +2 -0
  102. package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
  103. package/src/__tests__/persistence-secret-redaction.test.ts +2 -0
  104. package/src/__tests__/plugin-bootstrap.test.ts +3 -73
  105. package/src/__tests__/plugin-route-contribution.test.ts +4 -17
  106. package/src/__tests__/plugin-tool-contribution.test.ts +3 -18
  107. package/src/__tests__/plugin-types.test.ts +0 -2
  108. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  109. package/src/__tests__/process-message-display-content.test.ts +2 -0
  110. package/src/__tests__/provider-usage-tracking.test.ts +39 -0
  111. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +2 -0
  112. package/src/__tests__/registry.test.ts +3 -0
  113. package/src/__tests__/relay-server.test.ts +694 -25
  114. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  115. package/src/__tests__/secret-ingress-http.test.ts +14 -0
  116. package/src/__tests__/send-endpoint-busy.test.ts +30 -8
  117. package/src/__tests__/skills.test.ts +44 -0
  118. package/src/__tests__/slack-inbound-verification.test.ts +47 -2
  119. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +102 -0
  120. package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
  121. package/src/__tests__/stt-hints.test.ts +44 -13
  122. package/src/__tests__/subagent-detail.test.ts +27 -0
  123. package/src/__tests__/subagent-disposal.test.ts +65 -0
  124. package/src/__tests__/subagent-notify-parent.test.ts +2 -0
  125. package/src/__tests__/subagent-spawn-tool-fork.test.ts +2 -0
  126. package/src/__tests__/subagent-tools.test.ts +2 -0
  127. package/src/__tests__/suggestion-routes.test.ts +2 -0
  128. package/src/__tests__/title-generate-hook.test.ts +2 -0
  129. package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -0
  130. package/src/__tests__/tool-executor.test.ts +16 -11
  131. package/src/__tests__/tool-preview-lifecycle.test.ts +2 -0
  132. package/src/__tests__/tool-result-metadata-plumbing.test.ts +2 -0
  133. package/src/__tests__/tool-start-timestamp.test.ts +2 -0
  134. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
  135. package/src/__tests__/twilio-routes.test.ts +96 -0
  136. package/src/__tests__/verification-control-plane-policy.test.ts +2 -0
  137. package/src/__tests__/web-search-backend-failure.test.ts +2 -0
  138. package/src/__tests__/workspace-tool-loader.test.ts +195 -2
  139. package/src/agent/loop-exclusive-tool.test.ts +150 -0
  140. package/src/agent/loop.ts +56 -0
  141. package/src/api/constants/sse-replay.ts +41 -0
  142. package/src/api/index.ts +6 -0
  143. package/src/api/responses/llm-request-log-entry.ts +25 -0
  144. package/src/api/responses/subagent-detail.ts +17 -0
  145. package/src/calls/__tests__/relay-setup-router.test.ts +262 -4
  146. package/src/calls/call-domain.ts +3 -3
  147. package/src/calls/guardian-dispatch.ts +10 -8
  148. package/src/calls/inbound-trust-reader.ts +17 -1
  149. package/src/calls/media-stream-server.ts +21 -0
  150. package/src/calls/relay-server.ts +167 -50
  151. package/src/calls/relay-setup-router.ts +37 -7
  152. package/src/calls/relay-verification.ts +4 -4
  153. package/src/calls/stt-hints.ts +9 -12
  154. package/src/calls/twilio-routes.ts +14 -4
  155. package/src/cli/commands/__tests__/cache.test.ts +8 -1
  156. package/src/cli/commands/cache.ts +194 -181
  157. package/src/cli/commands/db/__tests__/repair.test.ts +6 -5
  158. package/src/cli/commands/db/status.ts +37 -1
  159. package/src/cli/commands/mcp.ts +252 -218
  160. package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
  161. package/src/cli/commands/memory/index.ts +2 -0
  162. package/src/cli/commands/memory/worker.ts +175 -0
  163. package/src/cli/commands/plugins.ts +75 -3
  164. package/src/cli/lib/__tests__/install-from-github.test.ts +102 -0
  165. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
  166. package/src/cli/lib/list-installed-plugins.ts +179 -1
  167. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
  168. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -1
  169. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +27 -17
  170. package/src/config/bundled-skills/contacts/tools/contact-search.ts +13 -3
  171. package/src/config/feature-flag-registry.json +0 -8
  172. package/src/config/loader.ts +36 -5
  173. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  174. package/src/config/schemas/memory-lifecycle.ts +12 -0
  175. package/src/config/schemas/memory-v3.ts +7 -0
  176. package/src/config/schemas/memory.ts +4 -0
  177. package/src/config/schemas/timeouts.ts +8 -0
  178. package/src/config/seed-inference-profiles.ts +14 -5
  179. package/src/config/skills.ts +27 -5
  180. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
  181. package/src/contacts/contacts-write.ts +3 -0
  182. package/src/contacts/guardian-delivery-reader.ts +223 -0
  183. package/src/daemon/conversation-agent-loop.ts +9 -0
  184. package/src/daemon/conversation-process.ts +39 -17
  185. package/src/daemon/conversation-surfaces.ts +8 -0
  186. package/src/daemon/conversation-tool-setup.ts +49 -16
  187. package/src/daemon/conversation.ts +21 -2
  188. package/src/daemon/disk-pressure-guard.ts +12 -2
  189. package/src/daemon/event-loop-watchdog.ts +28 -1
  190. package/src/daemon/external-plugins-bootstrap.ts +4 -34
  191. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +25 -0
  192. package/src/daemon/handlers/__tests__/config-channels.test.ts +225 -0
  193. package/src/daemon/handlers/config-a2a.ts +6 -14
  194. package/src/daemon/handlers/config-channels.ts +78 -22
  195. package/src/daemon/handlers/conversations.ts +77 -0
  196. package/src/daemon/host-cu-proxy.ts +102 -11
  197. package/src/daemon/lifecycle.ts +4 -0
  198. package/src/daemon/memory-v2-startup.test.ts +72 -0
  199. package/src/daemon/memory-v2-startup.ts +87 -19
  200. package/src/daemon/server.ts +0 -4
  201. package/src/daemon/shutdown-handlers.ts +20 -0
  202. package/src/daemon/tool-setup-types.ts +9 -0
  203. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  204. package/src/ipc/assistant-server.ts +2 -2
  205. package/src/memory/__tests__/301-create-watchdog-events.test.ts +110 -0
  206. package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
  207. package/src/memory/__tests__/prompt-override.test.ts +192 -0
  208. package/src/memory/__tests__/watchdog-events-store.test.ts +161 -0
  209. package/src/memory/conversation-crud.ts +38 -0
  210. package/src/memory/db-connection.ts +22 -3
  211. package/src/memory/db-init.ts +36 -502
  212. package/src/memory/db-singleton.ts +6 -4
  213. package/src/memory/jobs-worker.ts +58 -0
  214. package/src/memory/llm-usage-store.ts +48 -20
  215. package/src/memory/memory-retrospective-job.ts +9 -8
  216. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +13 -3
  217. package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -27
  218. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +130 -56
  219. package/src/memory/migrations/300-add-processing-started-at.ts +30 -0
  220. package/src/memory/migrations/301-create-watchdog-events.ts +45 -0
  221. package/src/memory/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +108 -0
  222. package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
  223. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -0
  224. package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
  225. package/src/memory/migrations/run-migrations.ts +90 -6
  226. package/src/memory/migrations/schema-introspection.ts +14 -0
  227. package/src/memory/migrations/validate-migration-state.ts +101 -66
  228. package/src/memory/prompt-override.ts +129 -0
  229. package/src/memory/schema/conversations.ts +9 -0
  230. package/src/memory/schema/infrastructure.ts +20 -0
  231. package/src/memory/steps.ts +573 -0
  232. package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
  233. package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
  234. package/src/memory/v2/cli-command-store.ts +75 -38
  235. package/src/memory/v2/prompts/consolidation.ts +13 -82
  236. package/src/memory/v2/prompts/router.ts +21 -93
  237. package/src/memory/v2/skill-store.ts +68 -31
  238. package/src/memory/watchdog-events-store.ts +87 -0
  239. package/src/memory/worker-control.ts +118 -0
  240. package/src/memory/worker-process.ts +72 -0
  241. package/src/notifications/__tests__/broadcaster.test.ts +16 -8
  242. package/src/notifications/__tests__/connected-channels.test.ts +114 -0
  243. package/src/notifications/__tests__/decision-engine.test.ts +78 -9
  244. package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
  245. package/src/notifications/broadcaster.ts +8 -1
  246. package/src/notifications/decision-engine.ts +15 -7
  247. package/src/notifications/destination-resolver.ts +68 -24
  248. package/src/notifications/emit-signal.ts +39 -14
  249. package/src/onboarding/checkin-event.test.ts +220 -0
  250. package/src/onboarding/checkin-event.ts +321 -0
  251. package/src/onboarding/schedule-checkin.ts +190 -0
  252. package/src/permissions/question-prompter.test.ts +1 -1
  253. package/src/permissions/question-prompter.ts +7 -4
  254. package/src/plugin-api/index.ts +6 -6
  255. package/src/plugin-api/types.ts +3 -5
  256. package/src/plugin-api/vision-support.test.ts +28 -4
  257. package/src/plugin-api/vision-support.ts +66 -31
  258. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +161 -0
  259. package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
  260. package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
  261. package/src/plugins/defaults/advisor/consult.ts +110 -6
  262. package/src/plugins/defaults/advisor/context-pack.ts +288 -0
  263. package/src/plugins/defaults/advisor/steering.ts +14 -2
  264. package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
  265. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +47 -7
  266. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +10 -11
  267. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +12 -20
  268. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +42 -11
  269. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
  270. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
  271. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +29 -1
  272. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
  273. package/src/plugins/mtime-cache.ts +7 -2
  274. package/src/plugins/types.ts +0 -2
  275. package/src/providers/anthropic/client.ts +5 -0
  276. package/src/providers/call-site-routing.ts +4 -0
  277. package/src/providers/model-catalog.ts +16 -0
  278. package/src/providers/openai/responses-provider.ts +5 -0
  279. package/src/providers/openrouter/client.ts +5 -0
  280. package/src/providers/provider-send-message.ts +4 -0
  281. package/src/providers/ratelimit.ts +4 -0
  282. package/src/providers/retry.ts +4 -0
  283. package/src/providers/types.ts +9 -0
  284. package/src/providers/usage-tracking.ts +4 -0
  285. package/src/runtime/__tests__/channel-verification-service.test.ts +133 -0
  286. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
  287. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +66 -0
  288. package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
  289. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +335 -3
  290. package/src/runtime/access-request-helper.ts +19 -39
  291. package/src/runtime/actor-trust-resolver.ts +2 -2
  292. package/src/runtime/anchored-guardian.test.ts +156 -0
  293. package/src/runtime/anchored-guardian.ts +135 -0
  294. package/src/runtime/assistant-event-hub.ts +1 -1
  295. package/src/runtime/assistant-stream-state.ts +9 -2
  296. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
  297. package/src/runtime/auth/require-bound-guardian.ts +21 -11
  298. package/src/runtime/channel-verification-service.ts +56 -31
  299. package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
  300. package/src/runtime/guardian-vellum-migration.ts +66 -7
  301. package/src/runtime/invite-redemption-service.ts +50 -18
  302. package/src/runtime/local-actor-identity.ts +76 -11
  303. package/src/runtime/local-principal-trust.ts +52 -0
  304. package/src/runtime/pending-interactions.ts +11 -1
  305. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +56 -5
  306. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
  307. package/src/runtime/routes/__tests__/contact-routes.test.ts +212 -0
  308. package/src/runtime/routes/__tests__/global-search-routes.test.ts +93 -0
  309. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +215 -1
  310. package/src/runtime/routes/browser-routes.ts +1 -1
  311. package/src/runtime/routes/channel-verification-routes.ts +3 -3
  312. package/src/runtime/routes/contact-routes.ts +8 -32
  313. package/src/runtime/routes/conversation-cli-routes.ts +4 -5
  314. package/src/runtime/routes/conversation-list-routes.ts +4 -7
  315. package/src/runtime/routes/conversation-routes.ts +74 -81
  316. package/src/runtime/routes/events-routes.ts +2 -2
  317. package/src/runtime/routes/global-search-routes.ts +3 -1
  318. package/src/runtime/routes/guardian-action-routes.ts +4 -5
  319. package/src/runtime/routes/host-app-control-routes.ts +5 -4
  320. package/src/runtime/routes/host-bash-routes.ts +5 -4
  321. package/src/runtime/routes/host-browser-routes.ts +9 -11
  322. package/src/runtime/routes/host-cu-routes.ts +5 -4
  323. package/src/runtime/routes/host-file-routes.ts +5 -4
  324. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  325. package/src/runtime/routes/http-adapter.ts +1 -1
  326. package/src/runtime/routes/identity-routes.ts +3 -2
  327. package/src/runtime/routes/inbound-message-handler.ts +5 -5
  328. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +97 -5
  329. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +61 -49
  330. package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
  331. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
  332. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
  333. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
  334. package/src/runtime/routes/index.ts +2 -0
  335. package/src/runtime/routes/llm-context-normalization.ts +71 -0
  336. package/src/runtime/routes/mcp-auth-routes.ts +38 -15
  337. package/src/runtime/routes/migration-rollback-routes.ts +4 -3
  338. package/src/runtime/routes/migration-routes.ts +4 -1
  339. package/src/runtime/routes/onboarding-checkin-routes.ts +86 -0
  340. package/src/runtime/routes/subagents-routes.ts +5 -0
  341. package/src/runtime/routes/surface-action-routes.ts +51 -55
  342. package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -0
  343. package/src/runtime/services/conversation-serializer.ts +7 -9
  344. package/src/runtime/tool-grant-request-helper.ts +3 -3
  345. package/src/runtime/trust-verdict-consumer.ts +85 -9
  346. package/src/runtime/verification-outbound-actions.ts +18 -18
  347. package/src/signals/user-message.ts +16 -0
  348. package/src/subagent/manager.ts +9 -0
  349. package/src/telemetry/types.ts +34 -1
  350. package/src/telemetry/usage-telemetry-reporter.test.ts +3 -2
  351. package/src/telemetry/usage-telemetry-reporter.ts +87 -3
  352. package/src/tools/ask-question/ask-question-tool.test.ts +29 -0
  353. package/src/tools/ask-question/ask-question-tool.ts +13 -0
  354. package/src/tools/computer-use/definitions.ts +8 -2
  355. package/src/tools/executor.ts +4 -4
  356. package/src/tools/registry.ts +18 -0
  357. package/src/tools/tool-approval-handler.ts +1 -1
  358. package/src/tools/tool-defaults.ts +9 -2
  359. package/src/tools/types.ts +17 -2
  360. package/src/tools/workspace-tools/loader.ts +348 -244
  361. package/src/util/platform.ts +5 -0
  362. package/src/util/telemetry-db-path.ts +24 -0
  363. package/src/workspace/migrations/017-seed-persona-dirs.ts +3 -34
  364. package/src/workspace/migrations/019-scope-journal-to-guardian.ts +3 -24
  365. package/src/__tests__/workspace-tools-watcher-flag.test.ts +0 -70
  366. package/src/daemon/workspace-tools-watcher.ts +0 -328
  367. package/src/memory/migrations/registry.ts +0 -573
@@ -109,10 +109,9 @@ export function registerMcpCommand(program: Command): void {
109
109
  transport: "ipc",
110
110
  description: "Manage MCP (Model Context Protocol) servers",
111
111
  build: (mcp) => {
112
-
113
- mcp.addHelpText(
114
- "after",
115
- `
112
+ mcp.addHelpText(
113
+ "after",
114
+ `
116
115
  MCP servers extend the assistant's capabilities with external tools. Servers
117
116
  are configured in the assistant's config.json under the mcp.servers key. Each
118
117
  server uses one of three transport types:
@@ -129,15 +128,15 @@ Examples:
129
128
  $ assistant mcp add my-server -t stdio -c npx -a my-mcp-server
130
129
  $ assistant mcp auth my-server
131
130
  $ assistant mcp remove my-server`,
132
- );
133
-
134
- mcp
135
- .command("list")
136
- .description("List configured MCP servers and their status")
137
- .option("--json", "Output as JSON")
138
- .addHelpText(
139
- "after",
140
- `
131
+ );
132
+
133
+ mcp
134
+ .command("list")
135
+ .description("List configured MCP servers and their status")
136
+ .option("--json", "Output as JSON")
137
+ .addHelpText(
138
+ "after",
139
+ `
141
140
  Shows each configured MCP server with its current status and configuration:
142
141
 
143
142
  Name The server identifier used in config.json
@@ -157,49 +156,49 @@ list including health status.
157
156
  Examples:
158
157
  $ assistant mcp list
159
158
  $ assistant mcp list --json`,
160
- )
161
- .action(async (opts: { json?: boolean }) => {
162
- const result = await cliIpcCall<{ servers: McpServerEntry[] }>(
163
- "internal_mcp_list",
164
- );
159
+ )
160
+ .action(async (opts: { json?: boolean }) => {
161
+ const result = await cliIpcCall<{ servers: McpServerEntry[] }>(
162
+ "internal_mcp_list",
163
+ );
165
164
 
166
- if (!result.ok) {
167
- return exitFromIpcResult({
168
- ok: false,
169
- error: result.error,
170
- statusCode: result.statusCode,
165
+ if (!result.ok) {
166
+ return exitFromIpcResult({
167
+ ok: false,
168
+ error: result.error,
169
+ statusCode: result.statusCode,
170
+ });
171
+ }
172
+
173
+ const servers = result.result?.servers ?? [];
174
+
175
+ if (servers.length === 0) {
176
+ if (opts.json) {
177
+ process.stdout.write(JSON.stringify([], null, 2) + "\n");
178
+ } else {
179
+ log.info("No MCP servers configured.");
180
+ }
181
+ return;
182
+ }
183
+
184
+ if (opts.json) {
185
+ process.stdout.write(JSON.stringify(servers, null, 2) + "\n");
186
+ return;
187
+ }
188
+
189
+ log.info(`${servers.length} MCP server(s) configured:\n`);
190
+
191
+ for (const entry of servers) {
192
+ printServerEntry(entry);
193
+ }
171
194
  });
172
- }
173
-
174
- const servers = result.result?.servers ?? [];
175
-
176
- if (servers.length === 0) {
177
- if (opts.json) {
178
- process.stdout.write(JSON.stringify([], null, 2) + "\n");
179
- } else {
180
- log.info("No MCP servers configured.");
181
- }
182
- return;
183
- }
184
-
185
- if (opts.json) {
186
- process.stdout.write(JSON.stringify(servers, null, 2) + "\n");
187
- return;
188
- }
189
-
190
- log.info(`${servers.length} MCP server(s) configured:\n`);
191
-
192
- for (const entry of servers) {
193
- printServerEntry(entry);
194
- }
195
- });
196
-
197
- mcp
198
- .command("reload")
199
- .description("Reload MCP server connections in the running assistant")
200
- .addHelpText(
201
- "after",
202
- `
195
+
196
+ mcp
197
+ .command("reload")
198
+ .description("Reload MCP server connections in the running assistant")
199
+ .addHelpText(
200
+ "after",
201
+ `
203
202
  Signals the running assistant to disconnect and reconnect all MCP servers
204
203
  using the current configuration from disk. Active sessions pick up new tools
205
204
  on their next turn automatically. The assistant must be running.
@@ -208,40 +207,49 @@ Examples:
208
207
  $ vellum mcp reload
209
208
  $ vellum mcp reload # after editing config.json to add a new server
210
209
  $ vellum mcp reload # after running "vellum mcp auth <server>"`,
211
- )
212
- .action(async () => {
213
- const result = await cliIpcCall("internal_mcp_reload", { body: {} });
214
- if (!result.ok) {
215
- log.warn(
216
- `Could not signal reload: ${result.error}. ` +
217
- `Run 'assistant mcp reload' once the assistant is up.`,
218
- );
219
- } else {
220
- log.info(
221
- "MCP reload signal sent. The running assistant will reconnect servers shortly.",
222
- );
223
- }
224
- });
225
-
226
- mcp
227
- .command("add <name>")
228
- .description("Add an MCP server configuration")
229
- .requiredOption(
230
- "-t, --transport-type <type>",
231
- "Transport type: stdio, sse, or streamable-http",
232
- )
233
- .option("-u, --url <url>", "Server URL (for sse/streamable-http)")
234
- .option("-c, --command <cmd>", "Command to run (for stdio)")
235
- .option("-a, --args <args...>", "Command arguments (for stdio)")
236
- .option(
237
- "-r, --risk <level>",
238
- "Default risk level: low, medium, or high",
239
- "high",
240
- )
241
- .option("--disabled", "Add as disabled")
242
- .addHelpText(
243
- "after",
244
- `
210
+ )
211
+ .action(async () => {
212
+ const result = await cliIpcCall("internal_mcp_reload", { body: {} });
213
+ if (!result.ok) {
214
+ log.warn(
215
+ `Could not signal reload: ${result.error}. ` +
216
+ `Run 'assistant mcp reload' once the assistant is up.`,
217
+ );
218
+ } else {
219
+ log.info(
220
+ "MCP reload signal sent. The running assistant will reconnect servers shortly.",
221
+ );
222
+ }
223
+ });
224
+
225
+ mcp
226
+ .command("add <name>")
227
+ .description("Add an MCP server configuration")
228
+ .requiredOption(
229
+ "-t, --transport-type <type>",
230
+ "Transport type: stdio, sse, or streamable-http",
231
+ )
232
+ .option("-u, --url <url>", "Server URL (for sse/streamable-http)")
233
+ .option("-c, --command <cmd>", "Command to run (for stdio)")
234
+ .option("-a, --args <args...>", "Command arguments (for stdio)")
235
+ .option(
236
+ "-r, --risk <level>",
237
+ "Default risk level: low, medium, or high",
238
+ "high",
239
+ )
240
+ .option(
241
+ "-H, --header <key:value>",
242
+ "Custom HTTP header (repeatable, for sse/streamable-http). E.g. -H 'Authorization: Bearer tok123'",
243
+ (val: string, acc: string[]) => {
244
+ acc.push(val);
245
+ return acc;
246
+ },
247
+ [] as string[],
248
+ )
249
+ .option("--disabled", "Add as disabled")
250
+ .addHelpText(
251
+ "after",
252
+ `
245
253
  Arguments:
246
254
  name Unique identifier for the server (used as the key in config.json)
247
255
 
@@ -254,58 +262,84 @@ The --risk flag sets the default risk level for all tools from this server
254
262
  (defaults to "high" if not specified). The server starts enabled unless
255
263
  --disabled is passed.
256
264
 
265
+ The --header (-H) flag adds custom HTTP headers to sse/streamable-http
266
+ transports. Use it for Bearer Token or API Key authentication. The flag
267
+ is repeatable — pass multiple -H flags for multiple headers.
268
+
257
269
  If a server with the same name already exists, the command fails. Remove the
258
270
  existing server first with "assistant mcp remove <name>".
259
271
 
260
272
  Examples:
261
273
  $ assistant mcp add my-server -t stdio -c npx -a my-mcp-server
262
274
  $ assistant mcp add remote-api -t streamable-http -u https://api.example.com/mcp -r medium
263
- $ assistant mcp add legacy-sse -t sse -u https://old.example.com/events --disabled`,
264
- )
265
- .action(
266
- async (
267
- name: string,
268
- opts: {
269
- transportType: string;
270
- url?: string;
271
- command?: string;
272
- args?: string[];
273
- risk: string;
274
- disabled?: boolean;
275
- },
276
- ) => {
277
- const result = await cliIpcCall<{ added: true }>(
278
- "internal_mcp_add",
279
- {
280
- body: {
281
- name,
282
- transportType: opts.transportType,
283
- url: opts.url,
284
- command: opts.command,
285
- args: opts.args,
286
- risk: opts.risk,
287
- disabled: opts.disabled,
275
+ $ assistant mcp add legacy-sse -t sse -u https://old.example.com/events --disabled
276
+ $ assistant mcp add authed-api -t sse -u https://api.example.com/mcp -H 'Authorization: Bearer tok123'
277
+ $ assistant mcp add apikey-srv -t streamable-http -u https://srv.example.com/mcp -H 'X-API-Key: sk_live_abc'`,
278
+ )
279
+ .action(
280
+ async (
281
+ name: string,
282
+ opts: {
283
+ transportType: string;
284
+ url?: string;
285
+ command?: string;
286
+ args?: string[];
287
+ risk: string;
288
+ header: string[];
289
+ disabled?: boolean;
288
290
  },
291
+ ) => {
292
+ let headers: Record<string, string> | undefined;
293
+ if (opts.header.length > 0) {
294
+ headers = {};
295
+ for (const h of opts.header) {
296
+ const colonIdx = h.indexOf(":");
297
+ if (colonIdx === -1) {
298
+ log.error(
299
+ `Invalid header format: "${h}". Expected "Key: Value".`,
300
+ );
301
+ process.exitCode = 1;
302
+ return;
303
+ }
304
+ headers[h.slice(0, colonIdx).trim()] = h
305
+ .slice(colonIdx + 1)
306
+ .trim();
307
+ }
308
+ }
309
+
310
+ const result = await cliIpcCall<{ added: true }>(
311
+ "internal_mcp_add",
312
+ {
313
+ body: {
314
+ name,
315
+ transportType: opts.transportType,
316
+ url: opts.url,
317
+ command: opts.command,
318
+ args: opts.args,
319
+ risk: opts.risk,
320
+ disabled: opts.disabled,
321
+ headers,
322
+ },
323
+ },
324
+ );
325
+
326
+ if (!result.ok) {
327
+ log.error(result.error ?? "Failed to add MCP server");
328
+ process.exitCode = 1;
329
+ return;
330
+ }
331
+
332
+ log.info(`Added MCP server "${name}" (${opts.transportType})`);
333
+ log.info("The running assistant is reloading MCP servers now.");
289
334
  },
290
335
  );
291
336
 
292
- if (!result.ok) {
293
- log.error(result.error ?? "Failed to add MCP server");
294
- process.exitCode = 1;
295
- return;
296
- }
297
-
298
- log.info(`Added MCP server "${name}" (${opts.transportType})`);
299
- log.info("The running assistant is reloading MCP servers now.");
300
- },
301
- );
302
-
303
- mcp
304
- .command("auth <name>")
305
- .description("Authenticate with an MCP server via OAuth")
306
- .addHelpText(
307
- "after",
308
- `
337
+ mcp
338
+ .command("auth <name>")
339
+ .description("Authenticate with an MCP server via OAuth")
340
+ .addHelpText(
341
+ "after",
342
+ `
309
343
  Arguments:
310
344
  name Name of a configured MCP server to authenticate with
311
345
 
@@ -324,79 +358,79 @@ automatically. You can also run 'vellum mcp reload' to apply immediately.
324
358
  Examples:
325
359
  $ assistant mcp auth my-server
326
360
  $ assistant mcp auth remote-api`,
327
- )
328
- .action(async (name: string) => {
329
- // IPC-first path — attempt daemon-orchestrated flow (works on hosted assistants)
330
- const startResult = await cliIpcCall<{
331
- auth_url: string;
332
- state: string;
333
- already_authenticated?: boolean;
334
- }>("internal_mcp_auth_start", { body: { serverId: name } });
335
-
336
- if (startResult.ok && startResult.result?.already_authenticated) {
337
- log.info(`Server "${name}" is already authenticated.`);
338
- process.exit(0);
339
- return;
340
- }
341
-
342
- if (startResult.ok && startResult.result?.auth_url) {
343
- const authUrl = startResult.result.auth_url;
344
- log.info(`Opening browser for "${name}" OAuth authorization...`);
345
- openInHostBrowser(authUrl);
346
- log.info(`If the browser did not open, visit:\n${authUrl}`);
347
- log.info(
348
- "Waiting for authorization in browser... (press Ctrl+C to cancel)",
349
- );
350
-
351
- const finalStatus = await pollMcpAuthStatus(name, {
352
- intervalMs: 2_000,
353
- timeoutMs: 150_000, // matches existing OAUTH_TIMEOUT_MS
361
+ )
362
+ .action(async (name: string) => {
363
+ // IPC-first path — attempt daemon-orchestrated flow (works on hosted assistants)
364
+ const startResult = await cliIpcCall<{
365
+ auth_url: string;
366
+ state: string;
367
+ already_authenticated?: boolean;
368
+ }>("internal_mcp_auth_start", { body: { serverId: name } });
369
+
370
+ if (startResult.ok && startResult.result?.already_authenticated) {
371
+ log.info(`Server "${name}" is already authenticated.`);
372
+ process.exit(0);
373
+ return;
374
+ }
375
+
376
+ if (startResult.ok && startResult.result?.auth_url) {
377
+ const authUrl = startResult.result.auth_url;
378
+ log.info(`Opening browser for "${name}" OAuth authorization...`);
379
+ openInHostBrowser(authUrl);
380
+ log.info(`If the browser did not open, visit:\n${authUrl}`);
381
+ log.info(
382
+ "Waiting for authorization in browser... (press Ctrl+C to cancel)",
383
+ );
384
+
385
+ const finalStatus = await pollMcpAuthStatus(name, {
386
+ intervalMs: 2_000,
387
+ timeoutMs: 150_000, // matches existing OAUTH_TIMEOUT_MS
388
+ });
389
+
390
+ if (finalStatus.status === "complete") {
391
+ log.info(`Authentication successful for "${name}".`);
392
+ log.info(
393
+ "The running assistant has picked up this change automatically.",
394
+ );
395
+ process.exit(0);
396
+ return;
397
+ }
398
+
399
+ const errMsg = finalStatus.error ?? "Unknown error";
400
+ if (errMsg.includes("denied") || errMsg.includes("cancelled")) {
401
+ log.error(`Authorization cancelled for "${name}".`);
402
+ } else if (errMsg.includes("timed out")) {
403
+ log.error(
404
+ `Authorization timed out for "${name}". Try again with: assistant mcp auth ${name}`,
405
+ );
406
+ } else {
407
+ log.error(`OAuth failed for "${name}": ${errMsg}`);
408
+ }
409
+ process.exitCode = 1;
410
+ return;
411
+ }
412
+
413
+ // Any !startResult.ok case: surface error and exit 1
414
+ const ipcErrMsg = startResult.error ?? "Unknown error";
415
+ if (
416
+ ipcErrMsg.startsWith("Could not connect to assistant daemon") ||
417
+ ipcErrMsg.startsWith("Unknown method:")
418
+ ) {
419
+ log.error(
420
+ `MCP OAuth requires the assistant to be running. Is it running?`,
421
+ );
422
+ } else {
423
+ log.error(`MCP OAuth failed via assistant: ${ipcErrMsg}`);
424
+ }
425
+ process.exitCode = 1;
354
426
  });
355
427
 
356
- if (finalStatus.status === "complete") {
357
- log.info(`Authentication successful for "${name}".`);
358
- log.info(
359
- "The running assistant has picked up this change automatically.",
360
- );
361
- process.exit(0);
362
- return;
363
- }
364
-
365
- const errMsg = finalStatus.error ?? "Unknown error";
366
- if (errMsg.includes("denied") || errMsg.includes("cancelled")) {
367
- log.error(`Authorization cancelled for "${name}".`);
368
- } else if (errMsg.includes("timed out")) {
369
- log.error(
370
- `Authorization timed out for "${name}". Try again with: assistant mcp auth ${name}`,
371
- );
372
- } else {
373
- log.error(`OAuth failed for "${name}": ${errMsg}`);
374
- }
375
- process.exitCode = 1;
376
- return;
377
- }
378
-
379
- // Any !startResult.ok case: surface error and exit 1
380
- const ipcErrMsg = startResult.error ?? "Unknown error";
381
- if (
382
- ipcErrMsg.startsWith("Could not connect to assistant daemon") ||
383
- ipcErrMsg.startsWith("Unknown method:")
384
- ) {
385
- log.error(
386
- `MCP OAuth requires the assistant to be running. Is it running?`,
387
- );
388
- } else {
389
- log.error(`MCP OAuth failed via assistant: ${ipcErrMsg}`);
390
- }
391
- process.exitCode = 1;
392
- });
393
-
394
- mcp
395
- .command("remove <name>")
396
- .description("Remove an MCP server configuration")
397
- .addHelpText(
398
- "after",
399
- `
428
+ mcp
429
+ .command("remove <name>")
430
+ .description("Remove an MCP server configuration")
431
+ .addHelpText(
432
+ "after",
433
+ `
400
434
  Arguments:
401
435
  name Name of the MCP server to remove
402
436
 
@@ -411,25 +445,25 @@ can also run 'vellum mcp reload' to apply immediately.
411
445
  Examples:
412
446
  $ assistant mcp remove my-server
413
447
  $ assistant mcp remove legacy-sse`,
414
- )
415
- .action(async (name: string) => {
416
- const result = await cliIpcCall<{ removed: true }>(
417
- "internal_mcp_remove",
418
- { body: { name } },
419
- );
448
+ )
449
+ .action(async (name: string) => {
450
+ const result = await cliIpcCall<{ removed: true }>(
451
+ "internal_mcp_remove",
452
+ { body: { name } },
453
+ );
420
454
 
421
- if (!result.ok) {
422
- log.error(result.error ?? `Failed to remove MCP server "${name}".`);
423
- process.exitCode = 1;
424
- return;
425
- }
455
+ if (!result.ok) {
456
+ log.error(result.error ?? `Failed to remove MCP server "${name}".`);
457
+ process.exitCode = 1;
458
+ return;
459
+ }
426
460
 
427
- log.info(`Removed MCP server "${name}".`);
428
- log.info(
429
- "The running assistant will pick up this change automatically. " +
430
- "Or run 'vellum mcp reload' to apply now.",
431
- );
432
- });
461
+ log.info(`Removed MCP server "${name}".`);
462
+ log.info(
463
+ "The running assistant will pick up this change automatically. " +
464
+ "Or run 'vellum mcp reload' to apply now.",
465
+ );
466
+ });
433
467
  },
434
468
  });
435
469
  }