@vellumai/assistant 0.4.42 → 0.4.44

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 (867) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +140 -403
  4. package/Dockerfile +0 -1
  5. package/README.md +81 -92
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +81 -104
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -3
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-asset.test.ts +1 -1
  33. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  34. package/src/__tests__/call-controller.test.ts +4 -8
  35. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  36. package/src/__tests__/call-domain.test.ts +250 -8
  37. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  38. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  39. package/src/__tests__/call-recovery.test.ts +47 -0
  40. package/src/__tests__/call-routes-http.test.ts +13 -0
  41. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  42. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  43. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  44. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  45. package/src/__tests__/channel-approval.test.ts +0 -201
  46. package/src/__tests__/channel-approvals.test.ts +2 -2
  47. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  48. package/src/__tests__/channel-guardian.test.ts +641 -740
  49. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  50. package/src/__tests__/channel-policy.test.ts +9 -12
  51. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  52. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  53. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  54. package/src/__tests__/checker.test.ts +41 -35
  55. package/src/__tests__/chrome-cdp.test.ts +57 -17
  56. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  57. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  58. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  59. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  60. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  61. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  62. package/src/__tests__/config-watcher.test.ts +1 -5
  63. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  64. package/src/__tests__/connection-policy.test.ts +3 -62
  65. package/src/__tests__/contacts-tools.test.ts +0 -2
  66. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  67. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  68. package/src/__tests__/context-window-manager.test.ts +220 -61
  69. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  70. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  71. package/src/__tests__/conversation-pairing.test.ts +14 -14
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +7 -7
  73. package/src/__tests__/conversation-store.test.ts +2 -2
  74. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  75. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +10 -16
  77. package/src/__tests__/credentials-cli.test.ts +49 -5
  78. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  79. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  80. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  81. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  82. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  84. package/src/__tests__/email-cli.test.ts +12 -12
  85. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  86. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  87. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  88. package/src/__tests__/event-bus.test.ts +0 -1
  89. package/src/__tests__/followup-tools.test.ts +0 -2
  90. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  91. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  92. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  95. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  97. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  98. package/src/__tests__/guardian-action-store.test.ts +2 -2
  99. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  101. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  102. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  103. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  104. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  105. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  106. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  109. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  110. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  111. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  112. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  113. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  114. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  115. package/src/__tests__/heartbeat-service.test.ts +1 -1
  116. package/src/__tests__/host-shell-tool.test.ts +3 -12
  117. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  118. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  119. package/src/__tests__/integration-status.test.ts +8 -8
  120. package/src/__tests__/intent-routing.test.ts +9 -13
  121. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  122. package/src/__tests__/invite-routes-http.test.ts +10 -10
  123. package/src/__tests__/llm-usage-store.test.ts +45 -9
  124. package/src/__tests__/local-gateway-health.test.ts +209 -0
  125. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  126. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  127. package/src/__tests__/managed-store.test.ts +29 -12
  128. package/src/__tests__/managed-twitter-guardrails.test.ts +357 -0
  129. package/src/__tests__/mcp-cli.test.ts +1 -1
  130. package/src/__tests__/mcp-health-check.test.ts +1 -1
  131. package/src/__tests__/media-generate-image.test.ts +1 -1
  132. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  133. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  134. package/src/__tests__/memory-regressions.test.ts +1 -166
  135. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  136. package/src/__tests__/migration-export-http.test.ts +2 -2
  137. package/src/__tests__/migration-transport.test.ts +44 -0
  138. package/src/__tests__/non-member-access-request.test.ts +49 -36
  139. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  140. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  141. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  142. package/src/__tests__/notification-deep-link.test.ts +3 -3
  143. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  144. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  145. package/src/__tests__/oauth-cli.test.ts +1 -1
  146. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  147. package/src/__tests__/onboarding-template-contract.test.ts +2 -12
  148. package/src/__tests__/platform.test.ts +168 -5
  149. package/src/__tests__/playbook-execution.test.ts +0 -2
  150. package/src/__tests__/playbook-tools.test.ts +0 -2
  151. package/src/__tests__/pricing.test.ts +125 -0
  152. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  153. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  154. package/src/__tests__/recording-handler.test.ts +46 -80
  155. package/src/__tests__/recording-state-machine.test.ts +112 -183
  156. package/src/__tests__/registry.test.ts +1 -1
  157. package/src/__tests__/relay-server.test.ts +69 -71
  158. package/src/__tests__/reminder-store.test.ts +3 -3
  159. package/src/__tests__/request-file-tool.test.ts +2 -2
  160. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  163. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  164. package/src/__tests__/schedule-store.test.ts +13 -4
  165. package/src/__tests__/schedule-tools.test.ts +0 -2
  166. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  167. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  168. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  169. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  170. package/src/__tests__/secret-response-routing.test.ts +1 -1
  171. package/src/__tests__/send-endpoint-busy.test.ts +1 -4
  172. package/src/__tests__/sequence-store.test.ts +0 -2
  173. package/src/__tests__/server-history-render.test.ts +2 -199
  174. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  175. package/src/__tests__/session-agent-loop.test.ts +107 -3
  176. package/src/__tests__/session-confirmation-signals.test.ts +17 -49
  177. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  178. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  179. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  180. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  181. package/src/__tests__/session-profile-injection.test.ts +9 -3
  182. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  183. package/src/__tests__/session-queue.test.ts +10 -4
  184. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  185. package/src/__tests__/session-skill-tools.test.ts +2 -3
  186. package/src/__tests__/session-slash-known.test.ts +11 -4
  187. package/src/__tests__/session-slash-queue.test.ts +11 -4
  188. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  189. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  190. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  191. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  192. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  193. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  194. package/src/__tests__/session-usage.test.ts +180 -0
  195. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  196. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  199. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  200. package/src/__tests__/skill-include-graph.test.ts +1 -0
  201. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  202. package/src/__tests__/skill-load-tool.test.ts +90 -12
  203. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  204. package/src/__tests__/skills-uninstall.test.ts +131 -0
  205. package/src/__tests__/skills.test.ts +32 -16
  206. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  207. package/src/__tests__/slack-channel-config.test.ts +71 -12
  208. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  209. package/src/__tests__/slack-share-routes.test.ts +1 -1
  210. package/src/__tests__/slack-skill.test.ts +2 -2
  211. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  212. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  213. package/src/__tests__/starter-task-flow.test.ts +10 -20
  214. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  215. package/src/__tests__/subagent-tools.test.ts +2 -2
  216. package/src/__tests__/system-prompt.test.ts +7 -12
  217. package/src/__tests__/task-compiler.test.ts +0 -2
  218. package/src/__tests__/task-management-tools.test.ts +0 -2
  219. package/src/__tests__/task-runner.test.ts +0 -2
  220. package/src/__tests__/task-scheduler.test.ts +2 -2
  221. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  222. package/src/__tests__/terminal-tools.test.ts +1 -11
  223. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  224. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  225. package/src/__tests__/tool-executor.test.ts +2 -2
  226. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  227. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  228. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  229. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  230. package/src/__tests__/trace-emitter.test.ts +1 -1
  231. package/src/__tests__/trust-context-guards.test.ts +1 -1
  232. package/src/__tests__/trust-store.test.ts +48 -399
  233. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  234. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  235. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  236. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  237. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  238. package/src/__tests__/twilio-config.test.ts +11 -2
  239. package/src/__tests__/twilio-provider.test.ts +6 -4
  240. package/src/__tests__/twilio-routes.test.ts +408 -86
  241. package/src/__tests__/twitter-platform-proxy-client.test.ts +475 -0
  242. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  243. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  244. package/src/__tests__/update-bulletin.test.ts +4 -8
  245. package/src/__tests__/update-template-contract.test.ts +1 -1
  246. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  247. package/src/__tests__/usage-routes.test.ts +23 -5
  248. package/src/__tests__/user-reference.test.ts +1 -1
  249. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  250. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  251. package/src/__tests__/view-image-tool.test.ts +0 -2
  252. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  253. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  254. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  255. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  256. package/src/__tests__/workspace-policy.test.ts +1 -1
  257. package/src/approvals/AGENTS.md +4 -4
  258. package/src/approvals/approval-primitive.ts +2 -2
  259. package/src/approvals/guardian-decision-primitive.ts +1 -1
  260. package/src/approvals/guardian-request-resolvers.ts +3 -4
  261. package/src/bundler/app-bundler.ts +29 -217
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +14 -54
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +108 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +15 -17
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +345 -0
  316. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +252 -0
  317. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -48
  318. package/src/cli/commands/twitter/index.ts +420 -0
  319. package/src/{twitter → cli/commands/twitter}/oauth-client.ts +1 -35
  320. package/src/cli/commands/twitter/router.ts +351 -0
  321. package/src/cli/commands/twitter/types.ts +30 -0
  322. package/src/cli/db.ts +1 -0
  323. package/src/cli/http-client.ts +87 -0
  324. package/src/cli/logger.ts +6 -0
  325. package/src/cli/main-screen.tsx +4 -3
  326. package/src/cli/output.ts +19 -0
  327. package/src/cli/program.ts +29 -27
  328. package/src/cli/reference.ts +27 -37
  329. package/src/cli.ts +452 -240
  330. package/src/config/assistant-feature-flags.ts +3 -15
  331. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  332. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  333. package/src/config/bundled-skills/amazon/SKILL.md +15 -6
  334. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  335. package/src/config/bundled-skills/app-builder/SKILL.md +4 -9
  336. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +23 -77
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -12
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -90
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +132 -109
  350. package/src/config/bundled-skills/doordash/lib/session.ts +22 -19
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +73 -144
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +8 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +196 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +151 -105
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +155 -55
  452. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  453. package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -25
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +30 -20
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +7 -1
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/surfaces.ts +2 -0
  462. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  463. package/src/daemon/providers-setup.ts +0 -5
  464. package/src/daemon/recording-executor.ts +0 -7
  465. package/src/daemon/ride-shotgun-handler.ts +42 -14
  466. package/src/daemon/seed-files.ts +3 -27
  467. package/src/daemon/server.ts +134 -524
  468. package/src/daemon/session-agent-loop-handlers.ts +46 -9
  469. package/src/daemon/session-agent-loop.ts +86 -24
  470. package/src/daemon/session-attachments.ts +1 -1
  471. package/src/daemon/session-error.ts +1 -1
  472. package/src/daemon/session-history.ts +20 -15
  473. package/src/daemon/session-lifecycle.ts +9 -7
  474. package/src/daemon/session-memory.ts +15 -1
  475. package/src/daemon/session-messaging.ts +10 -6
  476. package/src/daemon/session-notifiers.ts +10 -8
  477. package/src/daemon/session-process.ts +34 -25
  478. package/src/daemon/session-queue-manager.ts +1 -1
  479. package/src/daemon/session-runtime-assembly.ts +6 -32
  480. package/src/daemon/session-surfaces.ts +187 -35
  481. package/src/daemon/session-tool-setup.ts +1 -1
  482. package/src/daemon/session-usage.ts +119 -18
  483. package/src/daemon/session.ts +11 -33
  484. package/src/daemon/tool-side-effects.ts +6 -5
  485. package/src/daemon/trace-emitter.ts +1 -1
  486. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  487. package/src/daemon/watch-handler.ts +2 -5
  488. package/src/email/service.ts +8 -8
  489. package/src/events/domain-events.ts +0 -1
  490. package/src/events/tool-notification-listener.ts +1 -1
  491. package/src/followups/followup-store.ts +1 -2
  492. package/src/followups/types.ts +0 -6
  493. package/src/heartbeat/heartbeat-service.ts +1 -1
  494. package/src/inbound/platform-callback-registration.ts +1 -1
  495. package/src/inbound/public-ingress-urls.ts +0 -8
  496. package/src/index.ts +12 -0
  497. package/src/mcp/client.ts +1 -1
  498. package/src/mcp/manager.ts +1 -1
  499. package/src/memory/app-store.ts +1 -60
  500. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  501. package/src/memory/conversation-attention-store.ts +154 -0
  502. package/src/memory/conversation-bootstrap.ts +1 -1
  503. package/src/memory/conversation-crud.ts +53 -1
  504. package/src/memory/conversation-display-order-migration.ts +2 -3
  505. package/src/memory/conversation-queries.ts +1 -29
  506. package/src/memory/conversation-title-service.ts +26 -21
  507. package/src/memory/db-connection.ts +1 -8
  508. package/src/memory/db-init.ts +20 -0
  509. package/src/memory/delivery-crud.ts +4 -34
  510. package/src/memory/external-conversation-store.ts +1 -1
  511. package/src/memory/format-recall.ts +47 -0
  512. package/src/memory/guardian-action-store.ts +4 -5
  513. package/src/memory/guardian-rate-limits.ts +0 -3
  514. package/src/memory/invite-store.ts +1 -1
  515. package/src/memory/job-handlers/backfill.ts +9 -2
  516. package/src/memory/job-handlers/extraction.ts +2 -7
  517. package/src/memory/job-handlers/summarization.ts +1 -1
  518. package/src/memory/llm-usage-store.ts +11 -0
  519. package/src/memory/migrations/114-notifications.ts +12 -40
  520. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  521. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  522. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  523. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  524. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  525. package/src/memory/migrations/index.ts +5 -0
  526. package/src/memory/migrations/registry.ts +30 -0
  527. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  528. package/src/memory/retriever.test.ts +707 -0
  529. package/src/memory/retriever.ts +120 -116
  530. package/src/memory/schema/calls.ts +3 -7
  531. package/src/memory/schema/guardian.ts +2 -2
  532. package/src/memory/schema/infrastructure.ts +0 -8
  533. package/src/memory/search/lexical.ts +4 -1
  534. package/src/memory/search/query-expansion.test.ts +70 -0
  535. package/src/memory/search/query-expansion.ts +118 -0
  536. package/src/memory/search/types.ts +18 -17
  537. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  538. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  539. package/src/messaging/registry.ts +0 -1
  540. package/src/notifications/README.md +13 -22
  541. package/src/notifications/adapters/macos.ts +1 -1
  542. package/src/notifications/conversation-pairing.ts +2 -2
  543. package/src/notifications/copy-composer.ts +2 -2
  544. package/src/notifications/decision-engine.ts +1 -10
  545. package/src/notifications/destination-resolver.ts +2 -3
  546. package/src/notifications/emit-signal.ts +2 -8
  547. package/src/notifications/guardian-question-mode.ts +5 -8
  548. package/src/notifications/signal.ts +1 -2
  549. package/src/notifications/types.ts +1 -1
  550. package/src/oauth/token-persistence.ts +25 -1
  551. package/src/permissions/checker.ts +4 -29
  552. package/src/permissions/defaults.ts +9 -9
  553. package/src/permissions/prompter.ts +1 -1
  554. package/src/permissions/secret-prompter.ts +1 -1
  555. package/src/permissions/shell-identity.ts +1 -1
  556. package/src/permissions/trust-store.ts +13 -76
  557. package/src/permissions/workspace-policy.ts +1 -1
  558. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  559. package/src/{config → prompts}/system-prompt.ts +44 -26
  560. package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -3
  561. package/src/providers/registry.ts +2 -4
  562. package/src/runtime/AGENTS.md +6 -8
  563. package/src/runtime/access-request-helper.ts +36 -55
  564. package/src/runtime/actor-trust-resolver.ts +1 -24
  565. package/src/runtime/approval-message-composer.ts +6 -2
  566. package/src/runtime/assistant-event.ts +1 -1
  567. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  568. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  569. package/src/runtime/auth/__tests__/scopes.test.ts +2 -1
  570. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  571. package/src/runtime/auth/route-policy.ts +137 -25
  572. package/src/runtime/auth/scopes.ts +1 -0
  573. package/src/runtime/auth/subject.ts +9 -0
  574. package/src/runtime/auth/token-service.ts +12 -1
  575. package/src/runtime/auth/types.ts +1 -1
  576. package/src/runtime/channel-approval-types.ts +1 -1
  577. package/src/runtime/channel-approvals.ts +1 -1
  578. package/src/runtime/channel-invite-transport.ts +0 -2
  579. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  580. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  581. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  582. package/src/runtime/channel-readiness-service.ts +24 -159
  583. package/src/runtime/channel-readiness-types.ts +5 -1
  584. package/src/runtime/channel-reply-delivery.ts +43 -3
  585. package/src/runtime/channel-retry-sweep.ts +14 -22
  586. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  587. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  588. package/src/runtime/gateway-client.ts +12 -15
  589. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  590. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  591. package/src/runtime/guardian-action-message-composer.ts +4 -4
  592. package/src/runtime/guardian-reply-router.ts +3 -3
  593. package/src/runtime/http-server.ts +133 -24
  594. package/src/runtime/http-types.ts +44 -1
  595. package/src/runtime/invite-instruction-generator.ts +1 -3
  596. package/src/runtime/invite-redemption-service.ts +5 -5
  597. package/src/runtime/invite-service.ts +7 -7
  598. package/src/runtime/local-actor-identity.ts +28 -2
  599. package/src/runtime/local-gateway-health.ts +275 -0
  600. package/src/runtime/middleware/error-handler.ts +14 -1
  601. package/src/runtime/middleware/twilio-validation.ts +3 -3
  602. package/src/runtime/migrations/migration-transport.ts +18 -3
  603. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  604. package/src/runtime/nl-approval-parser.ts +2 -3
  605. package/src/runtime/routes/access-request-decision.ts +2 -2
  606. package/src/runtime/routes/app-management-routes.ts +918 -0
  607. package/src/runtime/routes/approval-routes.ts +76 -7
  608. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  609. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  610. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  611. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  612. package/src/runtime/routes/channel-route-shared.ts +1 -3
  613. package/src/runtime/routes/channel-routes.ts +1 -4
  614. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  615. package/src/runtime/routes/computer-use-routes.ts +595 -0
  616. package/src/runtime/routes/contact-routes.ts +1 -317
  617. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  618. package/src/runtime/routes/conversation-routes.ts +20 -24
  619. package/src/runtime/routes/debug-routes.ts +1 -1
  620. package/src/runtime/routes/diagnostics-routes.ts +890 -0
  621. package/src/runtime/routes/documents-routes.ts +227 -0
  622. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  623. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  624. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  625. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  626. package/src/runtime/routes/inbound-conversation.ts +3 -10
  627. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  628. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  629. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  630. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  631. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  632. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  633. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  634. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  635. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  636. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  637. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  638. package/src/runtime/routes/integrations/telegram.ts +111 -0
  639. package/src/runtime/routes/integrations/twilio.ts +451 -0
  640. package/src/runtime/routes/invite-routes.ts +2 -2
  641. package/src/runtime/routes/pairing-routes.ts +1 -1
  642. package/src/runtime/routes/recording-routes.ts +332 -0
  643. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  644. package/src/runtime/routes/session-management-routes.ts +167 -0
  645. package/src/runtime/routes/session-query-routes.ts +204 -0
  646. package/src/runtime/routes/settings-routes.ts +887 -0
  647. package/src/runtime/routes/skills-routes.ts +266 -0
  648. package/src/runtime/routes/subagents-routes.ts +246 -0
  649. package/src/runtime/routes/surface-action-routes.ts +100 -10
  650. package/src/runtime/routes/surface-content-routes.ts +1 -1
  651. package/src/runtime/routes/work-items-routes.ts +809 -0
  652. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  653. package/src/runtime/routes/workspace-routes.ts +410 -0
  654. package/src/runtime/routes/workspace-utils.ts +88 -0
  655. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  656. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  657. package/src/runtime/tool-grant-request-helper.ts +1 -2
  658. package/src/runtime/trust-context-resolver.ts +0 -1
  659. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  660. package/src/runtime/verification-rate-limiter.ts +2 -2
  661. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  662. package/src/schedule/integration-status.ts +2 -2
  663. package/src/schedule/schedule-store.ts +7 -9
  664. package/src/sequence/engine.ts +1 -1
  665. package/src/skills/active-skill-tools.ts +0 -8
  666. package/src/skills/clawhub.ts +1 -10
  667. package/src/skills/managed-store.ts +14 -4
  668. package/src/skills/slash-commands.ts +1 -1
  669. package/src/subagent/manager.ts +1 -1
  670. package/src/subagent/types.ts +1 -1
  671. package/src/tasks/SPEC.md +10 -10
  672. package/src/tasks/task-scheduler.ts +1 -1
  673. package/src/telegram/bot-username.ts +13 -0
  674. package/src/tools/AGENTS.md +38 -0
  675. package/src/tools/apps/executors.ts +0 -6
  676. package/src/tools/assets/materialize.ts +1 -1
  677. package/src/tools/assets/search.ts +1 -1
  678. package/src/tools/browser/browser-execution.ts +2 -2
  679. package/src/tools/browser/browser-manager.ts +88 -11
  680. package/src/tools/browser/browser-screencast.ts +1 -1
  681. package/src/tools/browser/headless-browser.ts +0 -17
  682. package/src/tools/browser/jit-auth.ts +1 -1
  683. package/src/tools/browser/recording-store.ts +19 -1
  684. package/src/tools/browser/runtime-check.ts +4 -2
  685. package/src/tools/calls/call-start.ts +3 -3
  686. package/src/tools/credentials/metadata-store.ts +0 -13
  687. package/src/tools/credentials/vault.ts +7 -31
  688. package/src/tools/document/editor-template.ts +10 -8
  689. package/src/tools/followups/followup_create.ts +0 -8
  690. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  691. package/src/tools/memory/definitions.ts +32 -10
  692. package/src/tools/memory/handlers.test.ts +573 -0
  693. package/src/tools/memory/handlers.ts +222 -65
  694. package/src/tools/memory/register.ts +53 -24
  695. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  696. package/src/tools/schedule/update.ts +0 -8
  697. package/src/tools/skills/load.ts +3 -3
  698. package/src/tools/subagent/read.ts +1 -1
  699. package/src/tools/system/voice-config.ts +2 -14
  700. package/src/tools/terminal/safe-env.ts +5 -18
  701. package/src/tools/tool-approval-handler.ts +4 -4
  702. package/src/tools/tool-manifest.ts +4 -2
  703. package/src/tools/types.ts +1 -1
  704. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  705. package/src/twitter/platform-proxy-client.ts +408 -0
  706. package/src/usage/types.ts +21 -0
  707. package/src/util/canonicalize-identity.ts +2 -6
  708. package/src/util/errors.ts +12 -0
  709. package/src/util/platform.ts +93 -86
  710. package/src/util/pricing.ts +180 -43
  711. package/src/work-items/work-item-runner.ts +1 -1
  712. package/scripts/ipc/check-contract-inventory.ts +0 -107
  713. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  714. package/scripts/ipc/generate-swift.ts +0 -528
  715. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  716. package/src/__tests__/app-migration.test.ts +0 -148
  717. package/src/__tests__/config-loader-migration.test.ts +0 -85
  718. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  719. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  720. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  721. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  722. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  723. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  724. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  725. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  726. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  727. package/src/__tests__/home-base-bootstrap.test.ts +0 -86
  728. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  729. package/src/__tests__/integrations-cli.test.ts +0 -232
  730. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  731. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  732. package/src/__tests__/ipc-contract.test.ts +0 -76
  733. package/src/__tests__/ipc-protocol.test.ts +0 -120
  734. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  735. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  736. package/src/__tests__/ipc-validate.test.ts +0 -471
  737. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  738. package/src/__tests__/migration-ordering.test.ts +0 -267
  739. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  740. package/src/__tests__/platform-move-helper.test.ts +0 -108
  741. package/src/__tests__/platform-socket-path.test.ts +0 -52
  742. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  743. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  744. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  745. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  746. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  747. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  748. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  749. package/src/__tests__/twitter-cli-error-shaping.test.ts +0 -224
  750. package/src/__tests__/twitter-cli-routing.test.ts +0 -286
  751. package/src/__tests__/work-item-output.test.ts +0 -150
  752. package/src/amazon/session.ts +0 -58
  753. package/src/cli/channels.ts +0 -51
  754. package/src/cli/influencer.ts +0 -319
  755. package/src/cli/integrations.ts +0 -372
  756. package/src/cli/ipc-client.ts +0 -88
  757. package/src/cli/twitter.ts +0 -1111
  758. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  759. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  760. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  761. package/src/config/core-schema.ts +0 -434
  762. package/src/config/memory-schema.ts +0 -617
  763. package/src/daemon/auth-manager.ts +0 -106
  764. package/src/daemon/handlers/apps.ts +0 -783
  765. package/src/daemon/handlers/avatar.ts +0 -73
  766. package/src/daemon/handlers/browser.ts +0 -3
  767. package/src/daemon/handlers/computer-use.ts +0 -231
  768. package/src/daemon/handlers/config-dispatch.ts +0 -29
  769. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  770. package/src/daemon/handlers/config-inbox.ts +0 -457
  771. package/src/daemon/handlers/config-integrations.ts +0 -409
  772. package/src/daemon/handlers/config-platform.ts +0 -77
  773. package/src/daemon/handlers/config-slack.ts +0 -41
  774. package/src/daemon/handlers/config-tools.ts +0 -226
  775. package/src/daemon/handlers/config-trust.ts +0 -135
  776. package/src/daemon/handlers/config.ts +0 -64
  777. package/src/daemon/handlers/contacts.ts +0 -193
  778. package/src/daemon/handlers/diagnostics.ts +0 -382
  779. package/src/daemon/handlers/documents.ts +0 -188
  780. package/src/daemon/handlers/guardian-actions.ts +0 -82
  781. package/src/daemon/handlers/home-base.ts +0 -82
  782. package/src/daemon/handlers/index.ts +0 -222
  783. package/src/daemon/handlers/misc.ts +0 -1139
  784. package/src/daemon/handlers/navigate-settings.ts +0 -29
  785. package/src/daemon/handlers/oauth-connect.ts +0 -202
  786. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  787. package/src/daemon/handlers/publish.ts +0 -176
  788. package/src/daemon/handlers/signing.ts +0 -56
  789. package/src/daemon/handlers/subagents.ts +0 -286
  790. package/src/daemon/handlers/twitter-auth.ts +0 -220
  791. package/src/daemon/handlers/work-items.ts +0 -796
  792. package/src/daemon/handlers/workspace-files.ts +0 -84
  793. package/src/daemon/handlers.ts +0 -16
  794. package/src/daemon/ipc-blob-store.ts +0 -246
  795. package/src/daemon/ipc-contract-inventory.json +0 -348
  796. package/src/daemon/ipc-contract-inventory.ts +0 -202
  797. package/src/daemon/ipc-handler.ts +0 -120
  798. package/src/daemon/ipc-protocol.ts +0 -85
  799. package/src/daemon/ipc-validate.ts +0 -254
  800. package/src/home-base/app-link-store.ts +0 -78
  801. package/src/home-base/bootstrap.ts +0 -74
  802. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  803. package/src/home-base/prebuilt/index.html +0 -702
  804. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  805. package/src/home-base/prebuilt/seed.ts +0 -122
  806. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  807. package/src/memory/app-migration.ts +0 -114
  808. package/src/memory/channel-delivery-store.ts +0 -40
  809. package/src/memory/channel-guardian-store.ts +0 -83
  810. package/src/memory/conversation-store.ts +0 -102
  811. package/src/memory/schema-migration.ts +0 -38
  812. package/src/messaging/providers/sms/adapter.ts +0 -232
  813. package/src/messaging/providers/sms/client.ts +0 -93
  814. package/src/messaging/providers/sms/types.ts +0 -7
  815. package/src/migrations/config-merge.ts +0 -62
  816. package/src/migrations/data-layout.ts +0 -89
  817. package/src/migrations/data-merge.ts +0 -44
  818. package/src/migrations/hooks-merge.ts +0 -118
  819. package/src/migrations/index.ts +0 -6
  820. package/src/migrations/log.ts +0 -28
  821. package/src/migrations/skills-merge.ts +0 -44
  822. package/src/migrations/workspace-layout.ts +0 -94
  823. package/src/notifications/adapters/sms.ts +0 -94
  824. package/src/runtime/channel-approval-parser.ts +0 -123
  825. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  826. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  827. package/src/runtime/routes/integration-routes.ts +0 -381
  828. package/src/runtime/routes/twilio-routes.ts +0 -1251
  829. package/src/twitter/client.ts +0 -979
  830. package/src/twitter/router.ts +0 -131
  831. package/src/twitter/session.ts +0 -54
  832. package/src/util/cookie-session.ts +0 -114
  833. package/src/watcher/providers/slack.ts +0 -282
  834. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  835. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  836. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  837. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  838. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  839. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  840. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  841. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  842. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  843. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  844. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  845. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  846. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  847. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  848. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  849. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  850. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  851. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  852. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  853. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  854. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  855. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  856. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  857. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  858. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  859. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  860. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  861. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  862. /package/src/{config → prompts}/templates/USER.md +0 -0
  863. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  864. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  865. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  866. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  867. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -20,9 +20,9 @@ let mockRegisteredTools: Map<string, Tool[]> = new Map();
