@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
@@ -1,5 +1,4 @@
1
1
  import { existsSync, unlinkSync } from "node:fs";
2
- import { join } from "node:path";
3
2
 
4
3
  import { buildAssistantEvent } from "../../../../runtime/assistant-event.js";
5
4
  import { assistantEventHub } from "../../../../runtime/assistant-event-hub.js";
@@ -9,7 +8,7 @@ import type {
9
8
  ToolExecutionResult,
10
9
  } from "../../../../tools/types.js";
11
10
  import { getLogger } from "../../../../util/logger.js";
12
- import { getWorkspaceDir } from "../../../../util/platform.js";
11
+ import { getAvatarImagePath } from "../../../../util/platform.js";
13
12
  import { updateIdentityAvatarSection } from "./identity-avatar.js";
14
13
 
15
14
  const log = getLogger("avatar-remove");
@@ -18,8 +17,7 @@ export async function run(
18
17
  _input: Record<string, unknown>,
19
18
  _context: ToolContext,
20
19
  ): Promise<ToolExecutionResult> {
21
- const avatarDir = join(getWorkspaceDir(), "data", "avatar");
22
- const avatarPath = join(avatarDir, "avatar-image.png");
20
+ const avatarPath = getAvatarImagePath();
23
21
 
24
22
  if (!existsSync(avatarPath)) {
25
23
  return {
@@ -9,14 +9,17 @@ import type {
9
9
  ToolExecutionResult,
10
10
  } from "../../../../tools/types.js";
11
11
  import { getLogger } from "../../../../util/logger.js";
12
- import { getWorkspaceDir } from "../../../../util/platform.js";
12
+ import {
13
+ getAvatarImagePath,
14
+ getWorkspaceDir,
15
+ } from "../../../../util/platform.js";
13
16
  import { updateIdentityAvatarSection } from "./identity-avatar.js";
14
17
 
15
18
  const log = getLogger("avatar-update");
16
19
 
17
20
  /** Canonical path where the custom avatar PNG is stored. */
18
21
  function getAvatarPath(): string {
19
- return join(getWorkspaceDir(), "data", "avatar", "avatar-image.png");
22
+ return getAvatarImagePath();
20
23
  }
21
24
 
22
25
  export async function run(
@@ -68,13 +68,9 @@ When you need to send a DM or look up a Slack user by name, check contacts first
68
68
 
69
69
  1. **Before calling `users.list`**: Use `contact_search` with `query: "<name>"` and `channel_type: "slack"`. If a matching contact has `externalUserId` (Slack user ID) and `externalChatId` (DM channel ID), skip the API lookups and use those IDs directly with `chat.postMessage`.
70
70
 
71
- 2. **After resolving via API**: When you had to call `users.list` or `conversations.open` to resolve a user, save the mapping with `contact_upsert` so future lookups are instant:
72
- ```
73
- contact_upsert {
74
- display_name: "<display name>"
75
- channels: [{ type: "slack", address: "<slack handle>", external_user_id: "<U...>", external_chat_id: "<D...>" }]
76
- }
77
- ```
71
+ When `contact_search` returns notes for the recipient, use them to inform the message's tone, formality, and content. Contact notes capture relationship context and communication preferences that should shape how you write to this person.
72
+
73
+ 2. **After resolving via API**: When you had to call `users.list` or `conversations.open` to resolve a user, save the contact with `contact_upsert` so you can find them by name next time. External Slack IDs (user ID, DM channel ID) are cached automatically by the messaging layer and should not be passed through `contact_upsert`.
78
74
 
79
75
  ## Privacy Rules
80
76
 
@@ -6,6 +6,9 @@ metadata:
6
6
  emoji: "🤖"
7
7
  vellum:
8
8
  display-name: "Subagent"
9
+ activation-hints:
10
+ - "Run tasks in parallel, delegate work to background agents, or do multiple things at once"
11
+ - "Spawn a researcher, coder, or planner agent for independent work"
9
12
  ---
10
13
 
11
14
  Subagent orchestration -- spawn background agents to work on tasks in parallel.
@@ -14,9 +17,43 @@ Subagent orchestration -- spawn background agents to work on tasks in parallel.
14
17
 
15
18
  Subagents follow this status flow: `pending` -> `running` -> `completed` / `failed` / `aborted`
16
19
 
17
- - **Spawn**: Use `subagent_spawn` with a label and objective. The subagent runs autonomously.
18
- - **Auto-notification**: The parent conversation is automatically notified when a subagent reaches a terminal status. Do NOT poll `subagent_status`.
19
- - **Read output**: Use `subagent_read` only after the subagent reaches a terminal status (completed/failed/aborted).
20
+ - **Spawn**: Use `subagent_spawn` with a label, objective, and role. The subagent runs autonomously.
21
+ - **Mid-run communication**: Subagents can send notifications to the parent via `notify_parent` while still running -- useful for sharing interim findings or signaling that they are blocked.
22
+ - **Auto-notification**: The parent conversation is automatically notified when a subagent reaches a terminal status (completed/failed/aborted). Do NOT poll `subagent_status`.
23
+ - **Read output**: Use `subagent_read` after the subagent reaches a terminal status to retrieve its full output.
24
+
25
+ ## Roles
26
+
27
+ Each subagent is spawned with a role that determines its tool access. Choose the most restrictive role that can accomplish the task.
28
+
29
+ | Role | Tools | When to use |
30
+ |---|---|---|
31
+ | `general` | Full tool access | Task genuinely needs unrestricted capabilities (rare -- prefer a specialized role) |
32
+ | `researcher` | `web_search`, `web_fetch`, `file_read`, `file_list`, `recall`, `notify_parent` | Information gathering, web research, codebase exploration, reading documentation |
33
+ | `coder` | `bash`, `file_read`, `file_write`, `file_edit`, `web_search`, `recall`, `notify_parent` | Code changes, file editing, running commands, build/test tasks |
34
+ | `planner` | `file_read`, `file_list`, `web_search`, `web_fetch`, `recall`, `notify_parent` | Analysis, planning, synthesizing information, reviewing approaches |
35
+
36
+ All specialized roles (`researcher`, `coder`, `planner`) include `notify_parent` for mid-run communication with the parent.
37
+
38
+ ## Parent Communication
39
+
40
+ Subagents use `notify_parent` to send messages to the parent conversation while still running. Each notification has an urgency level:
41
+
42
+ - **`info`** -- Progress updates, minor findings. The parent is informed but does not need to act.
43
+ - **`important`** -- Key findings, significant results. The parent should review when convenient.
44
+ - **`blocked`** -- The subagent needs guidance or a decision from the parent to continue.
45
+
46
+ Use notifications judiciously -- one per major finding or milestone. Do not send a notification for every small step.
47
+
48
+ ## Naming
49
+
50
+ Subagents can be referenced by label instead of UUID. The `label` parameter is accepted on `subagent_message`, `subagent_status`, `subagent_read`, and `subagent_abort` as an alternative to `subagent_id`. Label lookup is case-insensitive.
51
+
52
+ Use descriptive labels when spawning subagents (e.g., "research-auth-libraries", "implement-login-form") so they are easy to reference later.
53
+
54
+ ## Reading Output
55
+
56
+ `subagent_read` returns the subagent's assistant text output. Use the `last_n` parameter to retrieve only the most recent N assistant messages instead of the full history. This is useful for large outputs where you only need the final result.
20
57
 
21
58
  ## Ownership
22
59
 
@@ -29,5 +66,8 @@ Set `send_result_to_user: false` when spawning a subagent whose result is for in
29
66
  ## Tips
30
67
 
31
68
  - Do NOT poll `subagent_status` in a loop. You will be notified automatically when a subagent completes.
69
+ - Use roles to scope tool access and minimize blast radius. Default to the most restrictive role that works.
70
+ - Spawn a `researcher` and `coder` in parallel for research-then-implement workflows -- the researcher gathers context while the coder starts on the known parts.
71
+ - Use `notify_parent` for interim findings instead of waiting for completion. This lets the parent act on partial results early.
32
72
  - Use `subagent_message` to send follow-up instructions to a running subagent.
33
73
  - Use `subagent_abort` to cancel a subagent that is no longer needed.
@@ -25,6 +25,11 @@
25
25
  "type": "boolean",
26
26
  "description": "Whether to present the subagent's result to the user when it completes. Defaults to true. Set to false for internal/silent processing."
27
27
  },
28
+ "role": {
29
+ "type": "string",
30
+ "enum": ["general", "researcher", "coder", "planner"],
31
+ "description": "Agent specialization that controls tool access. 'researcher': read-only (web, files, memory). 'coder': file and bash access. 'planner': read-only analysis. 'general': full access (default)."
32
+ },
28
33
  "activity": {
29
34
  "type": "string",
30
35
  "description": "Brief non-technical explanation of why this tool is being called"
@@ -47,6 +52,10 @@
47
52
  "type": "string",
48
53
  "description": "Optional subagent ID to query. If omitted, returns all subagents for this conversation."
49
54
  },
55
+ "label": {
56
+ "type": "string",
57
+ "description": "The label of the subagent (alternative to subagent_id). Case-insensitive."
58
+ },
50
59
  "activity": {
51
60
  "type": "string",
52
61
  "description": "Brief non-technical explanation of why this tool is being called"
@@ -59,7 +68,7 @@
59
68
  },
60
69
  {
61
70
  "name": "subagent_abort",
62
- "description": "Abort a running subagent by ID.",
71
+ "description": "Abort a running subagent by ID or label.",
63
72
  "category": "orchestration",
64
73
  "risk": "low",
65
74
  "input_schema": {
@@ -69,12 +78,16 @@
69
78
  "type": "string",
70
79
  "description": "The ID of the subagent to abort."
71
80
  },
81
+ "label": {
82
+ "type": "string",
83
+ "description": "The label of the subagent (alternative to subagent_id). Case-insensitive."
84
+ },
72
85
  "activity": {
73
86
  "type": "string",
74
87
  "description": "Brief non-technical explanation of why this tool is being called"
75
88
  }
76
89
  },
77
- "required": ["subagent_id"]
90
+ "required": []
78
91
  },
79
92
  "executor": "tools/subagent-abort.ts",
80
93
  "execution_target": "host"
@@ -91,6 +104,10 @@
91
104
  "type": "string",
92
105
  "description": "The ID of the subagent to send a message to."
93
106
  },
107
+ "label": {
108
+ "type": "string",
109
+ "description": "The label of the subagent (alternative to subagent_id). Case-insensitive."
110
+ },
94
111
  "content": {
95
112
  "type": "string",
96
113
  "description": "The message content to send to the subagent."
@@ -100,7 +117,7 @@
100
117
  "description": "Brief non-technical explanation of why this tool is being called"
101
118
  }
102
119
  },
