@vellumai/assistant 0.4.41 → 0.4.43

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 (843) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +131 -393
  4. package/Dockerfile +0 -1
  5. package/README.md +73 -83
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +16 -21
  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 -1
  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-skill-retrieval-guard.test.ts +2 -9
  33. package/src/__tests__/call-controller.test.ts +4 -8
  34. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  35. package/src/__tests__/call-domain.test.ts +250 -8
  36. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  37. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  38. package/src/__tests__/call-recovery.test.ts +47 -0
  39. package/src/__tests__/call-routes-http.test.ts +13 -0
  40. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  41. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  42. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  43. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  44. package/src/__tests__/channel-approval.test.ts +0 -201
  45. package/src/__tests__/channel-approvals.test.ts +2 -2
  46. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  47. package/src/__tests__/channel-guardian.test.ts +641 -740
  48. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  49. package/src/__tests__/channel-policy.test.ts +9 -12
  50. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  51. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  52. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  53. package/src/__tests__/checker.test.ts +10 -7
  54. package/src/__tests__/chrome-cdp.test.ts +57 -17
  55. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  56. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  57. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  58. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  59. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  60. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  61. package/src/__tests__/config-watcher.test.ts +1 -5
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  63. package/src/__tests__/connection-policy.test.ts +3 -62
  64. package/src/__tests__/contacts-tools.test.ts +0 -2
  65. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  66. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  67. package/src/__tests__/context-window-manager.test.ts +220 -61
  68. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  69. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  70. package/src/__tests__/conversation-pairing.test.ts +14 -14
  71. package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
  72. package/src/__tests__/conversation-store.test.ts +2 -2
  73. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  74. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  75. package/src/__tests__/credential-security-invariants.test.ts +9 -16
  76. package/src/__tests__/credentials-cli.test.ts +49 -5
  77. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  78. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  79. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  80. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  81. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  82. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  83. package/src/__tests__/email-cli.test.ts +12 -12
  84. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  86. package/src/__tests__/event-bus.test.ts +0 -1
  87. package/src/__tests__/followup-tools.test.ts +0 -2
  88. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  89. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  90. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  91. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  92. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  93. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  94. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  95. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  96. package/src/__tests__/guardian-action-store.test.ts +2 -2
  97. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  98. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  99. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  100. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  101. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  102. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  103. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  104. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  105. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  106. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  107. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  108. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  109. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  110. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  111. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  112. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  113. package/src/__tests__/heartbeat-service.test.ts +1 -1
  114. package/src/__tests__/home-base-bootstrap.test.ts +0 -2
  115. package/src/__tests__/host-shell-tool.test.ts +3 -12
  116. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  117. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  118. package/src/__tests__/integration-status.test.ts +8 -8
  119. package/src/__tests__/intent-routing.test.ts +9 -13
  120. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  121. package/src/__tests__/invite-routes-http.test.ts +10 -10
  122. package/src/__tests__/llm-usage-store.test.ts +45 -9
  123. package/src/__tests__/local-gateway-health.test.ts +209 -0
  124. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  125. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  126. package/src/__tests__/managed-store.test.ts +29 -12
  127. package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
  128. package/src/__tests__/mcp-cli.test.ts +1 -1
  129. package/src/__tests__/mcp-health-check.test.ts +1 -1
  130. package/src/__tests__/media-generate-image.test.ts +1 -1
  131. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  132. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  133. package/src/__tests__/memory-regressions.test.ts +1 -166
  134. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  135. package/src/__tests__/migration-export-http.test.ts +2 -2
  136. package/src/__tests__/migration-transport.test.ts +44 -0
  137. package/src/__tests__/non-member-access-request.test.ts +49 -36
  138. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  139. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  140. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  141. package/src/__tests__/notification-deep-link.test.ts +3 -3
  142. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  143. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  144. package/src/__tests__/oauth-cli.test.ts +1 -1
  145. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  146. package/src/__tests__/onboarding-template-contract.test.ts +2 -2
  147. package/src/__tests__/platform.test.ts +168 -5
  148. package/src/__tests__/playbook-execution.test.ts +0 -2
  149. package/src/__tests__/playbook-tools.test.ts +0 -2
  150. package/src/__tests__/pricing.test.ts +125 -0
  151. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  152. package/src/__tests__/recording-handler.test.ts +46 -80
  153. package/src/__tests__/recording-state-machine.test.ts +112 -183
  154. package/src/__tests__/registry.test.ts +1 -1
  155. package/src/__tests__/relay-server.test.ts +69 -71
  156. package/src/__tests__/reminder-store.test.ts +3 -3
  157. package/src/__tests__/request-file-tool.test.ts +2 -2
  158. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  159. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  160. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  162. package/src/__tests__/schedule-store.test.ts +13 -4
  163. package/src/__tests__/schedule-tools.test.ts +0 -2
  164. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  165. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  168. package/src/__tests__/secret-response-routing.test.ts +1 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  170. package/src/__tests__/sequence-store.test.ts +0 -2
  171. package/src/__tests__/server-history-render.test.ts +2 -199
  172. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  173. package/src/__tests__/session-agent-loop.test.ts +107 -3
  174. package/src/__tests__/session-confirmation-signals.test.ts +10 -4
  175. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  176. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  177. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  178. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  179. package/src/__tests__/session-profile-injection.test.ts +9 -3
  180. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  181. package/src/__tests__/session-queue.test.ts +10 -4
  182. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  183. package/src/__tests__/session-skill-tools.test.ts +2 -3
  184. package/src/__tests__/session-slash-known.test.ts +11 -4
  185. package/src/__tests__/session-slash-queue.test.ts +11 -4
  186. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  187. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  188. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  189. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  190. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  191. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  192. package/src/__tests__/session-usage.test.ts +180 -0
  193. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  194. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  195. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  196. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  197. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  198. package/src/__tests__/skill-include-graph.test.ts +1 -0
  199. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  200. package/src/__tests__/skill-load-tool.test.ts +90 -12
  201. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  202. package/src/__tests__/skills-uninstall.test.ts +131 -0
  203. package/src/__tests__/skills.test.ts +32 -16
  204. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  205. package/src/__tests__/slack-channel-config.test.ts +71 -12
  206. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  207. package/src/__tests__/slack-share-routes.test.ts +1 -1
  208. package/src/__tests__/slack-skill.test.ts +2 -2
  209. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  210. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  211. package/src/__tests__/starter-task-flow.test.ts +1 -1
  212. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  213. package/src/__tests__/subagent-tools.test.ts +2 -2
  214. package/src/__tests__/system-prompt.test.ts +4 -8
  215. package/src/__tests__/task-compiler.test.ts +0 -2
  216. package/src/__tests__/task-management-tools.test.ts +0 -2
  217. package/src/__tests__/task-runner.test.ts +0 -2
  218. package/src/__tests__/task-scheduler.test.ts +2 -2
  219. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  220. package/src/__tests__/terminal-tools.test.ts +1 -11
  221. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  222. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  223. package/src/__tests__/tool-executor.test.ts +2 -2
  224. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  225. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  226. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  227. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  228. package/src/__tests__/trace-emitter.test.ts +1 -1
  229. package/src/__tests__/trust-context-guards.test.ts +1 -1
  230. package/src/__tests__/trust-store.test.ts +44 -395
  231. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  232. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  233. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  234. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  235. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  236. package/src/__tests__/twilio-config.test.ts +11 -2
  237. package/src/__tests__/twilio-provider.test.ts +6 -4
  238. package/src/__tests__/twilio-routes.test.ts +408 -86
  239. package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
  240. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  241. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  242. package/src/__tests__/update-bulletin.test.ts +4 -8
  243. package/src/__tests__/update-template-contract.test.ts +1 -1
  244. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  245. package/src/__tests__/usage-routes.test.ts +23 -5
  246. package/src/__tests__/user-reference.test.ts +1 -1
  247. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  248. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  249. package/src/__tests__/view-image-tool.test.ts +0 -2
  250. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  251. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  252. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  253. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  254. package/src/__tests__/workspace-policy.test.ts +1 -1
  255. package/src/approvals/AGENTS.md +4 -4
  256. package/src/approvals/approval-primitive.ts +2 -2
  257. package/src/approvals/guardian-decision-primitive.ts +1 -1
  258. package/src/approvals/guardian-request-resolvers.ts +3 -4
  259. package/src/bundler/app-bundler.ts +29 -217
  260. package/src/bundler/app-compiler.ts +131 -103
  261. package/src/bundler/compiler-tools.ts +248 -0
  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} +12 -17
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +116 -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} +263 -16
  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/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
  316. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
  317. package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
  318. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
  319. package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
  320. package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
  321. package/src/cli/commands/twitter/router.ts +396 -0
  322. package/src/cli/commands/twitter/session.ts +121 -0
  323. package/src/cli/db.ts +1 -0
  324. package/src/cli/http-client.ts +87 -0
  325. package/src/cli/logger.ts +6 -0
  326. package/src/cli/main-screen.tsx +4 -3
  327. package/src/cli/output.ts +19 -0
  328. package/src/cli/program.ts +29 -27
  329. package/src/cli/reference.ts +27 -37
  330. package/src/cli.ts +452 -240
  331. package/src/config/assistant-feature-flags.ts +3 -15
  332. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  333. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  334. package/src/config/bundled-skills/amazon/SKILL.md +15 -5
  335. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  336. package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
  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 +87 -229
  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 -11
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
  350. package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
  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 +56 -14
  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 +0 -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 +233 -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 +110 -96
  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 +168 -55
  452. package/src/daemon/main.ts +1 -0
  453. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  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 +29 -13
  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 +1 -0
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  462. package/src/daemon/providers-setup.ts +0 -5
  463. package/src/daemon/recording-executor.ts +0 -7
  464. package/src/daemon/ride-shotgun-handler.ts +9 -13
  465. package/src/daemon/server.ts +136 -510
  466. package/src/daemon/session-agent-loop-handlers.ts +22 -7
  467. package/src/daemon/session-agent-loop.ts +86 -24
  468. package/src/daemon/session-attachments.ts +1 -1
  469. package/src/daemon/session-error.ts +1 -1
  470. package/src/daemon/session-history.ts +20 -15
  471. package/src/daemon/session-lifecycle.ts +9 -7
  472. package/src/daemon/session-memory.ts +15 -1
  473. package/src/daemon/session-messaging.ts +10 -6
  474. package/src/daemon/session-notifiers.ts +10 -8
  475. package/src/daemon/session-process.ts +34 -25
  476. package/src/daemon/session-queue-manager.ts +1 -1
  477. package/src/daemon/session-runtime-assembly.ts +6 -25
  478. package/src/daemon/session-surfaces.ts +2 -2
  479. package/src/daemon/session-tool-setup.ts +1 -1
  480. package/src/daemon/session-usage.ts +119 -18
  481. package/src/daemon/session.ts +13 -9
  482. package/src/daemon/tool-side-effects.ts +6 -5
  483. package/src/daemon/trace-emitter.ts +1 -1
  484. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  485. package/src/daemon/watch-handler.ts +2 -5
  486. package/src/email/service.ts +8 -8
  487. package/src/events/domain-events.ts +0 -1
  488. package/src/events/tool-notification-listener.ts +1 -1
  489. package/src/followups/followup-store.ts +1 -2
  490. package/src/followups/types.ts +0 -6
  491. package/src/heartbeat/heartbeat-service.ts +1 -1
  492. package/src/inbound/platform-callback-registration.ts +1 -1
  493. package/src/inbound/public-ingress-urls.ts +0 -8
  494. package/src/index.ts +12 -0
  495. package/src/mcp/client.ts +1 -1
  496. package/src/mcp/manager.ts +1 -1
  497. package/src/memory/app-store.ts +1 -42
  498. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  499. package/src/memory/conversation-attention-store.ts +154 -0
  500. package/src/memory/conversation-bootstrap.ts +1 -1
  501. package/src/memory/conversation-crud.ts +53 -1
  502. package/src/memory/conversation-display-order-migration.ts +2 -3
  503. package/src/memory/conversation-queries.ts +1 -29
  504. package/src/memory/conversation-title-service.ts +26 -21
  505. package/src/memory/db-connection.ts +1 -8
  506. package/src/memory/db-init.ts +20 -0
  507. package/src/memory/delivery-crud.ts +4 -34
  508. package/src/memory/external-conversation-store.ts +1 -1
  509. package/src/memory/format-recall.ts +47 -0
  510. package/src/memory/guardian-action-store.ts +4 -5
  511. package/src/memory/guardian-rate-limits.ts +0 -3
  512. package/src/memory/invite-store.ts +1 -1
  513. package/src/memory/job-handlers/backfill.ts +9 -2
  514. package/src/memory/job-handlers/extraction.ts +2 -7
  515. package/src/memory/job-handlers/summarization.ts +1 -1
  516. package/src/memory/llm-usage-store.ts +11 -0
  517. package/src/memory/migrations/114-notifications.ts +12 -40
  518. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  519. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  520. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  521. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  522. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  523. package/src/memory/migrations/index.ts +5 -0
  524. package/src/memory/migrations/registry.ts +30 -0
  525. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  526. package/src/memory/retriever.test.ts +707 -0
  527. package/src/memory/retriever.ts +120 -116
  528. package/src/memory/schema/calls.ts +3 -7
  529. package/src/memory/schema/guardian.ts +2 -2
  530. package/src/memory/search/lexical.ts +4 -1
  531. package/src/memory/search/query-expansion.test.ts +70 -0
  532. package/src/memory/search/query-expansion.ts +118 -0
  533. package/src/memory/search/types.ts +18 -17
  534. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  535. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  536. package/src/messaging/registry.ts +0 -1
  537. package/src/notifications/README.md +13 -22
  538. package/src/notifications/adapters/macos.ts +1 -1
  539. package/src/notifications/conversation-pairing.ts +2 -2
  540. package/src/notifications/copy-composer.ts +2 -2
  541. package/src/notifications/decision-engine.ts +1 -10
  542. package/src/notifications/destination-resolver.ts +2 -3
  543. package/src/notifications/emit-signal.ts +2 -8
  544. package/src/notifications/guardian-question-mode.ts +5 -8
  545. package/src/notifications/signal.ts +1 -2
  546. package/src/notifications/types.ts +1 -1
  547. package/src/oauth/token-persistence.ts +25 -1
  548. package/src/permissions/checker.ts +4 -29
  549. package/src/permissions/defaults.ts +6 -6
  550. package/src/permissions/prompter.ts +1 -1
  551. package/src/permissions/secret-prompter.ts +1 -1
  552. package/src/permissions/shell-identity.ts +1 -1
  553. package/src/permissions/trust-store.ts +13 -76
  554. package/src/permissions/workspace-policy.ts +1 -1
  555. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  556. package/src/{config → prompts}/system-prompt.ts +40 -21
  557. package/src/runtime/AGENTS.md +6 -8
  558. package/src/runtime/access-request-helper.ts +36 -55
  559. package/src/runtime/actor-trust-resolver.ts +1 -24
  560. package/src/runtime/approval-message-composer.ts +6 -2
  561. package/src/runtime/assistant-event.ts +1 -1
  562. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  563. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  564. package/src/runtime/auth/route-policy.ts +140 -24
  565. package/src/runtime/auth/subject.ts +9 -0
  566. package/src/runtime/auth/token-service.ts +11 -0
  567. package/src/runtime/auth/types.ts +1 -1
  568. package/src/runtime/channel-approval-types.ts +1 -1
  569. package/src/runtime/channel-approvals.ts +1 -1
  570. package/src/runtime/channel-invite-transport.ts +0 -2
  571. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  572. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  573. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  574. package/src/runtime/channel-readiness-service.ts +24 -159
  575. package/src/runtime/channel-readiness-types.ts +5 -1
  576. package/src/runtime/channel-reply-delivery.ts +43 -3
  577. package/src/runtime/channel-retry-sweep.ts +14 -22
  578. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  579. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  580. package/src/runtime/gateway-client.ts +12 -15
  581. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  582. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  583. package/src/runtime/guardian-action-message-composer.ts +4 -4
  584. package/src/runtime/guardian-reply-router.ts +3 -3
  585. package/src/runtime/http-server.ts +133 -24
  586. package/src/runtime/http-types.ts +34 -1
  587. package/src/runtime/invite-instruction-generator.ts +1 -3
  588. package/src/runtime/invite-redemption-service.ts +5 -5
  589. package/src/runtime/invite-service.ts +7 -7
  590. package/src/runtime/local-actor-identity.ts +28 -2
  591. package/src/runtime/local-gateway-health.ts +275 -0
  592. package/src/runtime/middleware/twilio-validation.ts +3 -3
  593. package/src/runtime/migrations/migration-transport.ts +18 -3
  594. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  595. package/src/runtime/nl-approval-parser.ts +2 -3
  596. package/src/runtime/routes/access-request-decision.ts +2 -2
  597. package/src/runtime/routes/app-management-routes.ts +921 -0
  598. package/src/runtime/routes/approval-routes.ts +76 -7
  599. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  600. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  601. package/src/runtime/routes/channel-route-shared.ts +1 -3
  602. package/src/runtime/routes/channel-routes.ts +1 -4
  603. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  604. package/src/runtime/routes/computer-use-routes.ts +595 -0
  605. package/src/runtime/routes/contact-routes.ts +1 -317
  606. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  607. package/src/runtime/routes/conversation-routes.ts +11 -18
  608. package/src/runtime/routes/debug-routes.ts +1 -1
  609. package/src/runtime/routes/diagnostics-routes.ts +813 -0
  610. package/src/runtime/routes/documents-routes.ts +227 -0
  611. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  612. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  613. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  614. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  615. package/src/runtime/routes/inbound-conversation.ts +3 -10
  616. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  617. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  618. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  619. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  620. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  621. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  622. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  623. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  624. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  625. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  626. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  627. package/src/runtime/routes/integrations/telegram.ts +111 -0
  628. package/src/runtime/routes/integrations/twilio.ts +451 -0
  629. package/src/runtime/routes/invite-routes.ts +2 -2
  630. package/src/runtime/routes/pairing-routes.ts +1 -1
  631. package/src/runtime/routes/recording-routes.ts +332 -0
  632. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  633. package/src/runtime/routes/session-management-routes.ts +167 -0
  634. package/src/runtime/routes/session-query-routes.ts +204 -0
  635. package/src/runtime/routes/settings-routes.ts +977 -0
  636. package/src/runtime/routes/skills-routes.ts +266 -0
  637. package/src/runtime/routes/subagents-routes.ts +246 -0
  638. package/src/runtime/routes/surface-action-routes.ts +100 -10
  639. package/src/runtime/routes/surface-content-routes.ts +1 -1
  640. package/src/runtime/routes/work-items-routes.ts +809 -0
  641. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  642. package/src/runtime/routes/workspace-routes.ts +410 -0
  643. package/src/runtime/routes/workspace-utils.ts +88 -0
  644. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  645. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  646. package/src/runtime/tool-grant-request-helper.ts +1 -2
  647. package/src/runtime/trust-context-resolver.ts +0 -1
  648. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  649. package/src/runtime/verification-rate-limiter.ts +2 -2
  650. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  651. package/src/schedule/integration-status.ts +2 -2
  652. package/src/schedule/schedule-store.ts +7 -9
  653. package/src/sequence/engine.ts +1 -1
  654. package/src/skills/active-skill-tools.ts +0 -8
  655. package/src/skills/clawhub.ts +1 -10
  656. package/src/skills/managed-store.ts +14 -4
  657. package/src/skills/slash-commands.ts +1 -1
  658. package/src/subagent/manager.ts +1 -1
  659. package/src/subagent/types.ts +1 -1
  660. package/src/tasks/SPEC.md +10 -10
  661. package/src/tasks/task-scheduler.ts +1 -1
  662. package/src/telegram/bot-username.ts +13 -0
  663. package/src/tools/assets/materialize.ts +1 -1
  664. package/src/tools/assets/search.ts +1 -1
  665. package/src/tools/browser/browser-execution.ts +2 -2
  666. package/src/tools/browser/browser-manager.ts +88 -11
  667. package/src/tools/browser/browser-screencast.ts +1 -1
  668. package/src/tools/browser/headless-browser.ts +0 -17
  669. package/src/tools/browser/jit-auth.ts +1 -1
  670. package/src/tools/browser/recording-store.ts +19 -1
  671. package/src/tools/browser/runtime-check.ts +4 -2
  672. package/src/tools/calls/call-start.ts +3 -3
  673. package/src/tools/credentials/metadata-store.ts +0 -13
  674. package/src/tools/credentials/vault.ts +7 -31
  675. package/src/tools/followups/followup_create.ts +0 -8
  676. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  677. package/src/tools/memory/definitions.ts +32 -10
  678. package/src/tools/memory/handlers.test.ts +573 -0
  679. package/src/tools/memory/handlers.ts +222 -65
  680. package/src/tools/memory/register.ts +53 -24
  681. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  682. package/src/tools/schedule/update.ts +0 -8
  683. package/src/tools/skills/load.ts +3 -3
  684. package/src/tools/subagent/read.ts +1 -1
  685. package/src/tools/system/voice-config.ts +2 -14
  686. package/src/tools/terminal/safe-env.ts +5 -18
  687. package/src/tools/tool-approval-handler.ts +4 -4
  688. package/src/tools/tool-manifest.ts +4 -2
  689. package/src/tools/types.ts +1 -1
  690. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  691. package/src/twitter/platform-proxy-client.ts +405 -0
  692. package/src/usage/types.ts +21 -0
  693. package/src/util/canonicalize-identity.ts +2 -6
  694. package/src/util/cookie-session.ts +35 -51
  695. package/src/util/platform.ts +93 -86
  696. package/src/util/pricing.ts +180 -43
  697. package/src/work-items/work-item-runner.ts +1 -1
  698. package/scripts/ipc/check-contract-inventory.ts +0 -107
  699. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  700. package/scripts/ipc/generate-swift.ts +0 -528
  701. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  702. package/src/__tests__/app-migration.test.ts +0 -148
  703. package/src/__tests__/config-loader-migration.test.ts +0 -85
  704. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  705. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  706. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  707. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  708. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  709. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  710. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  711. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  712. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  713. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  714. package/src/__tests__/integrations-cli.test.ts +0 -232
  715. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  716. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  717. package/src/__tests__/ipc-contract.test.ts +0 -76
  718. package/src/__tests__/ipc-protocol.test.ts +0 -120
  719. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  720. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  721. package/src/__tests__/ipc-validate.test.ts +0 -471
  722. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  723. package/src/__tests__/migration-ordering.test.ts +0 -267
  724. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  725. package/src/__tests__/platform-move-helper.test.ts +0 -108
  726. package/src/__tests__/platform-socket-path.test.ts +0 -52
  727. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  728. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  729. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  730. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  731. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  732. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  733. package/src/__tests__/work-item-output.test.ts +0 -150
  734. package/src/amazon/session.ts +0 -58
  735. package/src/cli/channels.ts +0 -51
  736. package/src/cli/influencer.ts +0 -319
  737. package/src/cli/integrations.ts +0 -372
  738. package/src/cli/ipc-client.ts +0 -88
  739. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  740. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  741. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  742. package/src/config/core-schema.ts +0 -434
  743. package/src/config/memory-schema.ts +0 -617
  744. package/src/daemon/auth-manager.ts +0 -106
  745. package/src/daemon/handlers/apps.ts +0 -758
  746. package/src/daemon/handlers/avatar.ts +0 -73
  747. package/src/daemon/handlers/browser.ts +0 -3
  748. package/src/daemon/handlers/computer-use.ts +0 -231
  749. package/src/daemon/handlers/config-dispatch.ts +0 -29
  750. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  751. package/src/daemon/handlers/config-inbox.ts +0 -457
  752. package/src/daemon/handlers/config-integrations.ts +0 -409
  753. package/src/daemon/handlers/config-platform.ts +0 -77
  754. package/src/daemon/handlers/config-slack.ts +0 -41
  755. package/src/daemon/handlers/config-tools.ts +0 -226
  756. package/src/daemon/handlers/config-trust.ts +0 -135
  757. package/src/daemon/handlers/config.ts +0 -64
  758. package/src/daemon/handlers/contacts.ts +0 -193
  759. package/src/daemon/handlers/diagnostics.ts +0 -382
  760. package/src/daemon/handlers/documents.ts +0 -188
  761. package/src/daemon/handlers/guardian-actions.ts +0 -82
  762. package/src/daemon/handlers/home-base.ts +0 -82
  763. package/src/daemon/handlers/index.ts +0 -222
  764. package/src/daemon/handlers/misc.ts +0 -1139
  765. package/src/daemon/handlers/navigate-settings.ts +0 -29
  766. package/src/daemon/handlers/oauth-connect.ts +0 -202
  767. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  768. package/src/daemon/handlers/publish.ts +0 -176
  769. package/src/daemon/handlers/signing.ts +0 -56
  770. package/src/daemon/handlers/subagents.ts +0 -286
  771. package/src/daemon/handlers/twitter-auth.ts +0 -220
  772. package/src/daemon/handlers/work-items.ts +0 -796
  773. package/src/daemon/handlers/workspace-files.ts +0 -84
  774. package/src/daemon/handlers.ts +0 -16
  775. package/src/daemon/ipc-blob-store.ts +0 -246
  776. package/src/daemon/ipc-contract-inventory.json +0 -348
  777. package/src/daemon/ipc-contract-inventory.ts +0 -202
  778. package/src/daemon/ipc-handler.ts +0 -120
  779. package/src/daemon/ipc-protocol.ts +0 -85
  780. package/src/daemon/ipc-validate.ts +0 -254
  781. package/src/memory/app-migration.ts +0 -114
  782. package/src/memory/channel-delivery-store.ts +0 -40
  783. package/src/memory/channel-guardian-store.ts +0 -83
  784. package/src/memory/conversation-store.ts +0 -102
  785. package/src/memory/schema-migration.ts +0 -38
  786. package/src/messaging/providers/sms/adapter.ts +0 -232
  787. package/src/messaging/providers/sms/client.ts +0 -93
  788. package/src/messaging/providers/sms/types.ts +0 -7
  789. package/src/migrations/config-merge.ts +0 -62
  790. package/src/migrations/data-layout.ts +0 -89
  791. package/src/migrations/data-merge.ts +0 -44
  792. package/src/migrations/hooks-merge.ts +0 -118
  793. package/src/migrations/index.ts +0 -6
  794. package/src/migrations/log.ts +0 -28
  795. package/src/migrations/skills-merge.ts +0 -44
  796. package/src/migrations/workspace-layout.ts +0 -94
  797. package/src/notifications/adapters/sms.ts +0 -94
  798. package/src/runtime/channel-approval-parser.ts +0 -123
  799. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  800. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  801. package/src/runtime/routes/integration-routes.ts +0 -381
  802. package/src/runtime/routes/twilio-routes.ts +0 -1251
  803. package/src/twitter/router.ts +0 -131
  804. package/src/twitter/session.ts +0 -54
  805. package/src/watcher/providers/slack.ts +0 -282
  806. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  807. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  808. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  809. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  810. /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
  811. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  812. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  813. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  814. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  815. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  816. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  817. /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
  818. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  819. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  820. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  821. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  822. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  823. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  824. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  825. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  826. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  827. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  828. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  829. /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
  830. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  831. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  832. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  833. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  834. /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
  835. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  836. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  837. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  838. /package/src/{config → prompts}/templates/USER.md +0 -0
  839. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  840. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  841. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  842. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  843. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -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,6 +1,6 @@
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) => {
@@ -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
 
@@ -2,11 +2,11 @@ import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { describe, expect, mock, test } from "bun:test";
4
4
 
5
- // Mock conversation-store before importing tool executors that depend on it.
5
+ // Mock conversation-crud before importing tool executors that depend on it.
6
6
  let mockGetMessages: (
7
7
  conversationId: string,
8
8
  ) => Array<{ role: string; content: string }> | null = () => null;
9
- mock.module("../memory/conversation-store.js", () => ({
9
+ mock.module("../memory/conversation-crud.js", () => ({
10
10
  getConversationThreadType: () => "default",
11
11
  setConversationOriginChannelIfUnset: () => {},
12
12
  updateConversationContextWindow: () => {},
@@ -32,7 +32,7 @@ mock.module("../util/platform.js", () => ({
32
32
  getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
33
33
  getHistoryPath: () => join(TEST_DIR, "history"),
34
34
  getHooksDir: () => join(TEST_DIR, "hooks"),
35
- getIpcBlobDir: () => join(TEST_DIR, "ipc-blobs"),
35
+
36
36
  getSandboxRootDir: () => join(TEST_DIR, "sandbox"),
37
37
  getSandboxWorkingDir: () => TEST_DIR,
38
38
  getInterfacesDir: () => join(TEST_DIR, "interfaces"),
@@ -42,10 +42,6 @@ mock.module("../util/platform.js", () => ({
42
42
  getPlatformName: () => process.platform,
43
43
  getClipboardCommand: () => null,
44
44
  readSessionToken: () => null,
45
- removeSocketFile: () => {},
46
- migratePath: () => {},
47
- migrateToWorkspaceLayout: () => {},
48
- migrateToDataLayout: () => {},
49
45
  }));
50
46
 
51
47
  const noopLogger = new Proxy({} as Record<string, unknown>, {
@@ -81,8 +77,8 @@ mock.module("../config/loader.js", () => ({
81
77
  }));
82
78
 
83
79
  // eslint-disable-next-line @typescript-eslint/no-require-imports
84
- const realUserReference = require("../config/user-reference.js");
85
- mock.module("../config/user-reference.js", () => ({
80
+ const realUserReference = require("../prompts/user-reference.js");
81
+ mock.module("../prompts/user-reference.js", () => ({
86
82
  ...realUserReference,
87
83
  resolveUserReference: () => "John",
88
84
  resolveUserPronouns: () => null,
@@ -95,7 +91,7 @@ const {
95
91
  stripCommentLines,
96
92
  buildExternalCommsIdentitySection,
97
93
  buildPhoneCallsRoutingSection,
98
- } = await import("../config/system-prompt.js");
94
+ } = await import("../prompts/system-prompt.js");
99
95
 
100
96
  /** Strip the Configuration, Skills, and hardcoded preamble sections so base-prompt tests stay focused. */
101
97
  function basePrompt(result: string): string {
@@ -16,8 +16,6 @@ mock.module("../util/platform.js", () => ({
16
16
  getDbPath: () => join(testDir, "test.db"),
17
17
  getLogPath: () => join(testDir, "test.log"),
18
18
  ensureDataDir: () => {},
19
- migrateToDataLayout: () => {},
20
- migrateToWorkspaceLayout: () => {},
21
19
  }));
22
20
 
23
21
  mock.module("../util/logger.js", () => ({
@@ -15,8 +15,6 @@ mock.module("../util/platform.js", () => ({
15
15
  getDbPath: () => join(testDir, "test.db"),
16
16
  getLogPath: () => join(testDir, "test.log"),
17
17
  ensureDataDir: () => {},
18
- migrateToDataLayout: () => {},
19
- migrateToWorkspaceLayout: () => {},
20
18
  }));
21
19
 
22
20
  mock.module("../util/logger.js", () => ({
@@ -15,8 +15,6 @@ mock.module("../util/platform.js", () => ({
15
15
  getDbPath: () => join(testDir, "test.db"),
16
16
  getLogPath: () => join(testDir, "test.log"),
17
17
  ensureDataDir: () => {},
18
- migrateToDataLayout: () => {},
19
- migrateToWorkspaceLayout: () => {},
20
18
  }));
21
19
 
22
20
  mock.module("../util/logger.js", () => ({
@@ -15,8 +15,6 @@ mock.module("../util/platform.js", () => ({
15
15
  getDbPath: () => join(testDir, "test.db"),
16
16
  getLogPath: () => join(testDir, "test.log"),
17
17
  ensureDataDir: () => {},
18
- migrateToDataLayout: () => {},
19
- migrateToWorkspaceLayout: () => {},
20
18
  }));
21
19
 
22
20
  mock.module("../util/logger.js", () => ({
@@ -190,6 +188,7 @@ describe("scheduler run_task detection", () => {
190
188
  name: "Regular Schedule",
191
189
  cronExpression: "* * * * *",
192
190
  message: "Do something normal",
191
+ syntax: "cron",
193
192
  });
194
193
 
195
194
  forceScheduleDue(schedule.id);
@@ -220,6 +219,7 @@ describe("scheduler run_task detection", () => {
220
219
  name: "Bad Task Schedule",
221
220
  cronExpression: "* * * * *",
222
221
  message: "run_task:nonexistent-task-id",
222
+ syntax: "cron",
223
223
  });
224
224
 
225
225
  forceScheduleDue(schedule.id);