@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
@@ -18,7 +18,6 @@ mock.module("../util/platform.js", () => ({
18
18
  getWorkspaceHooksDir: () => join(TEST_DIR, "hooks"),
19
19
  getWorkspacePromptPath: (file: string) => join(TEST_DIR, file),
20
20
  ensureDataDir: () => {},
21
- getSocketPath: () => join(TEST_DIR, "vellum.sock"),
22
21
  getPidPath: () => join(TEST_DIR, "vellum.pid"),
23
22
  getDbPath: () => join(TEST_DIR, "data", "assistant.db"),
24
23
  getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
@@ -85,17 +84,6 @@ const taskListAddDef = tasksToolsJson.tools.find(
85
84
  (t: { name: string }) => t.name === "task_list_add",
86
85
  );
87
86
 
88
- // Load reminder_create description from the bundled skill TOOLS.json
89
- const reminderToolsJson = JSON.parse(
90
- readFileSync(
91
- join(import.meta.dirname, "../config/bundled-skills/reminder/TOOLS.json"),
92
- "utf-8",
93
- ),
94
- );
95
- const reminderCreateDef = reminderToolsJson.tools.find(
96
- (t: { name: string }) => t.name === "reminder_create",
97
- );
98
-
99
87
  // Load schedule_create description from the bundled skill TOOLS.json
100
88
  const scheduleToolsJson = JSON.parse(
101
89
  readFileSync(
@@ -111,7 +99,7 @@ const scheduleCreateDef = scheduleToolsJson.tools.find(
111
99
  // 1. System prompt: buildTaskScheduleReminderRoutingSection
112
100
  // =====================================================================
113
101
 
114
- describe("Task/Schedule/Reminder routing section in system prompt", () => {
102
+ describe("Task/Schedule routing section in system prompt", () => {
115
103
  beforeEach(() => {
116
104
  mkdirSync(TEST_DIR, { recursive: true });
117
105
  });
@@ -125,15 +113,14 @@ describe("Task/Schedule/Reminder routing section in system prompt", () => {
125
113
  test("system prompt includes the routing section heading", () => {
126
114
  const prompt = buildSystemPrompt();
127
115
  expect(prompt).toContain(
128
- "## Tool Routing: Tasks vs Schedules vs Reminders vs Notifications",
116
+ "## Tool Routing: Tasks vs Schedules vs Notifications",
129
117
  );
130
118
  });
131
119
 
132
- test("routing section lists all four tools in the summary table", () => {
120
+ test("routing section lists all three tools in the summary table", () => {
133
121
  const prompt = buildSystemPrompt();
134
122
  expect(prompt).toContain("`task_list_add`");
135
123
  expect(prompt).toContain("`schedule_create`");
136
- expect(prompt).toContain("`reminder_create`");
137
124
  expect(prompt).toContain("`send_notification`");
138
125
  });
139
126
 
@@ -168,7 +155,7 @@ describe("Task/Schedule/Reminder routing section in system prompt", () => {
168
155
  test("routing section is present in the system prompt", () => {
169
156
  const prompt = buildSystemPrompt();
170
157
  const taskRoutingIdx = prompt.indexOf(
171
- "## Tool Routing: Tasks vs Schedules vs Reminders vs Notifications",
158
+ "## Tool Routing: Tasks vs Schedules vs Notifications",
172
159
  );
173
160
  expect(taskRoutingIdx).toBeGreaterThanOrEqual(0);
174
161
  });
@@ -231,44 +218,18 @@ describe("schedule_create tool description", () => {
231
218
  });
232
219
  });
233
220
 
234
- describe("reminder tool description", () => {
235
- test("mentions time-based reminders", () => {
236
- expect(reminderCreateDef.description).toContain("time-based reminder");
237
- });
238
-
239
- test("scopes to time-triggered notifications only", () => {
240
- expect(reminderCreateDef.description).toContain(
241
- "ONLY when the user wants a time-triggered notification",
242
- );
243
- });
244
-
245
- test('warns against using for "add to my tasks" requests', () => {
246
- expect(reminderCreateDef.description).toContain(
247
- 'Do NOT use this for "add to my tasks"',
248
- );
249
- });
250
-
251
- test("redirects to task_list_add for task queue items", () => {
252
- expect(reminderCreateDef.description).toContain("task_list_add");
253
- });
254
- });
255
-
256
221
  // =====================================================================
257
- // 3. Cross-tool consistency: all three tools agree on routing boundaries
222
+ // 3. Cross-tool consistency: schedule and task tools agree on routing boundaries
258
223
  // =====================================================================
259
224
 
260
225
  describe("cross-tool routing consistency", () => {
261
- test("all three tools reference task_list_add as the task-queue tool", () => {
262
- // task_list_add is the canonical name in all three descriptions
226
+ test("both tools reference task_list_add as the task-queue tool", () => {
263
227
  expect(taskListAddDef.name).toBe("task_list_add");
264
228
  expect(scheduleCreateDef.description).toContain("task_list_add");
265
- expect(reminderCreateDef.description).toContain("task_list_add");
266
229
  });
267
230
 
268
- test('schedule_create and reminder both reject "add to my queue" usage', () => {
269
- // Both should redirect away from task-queue requests
231
+ test('schedule_create rejects "add to my queue" usage', () => {
270
232
  expect(scheduleCreateDef.description).toContain("add to my queue");
271
- expect(reminderCreateDef.description).toContain("add to my queue");
272
233
  });
273
234
  });
274
235
 
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
10
10
  isMacOS: () => process.platform === "darwin",
11
11
  isLinux: () => process.platform === "linux",
12
12
  isWindows: () => process.platform === "win32",
13
- getSocketPath: () => join(testDir, "test.sock"),
14
13
  getPidPath: () => join(testDir, "test.pid"),
15
14
  getDbPath: () => join(testDir, "test.db"),
16
15
  getLogPath: () => join(testDir, "test.log"),
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
10
10
  isMacOS: () => process.platform === "darwin",
11
11
  isLinux: () => process.platform === "linux",
12
12
  isWindows: () => process.platform === "win32",
13
- getSocketPath: () => join(testDir, "test.sock"),
14
13
  getPidPath: () => join(testDir, "test.pid"),
15
14
  getDbPath: () => join(testDir, "test.db"),
16
15
  getLogPath: () => join(testDir, "test.log"),
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
10
10
  isMacOS: () => process.platform === "darwin",
11
11
  isLinux: () => process.platform === "linux",
12
12
  isWindows: () => process.platform === "win32",
13
- getSocketPath: () => join(testDir, "test.sock"),
14
13
  getPidPath: () => join(testDir, "test.pid"),
15
14
  getDbPath: () => join(testDir, "test.db"),
16
15
  getLogPath: () => join(testDir, "test.log"),
@@ -1,5 +1,7 @@
1
1
  import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
+ import { createHash } from "crypto";
4
+
3
5
  // ---------------------------------------------------------------------------
4
6
  // Mock dependencies โ€” must be before importing the module under test
5
7
  // ---------------------------------------------------------------------------
@@ -40,10 +42,12 @@ let fetchResponse: {
40
42
  ok: boolean;
41
43
  status: number;
42
44
  json: () => Promise<unknown>;
45
+ text: () => Promise<string>;
43
46
  } = {
44
47
  ok: true,
45
48
  status: 200,
46
49
  json: async () => ({}),
50
+ text: async () => "",
47
51
  };
48
52
 
49
53
  globalThis.fetch = (async (url: string, init: RequestInit) => {
@@ -56,6 +60,7 @@ import {
56
60
  AVATAR_MAX_DECODED_BYTES,
57
61
  AVATAR_PROMPT_MAX_LENGTH,
58
62
  ManagedAvatarError,
63
+ VERTEX_IMAGE_DEFAULT_MODEL,
59
64
  } from "../media/avatar-types.js";
60
65
  import {
61
66
  generateManagedAvatar,
@@ -66,18 +71,16 @@ import {
66
71
  // Helpers
67
72
  // ---------------------------------------------------------------------------
68
73
 
74
+ const SMALL_PNG_BASE64 = "iVBORw0KGgo=";
75
+
69
76
  function successResponse() {
70
77
  return {
71
- image: {
72
- mime_type: "image/png",
73
- data_base64: "iVBORw0KGgo=",
74
- bytes: 1024,
75
- sha256: "abc123",
76
- },
77
- usage: { billable: true, class_name: "avatar" },
78
- generation_source: "managed",
79
- profile: "default",
80
- correlation_id: "test-corr-id",
78
+ predictions: [
79
+ {
80
+ bytesBase64Encoded: SMALL_PNG_BASE64,
81
+ mimeType: "image/png",
82
+ },
83
+ ],
81
84
  };
82
85
  }
83
86
 
@@ -94,6 +97,7 @@ beforeEach(() => {
94
97
  ok: true,
95
98
  status: 200,
96
99
  json: async () => successResponse(),
100
+ text: async () => JSON.stringify(successResponse()),
97
101
  };
98
102
  });
99
103
 
@@ -102,9 +106,57 @@ describe("generateManagedAvatar", () => {
102
106
  const result = await generateManagedAvatar("a friendly robot avatar");
103
107
 
104
108
  expect(result.image.mime_type).toBe("image/png");
105
- expect(result.image.data_base64).toBe("iVBORw0KGgo=");
106
- expect(result.image.bytes).toBe(1024);
107
- expect(result.generation_source).toBe("managed");
109
+ expect(result.image.data_base64).toBe(SMALL_PNG_BASE64);
110
+ // bytes is computed from base64 length, not from the server response
111
+ const padding = SMALL_PNG_BASE64.endsWith("==")
112
+ ? 2
113
+ : SMALL_PNG_BASE64.endsWith("=")
114
+ ? 1
115
+ : 0;
116
+ const expectedBytes =
117
+ Math.ceil((SMALL_PNG_BASE64.length * 3) / 4) - padding;
118
+ expect(result.image.bytes).toBe(expectedBytes);
119
+ const expectedSha256 = createHash("sha256")
120
+ .update(Buffer.from(SMALL_PNG_BASE64, "base64"))
121
+ .digest("hex");
122
+ expect(result.image.sha256).toBe(expectedSha256);
123
+ expect(result.correlation_id).toBeDefined();
124
+ });
125
+
126
+ test("fetch URL matches runtime proxy Vertex endpoint with default model", async () => {
127
+ await generateManagedAvatar("test prompt");
128
+
129
+ expect(lastFetchArgs).not.toBeNull();
130
+ const url = lastFetchArgs![0];
131
+ expect(url).toBe(
132
+ `https://platform.vellum.ai/v1/runtime-proxy/vertex/v1/models/${VERTEX_IMAGE_DEFAULT_MODEL}:predict`,
133
+ );
134
+ });
135
+
136
+ test("custom model is used in the URL path", async () => {
137
+ const customModel = "imagen-3.0-fast-generate-001";
138
+ await generateManagedAvatar("test prompt", { model: customModel });
139
+
140
+ expect(lastFetchArgs).not.toBeNull();
141
+ const url = lastFetchArgs![0];
142
+ expect(url).toBe(
143
+ `https://platform.vellum.ai/v1/runtime-proxy/vertex/v1/models/${customModel}:predict`,
144
+ );
145
+ });
146
+
147
+ test("request body uses Vertex Imagen format", async () => {
148
+ await generateManagedAvatar("a cool robot");
149
+
150
+ expect(lastFetchArgs).not.toBeNull();
151
+ const body = JSON.parse(lastFetchArgs![1].body as string);
152
+ expect(body).toEqual({
153
+ instances: [{ prompt: "a cool robot" }],
154
+ parameters: {
155
+ sampleCount: 1,
156
+ aspectRatio: "1:1",
157
+ outputOptions: { mimeType: "image/png" },
158
+ },
159
+ });
108
160
  });
109
161
 
110
162
  test("prompt exceeding max length throws ManagedAvatarError with code validation_error", async () => {
@@ -125,13 +177,8 @@ describe("generateManagedAvatar", () => {
125
177
  fetchResponse = {
126
178
  ok: false,
127
179
  status: 429,
128
- json: async () => ({
129
- code: "rate_limit",
130
- subcode: "too_many_requests",
131
- detail: "Rate limit exceeded",
132
- retryable: true,
133
- correlation_id: "corr-429",
134
- }),
180
+ json: async () => ({}),
181
+ text: async () => "Rate limit exceeded",
135
182
  };
136
183
 
137
184
  try {
@@ -142,20 +189,17 @@ describe("generateManagedAvatar", () => {
142
189
  const avatarErr = err as ManagedAvatarError;
143
190
  expect(avatarErr.retryable).toBe(true);
144
191
  expect(avatarErr.statusCode).toBe(429);
192
+ expect(avatarErr.code).toBe("upstream_error");
193
+ expect(avatarErr.subcode).toBe("http_error");
145
194
  }
146
195
  });
147
196
 
148
- test("HTTP 500 response throws ManagedAvatarError with upstream error details", async () => {
197
+ test("HTTP 500 response throws retryable ManagedAvatarError", async () => {
149
198
  fetchResponse = {
150
199
  ok: false,
151
200
  status: 500,
152
- json: async () => ({
153
- code: "internal_error",
154
- subcode: "server_fault",
155
- detail: "Internal server error",
156
- retryable: true,
157
- correlation_id: "corr-500",
158
- }),
201
+ json: async () => ({}),
202
+ text: async () => "Internal server error",
159
203
  };
160
204
 
161
205
  try {
@@ -164,20 +208,19 @@ describe("generateManagedAvatar", () => {
164
208
  } catch (err) {
165
209
  expect(err).toBeInstanceOf(ManagedAvatarError);
166
210
  const avatarErr = err as ManagedAvatarError;
167
- expect(avatarErr.code).toBe("internal_error");
168
- expect(avatarErr.subcode).toBe("server_fault");
211
+ expect(avatarErr.code).toBe("upstream_error");
212
+ expect(avatarErr.subcode).toBe("http_error");
169
213
  expect(avatarErr.statusCode).toBe(500);
214
+ expect(avatarErr.retryable).toBe(true);
170
215
  }
171
216
  });
172
217
 
173
- test("response with disallowed MIME type throws validation error", async () => {
218
+ test("HTTP 400 response throws non-retryable ManagedAvatarError", async () => {
174
219
  fetchResponse = {
175
- ok: true,
176
- status: 200,
177
- json: async () => ({
178
- ...successResponse(),
179
- image: { ...successResponse().image, mime_type: "image/gif" },
180
- }),
220
+ ok: false,
221
+ status: 400,
222
+ json: async () => ({}),
223
+ text: async () => "Model not allowed on this platform",
181
224
  };
182
225
 
183
226
  try {
@@ -186,22 +229,26 @@ describe("generateManagedAvatar", () => {
186
229
  } catch (err) {
187
230
  expect(err).toBeInstanceOf(ManagedAvatarError);
188
231
  const avatarErr = err as ManagedAvatarError;
189
- expect(avatarErr.code).toBe("validation_error");
190
- expect(avatarErr.subcode).toBe("disallowed_mime_type");
232
+ expect(avatarErr.code).toBe("upstream_error");
233
+ expect(avatarErr.subcode).toBe("http_error");
234
+ expect(avatarErr.statusCode).toBe(400);
235
+ expect(avatarErr.retryable).toBe(false);
191
236
  }
192
237
  });
193
238
 
194
- test("response with oversized bytes throws validation error", async () => {
239
+ test("response with disallowed MIME type throws validation error", async () => {
195
240
  fetchResponse = {
196
241
  ok: true,
197
242
  status: 200,
198
243
  json: async () => ({
199
- ...successResponse(),
200
- image: {
201
- ...successResponse().image,
202
- bytes: AVATAR_MAX_DECODED_BYTES + 1,
203
- },
244
+ predictions: [
245
+ {
246
+ bytesBase64Encoded: SMALL_PNG_BASE64,
247
+ mimeType: "image/gif",
248
+ },
249
+ ],
204
250
  }),
251
+ text: async () => "",
205
252
  };
206
253
 
207
254
  try {
@@ -211,13 +258,11 @@ describe("generateManagedAvatar", () => {
211
258
  expect(err).toBeInstanceOf(ManagedAvatarError);
212
259
  const avatarErr = err as ManagedAvatarError;
213
260
  expect(avatarErr.code).toBe("validation_error");
214
- expect(avatarErr.subcode).toBe("oversized_image");
261
+ expect(avatarErr.subcode).toBe("disallowed_mime_type");
215
262
  }
216
263
  });
217
264
 
218
- test("response with oversized base64 estimated decoded size throws validation error", async () => {
219
- // Create a base64 string whose estimated decoded size exceeds the limit,
220
- // even though the server-reported bytes field is under the limit
265
+ test("response with oversized image throws validation error", async () => {
221
266
  const oversizedBase64 = "A".repeat(
222
267
  Math.ceil(((AVATAR_MAX_DECODED_BYTES + 100) * 4) / 3),
223
268
  );
@@ -225,13 +270,14 @@ describe("generateManagedAvatar", () => {
225
270
  ok: true,
226
271
  status: 200,
227
272
  json: async () => ({
228
- ...successResponse(),
229
- image: {
230
- ...successResponse().image,
231
- data_base64: oversizedBase64,
232
- bytes: 1024,
233
- },
273
+ predictions: [
274
+ {
275
+ bytesBase64Encoded: oversizedBase64,
276
+ mimeType: "image/png",
277
+ },
278
+ ],
234
279
  }),
280
+ text: async () => "",
235
281
  };
236
282
 
237
283
  try {
@@ -32,7 +32,6 @@ mock.module("../util/platform.js", () => ({
32
32
  getWorkspaceSkillsDir: () => join(TEST_DIR, "skills"),
33
33
  getDataDir: () => TEST_DIR,
34
34
  ensureDataDir: () => {},
35
- getSocketPath: () => join(TEST_DIR, "vellum.sock"),
36
35
  getPidPath: () => join(TEST_DIR, "vellum.pid"),
37
36
  getDbPath: () => join(TEST_DIR, "data", "assistant.db"),
38
37
  getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
@@ -72,19 +71,11 @@ mock.module("../tools/terminal/sandbox.js", () => ({
72
71
 
73
72
  import { loadSkillCatalog } from "../config/skills.js";
74
73
  import { buildSystemPrompt } from "../prompts/system-prompt.js";
75
- import { DeleteManagedSkillTool } from "../tools/skills/delete-managed.js";
74
+ import { executeDeleteManagedSkill } from "../tools/skills/delete-managed.js";
76
75
  import { SkillLoadTool } from "../tools/skills/load.js";
77
- import { ScaffoldManagedSkillTool } from "../tools/skills/scaffold-managed.js";
76
+ import { executeScaffoldManagedSkill } from "../tools/skills/scaffold-managed.js";
78
77
  import type { ToolContext } from "../tools/types.js";
79
78
 
80
- const scaffoldTool = new (ScaffoldManagedSkillTool as any)() as InstanceType<
81
- typeof ScaffoldManagedSkillTool
82
- >;
83
-
84
- const deleteTool = new (DeleteManagedSkillTool as any)() as InstanceType<
85
- typeof DeleteManagedSkillTool
86
- >;
87
-
88
79
  function makeContext(): ToolContext {
89
80
  return {
90
81
  workingDir: "/tmp",
@@ -106,7 +97,7 @@ afterEach(() => {
106
97
  describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete", () => {
107
98
  test("full lifecycle: create skill, verify in catalog and prompt, then delete", async () => {
108
99
  // Step 1: Scaffold a managed skill
109
- const scaffoldResult = await scaffoldTool.execute(
100
+ const scaffoldResult = await executeScaffoldManagedSkill(
110
101
  {
111
102
  skill_id: "lifecycle-test",
112
103
  name: "Lifecycle Test",
@@ -143,7 +134,7 @@ describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete",
143
134
  expect(prompt).toContain("## Dynamic Skill Authoring Workflow");
144
135
 
145
136
  // Step 5: Delete the skill
146
- const deleteResult = await deleteTool.execute(
137
+ const deleteResult = await executeDeleteManagedSkill(
147
138
  {
148
139
  skill_id: "lifecycle-test",
149
140
  },
@@ -173,7 +164,7 @@ describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete",
173
164
  const ctx = makeContext();
174
165
 
175
166
  // Create initial skill
176
- await scaffoldTool.execute(
167
+ await executeScaffoldManagedSkill(
177
168
  {
178
169
  skill_id: "overwrite-test",
179
170
  name: "V1",
@@ -184,7 +175,7 @@ describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete",
184
175
  );
185
176
 
186
177
  // Overwrite with updated content
187
- const result = await scaffoldTool.execute(
178
+ const result = await executeScaffoldManagedSkill(
188
179
  {
189
180
  skill_id: "overwrite-test",
190
181
  name: "V2",
@@ -215,7 +206,7 @@ describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete",
215
206
  });
216
207
 
217
208
  test("delete non-existent skill returns error", async () => {
218
- const result = await deleteTool.execute(
209
+ const result = await executeDeleteManagedSkill(
219
210
  {
220
211
  skill_id: "does-not-exist",
221
212
  },
@@ -233,7 +224,7 @@ describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete",
233
224
  >;
234
225
 
235
226
  // Step 1: Scaffold a skill directly
236
- const scaffoldResult = await scaffoldTool.execute(
227
+ const scaffoldResult = await executeScaffoldManagedSkill(
237
228
  {
238
229
  skill_id: "chain-test",
239
230
  name: "Chain Test",
@@ -262,7 +253,7 @@ describe("managed skill lifecycle: scaffold โ†’ catalog โ†’ prompt โ†’ delete",
262
253
  expect(loadContent).toContain("echo chain-test-ok");
263
254
 
264
255
  // Step 3: Clean up
265
- const deleteResult = await deleteTool.execute(
256
+ const deleteResult = await executeDeleteManagedSkill(
266
257
  { skill_id: "chain-test" },
267
258
  ctx,
268
259
  );
@@ -20,6 +20,8 @@ import {
20
20
  test,
21
21
  } from "bun:test";
22
22
 
23
+ import { parse as parseYaml } from "yaml";
24
+
23
25
  let TEST_DIR = "";
24
26
 
25
27
  mock.module("../util/platform.js", () => ({
@@ -104,11 +106,9 @@ describe("buildSkillMarkdown", () => {
104
106
  emoji: "๐Ÿงช",
105
107
  });
106
108
  expect(result).toContain("metadata:");
107
- const metadataLine = result
108
- .split("\n")
109
- .find((l) => l.startsWith("metadata:"));
110
- const json = JSON.parse(metadataLine!.slice("metadata: ".length));
111
- expect(json.vellum.emoji).toBe("๐Ÿงช");
109
+ const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
110
+ const parsed = parseYaml(fmMatch![1]);
111
+ expect(parsed.metadata.vellum.emoji).toBe("๐Ÿงช");
112
112
  });
113
113
 
114
114
  test("includes user-invocable=false in metadata.vellum", () => {
@@ -118,11 +118,9 @@ describe("buildSkillMarkdown", () => {
118
118
  bodyMarkdown: "Body.",
119
119
  userInvocable: false,
120
120
  });
121
- const metadataLine = result
122
- .split("\n")
123
- .find((l) => l.startsWith("metadata:"));
124
- const json = JSON.parse(metadataLine!.slice("metadata: ".length));
125
- expect(json.vellum["user-invocable"]).toBe(false);
121
+ const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
122
+ const parsed = parseYaml(fmMatch![1]);
123
+ expect(parsed.metadata.vellum["user-invocable"]).toBe(false);
126
124
  });
127
125
 
128
126
  test("includes disable-model-invocation in metadata.vellum", () => {
@@ -132,11 +130,9 @@ describe("buildSkillMarkdown", () => {
132
130
  bodyMarkdown: "Body.",
133
131
  disableModelInvocation: true,
134
132
  });
135
- const metadataLine = result
136
- .split("\n")
137
- .find((l) => l.startsWith("metadata:"));
138
- const json = JSON.parse(metadataLine!.slice("metadata: ".length));
139
- expect(json.vellum["disable-model-invocation"]).toBe(true);
133
+ const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
134
+ const parsed = parseYaml(fmMatch![1]);
135
+ expect(parsed.metadata.vellum["disable-model-invocation"]).toBe(true);
140
136
  });
141
137
 
142
138
  test("escapes double quotes in name and description", () => {
@@ -201,18 +197,16 @@ describe("buildSkillMarkdown", () => {
201
197
  expect(skill!.name).toBe("path\\name");
202
198
  });
203
199
 
204
- test("includes field emits JSON array in metadata.vellum", () => {
200
+ test("includes field emits YAML list in metadata.vellum", () => {
205
201
  const result = buildSkillMarkdown({
206
202
  name: "Parent",
207
203
  description: "Has children",
208
204
  bodyMarkdown: "Body.",
209
205
  includes: ["child-a", "child-b"],
210
206
  });
211
- const metadataLine = result
212
- .split("\n")
213
- .find((l) => l.startsWith("metadata:"));
214
- const json = JSON.parse(metadataLine!.slice("metadata: ".length));
215
- expect(json.vellum.includes).toEqual(["child-a", "child-b"]);
207
+ const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
208
+ const parsed = parseYaml(fmMatch![1]);
209
+ expect(parsed.metadata.vellum.includes).toEqual(["child-a", "child-b"]);
216
210
  });
217
211
 
218
212
  test("omits metadata when no vellum fields provided", () => {
@@ -788,3 +782,82 @@ describe("validateManagedSkillId edge cases", () => {
788
782
  expect(validateManagedSkillId("a1.b2-c3_d4")).toBeNull();
789
783
  });
790
784
  });
785
+
786
+ describe("YAML metadata round-trip", () => {
787
+ test("all vellum fields round-trip through write and load", () => {
788
+ // Create a managed skill with every vellum metadata field populated
789
+ createManagedSkill({
790
+ id: "yaml-roundtrip-all",
791
+ name: "Full Metadata Skill",
792
+ description: "Tests all vellum fields round-trip correctly",
793
+ bodyMarkdown: "Full metadata body.",
794
+ emoji: "๐Ÿ”ฌ",
795
+ userInvocable: false,
796
+ disableModelInvocation: true,
797
+ includes: ["child-a", "child-b"],
798
+ });
799
+
800
+ // Load it back via loadSkillCatalog
801
+ const catalog = loadSkillCatalog(undefined, [join(TEST_DIR, "skills")]);
802
+ const skill = catalog.find((s) => s.id === "yaml-roundtrip-all");
803
+ expect(skill).toBeDefined();
804
+
805
+ // Verify all fields are correctly preserved
806
+ expect(skill!.name).toBe("Full Metadata Skill");
807
+ expect(skill!.description).toBe(
808
+ "Tests all vellum fields round-trip correctly",
809
+ );
810
+ expect(skill!.emoji).toBe("๐Ÿ”ฌ");
811
+ expect(skill!.userInvocable).toBe(false);
812
+ expect(skill!.disableModelInvocation).toBe(true);
813
+ expect(skill!.includes).toEqual(["child-a", "child-b"]);
814
+ });
815
+
816
+ test("hand-authored YAML nested metadata parses correctly", () => {
817
+ // Manually write a SKILL.md with YAML-style nested metadata matching
818
+ // the format used in skills/ directory (bundled skills format)
819
+ const skillDir = join(TEST_DIR, "skills", "yaml-nested-test");
820
+ mkdirSync(skillDir, { recursive: true });
821
+ writeFileSync(
822
+ join(skillDir, "SKILL.md"),
823
+ [
824
+ "---",
825
+ "name: yaml-nested-skill",
826
+ "description: Hand-authored YAML nested metadata test",
827
+ 'compatibility: "Designed for Vellum personal assistants"',
828
+ "metadata:",
829
+ ' emoji: "๐Ÿงช"',
830
+ " vellum:",
831
+ ' display-name: "YAML Nested Skill"',
832
+ " user-invocable: false",
833
+ " disable-model-invocation: true",
834
+ " os:",
835
+ ` - "${process.platform}"`,
836
+ " includes:",
837
+ ' - "child-a"',
838
+ ' - "child-b"',
839
+ "---",
840
+ "",
841
+ "Hand-authored body content.",
842
+ "",
843
+ ].join("\n"),
844
+ );
845
+
846
+ const catalog = loadSkillCatalog(undefined, [join(TEST_DIR, "skills")]);
847
+ const skill = catalog.find((s) => s.id === "yaml-nested-test");
848
+ expect(skill).toBeDefined();
849
+
850
+ // Verify all nested vellum fields are correctly parsed
851
+ expect(skill!.name).toBe("yaml-nested-skill");
852
+ expect(skill!.description).toBe("Hand-authored YAML nested metadata test");
853
+ expect(skill!.displayName).toBe("YAML Nested Skill");
854
+ expect(skill!.userInvocable).toBe(false);
855
+ expect(skill!.disableModelInvocation).toBe(true);
856
+ expect(skill!.emoji).toBe("๐Ÿงช");
857
+ expect(skill!.includes).toEqual(["child-a", "child-b"]);
858
+
859
+ // Verify os is parsed into metadata
860
+ expect(skill!.metadata).toBeDefined();
861
+ expect(skill!.metadata!.os).toEqual([process.platform]);
862
+ });
863
+ });
@@ -32,7 +32,6 @@ mock.module("../util/platform.js", () => ({
32
32
  isMacOS: () => process.platform === "darwin",
33
33
  isLinux: () => process.platform === "linux",
34
34
  isWindows: () => process.platform === "win32",
35
- getSocketPath: () => join(testDir, "test.sock"),
36
35
  getPidPath: () => join(testDir, "test.pid"),
37
36
  getDbPath: () => join(testDir, "test.db"),
38
37
  getLogPath: () => join(testDir, "test.log"),