103
- "required": ["subagent_id", "content"]
120
+ "required": ["content"]
104
121
  },
105
122
  "executor": "tools/subagent-message.ts",
106
123
  "execution_target": "host"
@@ -117,12 +134,20 @@
117
134
  "type": "string",
118
135
  "description": "The ID of the subagent whose output to read."
119
136
  },
137
+ "label": {
138
+ "type": "string",
139
+ "description": "The label of the subagent (alternative to subagent_id). Case-insensitive."
140
+ },
141
+ "last_n": {
142
+ "type": "integer",
143
+ "description": "Number of recent assistant messages to return. Omit to return all messages (current behavior)."
144
+ },
120
145
  "activity": {
121
146
  "type": "string",
122
147
  "description": "Brief non-technical explanation of why this tool is being called"
123
148
  }
124
149
  },
125
- "required": ["subagent_id"]
150
+ "required": []
126
151
  },
127
152
  "executor": "tools/subagent-read.ts",
128
153
  "execution_target": "host"
@@ -56,7 +56,7 @@ import * as contactMerge from "./bundled-skills/contacts/tools/contact-merge.js"
56
56
  import * as contactSearch from "./bundled-skills/contacts/tools/contact-search.js";
57
57
  import * as contactUpsert from "./bundled-skills/contacts/tools/contact-upsert.js";
