@vellumai/assistant 0.8.5 → 0.8.6

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 (544) hide show
  1. package/AGENTS.md +33 -1
  2. package/ARCHITECTURE.md +1 -1
  3. package/bunfig.toml +6 -1
  4. package/docs/credential-execution-service.md +6 -6
  5. package/docs/plugins.md +4 -3
  6. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
  7. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
  8. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
  9. package/openapi.yaml +1900 -166
  10. package/package.json +1 -1
  11. package/src/__tests__/actor-token-service.test.ts +3 -2
  12. package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
  13. package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
  14. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
  15. package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
  16. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  17. package/src/__tests__/annotate-risk-options.test.ts +1 -0
  18. package/src/__tests__/approval-cascade.test.ts +1 -0
  19. package/src/__tests__/approval-routes-http.test.ts +9 -13
  20. package/src/__tests__/assert-not-live-db.ts +79 -0
  21. package/src/__tests__/assistant-feature-flags-integration.test.ts +9 -25
  22. package/src/__tests__/audit-log-rotation.test.ts +2 -2
  23. package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
  24. package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
  25. package/src/__tests__/browser-skill-endstate.test.ts +3 -3
  26. package/src/__tests__/btw-routes.test.ts +3 -2
  27. package/src/__tests__/call-controller.test.ts +3 -2
  28. package/src/__tests__/channel-approval-routes.test.ts +3 -2
  29. package/src/__tests__/channel-guardian.test.ts +3 -2
  30. package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
  31. package/src/__tests__/channel-reply-delivery.test.ts +35 -0
  32. package/src/__tests__/channel-retry-sweep.test.ts +320 -3
  33. package/src/__tests__/checker.test.ts +12 -12
  34. package/src/__tests__/compaction-events.test.ts +1 -0
  35. package/src/__tests__/compaction-trail-store.test.ts +264 -0
  36. package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
  37. package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
  38. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
  39. package/src/__tests__/computer-use-tools.test.ts +12 -14
  40. package/src/__tests__/config-loader-backfill.test.ts +13 -28
  41. package/src/__tests__/config-loader-corrupt.test.ts +5 -5
  42. package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
  43. package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
  44. package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
  45. package/src/__tests__/config-schema.test.ts +10 -10
  46. package/src/__tests__/connection-model-compat.test.ts +83 -0
  47. package/src/__tests__/contacts-tools.test.ts +3 -2
  48. package/src/__tests__/context-token-estimator.test.ts +22 -0
  49. package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
  50. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -0
  51. package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
  52. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
  53. package/src/__tests__/conversation-agent-loop-overflow.test.ts +34 -0
  54. package/src/__tests__/conversation-agent-loop.test.ts +488 -2
  55. package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
  56. package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
  57. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
  58. package/src/__tests__/conversation-attention-store.test.ts +101 -0
  59. package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
  60. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
  61. package/src/__tests__/conversation-error.test.ts +30 -0
  62. package/src/__tests__/conversation-fork-crud.test.ts +69 -8
  63. package/src/__tests__/conversation-fork-route.test.ts +3 -2
  64. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  65. package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
  66. package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
  67. package/src/__tests__/conversation-lifecycle.test.ts +1 -0
  68. package/src/__tests__/conversation-list-source.test.ts +3 -2
  69. package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
  70. package/src/__tests__/conversation-load-history-stripped.test.ts +1 -0
  71. package/src/__tests__/conversation-pairing.test.ts +53 -0
  72. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
  73. package/src/__tests__/conversation-process-callsite.test.ts +1 -0
  74. package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -0
  75. package/src/__tests__/conversation-queue.test.ts +333 -291
  76. package/src/__tests__/conversation-routes-disk-view.test.ts +3 -18
  77. package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
  78. package/src/__tests__/conversation-routes-slash-commands.test.ts +33 -2
  79. package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
  80. package/src/__tests__/conversation-skill-tools.test.ts +38 -142
  81. package/src/__tests__/conversation-slash-queue.test.ts +84 -32
  82. package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
  83. package/src/__tests__/conversation-speed-override.test.ts +1 -0
  84. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
  85. package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
  86. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
  87. package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
  88. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
  89. package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
  90. package/src/__tests__/conversation-sync-tags.test.ts +128 -12
  91. package/src/__tests__/conversation-title-service.test.ts +1 -0
  92. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
  93. package/src/__tests__/conversation-usage.test.ts +1 -0
  94. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
  95. package/src/__tests__/conversation-workspace-injection.test.ts +5 -0
  96. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -0
  97. package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
  98. package/src/__tests__/credential-broker-server-use.test.ts +5 -5
  99. package/src/__tests__/credential-execution-client.test.ts +72 -1
  100. package/src/__tests__/credential-execution-feature-gates.test.ts +10 -12
  101. package/src/__tests__/credential-health-service.test.ts +252 -3
  102. package/src/__tests__/credential-security-invariants.test.ts +5 -5
  103. package/src/__tests__/credential-vault-unit.test.ts +19 -19
  104. package/src/__tests__/credential-vault.test.ts +5 -5
  105. package/src/__tests__/cross-provider-web-search.test.ts +56 -2
  106. package/src/__tests__/db-connection-isolation.test.ts +7 -6
  107. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
  108. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
  109. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
  110. package/src/__tests__/db-test-helpers.ts +58 -0
  111. package/src/__tests__/disk-pressure-guard.test.ts +58 -41
  112. package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
  113. package/src/__tests__/disk-pressure-routes.test.ts +0 -33
  114. package/src/__tests__/disk-pressure-tools.test.ts +0 -4
  115. package/src/__tests__/dm-persistence.test.ts +26 -40
  116. package/src/__tests__/document-create-dedupe.test.ts +189 -0
  117. package/src/__tests__/document-find-replace.test.ts +3 -2
  118. package/src/__tests__/document-tool-security.test.ts +81 -2
  119. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
  120. package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
  121. package/src/__tests__/encrypted-store.test.ts +11 -9
  122. package/src/__tests__/feature-flag-test-helpers.ts +53 -0
  123. package/src/__tests__/filing-service.test.ts +1 -0
  124. package/src/__tests__/first-greeting.test.ts +62 -12
  125. package/src/__tests__/gateway-flag-listener.test.ts +0 -1
  126. package/src/__tests__/gemini-provider.test.ts +26 -0
  127. package/src/__tests__/guardian-action-sweep.test.ts +3 -2
  128. package/src/__tests__/guardian-outbound-http.test.ts +3 -2
  129. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
  130. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -0
  131. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  132. package/src/__tests__/heartbeat-service.test.ts +1 -0
  133. package/src/__tests__/helpers/mock-logger.ts +26 -0
  134. package/src/__tests__/host-bash-routes.test.ts +1 -0
  135. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
  136. package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
  137. package/src/__tests__/host-shell-tool.test.ts +5 -4
  138. package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
  139. package/src/__tests__/http-conversation-lineage.test.ts +3 -2
  140. package/src/__tests__/http-user-message-parity.test.ts +29 -7
  141. package/src/__tests__/identity-intro-cache.test.ts +133 -22
  142. package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
  143. package/src/__tests__/inference-profile-reaper.test.ts +3 -2
  144. package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
  145. package/src/__tests__/injector-disk-pressure.test.ts +3 -17
  146. package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
  147. package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
  148. package/src/__tests__/llm-context-normalization.test.ts +42 -0
  149. package/src/__tests__/llm-resolver.test.ts +331 -0
  150. package/src/__tests__/llm-schema.test.ts +1 -1
  151. package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
  152. package/src/__tests__/mcp-abort-signal.test.ts +14 -0
  153. package/src/__tests__/mcp-client-auth.test.ts +14 -0
  154. package/src/__tests__/messaging-send-tool.test.ts +1 -0
  155. package/src/__tests__/migration-import-from-url.test.ts +3 -3
  156. package/src/__tests__/mock-gateway-ipc.ts +18 -2
  157. package/src/__tests__/model-intents.test.ts +3 -3
  158. package/src/__tests__/native-web-search.test.ts +30 -2
  159. package/src/__tests__/notification-deep-link.test.ts +62 -0
  160. package/src/__tests__/oauth-commands-routes.test.ts +37 -0
  161. package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
  162. package/src/__tests__/oauth-store.test.ts +3 -2
  163. package/src/__tests__/onboarding-template-contract.test.ts +3 -2
  164. package/src/__tests__/openai-provider.test.ts +8 -9
  165. package/src/__tests__/openai-responses-provider.test.ts +70 -10
  166. package/src/__tests__/openrouter-provider-only.test.ts +27 -5
  167. package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
  168. package/src/__tests__/persistence-pipeline.test.ts +139 -1
  169. package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
  170. package/src/__tests__/plugin-bootstrap.test.ts +9 -11
  171. package/src/__tests__/plugin-tool-contribution.test.ts +41 -38
  172. package/src/__tests__/process-message-background-slack.test.ts +21 -16
  173. package/src/__tests__/process-message-display-content.test.ts +19 -22
  174. package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
  175. package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
  176. package/src/__tests__/provider-registry-ollama.test.ts +45 -22
  177. package/src/__tests__/recording-handler.test.ts +1 -0
  178. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
  179. package/src/__tests__/registry.test.ts +82 -76
  180. package/src/__tests__/relay-server.test.ts +10 -10
  181. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
  182. package/src/__tests__/schedule-store.test.ts +16 -1
  183. package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
  184. package/src/__tests__/secret-ingress-http.test.ts +5 -1
  185. package/src/__tests__/secure-keys.test.ts +3 -3
  186. package/src/__tests__/send-endpoint-busy.test.ts +81 -42
  187. package/src/__tests__/server-history-render.test.ts +4 -1
  188. package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
  189. package/src/__tests__/skill-feature-flags.test.ts +14 -16
  190. package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
  191. package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
  192. package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
  193. package/src/__tests__/skill-tool-factory.test.ts +96 -95
  194. package/src/__tests__/slack-channel-config.test.ts +3 -3
  195. package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
  196. package/src/__tests__/subagent-disposal.test.ts +27 -8
  197. package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
  198. package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
  199. package/src/__tests__/subagent-manager-notify.test.ts +20 -8
  200. package/src/__tests__/subagent-notify-parent.test.ts +5 -4
  201. package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
  202. package/src/__tests__/subagent-tools.test.ts +2 -1
  203. package/src/__tests__/suggestion-routes.test.ts +1 -0
  204. package/src/__tests__/system-prompt.test.ts +38 -0
  205. package/src/__tests__/test-preload-verifier.ts +68 -0
  206. package/src/__tests__/test-preload.ts +32 -39
  207. package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
  208. package/src/__tests__/tool-executor.test.ts +55 -10
  209. package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
  210. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  211. package/src/__tests__/twilio-routes.test.ts +3 -2
  212. package/src/__tests__/validate-input.test.ts +381 -0
  213. package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
  214. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
  215. package/src/__tests__/voice-session-bridge.test.ts +37 -28
  216. package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
  217. package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
  218. package/src/acp/session-manager.ts +5 -6
  219. package/src/agent/loop.ts +80 -0
  220. package/src/api/README.md +124 -2
  221. package/src/api/constants/call-sites.ts +27 -0
  222. package/src/api/events/assistant-outbound-attachment.ts +51 -0
  223. package/src/api/events/assistant-text-delta.ts +32 -0
  224. package/src/api/events/assistant-turn-start.ts +33 -0
  225. package/src/api/events/document-comment-created.ts +48 -0
  226. package/src/api/events/document-comment-deleted.ts +24 -0
  227. package/src/api/events/document-comment-reopened.ts +25 -0
  228. package/src/api/events/document-comment-resolved.ts +27 -0
  229. package/src/api/events/generation-cancelled.ts +24 -0
  230. package/src/api/events/generation-handoff.ts +41 -0
  231. package/src/api/events/message-complete.ts +42 -0
  232. package/src/api/events/open-url.ts +30 -0
  233. package/src/{events → api/events}/relationship-state-updated.ts +3 -3
  234. package/src/api/events/tool-use-start.ts +32 -0
  235. package/src/api/index.ts +128 -3
  236. package/src/api/responses/llm-context-response.ts +39 -0
  237. package/src/api/responses/llm-request-log-entry.ts +93 -0
  238. package/src/api/responses/memory-recall-log.ts +65 -0
  239. package/src/api/responses/memory-v2-activation-log.ts +78 -0
  240. package/src/background-wake/background-wake-routes.test.ts +687 -52
  241. package/src/background-wake/platform-client.test.ts +308 -0
  242. package/src/background-wake/platform-client.ts +167 -0
  243. package/src/background-wake/publisher.ts +91 -0
  244. package/src/background-wake/runtime-registry.ts +2 -2
  245. package/src/background-wake/wake-intent-hooks.test.ts +282 -0
  246. package/src/calls/guardian-dispatch.ts +1 -0
  247. package/src/calls/voice-session-bridge.ts +4 -4
  248. package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
  249. package/src/cli/commands/__tests__/notifications.test.ts +184 -40
  250. package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
  251. package/src/cli/commands/channels/index.ts +229 -0
  252. package/src/cli/commands/memory-v3-render.ts +147 -0
  253. package/src/cli/commands/memory-v3.ts +255 -4
  254. package/src/cli/commands/notifications.ts +365 -55
  255. package/src/cli/lib/open-browser.ts +7 -2
  256. package/src/cli/program.ts +2 -0
  257. package/src/config/assistant-feature-flags.ts +23 -42
  258. package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
  259. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  260. package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
  261. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
  262. package/src/config/call-site-defaults.ts +1 -1
  263. package/src/config/feature-flag-cache.ts +86 -0
  264. package/src/config/feature-flag-registry.json +17 -17
  265. package/src/config/llm-context-resolution.ts +10 -1
  266. package/src/config/llm-resolver.ts +121 -15
  267. package/src/config/loader.ts +4 -5
  268. package/src/config/schemas/__tests__/memory-v2.test.ts +15 -0
  269. package/src/config/schemas/heartbeat.ts +1 -1
  270. package/src/config/schemas/llm.ts +90 -1
  271. package/src/config/schemas/memory-v2.ts +26 -0
  272. package/src/config/schemas/services.ts +6 -2
  273. package/src/config/seed-inference-profiles.ts +36 -16
  274. package/src/context/token-estimator.ts +10 -5
  275. package/src/credential-execution/executable-discovery.ts +40 -0
  276. package/src/credential-execution/process-manager.ts +6 -2
  277. package/src/credential-health/credential-health-service.ts +125 -40
  278. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
  279. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
  280. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -2
  281. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
  282. package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
  283. package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
  284. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
  285. package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
  286. package/src/daemon/conversation-agent-loop-handlers.ts +389 -68
  287. package/src/daemon/conversation-agent-loop.ts +132 -28
  288. package/src/daemon/conversation-error.ts +33 -5
  289. package/src/daemon/conversation-messaging.ts +84 -43
  290. package/src/daemon/conversation-process.ts +74 -37
  291. package/src/daemon/conversation-runtime-assembly.ts +29 -9
  292. package/src/daemon/conversation-skill-tools.ts +14 -30
  293. package/src/daemon/conversation-surfaces.ts +69 -34
  294. package/src/daemon/conversation-tool-setup.ts +33 -48
  295. package/src/daemon/conversation.ts +26 -46
  296. package/src/daemon/daemon-control.ts +1 -1
  297. package/src/daemon/daemon-skill-host.ts +9 -2
  298. package/src/daemon/disk-pressure-guard.ts +27 -29
  299. package/src/daemon/first-greeting.ts +31 -13
  300. package/src/daemon/handlers/shared.ts +6 -1
  301. package/src/daemon/lifecycle.ts +12 -12
  302. package/src/daemon/mcp-reload-service.ts +1 -1
  303. package/src/daemon/meet-manifest-loader.ts +10 -17
  304. package/src/daemon/message-types/conversations.ts +20 -22
  305. package/src/daemon/message-types/document-comments.ts +8 -44
  306. package/src/daemon/message-types/home.ts +2 -2
  307. package/src/daemon/message-types/integrations.ts +2 -7
  308. package/src/daemon/message-types/messages.ts +23 -38
  309. package/src/daemon/message-types/subagents.ts +6 -0
  310. package/src/daemon/process-message.ts +9 -9
  311. package/src/daemon/providers-setup.ts +1 -1
  312. package/src/daemon/server.ts +16 -0
  313. package/src/daemon/switch-inference-profile-tool.ts +13 -3
  314. package/src/daemon/tool-setup-types.ts +0 -6
  315. package/src/daemon/wake-target-adapter.ts +10 -0
  316. package/src/documents/document-store.ts +38 -0
  317. package/src/export/__tests__/transcript-formatter.test.ts +1 -0
  318. package/src/heartbeat/__tests__/heartbeat-service.test.ts +29 -0
  319. package/src/heartbeat/heartbeat-service.ts +63 -0
  320. package/src/home/__tests__/feed-writer.test.ts +161 -0
  321. package/src/home/__tests__/post-connect-feed.test.ts +1 -0
  322. package/src/home/__tests__/suggested-prompts.test.ts +55 -59
  323. package/src/home/feed-writer.ts +146 -7
  324. package/src/home/suggested-prompts.ts +27 -145
  325. package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
  326. package/src/ipc/gateway-client.test.ts +4 -1
  327. package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
  328. package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
  329. package/src/ipc/skill-routes/memory.ts +4 -3
  330. package/src/ipc/skill-routes/registries.ts +28 -29
  331. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
  332. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
  333. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
  334. package/src/memory/__tests__/memory-retrospective-job.test.ts +1 -0
  335. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
  336. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
  337. package/src/memory/conversation-attention-store.ts +17 -3
  338. package/src/memory/conversation-crud.ts +352 -112
  339. package/src/memory/db-connection.ts +29 -19
  340. package/src/memory/db-init.ts +4 -0
  341. package/src/memory/db-singleton.ts +77 -0
  342. package/src/memory/delivery-channels.ts +82 -0
  343. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
  344. package/src/memory/graph/retriever.test.ts +3 -3
  345. package/src/memory/job-handlers/embedding.test.ts +3 -2
  346. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
  347. package/src/memory/jobs-worker.ts +12 -1
  348. package/src/memory/llm-request-log-source-clickhouse.ts +80 -0
  349. package/src/memory/llm-request-log-source-local.ts +24 -0
  350. package/src/memory/llm-request-log-source.ts +31 -0
  351. package/src/memory/llm-request-log-store.ts +188 -3
  352. package/src/memory/memory-v2-activation-log-store.ts +95 -1
  353. package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
  354. package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
  355. package/src/memory/migrations/index.ts +2 -0
  356. package/src/memory/schema/conversations.ts +9 -1
  357. package/src/memory/schema/inference.ts +0 -1
  358. package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
  359. package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
  360. package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
  361. package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
  362. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
  363. package/src/memory/v2/harness/metrics.ts +5 -1
  364. package/src/memory/v2/harness/replay-input.ts +19 -3
  365. package/src/memory/v2/harness/runner.ts +6 -0
  366. package/src/memory/v2/harness/trace.ts +6 -0
  367. package/src/memory/v3/__tests__/consolidation-job.test.ts +2 -4
  368. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
  369. package/src/memory/v3/__tests__/edges.test.ts +144 -1
  370. package/src/memory/v3/__tests__/filter.test.ts +48 -0
  371. package/src/memory/v3/__tests__/gate.test.ts +96 -33
  372. package/src/memory/v3/__tests__/index-composition.test.ts +58 -0
  373. package/src/memory/v3/__tests__/loop.test.ts +250 -5
  374. package/src/memory/v3/__tests__/scouts.test.ts +49 -0
  375. package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
  376. package/src/memory/v3/__tests__/shadow-middleware.test.ts +88 -2
  377. package/src/memory/v3/__tests__/traversal.test.ts +39 -0
  378. package/src/memory/v3/__tests__/tree-walk.test.ts +77 -0
  379. package/src/memory/v3/__tests__/validate.test.ts +32 -0
  380. package/src/memory/v3/coretrieval-seed.ts +240 -0
  381. package/src/memory/v3/edges.ts +58 -21
  382. package/src/memory/v3/filter.ts +27 -22
  383. package/src/memory/v3/gate.ts +51 -36
  384. package/src/memory/v3/index-composition.ts +18 -5
  385. package/src/memory/v3/loop.ts +65 -17
  386. package/src/memory/v3/scouts.ts +15 -4
  387. package/src/memory/v3/shadow-diff.ts +287 -0
  388. package/src/memory/v3/shadow-middleware.ts +44 -2
  389. package/src/memory/v3/traversal.ts +6 -1
  390. package/src/memory/v3/tree-walk.ts +6 -1
  391. package/src/memory/v3/validate.ts +56 -33
  392. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
  393. package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
  394. package/src/notifications/adapters/slack.ts +45 -11
  395. package/src/notifications/broadcaster.ts +114 -63
  396. package/src/notifications/conversation-pairing.ts +23 -3
  397. package/src/notifications/decisions-store.ts +32 -1
  398. package/src/notifications/deliveries-store.ts +45 -0
  399. package/src/notifications/edit-notification.ts +201 -0
  400. package/src/notifications/emit-signal.ts +11 -1
  401. package/src/notifications/signal.ts +10 -0
  402. package/src/notifications/types.ts +37 -0
  403. package/src/oauth/byo-connection.test.ts +67 -3
  404. package/src/oauth/byo-connection.ts +32 -5
  405. package/src/oauth/connect-orchestrator.ts +9 -0
  406. package/src/oauth/connection-resolver.test.ts +76 -0
  407. package/src/oauth/connection-resolver.ts +49 -10
  408. package/src/oauth/manual-token-connection.ts +51 -3
  409. package/src/oauth/seed-providers.ts +3 -0
  410. package/src/permissions/approval-policy.test.ts +19 -5
  411. package/src/permissions/approval-policy.ts +14 -3
  412. package/src/permissions/checker.ts +21 -8
  413. package/src/platform/client.test.ts +24 -1
  414. package/src/platform/client.ts +8 -0
  415. package/src/platform/feature-gate.ts +15 -0
  416. package/src/plugins/defaults/injectors.ts +2 -8
  417. package/src/plugins/defaults/persistence.ts +25 -6
  418. package/src/plugins/types.ts +57 -13
  419. package/src/proactive-artifact/job.test.ts +1 -0
  420. package/src/prompts/__tests__/system-prompt.test.ts +4 -4
  421. package/src/prompts/system-prompt.ts +38 -40
  422. package/src/prompts/template-detection.ts +10 -4
  423. package/src/prompts/templates/BOOTSTRAP.md +7 -11
  424. package/src/prompts/templates/IDENTITY.md +0 -2
  425. package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
  426. package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
  427. package/src/providers/call-site-routing.ts +33 -9
  428. package/src/providers/connection-model-compat.ts +23 -0
  429. package/src/providers/connection-resolution.ts +39 -20
  430. package/src/providers/fireworks/client.ts +1 -0
  431. package/src/providers/gemini/client.ts +24 -3
  432. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
  433. package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
  434. package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
  435. package/src/providers/inference/auth.ts +0 -8
  436. package/src/providers/inference/connections.ts +3 -66
  437. package/src/providers/inference/resolve-auth.ts +2 -3
  438. package/src/providers/model-catalog.ts +35 -1
  439. package/src/providers/model-intents.ts +3 -3
  440. package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
  441. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
  442. package/src/providers/openai/chat-completions-provider.ts +110 -12
  443. package/src/providers/openai/codex-models.ts +2 -0
  444. package/src/providers/openai/responses-provider.ts +53 -53
  445. package/src/providers/openrouter/client.ts +13 -8
  446. package/src/providers/provider-send-message.ts +18 -9
  447. package/src/providers/registry.ts +48 -8
  448. package/src/providers/retry.ts +16 -4
  449. package/src/providers/search-provider-catalog.ts +17 -9
  450. package/src/providers/types.ts +9 -0
  451. package/src/runtime/__tests__/agent-wake.test.ts +1 -0
  452. package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
  453. package/src/runtime/access-request-helper.ts +1 -0
  454. package/src/runtime/auth/route-policy.ts +10 -0
  455. package/src/runtime/channel-readiness-service.ts +68 -0
  456. package/src/runtime/channel-reply-delivery.ts +23 -0
  457. package/src/runtime/channel-retry-sweep.ts +47 -14
  458. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  459. package/src/runtime/migrations/vbundle-builder.ts +3 -2
  460. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
  461. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
  462. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
  463. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
  464. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
  465. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
  466. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +51 -3
  467. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
  468. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
  469. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
  470. package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
  471. package/src/runtime/routes/acp-routes-list.test.ts +3 -0
  472. package/src/runtime/routes/app-management-routes.ts +111 -4
  473. package/src/runtime/routes/background-wake-routes.ts +188 -20
  474. package/src/runtime/routes/btw-routes.ts +4 -4
  475. package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
  476. package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
  477. package/src/runtime/routes/conversation-list-routes.ts +147 -0
  478. package/src/runtime/routes/conversation-management-routes.ts +39 -14
  479. package/src/runtime/routes/conversation-query-routes.ts +60 -10
  480. package/src/runtime/routes/conversation-routes.ts +186 -140
  481. package/src/runtime/routes/conversations-import-routes.ts +19 -6
  482. package/src/runtime/routes/documents-routes.ts +10 -1
  483. package/src/runtime/routes/group-routes.ts +11 -0
  484. package/src/runtime/routes/home-feed-routes.ts +129 -0
  485. package/src/runtime/routes/identity-intro-cache.ts +61 -16
  486. package/src/runtime/routes/identity-routes.ts +30 -9
  487. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
  488. package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
  489. package/src/runtime/routes/index.ts +2 -0
  490. package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
  491. package/src/runtime/routes/integrations/vercel.ts +15 -0
  492. package/src/runtime/routes/llm-context-normalization.ts +7 -2
  493. package/src/runtime/routes/memory-v3-routes.ts +160 -2
  494. package/src/runtime/routes/migration-routes.ts +20 -13
  495. package/src/runtime/routes/notification-routes.ts +63 -1
  496. package/src/runtime/routes/oauth-commands-routes.ts +6 -1
  497. package/src/runtime/routes/surface-action-routes.ts +1 -38
  498. package/src/runtime/routes/surface-content-routes.ts +12 -5
  499. package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
  500. package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
  501. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
  502. package/src/runtime/slack-dm-text-delivery.ts +177 -0
  503. package/src/runtime/sync/resource-sync-events.ts +1 -1
  504. package/src/runtime/tool-grant-request-helper.ts +1 -0
  505. package/src/schedule/schedule-store.ts +8 -1
  506. package/src/schedule/scheduler.ts +111 -15
  507. package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
  508. package/src/security/encrypted-store.ts +7 -16
  509. package/src/security/store-path-override.ts +61 -0
  510. package/src/signals/user-message.ts +5 -8
  511. package/src/skills/validate-input.ts +177 -0
  512. package/src/subagent/manager.ts +13 -13
  513. package/src/subagent/types.ts +6 -0
  514. package/src/tasks/tool-sanitizer.ts +2 -2
  515. package/src/tools/apps/definitions.ts +35 -21
  516. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
  517. package/src/tools/computer-use/definitions.ts +268 -266
  518. package/src/tools/document/document-tool.ts +131 -8
  519. package/src/tools/execution-target.ts +2 -5
  520. package/src/tools/executor.ts +18 -55
  521. package/src/tools/host-filesystem/edit.test.ts +1 -0
  522. package/src/tools/host-filesystem/read.test.ts +1 -0
  523. package/src/tools/host-filesystem/transfer.test.ts +31 -6
  524. package/src/tools/host-filesystem/write.test.ts +1 -0
  525. package/src/tools/mcp/mcp-tool-factory.ts +0 -2
  526. package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
  527. package/src/tools/network/__tests__/web-search.test.ts +211 -3
  528. package/src/tools/network/managed-search-proxy.ts +183 -0
  529. package/src/tools/network/web-search.ts +199 -44
  530. package/src/tools/policy-context.ts +3 -1
  531. package/src/tools/registry.ts +146 -103
  532. package/src/tools/schedule/create.ts +1 -1
  533. package/src/tools/skills/skill-tool-factory.ts +17 -36
  534. package/src/tools/subagent/spawn.ts +3 -0
  535. package/src/tools/tool-approval-handler.ts +10 -4
  536. package/src/tools/tool-name-aliases.ts +72 -14
  537. package/src/tools/types.ts +17 -15
  538. package/src/tools/ui-surface/definitions.ts +98 -86
  539. package/src/types/onboarding-context.ts +6 -0
  540. package/src/usage/attribution.ts +32 -1
  541. package/src/util/browser.ts +7 -2
  542. package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
  543. package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
  544. package/src/workspace/migrations/registry.ts +4 -0