20
20
  let mockUnregisteredSkillIds: string[] = [];
21
21
  let mockSkillRefCount: Map<string, number> = new Map();
22
22
 
23
- let currentConfig: Record<string, unknown> = { featureFlags: {} };
23
+ let currentConfig: Record<string, unknown> = {};
24
24
  const DECLARED_SKILL_ID = "hatch-new-assistant";
25
- const DECLARED_LEGACY_KEY = "skills.hatch-new-assistant.enabled";
25
+ const DECLARED_FLAG_KEY = "feature_flags.hatch-new-assistant.enabled";
26
26
 
27
27
  // ---------------------------------------------------------------------------
28
28
  // Mocks
@@ -50,10 +50,6 @@ mock.module("../config/assistant-feature-flags.js", () => ({
50
50
  }
51
51
  ).assistantFeatureFlagValues;
52
52
  if (vals && typeof vals[key] === "boolean") return vals[key];
53
- // Check legacy featureFlags too
54
- const legacy = (config as { featureFlags?: Record<string, boolean> })
55
- .featureFlags;
56
- if (legacy && typeof legacy[key] === "boolean") return legacy[key];
57
53
  return true; // default enabled
58
54
  },
59
55
  loadDefaultsRegistry: () => ({}),
@@ -62,7 +58,7 @@ mock.module("../config/assistant-feature-flags.js", () => ({
62
58
  }));
