@vellumai/assistant 0.4.44 → 0.4.45

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 (681) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +34 -31
  3. package/README.md +4 -4
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -197
  6. package/docs/architecture/keychain-broker.md +1 -1
  7. package/docs/architecture/memory.md +2 -2
  8. package/docs/architecture/scheduling.md +1 -1
  9. package/docs/architecture/security.md +11 -11
  10. package/docs/error-handling.md +1 -1
  11. package/docs/trusted-contact-access.md +3 -3
  12. package/drizzle/meta/0000_snapshot.json +34 -100
  13. package/drizzle/meta/_journal.json +1 -1
  14. package/drizzle.config.ts +4 -4
  15. package/package.json +3 -2
  16. package/scripts/capture-x-graphql.ts +237 -141
  17. package/scripts/generate-bundled-tool-registry.ts +223 -0
  18. package/src/__tests__/access-request-decision.test.ts +0 -1
  19. package/src/__tests__/actor-token-service.test.ts +23 -24
  20. package/src/__tests__/agent-loop.test.ts +0 -131
  21. package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
  22. package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
  23. package/src/__tests__/approval-primitive.test.ts +0 -1
  24. package/src/__tests__/approval-routes-http.test.ts +11 -1
  25. package/src/__tests__/asset-materialize-tool.test.ts +0 -1
  26. package/src/__tests__/asset-search-tool.test.ts +0 -1
  27. package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
  28. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
  32. package/src/__tests__/attachments-store.test.ts +0 -1
  33. package/src/__tests__/avatar-e2e.test.ts +74 -115
  34. package/src/__tests__/avatar-router.test.ts +25 -62
  35. package/src/__tests__/browser-manager.test.ts +24 -0
  36. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
  37. package/src/__tests__/browser-skill-endstate.test.ts +8 -11
  38. package/src/__tests__/btw-routes.test.ts +326 -0
  39. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  40. package/src/__tests__/call-controller.test.ts +0 -1
  41. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  42. package/src/__tests__/call-domain.test.ts +0 -1
  43. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  44. package/src/__tests__/call-recovery.test.ts +0 -1
  45. package/src/__tests__/call-routes-http.test.ts +0 -1
  46. package/src/__tests__/call-store.test.ts +0 -1
  47. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  48. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  49. package/src/__tests__/channel-approvals.test.ts +1 -1
  50. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  51. package/src/__tests__/channel-guardian.test.ts +5 -7
  52. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  53. package/src/__tests__/checker.test.ts +4 -11
  54. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  55. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  56. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  57. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  58. package/src/__tests__/computer-use-tools.test.ts +35 -31
  59. package/src/__tests__/config-schema.test.ts +11 -15
  60. package/src/__tests__/config-watcher.test.ts +0 -1
  61. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  62. package/src/__tests__/conflict-store.test.ts +0 -1
  63. package/src/__tests__/connection-policy.test.ts +4 -7
  64. package/src/__tests__/contacts-tools.test.ts +0 -1
  65. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  66. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  67. package/src/__tests__/context-window-manager.test.ts +147 -60
  68. package/src/__tests__/contradiction-checker.test.ts +0 -1
  69. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  71. package/src/__tests__/conversation-pairing.test.ts +2 -2
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
  73. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  74. package/src/__tests__/conversation-store.test.ts +0 -1
  75. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +7 -8
  77. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  78. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  79. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  80. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  81. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  82. package/src/__tests__/diagnostics-export.test.ts +189 -0
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  84. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  85. package/src/__tests__/entity-extractor.test.ts +0 -1
  86. package/src/__tests__/entity-search.test.ts +0 -1
  87. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  88. package/src/__tests__/file-read-tool.test.ts +86 -0
  89. package/src/__tests__/followup-tools.test.ts +0 -1
  90. package/src/__tests__/frontmatter.test.ts +77 -34
  91. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  92. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  95. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  97. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  98. package/src/__tests__/guardian-action-store.test.ts +0 -1
  99. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  101. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  102. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  103. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  104. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  105. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  106. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  109. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  110. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  111. package/src/__tests__/host-file-proxy.test.ts +374 -0
  112. package/src/__tests__/host-shell-tool.test.ts +147 -1
  113. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  114. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  115. package/src/__tests__/integration-status.test.ts +3 -8
  116. package/src/__tests__/intent-routing.test.ts +7 -46
  117. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  118. package/src/__tests__/invite-routes-http.test.ts +0 -1
  119. package/src/__tests__/llm-usage-store.test.ts +0 -1
  120. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  121. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  122. package/src/__tests__/managed-store.test.ts +94 -21
  123. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  124. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  125. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  126. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  127. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  128. package/src/__tests__/memory-regressions.test.ts +0 -1
  129. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  130. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  131. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  132. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  133. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  134. package/src/__tests__/migration-export-http.test.ts +2 -3
  135. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  136. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  137. package/src/__tests__/migration-validate-http.test.ts +1 -2
  138. package/src/__tests__/native-web-search.test.ts +475 -0
  139. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  140. package/src/__tests__/non-member-access-request.test.ts +0 -1
  141. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  142. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  143. package/src/__tests__/notification-deep-link.test.ts +7 -7
  144. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  145. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  146. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  147. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  148. package/src/__tests__/playbook-execution.test.ts +0 -1
  149. package/src/__tests__/playbook-tools.test.ts +0 -1
  150. package/src/__tests__/profile-compiler.test.ts +0 -1
  151. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  152. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  153. package/src/__tests__/recording-handler.test.ts +30 -94
  154. package/src/__tests__/registry.test.ts +28 -35
  155. package/src/__tests__/relay-server.test.ts +0 -1
  156. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  157. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  158. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  159. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  160. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  162. package/src/__tests__/schedule-store.test.ts +441 -1
  163. package/src/__tests__/schedule-tools.test.ts +468 -7
  164. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  165. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  168. package/src/__tests__/secret-response-routing.test.ts +4 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +14 -2
  170. package/src/__tests__/send-notification-tool.test.ts +0 -7
  171. package/src/__tests__/sequence-store.test.ts +0 -1
  172. package/src/__tests__/server-history-render.test.ts +1 -2
  173. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  174. package/src/__tests__/session-agent-loop.test.ts +46 -6
  175. package/src/__tests__/session-confirmation-signals.test.ts +0 -1
  176. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  177. package/src/__tests__/session-error.test.ts +5 -14
  178. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  179. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  180. package/src/__tests__/session-media-retry.test.ts +12 -74
  181. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  182. package/src/__tests__/session-profile-injection.test.ts +2 -6
  183. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  184. package/src/__tests__/session-queue.test.ts +94 -139
  185. package/src/__tests__/session-skill-tools.test.ts +115 -115
  186. package/src/__tests__/session-slash-known.test.ts +0 -1
  187. package/src/__tests__/session-slash-queue.test.ts +0 -1
  188. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  189. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  190. package/src/__tests__/session-usage.test.ts +0 -1
  191. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  192. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  193. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  194. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  195. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  196. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  197. package/src/__tests__/skill-load-tool.test.ts +194 -2
  198. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  199. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  200. package/src/__tests__/skills.test.ts +14 -53
  201. package/src/__tests__/slack-channel-config.test.ts +0 -1
  202. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  203. package/src/__tests__/slack-skill.test.ts +1 -1
  204. package/src/__tests__/subagent-tools.test.ts +2 -2
  205. package/src/__tests__/system-prompt.test.ts +4 -3
  206. package/src/__tests__/task-compiler.test.ts +0 -1
  207. package/src/__tests__/task-management-tools.test.ts +0 -1
  208. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  209. package/src/__tests__/task-runner.test.ts +0 -1
  210. package/src/__tests__/task-scheduler.test.ts +0 -1
  211. package/src/__tests__/terminal-tools.test.ts +0 -1
  212. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  213. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  214. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  215. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  216. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  217. package/src/__tests__/tool-executor.test.ts +8 -86
  218. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  219. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  220. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  221. package/src/__tests__/trust-store.test.ts +80 -4
  222. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  223. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  224. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  225. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  226. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  227. package/src/__tests__/twilio-provider.test.ts +0 -1
  228. package/src/__tests__/twilio-routes.test.ts +0 -1
  229. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  230. package/src/__tests__/update-bulletin.test.ts +0 -1
  231. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  232. package/src/__tests__/usage-routes.test.ts +0 -1
  233. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  234. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  235. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  236. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  237. package/src/__tests__/web-fetch.test.ts +57 -0
  238. package/src/__tests__/workspace-git-service.test.ts +5 -14
  239. package/src/__tests__/workspace-policy.test.ts +0 -1
  240. package/src/agent/loop.ts +22 -34
  241. package/src/bundler/bundle-signer.ts +4 -4
  242. package/src/calls/call-controller.ts +1 -1
  243. package/src/calls/relay-server.ts +1 -1
  244. package/src/calls/twilio-rest.ts +1 -1
  245. package/src/calls/voice-session-bridge.ts +3 -1
  246. package/src/cli/__tests__/notifications.test.ts +3 -4
  247. package/src/cli/commands/map.ts +2 -6
  248. package/src/cli/commands/mcp.ts +73 -15
  249. package/src/cli/commands/notifications.ts +4 -4
  250. package/src/cli/commands/sessions.ts +9 -1
  251. package/src/cli/commands/skills.ts +6 -10
  252. package/src/cli/http-client.ts +2 -3
  253. package/src/cli/main-screen.tsx +10 -10
  254. package/src/cli/program.ts +0 -4
  255. package/src/cli/reference.ts +0 -2
  256. package/src/cli.ts +15 -9
  257. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  258. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  259. package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
  260. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  261. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  262. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  263. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  264. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  265. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  266. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  267. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  268. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  269. package/src/config/bundled-skills/document/SKILL.md +4 -1
  270. package/src/config/bundled-skills/doordash/SKILL.md +8 -1
  271. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  272. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  273. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  274. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  275. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  276. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  277. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  278. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  279. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  280. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  281. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  282. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  283. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  284. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  285. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  288. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  289. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  290. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  291. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  292. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  293. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  294. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  295. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  296. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  297. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  298. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  299. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  300. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  301. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  302. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  303. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  304. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  305. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  306. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  307. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  308. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  309. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  310. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  311. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  312. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  313. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  314. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  315. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  316. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  317. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  318. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  319. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  320. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  321. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  322. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  323. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  324. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  325. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  326. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  327. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  328. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  329. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  330. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  331. package/src/config/bundled-tool-registry.ts +118 -107
  332. package/src/config/env.ts +5 -2
  333. package/src/config/feature-flag-registry.json +25 -9
  334. package/src/config/loader.ts +10 -2
  335. package/src/config/schema.ts +19 -16
  336. package/src/config/schemas/inference.ts +12 -22
  337. package/src/config/schemas/memory-storage.ts +19 -1
  338. package/src/config/schemas/platform.ts +0 -16
  339. package/src/config/skill-state.ts +11 -8
  340. package/src/config/skills.ts +83 -32
  341. package/src/context/token-estimator.ts +11 -0
  342. package/src/context/window-manager.ts +180 -151
  343. package/src/daemon/computer-use-session.ts +11 -43
  344. package/src/daemon/daemon-control.ts +4 -1
  345. package/src/daemon/handlers/config-channels.ts +5 -9
  346. package/src/daemon/handlers/config-ingress.ts +0 -4
  347. package/src/daemon/handlers/config-model.ts +7 -13
  348. package/src/daemon/handlers/config-telegram.ts +4 -8
  349. package/src/daemon/handlers/config-voice.ts +2 -5
  350. package/src/daemon/handlers/dictation.ts +2 -12
  351. package/src/daemon/handlers/identity.ts +0 -105
  352. package/src/daemon/handlers/recording.ts +3 -23
  353. package/src/daemon/handlers/session-history.ts +1 -1
  354. package/src/daemon/handlers/sessions.ts +53 -72
  355. package/src/daemon/handlers/shared.ts +7 -28
  356. package/src/daemon/handlers/skills.ts +31 -27
  357. package/src/daemon/host-bash-proxy.ts +148 -0
  358. package/src/daemon/host-file-proxy.ts +135 -0
  359. package/src/daemon/lifecycle.ts +49 -24
  360. package/src/daemon/mcp-reload-service.ts +123 -0
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/browser.ts +1 -1
  363. package/src/daemon/message-types/computer-use.ts +1 -4
  364. package/src/daemon/message-types/guardian-actions.ts +1 -1
  365. package/src/daemon/message-types/host-bash.ts +18 -0
  366. package/src/daemon/message-types/host-file.ts +44 -0
  367. package/src/daemon/message-types/integrations.ts +1 -67
  368. package/src/daemon/message-types/messages.ts +15 -0
  369. package/src/daemon/message-types/schedules.ts +11 -27
  370. package/src/daemon/message-types/sessions.ts +2 -1
  371. package/src/daemon/message-types/settings.ts +1 -1
  372. package/src/daemon/message-types/shared.ts +1 -1
  373. package/src/daemon/ride-shotgun-handler.ts +2 -42
  374. package/src/daemon/server.ts +43 -10
  375. package/src/daemon/session-agent-loop-handlers.ts +48 -7
  376. package/src/daemon/session-agent-loop.ts +97 -66
  377. package/src/daemon/session-attachments.ts +1 -1
  378. package/src/daemon/session-error.ts +17 -16
  379. package/src/daemon/session-lifecycle.ts +20 -1
  380. package/src/daemon/session-media-retry.ts +1 -15
  381. package/src/daemon/session-messaging.ts +14 -6
  382. package/src/daemon/session-process.ts +36 -7
  383. package/src/daemon/session-queue-manager.ts +62 -103
  384. package/src/daemon/session-runtime-assembly.ts +27 -0
  385. package/src/daemon/session-skill-tools.ts +12 -11
  386. package/src/daemon/session-slash.ts +7 -0
  387. package/src/daemon/session-surfaces.ts +19 -97
  388. package/src/daemon/session-tool-setup.ts +146 -6
  389. package/src/daemon/session.ts +77 -13
  390. package/src/errors.ts +0 -2
  391. package/src/export/formatter.ts +6 -0
  392. package/src/mcp/mcp-oauth-provider.ts +1 -3
  393. package/src/media/avatar-router.ts +20 -28
  394. package/src/media/avatar-types.ts +7 -14
  395. package/src/media/managed-avatar-client.ts +70 -34
  396. package/src/memory/conversation-title-service.ts +1 -2
  397. package/src/memory/db-init.ts +16 -0
  398. package/src/memory/embedding-backend.ts +129 -27
  399. package/src/memory/embedding-gemini.test.ts +256 -0
  400. package/src/memory/embedding-gemini.ts +47 -13
  401. package/src/memory/embedding-local.ts +14 -2
  402. package/src/memory/embedding-ollama.ts +15 -2
  403. package/src/memory/embedding-openai.ts +15 -2
  404. package/src/memory/embedding-types.test.ts +116 -0
  405. package/src/memory/embedding-types.ts +61 -0
  406. package/src/memory/fingerprint.ts +1 -1
  407. package/src/memory/indexer.ts +25 -1
  408. package/src/memory/job-handlers/embedding.test.ts +258 -0
  409. package/src/memory/job-handlers/embedding.ts +81 -1
  410. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  411. package/src/memory/job-handlers/media-processing.ts +11 -1
  412. package/src/memory/job-utils.ts +21 -6
  413. package/src/memory/jobs-store.ts +5 -1
  414. package/src/memory/jobs-worker.ts +8 -0
  415. package/src/memory/message-content.ts +66 -0
  416. package/src/memory/migrations/100-core-tables.ts +1 -31
  417. package/src/memory/migrations/104-core-indexes.ts +0 -11
  418. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  419. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  420. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  421. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  422. package/src/memory/migrations/index.ts +4 -0
  423. package/src/memory/migrations/registry.ts +19 -0
  424. package/src/memory/qdrant-client.ts +158 -43
  425. package/src/memory/retriever.test.ts +0 -1
  426. package/src/memory/retriever.ts +12 -2
  427. package/src/memory/schema/infrastructure.ts +5 -29
  428. package/src/memory/search/formatting.ts +34 -9
  429. package/src/memory/search/semantic.ts +57 -2
  430. package/src/memory/search/types.ts +2 -1
  431. package/src/notifications/AGENTS.md +2 -2
  432. package/src/notifications/README.md +59 -58
  433. package/src/notifications/adapters/macos.ts +1 -1
  434. package/src/notifications/broadcaster.ts +5 -5
  435. package/src/notifications/copy-composer.ts +1 -1
  436. package/src/notifications/decision-engine.ts +2 -2
  437. package/src/notifications/destination-resolver.ts +2 -2
  438. package/src/notifications/emit-signal.ts +8 -8
  439. package/src/notifications/signal.ts +1 -1
  440. package/src/notifications/thread-seed-composer.ts +1 -1
  441. package/src/oauth/connect-orchestrator.ts +1 -1
  442. package/src/oauth/token-persistence.ts +1 -1
  443. package/src/permissions/checker.ts +12 -1
  444. package/src/permissions/defaults.ts +10 -14
  445. package/src/permissions/trust-store.ts +37 -0
  446. package/src/permissions/workspace-policy.ts +0 -1
  447. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  448. package/src/prompts/computer-use-prompt.ts +1 -1
  449. package/src/prompts/system-prompt.ts +29 -30
  450. package/src/prompts/templates/SOUL.md +1 -2
  451. package/src/prompts/templates/UPDATES.md +16 -7
  452. package/src/providers/anthropic/client.ts +87 -33
  453. package/src/providers/gemini/client.ts +6 -0
  454. package/src/providers/managed-proxy/constants.ts +5 -0
  455. package/src/providers/openai/client.ts +15 -0
  456. package/src/providers/registry.ts +2 -2
  457. package/src/providers/types.ts +24 -2
  458. package/src/runtime/AGENTS.md +18 -0
  459. package/src/runtime/assistant-event-hub.ts +2 -3
  460. package/src/runtime/assistant-event.ts +4 -4
  461. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  462. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  463. package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
  464. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  465. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  466. package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
  467. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  468. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  469. package/src/runtime/auth/route-policy.ts +8 -4
  470. package/src/runtime/auth/scopes.ts +1 -1
  471. package/src/runtime/auth/subject.ts +4 -4
  472. package/src/runtime/auth/token-service.ts +0 -23
  473. package/src/runtime/auth/types.ts +3 -3
  474. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  475. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  476. package/src/runtime/guardian-action-service.ts +3 -3
  477. package/src/runtime/http-server.ts +15 -2
  478. package/src/runtime/invite-service.ts +3 -3
  479. package/src/runtime/local-actor-identity.ts +17 -22
  480. package/src/runtime/pending-interactions.ts +21 -9
  481. package/src/runtime/routes/app-management-routes.ts +2 -3
  482. package/src/runtime/routes/approval-routes.ts +1 -3
  483. package/src/runtime/routes/btw-routes.ts +155 -0
  484. package/src/runtime/routes/computer-use-routes.ts +77 -31
  485. package/src/runtime/routes/conversation-routes.ts +230 -46
  486. package/src/runtime/routes/diagnostics-routes.ts +63 -29
  487. package/src/runtime/routes/documents-routes.ts +2 -2
  488. package/src/runtime/routes/global-search-routes.ts +1 -1
  489. package/src/runtime/routes/host-bash-routes.ts +83 -0
  490. package/src/runtime/routes/host-file-routes.ts +79 -0
  491. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  492. package/src/runtime/routes/log-export-routes.ts +120 -0
  493. package/src/runtime/routes/mcp-routes.ts +20 -0
  494. package/src/runtime/routes/migration-routes.ts +3 -3
  495. package/src/runtime/routes/pairing-routes.ts +1 -1
  496. package/src/runtime/routes/recording-routes.ts +6 -4
  497. package/src/runtime/routes/schedule-routes.ts +31 -5
  498. package/src/runtime/routes/session-management-routes.ts +2 -6
  499. package/src/runtime/routes/session-query-routes.ts +18 -15
  500. package/src/runtime/routes/settings-routes.ts +7 -261
  501. package/src/runtime/routes/skills-routes.ts +7 -6
  502. package/src/runtime/routes/subagents-routes.ts +4 -10
  503. package/src/runtime/routes/surface-action-routes.ts +3 -14
  504. package/src/runtime/routes/surface-content-routes.ts +22 -5
  505. package/src/runtime/routes/work-items-routes.ts +21 -25
  506. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  507. package/src/runtime/routes/workspace-utils.ts +1 -1
  508. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  509. package/src/runtime/verification-outbound-actions.ts +2 -2
  510. package/src/schedule/integration-status.ts +0 -6
  511. package/src/schedule/schedule-store.ts +234 -43
  512. package/src/schedule/scheduler.ts +73 -74
  513. package/src/security/oauth2.ts +1 -1
  514. package/src/sequence/store.ts +12 -2
  515. package/src/skills/frontmatter.ts +19 -77
  516. package/src/skills/managed-store.ts +11 -2
  517. package/src/subagent/manager.ts +5 -3
  518. package/src/tasks/ephemeral-permissions.ts +3 -5
  519. package/src/tools/AGENTS.md +0 -1
  520. package/src/tools/browser/browser-manager.ts +17 -11
  521. package/src/tools/browser/jit-auth.ts +4 -1
  522. package/src/tools/claude-code/claude-code.ts +1 -1
  523. package/src/tools/computer-use/definitions.ts +48 -60
  524. package/src/tools/document/document-tool.ts +6 -6
  525. package/src/tools/filesystem/edit.ts +2 -1
  526. package/src/tools/filesystem/read.ts +20 -2
  527. package/src/tools/filesystem/write.ts +2 -1
  528. package/src/tools/host-filesystem/edit.ts +17 -1
  529. package/src/tools/host-filesystem/read.ts +16 -1
  530. package/src/tools/host-filesystem/write.ts +15 -1
  531. package/src/tools/host-terminal/host-shell.ts +24 -0
  532. package/src/tools/memory/definitions.ts +45 -81
  533. package/src/tools/memory/handlers.test.ts +0 -1
  534. package/src/tools/memory/handlers.ts +1 -1
  535. package/src/tools/memory/register.ts +26 -60
  536. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  537. package/src/tools/network/web-fetch.ts +7 -1
  538. package/src/tools/network/web-search.ts +2 -1
  539. package/src/tools/registry.ts +23 -0
  540. package/src/tools/schedule/create.ts +113 -5
  541. package/src/tools/schedule/list.ts +57 -15
  542. package/src/tools/schedule/update.ts +73 -3
  543. package/src/tools/shared/filesystem/image-read.ts +192 -0
  544. package/src/tools/side-effects.ts +1 -7
  545. package/src/tools/skills/delete-managed.ts +27 -64
  546. package/src/tools/skills/execute.ts +54 -0
  547. package/src/tools/skills/load.ts +127 -5
  548. package/src/tools/skills/scaffold-managed.ts +93 -172
  549. package/src/tools/subagent/message.ts +0 -7
  550. package/src/tools/subagent/spawn.ts +1 -1
  551. package/src/tools/swarm/delegate.ts +0 -3
  552. package/src/tools/system/avatar-generator.ts +13 -19
  553. package/src/tools/system/request-permission.ts +2 -1
  554. package/src/tools/terminal/safe-env.ts +1 -0
  555. package/src/tools/tool-manifest.ts +41 -47
  556. package/src/tools/types.ts +6 -2
  557. package/src/tools/ui-surface/definitions.ts +0 -55
  558. package/src/util/errors.ts +0 -10
  559. package/src/workspace/git-service.ts +0 -2
  560. package/src/__tests__/account-registry.test.ts +0 -258
  561. package/src/__tests__/email-classifier.test.ts +0 -25
  562. package/src/__tests__/gmail-integration.test.ts +0 -97
  563. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  564. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
  565. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  566. package/src/__tests__/recording-intent.test.ts +0 -985
  567. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  568. package/src/__tests__/reminder-store.test.ts +0 -350
  569. package/src/__tests__/reminder.test.ts +0 -337
  570. package/src/__tests__/scan-result-store.test.ts +0 -121
  571. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
  572. package/src/__tests__/view-image-tool.test.ts +0 -241
  573. package/src/cli/commands/amazon/cart.ts +0 -513
  574. package/src/cli/commands/amazon/checkout.ts +0 -394
  575. package/src/cli/commands/amazon/client.ts +0 -513
  576. package/src/cli/commands/amazon/index.ts +0 -885
  577. package/src/cli/commands/amazon/product-details.ts +0 -145
  578. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  579. package/src/cli/commands/amazon/search.ts +0 -76
  580. package/src/cli/commands/amazon/session.ts +0 -108
  581. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
  582. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
  583. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
  584. package/src/cli/commands/twitter/index.ts +0 -420
  585. package/src/cli/commands/twitter/oauth-client.ts +0 -60
  586. package/src/cli/commands/twitter/router.ts +0 -351
  587. package/src/cli/commands/twitter/types.ts +0 -30
  588. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  589. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  590. package/src/config/bundled-skills/amazon/SKILL.md +0 -136
  591. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  592. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  593. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  594. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  595. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  596. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  597. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  598. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  599. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  600. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  601. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  602. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  603. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  604. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  605. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  606. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  607. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  608. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  609. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  610. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  611. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  612. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  613. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  614. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  615. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  616. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  617. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  618. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  619. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  620. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  621. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  622. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  623. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  624. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  625. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  626. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  627. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  628. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  629. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  630. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  631. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  632. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  633. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  634. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  635. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  636. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  637. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  638. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  639. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  640. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  641. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  642. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  643. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  644. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  645. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  646. package/src/config/bundled-skills/twitter/SKILL.md +0 -206
  647. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  648. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  649. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  650. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  651. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  652. package/src/daemon/handlers/pairing.ts +0 -119
  653. package/src/daemon/handlers/session-user-message.ts +0 -961
  654. package/src/daemon/recording-executor.ts +0 -180
  655. package/src/daemon/recording-intent-fallback.ts +0 -162
  656. package/src/daemon/recording-intent.ts +0 -493
  657. package/src/memory/account-store.ts +0 -117
  658. package/src/messaging/activity-analyzer.ts +0 -76
  659. package/src/messaging/email-classifier.ts +0 -208
  660. package/src/messaging/index.ts +0 -2
  661. package/src/messaging/outreach-classifier.ts +0 -185
  662. package/src/messaging/thread-summarizer.ts +0 -346
  663. package/src/messaging/types.ts +0 -17
  664. package/src/tools/browser/x-auto-navigate.ts +0 -254
  665. package/src/tools/credentials/account-registry.ts +0 -144
  666. package/src/tools/filesystem/view-image.ts +0 -244
  667. package/src/tools/reminder/reminder-store.ts +0 -194
  668. package/src/tools/reminder/reminder.ts +0 -158
  669. package/src/tools/system/navigate-settings.ts +0 -74
  670. package/src/tools/system/open-system-settings.ts +0 -85
  671. package/src/tools/system/version.ts +0 -54
  672. package/src/twitter/platform-proxy-client.ts +0 -408
  673. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  674. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  675. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  676. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  677. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  678. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  679. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  680. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  681. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared MIME type guessing for Gmail attachment support.