58
58
  import * as googleContacts from "./bundled-skills/contacts/tools/google-contacts.js";
59
- // ── conversations ─────────────────────────────────────────────────────────────
59
+ // ── conversations ──────────────────────────────────────────────────────────────
60
60
  import * as renameConversation from "./bundled-skills/conversations/tools/rename-conversation.js";
61
61
  // ── document ───────────────────────────────────────────────────────────────────
62
62
  import * as documentCreate from "./bundled-skills/document/tools/document-create.js";
@@ -107,6 +107,25 @@ import * as messagingSend from "./bundled-skills/messaging/tools/messaging-send.
107
107
  import * as messagingSenderDigest from "./bundled-skills/messaging/tools/messaging-sender-digest.js";
108
108
  // ── notifications ──────────────────────────────────────────────────────────────
109
109
  import * as sendNotification from "./bundled-skills/notifications/tools/send-notification.js";
110
+ // ── outlook ────────────────────────────────────────────────────────────────────
111
+ import * as outlookAttachments from "./bundled-skills/outlook/tools/outlook-attachments.js";
112
+ import * as outlookCategories from "./bundled-skills/outlook/tools/outlook-categories.js";
113
+ import * as outlookDraft from "./bundled-skills/outlook/tools/outlook-draft.js";
114
+ import * as outlookFollowUp from "./bundled-skills/outlook/tools/outlook-follow-up.js";
115
+ import * as outlookForward from "./bundled-skills/outlook/tools/outlook-forward.js";
116
+ import * as outlookOutreachScan from "./bundled-skills/outlook/tools/outlook-outreach-scan.js";
117
+ import * as outlookRules from "./bundled-skills/outlook/tools/outlook-rules.js";
118
+ import * as outlookSendDraft from "./bundled-skills/outlook/tools/outlook-send-draft.js";
119
+ import * as outlookSenderDigest from "./bundled-skills/outlook/tools/outlook-sender-digest.js";
120
+ import * as outlookTrash from "./bundled-skills/outlook/tools/outlook-trash.js";
121
+ import * as outlookUnsubscribe from "./bundled-skills/outlook/tools/outlook-unsubscribe.js";
122
+ import * as outlookVacation from "./bundled-skills/outlook/tools/outlook-vacation.js";
123
+ // ── outlook-calendar ───────────────────────────────────────────────────────────
124
+ import * as outlookCalendarCheckAvailability from "./bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.js";
125
+ import * as outlookCalendarCreateEvent from "./bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.js";
126
+ import * as outlookCalendarGetEvent from "./bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.js";
127
+ import * as outlookCalendarListEvents from "./bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.js";
128
+ import * as outlookCalendarRsvp from "./bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.js";
110
129
  // ── phone-calls ────────────────────────────────────────────────────────────────
