@vellumai/assistant 0.5.16 → 0.6.1

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 (592) hide show
  1. package/AGENTS.md +4 -0
  2. package/ARCHITECTURE.md +69 -16
  3. package/Dockerfile +2 -5
  4. package/bun.lock +6 -2
  5. package/docker-entrypoint.sh +32 -1
  6. package/docs/architecture/integrations.md +1 -1
  7. package/docs/architecture/memory.md +21 -24
  8. package/knip.json +2 -1
  9. package/openapi.yaml +1198 -83
  10. package/package.json +5 -1
  11. package/src/__tests__/actor-token-service.test.ts +68 -0
  12. package/src/__tests__/agent-loop.test.ts +0 -32
  13. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  14. package/src/__tests__/anthropic-provider.test.ts +217 -98
  15. package/src/__tests__/app-compiler.test.ts +120 -0
  16. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  17. package/src/__tests__/app-executors.test.ts +47 -1
  18. package/src/__tests__/app-source-watcher.test.ts +159 -0
  19. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  20. package/src/__tests__/call-conversation-messages.test.ts +2 -6
  21. package/src/__tests__/call-domain.test.ts +2 -6
  22. package/src/__tests__/call-pointer-messages.test.ts +2 -14
  23. package/src/__tests__/call-recovery.test.ts +2 -6
  24. package/src/__tests__/call-routes-http.test.ts +2 -6
  25. package/src/__tests__/call-store.test.ts +2 -6
  26. package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -6
  27. package/src/__tests__/canonical-guardian-store.test.ts +2 -6
  28. package/src/__tests__/channel-delivery-store.test.ts +2 -6
  29. package/src/__tests__/channel-retry-sweep.test.ts +2 -6
  30. package/src/__tests__/checker.test.ts +63 -9
  31. package/src/__tests__/clawhub.test.ts +54 -24
  32. package/src/__tests__/cli-command-risk-guard.test.ts +14 -0
  33. package/src/__tests__/config-schema.test.ts +6 -1
  34. package/src/__tests__/config-set-platform-guard.test.ts +302 -0
  35. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -6
  36. package/src/__tests__/contacts-tools.test.ts +31 -0
  37. package/src/__tests__/context-overflow-reducer.test.ts +86 -0
  38. package/src/__tests__/context-token-estimator.test.ts +175 -10
  39. package/src/__tests__/conversation-agent-loop-overflow.test.ts +13 -6
  40. package/src/__tests__/conversation-agent-loop.test.ts +13 -51
  41. package/src/__tests__/conversation-attachments.test.ts +2 -6
  42. package/src/__tests__/conversation-attention-store.test.ts +2 -6
  43. package/src/__tests__/conversation-clear-safety.test.ts +2 -6
  44. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +4 -10
  45. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -6
  46. package/src/__tests__/conversation-disk-view.test.ts +2 -6
  47. package/src/__tests__/conversation-error.test.ts +33 -2
  48. package/src/__tests__/conversation-fork-crud.test.ts +2 -6
  49. package/src/__tests__/conversation-history-web-search.test.ts +6 -1
  50. package/src/__tests__/conversation-load-history-repair.test.ts +5 -1
  51. package/src/__tests__/conversation-media-retry.test.ts +91 -0
  52. package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
  53. package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
  54. package/src/__tests__/conversation-starter-routes.test.ts +20 -11
  55. package/src/__tests__/conversation-store.test.ts +2 -6
  56. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
  57. package/src/__tests__/conversation-usage.test.ts +2 -6
  58. package/src/__tests__/conversation-wipe.test.ts +13 -414
  59. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
  60. package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
  61. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  62. package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
  63. package/src/__tests__/credential-execution-feature-gates.test.ts +3 -3
  64. package/src/__tests__/credential-execution-shell-lockdown.test.ts +2 -2
  65. package/src/__tests__/credential-security-e2e.test.ts +2 -0
  66. package/src/__tests__/date-context.test.ts +76 -210
  67. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
  68. package/src/__tests__/file-list-tool.test.ts +219 -0
  69. package/src/__tests__/first-greeting.test.ts +1 -1
  70. package/src/__tests__/followup-tools.test.ts +2 -6
  71. package/src/__tests__/graph-extraction-event-date.test.ts +186 -0
  72. package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -6
  73. package/src/__tests__/guardian-action-followup-executor.test.ts +2 -6
  74. package/src/__tests__/guardian-action-followup-store.test.ts +2 -6
  75. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +2 -6
  76. package/src/__tests__/guardian-action-late-reply.test.ts +2 -6
  77. package/src/__tests__/guardian-action-store.test.ts +2 -6
  78. package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -6
  79. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +8 -8
  80. package/src/__tests__/guardian-dispatch.test.ts +2 -6
  81. package/src/__tests__/guardian-grant-minting.test.ts +2 -14
  82. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -6
  83. package/src/__tests__/guardian-routing-invariants.test.ts +192 -6
  84. package/src/__tests__/guardian-routing-state.test.ts +2 -6
  85. package/src/__tests__/guardian-verification-voice-binding.test.ts +2 -6
  86. package/src/__tests__/heartbeat-service.test.ts +180 -3
  87. package/src/__tests__/identity-routes.test.ts +328 -0
  88. package/src/__tests__/inbound-invite-redemption.test.ts +2 -6
  89. package/src/__tests__/injection-block.test.ts +178 -0
  90. package/src/__tests__/install-meta.test.ts +506 -0
  91. package/src/__tests__/install-skill-routing.test.ts +293 -0
  92. package/src/__tests__/invite-redemption-service.test.ts +2 -6
  93. package/src/__tests__/invite-routes-http.test.ts +2 -6
  94. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +17 -28
  95. package/src/__tests__/list-messages-attachments.test.ts +2 -6
  96. package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
  97. package/src/__tests__/llm-context-normalization.test.ts +18 -18
  98. package/src/__tests__/llm-context-route-provider.test.ts +103 -6
  99. package/src/__tests__/llm-request-log-turn-query.test.ts +164 -6
  100. package/src/__tests__/llm-usage-store.test.ts +2 -6
  101. package/src/__tests__/log-export-workspace.test.ts +74 -111
  102. package/src/__tests__/managed-store.test.ts +38 -11
  103. package/src/__tests__/mcp-abort-signal.test.ts +5 -0
  104. package/src/__tests__/mcp-client-auth.test.ts +5 -0
  105. package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
  106. package/src/__tests__/memory-recall-log-store.test.ts +134 -6
  107. package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
  108. package/src/__tests__/migration-export-streaming.test.ts +304 -0
  109. package/src/__tests__/migration-import-commit-http.test.ts +11 -10
  110. package/src/__tests__/mock-fetch.ts +87 -0
  111. package/src/__tests__/non-member-access-request.test.ts +2 -6
  112. package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
  113. package/src/__tests__/notification-guardian-path.test.ts +2 -6
  114. package/src/__tests__/oauth-cli.test.ts +364 -2
  115. package/src/__tests__/oauth2-gateway-transport.test.ts +18 -3
  116. package/src/__tests__/onboarding-template-contract.test.ts +62 -14
  117. package/src/__tests__/outlook-attachments.test.ts +301 -0
  118. package/src/__tests__/outlook-automation-tools.test.ts +425 -0
  119. package/src/__tests__/outlook-categories.test.ts +212 -0
  120. package/src/__tests__/outlook-client-automation.test.ts +246 -0
  121. package/src/__tests__/outlook-compose-tools.test.ts +325 -0
  122. package/src/__tests__/outlook-declutter-tools.test.ts +585 -0
  123. package/src/__tests__/outlook-email-watcher.test.ts +322 -0
  124. package/src/__tests__/outlook-follow-up.test.ts +196 -0
  125. package/src/__tests__/outlook-messaging-provider.test.ts +498 -3
  126. package/src/__tests__/outlook-trash.test.ts +77 -0
  127. package/src/__tests__/outlook-unsubscribe.test.ts +250 -0
  128. package/src/__tests__/parser.test.ts +32 -0
  129. package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
  130. package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
  131. package/src/__tests__/permission-mode-sse.test.ts +418 -0
  132. package/src/__tests__/permission-mode-store.test.ts +277 -0
  133. package/src/__tests__/permission-mode.test.ts +101 -0
  134. package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
  135. package/src/__tests__/platform-callback-registration.test.ts +4 -4
  136. package/src/__tests__/playbook-execution.test.ts +76 -80
  137. package/src/__tests__/playbook-tools.test.ts +5 -7
  138. package/src/__tests__/profiler-routes.test.ts +502 -0
  139. package/src/__tests__/profiler-run-store.test.ts +441 -0
  140. package/src/__tests__/provider-error-scenarios.test.ts +21 -0
  141. package/src/__tests__/proxy-approval-callback.test.ts +4 -75
  142. package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
  143. package/src/__tests__/registry.test.ts +3 -3
  144. package/src/__tests__/require-fresh-approval.test.ts +64 -2
  145. package/src/__tests__/runtime-events-sse-parity.test.ts +2 -6
  146. package/src/__tests__/runtime-events-sse.test.ts +2 -6
  147. package/src/__tests__/sandbox-host-parity.test.ts +5 -4
  148. package/src/__tests__/schedule-store.test.ts +2 -6
  149. package/src/__tests__/schedule-tools.test.ts +2 -6
  150. package/src/__tests__/scheduler-recurrence.test.ts +1 -5
  151. package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
  152. package/src/__tests__/scoped-approval-grants.test.ts +2 -6
  153. package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
  154. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
  155. package/src/__tests__/search-skills-unified.test.ts +422 -0
  156. package/src/__tests__/secret-onetime-send.test.ts +2 -0
  157. package/src/__tests__/send-endpoint-busy.test.ts +44 -9
  158. package/src/__tests__/sequence-store.test.ts +2 -6
  159. package/src/__tests__/server-history-render.test.ts +2 -6
  160. package/src/__tests__/set-permission-mode.test.ts +274 -0
  161. package/src/__tests__/skill-feature-flags-integration.test.ts +38 -31
  162. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  163. package/src/__tests__/skill-load-feature-flag.test.ts +23 -11
  164. package/src/__tests__/skill-memory.test.ts +2 -741
  165. package/src/__tests__/skills-uninstall.test.ts +2 -2
  166. package/src/__tests__/skills.test.ts +1 -1
  167. package/src/__tests__/slack-inbound-verification.test.ts +2 -6
  168. package/src/__tests__/strip-memory-injections.test.ts +187 -0
  169. package/src/__tests__/subagent-detail.test.ts +84 -0
  170. package/src/__tests__/subagent-disposal.test.ts +308 -0
  171. package/src/__tests__/subagent-manager-notify.test.ts +19 -10
  172. package/src/__tests__/subagent-notify-parent.test.ts +390 -0
  173. package/src/__tests__/subagent-role-registry.test.ts +108 -0
  174. package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
  175. package/src/__tests__/subagent-tools.test.ts +464 -4
  176. package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
  177. package/src/__tests__/task-compiler.test.ts +2 -6
  178. package/src/__tests__/task-management-tools.test.ts +2 -6
  179. package/src/__tests__/task-memory-cleanup.test.ts +185 -241
  180. package/src/__tests__/task-runner.test.ts +2 -6
  181. package/src/__tests__/task-scheduler.test.ts +2 -6
  182. package/src/__tests__/terminal-tools.test.ts +17 -27
  183. package/src/__tests__/test-preload.ts +7 -0
  184. package/src/__tests__/tool-approval-handler.test.ts +2 -6
  185. package/src/__tests__/tool-executor.test.ts +4 -26
  186. package/src/__tests__/tool-grant-request-escalation.test.ts +2 -6
  187. package/src/__tests__/tool-side-effects-slack-dm.test.ts +277 -0
  188. package/src/__tests__/top-level-renderer.test.ts +10 -13
  189. package/src/__tests__/trust-store.test.ts +1 -1
  190. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +2 -6
  191. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +118 -8
  192. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -6
  193. package/src/__tests__/trusted-contact-verification.test.ts +2 -6
  194. package/src/__tests__/turn-boundary-resolution.test.ts +2 -6
  195. package/src/__tests__/usage-cache-backfill-migration.test.ts +1 -6
  196. package/src/__tests__/usage-routes.test.ts +2 -6
  197. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  198. package/src/__tests__/voice-invite-redemption.test.ts +2 -6
  199. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -6
  200. package/src/__tests__/voice-session-bridge.test.ts +2 -6
  201. package/src/__tests__/volume-security-guard.test.ts +2 -0
  202. package/src/__tests__/workspace-lifecycle.test.ts +29 -1
  203. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -6
  204. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +2 -6
  205. package/src/__tests__/workspace-migration-026-backfill-install-meta.test.ts +558 -0
  206. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
  207. package/src/__tests__/workspace-policy.test.ts +1 -1
  208. package/src/agent/attachments.ts +7 -2
  209. package/src/agent/image-optimize.ts +165 -0
  210. package/src/agent/loop.ts +7 -15
  211. package/src/approvals/guardian-request-resolvers.ts +24 -0
  212. package/src/avatar/traits-png-sync.ts +3 -3
  213. package/src/bundler/app-compiler.ts +179 -2
  214. package/src/bundler/package-resolver.ts +3 -5
  215. package/src/cli/__tests__/notifications.test.ts +1 -2
  216. package/src/cli/__tests__/run-assistant-command.ts +29 -0
  217. package/src/cli/commands/__tests__/email-download.test.ts +245 -0
  218. package/src/cli/commands/__tests__/email-list.test.ts +192 -0
  219. package/src/cli/commands/__tests__/email-register.test.ts +186 -0
  220. package/src/cli/commands/__tests__/email-send.test.ts +291 -0
  221. package/src/cli/commands/__tests__/email-status.test.ts +181 -0
  222. package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
  223. package/src/cli/commands/__tests__/routes.test.ts +562 -0
  224. package/src/cli/commands/avatar.ts +3 -3
  225. package/src/cli/commands/config.ts +26 -13
  226. package/src/cli/commands/conversations.ts +1 -8
  227. package/src/cli/commands/doctor.ts +2 -2
  228. package/src/cli/commands/email.ts +584 -835
  229. package/src/cli/commands/memory.ts +37 -84
  230. package/src/cli/commands/notifications.ts +7 -2
  231. package/src/cli/commands/oauth/__tests__/connect.test.ts +2 -2
  232. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +2 -2
  233. package/src/cli/commands/oauth/__tests__/mode.test.ts +8 -1
  234. package/src/cli/commands/oauth/__tests__/status.test.ts +2 -2
  235. package/src/cli/commands/oauth/connect.ts +25 -11
  236. package/src/cli/commands/oauth/mode.ts +7 -0
  237. package/src/cli/commands/oauth/shared.ts +39 -3
  238. package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
  239. package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
  240. package/src/cli/commands/platform/__tests__/status.test.ts +5 -5
  241. package/src/cli/commands/platform/index.ts +16 -16
  242. package/src/cli/commands/routes.ts +396 -0
  243. package/src/cli/commands/skills.ts +218 -36
  244. package/src/cli/commands/trust.ts +2 -2
  245. package/src/cli/lib/daemon-credential-client.ts +2 -3
  246. package/src/cli/program.ts +2 -0
  247. package/src/cli.ts +1 -120
  248. package/src/config/bundled-skills/acp/TOOLS.json +1 -1
  249. package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
  250. package/src/config/bundled-skills/contacts/SKILL.md +0 -1
  251. package/src/config/bundled-skills/contacts/TOOLS.json +0 -8
  252. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -4
  253. package/src/config/bundled-skills/gmail/SKILL.md +4 -12
  254. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
  255. package/src/config/bundled-skills/messaging/SKILL.md +17 -18
  256. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +40 -33
  257. package/src/config/bundled-skills/outlook/SKILL.md +189 -0
  258. package/src/config/bundled-skills/outlook/TOOLS.json +530 -0
  259. package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +85 -0
  260. package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +77 -0
  261. package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +84 -0
  262. package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +94 -0
  263. package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +49 -0
  264. package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +237 -0
  265. package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +161 -0
  266. package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +32 -0
  267. package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +272 -0
  268. package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +29 -0
  269. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +129 -0
  270. package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +87 -0
  271. package/src/config/bundled-skills/outlook/tools/shared.ts +20 -0
  272. package/src/config/bundled-skills/outlook-calendar/SKILL.md +51 -0
  273. package/src/config/bundled-skills/outlook-calendar/TOOLS.json +221 -0
  274. package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +252 -0
  275. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +53 -0
  276. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +74 -0
  277. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +18 -0
  278. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +46 -0
  279. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +36 -0
  280. package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +17 -0
  281. package/src/config/bundled-skills/outlook-calendar/types.ts +120 -0
  282. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +47 -40
  283. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +16 -29
  284. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +16 -18
  285. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +39 -47
  286. package/src/config/bundled-skills/schedule/SKILL.md +22 -2
  287. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  288. package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
  289. package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
  290. package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
  291. package/src/config/bundled-skills/slack/SKILL.md +3 -7
  292. package/src/config/bundled-skills/subagent/SKILL.md +43 -3
  293. package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
  294. package/src/config/bundled-tool-registry.ts +56 -4
  295. package/src/config/env-registry.ts +78 -8
  296. package/src/config/feature-flag-registry.json +38 -125
  297. package/src/config/schema.ts +8 -0
  298. package/src/config/schemas/filing.ts +51 -0
  299. package/src/config/schemas/heartbeat.ts +15 -12
  300. package/src/config/schemas/memory-lifecycle.ts +12 -0
  301. package/src/config/schemas/platform.ts +8 -0
  302. package/src/config/schemas/security.ts +14 -0
  303. package/src/config/schemas/timeouts.ts +1 -1
  304. package/src/config/skills.ts +18 -7
  305. package/src/context/token-estimator.ts +25 -18
  306. package/src/context/window-manager.ts +6 -2
  307. package/src/credential-execution/process-manager.ts +3 -1
  308. package/src/daemon/app-source-watcher.ts +93 -0
  309. package/src/daemon/config-watcher.ts +79 -1
  310. package/src/daemon/context-overflow-reducer.ts +46 -2
  311. package/src/daemon/conversation-agent-loop-handlers.ts +143 -82
  312. package/src/daemon/conversation-agent-loop.ts +236 -108
  313. package/src/daemon/conversation-error.ts +31 -8
  314. package/src/daemon/conversation-history.ts +4 -19
  315. package/src/daemon/conversation-lifecycle.ts +36 -9
  316. package/src/daemon/conversation-media-retry.ts +85 -7
  317. package/src/daemon/conversation-notifiers.ts +4 -1
  318. package/src/daemon/conversation-process.ts +13 -7
  319. package/src/daemon/conversation-runtime-assembly.ts +305 -306
  320. package/src/daemon/conversation-tool-setup.ts +44 -14
  321. package/src/daemon/conversation-workspace.ts +1 -2
  322. package/src/daemon/conversation.ts +59 -2
  323. package/src/daemon/daemon-control.ts +8 -2
  324. package/src/daemon/date-context.ts +26 -53
  325. package/src/daemon/first-greeting.ts +1 -1
  326. package/src/daemon/handlers/conversations.ts +4 -7
  327. package/src/daemon/handlers/shared.test.ts +143 -0
  328. package/src/daemon/handlers/shared.ts +85 -17
  329. package/src/daemon/handlers/skills.ts +416 -209
  330. package/src/daemon/lifecycle.ts +212 -131
  331. package/src/daemon/main.ts +5 -1
  332. package/src/daemon/message-types/conversations.ts +29 -7
  333. package/src/daemon/message-types/messages.ts +12 -2
  334. package/src/daemon/message-types/schedules.ts +1 -0
  335. package/src/daemon/message-types/settings.ts +6 -0
  336. package/src/daemon/message-types/skills.ts +97 -36
  337. package/src/daemon/profiler-run-store.ts +557 -0
  338. package/src/daemon/providers-setup.ts +5 -0
  339. package/src/daemon/server.ts +100 -11
  340. package/src/daemon/shutdown-handlers.ts +5 -0
  341. package/src/daemon/tool-side-effects.ts +50 -8
  342. package/src/export/transcript-formatter.ts +148 -0
  343. package/src/filing/filing-service.ts +228 -0
  344. package/src/heartbeat/heartbeat-service.ts +97 -7
  345. package/src/hooks/cli.ts +2 -2
  346. package/src/hooks/runner.ts +15 -38
  347. package/src/inbound/platform-callback-registration.ts +14 -14
  348. package/src/mcp/client.ts +6 -0
  349. package/src/mcp/mcp-oauth-provider.ts +149 -27
  350. package/src/memory/admin.ts +42 -75
  351. package/src/memory/app-store.ts +69 -0
  352. package/src/memory/conversation-bootstrap.ts +3 -1
  353. package/src/memory/conversation-crud.ts +211 -288
  354. package/src/memory/conversation-group-migration.ts +157 -0
  355. package/src/memory/conversation-queries.ts +61 -13
  356. package/src/memory/conversation-title-service.ts +1 -0
  357. package/src/memory/db-init.ts +194 -361
  358. package/src/memory/embed.ts +73 -0
  359. package/src/memory/embedding-backend.ts +8 -14
  360. package/src/memory/embedding-runtime-manager.ts +12 -114
  361. package/src/memory/fingerprint.ts +2 -2
  362. package/src/memory/graph/bootstrap.ts +521 -0
  363. package/src/memory/graph/capability-seed.ts +449 -0
  364. package/src/memory/graph/consolidation.ts +725 -0
  365. package/src/memory/graph/conversation-graph-memory.ts +659 -0
  366. package/src/memory/graph/decay.test.ts +208 -0
  367. package/src/memory/graph/decay.ts +195 -0
  368. package/src/memory/graph/extraction-job.ts +74 -0
  369. package/src/memory/graph/extraction.test.ts +936 -0
  370. package/src/memory/graph/extraction.ts +1297 -0
  371. package/src/memory/graph/graph-memory-state-store.ts +37 -0
  372. package/src/memory/graph/graph-search.ts +280 -0
  373. package/src/memory/graph/image-ref-utils.ts +29 -0
  374. package/src/memory/graph/injection.test.ts +513 -0
  375. package/src/memory/graph/injection.ts +469 -0
  376. package/src/memory/graph/inspect.ts +543 -0
  377. package/src/memory/graph/narrative.ts +267 -0
  378. package/src/memory/graph/pattern-scan.ts +269 -0
  379. package/src/memory/graph/retriever.ts +1111 -0
  380. package/src/memory/graph/scoring.test.ts +548 -0
  381. package/src/memory/graph/scoring.ts +232 -0
  382. package/src/memory/graph/serendipity.ts +65 -0
  383. package/src/memory/graph/store.test.ts +1098 -0
  384. package/src/memory/graph/store.ts +838 -0
  385. package/src/memory/graph/tool-handlers.ts +301 -0
  386. package/src/memory/graph/tools.ts +97 -0
  387. package/src/memory/graph/triggers.test.ts +487 -0
  388. package/src/memory/graph/triggers.ts +223 -0
  389. package/src/memory/graph/types.ts +295 -0
  390. package/src/memory/group-crud.ts +191 -0
  391. package/src/memory/indexer.ts +37 -19
  392. package/src/memory/job-handlers/cleanup.ts +32 -42
  393. package/src/memory/job-handlers/conversation-starters.ts +91 -53
  394. package/src/memory/job-handlers/embedding.ts +5 -31
  395. package/src/memory/job-handlers/index-maintenance.ts +23 -11
  396. package/src/memory/job-handlers/summarization.ts +32 -17
  397. package/src/memory/job-utils.ts +1 -1
  398. package/src/memory/jobs-store.ts +21 -31
  399. package/src/memory/jobs-worker.ts +180 -129
  400. package/src/memory/llm-request-log-store.ts +96 -12
  401. package/src/memory/memory-recall-log-store.ts +49 -5
  402. package/src/memory/message-content.ts +1 -0
  403. package/src/memory/migrations/202-memory-graph-tables.ts +130 -0
  404. package/src/memory/migrations/203-drop-memory-items-tables.ts +55 -0
  405. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +46 -0
  406. package/src/memory/migrations/205-memory-graph-image-refs.ts +11 -0
  407. package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
  408. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
  409. package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
  410. package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
  411. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
  412. package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
  413. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
  414. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
  415. package/src/memory/migrations/index.ts +12 -0
  416. package/src/memory/migrations/registry.ts +16 -0
  417. package/src/memory/qdrant-client.ts +44 -17
  418. package/src/memory/schema/conversations.ts +14 -0
  419. package/src/memory/schema/index.ts +1 -0
  420. package/src/memory/schema/infrastructure.ts +8 -1
  421. package/src/memory/schema/memory-core.ts +0 -51
  422. package/src/memory/schema/memory-graph.ts +154 -0
  423. package/src/memory/search/semantic.ts +47 -91
  424. package/src/memory/task-memory-cleanup.ts +58 -61
  425. package/src/messaging/providers/outlook/adapter.ts +8 -1
  426. package/src/messaging/providers/outlook/client.ts +299 -0
  427. package/src/messaging/providers/outlook/types.ts +118 -0
  428. package/src/notifications/adapters/macos.ts +1 -0
  429. package/src/notifications/copy-composer.ts +95 -0
  430. package/src/notifications/decision-engine.ts +35 -0
  431. package/src/notifications/signal.ts +16 -0
  432. package/src/oauth/seed-providers.ts +2 -1
  433. package/src/permissions/checker.ts +36 -4
  434. package/src/permissions/defaults.ts +4 -4
  435. package/src/permissions/permission-mode-store.ts +180 -0
  436. package/src/permissions/permission-mode.ts +31 -0
  437. package/src/permissions/workspace-policy.ts +10 -1
  438. package/src/playbooks/playbook-compiler.ts +19 -18
  439. package/src/playbooks/types.ts +4 -3
  440. package/src/prompts/system-prompt.ts +62 -36
  441. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
  442. package/src/prompts/templates/BOOTSTRAP.md +70 -165
  443. package/src/prompts/templates/HEARTBEAT.md +3 -1
  444. package/src/prompts/templates/SOUL.md +25 -4
  445. package/src/prompts/templates/UPDATES.md +8 -0
  446. package/src/providers/anthropic/client.ts +136 -220
  447. package/src/providers/gemini/client.ts +1 -1
  448. package/src/providers/openai/client.ts +1 -1
  449. package/src/providers/registry.ts +1 -1
  450. package/src/providers/retry.ts +19 -3
  451. package/src/runtime/actor-trust-resolver.ts +5 -1
  452. package/src/runtime/auth/route-policy.ts +30 -0
  453. package/src/runtime/guardian-reply-router.ts +5 -1
  454. package/src/runtime/http-server.ts +55 -5
  455. package/src/runtime/http-types.ts +12 -1
  456. package/src/runtime/middleware/auth.ts +20 -0
  457. package/src/runtime/migrations/vbundle-builder.ts +389 -3
  458. package/src/runtime/migrations/vbundle-importer.ts +8 -6
  459. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
  460. package/src/runtime/routes/app-management-routes.ts +1 -11
  461. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
  462. package/src/runtime/routes/archive-utils.ts +29 -0
  463. package/src/runtime/routes/attachment-routes.test.ts +106 -0
  464. package/src/runtime/routes/attachment-routes.ts +106 -16
  465. package/src/runtime/routes/avatar-routes.ts +2 -9
  466. package/src/runtime/routes/brain-graph-routes.ts +21 -22
  467. package/src/runtime/routes/btw-routes.ts +22 -1
  468. package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
  469. package/src/runtime/routes/conversation-management-routes.ts +3 -14
  470. package/src/runtime/routes/conversation-query-routes.ts +49 -3
  471. package/src/runtime/routes/conversation-routes.ts +264 -44
  472. package/src/runtime/routes/conversation-starter-routes.ts +2 -2
  473. package/src/runtime/routes/debug-routes.ts +1 -1
  474. package/src/runtime/routes/global-search-routes.ts +21 -19
  475. package/src/runtime/routes/group-routes.ts +207 -0
  476. package/src/runtime/routes/guardian-action-routes.ts +21 -10
  477. package/src/runtime/routes/guardian-bootstrap-routes.ts +23 -19
  478. package/src/runtime/routes/heartbeat-routes.ts +4 -10
  479. package/src/runtime/routes/identity-routes.ts +53 -18
  480. package/src/runtime/routes/inbound-message-handler.ts +19 -0
  481. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +292 -0
  482. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +207 -0
  483. package/src/runtime/routes/llm-context-normalization.ts +14 -10
  484. package/src/runtime/routes/log-export-routes.ts +23 -275
  485. package/src/runtime/routes/memory-item-routes.test.ts +170 -247
  486. package/src/runtime/routes/memory-item-routes.ts +341 -388
  487. package/src/runtime/routes/migration-routes.ts +18 -7
  488. package/src/runtime/routes/profiler-routes.ts +350 -0
  489. package/src/runtime/routes/schedule-routes.ts +28 -11
  490. package/src/runtime/routes/settings-routes.ts +95 -8
  491. package/src/runtime/routes/skills-routes.ts +103 -37
  492. package/src/runtime/routes/subagents-routes.ts +28 -7
  493. package/src/runtime/routes/user-route-dispatcher.ts +223 -0
  494. package/src/runtime/routes/user-routes.ts +41 -0
  495. package/src/runtime/routes/work-items-routes.test.ts +2 -6
  496. package/src/runtime/routes/workspace-routes.ts +0 -1
  497. package/src/schedule/schedule-store.ts +30 -0
  498. package/src/schedule/scheduler.ts +52 -18
  499. package/src/security/oauth2.ts +1 -1
  500. package/src/security/secure-keys.ts +4 -8
  501. package/src/shared/provider-env-vars.ts +19 -0
  502. package/src/skills/catalog-cache.ts +5 -0
  503. package/src/skills/catalog-install.ts +25 -16
  504. package/src/skills/clawhub.ts +134 -154
  505. package/src/skills/install-meta.ts +208 -0
  506. package/src/skills/managed-store.ts +29 -18
  507. package/src/skills/skill-memory.ts +12 -229
  508. package/src/skills/skillssh-registry.ts +19 -17
  509. package/src/subagent/index.ts +13 -3
  510. package/src/subagent/manager.ts +308 -29
  511. package/src/subagent/types.ts +68 -0
  512. package/src/tasks/task-runner.ts +7 -5
  513. package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
  514. package/src/tools/apps/executors.ts +29 -4
  515. package/src/tools/browser/runtime-check.ts +3 -1
  516. package/src/tools/filesystem/list.ts +93 -0
  517. package/src/tools/memory/register.ts +63 -46
  518. package/src/tools/permission-checker.ts +85 -1
  519. package/src/tools/registry.ts +4 -0
  520. package/src/tools/schedule/create.ts +3 -0
  521. package/src/tools/schedule/list.ts +1 -0
  522. package/src/tools/schedule/update.ts +6 -0
  523. package/src/tools/shared/filesystem/errors.ts +5 -0
  524. package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
  525. package/src/tools/shared/filesystem/image-read.ts +22 -85
  526. package/src/tools/shared/filesystem/types.ts +17 -0
  527. package/src/tools/shared/shell-output.ts +31 -2
  528. package/src/tools/subagent/abort.ts +12 -2
  529. package/src/tools/subagent/message.ts +9 -2
  530. package/src/tools/subagent/notify-parent.ts +79 -0
  531. package/src/tools/subagent/read.ts +29 -8
  532. package/src/tools/subagent/resolve.ts +21 -0
  533. package/src/tools/subagent/spawn.ts +2 -0
  534. package/src/tools/subagent/status.ts +11 -1
  535. package/src/tools/system/avatar-generator.ts +3 -3
  536. package/src/tools/system/register.ts +23 -0
  537. package/src/tools/system/set-permission-mode.ts +103 -0
  538. package/src/tools/terminal/parser.ts +30 -5
  539. package/src/tools/terminal/safe-env.ts +17 -1
  540. package/src/tools/tool-manifest.ts +9 -3
  541. package/src/tools/types.ts +2 -0
  542. package/src/util/browser.ts +25 -10
  543. package/src/util/bun-runtime.ts +172 -0
  544. package/src/util/logger.ts +1 -1
  545. package/src/util/platform.ts +50 -17
  546. package/src/watcher/providers/outlook-calendar.ts +343 -0
  547. package/src/watcher/providers/outlook.ts +198 -0
  548. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
  549. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
  550. package/src/workspace/migrations/025-remove-oauth-app-setup-skills.ts +76 -0
  551. package/src/workspace/migrations/026-backfill-install-meta.ts +325 -0
  552. package/src/workspace/migrations/027-remove-orphaned-optimized-images-cache.ts +42 -0
  553. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
  554. package/src/workspace/migrations/029-seed-pkb.ts +84 -0
  555. package/src/workspace/migrations/registry.ts +10 -0
  556. package/src/workspace/top-level-renderer.ts +5 -9
  557. package/src/__tests__/cli-memory.test.ts +0 -372
  558. package/src/__tests__/clipboard.test.ts +0 -88
  559. package/src/__tests__/context-memory-e2e.test.ts +0 -415
  560. package/src/__tests__/journal-context.test.ts +0 -268
  561. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -297
  562. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -459
  563. package/src/__tests__/memory-query-builder.test.ts +0 -59
  564. package/src/__tests__/memory-recall-quality.test.ts +0 -1046
  565. package/src/__tests__/memory-regressions.experimental.test.ts +0 -629
  566. package/src/__tests__/memory-regressions.test.ts +0 -3696
  567. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -295
  568. package/src/cli/cli-memory.ts +0 -176
  569. package/src/daemon/conversation-memory.ts +0 -207
  570. package/src/memory/conversation-starters-cadence.ts +0 -74
  571. package/src/memory/items-extractor.ts +0 -860
  572. package/src/memory/job-handlers/batch-extraction.ts +0 -753
  573. package/src/memory/job-handlers/extraction.ts +0 -40
  574. package/src/memory/job-handlers/journal-carry-forward.test.ts +0 -355
  575. package/src/memory/job-handlers/journal-carry-forward.ts +0 -255
  576. package/src/memory/journal-memory.ts +0 -224
  577. package/src/memory/query-builder.ts +0 -47
  578. package/src/memory/query-expansion.ts +0 -83
  579. package/src/memory/retriever.test.ts +0 -1592
  580. package/src/memory/retriever.ts +0 -1331
  581. package/src/memory/search/formatting.test.ts +0 -140
  582. package/src/memory/search/formatting.ts +0 -262
  583. package/src/memory/search/mmr.ts +0 -139
  584. package/src/memory/search/ranking.ts +0 -15
  585. package/src/memory/search/staleness.ts +0 -40
  586. package/src/memory/search/tier-classifier.ts +0 -18
  587. package/src/memory/search/types.ts +0 -121
  588. package/src/prompts/journal-context.ts +0 -154
  589. package/src/tools/memory/definitions.ts +0 -69
  590. package/src/tools/memory/handlers.test.ts +0 -562
  591. package/src/tools/memory/handlers.ts +0 -434
  592. package/src/util/clipboard.ts +0 -34