63
59
 
64
60
  mock.module("../config/skill-state.js", () => ({
65
- skillFlagKey: (skillId: string) => `skills.${skillId}.enabled`,
61
+ skillFlagKey: (skillId: string) => `feature_flags.${skillId}.enabled`,
66
62
  }));
67
63
 
68
64
  mock.module("../skills/active-skill-tools.js", () => {
@@ -99,8 +95,6 @@ mock.module("../skills/active-skill-tools.js", () => {
99
95
 
100
96
  return {
101
97
  deriveActiveSkills: (messages: Message[]) => parseMarkers(messages),
102
- deriveActiveSkillIds: (messages: Message[]) =>
103
- parseMarkers(messages).map((e) => e.id),
104
98
  };
105
99
  });
106
100
 
@@ -231,6 +225,7 @@ function makeSkill(id: string): SkillSummary {
231
225
  return {
232
226
  id,
233
227
  name: id,
228
+ displayName: id,
234
229
  description: `Skill ${id}`,
235
230
  directoryPath: `/skills/${id}`,
236
231
  skillFilePath: `/skills/${id}/SKILL.md`,
@@ -293,7 +288,7 @@ describe("projectSkillTools feature flag enforcement", () => {
293
288
  mockRegisteredTools = new Map();
294
289
  mockUnregisteredSkillIds = [];
295
290
  mockSkillRefCount = new Map();
296
- currentConfig = { featureFlags: {} };
291
+ currentConfig = {};
297
292
  resetSkillToolProjection();
298
293
  });
299
294
 
@@ -308,7 +303,9 @@ describe("projectSkillTools feature flag enforcement", () => {
308
303
  const prevActive = new Map<string, string>();
309
304
 
310
305
  // Feature flag is OFF
311
- currentConfig = { featureFlags: { [DECLARED_LEGACY_KEY]: false } };
306
+ currentConfig = {
307
+ assistantFeatureFlagValues: { [DECLARED_FLAG_KEY]: false },
308
+ };
312
309
 
313
310
  const result = projectSkillTools(history, {
314
311
  previouslyActiveSkillIds: prevActive,
@@ -329,7 +326,9 @@ describe("projectSkillTools feature flag enforcement", () => {
329
326
  const prevActive = new Map<string, string>();
330
327
 
331
328
  // Feature flag is ON
332
- currentConfig = { featureFlags: { [DECLARED_LEGACY_KEY]: true } };
329
+ currentConfig = {
330
+ assistantFeatureFlagValues: { [DECLARED_FLAG_KEY]: true },
331
+ };
333
332
 
334
333
  const result = projectSkillTools(history, {
335
334
  previouslyActiveSkillIds: prevActive,
@@ -347,8 +346,8 @@ describe("projectSkillTools feature flag enforcement", () => {
347
346
  const history = buildHistoryWithMarker(DECLARED_SKILL_ID);
348
347
  const prevActive = new Map<string, string>();
349
348
 
350
- // featureFlags is empty — should default to enabled
351
- currentConfig = { featureFlags: {} };
349
+ // No overrides — should default to enabled
350
+ currentConfig = {};
352
351
 
353
352
  const result = projectSkillTools(history, {
354
353
  previouslyActiveSkillIds: prevActive,
@@ -414,7 +413,7 @@ describe("projectSkillTools feature flag enforcement", () => {
414
413
 
415
414
  // Declared skill is OFF, twitter is undeclared with no persisted override so remains ON.
416
415
  currentConfig = {
417
- featureFlags: { [DECLARED_LEGACY_KEY]: false },
416
+ assistantFeatureFlagValues: { [DECLARED_FLAG_KEY]: false },
418
417
  };
419
418
 
420
419
  const result = projectSkillTools(history, {
@@ -0,0 +1,131 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readFileSync,
5
+ rmSync,
6
+ writeFileSync,
7
+ } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
11
+
12
+ import { uninstallSkillLocally } from "../cli/commands/skills.js";
13
+
14
+ let tempDir: string;
15
+ let originalBaseDataDir: string | undefined;
16
+
17
+ function getSkillsDir(): string {
18
+ return join(tempDir, ".vellum", "workspace", "skills");
19
+ }
20
+
21
+ function getSkillsIndexPath(): string {
22
+ return join(getSkillsDir(), "SKILLS.md");
23
+ }
24
+
25
+ function installFakeSkill(skillId: string): void {
26
+ const skillDir = join(getSkillsDir(), skillId);
27
+ mkdirSync(skillDir, { recursive: true });
28
+ writeFileSync(join(skillDir, "SKILL.md"), `# ${skillId}\nA test skill.\n`);
29
+ }
30
+
31
+ function writeSkillsIndex(content: string): void {
32
+ mkdirSync(getSkillsDir(), { recursive: true });
33
+ writeFileSync(getSkillsIndexPath(), content);
34
+ }
35
+
36
+ beforeEach(() => {
37
+ tempDir = join(
38
+ tmpdir(),
39
+ `skills-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
40
+ );
41
+ mkdirSync(join(tempDir, ".vellum", "workspace", "skills"), {
42
+ recursive: true,
43
+ });
44
+ originalBaseDataDir = process.env.BASE_DATA_DIR;
45
+ process.env.BASE_DATA_DIR = tempDir;
46
+ });
47
+
48
+ afterEach(() => {
49
+ process.env.BASE_DATA_DIR = originalBaseDataDir;
50
+ rmSync(tempDir, { recursive: true, force: true });
51
+ });
52
+
53
+ describe("assistant skills uninstall", () => {
54
+ test("removes skill directory and SKILLS.md entry", () => {
55
+ /**
56
+ * Tests the happy path for uninstalling a skill.
57
+ */
58
+
59
+ // GIVEN a skill is installed locally
60
+ installFakeSkill("weather");
61
+ writeSkillsIndex("- weather\n- google-oauth-setup\n");
62
+
63
+ // WHEN we uninstall the skill
64
+ uninstallSkillLocally("weather");
65
+
66
+ // THEN the skill directory should be removed
67
+ expect(existsSync(join(getSkillsDir(), "weather"))).toBe(false);
68
+
69
+ // AND the SKILLS.md entry should be removed
70
+ const index = readFileSync(getSkillsIndexPath(), "utf-8");
71
+ expect(index).not.toContain("weather");
72
+
73
+ // AND other skills should remain in the index
74
+ expect(index).toContain("google-oauth-setup");
75
+ });
76
+
77
+ test("errors when skill is not installed", () => {
78
+ /**
79
+ * Tests that uninstalling a non-existent skill throws an error.
80
+ */
81
+
82
+ // GIVEN no skills are installed
83
+ // WHEN we try to uninstall a nonexistent skill
84
+ // THEN it should throw an error
85
+ expect(() => uninstallSkillLocally("nonexistent")).toThrow(
86
+ 'Skill "nonexistent" is not installed.',
87
+ );
88
+ });
89
+
90
+ test("works when SKILLS.md does not exist", () => {
91
+ /**
92
+ * Tests that uninstall works even if the SKILLS.md index file is missing.
93
+ */
94
+
95
+ // GIVEN a skill directory exists but no SKILLS.md
96
+ installFakeSkill("weather");
97
+
98
+ // WHEN we uninstall the skill
99
+ uninstallSkillLocally("weather");
100
+
101
+ // THEN the skill directory should be removed
102
+ expect(existsSync(join(getSkillsDir(), "weather"))).toBe(false);
103
+
104
+ // AND no SKILLS.md should have been created
105
+ expect(existsSync(getSkillsIndexPath())).toBe(false);
106
+ });
107
+
108
+ test("removes skill with nested files", () => {
109
+ /**
110
+ * Tests that uninstall recursively removes skills with nested directories.
111
+ */
112
+
113
+ // GIVEN a skill with nested files is installed
114
+ const skillDir = join(getSkillsDir(), "weather");
115
+ mkdirSync(join(skillDir, "scripts", "lib"), { recursive: true });
116
+ writeFileSync(join(skillDir, "SKILL.md"), "# weather\n");
117
+ writeFileSync(join(skillDir, "scripts", "fetch.sh"), "#!/bin/bash\n");
118
+ writeFileSync(join(skillDir, "scripts", "lib", "utils.sh"), "# utils\n");
119
+ writeSkillsIndex("- weather\n");
120
+
121
+ // WHEN we uninstall the skill
122
+ uninstallSkillLocally("weather");
123
+
124
+ // THEN the entire skill directory tree should be removed
125
+ expect(existsSync(skillDir)).toBe(false);
126
+
127
+ // AND the SKILLS.md entry should be removed
128
+ const index = readFileSync(getSkillsIndexPath(), "utf-8");
129
+ expect(index).not.toContain("weather");
130
+ });
131
+ });
@@ -18,7 +18,7 @@ mock.module("../util/platform.js", () => ({
18
18
  ...realPlatform,
19
19
  getRootDir: () => TEST_DIR,
20
20
  getDataDir: () => TEST_DIR,
21
- getIpcBlobDir: () => join(TEST_DIR, "ipc-blobs"),
21
+
22
22
  getSandboxRootDir: () => join(TEST_DIR, "sandbox"),
23
23
  getSandboxWorkingDir: () => TEST_DIR,
24
24
  getInterfacesDir: () => join(TEST_DIR, "interfaces"),
@@ -39,11 +39,7 @@ mock.module("../util/platform.js", () => ({
39
39
  getHooksDir: () => join(TEST_DIR, "hooks"),
40
40
  getWorkspaceDir: () => TEST_DIR,
41
41
  getWorkspacePromptPath: (file: string) => join(TEST_DIR, file),
42
- migrateToDataLayout: () => {},
43
- migrateToWorkspaceLayout: () => {},
44
- migratePath: () => {},
45
42
  readSessionToken: () => null,
46
- removeSocketFile: () => {},
47
43
  normalizeAssistantId: (id: string) => id,
48
44
  readLockfile: () => null,
49
45
  writeLockfile: () => {},
@@ -471,9 +467,13 @@ describe("includes frontmatter parsing", () => {
471
467
  function writeSkillWithIncludes(skillId: string, includes: string): void {
472
468
  const skillDir = join(TEST_DIR, "skills", skillId);
473
469
  mkdirSync(skillDir, { recursive: true });
470
+ // includes lives inside metadata.vellum, matching buildSkillMarkdown output.
471
+ // The raw includes string is interpolated directly so tests can pass both
472
+ // valid and intentionally malformed values.
473
+ const metadata = `{"vellum":{"includes":${includes}}}`;
474
474
  writeFileSync(
475
475
  join(skillDir, "SKILL.md"),
476
- `---\nname: "${skillId}"\ndescription: "test"\nincludes: ${includes}\n---\n\nBody.\n`,
476
+ `---\nname: "${skillId}"\ndescription: "test"\nmetadata: ${metadata}\n---\n\nBody.\n`,
477
477
  );
478
478
  }
479
479
 
@@ -566,7 +566,8 @@ describe("bundled browser skill", () => {
566
566
  const catalog = loadSkillCatalog();
567
567
  const browserSkill = catalog.find((s) => s.id === "browser");
568
568
  expect(browserSkill).toBeDefined();
569
- expect(browserSkill!.name).toBe("Browser");
569
+ expect(browserSkill!.name).toBe("browser");
570
+ expect(browserSkill!.displayName).toBe("Browser");
570
571
  expect(browserSkill!.bundled).toBe(true);
571
572
  });
572
573
 
@@ -635,7 +636,8 @@ describe("bundled public-ingress skill", () => {
635
636
  const catalog = loadSkillCatalog();
636
637
  const skill = catalog.find((s) => s.id === "public-ingress");
637
638
  expect(skill).toBeDefined();
638
- expect(skill!.name).toBe("Public Ingress");
639
+ expect(skill!.name).toBe("public-ingress");
640
+ expect(skill!.displayName).toBe("Public Ingress");
639
641
  expect(skill!.bundled).toBe(true);
640
642
  });
641
643
 
@@ -682,13 +684,26 @@ describe("ingress-dependent setup skills declare public-ingress", () => {
682
684
  const sep = line.indexOf(":");
683
685
  if (sep === -1) continue;
684
686
  const key = line.slice(0, sep).trim();
685
- if (key !== "includes") continue;
686
- const val = line.slice(sep + 1).trim();
687
- try {
688
- const parsed = JSON.parse(val);
689
- if (Array.isArray(parsed)) return parsed as string[];
690
- } catch {
691
- /* ignore */
687
+ // Check top-level includes (legacy format)
688
+ if (key === "includes") {
689
+ const val = line.slice(sep + 1).trim();
690
+ try {
691
+ const parsed = JSON.parse(val);
692
+ if (Array.isArray(parsed)) return parsed as string[];
693
+ } catch {
694
+ /* ignore */
695
+ }
696
+ }
697
+ // Check metadata.vellum.includes (spec-compliant format)
698
+ if (key === "metadata") {
699
+ const val = line.slice(sep + 1).trim();
700
+ try {
701
+ const parsed = JSON.parse(val);
702
+ const includes = parsed?.vellum?.includes;
703
+ if (Array.isArray(includes)) return includes as string[];
704
+ } catch {
705
+ /* ignore */
706
+ }
692
707
  }
693
708
  }
694
709
  return undefined;
@@ -731,7 +746,8 @@ describe("bundled computer-use skill", () => {
731
746
  const catalog = loadSkillCatalog();
732
747
  const cuSkill = catalog.find((s) => s.id === "computer-use");
733
748
  expect(cuSkill).toBeDefined();
734
- expect(cuSkill!.name).toBe("Computer Use");
749
+ expect(cuSkill!.name).toBe("computer-use");
750
+ expect(cuSkill!.displayName).toBe("Computer Use");
735
751
  expect(cuSkill!.bundled).toBe(true);
736
752
  });
737
753
 
@@ -93,7 +93,7 @@ describe("isSlackCallbackUrl", () => {
93
93
  test("returns false for managed outbound URLs", () => {
94
94
  expect(
95
95
  isSlackCallbackUrl(
96
- "http://localhost:7830/v1/internal/managed-gateway/outbound-send/?route_id=r1&assistant_id=a1&source_channel=sms",
96
+ "http://localhost:7830/v1/internal/managed-gateway/outbound-send/?route_id=r1&assistant_id=a1&source_channel=phone",
97
97
  ),
98
98
  ).toBe(false);
99
99
  });
@@ -5,21 +5,59 @@ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
5
5
 
6
6
  const testDir = mkdtempSync(join(tmpdir(), "slack-channel-cfg-test-"));
7
7
 
8
+ // In-memory config store for tests
9
+ let configStore: Record<string, unknown> = {};
10
+
11
+ function setNestedValue(
12
+ obj: Record<string, unknown>,
13
+ path: string,
14
+ value: unknown,
15
+ ): void {
16
+ const keys = path.split(".");
17
+ let current = obj;
18
+ for (let i = 0; i < keys.length - 1; i++) {
19
+ const key = keys[i];
20
+ if (current[key] == null || typeof current[key] !== "object") {
21
+ current[key] = {};
22
+ }
23
+ current = current[key] as Record<string, unknown>;
24
+ }
25
+ current[keys[keys.length - 1]] = value;
26
+ }
27
+
8
28
  mock.module("../config/loader.js", () => ({
9
29
  getConfig: () => ({
10
30
  ui: {},
31
+ slack: {
32
+ deliverAuthBypass: false,
33
+ teamId:
34
+ ((configStore.slack as Record<string, unknown>)?.teamId as string) ??
35
+ "",
36
+ teamName:
37
+ ((configStore.slack as Record<string, unknown>)?.teamName as string) ??
38
+ "",
39
+ botUserId:
40
+ ((configStore.slack as Record<string, unknown>)?.botUserId as string) ??
41
+ "",
42
+ botUsername:
43
+ ((configStore.slack as Record<string, unknown>)
44
+ ?.botUsername as string) ?? "",
45
+ },
11
46
  }),
12
47
  loadConfig: () => ({}),
13
- loadRawConfig: () => ({}),
14
- saveRawConfig: () => {},
48
+ loadRawConfig: () => structuredClone(configStore),
49
+ saveRawConfig: (raw: Record<string, unknown>) => {
50
+ configStore = structuredClone(raw);
51
+ },
15
52
  saveConfig: () => {},
16
53
  invalidateConfigCache: () => {},
54
+ setNestedValue,
17
55
  }));
18
56
 
19
57
  mock.module("../util/platform.js", () => ({
20
58
  getRootDir: () => testDir,
21
59
  getDataDir: () => testDir,
22
- getIpcBlobDir: () => join(testDir, "ipc-blobs"),
60
+
23
61
  isMacOS: () => process.platform === "darwin",
24
62
  isLinux: () => process.platform === "linux",
25
63
  isWindows: () => process.platform === "win32",
@@ -149,6 +187,7 @@ describe("Slack channel config handler", () => {
149
187
  beforeEach(() => {
150
188
  secureKeyStore = {};
151
189
  credentialMetadataStore = [];
190
+ configStore = {};
152
191
  globalThis.fetch = originalFetch;
153
192
  });
154
193
 
@@ -171,18 +210,16 @@ describe("Slack channel config handler", () => {
171
210
  expect(result.connected).toBe(true);
172
211
  });
173
212
 
174
- test("GET returns metadata when available", () => {
213
+ test("GET returns metadata from config when available", () => {
175
214
  secureKeyStore["credential:slack_channel:bot_token"] = "xoxb-test";
176
- credentialMetadataStore.push({
177
- service: "slack_channel",
178
- field: "bot_token",
179
- accountInfo: JSON.stringify({
215
+ configStore = {
216
+ slack: {
180
217
  teamId: "T123",
181
218
  teamName: "TestTeam",
182
219
  botUserId: "U_BOT",
183
220
  botUsername: "testbot",
184
- }),
185
- });
221
+ },
222
+ };
186
223
 
187
224
  const result = getSlackChannelConfig();
188
225
  expect(result.teamId).toBe("T123");
@@ -209,7 +246,7 @@ describe("Slack channel config handler", () => {
209
246
  );
210
247
  });
211
248
 
212
- test("POST validates bot token via Slack auth.test API", async () => {
249
+ test("POST validates bot token via Slack auth.test API and writes config", async () => {
213
250
  globalThis.fetch = (async () => {
214
251
  return new Response(
215
252
  JSON.stringify({
@@ -231,6 +268,13 @@ describe("Slack channel config handler", () => {
231
268
  expect(result.hasBotToken).toBe(true);
232
269
  expect(result.teamId).toBe("T_TEAM");
233
270
  expect(result.teamName).toBe("MyTeam");
271
+
272
+ // Assert metadata was written to config (not credential metadata)
273
+ const slack = configStore.slack as Record<string, unknown>;
274
+ expect(slack.teamId).toBe("T_TEAM");
275
+ expect(slack.teamName).toBe("MyTeam");
276
+ expect(slack.botUserId).toBe("U_BOT");
277
+ expect(slack.botUsername).toBe("mybot");
234
278
  });
235
279
 
236
280
  test("POST returns error when Slack auth.test rejects bot token", async () => {
@@ -252,7 +296,7 @@ describe("Slack channel config handler", () => {
252
296
  expect(result.error).toContain("invalid_auth");
253
297
  });
254
298
 
255
- test("DELETE clears credentials", async () => {
299
+ test("DELETE clears credentials and config", async () => {
256
300
  secureKeyStore["credential:slack_channel:bot_token"] = "xoxb-test";
257
301
  secureKeyStore["credential:slack_channel:app_token"] = "xapp-test";
258
302
  credentialMetadataStore.push({
@@ -263,6 +307,14 @@ describe("Slack channel config handler", () => {
263
307
  service: "slack_channel",
264
308
  field: "app_token",
265
309
  });
310
+ configStore = {
311
+ slack: {
312
+ teamId: "T123",
313
+ teamName: "TestTeam",
314
+ botUserId: "U_BOT",
315
+ botUsername: "testbot",
316
+ },
317
+ };
266
318
 
267
319
  const result = await clearSlackChannelConfig();
268
320
  expect(result.success).toBe(true);
@@ -277,5 +329,12 @@ describe("Slack channel config handler", () => {
277
329
  secureKeyStore["credential:slack_channel:app_token"],
278
330
  ).toBeUndefined();
279
331
  expect(credentialMetadataStore).toHaveLength(0);
332
+
333
+ // Assert config values were cleared
334
+ const slack = configStore.slack as Record<string, unknown>;
335
+ expect(slack.teamId).toBe("");
336
+ expect(slack.teamName).toBe("");
337
+ expect(slack.botUserId).toBe("");
338
+ expect(slack.botUsername).toBe("");
280
339
  });
281
340
  });
@@ -79,7 +79,7 @@ mock.module("../runtime/gateway-client.js", () => ({
79
79
 
80
80
  import { createGuardianBinding } from "../contacts/contacts-write.js";
81
81
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
82
- import { findActiveSession } from "../runtime/channel-guardian-service.js";
82
+ import { findActiveSession } from "../runtime/channel-verification-service.js";
83
83
  import { handleChannelInbound } from "../runtime/routes/channel-routes.js";
84
84
 
85
85
  initializeDb();
@@ -102,7 +102,7 @@ const TEST_BEARER_TOKEN = "test-token";
102
102
  function resetState(): void {
103
103
  const db = getDb();
104
104
  db.run("DELETE FROM channel_guardian_approval_requests");
105
- db.run("DELETE FROM channel_guardian_verification_challenges");
105
+ db.run("DELETE FROM channel_verification_sessions");
106
106
  db.run("DELETE FROM channel_guardian_rate_limits");
107
107
  db.run("DELETE FROM channel_inbound_events");
108
108
  db.run("DELETE FROM conversations");
@@ -293,14 +293,14 @@ describe("Slack inbound trusted contact verification", () => {
293
293
  // sessions, extract it from the session's challengeHash by consuming
294
294
  // the challenge directly.
295
295
  // The session was created with createOutboundSession which generates
296
- // a 6-digit code. We can validate by calling validateAndConsumeChallenge
296
+ // a 6-digit code. We can validate by calling validateAndConsumeVerification
297
297
  // with the correct secret. Since the mock captures the DM text, we
298
298
  // can extract the code indirectly. But for testing, we just verify
299
- // the session properties and that validateAndConsumeChallenge works
299
+ // the session properties and that validateAndConsumeVerification works
300
300
  // with the correct identity.
301
301
 
302
302
  // The actual secret was sent in the DM. For this test, let's use the
303
- // session directly via the channel-guardian-service to verify the
303
+ // session directly via the channel-verification-service to verify the
304
304
  // consume path works.
305
305
  // The DM text contains the verification code implicitly (it's in the
306
306
  // template message). Since we need to test the full round-trip, let's
@@ -313,7 +313,7 @@ describe("Slack inbound trusted contact verification", () => {
313
313
 
314
314
  // Create a verification session manually to test the consume path
315
315
  const { createOutboundSession } =
316
- await import("../runtime/channel-guardian-service.js");
316
+ await import("../runtime/channel-verification-service.js");
317
317
 
318
318
  const outboundSession = createOutboundSession({
319
319
  channel: "slack",
@@ -338,6 +338,6 @@ describe("Slack inbound trusted contact verification", () => {
338
338
  const verifyJson = (await verifyResp.json()) as Record<string, unknown>;
339
339
 
340
340
  expect(verifyJson.accepted).toBe(true);
341
- expect(verifyJson.guardianVerification).toBe("verified");
341
+ expect(verifyJson.verificationOutcome).toBe("verified");
342
342
  });
343
343
  });
@@ -64,7 +64,7 @@ mock.module("../util/logger.js", () => ({
64
64
  // ---------------------------------------------------------------------------
65
65
 
66
66
  const { handleListSlackChannels, handleShareToSlackChannel } =
67
- await import("../runtime/routes/slack-share-routes.js");
67
+ await import("../runtime/routes/integrations/slack/share.js");
68
68
 
69
69
  // ---------------------------------------------------------------------------
70
70
  // Helpers
@@ -125,11 +125,11 @@ describe("slack skill SKILL.md", () => {
125
125
  );
126
126
 
127
127
  test("has correct frontmatter name", () => {
128
- expect(skillMd).toContain('name: "Slack"');
128
+ expect(skillMd).toContain("name: slack");
129
129
  });
130
130
 
131
131
  test("is user-invocable", () => {
132
- expect(skillMd).toContain("user-invocable: true");
132
+ expect(skillMd).toContain('"user-invocable":true');
133
133
  });
134
134
 
135
135
  test("mentions privacy rules", () => {
@@ -11,6 +11,7 @@ function makeSkill(
11
11
  return {
12
12
  id,
13
13
  name: overrides?.name ?? id,
14
+ displayName: overrides?.displayName ?? overrides?.name ?? id,
14
15
  description: `Description for ${id}`,
15
16
  directoryPath: `/skills/${id}`,
16
17
  skillFilePath: `/skills/${id}/SKILL.md`,
@@ -16,6 +16,7 @@ function makeSkill(
16
16
  return {
17
17
  id,
18
18
  name: overrides?.name ?? id,
19
+ displayName: overrides?.displayName ?? overrides?.name ?? id,
19
20
  description: `Description for ${id}`,
20
21
  directoryPath: `/skills/${id}`,
21
22
  skillFilePath: `/skills/${id}/SKILL.md`,
@@ -1,33 +1,23 @@
1
1
  import { describe, expect, mock, test } from "bun:test";
2
2
 
3
- import type { ServerMessage, SurfaceType } from "../daemon/ipc-protocol.js";
3
+ import type { ServerMessage, SurfaceType } from "../daemon/message-protocol.js";
4
4
 
5
5
  mock.module("../memory/app-store.js", () => ({
6
6
  getApp: (id: string) => {
7
- if (id !== "home-base-app") return null;
7
+ if (id !== "test-app") return null;
8
8
  return {
9
9
  id,
10
- name: "Home Base",
11
- htmlDefinition:
12
- '<main id="home-base-root" data-vellum-home-base="v1"></main>',
10
+ name: "Test App",
11
+ description: "A test app",
12
+ htmlDefinition: "<main>Test App</main>",
13
13
  };
14
14
  },
15
+ getAppPreview: () => null,
15
16
  updateApp: () => {
16
17
  throw new Error("updateApp should not be called in this test");
17
18
  },
18
19
  }));
19
20
 
20
- mock.module("../home-base/prebuilt/seed.js", () => ({
21
- findSeededHomeBaseApp: () => ({ id: "home-base-app" }),
22
- getPrebuiltHomeBasePreview: () => ({
23
- title: "Home Base",
24
- subtitle: "Dashboard",
25
- description: "Preview",
26
- icon: "🏠",
27
- metrics: [{ label: "Starter tasks", value: "3" }],
28
- }),
29
- }));
30
-
31
21
  import {
32
22
  createSurfaceMutex,
33
23
  handleSurfaceAction,
@@ -70,12 +60,12 @@ describe("starter task surface actions", () => {
70
60
  ctx.pendingSurfaceActions.set("surf-1", { surfaceType: "dynamic_page" });
71
61
 
72
62
  handleSurfaceAction(ctx, "surf-1", "relay_prompt", {
73
- prompt: "Help me customize Home Base with a calmer palette.",
63
+ prompt: "Help me customize the app with a calmer palette.",
74
64
  task: "change_look_and_feel",
75
65
  });
76
66
 
77
67
  expect(forwarded).toEqual([
78
- "Help me customize Home Base with a calmer palette.",
68
+ "Help me customize the app with a calmer palette.",
79
69
  ]);
80
70
  expect(ctx.pendingSurfaceActions.has("surf-1")).toBe(true);
81
71
  });
@@ -133,7 +123,7 @@ describe("starter task surface actions", () => {
133
123
  ctx.sendToClient = (msg) => sent.push(msg);
134
124
 
135
125
  const result = await surfaceProxyResolver(ctx, "app_open", {
136
- app_id: "home-base-app",
126
+ app_id: "test-app",
137
127
  });
138
128
 
139
129
  expect(result.isError).toBe(false);
@@ -141,7 +131,7 @@ describe("starter task surface actions", () => {
141
131
  surfaceId: string;
142
132
  appId: string;
143
133
  };
144
- expect(parsed.appId).toBe("home-base-app");
134
+ expect(parsed.appId).toBe("test-app");
145
135
  expect(ctx.pendingSurfaceActions.get(parsed.surfaceId)?.surfaceType).toBe(
146
136
  "dynamic_page",
147
137
  );
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
- import type { ServerMessage } from "../daemon/ipc-contract.js";
3
+ import type { ServerMessage } from "../daemon/message-protocol.js";
4
4
  import { SubagentManager } from "../subagent/manager.js";
5
5
  import type { SubagentState } from "../subagent/types.js";
6
6