111
130
  import * as callEnd from "./bundled-skills/phone-calls/tools/call-end.js";
112
131
  import * as callStart from "./bundled-skills/phone-calls/tools/call-start.js";
@@ -290,6 +309,39 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
290
309
  // notifications
291
310
  ["notifications:tools/send-notification.ts", sendNotification],
292
311
 
312
+ // outlook
313
+ ["outlook:tools/outlook-rules.ts", outlookRules],
314
+ ["outlook:tools/outlook-vacation.ts", outlookVacation],
315
+ ["outlook:tools/outlook-sender-digest.ts", outlookSenderDigest],
316
+ ["outlook:tools/outlook-outreach-scan.ts", outlookOutreachScan],
317
+ ["outlook:tools/outlook-draft.ts", outlookDraft],
318
+ ["outlook:tools/outlook-send-draft.ts", outlookSendDraft],
319
+ ["outlook:tools/outlook-forward.ts", outlookForward],
320
+ ["outlook:tools/outlook-trash.ts", outlookTrash],
321
+ ["outlook:tools/outlook-categories.ts", outlookCategories],
322
+ ["outlook:tools/outlook-follow-up.ts", outlookFollowUp],
323
+ ["outlook:tools/outlook-unsubscribe.ts", outlookUnsubscribe],
324
+ ["outlook:tools/outlook-attachments.ts", outlookAttachments],
325
+
326
+ // outlook-calendar
327
+ [
328
+ "outlook-calendar:tools/outlook-calendar-list-events.ts",
329
+ outlookCalendarListEvents,
330
+ ],
331
+ [
332
+ "outlook-calendar:tools/outlook-calendar-get-event.ts",
333
+ outlookCalendarGetEvent,
334
+ ],
335
+ [
336
+ "outlook-calendar:tools/outlook-calendar-create-event.ts",
337
+ outlookCalendarCreateEvent,
338
+ ],
339
+ [
340
+ "outlook-calendar:tools/outlook-calendar-check-availability.ts",
341
+ outlookCalendarCheckAvailability,
342
+ ],
343
+ ["outlook-calendar:tools/outlook-calendar-rsvp.ts", outlookCalendarRsvp],
344
+
293
345
  // phone-calls