@@ -5,7 +5,6 @@ import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
5
5
  import { setRelayBroadcast } from "../calls/relay-server.js";
6
6
  import { TwilioConversationRelayProvider } from "../calls/twilio-provider.js";
7
7
  import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
8
- import { seedCliCommandMemories } from "../cli/cli-memory.js";
9
8
  import {
10
9
  getPlatformAssistantId,
11
10
  getQdrantHttpPortEnv,
@@ -32,6 +31,7 @@ import {
32
31
  awaitCesClientWithTimeout,
33
32
  DEFAULT_CES_STARTUP_TIMEOUT_MS,
34
33
  } from "../credential-execution/startup-timeout.js";
34
+ import { FilingService } from "../filing/filing-service.js";
35
35
  import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
36
36
  import { getHookManager } from "../hooks/manager.js";
37
37
  import { installTemplates } from "../hooks/templates.js";
@@ -82,7 +82,6 @@ import {
82
82
  setCesClient,
83
83
  setCesReconnect,
84
84
  } from "../security/secure-keys.js";
85
- import { seedCatalogSkillMemories } from "../skills/skill-memory.js";
86
85
  import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
87
86
  import { getDeviceId } from "../util/device-id.js";
88
87
  import { getLogger, initLogger } from "../util/logger.js";
@@ -124,6 +123,7 @@ import {
124
123
  } from "./handlers/conversations.js";
125
124
  import { installAssistantSymlink } from "./install-symlink.js";
126
125
  import type { ServerMessage } from "./message-protocol.js";
126
+ import { runProfilerSweep } from "./profiler-run-store.js";
127
127
  import {
128
128
  initializeProvidersAndTools,
129
129
  registerMessagingProviders,
@@ -279,151 +279,191 @@ export async function runDaemon(): Promise<void> {
279
279
  // workspace migrations (e.g. 009-backfill-conversation-disk-view)
280
280
  // depend on DB migrations having run (e.g. the inline-attachment-to-disk
281
281
  // backfill that populates attachment filePaths).
282
- initializeDb();
283
- // Seed well-known OAuth provider configurations (insert-if-not-exists)
284
- seedOAuthProviders();
285
- log.info("Daemon startup: DB initialized");
286
-
287
- await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
288
- log.info("Daemon startup: workspace migrations complete");
289
-
290
- // Backfill oauth_connection rows for manual-token providers (Telegram,
291
- // Slack channel) that already have stored credentials from before the
292
- // oauth_connection migration. Safe to call on every startup.
293
282
  //
294
- // Must run AFTER workspace migrations.
295
- // Otherwise syncManualTokenConnection sees no stored credentials and
296
- // incorrectly removes existing connection rows.
283
+ // If DB initialization fails (e.g. a migration error), the daemon
284
+ // continues in a degraded state DB-dependent features won't work but
285
+ // the HTTP server and config-based subsystems still start so the process
286
+ // remains reachable for health checks and diagnostics.
287
+ let dbReady = false;
297
288
  try {
298
- await backfillManualTokenConnections();
289
+ initializeDb();
290
+ dbReady = true;
291
+ log.info("Daemon startup: DB initialized");
299
292
  } catch (err) {
300
- log.warn(
293
+ log.error(
301
294
  { err },
302
- "Manual-token connection backfill failed — continuing startup",
295
+ "DB initialization failed — continuing startup in degraded mode",
303
296
  );
304
297
  }
305
298
 
306
- // Backfill injection templates on Slack bot token credentials so the
307
- // credential proxy can inject Authorization headers. Safe on every startup.
308
- try {
309
- backfillSlackInjectionTemplates();
310
- } catch (err) {
311
- log.warn(
312
- { err },
313
- "Slack injection template backfill failed — continuing startup",
314
- );
299
+ // Seed well-known OAuth provider configurations (insert-if-not-exists).
300
+ // Runs in its own try/catch so a seeding error doesn't force degraded mode
301
+ // when the DB itself initialized successfully.
302
+ if (dbReady) {
303
+ try {
304
+ seedOAuthProviders();
305
+ } catch (err) {
306
+ log.warn({ err }, "OAuth provider seeding failed — continuing startup");
307
+ }
315
308
  }
316
309
 
317
- // Now that workspace migrations have run (including 003-seed-device-id
318
- // which may copy the legacy installationId into device.json), it is safe
319
- // to read the device ID and set the Sentry tag.
320
- setSentryDeviceId(getDeviceId());
310
+ if (dbReady) {
311
+ await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
312
+ log.info("Daemon startup: workspace migrations complete");
321
313
 
322
- // Purge private (temporary) conversations from the previous daemon run.
323
- // These are ephemeral by design and should not survive daemon restarts.
324
- const { count: purgedCount, deletedMemory } = purgePrivateConversations();
325
- if (purgedCount > 0) {
326
- log.info(
327
- { purgedCount },
328
- `Purged ${purgedCount} private conversation(s) from previous daemon run`,
329
- );
330
- // Qdrant may not be ready at startup, so enqueue vector cleanup jobs
331
- // rather than attempting direct deletion.
332
- for (const segId of deletedMemory.segmentIds) {
333
- enqueueMemoryJob("delete_qdrant_vectors", {
334
- targetType: "segment",
335
- targetId: segId,
336
- });
314
+ // Profiler retention sweep prune completed profiler runs to stay
315
+ // within configured byte-count, run-count, and free-space budgets.
316
+ // Runs on every startup and is safe to call from explicit cleanup routes.
317
+ try {
318
+ const sweepResult = runProfilerSweep();
319
+ if (sweepResult.prunedCount > 0 || sweepResult.activeRunOverBudget) {
320
+ log.info(
321
+ {
322
+ prunedCount: sweepResult.prunedCount,
323
+ freedBytes: sweepResult.freedBytes,
324
+ activeRunOverBudget: sweepResult.activeRunOverBudget,
325
+ remainingRuns: sweepResult.remainingRuns,
326
+ },
327
+ "Profiler retention sweep completed on startup",
328
+ );
329
+ }
330
+ } catch (err) {
331
+ log.warn(
332
+ { err },
333
+ "Profiler retention sweep failed — continuing startup",
334
+ );
337
335
  }
338
- for (const itemId of deletedMemory.orphanedItemIds) {
339
- enqueueMemoryJob("delete_qdrant_vectors", {
340
- targetType: "item",
341
- targetId: itemId,
342
- });
336
+
337
+ // Backfill oauth_connection rows for manual-token providers (Telegram,
338
+ // Slack channel) that already have stored credentials from before the
339
+ // oauth_connection migration. Safe to call on every startup.
340
+ //
341
+ // Must run AFTER workspace migrations.
342
+ // Otherwise syncManualTokenConnection sees no stored credentials and
343
+ // incorrectly removes existing connection rows.
344
+ try {
345
+ await backfillManualTokenConnections();
346
+ } catch (err) {
347
+ log.warn(
348
+ { err },
349
+ "Manual-token connection backfill failed — continuing startup",
350
+ );
343
351
  }
344
- for (const summaryId of deletedMemory.deletedSummaryIds) {
345
- enqueueMemoryJob("delete_qdrant_vectors", {
346
- targetType: "summary",
347
- targetId: summaryId,
348
- });
352
+
353
+ // Backfill injection templates on Slack bot token credentials so the
354
+ // credential proxy can inject Authorization headers. Safe on every startup.
355
+ try {
356
+ backfillSlackInjectionTemplates();
357
+ } catch (err) {
358
+ log.warn(
359
+ { err },
360
+ "Slack injection template backfill failed — continuing startup",
361
+ );
349
362
  }
350
- if (
351
- deletedMemory.segmentIds.length > 0 ||
352
- deletedMemory.orphanedItemIds.length > 0 ||
353
- deletedMemory.deletedSummaryIds.length > 0
354
- ) {
363
+
364
+ // Now that workspace migrations have run (including 003-seed-device-id
365
+ // which may copy the legacy installationId into device.json), it is safe
366
+ // to read the device ID and set the Sentry tag.
367
+ setSentryDeviceId(getDeviceId());
368
+
369
+ // Purge private (temporary) conversations from the previous daemon run.
370
+ // These are ephemeral by design and should not survive daemon restarts.
371
+ const { count: purgedCount, deletedMemory } = purgePrivateConversations();
372
+ if (purgedCount > 0) {
355
373
  log.info(
356
- {
357
- segments: deletedMemory.segmentIds.length,
358
- orphanedItems: deletedMemory.orphanedItemIds.length,
359
- deletedSummaries: deletedMemory.deletedSummaryIds.length,
360
- },
361
- "Enqueued Qdrant vector cleanup jobs for purged private conversations",
374
+ { purgedCount },
375
+ `Purged ${purgedCount} private conversation(s) from previous daemon run`,
362
376
  );
377
+ // Qdrant may not be ready at startup, so enqueue vector cleanup jobs
378
+ // rather than attempting direct deletion.
379
+ for (const segId of deletedMemory.segmentIds) {
380
+ enqueueMemoryJob("delete_qdrant_vectors", {
381
+ targetType: "segment",
382
+ targetId: segId,
383
+ });
384
+ }
385
+ for (const summaryId of deletedMemory.deletedSummaryIds) {
386
+ enqueueMemoryJob("delete_qdrant_vectors", {
387
+ targetType: "summary",
388
+ targetId: summaryId,
389
+ });
390
+ }
391
+ if (
392
+ deletedMemory.segmentIds.length > 0 ||
393
+ deletedMemory.deletedSummaryIds.length > 0
394
+ ) {
395
+ log.info(
396
+ {
397
+ segments: deletedMemory.segmentIds.length,
398
+ deletedSummaries: deletedMemory.deletedSummaryIds.length,
399
+ },
400
+ "Enqueued Qdrant vector cleanup jobs for purged private conversations",
401
+ );
402
+ }
363
403
  }
364
- }
365
404
 
366
- // Expire stale pending canonical guardian requests left over from before
367
- // this process started. Two categories are cleaned up:
368
- //
369
- // 1. Interaction-bound kinds (tool_approval, pending_question) — their
370
- // in-memory pending-interaction session references are gone, so they
371
- // can never be completed.
372
- // 2. Any pending request whose expiresAt has already passed — persistent
373
- // kinds (access_request, tool_grant_request) that expired while the
374
- // daemon was stopped are transitioned so dedup logic doesn't return
375
- // stale rows.
376
- const expiredCount = expireAllPendingCanonicalRequests();
377
- if (expiredCount > 0) {
378
- log.info(
379
- { event: "startup_expired_stale_requests", expiredCount },
380
- `Expired ${expiredCount} stale canonical request(s) from previous process`,
381
- );
382
- }
405
+ // Expire stale pending canonical guardian requests left over from before
406
+ // this process started. Two categories are cleaned up:
407
+ //
408
+ // 1. Interaction-bound kinds (tool_approval, pending_question) — their
409
+ // in-memory pending-interaction session references are gone, so they
410
+ // can never be completed.
411
+ // 2. Any pending request whose expiresAt has already passed — persistent
412
+ // kinds (access_request, tool_grant_request) that expired while the
413
+ // daemon was stopped are transitioned so dedup logic doesn't return
414
+ // stale rows.
415
+ const expiredCount = expireAllPendingCanonicalRequests();
416
+ if (expiredCount > 0) {
417
+ log.info(
418
+ { event: "startup_expired_stale_requests", expiredCount },
419
+ `Expired ${expiredCount} stale canonical request(s) from previous process`,
420
+ );
421
+ }
383
422
 
384
- // Ensure a vellum guardian binding exists so the identity system works
385
- // without requiring a manual bootstrap step.
386
- try {
387
- ensureVellumGuardianBinding(DAEMON_INTERNAL_ASSISTANT_ID);
388
- } catch (err) {
389
- log.warn(
390
- { err },
391
- "Vellum guardian binding backfill failed — continuing startup",
392
- );
393
- }
423
+ // Ensure a vellum guardian binding exists so the identity system works
424
+ // without requiring a manual bootstrap step.
425
+ try {
426
+ ensureVellumGuardianBinding(DAEMON_INTERNAL_ASSISTANT_ID);
427
+ } catch (err) {
428
+ log.warn(
429
+ { err },
430
+ "Vellum guardian binding backfill failed — continuing startup",
431
+ );
432
+ }
394
433
 
395
- try {
396
- syncUpdateBulletinOnStartup();
397
- } catch (err) {
398
- log.warn({ err }, "Bulletin sync failed — continuing startup");
399
- }
434
+ try {
435
+ syncUpdateBulletinOnStartup();
436
+ } catch (err) {
437
+ log.warn({ err }, "Bulletin sync failed — continuing startup");
438
+ }
400
439
 
401
- // Recover orphaned work items that were left in 'running' state when the
402
- // daemon previously crashed or was killed mid-task.
403
- const orphanedRunning = listWorkItems({ status: "running" });
404
- if (orphanedRunning.length > 0) {
405
- for (const item of orphanedRunning) {
406
- updateWorkItem(item.id, {
407
- status: "failed",
408
- lastRunStatus: "interrupted",
409
- });
440
+ // Recover orphaned work items that were left in 'running' state when the
441
+ // daemon previously crashed or was killed mid-task.
442
+ const orphanedRunning = listWorkItems({ status: "running" });
443
+ if (orphanedRunning.length > 0) {
444
+ for (const item of orphanedRunning) {
445
+ updateWorkItem(item.id, {
446
+ status: "failed",
447
+ lastRunStatus: "interrupted",
448
+ });
449
+ log.info(
450
+ { workItemId: item.id, title: item.title },
451
+ "Recovered orphaned running work item → failed (interrupted)",
452
+ );
453
+ }
410
454
  log.info(
411
- { workItemId: item.id, title: item.title },
412
- "Recovered orphaned running work item → failed (interrupted)",
455
+ { count: orphanedRunning.length },
456
+ "Recovered orphaned running work items",
413
457
  );
414
458
  }
415
- log.info(
416
- { count: orphanedRunning.length },
417
- "Recovered orphaned running work items",
418
- );
419
- }
420
459
 
421
- try {
422
- const twilioProvider = new TwilioConversationRelayProvider();
423
- await reconcileCallsOnStartup(twilioProvider, log);
424
- } catch (err) {
425
- log.warn({ err }, "Call recovery failed — continuing startup");
426
- }
460
+ try {
461
+ const twilioProvider = new TwilioConversationRelayProvider();
462
+ await reconcileCallsOnStartup(twilioProvider, log);
463
+ } catch (err) {
464
+ log.warn({ err }, "Call recovery failed — continuing startup");
465
+ }
466
+ } // end if (dbReady)
427
467
 
428
468
  // Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
429
469
  // into the workspace config file before the first loadConfig() call so
@@ -642,18 +682,38 @@ export async function runDaemon(): Promise<void> {
642
682
  log.info("Daemon startup: starting memory worker");
643
683
  bgRefs.memoryWorker = startMemoryJobsWorker();
644
684
 
645
- // Seed capability memories for all enabled skills so the memory
646
- // pipeline can surface relevant skills via semantic search.
685
+ // Seed capability graph nodes (new memory graph system)
647
686
  try {
648
- seedCatalogSkillMemories();
687
+ const {
688
+ seedSkillGraphNodes,
689
+ seedCliGraphNodes,
690
+ seedUninstalledCatalogSkillMemories,
691
+ } = await import("../memory/graph/capability-seed.js");
692
+ seedSkillGraphNodes();
693
+ seedCliGraphNodes();
694
+ void seedUninstalledCatalogSkillMemories().catch((err) =>
695
+ log.warn(
696
+ { err },
697
+ "Uninstalled catalog skill memory seeding failed — continuing",
698
+ ),
699
+ );
649
700
  } catch (err) {
650
- log.warn({ err }, "Catalog skill memory seeding failed — continuing");
701
+ log.warn({ err }, "Graph capability seeding failed — continuing");
651
702
  }
652
703
 
704
+ // Auto-bootstrap: if the graph has no non-procedural nodes but historical
705
+ // segments exist, enqueue a one-time graph_bootstrap job to populate the
706
+ // graph from conversation history and journal files.
653
707
  try {
654
- seedCliCommandMemories();
708
+ const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
709
+ await import("../memory/graph/bootstrap.js");
710
+ maybeEnqueueGraphBootstrap();
711
+ // Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
712
+ void cleanupStaleItemVectors().catch((err) =>
713
+ log.warn({ err }, "Stale item vector cleanup failed — continuing"),
714
+ );
655
715
  } catch (err) {
656
- log.warn({ err }, "CLI command memory seeding failed — continuing");
716
+ log.warn({ err }, "Graph bootstrap check failed — continuing");
657
717
  }
658
718
  }
659
719
 
@@ -810,8 +870,8 @@ export async function runDaemon(): Promise<void> {
810
870
  guardianFollowUpConversationGenerator:
811
871
  createGuardianFollowUpConversationGenerator(),
812
872
  sendMessageDeps: {
813
- getOrCreateConversation: (conversationId) =>
814
- server.getConversationForMessages(conversationId),
873
+ getOrCreateConversation: (conversationId, options) =>
874
+ server.getConversationForMessages(conversationId, options),
815
875
  assistantEventHub,
816
876
  resolveAttachments: (attachmentIds) => {
817
877
  const resolved = attachmentsStore.getAttachmentsByIds(attachmentIds, {
@@ -1187,6 +1247,26 @@ export async function runDaemon(): Promise<void> {
1187
1247
  "Heartbeat service configured",
1188
1248
  );
1189
1249
 
1250
+ const filingConfig = config.filing;
1251
+ const filing = new FilingService({
1252
+ processMessage: (conversationId, content, options) =>
1253
+ server.processMessage(conversationId, content, undefined, {
1254
+ trustContext: {
1255
+ sourceChannel: "vellum",
1256
+ trustClass: "guardian",
1257
+ },
1258
+ ...options,
1259
+ }),
1260
+ });
1261
+ filing.start();
1262
+ log.info(
1263
+ {
1264
+ enabled: filingConfig.enabled,
1265
+ intervalMs: filingConfig.intervalMs,
1266
+ },
1267
+ "Filing service configured",
1268
+ );
1269
+
1190
1270
  // Retrieve the MCP manager if MCP servers were configured.
1191
1271
  // The manager is a singleton created during initializeProvidersAndTools().
1192
1272
  const mcpManager =
@@ -1198,6 +1278,7 @@ export async function runDaemon(): Promise<void> {
1198
1278
  server,
1199
1279
  workspaceHeartbeat,
1200
1280
  heartbeat,
1281
+ filing,
1201
1282
  hookManager,
1202
1283
  runtimeHttp,
1203
1284
  scheduler,
@@ -1,9 +1,13 @@
1
1
  #!/usr/bin/env bun
2
2
  process.title = "vellum-daemon";
3
3
 
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+
4
7
  import * as Sentry from "@sentry/node";
5
8
 
6
9
  import { getLogger } from "../util/logger.js";
10
+ import { getDataDir } from "../util/platform.js";
7
11
  import { runDaemon } from "./lifecycle.js";
8
12
  import { emitDaemonError } from "./startup-error.js";
9
13
 
@@ -21,7 +25,7 @@ runDaemon().catch(async (err) => {
21
25
  }
22
26
  console.error("Failed to start assistant:", err);
23
27
  console.error(
24
- "Troubleshooting: check if another assistant is already running, verify ~/.vellum/ permissions, and review logs at ~/.vellum/workspace/data/logs/",
28
+ `Troubleshooting: check if another assistant is already running, verify ${join(homedir(), ".vellum")} permissions, and review logs at ${getDataDir()}/logs/`,
25
29
  );
26
30
  // Emit a structured error line as the last line of stderr so consumers
27
31
  // (e.g. the macOS app) can parse it reliably.
@@ -14,12 +14,10 @@ export interface ConversationListRequest {
14
14
  limit?: number;
15
15
  }
16
16
 
17
- /** Lightweight conversation transport metadata for channel identity and natural-language guidance. */
18
- export interface ConversationTransportMetadata {
17
+ /** Shared fields for all transport metadata variants. */
18
+ interface BaseTransportMetadata {
19
19
  /** Logical channel identifier (e.g. "desktop", "telegram", "mobile"). */
20
20
  channelId: ChannelId;
21
- /** Interface identifier for this transport (e.g. "macos", "ios", "cli"). */
22
- interfaceId?: InterfaceId;
23
21
  /** Optional natural-language hints for channel-specific UX behavior. */
24
22
  hints?: string[];
25
23
  /** Optional concise UX brief for this channel. */
@@ -28,6 +26,27 @@ export interface ConversationTransportMetadata {
28
26
  chatType?: string;
29
27
  }
30
28
 
29
+ /** Transport metadata for macOS desktop clients, including host environment fields. */
30
+ export interface MacosTransportMetadata extends BaseTransportMetadata {
31
+ /** Interface identifier for macOS transport. */
32
+ interfaceId: "macos";
33
+ /** Home directory of the host macOS user. */
34
+ hostHomeDir?: string;
35
+ /** Username of the host macOS user. */
36
+ hostUsername?: string;
37
+ }
38
+
39
+ /** Transport metadata for non-macOS transports. */
40
+ export interface NonMacosTransportMetadata extends BaseTransportMetadata {
41
+ /** Interface identifier for this transport (e.g. "ios", "cli"). */
42
+ interfaceId?: Exclude<InterfaceId, "macos">;
43
+ }
44
+
45
+ /** Lightweight conversation transport metadata for channel identity and natural-language guidance. */
46
+ export type ConversationTransportMetadata =
47
+ | MacosTransportMetadata
48
+ | NonMacosTransportMetadata;
49
+
31
50
  export interface ConversationCreateRequest {
32
51
  type: "conversation_create";
33
52
  title?: string;
@@ -264,8 +283,10 @@ export interface HistoryResponseToolCall {
264
283
  input: Record<string, unknown>;
265
284
  result?: string;
266
285
  isError?: boolean;
267
- /** Base64-encoded image data from tool contentBlocks (e.g. browser_screenshot). */
286
+ /** Base64-encoded image data from tool contentBlocks (e.g. browser_screenshot). @deprecated Use imageDataList. */
268
287
  imageData?: string;
288
+ /** Base64-encoded image data from tool contentBlocks (e.g. browser_screenshot, image generation). */
289
+ imageDataList?: string[];
269
290
  /** Unix ms when the tool started executing. */
270
291
  startedAt?: number;
271
292
  /** Unix ms when the tool completed. */
@@ -308,11 +329,11 @@ export interface HistoryResponse {
308
329
  contentOrder?: string[];
309
330
  /** UI surfaces (widgets) embedded in the message. */
310
331
  surfaces?: HistoryResponseSurface[];
311
- /** Present when this message is a subagent lifecycle notification (completed/failed/aborted). */
332
+ /** Present when this message is a subagent lifecycle notification (running/completed/failed/aborted). */
312
333
  subagentNotification?: {
313
334
  subagentId: string;
314
335
  label: string;
315
- status: "completed" | "failed" | "aborted";
336
+ status: "running" | "completed" | "failed" | "aborted";
316
337
  error?: string;
317
338
  conversationId?: string;
318
339
  };
@@ -370,6 +391,7 @@ export interface ContextCompacted {
370
391
  export type ConversationErrorCode =
371
392
  | "PROVIDER_NETWORK"
372
393
  | "PROVIDER_RATE_LIMIT"
394
+ | "PROVIDER_OVERLOADED"
373
395
  | "PROVIDER_API"
374
396
  | "PROVIDER_BILLING"
375
397
  | "PROVIDER_ORDERING"
@@ -124,8 +124,10 @@ export interface ToolResult {
124
124
  };
125
125
  status?: string;
126
126
  conversationId?: string;
127
- /** Base64-encoded image data extracted from contentBlocks (e.g. browser_screenshot). */
127
+ /** Base64-encoded image data extracted from contentBlocks (e.g. browser_screenshot). @deprecated Use imageDataList. */
128
128
  imageData?: string;
129
+ /** Base64-encoded image data extracted from contentBlocks (e.g. browser_screenshot, image generation). */
130
+ imageDataList?: string[];
129
131
  /** The tool_use block ID for client-side correlation. */
130
132
  toolUseId?: string;
131
133
  }
@@ -306,6 +308,13 @@ export interface AssistantActivityState {
306
308
  statusText?: string;
307
309
  }
308
310
 
311
+ /** Broadcast to clients when the two-axis permission mode changes. */
312
+ export interface PermissionModeUpdate {
313
+ type: "permission_mode_update";
314
+ askBeforeActing: boolean;
315
+ hostAccess: boolean;
316
+ }
317
+
309
318
  export type TraceEventKind =
310
319
  | "request_received"
311
320
  | "request_queued"
@@ -367,4 +376,5 @@ export type _MessagesServerMessages =
367
376
  | SuggestionResponse
368
377
  | TraceEvent
369
378
  | ConfirmationStateChanged
370
- | AssistantActivityState;
379
+ | AssistantActivityState
380
+ | PermissionModeUpdate;
@@ -74,6 +74,7 @@ export interface SchedulesListResponse {
74
74
  mode: string;
75
75
  status: string;
76
76
  routingIntent: string;
77
+ reuseConversation: boolean;
77
78
  isOneShot: boolean;
78
79
  }>;
79
80
  }
@@ -34,6 +34,11 @@ export interface AvatarUpdated {
34
34
  avatarPath: string;
35
35
  }
36
36
 
37
+ /** Sent by the daemon when sounds config or sound files change on disk. */
38
+ export interface SoundsConfigUpdated {
39
+ type: "sounds_config_updated";
40
+ }
41
+
37
42
  /** Response to a generate_avatar request indicating success or failure. */
38
43
  export interface GenerateAvatarResponse {
39
44
  type: "generate_avatar_response";
@@ -51,4 +56,5 @@ export type _SettingsClientMessages =
51
56
  export type _SettingsServerMessages =
52
57
  | ClientSettingsUpdate
53
58
  | AvatarUpdated
59
+ | SoundsConfigUpdated
54
60
  | GenerateAvatarResponse;