package/src/api/README.md CHANGED
@@ -1,5 +1,127 @@
1
1
  # @vellumai/assistant-api
2
2
 
3
- Public API surface for consumers of the assistant API (web client, gateway,
4
- evals, future external clients). This directory is the **source of truth** for
3
+ Public API surface for consumers of the assistant runtime web client, gateway,
4
+ evals, future external clients. This directory is the **source of truth** for
5
5
  the wire contracts the assistant exposes: schemas, types, and pure helpers.
6
+
7
+ Internal assistant code imports the files in this directory via relative paths
8
+ (e.g. `../../api/events/open-url.js`). External consumers import the
9
+ materialized npm-style package `@vellumai/assistant-api`, regenerated into
10
+ `apps/web/node_modules/` by `apps/web/scripts/postinstall.ts`.
11
+
12
+ ## Architecture
13
+
14
+ A single discriminated-union schema, `AssistantEventSchema`, covers every event
15
+ type whose wire contract is canonical. The web parser (`event-parser.ts`) tries
16
+ this schema first; events not yet covered fall through to a hand-rolled legacy
17
+ switch. The migration goal is to drain the switch — each event moved here
18
+ shrinks the legacy surface and makes wire-shape drift a compile error.
19
+
20
+ `AssistantEvent` (re-exported alongside the schema) is `z.infer<typeof
21
+ AssistantEventSchema>`. Consumers reference this single type rather than
22
+ re-listing the individual member types: as new events migrate in, they appear
23
+ in `AssistantEvent` automatically.
24
+
25
+ ## Migration recipe
26
+
27
+ Each batch follows the same shape. Group cohesive event families (lifecycle,
28
+ streaming, document-comment, ui-surface, etc.) rather than migrating events
29
+ one at a time — the per-batch overhead is the same regardless of count.
30
+
31
+ ### 1. Add the canonical schema
32
+
33
+ One file per event under `./events/`. Each schema is `.strict()` so unknown
34
+ fields surface as `UnknownEvent` rather than silently passing through.
35
+
36
+ ```ts
37
+ // assistant/src/api/events/my-event.ts
38
+ import { z } from "zod";
39
+
40
+ export const MyEventSchema = z
41
+ .object({
42
+ type: z.literal("my_event"),
43
+ conversationId: z.string(),
44
+ // …
45
+ })
46
+ .strict();
47
+
48
+ export type MyEvent = z.infer<typeof MyEventSchema>;
49
+ ```
50
+
51
+ Add the type/schema re-export pair to `./index.ts`, alphabetically, and append
52
+ the schema to the `AssistantEventSchema` discriminated union. No other changes
53
+ to the canonical package are needed — `AssistantEvent` picks the new member
54
+ up automatically.
55
+
56
+ ### 2. Adopt the canonical type in daemon code
57
+
58
+ In `assistant/src/daemon/message-types/<domain>.ts`, delete the local
59
+ `interface MyEvent { … }` declaration and import the canonical `MyEvent`
60
+ type from `../../api/events/my-event.js`. The domain-level
61
+ `_<Domain>ServerMessages` union alias (consumed by `message-protocol.ts`)
62
+ keeps its existing shape — it just references the canonical types now.
63
+
64
+ ### 3. Cut over web consumers
65
+
66
+ `apps/web/src/domains/chat/api/event-types.ts` no longer needs to list the
67
+ migrated event in its `AssistantEvent` union — `APIAssistantEvent` covers it.
68
+ Drop the per-event member, leaving the union to peel off legacy entries one
69
+ at a time as each event migrates.
70
+
71
+ Local handler modules (e.g. `document-comment-events.ts`) keep their handler
72
+ functions but import the wire types directly from `@vellumai/assistant-api`.
73
+ Do **not** re-export the canonical types from intermediate modules — consumers
74
+ import them straight from the canonical package.
75
+
76
+ ### 4. Delete the legacy parser cases
77
+
78
+ Remove the matching `case "my_event":` blocks from
79
+ `apps/web/src/domains/chat/api/event-parser.ts`. Any per-event helper
80
+ (`parseFooBase`, etc.) goes with them.
81
+
82
+ ### 5. Tests
83
+
84
+ Add parser tests for each migrated event covering:
85
+
86
+ - happy path with all fields
87
+ - minimal required only
88
+ - missing required field → `UnknownEvent`
89
+ - strict mode rejects an unknown extra field → `UnknownEvent`
90
+
91
+ For happy-path tests, inline the discriminator literal in both the input and
92
+ the expected object. `const data = { type: "my_event", … }` widens
93
+ `data.type` to `string`, breaking the discriminated-union match when the
94
+ result is compared with `toEqual(data)`.
95
+
96
+ Handler-level tests in the consuming domain modules typically need no change
97
+ — the canonical types are wire-compatible with the previous local interfaces.
98
+
99
+ ### 6. Local greenlight gate
100
+
101
+ Run before push, in order:
102
+
103
+ ```bash
104
+ # In apps/web — regenerate the @vellumai/assistant-api bundle
105
+ bun run scripts/postinstall.ts
106
+
107
+ # Type-check both packages
108
+ ( cd assistant && bunx tsc --noEmit )
109
+ ( cd apps/web && bunx tsc --noEmit )
110
+
111
+ # Targeted tests
112
+ ( cd apps/web && bun test src/domains/chat/api/event-parser.test.ts )
113
+
114
+ # Lint + format the touched files
115
+ bunx eslint <files>
116
+ bunx prettier --write <files>
117
+ ```
118
+
119
+ `format:check` is a distinct CI gate from `lint`; format the touched files
120
+ before push.
121
+
122
+ ## Status
123
+
124
+ The remaining legacy parser cases are tracked in the **Solve Chat SSE**
125
+ workstream (record `282e972a` in `workspace/data/apps/workstream-command-center/records/`).
126
+ Each batch lands as its own PR under the `API Events Canonical Schemas`
127
+ stream.
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Logical call-site identifiers stamped onto every `llm_request_log` row
3
+ * (column `call_site` — migration 264). The inspector branches on this
4
+ * value alone to distinguish real LLM calls (`mainAgent`,
5
+ * `compactionAgent`, …) from synthetic agent-error-message rows.
6
+ *
7
+ * The constants below are the wire contract; both backend (when writing
8
+ * a row) and frontend (when rendering one) must reference the same
9
+ * literal. Add new call sites here as new emit sites appear.
10
+ */
11
+
12
+ /**
13
+ * Marks a synthetic assistant error-message row — one the agent loop
14
+ * emitted because something went wrong (budget yield, out of funds, …)
15
+ * with no underlying LLM call. All such events cause the loop to exit,
16
+ * so a single generic bucket plus the existing `agent_loop_exit_reason`
17
+ * column is enough to discriminate which kind of error fired
18
+ * (`budget_yield_unrecovered`, future out-of-funds, etc.).
19
+ *
20
+ * Intentionally *not* a member of the backend's `LLMCallSite` enum:
21
+ * that enum binds config lookup, not the shape of the `call_site`
22
+ * column. Compaction-route filters that match
23
+ * `call_site = 'compactionAgent'` already treat this value as a
24
+ * non-compaction call, which is the desired floor-lookup behavior.
25
+ */
26
+ export const CALL_SITE_SYNTHETIC_AGENT_ERROR_MESSAGE =
27
+ "syntheticAgentErrorMessage";
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Outbound assistant attachment — the wire shape attached to
3
+ * `message_complete` and `generation_handoff` SSE events when the
4
+ * assistant turn produced files (sandbox writes, host transfers, tool
5
+ * blocks that returned binary content).
6
+ *
7
+ * Shape is the daemon's emit-time projection of `UserMessageAttachment`
8
+ * (see `assistant/src/daemon/message-types/shared.ts`): only the fields
9
+ * built in `conversation-attachments.ts::buildEmittedAttachments` plus
10
+ * fields the daemon explicitly emits to clients (`filePath` for
11
+ * recordings, per #9744) make it onto the wire. Daemon-internal fields
12
+ * not intended for clients (`extractedText`) stay on the daemon side
13
+ * and do not appear here.
14
+ *
15
+ * Canonical wire-contract source. Daemon code imports the type directly
16
+ * from this file; external consumers import via `@vellumai/assistant-api`.
17
+ */
18
+
19
+ import { z } from "zod";
20
+
21
+ export const AssistantOutboundAttachmentSchema = z
22
+ .object({
23
+ /** Storage id assigned by the daemon's attachment store; absent on
24
+ * in-memory drafts not backed by a stored row. */
25
+ id: z.string().optional(),
26
+ filename: z.string(),
27
+ mimeType: z.string(),
28
+ /** Base64-encoded file bytes. May be empty when `fileBacked` is
29
+ * true and the client should hydrate via the /content endpoint. */
30
+ data: z.string(),
31
+ sourceType: z.enum(["sandbox_file", "host_file", "tool_block"]).optional(),
32
+ /** Original file size in bytes. Present when `data` was omitted to
33
+ * keep payloads small. */
34
+ sizeBytes: z.number().optional(),
35
+ /** Base64-encoded JPEG thumbnail. Generated server-side for video
36
+ * attachments. */
37
+ thumbnailData: z.string().optional(),
38
+ /** True when the attachment is stored on disk and clients should
39
+ * hydrate via the /content endpoint instead of relying on `data`. */
40
+ fileBacked: z.boolean().optional(),
41
+ /** Local on-disk path for file-backed attachments. Used by the
42
+ * macOS client to play recordings and render thumbnails directly
43
+ * from the local file (see #9744 — eliminates the HTTP fetch +
44
+ * ffmpeg dep for video). Web clients ignore this field. */
45
+ filePath: z.string().optional(),
46
+ })
47
+ .strict();
48
+
49
+ export type AssistantOutboundAttachment = z.infer<
50
+ typeof AssistantOutboundAttachmentSchema
51
+ >;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `assistant_text_delta` SSE event.
3
+ *
4
+ * Streaming text chunk emitted by the daemon as the model produces
5
+ * assistant output. Multiple deltas accumulate into a single assistant
6
+ * message; the matching `message_complete` event marks the turn done.
7
+ *
8
+ * `messageId` is the database row id of the assistant message this
9
+ * delta belongs to — stamped from the pre-allocated turn anchor (see
10
+ * `reserveMessage` / `AssistantTurnStartEvent`). Absent on streams
11
+ * produced by older daemons that pre-date the anchor protocol, or on
12
+ * synthetic deltas (canned greetings, slash-command echoes, live-voice
13
+ * transcript injections) that don't bind to a row.
14
+ *
15
+ * Canonical wire-contract source. Daemon code imports the type directly
16
+ * from this file; external consumers import via `@vellumai/assistant-api`.
17
+ */
18
+
19
+ import { z } from "zod";
20
+
21
+ export const AssistantTextDeltaEventSchema = z
22
+ .object({
23
+ type: z.literal("assistant_text_delta"),
24
+ text: z.string(),
25
+ messageId: z.string().optional(),
26
+ conversationId: z.string().optional(),
27
+ })
28
+ .strict();
29
+
30
+ export type AssistantTextDeltaEvent = z.infer<
31
+ typeof AssistantTextDeltaEventSchema
32
+ >;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `assistant_turn_start` SSE event.
3
+ *
4
+ * Marks the start of an assistant turn — emitted once by the daemon
5
+ * *before* any `assistant_text_delta`, `tool_use_start`, or
6
+ * `assistant_thinking_delta` event for that turn. The `messageId` is the
7
+ * pre-allocated database row id (see `reserveMessage` in
8
+ * `assistant/src/memory/conversation-crud.ts`) that subsequent streaming
9
+ * events stamp on their `messageId` field. Clients use this id to
10
+ * anchor a UI bubble at turn-start instead of waiting for
11
+ * `message_complete`.
12
+ *
13
+ * Types-only addition at introduction — no daemon emit sites yet. The
14
+ * agent loop will adopt pre-allocation in a follow-up.
15
+ *
16
+ * Canonical wire-contract source. Daemon code imports the type
17
+ * directly from this file; external consumers import via
18
+ * `@vellumai/assistant-api`.
19
+ */
20
+
21
+ import { z } from "zod";
22
+
23
+ export const AssistantTurnStartEventSchema = z
24
+ .object({
25
+ type: z.literal("assistant_turn_start"),
26
+ messageId: z.string(),
27
+ conversationId: z.string().optional(),
28
+ })
29
+ .strict();
30
+
31
+ export type AssistantTurnStartEvent = z.infer<
32
+ typeof AssistantTurnStartEventSchema
33
+ >;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `document_comment_created` SSE event.
3
+ *
4
+ * Emitted when a new comment is added to a document surface — either
5
+ * authored by the user or by the assistant during a tool run. Carries
6
+ * the full comment payload so the client can render it without a
7
+ * separate fetch. Subsequent lifecycle transitions (resolve / reopen /
8
+ * delete) reference the comment by id only.
9
+ *
10
+ * Canonical wire-contract source. Daemon code imports the type directly
11
+ * from this file; external consumers import via `@vellumai/assistant-api`.
12
+ */
13
+
14
+ import { z } from "zod";
15
+
16
+ const DocumentCommentSchema = z
17
+ .object({
18
+ id: z.string(),
19
+ surfaceId: z.string(),
20
+ /** Author label — typically `"user"` or `"assistant"`. Wire is permissive `string`; clients narrow at the boundary. */
21
+ author: z.string(),
22
+ content: z.string(),
23
+ /** Character offsets into the rendered document text when the comment is anchored to a selection. */
24
+ anchorStart: z.number().optional(),
25
+ anchorEnd: z.number().optional(),
26
+ /** The selected text the comment was anchored to, for resilience to document edits. */
27
+ anchorText: z.string().optional(),
28
+ /** Set when the comment is a reply in a thread. */
29
+ parentCommentId: z.string().optional(),
30
+ /** Lifecycle state — `"open"` or `"resolved"`. Wire is permissive `string`; clients narrow at the boundary. */
31
+ status: z.string(),
32
+ createdAt: z.number(),
33
+ updatedAt: z.number(),
34
+ })
35
+ .strict();
36
+
37
+ export const DocumentCommentCreatedEventSchema = z
38
+ .object({
39
+ type: z.literal("document_comment_created"),
40
+ conversationId: z.string(),
41
+ surfaceId: z.string(),
42
+ comment: DocumentCommentSchema,
43
+ })
44
+ .strict();
45
+
46
+ export type DocumentCommentCreatedEvent = z.infer<
47
+ typeof DocumentCommentCreatedEventSchema
48
+ >;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `document_comment_deleted` SSE event.
3
+ *
4
+ * Emitted when a document comment is removed. The client drops the
5
+ * comment from local state.
6
+ *
7
+ * Canonical wire-contract source. Daemon code imports the type directly
8
+ * from this file; external consumers import via `@vellumai/assistant-api`.
9
+ */
10
+
11
+ import { z } from "zod";
12
+
13
+ export const DocumentCommentDeletedEventSchema = z
14
+ .object({
15
+ type: z.literal("document_comment_deleted"),
16
+ conversationId: z.string(),
17
+ surfaceId: z.string(),
18
+ commentId: z.string(),
19
+ })
20
+ .strict();
21
+
22
+ export type DocumentCommentDeletedEvent = z.infer<
23
+ typeof DocumentCommentDeletedEventSchema
24
+ >;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `document_comment_reopened` SSE event.
3
+ *
4
+ * Emitted when a previously-resolved document comment is reopened.
5
+ * The client clears the comment's resolved state and transitions it
6
+ * back to `"open"`.
7
+ *
8
+ * Canonical wire-contract source. Daemon code imports the type directly
9
+ * from this file; external consumers import via `@vellumai/assistant-api`.
10
+ */
11
+
12
+ import { z } from "zod";
13
+
14
+ export const DocumentCommentReopenedEventSchema = z
15
+ .object({
16
+ type: z.literal("document_comment_reopened"),
17
+ conversationId: z.string(),
18
+ surfaceId: z.string(),
19
+ commentId: z.string(),
20
+ })
21
+ .strict();
22
+
23
+ export type DocumentCommentReopenedEvent = z.infer<
24
+ typeof DocumentCommentReopenedEventSchema
25
+ >;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `document_comment_resolved` SSE event.
3
+ *
4
+ * Emitted when an existing document comment is marked resolved. The
5
+ * client transitions the comment's status to `"resolved"` and stamps
6
+ * `resolvedBy` from the wire value.
7
+ *
8
+ * Canonical wire-contract source. Daemon code imports the type directly
9
+ * from this file; external consumers import via `@vellumai/assistant-api`.
10
+ */
11
+
12
+ import { z } from "zod";
13
+
14
+ export const DocumentCommentResolvedEventSchema = z
15
+ .object({
16
+ type: z.literal("document_comment_resolved"),
17
+ conversationId: z.string(),
18
+ surfaceId: z.string(),
19
+ commentId: z.string(),
20
+ /** User or actor label that resolved the comment. */
21
+ resolvedBy: z.string(),
22
+ })
23
+ .strict();
24
+
25
+ export type DocumentCommentResolvedEvent = z.infer<
26
+ typeof DocumentCommentResolvedEventSchema
27
+ >;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `generation_cancelled` SSE event.
3
+ *
4
+ * Emitted when an assistant turn is cancelled before completion —
5
+ * user-initiated abort, queue-drain interruption, or daemon-side
6
+ * lifecycle exit. Terminal event for the turn: no further deltas or
7
+ * `message_complete` follow.
8
+ *
9
+ * Canonical wire-contract source. Daemon code imports the type directly
10
+ * from this file; external consumers import via `@vellumai/assistant-api`.
11
+ */
12
+
13
+ import { z } from "zod";
14
+
15
+ export const GenerationCancelledEventSchema = z
16
+ .object({
17
+ type: z.literal("generation_cancelled"),
18
+ conversationId: z.string().optional(),
19
+ })
20
+ .strict();
21
+
22
+ export type GenerationCancelledEvent = z.infer<
23
+ typeof GenerationCancelledEventSchema
24
+ >;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `generation_handoff` SSE event.
3
+ *
4
+ * Emitted when an assistant turn finishes and the daemon's agent loop
5
+ * yields control to the next queued user message in the same
6
+ * conversation. Functionally similar to `message_complete` — same
7
+ * attachment payload, same `messageId` semantics — but tells the
8
+ * client that another turn is about to begin without an intervening
9
+ * idle state, so the UI can keep the activity indicator on.
10
+ *
11
+ * `queuedCount` is the depth of the conversation's pending-message
12
+ * queue at handoff time (not including the just-finished turn). Used
13
+ * by the client to size queued-message UI affordances.
14
+ *
15
+ * Canonical wire-contract source. Daemon code imports the type directly
16
+ * from this file; external consumers import via `@vellumai/assistant-api`.
17
+ */
18
+
19
+ import { z } from "zod";
20
+
21
+ import { AssistantOutboundAttachmentSchema } from "./assistant-outbound-attachment.js";
22
+
23
+ export const GenerationHandoffEventSchema = z
24
+ .object({
25
+ type: z.literal("generation_handoff"),
26
+ conversationId: z.string().optional(),
27
+ /** Daemon request id of the just-finished turn — correlates with
28
+ * the request id surfaced by the inbound user message. */
29
+ requestId: z.string().optional(),
30
+ /** Depth of the pending-message queue at handoff time. */
31
+ queuedCount: z.number(),
32
+ /** Database row id of the just-finished assistant turn. */
33
+ messageId: z.string().optional(),
34
+ attachments: z.array(AssistantOutboundAttachmentSchema).optional(),
35
+ attachmentWarnings: z.array(z.string()).optional(),
36
+ })
37
+ .strict();
38
+
39
+ export type GenerationHandoffEvent = z.infer<
40
+ typeof GenerationHandoffEventSchema
41
+ >;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `message_complete` SSE event.
3
+ *
4
+ * Marks the end of an assistant turn — emitted once per turn after the
5
+ * final `assistant_text_delta` (or as the sole turn event for canned
6
+ * one-shot messages, recording-handler echoes, slash-command outputs,
7
+ * and aux notifier injections that don't stream text). Clients gate
8
+ * task-completion side effects on this event.
9
+ *
10
+ * `messageId` is the database row id of the completed assistant turn;
11
+ * shared with the `assistant_text_delta` chunks that streamed it. May
12
+ * be absent on synthetic completions that don't bind to a persisted
13
+ * row.
14
+ *
15
+ * `source` distinguishes a real main-turn completion from auxiliary
16
+ * notifier injections (call transcripts, call summaries, watch
17
+ * notifier outputs). Clients gate the task-complete sound and similar
18
+ * side effects on `source !== "aux"`. Absent is treated as `"main"`
19
+ * for backwards compatibility.
20
+ *
21
+ * Canonical wire-contract source. Daemon code imports the type directly
22
+ * from this file; external consumers import via `@vellumai/assistant-api`.
23
+ */
24
+
25
+ import { z } from "zod";
26
+
27
+ import { AssistantOutboundAttachmentSchema } from "./assistant-outbound-attachment.js";
28
+
29
+ export const MessageCompleteEventSchema = z
30
+ .object({
31
+ type: z.literal("message_complete"),
32
+ messageId: z.string().optional(),
33
+ conversationId: z.string().optional(),
34
+ source: z.enum(["main", "aux"]).optional(),
35
+ attachments: z.array(AssistantOutboundAttachmentSchema).optional(),
36
+ /** Soft warnings produced while resolving attachments (e.g. format
37
+ * conversions, size truncations). Display-only — not blocking. */
38
+ attachmentWarnings: z.array(z.string()).optional(),
39
+ })
40
+ .strict();
41
+
42
+ export type MessageCompleteEvent = z.infer<typeof MessageCompleteEventSchema>;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `open_url` SSE event.
3
+ *
4
+ * Sent by the assistant when it wants the client to open a URL — OAuth
5
+ * authorization popups, system-settings deep links, and browser hand-offs
6
+ * from tool execution. The web client routes the URL through same-origin
7
+ * detection, an OAuth popup, or `window.open`, depending on the URL shape.
8
+ *
9
+ * Canonical wire-contract source. Assistant code imports the type directly
10
+ * from this file; external consumers import via `@vellumai/assistant-api`.
11
+ *
12
+ * `conversationId` is optional: emit sites with a conversation context
13
+ * (OAuth orchestrator, conversation-scoped tools) should set it on the
14
+ * inner message; CLI signal-file broadcasts and other global flows omit
15
+ * it. The parser never grafts the envelope-level routing key onto the
16
+ * typed event — the schema is the contract.
17
+ */
18
+
19
+ import { z } from "zod";
20
+
21
+ export const OpenUrlEventSchema = z
22
+ .object({
23
+ type: z.literal("open_url"),
24
+ url: z.string().min(1),
25
+ title: z.string().optional(),
26
+ conversationId: z.string().optional(),
27
+ })
28
+ .strict();
29
+
30
+ export type OpenUrlEvent = z.infer<typeof OpenUrlEventSchema>;
@@ -13,13 +13,13 @@
13
13
 
14
14
  import { z } from "zod";
15
15
 
16
- export const RelationshipStateUpdatedSchema = z
16
+ export const RelationshipStateUpdatedEventSchema = z
17
17
  .object({
18
18
  type: z.literal("relationship_state_updated"),
19
19
  updatedAt: z.string(),
20
20
  })
21
21
  .strict();
22
22
 
23
- export type RelationshipStateUpdated = z.infer<
24
- typeof RelationshipStateUpdatedSchema
23
+ export type RelationshipStateUpdatedEvent = z.infer<
24
+ typeof RelationshipStateUpdatedEventSchema
25
25
  >;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `tool_use_start` SSE event.
3
+ *
4
+ * Emitted by the daemon's agent loop when a tool invocation begins —
5
+ * carries the tool name, the structured input the model produced, and
6
+ * correlation ids for the conversation, the message, and the tool_use
7
+ * block itself.
8
+ *
9
+ * `messageId` is the database row id of the assistant message that owns
10
+ * this tool_use block; absent on streams produced by older daemons that
11
+ * pre-date the anchor protocol. Same semantics as
12
+ * `AssistantTextDeltaEvent.messageId`.
13
+ *
14
+ * Canonical wire-contract source. Daemon code imports the type
15
+ * directly from this file; external consumers import via
16
+ * `@vellumai/assistant-api`.
17
+ */
18
+
19
+ import { z } from "zod";
20
+
21
+ export const ToolUseStartEventSchema = z
22
+ .object({
23
+ type: z.literal("tool_use_start"),
24
+ toolName: z.string(),
25
+ input: z.record(z.string(), z.unknown()),
26
+ toolUseId: z.string().optional(),
27
+ messageId: z.string().optional(),
28
+ conversationId: z.string().optional(),
29
+ })
30
+ .strict();
31
+
32
+ export type ToolUseStartEvent = z.infer<typeof ToolUseStartEventSchema>;