3
+ */
4
+
5
+ import { extname } from "node:path";
6
+
7
+ export const MIME_MAP: Record<string, string> = {
8
+ ".pdf": "application/pdf",
9
+ ".zip": "application/zip",
10
+ ".gz": "application/gzip",
11
+ ".tar": "application/x-tar",
12
+ ".doc": "application/msword",
13
+ ".docx":
14
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
15
+ ".xls": "application/vnd.ms-excel",
16
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
17
+ ".ppt": "application/vnd.ms-powerpoint",
18
+ ".pptx":
19
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation",
20
+ ".png": "image/png",
21
+ ".jpg": "image/jpeg",
22
+ ".jpeg": "image/jpeg",
23
+ ".gif": "image/gif",
24
+ ".svg": "image/svg+xml",
25
+ ".webp": "image/webp",
26
+ ".mp3": "audio/mpeg",
27
+ ".mp4": "video/mp4",
28
+ ".wav": "audio/wav",
29
+ ".txt": "text/plain",
30
+ ".html": "text/html",
31
+ ".css": "text/css",
32
+ ".js": "text/javascript",
33
+ ".json": "application/json",
34
+ ".xml": "application/xml",
35
+ ".csv": "text/csv",
36
+ };
37
+
38
+ export function guessMimeType(filePath: string): string {
39
+ return (
40
+ MIME_MAP[extname(filePath).toLowerCase()] ?? "application/octet-stream"
41
+ );
42
+ }
@@ -1,9 +1,28 @@
1
- import { createDraft } from "../../../../messaging/providers/gmail/client.js";
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+
4
+ import {
5
+ batchGetMessages,
6
+ createDraft,
7
+ createDraftRaw,
8
+ getProfile,
9
+ listMessages,
10
+ } from "../../../../messaging/providers/gmail/client.js";
11
+ import { buildMultipartMime } from "../../../../messaging/providers/gmail/mime-builder.js";
2
12
  import type {
3
13
  ToolContext,
4
14
  ToolExecutionResult,
5
15
  } from "../../../../tools/types.js";