294
346
  ["phone-calls:tools/call-start.ts", callStart],
295
347
  ["phone-calls:tools/call-status.ts", callStatus],
@@ -322,12 +374,12 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
322
374
  ["sequences:tools/sequence-analytics.ts", sequenceAnalytics],
323
375
 
324
376
  // settings
325
- ["settings:tools/avatar-get.ts", avatarGet],
326
- ["settings:tools/avatar-update.ts", avatarUpdate],
327
- ["settings:tools/avatar-remove.ts", avatarRemove],
328
377
  ["settings:tools/voice-config-update.ts", voiceConfigUpdate],
329
378
  ["settings:tools/open-system-settings.ts", openSystemSettings],
330
379
  ["settings:tools/navigate-settings-tab.ts", navigateSettingsTab],
380
+ ["settings:tools/avatar-update.ts", avatarUpdate],
381
+ ["settings:tools/avatar-remove.ts", avatarRemove],
382
+ ["settings:tools/avatar-get.ts", avatarGet],
331
383
 
332
384
  // skill-management
333
385
  ["skill-management:tools/scaffold-managed.ts", scaffoldManaged],
@@ -24,6 +24,13 @@ function flag(name: string): boolean {
24
24
  return raw === "true" || raw === "1";
25
25
  }
26
26
 
27
+ function int(name: string): number | undefined {
28
+ const raw = str(name);
29
+ if (raw === undefined) return undefined;
30
+ const n = parseInt(raw, 10);
31
+ return Number.isFinite(n) ? n : undefined;
32
+ }
33
+
27
34
  // ── Registry ─────────────────────────────────────────────────────────────────
28
35
  // Each entry documents the env var name, type, default, and purpose.
29
36
 
@@ -45,17 +52,24 @@ export function getIsContainerized(): boolean {
45
52
  }
46
53
 
47
54
  /**
48
- * Whether this assistant is running as a platform-managed remote instance.
55
+ * IS_PLATFORM boolean, default: false
56
+ * When true, indicates the assistant is running as a platform-managed
57
+ * remote instance. Controls platform-specific behaviors like webhook
58
+ * callback registration and blocking `platform disconnect`.
49
59
  *
50
- * Currently this is determined solely by the IS_CONTAINERIZED env var, which
51
- * the platform sets when provisioning assistant containers. This is not ideal
52
- * because any Docker environment could set it. We plan to replace this with a
53
- * less spoof-able mechanism in the future — e.g. a signed platform token
54
- * verified via asymmetric cryptography or an authenticated attestation
55
- * endpoint on the platform.
60
+ * Separate from IS_CONTAINERIZED because local Docker assistants are
61
+ * containerized (need CES sidecar, gateway trust store, etc.) but are
62
+ * not platform-managed.
63
+ */
64
+ export function getIsPlatform(): boolean {
65
+ return flag("IS_PLATFORM");
66
+ }
67
+
68
+ /**
69
+ * Whether this assistant is running as a platform-managed remote instance.
56
70
  */
57
71
  export function isPlatformRemote(): boolean {
58
- return getIsContainerized();
72
+ return getIsPlatform();
59
73
  }
