@vellumai/assistant 0.4.43 β†’ 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 (713) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +46 -44
  3. package/README.md +15 -16
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -215
  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 -3
  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-asset.test.ts +1 -1
  40. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  41. package/src/__tests__/call-controller.test.ts +0 -1
  42. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  43. package/src/__tests__/call-domain.test.ts +0 -1
  44. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  45. package/src/__tests__/call-recovery.test.ts +0 -1
  46. package/src/__tests__/call-routes-http.test.ts +0 -1
  47. package/src/__tests__/call-store.test.ts +0 -1
  48. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  49. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  50. package/src/__tests__/channel-approvals.test.ts +1 -1
  51. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  52. package/src/__tests__/channel-guardian.test.ts +5 -7
  53. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  54. package/src/__tests__/checker.test.ts +32 -36
  55. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  56. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  57. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  58. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  59. package/src/__tests__/computer-use-tools.test.ts +35 -31
  60. package/src/__tests__/config-schema.test.ts +11 -15
  61. package/src/__tests__/config-watcher.test.ts +0 -1
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  63. package/src/__tests__/conflict-store.test.ts +0 -1
  64. package/src/__tests__/connection-policy.test.ts +4 -7
  65. package/src/__tests__/contacts-tools.test.ts +0 -1
  66. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  67. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  68. package/src/__tests__/context-window-manager.test.ts +147 -60
  69. package/src/__tests__/contradiction-checker.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  71. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  72. package/src/__tests__/conversation-pairing.test.ts +2 -2
  73. package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
  74. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  75. package/src/__tests__/conversation-store.test.ts +0 -1
  76. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  77. package/src/__tests__/credential-security-invariants.test.ts +8 -8
  78. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  79. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  80. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  81. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  82. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  83. package/src/__tests__/diagnostics-export.test.ts +189 -0
  84. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  86. package/src/__tests__/entity-extractor.test.ts +0 -1
  87. package/src/__tests__/entity-search.test.ts +0 -1
  88. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  89. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  90. package/src/__tests__/file-read-tool.test.ts +86 -0
  91. package/src/__tests__/followup-tools.test.ts +0 -1
  92. package/src/__tests__/frontmatter.test.ts +77 -34
  93. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  94. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  95. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  96. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  97. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  98. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  99. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  100. package/src/__tests__/guardian-action-store.test.ts +0 -1
  101. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  102. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  103. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  104. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  105. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  106. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  107. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  108. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  110. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  112. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  113. package/src/__tests__/host-file-proxy.test.ts +374 -0
  114. package/src/__tests__/host-shell-tool.test.ts +147 -1
  115. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  116. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  117. package/src/__tests__/integration-status.test.ts +3 -8
  118. package/src/__tests__/intent-routing.test.ts +7 -46
  119. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  120. package/src/__tests__/invite-routes-http.test.ts +0 -1
  121. package/src/__tests__/llm-usage-store.test.ts +0 -1
  122. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  123. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  124. package/src/__tests__/managed-store.test.ts +94 -21
  125. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  126. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  127. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  128. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  129. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  130. package/src/__tests__/memory-regressions.test.ts +0 -1
  131. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  132. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  133. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  134. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  136. package/src/__tests__/migration-export-http.test.ts +2 -3
  137. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  138. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  139. package/src/__tests__/migration-validate-http.test.ts +1 -2
  140. package/src/__tests__/native-web-search.test.ts +475 -0
  141. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  142. package/src/__tests__/non-member-access-request.test.ts +0 -1
  143. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  144. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  145. package/src/__tests__/notification-deep-link.test.ts +7 -7
  146. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  147. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  148. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  149. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  150. package/src/__tests__/onboarding-template-contract.test.ts +0 -10
  151. package/src/__tests__/playbook-execution.test.ts +0 -1
  152. package/src/__tests__/playbook-tools.test.ts +0 -1
  153. package/src/__tests__/profile-compiler.test.ts +0 -1
  154. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  155. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  156. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  157. package/src/__tests__/recording-handler.test.ts +30 -94
  158. package/src/__tests__/registry.test.ts +28 -35
  159. package/src/__tests__/relay-server.test.ts +0 -1
  160. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  163. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  164. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  165. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  166. package/src/__tests__/schedule-store.test.ts +441 -1
  167. package/src/__tests__/schedule-tools.test.ts +468 -7
  168. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  169. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  170. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  171. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  172. package/src/__tests__/secret-response-routing.test.ts +4 -1
  173. package/src/__tests__/send-endpoint-busy.test.ts +14 -5
  174. package/src/__tests__/send-notification-tool.test.ts +0 -7
  175. package/src/__tests__/sequence-store.test.ts +0 -1
  176. package/src/__tests__/server-history-render.test.ts +1 -2
  177. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  178. package/src/__tests__/session-agent-loop.test.ts +46 -6
  179. package/src/__tests__/session-confirmation-signals.test.ts +7 -46
  180. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  181. package/src/__tests__/session-error.test.ts +5 -14
  182. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  183. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  184. package/src/__tests__/session-media-retry.test.ts +12 -74
  185. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  186. package/src/__tests__/session-profile-injection.test.ts +2 -6
  187. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  188. package/src/__tests__/session-queue.test.ts +94 -139
  189. package/src/__tests__/session-skill-tools.test.ts +115 -115
  190. package/src/__tests__/session-slash-known.test.ts +0 -1
  191. package/src/__tests__/session-slash-queue.test.ts +0 -1
  192. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  193. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  194. package/src/__tests__/session-usage.test.ts +0 -1
  195. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  196. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  199. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  200. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  201. package/src/__tests__/skill-load-tool.test.ts +194 -2
  202. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  203. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  204. package/src/__tests__/skills.test.ts +14 -53
  205. package/src/__tests__/slack-channel-config.test.ts +0 -1
  206. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  207. package/src/__tests__/slack-skill.test.ts +1 -1
  208. package/src/__tests__/starter-task-flow.test.ts +9 -19
  209. package/src/__tests__/subagent-tools.test.ts +2 -2
  210. package/src/__tests__/system-prompt.test.ts +7 -7
  211. package/src/__tests__/task-compiler.test.ts +0 -1
  212. package/src/__tests__/task-management-tools.test.ts +0 -1
  213. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  214. package/src/__tests__/task-runner.test.ts +0 -1
  215. package/src/__tests__/task-scheduler.test.ts +0 -1
  216. package/src/__tests__/terminal-tools.test.ts +0 -1
  217. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  218. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  219. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  220. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  221. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  222. package/src/__tests__/tool-executor.test.ts +8 -86
  223. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  224. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  225. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  226. package/src/__tests__/trust-store.test.ts +84 -8
  227. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  228. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  229. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  230. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  231. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  232. package/src/__tests__/twilio-provider.test.ts +0 -1
  233. package/src/__tests__/twilio-routes.test.ts +0 -1
  234. package/src/__tests__/{request-file-tool.test.ts β†’ ui-file-upload-surface.test.ts} +11 -72
  235. package/src/__tests__/update-bulletin.test.ts +0 -1
  236. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  237. package/src/__tests__/usage-routes.test.ts +0 -1
  238. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  239. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  240. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  241. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  242. package/src/__tests__/web-fetch.test.ts +57 -0
  243. package/src/__tests__/workspace-git-service.test.ts +5 -14
  244. package/src/__tests__/workspace-policy.test.ts +0 -1
  245. package/src/agent/loop.ts +22 -34
  246. package/src/bundler/bundle-signer.ts +4 -4
  247. package/src/calls/call-controller.ts +1 -1
  248. package/src/calls/relay-server.ts +1 -1
  249. package/src/calls/twilio-rest.ts +1 -1
  250. package/src/calls/voice-session-bridge.ts +3 -1
  251. package/src/cli/__tests__/notifications.test.ts +3 -4
  252. package/src/cli/commands/map.ts +2 -6
  253. package/src/cli/commands/mcp.ts +73 -15
  254. package/src/cli/commands/notifications.ts +4 -4
  255. package/src/cli/commands/sessions.ts +9 -1
  256. package/src/cli/commands/skills.ts +6 -10
  257. package/src/cli/http-client.ts +2 -3
  258. package/src/cli/main-screen.tsx +10 -10
  259. package/src/cli/program.ts +0 -4
  260. package/src/cli/reference.ts +0 -2
  261. package/src/cli.ts +15 -9
  262. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  263. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  264. package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
  265. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  266. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  267. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  268. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  269. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  270. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  271. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  272. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  273. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  274. package/src/config/bundled-skills/{messaging β†’ contacts}/tools/google-contacts.ts +9 -2
  275. package/src/config/bundled-skills/document/SKILL.md +4 -1
  276. package/src/config/bundled-skills/doordash/SKILL.md +8 -2
  277. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
  278. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
  279. package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
  280. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  281. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  282. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  283. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  284. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  285. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  286. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-draft.ts +1 -1
  287. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-filters.ts +1 -1
  288. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-follow-up.ts +1 -1
  289. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-forward.ts +1 -1
  290. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  291. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-outreach-scan.ts +8 -90
  292. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-send-draft.ts +1 -1
  293. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-sender-digest.ts +2 -2
  294. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-trash.ts +1 -1
  295. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-unsubscribe.ts +1 -1
  296. package/src/config/bundled-skills/{messaging β†’ gmail}/tools/gmail-vacation.ts +1 -1
  297. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  298. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  299. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  300. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  301. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  302. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  303. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  304. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  305. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  306. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  308. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  309. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  310. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  311. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  312. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  313. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts β†’ orchestration/tools/swarm-delegate.ts} +3 -3
  314. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  315. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  316. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  317. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  318. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  319. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  320. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts β†’ screen-watch/tools/start-screen-watch.ts} +3 -3
  321. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  322. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  323. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  324. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  325. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  326. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  327. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  328. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  329. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts β†’ settings/tools/set-avatar.ts} +2 -6
  330. package/src/{tools/system/voice-config.ts β†’ config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  331. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  332. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  333. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts β†’ skill-management/tools/delete-managed.ts} +2 -6
  334. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  335. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  336. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  337. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  338. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  339. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  340. package/src/config/bundled-tool-registry.ts +118 -107
  341. package/src/config/env.ts +5 -2
  342. package/src/config/feature-flag-registry.json +33 -9
  343. package/src/config/loader.ts +10 -2
  344. package/src/config/schema.ts +19 -16
  345. package/src/config/schemas/inference.ts +12 -22
  346. package/src/config/schemas/memory-storage.ts +19 -1
  347. package/src/config/schemas/platform.ts +0 -16
  348. package/src/config/skill-state.ts +11 -8
  349. package/src/config/skills.ts +83 -32
  350. package/src/context/token-estimator.ts +11 -0
  351. package/src/context/window-manager.ts +180 -151
  352. package/src/daemon/computer-use-session.ts +11 -43
  353. package/src/daemon/daemon-control.ts +4 -1
  354. package/src/daemon/handlers/config-channels.ts +5 -9
  355. package/src/daemon/handlers/config-ingress.ts +0 -4
  356. package/src/daemon/handlers/config-model.ts +7 -13
  357. package/src/daemon/handlers/config-telegram.ts +4 -8
  358. package/src/daemon/handlers/config-voice.ts +2 -5
  359. package/src/daemon/handlers/dictation.ts +2 -12
  360. package/src/daemon/handlers/identity.ts +0 -105
  361. package/src/daemon/handlers/recording.ts +3 -23
  362. package/src/daemon/handlers/session-history.ts +42 -10
  363. package/src/daemon/handlers/sessions.ts +53 -72
  364. package/src/daemon/handlers/shared.ts +7 -28
  365. package/src/daemon/handlers/skills.ts +31 -27
  366. package/src/daemon/host-bash-proxy.ts +148 -0
  367. package/src/daemon/host-file-proxy.ts +135 -0
  368. package/src/daemon/lifecycle.ts +53 -41
  369. package/src/daemon/mcp-reload-service.ts +123 -0
  370. package/src/daemon/message-protocol.ts +6 -0
  371. package/src/daemon/message-types/apps.ts +0 -25
  372. package/src/daemon/message-types/browser.ts +1 -1
  373. package/src/daemon/message-types/computer-use.ts +1 -4
  374. package/src/daemon/message-types/guardian-actions.ts +1 -1
  375. package/src/daemon/message-types/host-bash.ts +18 -0
  376. package/src/daemon/message-types/host-file.ts +44 -0
  377. package/src/daemon/message-types/integrations.ts +1 -73
  378. package/src/daemon/message-types/messages.ts +15 -0
  379. package/src/daemon/message-types/schedules.ts +11 -27
  380. package/src/daemon/message-types/sessions.ts +8 -2
  381. package/src/daemon/message-types/settings.ts +1 -1
  382. package/src/daemon/message-types/shared.ts +1 -1
  383. package/src/daemon/message-types/surfaces.ts +2 -0
  384. package/src/daemon/ride-shotgun-handler.ts +35 -43
  385. package/src/daemon/seed-files.ts +3 -27
  386. package/src/daemon/server.ts +45 -28
  387. package/src/daemon/session-agent-loop-handlers.ts +72 -9
  388. package/src/daemon/session-agent-loop.ts +97 -66
  389. package/src/daemon/session-attachments.ts +1 -1
  390. package/src/daemon/session-error.ts +17 -16
  391. package/src/daemon/session-lifecycle.ts +20 -1
  392. package/src/daemon/session-media-retry.ts +1 -15
  393. package/src/daemon/session-messaging.ts +14 -6
  394. package/src/daemon/session-process.ts +36 -7
  395. package/src/daemon/session-queue-manager.ts +62 -103
  396. package/src/daemon/session-runtime-assembly.ts +27 -7
  397. package/src/daemon/session-skill-tools.ts +12 -11
  398. package/src/daemon/session-slash.ts +7 -0
  399. package/src/daemon/session-surfaces.ts +192 -118
  400. package/src/daemon/session-tool-setup.ts +146 -6
  401. package/src/daemon/session.ts +75 -37
  402. package/src/errors.ts +0 -2
  403. package/src/export/formatter.ts +6 -0
  404. package/src/mcp/mcp-oauth-provider.ts +1 -3
  405. package/src/media/avatar-router.ts +20 -28
  406. package/src/media/avatar-types.ts +7 -14
  407. package/src/media/managed-avatar-client.ts +70 -34
  408. package/src/memory/app-store.ts +0 -18
  409. package/src/memory/conversation-title-service.ts +1 -2
  410. package/src/memory/db-init.ts +16 -0
  411. package/src/memory/embedding-backend.ts +129 -27
  412. package/src/memory/embedding-gemini.test.ts +256 -0
  413. package/src/memory/embedding-gemini.ts +47 -13
  414. package/src/memory/embedding-local.ts +14 -2
  415. package/src/memory/embedding-ollama.ts +15 -2
  416. package/src/memory/embedding-openai.ts +15 -2
  417. package/src/memory/embedding-types.test.ts +116 -0
  418. package/src/memory/embedding-types.ts +61 -0
  419. package/src/memory/fingerprint.ts +1 -1
  420. package/src/memory/indexer.ts +25 -1
  421. package/src/memory/job-handlers/embedding.test.ts +258 -0
  422. package/src/memory/job-handlers/embedding.ts +81 -1
  423. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  424. package/src/memory/job-handlers/media-processing.ts +11 -1
  425. package/src/memory/job-utils.ts +21 -6
  426. package/src/memory/jobs-store.ts +5 -1
  427. package/src/memory/jobs-worker.ts +8 -0
  428. package/src/memory/message-content.ts +66 -0
  429. package/src/memory/migrations/100-core-tables.ts +1 -31
  430. package/src/memory/migrations/104-core-indexes.ts +0 -11
  431. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  432. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  433. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  434. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  435. package/src/memory/migrations/index.ts +4 -0
  436. package/src/memory/migrations/registry.ts +19 -0
  437. package/src/memory/qdrant-client.ts +158 -43
  438. package/src/memory/retriever.test.ts +0 -1
  439. package/src/memory/retriever.ts +12 -2
  440. package/src/memory/schema/infrastructure.ts +5 -37
  441. package/src/memory/search/formatting.ts +34 -9
  442. package/src/memory/search/semantic.ts +57 -2
  443. package/src/memory/search/types.ts +2 -1
  444. package/src/notifications/AGENTS.md +2 -2
  445. package/src/notifications/README.md +59 -58
  446. package/src/notifications/adapters/macos.ts +1 -1
  447. package/src/notifications/broadcaster.ts +5 -5
  448. package/src/notifications/copy-composer.ts +1 -1
  449. package/src/notifications/decision-engine.ts +2 -2
  450. package/src/notifications/destination-resolver.ts +2 -2
  451. package/src/notifications/emit-signal.ts +8 -8
  452. package/src/notifications/signal.ts +1 -1
  453. package/src/notifications/thread-seed-composer.ts +1 -1
  454. package/src/oauth/connect-orchestrator.ts +1 -1
  455. package/src/oauth/token-persistence.ts +1 -1
  456. package/src/permissions/checker.ts +12 -1
  457. package/src/permissions/defaults.ts +13 -17
  458. package/src/permissions/trust-store.ts +37 -0
  459. package/src/permissions/workspace-policy.ts +0 -1
  460. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  461. package/src/prompts/computer-use-prompt.ts +1 -1
  462. package/src/prompts/system-prompt.ts +33 -35
  463. package/src/prompts/templates/BOOTSTRAP.md +0 -3
  464. package/src/prompts/templates/SOUL.md +1 -2
  465. package/src/prompts/templates/UPDATES.md +16 -7
  466. package/src/providers/anthropic/client.ts +87 -33
  467. package/src/providers/gemini/client.ts +6 -0
  468. package/src/providers/managed-proxy/constants.ts +5 -0
  469. package/src/providers/openai/client.ts +15 -0
  470. package/src/providers/registry.ts +4 -6
  471. package/src/providers/types.ts +24 -2
  472. package/src/runtime/AGENTS.md +18 -0
  473. package/src/runtime/assistant-event-hub.ts +2 -3
  474. package/src/runtime/assistant-event.ts +4 -4
  475. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  476. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  477. package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
  478. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts β†’ local-auth-context.test.ts} +21 -21
  479. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  480. package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
  481. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  482. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  483. package/src/runtime/auth/route-policy.ts +8 -8
  484. package/src/runtime/auth/scopes.ts +2 -1
  485. package/src/runtime/auth/subject.ts +4 -4
  486. package/src/runtime/auth/token-service.ts +1 -24
  487. package/src/runtime/auth/types.ts +3 -3
  488. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  489. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  490. package/src/runtime/guardian-action-service.ts +3 -3
  491. package/src/runtime/http-server.ts +15 -2
  492. package/src/runtime/http-types.ts +10 -0
  493. package/src/runtime/invite-service.ts +3 -3
  494. package/src/runtime/local-actor-identity.ts +17 -22
  495. package/src/runtime/middleware/error-handler.ts +14 -1
  496. package/src/runtime/pending-interactions.ts +21 -9
  497. package/src/runtime/routes/app-management-routes.ts +63 -67
  498. package/src/runtime/routes/approval-routes.ts +1 -3
  499. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  500. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  501. package/src/runtime/routes/btw-routes.ts +155 -0
  502. package/src/runtime/routes/computer-use-routes.ts +77 -31
  503. package/src/runtime/routes/conversation-routes.ts +234 -47
  504. package/src/runtime/routes/diagnostics-routes.ts +154 -43
  505. package/src/runtime/routes/documents-routes.ts +2 -2
  506. package/src/runtime/routes/global-search-routes.ts +1 -1
  507. package/src/runtime/routes/host-bash-routes.ts +83 -0
  508. package/src/runtime/routes/host-file-routes.ts +79 -0
  509. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  510. package/src/runtime/routes/log-export-routes.ts +120 -0
  511. package/src/runtime/routes/mcp-routes.ts +20 -0
  512. package/src/runtime/routes/migration-routes.ts +3 -3
  513. package/src/runtime/routes/pairing-routes.ts +1 -1
  514. package/src/runtime/routes/recording-routes.ts +6 -4
  515. package/src/runtime/routes/schedule-routes.ts +31 -5
  516. package/src/runtime/routes/session-management-routes.ts +2 -6
  517. package/src/runtime/routes/session-query-routes.ts +18 -15
  518. package/src/runtime/routes/settings-routes.ts +7 -351
  519. package/src/runtime/routes/skills-routes.ts +7 -6
  520. package/src/runtime/routes/subagents-routes.ts +4 -10
  521. package/src/runtime/routes/surface-action-routes.ts +3 -14
  522. package/src/runtime/routes/surface-content-routes.ts +22 -5
  523. package/src/runtime/routes/work-items-routes.ts +21 -25
  524. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  525. package/src/runtime/routes/workspace-utils.ts +1 -1
  526. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  527. package/src/runtime/verification-outbound-actions.ts +2 -2
  528. package/src/schedule/integration-status.ts +0 -6
  529. package/src/schedule/schedule-store.ts +234 -43
  530. package/src/schedule/scheduler.ts +73 -74
  531. package/src/security/oauth2.ts +1 -1
  532. package/src/sequence/store.ts +12 -2
  533. package/src/skills/frontmatter.ts +19 -77
  534. package/src/skills/managed-store.ts +11 -2
  535. package/src/subagent/manager.ts +5 -3
  536. package/src/tasks/ephemeral-permissions.ts +3 -5
  537. package/src/tools/AGENTS.md +37 -0
  538. package/src/tools/apps/executors.ts +0 -6
  539. package/src/tools/browser/browser-manager.ts +17 -11
  540. package/src/tools/browser/jit-auth.ts +4 -1
  541. package/src/tools/claude-code/claude-code.ts +1 -1
  542. package/src/tools/computer-use/definitions.ts +48 -60
  543. package/src/tools/document/document-tool.ts +6 -6
  544. package/src/tools/document/editor-template.ts +10 -8
  545. package/src/tools/filesystem/edit.ts +2 -1
  546. package/src/tools/filesystem/read.ts +20 -2
  547. package/src/tools/filesystem/write.ts +2 -1
  548. package/src/tools/host-filesystem/edit.ts +17 -1
  549. package/src/tools/host-filesystem/read.ts +16 -1
  550. package/src/tools/host-filesystem/write.ts +15 -1
  551. package/src/tools/host-terminal/host-shell.ts +24 -0
  552. package/src/tools/memory/definitions.ts +45 -81
  553. package/src/tools/memory/handlers.test.ts +0 -1
  554. package/src/tools/memory/handlers.ts +1 -1
  555. package/src/tools/memory/register.ts +26 -60
  556. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  557. package/src/tools/network/web-fetch.ts +7 -1
  558. package/src/tools/network/web-search.ts +2 -1
  559. package/src/tools/registry.ts +23 -0
  560. package/src/tools/schedule/create.ts +113 -5
  561. package/src/tools/schedule/list.ts +57 -15
  562. package/src/tools/schedule/update.ts +73 -3
  563. package/src/tools/shared/filesystem/image-read.ts +192 -0
  564. package/src/tools/side-effects.ts +1 -7
  565. package/src/tools/skills/delete-managed.ts +27 -64
  566. package/src/tools/skills/execute.ts +54 -0
  567. package/src/tools/skills/load.ts +127 -5
  568. package/src/tools/skills/scaffold-managed.ts +93 -172
  569. package/src/tools/subagent/message.ts +0 -7
  570. package/src/tools/subagent/spawn.ts +1 -1
  571. package/src/tools/swarm/delegate.ts +0 -3
  572. package/src/tools/system/avatar-generator.ts +13 -19
  573. package/src/tools/system/request-permission.ts +2 -1
  574. package/src/tools/terminal/safe-env.ts +1 -0
  575. package/src/tools/tool-manifest.ts +41 -47
  576. package/src/tools/types.ts +6 -2
  577. package/src/tools/ui-surface/definitions.ts +0 -55
  578. package/src/util/errors.ts +12 -10
  579. package/src/workspace/git-service.ts +0 -2
  580. package/src/__tests__/account-registry.test.ts +0 -258
  581. package/src/__tests__/email-classifier.test.ts +0 -25
  582. package/src/__tests__/gmail-integration.test.ts +0 -97
  583. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  584. package/src/__tests__/home-base-bootstrap.test.ts +0 -84
  585. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
  586. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  587. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  588. package/src/__tests__/recording-intent.test.ts +0 -985
  589. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  590. package/src/__tests__/reminder-store.test.ts +0 -350
  591. package/src/__tests__/reminder.test.ts +0 -337
  592. package/src/__tests__/scan-result-store.test.ts +0 -121
  593. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
  594. package/src/__tests__/view-image-tool.test.ts +0 -241
  595. package/src/cli/commands/amazon/cart.ts +0 -513
  596. package/src/cli/commands/amazon/checkout.ts +0 -394
  597. package/src/cli/commands/amazon/client.ts +0 -513
  598. package/src/cli/commands/amazon/index.ts +0 -920
  599. package/src/cli/commands/amazon/product-details.ts +0 -145
  600. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  601. package/src/cli/commands/amazon/search.ts +0 -76
  602. package/src/cli/commands/amazon/session.ts +0 -116
  603. package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
  604. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
  605. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
  606. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
  607. package/src/cli/commands/twitter/client.ts +0 -989
  608. package/src/cli/commands/twitter/index.ts +0 -1160
  609. package/src/cli/commands/twitter/oauth-client.ts +0 -94
  610. package/src/cli/commands/twitter/router.ts +0 -396
  611. package/src/cli/commands/twitter/session.ts +0 -121
  612. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  613. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  614. package/src/config/bundled-skills/amazon/SKILL.md +0 -137
  615. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  616. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  617. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  618. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  619. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  620. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  621. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  622. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  623. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  624. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  625. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  626. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  627. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  628. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  629. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  630. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  631. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  632. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  633. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  634. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  635. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  636. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  637. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  638. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  639. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  640. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  641. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  642. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  643. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  644. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  645. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  646. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  647. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  648. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  649. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  650. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  651. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  652. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  653. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  654. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  655. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  656. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  657. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  658. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  659. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  660. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  661. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  662. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  663. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  664. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  665. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  666. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  667. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  668. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  669. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  670. package/src/config/bundled-skills/twitter/SKILL.md +0 -319
  671. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  672. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  673. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  674. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  675. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  676. package/src/daemon/handlers/pairing.ts +0 -119
  677. package/src/daemon/handlers/session-user-message.ts +0 -961
  678. package/src/daemon/recording-executor.ts +0 -180
  679. package/src/daemon/recording-intent-fallback.ts +0 -162
  680. package/src/daemon/recording-intent.ts +0 -493
  681. package/src/home-base/app-link-store.ts +0 -78
  682. package/src/home-base/bootstrap.ts +0 -74
  683. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  684. package/src/home-base/prebuilt/index.html +0 -702
  685. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  686. package/src/home-base/prebuilt/seed.ts +0 -122
  687. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  688. package/src/memory/account-store.ts +0 -117
  689. package/src/messaging/activity-analyzer.ts +0 -76
  690. package/src/messaging/email-classifier.ts +0 -208
  691. package/src/messaging/index.ts +0 -2
  692. package/src/messaging/outreach-classifier.ts +0 -185
  693. package/src/messaging/thread-summarizer.ts +0 -346
  694. package/src/messaging/types.ts +0 -17
  695. package/src/tools/browser/x-auto-navigate.ts +0 -254
  696. package/src/tools/credentials/account-registry.ts +0 -144
  697. package/src/tools/filesystem/view-image.ts +0 -244
  698. package/src/tools/reminder/reminder-store.ts +0 -194
  699. package/src/tools/reminder/reminder.ts +0 -158
  700. package/src/tools/system/navigate-settings.ts +0 -74
  701. package/src/tools/system/open-system-settings.ts +0 -85
  702. package/src/tools/system/version.ts +0 -54
  703. package/src/twitter/platform-proxy-client.ts +0 -405
  704. package/src/util/cookie-session.ts +0 -98
  705. /package/src/config/bundled-skills/{messaging β†’ gmail}/tools/scan-result-store.ts +0 -0
  706. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-analytics.ts +0 -0
  707. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-create.ts +0 -0
  708. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-delete.ts +0 -0
  709. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-enroll.ts +0 -0
  710. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-enrollment-list.ts +0 -0
  711. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-get.ts +0 -0
  712. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-import.ts +0 -0
  713. /package/src/config/bundled-skills/{messaging β†’ sequences}/tools/sequence-list.ts +0 -0
