@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
@@ -1,267 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { parseArgs } from "node:util";
3
-
4
- import {
5
- compareInfluencers,
6
- getInfluencerProfile,
7
- type InfluencerSearchCriteria,
8
- searchInfluencers,
9
- } from "./client.js";
10
-
11
- // ---------------------------------------------------------------------------
12
- // Helpers
13
- // ---------------------------------------------------------------------------
14
-
15
- const isJson = process.argv.includes("--json");
16
-
17
- function output(data: unknown): void {
18
- process.stdout.write(
19
- isJson ? JSON.stringify(data) + "\n" : JSON.stringify(data, null, 2) + "\n",
20
- );
21
- }
22
-
23
- function outputError(message: string, code = 1): void {
24
- output({ ok: false, error: message });
25
- process.exitCode = code;
26
- }
27
-
28
- async function run(fn: () => Promise<unknown>): Promise<void> {
29
- try {
30
- const result = await fn();
31
- output({ ok: true, ...(result as Record<string, unknown>) });
32
- } catch (err) {
33
- outputError(err instanceof Error ? err.message : String(err));
34
- }
35
- }
36
-
37
- // ---------------------------------------------------------------------------
38
- // Utilities
39
- // ---------------------------------------------------------------------------
40
-
41
- /**
42
- * Parse human-friendly numbers like "10k", "1.5m", "100000" into integers.
43
- */
44
- function parseHumanNumber(text: string): number {
45
- const cleaned = text.toLowerCase().replace(/,/g, "").trim();
46
- const match = cleaned.match(/^([\d.]+)\s*([kmbt]?)$/);
47
- if (!match) return parseInt(text, 10) || 0;
48
-
49
- const num = parseFloat(match[1]);
50
- const suffix = match[2];
51
- const multipliers: Record<string, number> = {
52
- "": 1,
53
- k: 1_000,
54
- m: 1_000_000,
55
- b: 1_000_000_000,
56
- t: 1_000_000_000_000,
57
- };
58
-
59
- return Math.round(num * (multipliers[suffix] || 1));
60
- }
61
-
62
- // ---------------------------------------------------------------------------
63
- // Help
64
- // ---------------------------------------------------------------------------
65
-
66
- const USAGE = `influencer — Research influencers on Instagram, TikTok, and X/Twitter
67
-
68
- Uses the Chrome extension relay to browse each platform. Requires the user to
69
- be logged in on each platform in Chrome.
70
-
71
- USAGE
72
- influencer <subcommand> [options]
73
-
74
- SUBCOMMANDS
75
- search <query> Search for influencers matching criteria
76
- profile <username> Get detailed profile data for one influencer
77
- compare <platform:user ...> Compare multiple influencers side by side
78
-
79
- GLOBAL OPTIONS
80
- --json Machine-readable JSON output (compact, one line)
81
- --help, -h Show this help message
82
-
83
- SEARCH OPTIONS
84
- --platforms <list> Comma-separated platforms (default: instagram,tiktok,twitter)
85
- --min-followers <n> Minimum follower count (e.g. 10k, 1.5m, 50000)
86
- --max-followers <n> Maximum follower count
87
- --limit <n> Max results per platform (default: 10)
88
- --verified Only return verified accounts
89
-
90
- PROFILE OPTIONS
91
- --platform <name> Platform to look up (default: instagram)
92
-
93
- EXAMPLES
94
- influencer search "fitness coach" --platforms instagram,tiktok
95
- influencer search "vegan food" --min-followers 10k --max-followers 1m --json
96
- influencer profile natgeo --platform instagram
97
- influencer compare instagram:nike twitter:nike tiktok:nike
98
- `;
99
-
100
- if (process.argv.includes("--help") || process.argv.includes("-h")) {
101
- process.stdout.write(USAGE);
102
- process.exit(0);
103
- }
104
-
105
- // ---------------------------------------------------------------------------
106
- // Subcommand routing
107
- // ---------------------------------------------------------------------------
108
-
109
- const subcommand = process.argv[2];
110
-
111
- switch (subcommand) {
112
- case "search": {
113
- // Strip the subcommand and --json from argv for parseArgs
114
- const filteredArgs = process.argv.slice(3).filter((a) => a !== "--json");
115
-
116
- const { values, positionals } = parseArgs({
117
- args: filteredArgs,
118
- options: {
119
- platforms: { type: "string", default: "instagram,tiktok,twitter" },
120
- "min-followers": { type: "string" },
121
- "max-followers": { type: "string" },
122
- limit: { type: "string", default: "10" },
123
- verified: { type: "boolean", default: false },
124
- },
125
- allowPositionals: true,
126
- });
127
-
128
- const query = positionals[0];
129
- if (!query) {
130
- outputError("Missing required argument: <query>");
131
- break;
132
- }
133
-
134
- const platforms = (values.platforms as string)
135
- .split(",")
136
- .map((p) => p.trim().toLowerCase())
137
- .filter((p): p is "instagram" | "tiktok" | "twitter" =>
138
- ["instagram", "tiktok", "twitter"].includes(p),
139
- );
140
-
141
- const criteria: InfluencerSearchCriteria = {
142
- query,
143
- platforms,
144
- minFollowers: values["min-followers"]
145
- ? parseHumanNumber(values["min-followers"] as string)
146
- : undefined,
147
- maxFollowers: values["max-followers"]
148
- ? parseHumanNumber(values["max-followers"] as string)
149
- : undefined,
150
- limit: parseInt(values.limit as string, 10),
151
- verifiedOnly: values.verified as boolean,
152
- };
153
-
154
- await run(async () => {
155
- const results = await searchInfluencers(criteria);
156
- const totalProfiles = results.reduce((sum, r) => sum + r.count, 0);
157
- return {
158
- results,
159
- totalProfiles,
160
- platforms: platforms.length,
161
- query,
162
- };
163
- });
164
-
165
- break;
166
- }
167
-
168
- case "profile": {
169
- const filteredArgs = process.argv.slice(3).filter((a) => a !== "--json");
170
-
171
- const { values, positionals } = parseArgs({
172
- args: filteredArgs,
173
- options: {
174
- platform: { type: "string", default: "instagram" },
175
- },
176
- allowPositionals: true,
177
- });
178
-
179
- const username = positionals[0];
180
- if (!username) {
181
- outputError("Missing required argument: <username>");
182
- break;
183
- }
184
-
185
- const platform = (values.platform as string).toLowerCase() as
186
- | "instagram"
187
- | "tiktok"
188
- | "twitter";
189
- if (!["instagram", "tiktok", "twitter"].includes(platform)) {
190
- outputError(
191
- `Invalid platform: ${values.platform}. Use instagram, tiktok, or twitter.`,
192
- );
193
- break;
194
- }
195
-
196
- const cleanUsername = username.replace(/^@/, "");
197
-
198
- await run(async () => {
199
- const profile = await getInfluencerProfile(platform, cleanUsername);
200
- if (!profile) {
201
- throw new Error(
202
- `Could not find profile @${cleanUsername} on ${platform}`,
203
- );
204
- }
205
- return { profile };
206
- });
207
-
208
- break;
209
- }
210
-
211
- case "compare": {
212
- const filteredArgs = process.argv.slice(3).filter((a) => a !== "--json");
213
-
214
- const { positionals } = parseArgs({
215
- args: filteredArgs,
216
- options: {},
217
- allowPositionals: true,
218
- });
219
-
220
- if (positionals.length === 0) {
221
- outputError("Missing required arguments: <platform:username ...>");
222
- break;
223
- }
224
-
225
- const parsed = positionals.map((inf) => {
226
- const [platform, username] = inf.includes(":")
227
- ? inf.split(":", 2)
228
- : ["instagram", inf];
229
-
230
- const cleanPlatform = platform.toLowerCase() as
231
- | "instagram"
232
- | "tiktok"
233
- | "twitter";
234
- if (!["instagram", "tiktok", "twitter"].includes(cleanPlatform)) {
235
- throw new Error(
236
- `Invalid platform "${platform}" in "${inf}". Use instagram, tiktok, or twitter.`,
237
- );
238
- }
239
-
240
- return {
241
- platform: cleanPlatform,
242
- username: username.replace(/^@/, ""),
243
- };
244
- });
245
-
246
- await run(async () => {
247
- const profiles = await compareInfluencers(parsed);
248
- return {
249
- profiles,
250
- count: profiles.length,
251
- requested: parsed.length,
252
- };
253
- });
254
-
255
- break;
256
- }
257
-
258
- default: {
259
- process.stderr.write(
260
- subcommand
261
- ? `Unknown subcommand: ${subcommand}\n\n`
262
- : "No subcommand provided.\n\n",
263
- );
264
- process.stderr.write(USAGE);
265
- process.exitCode = 1;
266
- }
267
- }
@@ -1,65 +0,0 @@
1
- ---
2
- name: macos-automation
3
- description: Automate native macOS apps and system interactions via osascript (AppleScript)
4
- compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"🍎","vellum":{"display-name":"macOS Automation","user-invocable":false,"os":["darwin"]}}
6
- ---
7
-
8
- Use this skill to interact with native macOS apps and system-level features via `osascript` (AppleScript) through `host_bash`. Always prefer osascript over browser automation or computer-use for anything involving a native macOS app.
9
-
10
- ## Supported Apps
11
-
12
- **Communication:** Messages, Mail, Microsoft Outlook, FaceTime
13
- **Contacts & Calendar:** Contacts, Calendar, Reminders
14
- **Notes & Writing:** Notes, TextEdit, Pages, BBEdit, CotEditor
15
- **Files:** Finder, Path Finder
16
- **Browsers:** Safari, Google Chrome
17
- **Music & Media:** Music (iTunes), Spotify, VLC, Podcasts, TV
18
- **Productivity:** OmniFocus, Things 3, OmniOutliner, OmniPlan, OmniGraffle
19
- **Office:** Microsoft Word, Microsoft Excel, Numbers, Keynote
20
- **Developer tools:** Xcode, Terminal, iTerm2, Script Editor
21
- **System:** System Events (UI scripting for any app), System Settings
22
- **Automation:** Keyboard Maestro, Alfred, Automator
23
- **Creative:** Adobe Photoshop, Final Cut Pro
24
-
25
- For any unlisted app, check scriptability first:
26
- ```bash
27
- osascript -e 'tell application "AppName" to get name'
28
- ```
29
-
30
- ## Examples
31
-
32
- ```bash
33
- # Send an iMessage
34
- osascript -e 'tell application "Messages" to send "Hello!" to buddy "user@example.com"'
35
-
36
- # Look up a contact
37
- osascript -e 'tell application "Contacts" to get {name, phones} of every person whose name contains "Marina"'
38
-
39
- # Read upcoming calendar events
40
- osascript -e 'tell application "Calendar" to get summary of every event of calendar "Home" whose start date > (current date)'
41
-
42
- # Create a reminder
43
- osascript -e 'tell application "Reminders" to make new reminder with properties {name:"Buy milk", due date:((current date) + 1 * hours)}'
44
-
45
- # Send an email
46
- osascript -e 'tell application "Mail" to send (make new outgoing message with properties {subject:"Hi", content:"Hello", visible:true})'
47
-
48
- # Create a note
49
- osascript -e 'tell application "Notes" to make new note at folder "Notes" with properties {body:"My note"}'
50
-
51
- # Open a URL in Safari
52
- osascript -e 'tell application "Safari" to open location "https://example.com"'
53
-
54
- # Play/pause Music
55
- osascript -e 'tell application "Music" to playpause'
56
-
57
- # Display a system notification
58
- osascript -e 'display notification "Done!" with title "Vellum"'
59
- ```
60
-
61
- ## Tips
62
-
63
- - For multi-line scripts, write them to a `.applescript` file and run with `osascript path/to/script.applescript`
64
- - Use `System Events` for UI scripting apps that don't have their own AppleScript dictionary
65
- - AppleScript permissions are gated by macOS TCC — if a command fails with a permission error, use `request_system_permission` to prompt the user
@@ -1,12 +0,0 @@
1
- <svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
2
- <rect x="2" y="2" width="12" height="11" fill="#e8e8e8" stroke="#333" stroke-width="1"/>
3
- <rect x="3" y="3" width="10" height="9" fill="#f5f5f5"/>
4
- <circle cx="8" cy="7" r="2" fill="#0071e3"/>
5
- <rect x="5" y="5" width="1" height="1" fill="#333"/>
6
- <rect x="10" y="5" width="1" height="1" fill="#333"/>
7
- <rect x="5" y="9" width="1" height="1" fill="#333"/>
8
- <rect x="10" y="9" width="1" height="1" fill="#333"/>
9
- <path d="M 8 4 L 8 6 M 6 7 L 8 7 M 8 8 L 8 10 M 8 7 L 10 7" stroke="#0071e3" stroke-width="1" fill="none"/>
10
- <rect x="3" y="13" width="10" height="1" fill="#333"/>
11
- <rect x="4" y="14" width="8" height="1" fill="#0071e3"/>
12
- </svg>
@@ -1,75 +0,0 @@
1
- ---
2
- name: mcp-setup
3
- description: Add, authenticate, list, and remove MCP (Model Context Protocol) servers
4
- compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"🔌","vellum":{"display-name":"MCP Setup","user-invocable":false}}
6
- ---
7
-
8
- Help users configure MCP servers so external tools (e.g. Linear, GitHub, Notion) become available in conversations.
9
-
10
- ## CLI Commands
11
-
12
- All commands use `assistant mcp`. Run them via `host_bash`.
13
-
14
- ### List servers
15
-
16
- ```
17
- assistant mcp list
18
- ```
19
-
20
- Shows all configured servers with connection status, transport type, and URL.
21
-
22
- ### Add a server
23
-
24
- ```
25
- assistant mcp add <name> -t <transport-type> -u <url> [-r <risk>] [--disabled]
26
- ```
27
-
28
- - `<name>` — unique identifier (e.g. `linear`, `github`)
29
- - `-t` — transport type: `stdio`, `sse`, or `streamable-http`
30
- - `-u` — server URL (required for `sse`/`streamable-http`)
31
- - `-c` — command (required for `stdio`), `-a` for args
32
- - `-r` — risk level: `low`, `medium`, or `high` (default: `high`)
33
-
34
- Examples:
35
-
36
- ```
37
- assistant mcp add linear -t streamable-http -u https://mcp.linear.app/mcp
38
- assistant mcp add context7 -t streamable-http -u https://mcp.context7.com/mcp -r low
39
- assistant mcp add local-db -t stdio -c npx -a -y @my/mcp-server
40
- ```
41
-
42
- ### Authenticate (OAuth)
43
-
44
- ```
45
- assistant mcp auth <name>
46
- ```
47
-
48
- Opens the user's browser for OAuth authorization. Only works for `sse`/`streamable-http` servers that require authentication. After the user completes login in the browser, tokens are saved automatically.
49
-
50
- Use this when:
51
-
52
- - A server shows `! Needs authentication` in `assistant mcp list`
53
- - An MCP tool call fails with an auth/token error
54
- - Setting up a new OAuth-protected server for the first time
55
-
56
- ### Remove a server
57
-
58
- ```
59
- assistant mcp remove <name>
60
- ```
61
-
62
- Removes the server config and cleans up any stored OAuth credentials.
63
-
64
- ## After Changes
65
-
66
- After adding, removing, or authenticating a server, the user must **quit and relaunch the Vellum app** for changes to take effect. The app runs its own assistant process — `assistant daemon restart` only restarts the CLI assistant, which is a separate process.
67
-
68
- Tell the user: "Please quit and relaunch the Vellum app, then start a new conversation."
69
-
70
- ## When to Use
71
-
72
- - User asks to connect/set up an external service via MCP
73
- - User asks "what MCP servers do I have?"
74
- - An MCP tool returns an auth error — offer to run `assistant mcp auth <name>`
75
- - User wants to remove an MCP integration
@@ -1,184 +0,0 @@
1
- /**
2
- * Media diagnostics tool.
3
- *
4
- * Surfaces processing stats, per-stage timing, failure reasons,
5
- * and cost estimation for a media asset.
6
- * All metrics are generic media-processing infrastructure.
7
- */
8
-
9
- import { readFile } from "node:fs/promises";
10
- import { dirname, join } from "node:path";
11
-
12
- import {
13
- getKeyframesForAsset,
14
- getMediaAssetById,
15
- getProcessingStagesForAsset,
16
- type ProcessingStage,
17
- } from "../../../../memory/media-store.js";
18
- import type {
19
- ToolContext,
20
- ToolExecutionResult,
21
- } from "../../../../tools/types.js";
22
- import type { PreprocessManifest } from "../services/preprocess.js";
23
- import type { ReduceCostData } from "../services/reduce.js";
24
- // ---------------------------------------------------------------------------
25
- // Cost estimation constants (Gemini 2.5 Flash pricing)
26
- // ---------------------------------------------------------------------------
27
-
28
- /** Estimated cost per segment Map call (Gemini 2.5 Flash with ~10 frames). */
29
- const ESTIMATED_COST_PER_SEGMENT_USD = 0.001;
30
-
31
- // ---------------------------------------------------------------------------
32
- // Types
33
- // ---------------------------------------------------------------------------
34
-
35
- interface StageDiagnostic {
36
- stage: string;
37
- status: string;
38
- progress: number;
39
- durationMs: number | null;
40
- lastError: string | null;
41
- }
42
-
43
- interface DiagnosticReport {
44
- assetId: string;
45
- assetTitle: string;
46
- assetStatus: string;
47
- mediaType: string;
48
- durationSeconds: number | null;
49
- processingStats: {
50
- totalKeyframes: number;
51
- };
52
- stages: StageDiagnostic[];
53
- costEstimate: {
54
- mapPhase: {
55
- keyframeCount: number;
56
- estimatedSegments: number;
57
- estimatedCostPerSegment: number;
58
- estimatedMapCost: number;
59
- };
60
- reduceCost: ReduceCostData | null;
61
- estimatedTotalCost: number;
62
- currency: string;
63
- note: string;
64
- };
65
- }
66
-
67
- // ---------------------------------------------------------------------------
68
- // Helpers
69
- // ---------------------------------------------------------------------------
70
-
71
- function computeStageDuration(stage: ProcessingStage): number | null {
72
- if (stage.startedAt == null) return null;
73
- if (stage.completedAt != null) return stage.completedAt - stage.startedAt;
74
- // Only use Date.now() as a fallback for currently running stages
75
- if (stage.status === "running") return Date.now() - stage.startedAt;
76
- // For failed/pending stages without completedAt, duration is unknown
77
- return null;
78
- }
79
-
80
- // ---------------------------------------------------------------------------
81
- // Main entry point
82
- // ---------------------------------------------------------------------------
83
-
84
- export async function run(
85
- input: Record<string, unknown>,
86
- _context: ToolContext,
87
- ): Promise<ToolExecutionResult> {
88
- const assetId = input.asset_id as string | undefined;
89
- if (!assetId) {
90
- return { content: "asset_id is required.", isError: true };
91
- }
92
-
93
- const asset = getMediaAssetById(assetId);
94
- if (!asset) {
95
- return { content: `Media asset not found: ${assetId}`, isError: true };
96
- }
97
-
98
- // Gather processing stats
99
- const keyframes = getKeyframesForAsset(assetId);
100
-
101
- // Per-stage diagnostics (new pipeline: preprocess, map, reduce)
102
- const stages = getProcessingStagesForAsset(assetId);
103
- const stageDiagnostics: StageDiagnostic[] = stages.map((s) => ({
104
- stage: s.stage,
105
- status: s.status,
106
- progress: s.progress,
107
- durationMs: computeStageDuration(s),
108
- lastError: s.lastError,
109
- }));
110
-
111
- // Cost estimation: Gemini 2.5 Flash is ~$0.001 per segment (~10 frames each)
112
- const keyframeCount = keyframes.length;
113
-
114
- // Prefer actual segment count from preprocess manifest when available
115
- let estimatedSegments: number;
116
- const manifestPath = join(
117
- dirname(asset.filePath),
118
- "pipeline",
119
- asset.id,
120
- "manifest.json",
121
- );
122
- try {
123
- const raw = await readFile(manifestPath, "utf-8");
124
- const manifest: PreprocessManifest = JSON.parse(raw);
125
- estimatedSegments = manifest.segments.length;
126
- } catch {
127
- // Manifest doesn't exist yet (preprocess hasn't run) — fall back to estimation
128
- estimatedSegments = Math.ceil(keyframeCount / 10);
129
- }
130
-
131
- const estimatedMapCost = estimatedSegments * ESTIMATED_COST_PER_SEGMENT_USD;
132
-
133
- // Load reduce cost data if available
134
- const reduceCostPath = join(
135
- dirname(asset.filePath),
136
- "pipeline",
137
- asset.id,
138
- "reduce-cost.json",
139
- );
140
- let reduceCost: ReduceCostData | null = null;
141
- try {
142
- const raw = await readFile(reduceCostPath, "utf-8");
143
- reduceCost = JSON.parse(raw) as ReduceCostData;
144
- } catch {
145
- // No reduce cost data yet
146
- }
147
-
148
- // Combine map + reduce costs for the total estimate
149
- // Reduce cost is token-based; use a rough estimate of $3/M input + $15/M output (Claude Sonnet-class)
150
- const reduceEstimatedCost = reduceCost
151
- ? (reduceCost.totalInputTokens * 3 + reduceCost.totalOutputTokens * 15) /
152
- 1_000_000
153
- : 0;
154
- const estimatedTotalCost = estimatedMapCost + reduceEstimatedCost;
155
-
156
- const report: DiagnosticReport = {
157
- assetId: asset.id,
158
- assetTitle: asset.title,
159
- assetStatus: asset.status,
160
- mediaType: asset.mediaType,
161
- durationSeconds: asset.durationSeconds,
162
- processingStats: {
163
- totalKeyframes: keyframeCount,
164
- },
165
- stages: stageDiagnostics,
166
- costEstimate: {
167
- mapPhase: {
168
- keyframeCount,
169
- estimatedSegments,
170
- estimatedCostPerSegment: ESTIMATED_COST_PER_SEGMENT_USD,
171
- estimatedMapCost: Math.round(estimatedMapCost * 1000) / 1000,
172
- },
173
- reduceCost,
174
- estimatedTotalCost: Math.round(estimatedTotalCost * 1000000) / 1000000,
175
- currency: "USD",
176
- note: "Map: Gemini 2.5 Flash per segment. Reduce: Claude token-based ($3/M input, $15/M output).",
177
- },
178
- };
179
-
180
- return {
181
- content: JSON.stringify(report, null, 2),
182
- isError: false,
183
- };
184
- }
@@ -1,80 +0,0 @@
1
- import {
2
- batchModifyMessages,
3
- listMessages,
4
- } from "../../../../messaging/providers/gmail/client.js";
5
- import { getMessagingProvider } from "../../../../messaging/registry.js";
6
- import { withValidToken } from "../../../../security/token-manager.js";
7
- import type {
8
- ToolContext,
9
- ToolExecutionResult,
10
- } from "../../../../tools/types.js";
11
- import { err, ok } from "./shared.js";
12
-
13
- const BATCH_MODIFY_LIMIT = 1000;
14
- const MAX_MESSAGES = 5000;
15
-
16
- export async function run(
17
- input: Record<string, unknown>,
18
- context: ToolContext,
19
- ): Promise<ToolExecutionResult> {
20
- if (!context.triggeredBySurfaceAction) {
21
- return err(
22
- "This tool requires user confirmation via a surface action. Present results in a selection table with action buttons and wait for the user to click before proceeding.",
23
- );
24
- }
25
-
26
- const query = input.query as string;
27
-
28
- if (!query) {
29
- return err("query is required.");
30
- }
31
-
32
- try {
33
- const provider = getMessagingProvider("gmail");
34
- return withValidToken(provider.credentialService, async (token) => {
35
- // Paginate through matching messages, capped to prevent unbounded API/memory usage
36
- const allMessageIds: string[] = [];
37
- let pageToken: string | undefined;
38
- let truncated = false;
39
-
40
- while (allMessageIds.length < MAX_MESSAGES) {
41
- const listResp = await listMessages(
42
- token,
43
- query,
44
- Math.min(500, MAX_MESSAGES - allMessageIds.length),
45
- pageToken,
46
- );
47
- const ids = (listResp.messages ?? []).map((m) => m.id);
48
- if (ids.length === 0) break;
49
- allMessageIds.push(...ids);
50
- pageToken = listResp.nextPageToken ?? undefined;
51
- if (!pageToken) break;
52
- }
53
-
54
- // If we stopped because we hit the cap while more pages existed, flag truncation
55
- if (allMessageIds.length >= MAX_MESSAGES && pageToken) {
56
- truncated = true;
57
- }
58
-
59
- if (allMessageIds.length === 0) {
60
- return ok("No messages matched the query. Nothing archived.");
61
- }
62
-
63
- // Archive in chunks of BATCH_MODIFY_LIMIT (Gmail's per-call limit)
64
- for (let i = 0; i < allMessageIds.length; i += BATCH_MODIFY_LIMIT) {
65
- const chunk = allMessageIds.slice(i, i + BATCH_MODIFY_LIMIT);
66
- await batchModifyMessages(token, chunk, { removeLabelIds: ["INBOX"] });
67
- }
68
-
69
- const summary = `Archived ${allMessageIds.length} message(s) matching query: ${query}`;
70
- if (truncated) {
71
- return ok(
72
- `${summary}\n\nNote: this operation was capped at ${MAX_MESSAGES} messages. Additional messages matching the query may remain in the inbox. Run the command again to archive more.`,
73
- );
74
- }
75
- return ok(summary);
76
- });
77
- } catch (e) {
78
- return err(e instanceof Error ? e.message : String(e));
79
- }
80
- }