60
74
 
61
75
  /**
@@ -67,6 +81,57 @@ export function getWorkspaceDirOverride(): string | undefined {
67
81
  return str("VELLUM_WORKSPACE_DIR");
68
82
  }
69
83
 
84
+ // ── Profiler env vars ───────────────────────────────────────────────────
85
+ // These are injected by the platform when running a managed assistant in
86
+ // profiler mode. The runtime uses them to locate, scope, and budget-limit
87
+ // profiler output on the workspace volume.
88
+
89
+ /**
90
+ * VELLUM_PROFILER_RUN_ID — string, default: undefined
91
+ * Unique identifier for the current profiler run. When set, the profiler
92
+ * run store treats this run as "active" and will never prune its directory.
93
+ */
94
+ export function getProfilerRunId(): string | undefined {
95
+ return str("VELLUM_PROFILER_RUN_ID");
96
+ }
97
+
98
+ /**
99
+ * VELLUM_PROFILER_MODE — string, default: undefined
100
+ * The profiling mode to activate (e.g. "cpu", "heap", "cpu+heap").
101
+ * When unset, profiling is disabled.
102
+ */
103
+ export function getProfilerMode(): string | undefined {
104
+ return str("VELLUM_PROFILER_MODE");
105
+ }
106
+
107
+ /**
108
+ * VELLUM_PROFILER_MAX_BYTES — integer, default: undefined
109
+ * Maximum total bytes retained across all profiler runs (including active).
110
+ * The startup sweep prunes oldest completed runs to stay within budget.
111
+ */
112
+ export function getProfilerMaxBytes(): number | undefined {
113
+ return int("VELLUM_PROFILER_MAX_BYTES");
114
+ }
115
+
116
+ /**
117
+ * VELLUM_PROFILER_MAX_RUNS — integer, default: undefined
118
+ * Maximum number of completed profiler runs retained on disk.
119
+ * The startup sweep prunes oldest completed runs to stay within budget.
120
+ */
121
+ export function getProfilerMaxRuns(): number | undefined {
122
+ return int("VELLUM_PROFILER_MAX_RUNS");
123
+ }
124
+
125
+ /**
126
+ * VELLUM_PROFILER_MIN_FREE_MB — integer, default: undefined
127
+ * Minimum free disk space (in megabytes) that must remain after profiler
128
+ * runs are accounted for. The startup sweep prunes oldest completed runs
129
+ * until at least this much free space is available.
130
+ */
131
+ export function getProfilerMinFreeMb(): number | undefined {
132
+ return int("VELLUM_PROFILER_MIN_FREE_MB");
133
+ }
134
+
70
135
  // ── Known env var names ──────────────────────────────────────────────────────
71
136
 
