@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
@@ -40,11 +40,7 @@ import type { SkillRoute } from "../runtime/skill-route-registry.js";
40
40
  import { registerSkillRoute } from "../runtime/skill-route-registry.js";
41
41
  import { getRepoSkillsDir } from "../skills/catalog-install.js";
42
42
  import { registerExternalTools } from "../tools/registry.js";
43
- import type {
44
- ExecutionTarget,
45
- Tool,
46
- ToolContext,
47
- } from "../tools/types.js";
43
+ import type { ExecutionTarget, Tool, ToolContext } from "../tools/types.js";
48
44
  import { RiskLevel } from "../tools/types.js";
49
45
  import { getLogger } from "../util/logger.js";
50
46
  import { getSkillRuntimePath } from "../util/platform.js";
@@ -129,7 +125,6 @@ function serializeToolContext(context: ToolContext): Record<string, unknown> {
129
125
  function buildProxyTool(
130
126
  entry: ManifestToolEntry,
131
127
  supervisor: MeetHostSupervisor,
132
- manifestHash: string,
133
128
  ): Tool {
134
129
  const risk = coerceRiskLevel(entry.risk, entry.name);
135
130
  return {
@@ -138,12 +133,7 @@ function buildProxyTool(
138
133
  input_schema: (entry.input_schema as object) ?? {},
139
134
  category: entry.category,
140
135
  defaultRiskLevel: risk,
141
- executionMode: "proxy",
142
136
  executionTarget: "host" as ExecutionTarget,
143
- origin: "skill",
144
- ownerSkillId: MEET_SKILL_ID,
145
- ownerSkillBundled: true,
146
- ownerSkillVersionHash: manifestHash,
147
137
  execute: async (input, context) => {
148
138
  // `dispatchTool` ensures the meet-host child is up + connected
149
139
  // before sending the frame, so callers don't need a separate
@@ -318,7 +308,10 @@ export interface MeetManifestLoaderDeps {
318
308
  /** Override for the manifest path resolver. */
319
309
  manifestPath?: string;
320
310
  /** Override for {@link registerExternalTools}. */
321
- registerTools?: (provider: () => Tool[]) => void;
311
+ registerTools?: (
312
+ owner: { kind: "skill" | "plugin" | "mcp"; id: string },
313
+ provider: () => Tool[],
314
+ ) => void;
322
315
  /** Override for {@link registerSkillRoute}. */
323
316
  registerRoute?: (route: SkillRoute) => unknown;
324
317
  /** Override for {@link registerShutdownHook}. */
@@ -361,11 +354,11 @@ export async function loadMeetManifestProxies(
361
354
 
362
355
  // Tool provider resolves the full proxy list lazily so the tool manifest
363
356
  // reflects the manifest file at `initializeTools()` time — same timing
364
- // contract as the in-process skill's provider closure.
365
- registerTools(() =>
366
- manifest.tools.map((entry) =>
367
- buildProxyTool(entry, supervisor, manifest.sourceHash),
368
- ),
357
+ // contract as the in-process skill's provider closure. Owner is recorded
358
+ // up-front so `getToolOwner(name)` returns the meet-join skill id without
359
+ // the tool object having to carry it.
360
+ registerTools({ kind: "skill", id: MEET_SKILL_ID }, () =>
361
+ manifest.tools.map((entry) => buildProxyTool(entry, supervisor)),
369
362
  );
370
363
 
371
364
  for (const entry of manifest.routes) {
@@ -1,5 +1,7 @@
1
1
  // Conversation lifecycle, auth, model config, and history types.
2
2
 
3
+ import type { GenerationCancelledEvent } from "../../api/events/generation-cancelled.js";
4
+ import type { GenerationHandoffEvent } from "../../api/events/generation-handoff.js";
3
5
  import type {
4
6
  ChannelId,
5
7
  HostProxyInterfaceId,
@@ -309,26 +311,6 @@ export interface AssistantStatusMessage {
309
311
  keyFingerprint?: string;
310
312
  }
311
313
 
312
- export interface GenerationCancelled {
313
- type: "generation_cancelled";
314
- conversationId?: string;
315
- }
316
-
317
- export interface GenerationHandoff {
318
- type: "generation_handoff";
319
- conversationId: string;
320
- requestId?: string;
321
- queuedCount: number;
322
- attachments?: UserMessageAttachment[];
323
- attachmentWarnings?: string[];
324
- /**
325
- * Database ID of the completed assistant turn — the id that survives
326
- * query-time merging when a turn persists multiple assistant rows. Matches
327
- * the row the messages route returns.
328
- */
329
- messageId?: string;
330
- }
331
-
332
314
  export interface ModelInfo {
333
315
  type: "model_info";
334
316
  conversationId?: string;
@@ -456,6 +438,20 @@ export interface UsageUpdate {
456
438
  contextWindowMaxTokens?: number;
457
439
  }
458
440
 
441
+ /**
442
+ * Emitted after each LLM call with per-call token deltas and estimated cost.
443
+ * Clients accumulate these additively for live-updating usage metrics.
444
+ * This is a UI-only hint — it does not persist to DB or affect billing.
445
+ */
446
+ export interface UsageProgress {
447
+ type: "usage_progress";
448
+ conversationId: string;
449
+ inputTokens: number;
450
+ outputTokens: number;
451
+ estimatedCost: number;
452
+ model: string;
453
+ }
454
+
459
455
  export interface UsageResponse {
460
456
  type: "usage_response";
461
457
  totalInputTokens: number;
@@ -553,6 +549,7 @@ export type ConversationErrorCode =
553
549
  | "MANAGED_KEY_INVALID"
554
550
  | "CONTEXT_TOO_LARGE"
555
551
  | "BUDGET_YIELD_UNRECOVERED"
552
+ | "MAX_TOKENS_REACHED"
556
553
  | "CONVERSATION_ABORTED"
557
554
  | "CONVERSATION_PROCESSING_FAILED"
558
555
  | "DISK_SPACE_CRITICAL"
@@ -645,12 +642,13 @@ export type _ConversationsServerMessages =
645
642
  | AuthResult
646
643
  | PongMessage
647
644
  | AssistantStatusMessage
648
- | GenerationCancelled
649
- | GenerationHandoff
645
+ | GenerationCancelledEvent
646
+ | GenerationHandoffEvent
650
647
  | ModelInfo
651
648
  | HistoryResponse
652
649
  | UndoComplete
653
650
  | UsageUpdate
651
+ | UsageProgress
654
652
  | UsageResponse
655
653
  | ContextCompacted
656
654
  | CompactionCircuitOpen
@@ -1,50 +1,14 @@
1
1
  // Document comment event types (Server → Client).
2
2
 
3
- export interface DocumentCommentCreated {
4
- type: "document_comment_created";
5
- conversationId: string;
6
- surfaceId: string;
7
- comment: {
8
- id: string;
9
- surfaceId: string;
10
- author: string;
11
- content: string;
12
- anchorStart?: number;
13
- anchorEnd?: number;
14
- anchorText?: string;
15
- parentCommentId?: string;
16
- status: string;
17
- createdAt: number;
18
- updatedAt: number;
19
- };
20
- }
21
-
22
- export interface DocumentCommentResolved {
23
- type: "document_comment_resolved";
24
- conversationId: string;
25
- surfaceId: string;
26
- commentId: string;
27
- resolvedBy: string;
28
- }
29
-
30
- export interface DocumentCommentReopened {
31
- type: "document_comment_reopened";
32
- conversationId: string;
33
- surfaceId: string;
34
- commentId: string;
35
- }
36
-
37
- export interface DocumentCommentDeleted {
38
- type: "document_comment_deleted";
39
- conversationId: string;
40
- surfaceId: string;
41
- commentId: string;
42
- }
3
+ import type { DocumentCommentCreatedEvent } from "../../api/events/document-comment-created.js";
4
+ import type { DocumentCommentDeletedEvent } from "../../api/events/document-comment-deleted.js";
5
+ import type { DocumentCommentReopenedEvent } from "../../api/events/document-comment-reopened.js";
6
+ import type { DocumentCommentResolvedEvent } from "../../api/events/document-comment-resolved.js";
43
7
 
44
8
  // --- Domain-level union alias (consumed by the barrel file) ---
45
9
 
46
10
  export type _DocumentCommentsServerMessages =
47
- | DocumentCommentCreated
48
- | DocumentCommentResolved
49
- | DocumentCommentReopened
50
- | DocumentCommentDeleted;
11
+ | DocumentCommentCreatedEvent
12
+ | DocumentCommentResolvedEvent
13
+ | DocumentCommentReopenedEvent
14
+ | DocumentCommentDeletedEvent;
@@ -7,7 +7,7 @@
7
7
  * just enough metadata to invalidate a cache and trigger a refetch.
8
8
  */
9
9
 
10
- import type { RelationshipStateUpdated } from "../../events/relationship-state-updated.js";
10
+ import type { RelationshipStateUpdatedEvent } from "../../api/events/relationship-state-updated.js";
11
11
 
12
12
  /**
13
13
  * Broadcast after the daemon successfully writes a fresh home activity
@@ -25,4 +25,4 @@ export interface HomeFeedUpdated {
25
25
  newItemCount: number;
26
26
  }
27
27
 
28
- export type _HomeServerMessages = RelationshipStateUpdated | HomeFeedUpdated;
28
+ export type _HomeServerMessages = RelationshipStateUpdatedEvent | HomeFeedUpdated;
@@ -1,5 +1,6 @@
1
1
  // External service integrations: Slack, Telegram, Vercel, ingress, guardian.
2
2
 
3
+ import type { OpenUrlEvent } from "../../api/events/open-url.js";
3
4
  import type { ChannelId } from "../../channels/types.js";
4
5
 
5
6
  // === Client → Server ===
@@ -206,12 +207,6 @@ export interface OAuthConnectResultResponse {
206
207
  error?: string;
207
208
  }
208
209
 
209
- export interface OpenUrl {
210
- type: "open_url";
211
- url: string;
212
- title?: string;
213
- }
214
-
215
210
  export interface NavigateSettings {
216
211
  type: "navigate_settings";
217
212
  tab: string;
@@ -250,7 +245,7 @@ export type _IntegrationsServerMessages =
250
245
  | IntegrationListResponse
251
246
  | IntegrationConnectResult
252
247
  | OAuthConnectResultResponse
253
- | OpenUrl
248
+ | OpenUrlEvent
254
249
  | NavigateSettings
255
250
  | ShowPlatformLogin
256
251
  | PlatformDisconnected;
@@ -1,5 +1,9 @@
1
1
  // User/assistant messages, tool results, confirmations, secrets, errors, and generation lifecycle.
2
2
 
3
+ import type { AssistantTextDeltaEvent } from "../../api/events/assistant-text-delta.js";
4
+ import type { AssistantTurnStartEvent } from "../../api/events/assistant-turn-start.js";
5
+ import type { MessageCompleteEvent } from "../../api/events/message-complete.js";
6
+ import type { ToolUseStartEvent } from "../../api/events/tool-use-start.js";
3
7
  import type { ChannelId, InterfaceId } from "../../channels/types.js";
4
8
  import type { CommandIntent, UserMessageAttachment } from "./shared.js";
5
9
  import type { ToolActivityMetadata } from "./web-activity.js";
@@ -72,25 +76,13 @@ export interface UserMessageEcho {
72
76
  clientMessageId?: string;
73
77
  }
74
78
 
75
- export interface AssistantTextDelta {
76
- type: "assistant_text_delta";
77
- text: string;
78
- conversationId?: string;
79
- }
80
-
81
79
  export interface AssistantThinkingDelta {
82
80
  type: "assistant_thinking_delta";
83
81
  thinking: string;
84
82
  conversationId?: string;
85
- }
86
-
87
- export interface ToolUseStart {
88
- type: "tool_use_start";
89
- toolName: string;
90
- input: Record<string, unknown>;
91
- conversationId?: string;
92
- /** The tool_use block ID for client-side correlation. */
93
- toolUseId?: string;
83
+ /** Database ID of the assistant message this thinking delta belongs to.
84
+ * Same semantics as `AssistantTextDeltaEvent.messageId`. */
85
+ messageId?: string;
94
86
  }
95
87
 
96
88
  export interface ToolOutputChunk {
@@ -103,6 +95,9 @@ export interface ToolOutputChunk {
103
95
  subToolInput?: string;
104
96
  subToolIsError?: boolean;
105
97
  subToolId?: string;
98
+ /** Database ID of the assistant message that owns the parent tool_use
99
+ * block. Same semantics as `AssistantTextDeltaEvent.messageId`. */
100
+ messageId?: string;
106
101
  }
107
102
 
108
103
  export interface ToolUsePreviewStart {
@@ -110,6 +105,9 @@ export interface ToolUsePreviewStart {
110
105
  toolUseId: string;
111
106
  toolName: string;
112
107
  conversationId?: string;
108
+ /** Database ID of the assistant message that owns this tool_use block.
109
+ * Same semantics as `AssistantTextDeltaEvent.messageId`. */
110
+ messageId?: string;
113
111
  }
114
112
 
115
113
  export interface ToolInputDelta {
@@ -119,6 +117,9 @@ export interface ToolInputDelta {
119
117
  conversationId?: string;
120
118
  /** The tool_use block ID for client-side correlation. */
121
119
  toolUseId?: string;
120
+ /** Database ID of the assistant message that owns this tool_use block.
121
+ * Same semantics as `AssistantTextDeltaEvent.messageId`. */
122
+ messageId?: string;
122
123
  }
123
124
 
124
125
  export interface ToolResult {
@@ -140,6 +141,9 @@ export interface ToolResult {
140
141
  imageDataList?: string[];
141
142
  /** The tool_use block ID for client-side correlation. */
142
143
  toolUseId?: string;
144
+ /** Database ID of the assistant message that owns the parent tool_use
145
+ * block. Same semantics as `AssistantTextDeltaEvent.messageId`. */
146
+ messageId?: string;
143
147
  /** Risk level from the classifier ("low" | "medium" | "high" | "unknown"). */
144
148
  riskLevel?: string;
145
149
  /** Human-readable reason for the risk classification. */
@@ -299,26 +303,6 @@ export interface QuestionRequest {
299
303
  toolUseId?: string;
300
304
  }
301
305
 
302
- export interface MessageComplete {
303
- type: "message_complete";
304
- conversationId?: string;
305
- attachments?: UserMessageAttachment[];
306
- attachmentWarnings?: string[];
307
- /**
308
- * Database ID of the completed assistant turn — the id that survives
309
- * query-time merging when a turn persists multiple assistant rows. Matches
310
- * the row the messages route returns.
311
- */
312
- messageId?: string;
313
- /**
314
- * Distinguishes a real main-turn completion from auxiliary events such as
315
- * call transcripts, call summaries, and watch notifier outputs. Clients
316
- * gate turn-completion side effects (e.g. the task_complete sound) on
317
- * `source !== "aux"`. Absent is treated as main for backwards compatibility.
318
- */
319
- source?: "main" | "aux";
320
- }
321
-
322
306
  export interface ErrorMessage {
323
307
  type: "error";
324
308
  conversationId?: string;
@@ -537,9 +521,10 @@ export type _MessagesClientMessages =
537
521
 
538
522
  export type _MessagesServerMessages =
539
523
  | UserMessageEcho
540
- | AssistantTextDelta
524
+ | AssistantTurnStartEvent
525
+ | AssistantTextDeltaEvent
541
526
  | AssistantThinkingDelta
542
- | ToolUseStart
527
+ | ToolUseStartEvent
543
528
  | ToolUsePreviewStart
544
529
  | ToolOutputChunk
545
530
  | ToolInputDelta
@@ -547,7 +532,7 @@ export type _MessagesServerMessages =
547
532
  | ConfirmationRequest
548
533
  | SecretRequest
549
534
  | QuestionRequest
550
- | MessageComplete
535
+ | MessageCompleteEvent
551
536
  | ErrorMessage
552
537
  | MessageQueued
553
538
  | MessageDequeued
@@ -12,6 +12,12 @@ export interface SubagentSpawned {
12
12
  label: string;
13
13
  objective: string;
14
14
  isFork?: boolean;
15
+ /**
16
+ * Tool-use id of the `skill_execute` call that spawned this subagent. Lets
17
+ * the client anchor the inline subagent card to the exact spawn tool call,
18
+ * independent of the (reconcile-volatile) parent message id.
19
+ */
20
+ parentToolUseId?: string;
15
21
  }
16
22
 
17
23
  export interface SubagentStatusChanged {
@@ -508,13 +508,13 @@ export async function processMessage(
508
508
  const persistMetadata = options?.slackInbound
509
509
  ? { slackInbound: options.slackInbound }
510
510
  : undefined;
511
- const messageId = await conversation.persistUserMessage(
512
- resolvedContent,
511
+ const { id: messageId } = await conversation.persistUserMessage({
512
+ content: resolvedContent,
513
513
  attachments,
514
514
  requestId,
515
- persistMetadata,
516
- options?.displayContent,
517
- );
515
+ metadata: persistMetadata,
516
+ displayContent: options?.displayContent,
517
+ });
518
518
  publishConversationMessagesChanged(conversationId);
519
519
 
520
520
  if (options?.isInteractive === true) {
@@ -571,13 +571,13 @@ export async function processMessageInBackground(
571
571
  const persistMetadata = options?.slackInbound
572
572
  ? { slackInbound: options.slackInbound }
573
573
  : undefined;
574
- const messageId = await conversation.persistUserMessage(
574
+ const { id: messageId } = await conversation.persistUserMessage({
575
575
  content,
576
576
  attachments,
577
577
  requestId,
578
- persistMetadata,
579
- options?.displayContent,
580
- );
578
+ metadata: persistMetadata,
579
+ displayContent: options?.displayContent,
580
+ });
581
581
  publishConversationMessagesChanged(conversationId);
582
582
 
583
583
  if (options?.isInteractive === true) {
@@ -133,7 +133,7 @@ export async function initializeProvidersAndTools(
133
133
  serverConfig,
134
134
  manager,
135
135
  );
136
- registerMcpTools(mcpTools);
136
+ registerMcpTools(serverId, mcpTools);
137
137
  }
138
138
  } catch (err) {
139
139
  log.error(
@@ -50,6 +50,15 @@ import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
50
50
 
51
51
  const log = getLogger("server");
52
52
 
53
+ function isEaddrInUse(err: unknown): boolean {
54
+ return (
55
+ typeof err === "object" &&
56
+ err !== null &&
57
+ "code" in err &&
58
+ (err as NodeJS.ErrnoException).code === "EADDRINUSE"
59
+ );
60
+ }
61
+
53
62
  function readPackageVersion(): string | undefined {
54
63
  try {
55
64
  const pkgPath = join(import.meta.dir, "../../package.json");
@@ -259,6 +268,13 @@ export class DaemonServer {
259
268
  try {
260
269
  await this.cliIpc.start();
261
270
  } catch (err) {
271
+ if (isEaddrInUse(err)) {
272
+ log.error(
273
+ { err },
274
+ "CLI IPC socket already in use by another daemon — aborting startup to prevent duplicate processing",
275
+ );
276
+ throw err;
277
+ }
262
278
  log.warn(
263
279
  { err },
264
280
  "CLI IPC server failed to start — continuing startup with degraded CLI connectivity",
@@ -1,4 +1,5 @@
1
1
  import type { ProfileEntry } from "../config/schemas/llm.js";
2
+ import { AUTO_PROFILE_KEY } from "../config/seed-inference-profiles.js";
2
3
  import type { ToolDefinition } from "../providers/types.js";
3
4
 
4
5
  export const SWITCH_INFERENCE_PROFILE_TOOL_NAME = "switch_inference_profile";
@@ -16,7 +17,13 @@ export function buildSwitchInferenceProfileToolDef(
16
17
  currentProfile?: string,
17
18
  ): ToolDefinition | null {
18
19
  const entries = Object.entries(profiles).filter(
19
- ([, entry]) => entry.status !== "disabled",
20
+ ([key, entry]) =>
21
+ entry.status !== "disabled" &&
22
+ key !== AUTO_PROFILE_KEY &&
23
+ // Mix profiles are A/B-routing buckets, not concrete targets the model
24
+ // should self-select into — exclude them so the picker only offers real
25
+ // profiles.
26
+ entry.mix == null,
20
27
  );
21
28
  if (entries.length < 2) return null;
22
29
 
@@ -32,11 +39,14 @@ export function buildSwitchInferenceProfileToolDef(
32
39
  .join("\n");
33
40
 
34
41
  const currentEntry = currentProfile ? profiles[currentProfile] : undefined;
35
- const currentLabel = currentEntry?.label ?? currentProfile ?? "current";
42
+ const currentLabel =
43
+ currentProfile === AUTO_PROFILE_KEY
44
+ ? "Auto (starting on Balanced)"
45
+ : (currentEntry?.label ?? currentProfile ?? "current");
36
46
 
37
47
  return {
38
48
  name: SWITCH_INFERENCE_PROFILE_TOOL_NAME,
39
- description: `Switch to a different inference profile BEFORE answering. You MUST call this tool when the user's query requires capabilities beyond what your current profile ("${currentLabel}") provides. Examples of when to switch to a more capable profile: multi-step reasoning or analysis, math proofs or derivations, complex coding tasks, detailed creative writing, or any task requiring deep thought. Examples of when to switch to a faster profile: simple greetings, one-word answers, factual lookups. When in doubt about whether you can handle the query well, switch to a more capable profile.\n\nAvailable profiles:\n${profileDescriptions}`,
49
+ description: `Switch to a different inference profile BEFORE answering. You MUST call this tool when the user's query requires capabilities beyond what your current profile ("${currentLabel}") provides AND you MUST also call it when the query is trivially simple and a faster, cheaper profile would handle it equally well.\n\nSwitch UP (to a more capable profile) for: multi-step reasoning or analysis, math proofs or derivations, complex coding tasks, detailed creative writing, or any task requiring deep thought.\n\nSwitch DOWN (to a faster profile) for: simple greetings or chitchat, one-word or single-sentence answers, factual lookups, acknowledgments, or any query that does not benefit from advanced reasoning.\n\nWhen in doubt about whether you can handle the query well, switch UP. When in doubt about whether the query is too simple for your current profile, switch DOWN.\n\nAvailable profiles:\n${profileDescriptions}`,
40
50
  input_schema: {
41
51
  type: "object" as const,
42
52
  properties: {
@@ -64,10 +64,4 @@ export interface ToolSetupContext extends SurfaceConversationContext {
64
64
  * turn start.
65
65
  */
66
66
  toolRoutedProfile?: string;
67
- /**
68
- * True when the user has explicitly selected an inference profile for this
69
- * conversation (via the composer profile picker). When set, tool-based
70
- * auto-routing is suppressed — the user's explicit choice takes precedence.
71
- */
72
- hasExplicitProfileOverride?: boolean;
73
67
  }
@@ -136,8 +136,18 @@ function translateAgentEventToServerMessage(
136
136
  case "usage":
137
137
  case "error":
138
138
  case "provider_error":
139
+ case "max_tokens_reached":
139
140
  case "agent_loop_exit":
140
141
  return null;
142
+ case "llm_call_started":
143
+ // The wake path persists its assistant tail via `persistTailMessage`
144
+ // (an `addMessage`-shaped call below) rather than via the main
145
+ // event-handler's `reserve` → `updateContent` pipeline, so there is
146
+ // no row to reserve here. Translation returns null and the wake
147
+ // path's existing end-of-turn persist continues to mint the row.
148
+ // Following up with full wake-path pre-allocation parity is tracked
149
+ // as a B3 follow-up.
150
+ return null;
141
151
  }
142
152
  }
143
153
 
@@ -217,6 +217,44 @@ export function searchDocumentsByTitle(
217
217
  }
218
218
  }
219
219
 
220
+ /**
221
+ * Return the most recent empty document in the given conversation with the
222
+ * supplied title, created within the last `withinMs` milliseconds.
223
+ *
224
+ * Used to dedupe a duplicate create-then-create flow after a failed update —
225
+ * when the model can't recover a malformed update and retries by creating a
226
+ * second same-title document, we reuse the first (still-empty) draft instead
227
+ * of producing a duplicate row. Returns `null` when no candidate exists.
228
+ */
229
+ export function findRecentEmptyDocumentByTitle(
230
+ conversationId: string,
231
+ title: string,
232
+ withinMs: number,
233
+ ): { surfaceId: string } | null {
234
+ try {
235
+ const threshold = Date.now() - withinMs;
236
+ const row = rawGet<{ surface_id: string }>(
237
+ /*sql*/ `SELECT surface_id FROM documents
238
+ WHERE conversation_id = ?
239
+ AND title = ?
240
+ AND content = ''
241
+ AND created_at >= ?
242
+ ORDER BY created_at DESC
243
+ LIMIT 1`,
244
+ conversationId,
245
+ title,
246
+ threshold,
247
+ );
248
+ return row ? { surfaceId: row.surface_id } : null;
249
+ } catch (error) {
250
+ log.error(
251
+ { err: error, conversationId, title },
252
+ "Find-recent-empty-document error",
253
+ );
254
+ return null;
255
+ }
256
+ }
257
+
220
258
  /**
221
259
  * Delete a document and its conversation associations.
222
260
  * Returns `true` if the document existed and was deleted, `false` otherwise.
@@ -76,6 +76,7 @@ mock.module("../../memory/conversation-crud.js", () => ({
76
76
  getMessages: (id: string) =>
77
77
  id === "child-conv-1" ? childMessages : parentMessages,
78
78
  messageMetadataSchema,
79
+ reserveMessage: mock(async () => ({ id: "msg-reserve" })),
79
80
  }));
80
81
 
81
82
  mock.module("../../util/truncate.js", () => ({
@@ -43,6 +43,35 @@ mock.module("../../util/platform.js", () => ({
43
43
  join(workspaceDir ?? fallbackDir, "avatar/avatar-image.png"),
44
44
 
45
45
  getXdgVellumConfigDirName: () => ".vellum",
46
+ getPidPath: () => join(workspaceDir ?? fallbackDir, "assistant.pid"),
47
+ getDbPath: () => join(workspaceDir ?? fallbackDir, "db/assistant.db"),
48
+ getLogsDir: () => join(workspaceDir ?? fallbackDir, "logs"),
49
+ getHistoryPath: () => join(workspaceDir ?? fallbackDir, "history.json"),
50
+ getProtectedDir: () => join(workspaceDir ?? fallbackDir, "protected"),
51
+ getSignalsDir: () => join(workspaceDir ?? fallbackDir, "signals"),
52
+ getDaemonStderrLogPath: () =>
53
+ join(workspaceDir ?? fallbackDir, "logs/assistant.err.log"),
54
+ getDaemonStartupLockPath: () =>
55
+ join(workspaceDir ?? fallbackDir, "assistant.lock"),
56
+ getExternalDir: () => join(workspaceDir ?? fallbackDir, "external"),
57
+ getBinDir: () => join(workspaceDir ?? fallbackDir, "bin"),
58
+ getDotEnvPath: () => join(workspaceDir ?? fallbackDir, ".env"),
59
+ getEmbedWorkerPidPath: () =>
60
+ join(workspaceDir ?? fallbackDir, "embed-worker.pid"),
61
+ getWorkspaceDirDisplay: () => workspaceDir ?? fallbackDir,
62
+ getWorkspaceConfigPath: () => join(workspaceDir ?? fallbackDir, "config.json"),
63
+ getWorkspaceSkillsDir: () => join(workspaceDir ?? fallbackDir, "skills"),
64
+ getWorkspaceHooksDir: () => join(workspaceDir ?? fallbackDir, ".githooks"),
65
+ getWorkspacePluginsDir: () => join(workspaceDir ?? fallbackDir, "plugins"),
66
+ getWorkspaceRoutesDir: () => join(workspaceDir ?? fallbackDir, "routes"),
67
+ getDeprecatedDir: () => join(workspaceDir ?? fallbackDir, "deprecated"),
68
+ getProfilerRootDir: () => join(workspaceDir ?? fallbackDir, "profiler"),
69
+ getProfilerRunsDir: () => join(workspaceDir ?? fallbackDir, "profiler/runs"),
70
+ getProfilerRunDir: (runId: string) =>
71
+ join(workspaceDir ?? fallbackDir, "profiler/runs", runId),
72
+ getSkillRuntimePath: () => join(workspaceDir ?? fallbackDir, "skill-runtime"),
73
+ getBundledBunPath: () => undefined,
74
+ ensureDataDir: () => {},
46
75
  }));
47
76
 
48
77
  // Stub config so heartbeat is enabled. Must export every symbol from