@@ -0,0 +1,110 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { basename, resolve } from "node:path";
3
+
4
+ import {
5
+ getAttachment,
6
+ getMessage,
7
+ } from "../../../../messaging/providers/gmail/client.js";
8
+ import type { GmailMessagePart } from "../../../../messaging/providers/gmail/types.js";
9
+ import { getMessagingProvider } from "../../../../messaging/registry.js";
10
+ import { withValidToken } from "../../../../security/token-manager.js";
11
+ import type {
12
+ ToolContext,
13
+ ToolExecutionResult,
14
+ } from "../../../../tools/types.js";
15
+ import { err, ok } from "./shared.js";
16
+
17
+ interface AttachmentInfo {
18
+ partId: string;
19
+ filename: string;
20
+ mimeType: string;
21
+ size: number;
22
+ attachmentId: string;
23
+ }
24
+
25
+ /** Recursively walk the MIME parts tree to find attachments. */
26
+ function collectAttachments(
27
+ parts: GmailMessagePart[] | undefined,
28
+ ): AttachmentInfo[] {
29
+ if (!parts) return [];
30
+ const result: AttachmentInfo[] = [];
31
+ for (const part of parts) {
32
+ if (part.filename && part.body?.attachmentId) {
33
+ result.push({
34
+ partId: part.partId ?? "",
35
+ filename: part.filename,
36
+ mimeType: part.mimeType ?? "application/octet-stream",
37
+ size: part.body.size ?? 0,
38
+ attachmentId: part.body.attachmentId,
39
+ });
40
+ }
41
+ if (part.parts) {
42
+ result.push(...collectAttachments(part.parts));
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+
48
+ export async function run(
49
+ input: Record<string, unknown>,
50
+ context: ToolContext,
51
+ ): Promise<ToolExecutionResult> {
52
+ const action = input.action as string;
53
+ const messageId = input.message_id as string;
54
+
55
+ if (!action) return err("action is required.");
56
+ if (!messageId) return err("message_id is required.");
57
+
58
+ if (action === "list") {
59
+ try {
60
+ const provider = getMessagingProvider("gmail");
61
+ return await withValidToken(provider.credentialService, async (token) => {
62
+ const message = await getMessage(token, messageId, "full");
63
+ const attachments = collectAttachments(message.payload?.parts);
64
+
65
+ if (attachments.length === 0) {
66
+ return ok("No attachments found on this message.");
67
+ }
68
+
69
+ return ok(JSON.stringify(attachments, null, 2));
70
+ });
71
+ } catch (e) {
72
+ return err(e instanceof Error ? e.message : String(e));
73
+ }
74
+ }
75
+
76
+ if (action === "download") {
77
+ const attachmentId = input.attachment_id as string;
78
+ const filename = input.filename as string;
79
+
80
+ if (!attachmentId) return err("attachment_id is required for download.");
81
+ if (!filename) return err("filename is required for download.");
82
+
83
+ try {
84
+ const provider = getMessagingProvider("gmail");
85
+ return await withValidToken(provider.credentialService, async (token) => {
86
+ const attachment = await getAttachment(token, messageId, attachmentId);
87
+
88
+ // Gmail returns base64url; convert to standard base64 then to Buffer
89
+ const base64 = attachment.data.replace(/-/g, "+").replace(/_/g, "/");
90
+ const buffer = Buffer.from(base64, "base64");
91
+
92
+ const outputDir = context.workingDir ?? process.cwd();
93
+ // Sanitize filename: strip path separators to prevent traversal attacks from crafted MIME filenames
94
+ const safeName = basename(filename).replace(/\.\./g, "_");
95
+ const outputPath = resolve(outputDir, safeName);
96
+ if (!outputPath.startsWith(outputDir))
97
+ return err("Invalid filename: path traversal detected.");
98
+ await writeFile(outputPath, buffer);
99
+
100
+ return ok(
101
+ `Attachment saved to ${outputPath} (${buffer.length} bytes).`,
102
+ );
103
+ });
104
+ } catch (e) {
105
+ return err(e instanceof Error ? e.message : String(e));
106
+ }
107
+ }
108
+
109
+ return err(`Unknown action: ${action}. Expected "list" or "download".`);
110
+ }
@@ -24,7 +24,7 @@ export async function run(
24
24
 
25
25
  try {
26
26
  const provider = getMessagingProvider("gmail");
27
- return withValidToken(provider.credentialService, async (token) => {
27
+ return await withValidToken(provider.credentialService, async (token) => {
28
28
  const draft = await createDraft(
29
29
  token,
30
30
  to,
@@ -27,7 +27,7 @@ export async function run(
27
27
 
28
28
  try {
29
29
  const provider = getMessagingProvider("gmail");
30
- return withValidToken(provider.credentialService, async (token) => {
30
+ return await withValidToken(provider.credentialService, async (token) => {
31
31
  switch (action) {
32
32
  case "list": {
33
33
  const filters = await listFilters(token);
@@ -36,7 +36,7 @@ export async function run(
36
36
 
37
37
  try {
38
38
  const provider = getMessagingProvider("gmail");
39
- return withValidToken(provider.credentialService, async (token) => {
39
+ return await withValidToken(provider.credentialService, async (token) => {
40
40
  switch (action) {
41
41
  case "track": {
42
42
  const messageId = input.message_id as string;
@@ -77,7 +77,7 @@ export async function run(
77
77
 
78
78
  try {
79
79
  const provider = getMessagingProvider("gmail");
80
- return withValidToken(provider.credentialService, async (token) => {
80
+ return await withValidToken(provider.credentialService, async (token) => {
81
81
  const message = await getMessage(token, messageId, "full");
82
82
  const headers = message.payload?.headers ?? [];
83
83
  const originalFrom = extractHeader(headers, "From");
@@ -0,0 +1,50 @@
1
+ import {
2
+ batchModifyMessages,
3
+ modifyMessage,
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
+ export async function run(
14
+ input: Record<string, unknown>,
15
+ _context: ToolContext,
16
+ ): Promise<ToolExecutionResult> {
17
+ const messageId = input.message_id as string | undefined;
18
+ const messageIds = input.message_ids as string[] | undefined;
19
+ const addLabelIds = input.add_label_ids as string[] | undefined;
20
+ const removeLabelIds = input.remove_label_ids as string[] | undefined;
21
+
22
+ if (messageIds && messageIds.length > 0) {
23
+ try {
24
+ const provider = getMessagingProvider("gmail");
25
+ return await withValidToken(provider.credentialService, async (token) => {
26
+ await batchModifyMessages(token, messageIds, {
27
+ addLabelIds,
28
+ removeLabelIds,
29
+ });
30
+ return ok(`Labels updated on ${messageIds.length} message(s).`);
31
+ });
32
+ } catch (e) {
33
+ return err(e instanceof Error ? e.message : String(e));
34
+ }
35
+ }
36
+
37
+ if (messageId) {
38
+ try {
39
+ const provider = getMessagingProvider("gmail");
40
+ return await withValidToken(provider.credentialService, async (token) => {
41
+ await modifyMessage(token, messageId, { addLabelIds, removeLabelIds });
42
+ return ok("Labels updated.");
43
+ });
44
+ } catch (e) {
45
+ return err(e instanceof Error ? e.message : String(e));
46
+ }
47
+ }
48
+
49
+ return err("Provide message_id or message_ids.");
50
+ }
@@ -1,8 +1,3 @@
1
- import type { EmailMetadata } from "../../../../messaging/email-classifier.js";
2
- import {
3
- classifyOutreach,
4
- type OutreachClassification,
5
- } from "../../../../messaging/outreach-classifier.js";
6
1
  import {
7
2
  batchGetMessages,
8
3
  listMessages,
@@ -31,8 +26,6 @@ interface OutreachSenderAggregation {
31
26
  messageIds: string[];
32
27
  hasMore: boolean;
33
28
  sampleSubjects: string[];
34
- outreachTypes: string[];
35
- confidenceSum: number;
36
29
  }
37
30
 
38
31
  /** Parse "Display Name <email@example.com>" into parts. */
@@ -48,39 +41,6 @@ function parseFrom(from: string): { displayName: string; email: string } {
48
41
  return { displayName: "", email: bare };
49
42
  }
50
43
 
51
- function buildSuggestedActions(email: string, count: number): string[] {
52
- const actions: string[] = [`Archive all ${count} messages`];
53
- if (count >= 2) {
54
- actions.push(`Create filter to auto-archive future emails from ${email}`);
55
- }
56
- if (count >= 3) {
57
- const domain = email.split("@")[1];
58
- if (domain) {
59
- actions.push(
60
- `Create filter to auto-archive future emails from @${domain}`,
61
- );
62
- }
63
- }
64
- return actions;
65
- }
66
-
67
- /** Find the most common string in an array. */
68
- function mostCommon(items: string[]): string {
69
- const counts = new Map<string, number>();
70
- for (const item of items) {
71
- counts.set(item, (counts.get(item) ?? 0) + 1);
72
- }
73
- let best = items[0] ?? "other";
74
- let bestCount = 0;
75
- for (const [item, count] of counts) {
76
- if (count > bestCount) {
77
- best = item;
78
- bestCount = count;
79
- }
80
- }
81
- return best;
82
- }
83
-
84
44
  export async function run(
85
45
  input: Record<string, unknown>,
86
46
  _context: ToolContext,
@@ -91,14 +51,13 @@ export async function run(
91
51
  );
92
52
  const maxSenders = (input.max_senders as number) ?? 30;
93
53
  const timeRange = (input.time_range as string) ?? "90d";
94
- const minConfidence = (input.min_confidence as number) ?? 0.5;
95
54
  const inputPageToken = input.page_token as string | undefined;
96
55
 
97
56
  const query = `in:inbox -has:unsubscribe newer_than:${timeRange}`;
98
57
 
99
58
  try {
100
59
  const provider = getMessagingProvider("gmail");
101
- return withValidToken(provider.credentialService, async (token) => {
60
+ return await withValidToken(provider.credentialService, async (token) => {
102
61
  // Pipeline: fire metadata fetches for each page of IDs as they arrive
103
62
  const allMessageIds: string[] = [];
104
63
  const fetchPromises: Promise<GmailMessage[]>[] = [];
@@ -142,42 +101,17 @@ export async function run(
142
101
  JSON.stringify({
143
102
  senders: [],
144
103
  total_scanned: 0,
145
- outreach_detected: 0,
146
- message: "No emails found matching the query.",
104
+ note: "No emails found matching the query.",
147
105
  }),
148
106
  );
149
107
  }
150
108
 
151
109
  const messages = (await Promise.all(fetchPromises)).flat();
152
110
 
153
- // Build EmailMetadata for the classifier
154
- const emailMetadata: EmailMetadata[] = messages.map((msg) => {
155
- const headers = msg.payload?.headers ?? [];
156
- const from =
157
- headers.find((h) => h.name.toLowerCase() === "from")?.value ?? "";
158
- const subject =
159
- headers.find((h) => h.name.toLowerCase() === "subject")?.value ?? "";
160
- return { id: msg.id, from, subject, snippet: "", labels: [] };
161
- });
162
-
163
- // Classify in batches
164
- const classifications = await classifyOutreach(emailMetadata);
165
-
166
- // Index classifications by message ID
167
- const classificationMap = new Map<string, OutreachClassification>();
168
- for (const c of classifications) {
169
- if (c.isOutreach) {
170
- classificationMap.set(c.id, c);
171
- }
172
- }
173
-
174
- // Aggregate by sender email (only outreach-classified messages)
111
+ // Aggregate all fetched messages by sender
175
112
  const senderMap = new Map<string, OutreachSenderAggregation>();
176
113
 
177
114
  for (const msg of messages) {
178
- const classification = classificationMap.get(msg.id);
179
- if (!classification) continue;
180
-
181
115
  const headers = msg.payload?.headers ?? [];
182
116
  const fromHeader =
183
117
  headers.find((h) => h.name.toLowerCase() === "from")?.value ?? "";
@@ -201,15 +135,11 @@ export async function run(
201
135
  messageIds: [],
202
136
  hasMore: false,
203
137
  sampleSubjects: [],
204
- outreachTypes: [],
205
- confidenceSum: 0,
206
138
  };
207
139
  senderMap.set(email, agg);
208
140
  }
209
141
 
210
142
  agg.messageCount++;
211
- agg.outreachTypes.push(classification.outreachType);
212
- agg.confidenceSum += classification.confidence;
213
143
 
214
144
  if (!agg.displayName && displayName) agg.displayName = displayName;
215
145
 
@@ -241,33 +171,21 @@ export async function run(
241
171
  }
242
172
  }
243
173
 
244
- // Sort by message count desc, filter by confidence, take top N
245
- const qualified = [...senderMap.values()]
246
- .map((s) => ({
247
- ...s,
248
- avgConfidence:
249
- s.messageCount > 0 ? s.confidenceSum / s.messageCount : 0,
250
- outreachType: mostCommon(s.outreachTypes),
251
- }))
252
- .filter((s) => s.avgConfidence >= minConfidence)
253
- .sort((a, b) => b.messageCount - a.messageCount);
254
-
255
- const totalOutreachDetected = qualified.length;
256
- const sorted = qualified.slice(0, maxSenders);
174
+ // Sort by message count desc, take top N
175
+ const sorted = [...senderMap.values()]
176
+ .sort((a, b) => b.messageCount - a.messageCount)
177
+ .slice(0, maxSenders);
257
178
 
258
179
  const senders = sorted.map((s) => ({
259
180
  id: Buffer.from(s.email).toString("base64url"),
260
181
  display_name: s.displayName || s.email.split("@")[0],
261
182
  email: s.email,
262
183
  message_count: s.messageCount,
263
- outreach_type: s.outreachType,
264
- confidence: Math.round(s.avgConfidence * 100) / 100,
265
184
  newest_message_id: s.newestMessageId,
266
185
  oldest_date: s.oldestDate,
267
186
  newest_date: s.newestDate,
268
187
  search_query: `from:${s.email}`,
269
188
  sample_subjects: s.sampleSubjects,
270
- suggested_actions: buildSuggestedActions(s.email, s.messageCount),
271
189
  }));
272
190
 
273
191
  // Store message IDs server-side to keep them out of LLM context
@@ -285,9 +203,9 @@ export async function run(
285
203
  scan_id: scanId,
286
204
  senders,
287
205
  total_scanned: allMessageIds.length,
288
- outreach_detected: totalOutreachDetected,
289
206
  ...(truncated ? { truncated: true } : {}),
290
207
  ...(timeBudgetExceeded ? { time_budget_exceeded: true } : {}),
208
+ note: "Scanned inbox for senders without List-Unsubscribe headers (potential cold outreach). Use gmail_archive and gmail_filters for cleanup.",
291
209
  }),
292
210
  );
293
211
  });
@@ -16,7 +16,7 @@ export async function run(
16
16
 
17
17
  try {
18
18
  const provider = getMessagingProvider("gmail");
19
- return withValidToken(provider.credentialService, async (token) => {
19
+ return await withValidToken(provider.credentialService, async (token) => {
20
20
  const msg = await sendDraft(token, draftId);
21
21
  return ok(`Draft sent (Message ID: ${msg.id}).`);
22
22
  });
@@ -59,7 +59,7 @@ export async function run(
59
59
 
60
60
  try {
61
61
  const provider = getMessagingProvider("gmail");
62
- return withValidToken(provider.credentialService, async (token) => {
62
+ return await withValidToken(provider.credentialService, async (token) => {
63
63
  // Pipeline: fire metadata fetches for each page of IDs as they arrive,
64
64
  // overlapping fetch latency with pagination latency
65
65
  const allMessageIds: string[] = [];
@@ -235,7 +235,7 @@ export async function run(
235
235
  query_used: query,
236
236
  ...(truncated ? { truncated: true } : {}),
237
237
  ...(timeBudgetExceeded ? { time_budget_exceeded: true } : {}),
238
- note: `message_count reflects emails found per sender within the ${allMessageIds.length} messages scanned. Use scan_id with gmail_batch_archive to archive messages (pass scan_id + sender_ids instead of message_ids).`,
238
+ note: `message_count reflects emails found per sender within the ${allMessageIds.length} messages scanned. Use scan_id with gmail_archive to archive messages (pass scan_id + sender_ids instead of message_ids).`,
239
239
  }),
240
240
  );
241
241
  });
@@ -19,7 +19,7 @@ export async function run(
19
19
 
20
20
  try {
21
21
  const provider = getMessagingProvider("gmail");
22
- return withValidToken(provider.credentialService, async (token) => {
22
+ return await withValidToken(provider.credentialService, async (token) => {
23
23
  await trashMessage(token, messageId);
24
24
  return ok("Message moved to trash.");
25
25
  });
@@ -33,7 +33,7 @@ export async function run(
33
33
 
34
34
  try {
35
35
  const provider = getMessagingProvider("gmail");
36
- return withValidToken(provider.credentialService, async (token) => {
36
+ return await withValidToken(provider.credentialService, async (token) => {
37
37
  const message = await getMessage(token, messageId, "metadata", [
38
38
  "List-Unsubscribe",
39
39
  "List-Unsubscribe-Post",
@@ -23,7 +23,7 @@ export async function run(
23
23
 
24
24
  try {
25
25
  const provider = getMessagingProvider("gmail");
26
- return withValidToken(provider.credentialService, async (token) => {
26
+ return await withValidToken(provider.credentialService, async (token) => {
27
27
  switch (action) {
28
28
  case "get": {
29
29
  const settings = await getVacation(token);
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared utilities for gmail skill tools.
3
+ */
4
+
5
+ import {
6
+ request as httpsRequest,
7
+ type RequestOptions as HttpsRequestOptions,
8
+ } from "node:https";
9
+
10
+ import type { ToolExecutionResult } from "../../../../tools/types.js";
11
+
12
+ export function ok(content: string): ToolExecutionResult {
13
+ return { content, isError: false };
14
+ }
15
+
16
+ export function err(message: string): ToolExecutionResult {
17
+ return { content: message, isError: true };
18
+ }
19
+
20
+ /** Make an HTTPS request pinned to a specific resolved IP to prevent DNS rebinding. */
21
+ export function pinnedHttpsRequest(
22
+ target: URL,
23
+ resolvedAddress: string,
24
+ options?: {
25
+ method?: string;
26
+ headers?: Record<string, string>;
27
+ body?: string;
28
+ },
29
+ ): Promise<number> {
30
+ return new Promise((resolve, reject) => {
31
+ const reqOpts: HttpsRequestOptions = {
32
+ method: options?.method ?? "GET",
33
+ hostname: resolvedAddress,
34
+ port: target.port ? Number(target.port) : undefined,
35
+ path: `${target.pathname}${target.search}`,
36
+ headers: { host: target.host, ...options?.headers },
37
+ servername: target.hostname,
38
+ };
39
+ const req = httpsRequest(reqOpts, (res) => {
40
+ res.resume();
41
+ resolve(res.statusCode ?? 0);
42
+ });
43
+ req.once("error", reject);
44
+ if (options?.body) req.write(options.body);
45
+ req.end();
46
+ });
47
+ }
@@ -2,7 +2,11 @@
2
2
  name: google-calendar
3
3
  description: View, create, and manage Google Calendar events and check availability
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"πŸ“…","vellum":{"display-name":"Google Calendar","user-invocable":true}}
5
+ metadata:
6
+ emoji: "πŸ“…"
7
+ vellum:
8
+ display-name: "Google Calendar"
9
+ user-invocable: true
6
10
  ---
7
11
 
8
12
  You are a Google Calendar assistant with full access to the user's calendar. Use the Calendar tools to help them view, create, and manage events.
@@ -2,7 +2,11 @@
2
2
  name: image-studio
3
3
  description: Generate and edit images using AI
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"🎨","vellum":{"display-name":"Image Studio","user-invocable":true}}
5
+ metadata:
6
+ emoji: "🎨"
7
+ vellum:
8
+ display-name: "Image Studio"
9
+ user-invocable: true
6
10
  ---
7
11
 
8
12
  You are an image generation assistant. When the user asks you to create or edit images, use the `media_generate_image` tool.
@@ -2,7 +2,10 @@
2
2
  name: knowledge-graph
3
3
  description: Query the entity knowledge graph to explore relationships between people, projects, tools, and other entities tracked in memory
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"πŸ•ΈοΈ","vellum":{"display-name":"Knowledge Graph"}}
5
+ metadata:
6
+ emoji: "πŸ•ΈοΈ"
7
+ vellum:
8
+ display-name: "Knowledge Graph"
6
9
  ---
7
10
 
8
11
  # Knowledge Graph
@@ -2,7 +2,10 @@
2
2
  name: media-processing
3
3
  description: "Ingest and process media files (video, audio, image) through a 3-phase pipeline: preprocess, map (Gemini), and reduce (Claude)"
4
4
  compatibility: "Designed for Vellum personal assistants"
5
- metadata: {"emoji":"🎬","vellum":{"display-name":"Media Processing"}}
5
+ metadata:
6
+ emoji: "🎬"
7
+ vellum:
8
+ display-name: "Media Processing"
6
9
  ---
7
10
 
8
11
  Ingest and track processing of media files (video, audio, images) through a configurable 3-phase pipeline.
@@ -80,15 +83,6 @@ Parameters:
80
83
 
81
84
  Extract a video clip from a media asset using ffmpeg. Applies configurable pre/post-roll padding (clamped to file boundaries), outputs the clip as a temporary file.
82
85
 
83
- ### media_diagnostics
84
-
85
- Get a diagnostic report for a media asset. Returns:
86
-
87
- - **Processing stats**: total keyframes extracted.
88
- - **Per-stage status and timing**: which stages (preprocess, map, reduce) have run, how long each took, current progress.
89
- - **Failure reasons**: last error from any failed stage.
90
- - **Cost estimation**: based on segment count and current Gemini pricing.
91
-
92
86
  ## Services
93
87
 
94
88
  ### Processing Pipeline (services/processing-pipeline.ts)
@@ -240,7 +234,7 @@ The response includes per-stage progress (0-100%) so you can see exactly where p
240
234
 
241
235
  ### Diagnosing Failures
242
236
 
243
- Use `media_diagnostics` to get a full diagnostic report:
237
+ Use `media_status` to check processing stages:
244
238
 
245
239
  1. Check the `stages` array for any stage with `status: "failed"`.
246
240
  2. Read the `lastError` field for that stage to understand what went wrong.
@@ -254,7 +248,7 @@ After fixing the root cause, re-run the failed stage. The pipeline is resumable
254
248
 
255
249
  ### Cost Expectations
256
250
 
257
- Use `media_diagnostics` to get per-asset cost estimates. The Map phase (Gemini) is the primary cost driver β€” it scales with video duration and keyframe interval. The Q&A phase (Claude) is negligible per query.
251
+ The Map phase (Gemini) is the primary cost driver β€” it scales with video duration and keyframe interval. The Q&A phase (Claude) is negligible per query.
258
252
 
259
253
  ### Known Limitations
260
254
 
@@ -272,7 +266,7 @@ Use `media_diagnostics` to get per-asset cost estimates. The Map phase (Gemini)
272
266
  | "No LLM provider available" | API key not configured | Add one in Settings |
273
267
  | Map phase slow | Large video, small interval | Increase interval_seconds or reduce concurrency |
274
268
  | Gemini returns errors | Rate limits or schema issues | Check max_retries setting; simplify output_schema if needed |
275
- | Pipeline stuck at "processing" | Stage crashed without updating status | Use `media_diagnostics` to find the stuck stage; re-run manually |
269
+ | Pipeline stuck at "processing" | Stage crashed without updating status | Use `media_status` to check stage progress; re-run manually |
276
270
 
277
271
  ## Usage Notes
278
272
 
@@ -249,28 +249,6 @@
249
249
  },
250
250
  "executor": "tools/generate-clip.ts",
251
251
  "execution_target": "host"
252
- },
253
- {
254
- "name": "media_diagnostics",
255
- "description": "Get a diagnostic report for a media asset including processing stats, per-stage timing (preprocess/map/reduce), failure reasons, and Gemini-based cost estimation.",
256
- "category": "media",
257
- "risk": "low",
258
- "input_schema": {
259
- "type": "object",
260
- "properties": {
261
- "asset_id": {
262
- "type": "string",
263
- "description": "ID of the media asset to diagnose"
264
- },
265
- "reason": {
266
- "type": "string",
267
- "description": "Brief non-technical explanation of why this tool is being called"
268
- }
269
- },
270
- "required": ["asset_id"]
271
- },
272
- "executor": "tools/media-diagnostics.ts",
273
- "execution_target": "host"
274
252
  }
275
253
  ]
276
254
  }
@@ -73,6 +73,8 @@ const MIME_BY_FORMAT: Record<string, string> = {
73
73
  mov: "video/quicktime",
74
74
  };
75
75
 
76
+ const ALLOWED_OUTPUT_FORMATS = new Set(Object.keys(MIME_BY_FORMAT));
77
+
76
78
  // ---------------------------------------------------------------------------
77
79
  // Tool entry point
78
80
  // ---------------------------------------------------------------------------
@@ -105,7 +107,16 @@ export async function run(
105
107
 
106
108
  const preRoll = (input.pre_roll as number) ?? 3;
107
109
  const postRoll = (input.post_roll as number) ?? 2;
108
- const outputFormat = (input.output_format as string) ?? "mp4";
110
+ const outputFormatInput =
111
+ typeof input.output_format === "string" ? input.output_format : "mp4";
112
+ const outputFormat = outputFormatInput.toLowerCase();
113
+ if (!ALLOWED_OUTPUT_FORMATS.has(outputFormat)) {
114
+ return {
115
+ content:
116
+ "output_format must be one of: mp4, webm, mov (defaults to mp4).",
117
+ isError: true,
118
+ };
119
+ }
109
120
  const title = input.title as string | undefined;
110
121
 
111
122
  const asset = getMediaAssetById(assetId);