72
137
  /**
@@ -90,6 +155,11 @@ const KNOWN_VELLUM_VARS = new Set([
90
155
  "VELLUM_HOOK_SETTINGS",
91
156
  "VELLUM_LOCKFILE_DIR",
92
157
  "VELLUM_PLATFORM_URL",
158
+ "VELLUM_PROFILER_MAX_BYTES",
159
+ "VELLUM_PROFILER_MAX_RUNS",
160
+ "VELLUM_PROFILER_MIN_FREE_MB",
161
+ "VELLUM_PROFILER_MODE",
162
+ "VELLUM_PROFILER_RUN_ID",
93
163
  "VELLUM_ROOT_DIR",
94
164
  "VELLUM_SSH_USER",
95
165
  "VELLUM_UNSAFE_AUTH_BYPASS",
@@ -17,14 +17,6 @@
17
17
  "description": "Enable user-hosted onboarding flow",
18
18
  "defaultEnabled": false
19
19
  },
20
- {
21
- "id": "platform-hosted-enabled",
22
- "scope": "macos",
23
- "key": "platform-hosted-enabled",
24
- "label": "Platform Hosted Assistants",
25
- "description": "Enable the Vellum Cloud hosting option on the Hosting screen",
26
- "defaultEnabled": false
27
- },
28
20
  {
29
21
  "id": "local-docker-enabled",
30
22
  "scope": "macos",
@@ -33,14 +25,6 @@
33
25
  "description": "When enabled, the Local hosting option uses Docker under the hood for sandboxed execution, hiding the separate Docker card",
34
26
  "defaultEnabled": false
35
27
  },
36
- {
37
- "id": "contacts",
38
- "scope": "assistant",
39
- "key": "contacts",
40
- "label": "Contacts",
41
- "description": "Show the Contacts tab in Settings for viewing and managing contacts",
42
- "defaultEnabled": true
43
- },
44
28
  {
45
29
  "id": "email-channel",
46
30
  "scope": "assistant",
@@ -137,6 +121,14 @@
137
121
  "description": "Show the Billing tab in Settings when signed in, displaying credits balance and top-up",
138
122
  "defaultEnabled": true
139
123
  },
124
+ {
125
+ "id": "referral-codes",
126
+ "scope": "macos",
127
+ "key": "referral-codes",
128
+ "label": "Referral Codes",
129
+ "description": "Show the referral invite link and stats panel on the Billing tab in Settings",
130
+ "defaultEnabled": false
131
+ },
140
132
  {
141
133
  "id": "managed-sign-in",
142
134
  "scope": "macos",
@@ -145,102 +137,6 @@
145
137
  "description": "Enable managed (organization-hosted) sign-in flow in the onboarding experience",
146
138
  "defaultEnabled": true
147
139
  },
148
- {
149
- "id": "integration-twitter",
150
- "scope": "assistant",
151
- "key": "integration-twitter",
152
- "label": "Twitter / X Integration",
153
- "description": "Enable the Twitter / X OAuth setup skill for connecting to the Twitter API",
154
- "defaultEnabled": false
155
- },
156
- {
157
- "id": "integration-github",
158
- "scope": "assistant",
159
- "key": "integration-github",
160
- "label": "GitHub Integration",
161
- "description": "Enable the GitHub OAuth setup skill for connecting to GitHub",
162
- "defaultEnabled": false
163
- },
164
- {
165
- "id": "integration-linear",
166
- "scope": "assistant",
167
- "key": "integration-linear",
168
- "label": "Linear Integration",
169
- "description": "Enable the Linear OAuth setup skill for connecting to Linear",
170
- "defaultEnabled": false
171
- },
172
- {
173
- "id": "integration-spotify",
174
- "scope": "assistant",
175
- "key": "integration-spotify",
176
- "label": "Spotify Integration",
177
- "description": "Enable the Spotify OAuth setup skill for connecting to the Spotify API",
178
- "defaultEnabled": false
179
- },
180
- {
181
- "id": "integration-todoist",
182
- "scope": "assistant",
183
- "key": "integration-todoist",
184
- "label": "Todoist Integration",
185
- "description": "Enable the Todoist OAuth setup skill for connecting to Todoist",
186
- "defaultEnabled": false
187
- },
188
- {
189
- "id": "integration-discord",
190
- "scope": "assistant",
191
- "key": "integration-discord",
192
- "label": "Discord Integration",
193
- "description": "Enable the Discord OAuth setup skill for connecting to Discord",
194
- "defaultEnabled": false
195
- },
196
- {
197
- "id": "integration-dropbox",
198
- "scope": "assistant",
199
- "key": "integration-dropbox",
200
- "label": "Dropbox Integration",
201
- "description": "Enable the Dropbox OAuth setup skill for connecting to Dropbox",
202
- "defaultEnabled": false
203
- },
204
- {
205
- "id": "integration-asana",
206
- "scope": "assistant",
207
- "key": "integration-asana",
208
- "label": "Asana Integration",
209
- "description": "Enable the Asana OAuth setup skill for connecting to Asana",
210
- "defaultEnabled": false
211
- },
212
- {
213
- "id": "integration-airtable",
214
- "scope": "assistant",
215
- "key": "integration-airtable",
216
- "label": "Airtable Integration",
217
- "description": "Enable the Airtable OAuth setup skill for connecting to Airtable",
218
- "defaultEnabled": false
219
- },
220
- {
221
- "id": "integration-hubspot",
222
- "scope": "assistant",
223
- "key": "integration-hubspot",
224
- "label": "HubSpot Integration",
225
- "description": "Enable the HubSpot OAuth setup skill for connecting to HubSpot CRM",
226
- "defaultEnabled": false
227
- },
228
- {
229
- "id": "integration-figma",
230
- "scope": "assistant",
231
- "key": "integration-figma",
232
- "label": "Figma Integration",
233
- "description": "Enable the Figma OAuth setup skill for connecting to Figma",
234
- "defaultEnabled": false
235
- },
236
- {
237
- "id": "integration-notion",
238
- "scope": "assistant",
239
- "key": "integration-notion",
240
- "label": "Notion Integration",
241
- "description": "Enable the Notion setup skill for connecting to Notion",
242
- "defaultEnabled": false
243
- },
244
140
  {
245
141
  "id": "conversation-starters",
246
142
  "scope": "assistant",
@@ -281,6 +177,14 @@
281
177
  "description": "Show the Schedules tab in Settings for viewing and managing schedules",
282
178
  "defaultEnabled": false
283
179
  },
180
+ {
181
+ "id": "settings-integrations-grid",
182
+ "scope": "assistant",
183
+ "key": "settings-integrations-grid",
184
+ "label": "Integrations Grid",
185
+ "description": "Show the Integrations grid in Models & Services settings, replacing individual OAuth provider cards",
186
+ "defaultEnabled": false
187
+ },
284
188
  {
285
189
  "id": "quick-input",
286
190
  "scope": "macos",
@@ -303,7 +207,7 @@
303
207
  "key": "show-thinking-blocks",
304
208
  "label": "Show Thinking Blocks",
305
209
  "description": "Display the assistant's thinking/reasoning inline in chat messages as collapsible blocks",
306
- "defaultEnabled": false
210
+ "defaultEnabled": true
307
211
  },
308
212
  {
309
213
  "id": "inline-skill-commands",
@@ -345,14 +249,6 @@
345
249
  "description": "Show older versions in the version picker, allowing rollback to previous releases",
346
250
  "defaultEnabled": true
347
251
  },
348
- {
349
- "id": "show-background-conversations",
350
- "scope": "assistant",
351
- "key": "show-background-conversations",
352
- "label": "Show Background Conversations",
353
- "description": "Include background conversations (heartbeat, tasks) in the sidebar conversation list",
354
- "defaultEnabled": false
355
- },
356
252
  {
357
253
  "id": "voice-mode",
358
254
  "scope": "assistant",
@@ -370,12 +266,29 @@
370
266
  "defaultEnabled": false
371
267
  },
372
268
  {
373
- "id": "outlook-oauth-integration",
269
+ "id": "conversation-groups-ui",
270
+ "scope": "assistant",
271
+ "key": "conversation-groups-ui",
272
+ "label": "Conversation Groups",
273
+ "description": "Enable custom conversation group creation, move-to-group, and group management in the sidebar",
274
+ "defaultEnabled": false
275
+ },
276
+ {
277
+ "id": "teleport",
278
+ "scope": "macos",
279
+ "key": "teleport",
280
+ "label": "Teleport",
281
+ "description": "Enable teleport UI in General settings for moving assistants between hosting environments",
282
+ "defaultEnabled": false
283
+ },
284
+ {
285
+ "id": "permission-controls-v2",
374
286
  "scope": "assistant",
375
- "key": "outlook-oauth-integration",
376
- "label": "Outlook / Microsoft Integration",
377
- "description": "Enable the Outlook / Microsoft OAuth provider for connecting to Microsoft Graph APIs (email, calendar)",
287
+ "key": "permission-controls-v2",
288
+ "label": "Permission Controls V2",
289
+ "description": "Replace risk-level permission system with two independent controls: 'Ask before acting' (LLM behavior toggle) and 'Host access' (system-enforced gate)",
378
290
  "defaultEnabled": false
379
291
  }
380
292
  ]
381
293
  }
294
+