6
- import { err, ok, resolveProvider, withProviderToken } from "./shared.js";
16
+ import { guessMimeType } from "./gmail-mime-helpers.js";
17
+ import {
18
+ err,
19
+ extractEmail,
20
+ extractHeader,
21
+ ok,
22
+ parseAddressList,
23
+ resolveProvider,
24
+ withProviderToken,
25
+ } from "./shared.js";
7
26
 
8
27
  export async function run(
9
28
  input: Record<string, unknown>,
@@ -14,6 +33,8 @@ export async function run(
14
33
  const text = input.text as string;
15
34
  const subject = input.subject as string | undefined;
16
35
  const inReplyTo = input.in_reply_to as string | undefined;
36
+ const attachmentPaths = input.attachment_paths as string[] | undefined;
37
+ const threadId = input.thread_id as string | undefined;
17
38
 
18
39
  if (!conversationId) {
19
40
  return err("conversation_id is required.");
@@ -25,15 +46,155 @@ export async function run(
25
46
  try {
26
47
  const provider = resolveProvider(platform);
27
48
 
49
+ // Non-Gmail platforms: reject attachment_paths
50
+ if (provider.id !== "gmail" && attachmentPaths?.length) {
51
+ return err("Attachments are only supported on Gmail.");
52
+ }
53
+
28
54
  // Gmail: create a draft instead of sending directly
29
55
  if (provider.id === "gmail") {
30
56
  return withProviderToken(provider, async (token) => {
57
+ // Reply mode: thread_id provided — create a threaded draft with reply-all recipients
58
+ if (threadId) {
59
+ // Fetch thread messages to extract recipients and threading headers
60
+ const list = await listMessages(token, `thread:${threadId}`, 10);
61
+ if (!list.messages?.length) {
62
+ return err("No messages found in this thread.");
63
+ }
64
+
65
+ const messages = await batchGetMessages(
66
+ token,
67
+ list.messages.map((m) => m.id),
68
+ "metadata",
69
+ ["From", "To", "Cc", "Message-ID", "Subject"],
70
+ );
71
+
72
+ // Use the latest message for threading and recipient extraction
73
+ const latest = messages[messages.length - 1];
74
+ const latestHeaders = latest.payload?.headers ?? [];
75
+
76
+ const messageIdHeader = extractHeader(latestHeaders, "Message-ID");
77
+ let replySubject = extractHeader(latestHeaders, "Subject");
78
+ if (replySubject && !replySubject.startsWith("Re:")) {
79
+ replySubject = `Re: ${replySubject}`;
80
+ }
81
+
82
+ // Build reply-all recipient list, excluding the user's own email
83
+ const profile = await getProfile(token);
84
+ const userEmail = profile.emailAddress.toLowerCase();
85
+
86
+ const allRecipients = new Set<string>();
87
+ const allCc = new Set<string>();
88
+
89
+ // From the latest message: From goes to To, original To/Cc go to Cc
90
+ const fromAddr = extractHeader(latestHeaders, "From");
91
+ const toAddrs = extractHeader(latestHeaders, "To");
92
+ const ccAddrs = extractHeader(latestHeaders, "Cc");
93
+
94
+ if (fromAddr) allRecipients.add(fromAddr);
95
+ for (const addr of parseAddressList(toAddrs)) {
96
+ allRecipients.add(addr);
97
+ }
98
+ for (const addr of parseAddressList(ccAddrs)) {
99
+ allCc.add(addr);
100
+ }
101
+
102
+ // Remove user's own email from recipients using exact email comparison
103
+ const filterSelf = (addr: string) => extractEmail(addr) !== userEmail;
104
+ const toList = [...allRecipients].filter(filterSelf);
105
+ const ccList = [...allCc].filter(filterSelf);
106
+
107
+ if (toList.length === 0) {
108
+ return err("Could not determine reply recipients from thread.");
109
+ }
110
+
111
+ // With attachments: build multipart MIME for threaded reply
112
+ if (attachmentPaths?.length) {
113
+ const attachments = await Promise.all(
114
+ attachmentPaths.map(async (filePath) => {
115
+ const data = await readFile(filePath);
116
+ const filename = basename(filePath);
117
+ const mimeType = guessMimeType(filePath);
118
+ return { filename, mimeType, data };
119
+ }),
120
+ );
121
+
122
+ const raw = buildMultipartMime({
123
+ to: toList.join(", "),
124
+ subject: replySubject,
125
+ body: text,
126
+ inReplyTo: messageIdHeader || undefined,
127
+ cc: ccList.length > 0 ? ccList.join(", ") : undefined,
128
+ attachments,
129
+ });
130
+ const draft = await createDraftRaw(token, raw, threadId);
131
+
132
+ const filenames = attachments.map((a) => a.filename).join(", ");
133
+ const recipientSummary =
134
+ ccList.length > 0
135
+ ? `To: ${toList.join(", ")}; Cc: ${ccList.join(", ")}`
136
+ : `To: ${toList.join(", ")}`;
137
+ return ok(
138
+ `Gmail draft created with ${attachments.length} attachment(s): ${filenames} (Draft ID: ${draft.id}). ${recipientSummary}. Review in Gmail Drafts, then tell me to send it or send it yourself.`,
139
+ );
140
+ }
141
+
142
+ const draft = await createDraft(
143
+ token,
144
+ toList.join(", "),
145
+ replySubject,
146
+ text,
147
+ messageIdHeader || undefined,
148
+ ccList.length > 0 ? ccList.join(", ") : undefined,
149
+ undefined,
150
+ threadId,
151
+ );
152
+
153
+ const recipientSummary =
154
+ ccList.length > 0
155
+ ? `To: ${toList.join(", ")}; Cc: ${ccList.join(", ")}`
156
+ : `To: ${toList.join(", ")}`;
157
+ return ok(
158
+ `Gmail draft created (ID: ${draft.id}). ${recipientSummary}. Review in Gmail Drafts, then tell me to send it or send it yourself.`,
159
+ );
160
+ }
161
+
162
+ // With attachments: build multipart MIME and use createDraftRaw
163
+ if (attachmentPaths?.length) {
164
+ const attachments = await Promise.all(
165
+ attachmentPaths.map(async (filePath) => {
166
+ const data = await readFile(filePath);
167
+ const filename = basename(filePath);
168
+ const mimeType = guessMimeType(filePath);
169
+ return { filename, mimeType, data };
170
+ }),
171
+ );
172
+
173
+ const raw = buildMultipartMime({
174
+ to: conversationId,
175
+ subject: subject ?? "",
176
+ body: text,
177
+ inReplyTo,
178
+ attachments,
179
+ });
180
+ const draft = await createDraftRaw(token, raw, threadId);
181
+
182
+ const filenames = attachments.map((a) => a.filename).join(", ");
183
+ return ok(
184
+ `Gmail draft created with ${attachments.length} attachment(s): ${filenames} (Draft ID: ${draft.id}). Review in Gmail Drafts, then tell me to send it or send it yourself.`,
185
+ );
186
+ }
187
+
188
+ // Without attachments: use standard createDraft
31
189
  const draft = await createDraft(
32
190
  token,
33
191
  conversationId,
34
192
  subject ?? "",
35
193
  text,
36
194
  inReplyTo,
195
+ undefined,
196
+ undefined,
197
+ threadId,
37
198
  );
38
199
  return ok(
39
200
  `Gmail draft created (ID: ${draft.id}). Review it in your Gmail Drafts, then tell me to send it or send it yourself from Gmail.`,
@@ -41,10 +202,12 @@ export async function run(
41
202
  });
42
203
  }
43
204
 
205
+ // Non-Gmail platforms
44
206
  return withProviderToken(provider, async (token) => {
45
207
  const result = await provider.sendMessage(token, conversationId, text, {
46
208
  subject,
47
209
  inReplyTo,
210
+ threadId,
48
211
  assistantId: context.assistantId,
49
212
  });
50
213
 
@@ -2,7 +2,6 @@ import type {
2
2
  ToolContext,
3
3
  ToolExecutionResult,
4
4
  } from "../../../../tools/types.js";
5
- import { storeScanResult } from "./scan-result-store.js";
6
5
  import { err, ok, resolveProvider, withProviderToken } from "./shared.js";
7
6
 
8
7
  export async function run(
@@ -55,24 +54,13 @@ export async function run(
55
54
  search_query: s.searchQuery,
56
55
  }));
57
56
 
58
- // Store message IDs server-side to keep them out of LLM context
59
- const scanId = storeScanResult(
60
- result.senders.map((s) => ({
61
- id: s.id,
62
- messageIds: s.messageIds,
63
- newestMessageId: s.newestMessageId,
64
- newestUnsubscribableMessageId: null,
65
- })),
66
- );
67
-
68
57
  return ok(
69
58
  JSON.stringify({
70
- scan_id: scanId,
71
59
  senders,
72
60
  total_scanned: result.totalScanned,
73
61
  query_used: result.queryUsed,
74
62
  ...(result.truncated ? { truncated: true } : {}),
75
- note: `message_count reflects emails found per sender within the ${result.totalScanned} messages scanned. Use scan_id with the archive tool to archive messages (pass scan_id + sender_ids instead of message_ids).`,
63
+ note: `message_count reflects emails found per sender within the ${result.totalScanned} messages scanned. Use messaging_archive_by_sender with the sender's search_query to archive their messages.`,
76
64
  }),
77
65
  );
78
66
  });
@@ -2,11 +2,6 @@
2
2
  * Shared utilities for messaging skill tools.
3
3
  */
4
4
 
5
- import {
6
- request as httpsRequest,
7
- type RequestOptions as HttpsRequestOptions,
8
- } from "node:https";
9
-
10
5
  import type { MessagingProvider } from "../../../../messaging/provider.js";
11
6
  import {
12
7
  getConnectedProviders,
@@ -24,6 +19,87 @@ export function err(message: string): ToolExecutionResult {
24
19
  return { content: message, isError: true };
25
20
  }
26
21
 
22
+ // ── RFC 5322 address helpers ──────────────────────────────────────────────────
23
+
24
+ export function extractHeader(
25
+ headers: Array<{ name: string; value: string }> | undefined,
26
+ name: string,
27
+ ): string {
28
+ return (
29
+ headers?.find((h) => h.name.toLowerCase() === name.toLowerCase())?.value ??
30
+ ""
31
+ );
32
+ }
33
+
34
+ /**
35
+ * RFC 5322-aware address list parser. Splits a header value like
36
+ * `"Doe, Jane" <jane@example.com>, bob@example.com` into individual
37
+ * addresses without breaking on commas inside quoted display names.
38
+ */
39
+ export function parseAddressList(header: string): string[] {
40
+ const addresses: string[] = [];
41
+ let current = "";
42
+ let inQuotes = false;
43
+ let inAngle = false;
44
+
45
+ for (let i = 0; i < header.length; i++) {
46
+ const ch = header[i];
47
+
48
+ if (ch === '"' && !inAngle) {
49
+ inQuotes = !inQuotes;
50
+ current += ch;
51
+ } else if (ch === "<" && !inQuotes) {
52
+ inAngle = true;
53
+ current += ch;
54
+ } else if (ch === ">" && !inQuotes) {
55
+ inAngle = false;
56
+ current += ch;
57
+ } else if (ch === "," && !inQuotes && !inAngle) {
58
+ const trimmed = current.trim();
59
+ if (trimmed) addresses.push(trimmed);
60
+ current = "";
61
+ } else {
62
+ current += ch;
63
+ }
64
+ }
65
+
66
+ const trimmed = current.trim();
67
+ if (trimmed) addresses.push(trimmed);
68
+
69
+ return addresses;
70
+ }
71
+
72
+ /**
73
+ * Extracts the bare email from an address that may be in any of these forms:
74
+ * - `user@example.com`
75
+ * - `<user@example.com>`
76
+ * - `"Display Name" <user@example.com>`
77
+ * - `Display Name <user@example.com>`
78
+ * - `"Team <Ops>" <user@example.com>`
79
+ * - `user@example.com (team <ops>)`
80
+ *
81
+ * Extracts all angle-bracketed segments and picks the last one containing `@`,
82
+ * preferring the actual mailbox over display-name fragments like
83
+ * `"Acme <support@acme.com>" <owner@example.com>`. If no segment contains `@`,
84
+ * strips angle-bracketed portions and parenthetical comments, returning the
85
+ * remaining text. This handles display names with angle brackets and trailing
86
+ * RFC 5322 comments.
87
+ */
88
+ export function extractEmail(address: string): string {
89
+ // Strip parenthetical comments first to avoid matching addresses inside them
90
+ const cleaned = address.replace(/\(.*?\)/g, "");
91
+ const segments = [...cleaned.matchAll(/<([^>]+)>/g)].map((m) => m[1]);
92
+ if (segments.length > 0) {
93
+ const emailSegment = [...segments].reverse().find((s) => s.includes("@"));
94
+ if (emailSegment) return emailSegment.trim().toLowerCase();
95
+ }
96
+ return address
97
+ .replace(/<[^>]+>/g, "")
98
+ .replace(/\(.*?\)/g, "")
99
+ .trim()
100
+ .toLowerCase();
101
+ }
102
+
27
103
  /**
28
104
  * Resolve the messaging provider from user input.
29
105
  * If platform is specified, look it up directly.
@@ -63,32 +139,3 @@ export async function withProviderToken<T>(
63
139
  }
64
140
  return withValidToken(provider.credentialService, fn);
65
141
  }
66
-
67
- /** Make an HTTPS request pinned to a specific resolved IP to prevent DNS rebinding. */
68
- export function pinnedHttpsRequest(
69
- target: URL,
70
- resolvedAddress: string,
71
- options?: {
72
- method?: string;
73
- headers?: Record<string, string>;
74
- body?: string;
75
- },
76
- ): Promise<number> {
77
- return new Promise((resolve, reject) => {
78
- const reqOpts: HttpsRequestOptions = {
79
- method: options?.method ?? "GET",
80
- hostname: resolvedAddress,
81
- port: target.port ? Number(target.port) : undefined,
82
- path: `${target.pathname}${target.search}`,
83
- headers: { host: target.host, ...options?.headers },
84
- servername: target.hostname,
85
- };
86
- const req = httpsRequest(reqOpts, (res) => {
87
- res.resume();
88
- resolve(res.statusCode ?? 0);
89
- });
90
- req.once("error", reject);
91
- if (options?.body) req.write(options.body);
92
- req.end();
93
- });
94
- }
@@ -2,7 +2,11 @@
2
2
  name: notifications
3
3
  description: Send notifications through the unified notification router
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"🔔","vellum":{"display-name":"Notifications","user-invocable":true}}
5
+ metadata:
6
+ emoji: "🔔"
7
+ vellum:
8
+ display-name: "Notifications"
9
+ user-invocable: true
6
10
  ---
7
11
 
8
12
  Use `send_notification` for user-facing alerts and notifications. This tool routes through the unified notification pipeline, which handles channel selection, delivery, deduplication, and audit logging.
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: orchestration
3
+ description: Decompose complex tasks into parallel specialist subtasks
4
+ compatibility: "Designed for Vellum personal assistants"
5
+ metadata:
6
+ emoji: "\U0001F500"
7
+ vellum:
8
+ display-name: "Orchestration"
9
+ user-invocable: true
10
+ ---
11
+
12
+ Use `swarm_delegate` when facing complex multi-part tasks that benefit from parallel execution. The tool decomposes an objective into independent specialist subtasks, runs them concurrently, and synthesises the results.
13
+
14
+ ## When to use
15
+
16
+ - The request involves **multiple independent work streams** (e.g. research + coding + review).
17
+ - Tasks can run in parallel without sequential dependencies.
18
+ - The combined work would take significantly longer if done serially.
19
+
20
+ ## When NOT to use
21
+
22
+ - Simple single-step requests — just do them directly.
23
+ - Tasks that are inherently sequential (each step depends on the previous result).
24
+ - Requests where the user is asking for a quick answer, not a deep workflow.
25
+
26
+ ## Tips
27
+
28
+ - Provide a clear, specific `objective`. The planner uses it to decompose the work.
29
+ - Pass relevant `context` about the codebase or project when available.
30
+ - The `max_workers` parameter caps concurrency (1-6); the default comes from config.
@@ -0,0 +1,35 @@
1
+ {
2
+ "version": 1,
3
+ "tools": [
4
+ {
5
+ "name": "swarm_delegate",
6
+ "description": "Decompose a complex task into parallel specialist subtasks and execute them concurrently. Use this for multi-part tasks that benefit from parallel research, coding, and review.",
7
+ "category": "orchestration",
8
+ "risk": "medium",
9
+ "input_schema": {
10
+ "type": "object",
11
+ "properties": {
12
+ "objective": {
13
+ "type": "string",
14
+ "description": "The complex task to decompose and execute in parallel"
15
+ },
16
+ "context": {
17
+ "type": "string",
18
+ "description": "Optional additional context about the task or codebase"
19
+ },
20
+ "max_workers": {
21
+ "type": "number",
22
+ "description": "Maximum concurrent workers (1-6, default from config)"
23
+ },
24
+ "reason": {
25
+ "type": "string",
26
+ "description": "Brief non-technical explanation of what you are doing and why, shown to the user as a status update. Use simple language a non-technical person would understand."
27
+ }
28
+ },
29
+ "required": ["objective"]
30
+ },
31
+ "executor": "tools/swarm-delegate.ts",
32
+ "execution_target": "host"
33
+ }
34
+ ]
35
+ }
@@ -1,4 +1,4 @@
1
- import { executeReminderCreate } from "../../../../tools/reminder/reminder.js";
1
+ import { swarmDelegateTool } from "../../../../tools/swarm/delegate.js";
2
2
  import type {
3
3
  ToolContext,
4
4
  ToolExecutionResult,
@@ -6,7 +6,7 @@ import type {
6
6
 
7
7
  export async function run(
8
8
  input: Record<string, unknown>,
9
- _context: ToolContext,
9
+ context: ToolContext,
10
10
  ): Promise<ToolExecutionResult> {
11
- return executeReminderCreate(input);
11
+ return swarmDelegateTool.execute(input, context);
12
12
  }
@@ -2,7 +2,15 @@
2
2
  name: phone-calls
3
3
  description: Set up Twilio for AI-powered voice calls — both outgoing calls on behalf of the user and incoming calls where the assistant answers as a receptionist
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"📞","vellum":{"display-name":"Phone Calls","user-invocable":true,"includes":["twilio-setup", "public-ingress","elevenlabs-voice"]}}
5
+ metadata:
6
+ emoji: "📞"
7
+ vellum:
8
+ display-name: "Phone Calls"
9
+ user-invocable: true
10
+ includes:
11
+ - "twilio-setup"
12
+ - "public-ingress"
13
+ - "elevenlabs-voice"
6
14
  ---
7
15
 
8
16
  You are helping the user set up and manage phone calls via Twilio. This skill covers enabling the calls feature, placing outbound calls, receiving inbound calls, and interacting with live calls. Twilio credential storage, phone number provisioning, and public ingress are handled by the **twilio-setup** skill.
@@ -2,7 +2,10 @@
2
2
  name: playbooks
3
3
  description: Trigger-action automation rules for handling incoming messages
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"📖","vellum":{"display-name":"Playbooks"}}
5
+ metadata:
6
+ emoji: "📖"
7
+ vellum:
8
+ display-name: "Playbooks"
6
9
  ---
7
10
 
8
11
  Playbooks are trigger-action automation rules that tell the assistant how to handle incoming messages matching a pattern.
@@ -1,11 +1,14 @@
1
1
  ---
2
2
  name: schedule
3
- description: Recurring automation that dispatches messages on a cron or RRULE schedule
3
+ description: Recurring and one-shot scheduling cron, RRULE, or single fire-at time
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"📅","vellum":{"display-name":"Schedule"}}
5
+ metadata:
6
+ emoji: "📅"
7
+ vellum:
8
+ display-name: "Schedule"
6
9
  ---
7
10
 
8
- Manage recurring scheduled automations. Each schedule has an expression (cron or RRULE) that defines when it fires, and a message that gets dispatched to the assistant at trigger time.
11
+ Manage scheduled automations. Schedules can be **recurring** (cron or RRULE expression) or **one-shot** (a single `fire_at` timestamp). Both recurring and one-shot schedules support two modes: **execute** (run a message through the assistant) and **notify** (send a notification to the user).
9
12
 
10
13
  ## Schedule Syntax
11
14
 
@@ -62,19 +65,78 @@ Exclusions (EXDATE, EXRULE) always take precedence over inclusions (RRULE, RDATE
62
65
  - `DTSTART:20250101T090000Z\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1\nRDATE:20250704T090000Z` — 1st of each month plus July 4th
63
66
  - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=TU\nRRULE:FREQ=WEEKLY;BYDAY=TH` — union of Tuesdays and Thursdays
64
67
 
68
+ ## One-Shot Schedules (Reminders)
69
+
70
+ To create a one-time schedule that fires once and is done, pass `fire_at` (an ISO 8601 timestamp) instead of an `expression`. This replaces the old reminder concept — "remind me at 3pm" becomes a one-shot schedule with `fire_at`.
71
+
72
+ One-shot schedules:
73
+ - Fire once at the specified time, then are marked as `fired` and disabled.
74
+ - Support both `execute` and `notify` modes (see below).
75
+ - Can be cancelled before they fire.
76
+
77
+ Examples:
78
+ - "remind me at 3pm" → `schedule_create` with `fire_at: "2025-03-15T15:00:00-05:00"`, `mode: "notify"`
79
+ - "at 5pm, check my email and summarize it" → `schedule_create` with `fire_at`, `mode: "execute"`
80
+
81
+ ## Mode
82
+
83
+ The `mode` parameter controls what happens when a schedule fires:
84
+
85
+ - **execute** (default) — sends the schedule's message to a background assistant conversation for autonomous handling. The assistant processes the message as if the user sent it.
86
+ - **notify** — sends a notification to the user via the notification pipeline. No assistant processing occurs.
87
+
88
+ Use `notify` for simple reminders ("remind me to take medicine at 9am") and `execute` for tasks that need assistant action ("check my calendar at 8am and send me a digest").
89
+
90
+ ## Routing (notify mode)
91
+
92
+ Control how notify-mode schedules are delivered at trigger time with `routing_intent`:
93
+
94
+ - **single_channel** — deliver to one best channel
95
+ - **multi_channel** — deliver to a subset of channels
96
+ - **all_channels** (default) — deliver to every available channel
97
+
98
+ Optionally pass `routing_hints` (a JSON object) to influence routing decisions (e.g. preferred channels, exclusions).
99
+
100
+ ### Routing Defaults
101
+
102
+ - **Default to `all_channels`** for most notifications. Users usually want to be notified wherever they are.
103
+ - **Use `single_channel`** only when the user explicitly specifies a single channel (e.g. "remind me on Telegram").
104
+ - **Check `user_message_channel`** from the turn context. If the user is currently active on a specific channel, include it as a routing hint:
105
+ ```
106
+ routing_hints: { preferred_channels: ["vellum"] }
107
+ routing_intent: "all_channels"
108
+ ```
109
+
65
110
  ## Tool Input
66
111
 
67
- Use `syntax` + `expression` to specify the schedule type explicitly, or just `expression` to auto-detect.
112
+ Use `syntax` + `expression` to specify the schedule type explicitly, or just `expression` to auto-detect. For one-shot schedules, use `fire_at` instead of `expression`.
68
113
 
69
114
  ## Lifecycle
70
115
 
71
- 1. Create a schedule with a name, expression, and message.
72
- 2. At each trigger time, the message is dispatched to the assistant as if the user sent it.
73
- 3. Schedules can be enabled/disabled, updated, or deleted.
116
+ 1. Create a schedule with a name and either an expression (recurring) or fire_at (one-shot), plus a message.
117
+ 2. At each trigger time, the message is dispatched to the assistant (execute mode) or a notification is sent (notify mode).
118
+ 3. Schedules can be enabled/disabled, updated, or deleted. One-shot schedules are automatically disabled after firing.
74
119
 
75
120
  ## Tips
76
121
 
77
- - Only use `schedule_create` when the user explicitly wants recurring automation (e.g. "every day at 9am", "weekly on Mondays"). For one-time tasks, use the task list instead.
122
+ - Use `schedule_create` for both recurring automation ("every day at 9am") and one-time reminders ("remind me at 3pm").
123
+ - For task tracking ("add to my tasks", "add to my queue"), use task_list_add instead.
124
+ - `fire_at` must be a strict ISO 8601 timestamp with timezone offset or Z (e.g. `2025-03-15T09:00:00-05:00`).
125
+
126
+ ### Anchored & Ambiguous Relative Time
127
+
128
+ Phrases like "at the 45 minute mark", "at the top of the hour", "at noon", or "20 minutes in" are **clock-position or anchored relative time** expressions. Do NOT treat them as offsets from now.
129
+
130
+ **Resolution rules (in priority order):**
131
+
132
+ 1. **Session-anchored expressions** — if the user mentioned a start time earlier in conversation ("I got here at 9", "meeting started at 2:10"), interpret offset-style phrases ("the 45 minute mark", "20 minutes in") as `start_time + offset`.
133
+
134
+ 2. **Clock-position expressions** — when no start time is in context, map directly to a wall-clock time:
135
+ - "top of the hour" → next :00
136
+ - "the X minute mark" → current hour's :XX; if already past, advance one hour
137
+ - "noon" / "midnight" → 12:00 PM or 12:00 AM today; if past, tomorrow
138
+
139
+ 3. **Ask only if truly ambiguous** — if neither rule resolves, ask for clarification. Never silently default to "from now."
78
140
  - Timezones default to the system timezone if omitted. Use IANA timezone identifiers (e.g. "America/Los_Angeles").
79
141
  - Prefer RRULE for complex patterns that cron cannot express (e.g. "every other Tuesday", "last weekday of the month").
80
142
 
@@ -85,7 +147,6 @@ Before confirming a schedule to the user, you MUST verify that you have the capa
85
147
  When `schedule_create` returns, it includes an integration status summary. Cross-reference the scheduled task's requirements against the available integrations:
86
148
 
87
149
  - If the task involves **email** (reading, sending, OTP verification): an email integration must be connected (check the "email" category)
88
- - If the task involves **tweeting or reading Twitter**: Twitter must be connected
89
150
  - If the task involves **sending SMS or making calls**: SMS/Twilio must be connected
90
151
  - If the task involves **web browsing or form-filling**: browser automation must be available (check client type)
91
152
  - If the task involves a **multi-step workflow** (e.g., book appointment → read confirmation email), trace the full dependency chain