@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
@@ -27,30 +27,9 @@ mock.module("../util/logger.js", () => ({
27
27
  }),
28
28
  }));
29
29
 
30
- let mockTelegramBinding: unknown = null;
31
- let mockSmsBinding: unknown = null;
32
- let mockVellumBinding: unknown = null;
33
-
34
- mock.module("../memory/channel-guardian-store.js", () => ({
35
- getActiveBinding: (_assistantId: string, channel: string) => {
36
- if (channel === "telegram") return mockTelegramBinding;
37
- if (channel === "sms") return mockSmsBinding;
38
- if (channel === "vellum") return mockVellumBinding;
39
- return null;
40
- },
41
- createBinding: (params: Record<string, unknown>) => ({
42
- id: `binding-${Date.now()}`,
43
- ...params,
44
- status: "active",
45
- verifiedAt: Date.now(),
46
- verifiedVia: "test",
47
- metadataJson: null,
48
- createdAt: Date.now(),
49
- updatedAt: Date.now(),
50
- }),
51
- listActiveBindingsByAssistant: () =>
52
- mockVellumBinding ? [mockVellumBinding] : [],
53
- }));
30
+ // Note: stale mock for channel-guardian-store.js removed — the barrel was
31
+ // deleted and none of the functions it mocked (getActiveBinding, createBinding,
32
+ // listActiveBindingsByAssistant) existed in the barrel.
54
33
 
55
34
  mock.module("../config/loader.js", () => ({
56
35
  getConfig: () => ({
@@ -138,24 +117,8 @@ function resetTables(): void {
138
117
  db.run("DELETE FROM call_sessions");
139
118
  db.run("DELETE FROM conversations");
140
119
 
141
- mockTelegramBinding = null;
142
- mockSmsBinding = null;
143
- // Pre-seed vellum binding so the self-healing path in dispatchGuardianQuestion
144
- // never triggers (avoids UNIQUE constraint violations on repeated dispatches).
145
- mockVellumBinding = {
146
- id: "binding-vellum-test",
147
- assistantId: "self",
148
- channel: "vellum",
149
- guardianExternalUserId: "vellum-guardian",
150
- guardianDeliveryChatId: "local",
151
- guardianPrincipalId: "test-principal-id",
152
- status: "active",
153
- verifiedAt: Date.now(),
154
- verifiedVia: "test",
155
- metadataJson: null,
156
- createdAt: Date.now(),
157
- updatedAt: Date.now(),
158
- };
120
+ // Note: mockTelegramBinding/mockVoiceBinding/mockVellumBinding assignments
121
+ // removed — they only fed the stale channel-guardian-store mock.
159
122
  emitCalls.length = 0;
160
123
  threadCreatedFromMock = null;
161
124
  mockEmitResult = {
@@ -241,10 +204,6 @@ describe("guardian-dispatch", () => {
241
204
  const convId = "conv-dispatch-2";
242
205
  ensureConversation(convId);
243
206
 
244
- mockTelegramBinding = {
245
- guardianDeliveryChatId: "tg-chat-999",
246
- guardianExternalUserId: "tg-user-888",
247
- };
248
207
  mockEmitResult = {
249
208
  signalId: "sig-2",
250
209
  deduplicated: false,
@@ -48,11 +48,11 @@ mock.module("../util/logger.js", () => ({
48
48
  import { GRANT_TTL_MS } from "../approvals/guardian-decision-primitive.js";
49
49
  import type { Session } from "../daemon/session.js";
50
50
  import type { TrustContext } from "../daemon/session-runtime-assembly.js";
51
+ import { getDb, initializeDb, resetDb } from "../memory/db.js";
51
52
  import {
52
53
  createApprovalRequest,
53
54
  type GuardianApprovalRequest,
54
- } from "../memory/channel-guardian-store.js";
55
- import { getDb, initializeDb, resetDb } from "../memory/db.js";
55
+ } from "../memory/guardian-approvals.js";
56
56
  import * as approvalMessageComposer from "../runtime/approval-message-composer.js";
57
57
  import * as gatewayClient from "../runtime/gateway-client.js";
58
58
  import * as pendingInteractions from "../runtime/pending-interactions.js";
@@ -148,7 +148,6 @@ function makeTrustContext(): TrustContext {
148
148
  return {
149
149
  sourceChannel: "telegram",
150
150
  trustClass: "guardian",
151
- denialReason: undefined,
152
151
  };
153
152
  }
154
153
 
@@ -505,46 +504,7 @@ describe("guardian grant minting on tool-approval decisions", () => {
505
504
  composeSpy.mockRestore();
506
505
  });
507
506
 
508
- // ── 8. approve_once via legacy parser mints a grant ──
509
-
510
- test("approve_once via legacy parser mints a scoped grant", async () => {
511
- const requestId = "req-grant-leg-1";
512
- createTestGuardianApproval(requestId);
513
- registerPendingInteraction(
514
- requestId,
515
- CONVERSATION_ID,
516
- TOOL_NAME,
517
- TOOL_INPUT,
518
- );
519
-
520
- // No approvalConversationGenerator => legacy parser path
521
- const result = await handleApprovalInterception({
522
- conversationId: "guardian-conv-8",
523
- content: "yes",
524
- conversationExternalId: GUARDIAN_CHAT,
525
- sourceChannel: "telegram",
526
- actorExternalId: GUARDIAN_USER,
527
- replyCallbackUrl: "https://gateway.test/deliver",
528
- trustCtx: makeTrustContext(),
529
- assistantId: ASSISTANT_ID,
530
- });
531
-
532
- expect(result.handled).toBe(true);
533
- expect(result.type).toBe("guardian_decision_applied");
534
-
535
- // Verify a grant was minted
536
- expect(countGrants()).toBe(1);
537
-
538
- const grant = getLatestGrant();
539
- expect(grant).not.toBeNull();
540
- expect(grant!.scope_mode).toBe("tool_signature");
541
- expect(grant!.tool_name).toBe(TOOL_NAME);
542
-
543
- deliverSpy.mockRestore();
544
- composeSpy.mockRestore();
545
- });
546
-
547
- // ── 9. Grant TTL is approximately 5 minutes ──
507
+ // ── 8. Grant TTL is approximately 5 minutes ──
548
508
 
549
509
  test("minted grant has approximately 5-minute TTL", async () => {
550
510
  const requestId = "req-grant-ttl-1";
@@ -621,6 +581,8 @@ describe("approval interception trust-class regression coverage", () => {
621
581
  trustCtx: {
622
582
  sourceChannel: "telegram",
623
583
  trustClass: "unknown",
584
+ requesterExternalUserId: "intruder-user-1",
585
+ guardianExternalUserId: "guardian-1",
624
586
  },
625
587
  assistantId: ASSISTANT_ID,
626
588
  });
@@ -653,7 +615,6 @@ describe("approval interception trust-class regression coverage", () => {
653
615
  trustCtx: {
654
616
  sourceChannel: "telegram",
655
617
  trustClass: "unknown",
656
- denialReason: "no_identity",
657
618
  },
658
619
  assistantId: ASSISTANT_ID,
659
620
  });
@@ -5,8 +5,8 @@
5
5
  * Verifies:
6
6
  * - startOutbound / resendOutbound / cancelOutbound return correct result
7
7
  * shapes and stable error codes.
8
- * - HTTP route handlers (handleStartOutbound / handleResendOutbound /
9
- * handleCancelOutbound) wire through to the shared module and return
8
+ * - HTTP route handlers (handleCreateVerificationSession / handleResendVerificationSession /
9
+ * handleCancelVerificationSession) wire through to the shared module and return
10
10
  * appropriate HTTP status codes.
11
11
  * - Rate limiting, missing/invalid destination, already_bound, and
12
12
  * no_active_session error paths all produce the expected error codes.
@@ -43,50 +43,28 @@ mock.module("../util/logger.js", () => ({
43
43
  }),
44
44
  }));
45
45
 
46
- // SMS client mock — track calls
47
- const smsSendCalls: Array<{
48
- to: string;
49
- text: string;
50
- assistantId?: string;
51
- }> = [];
52
- mock.module("../messaging/providers/sms/client.js", () => ({
53
- sendMessage: async (
54
- _gatewayUrl: string,
55
- _bearerToken: string,
56
- to: string,
57
- text: string,
58
- assistantId?: string,
59
- ) => {
60
- smsSendCalls.push({ to, text, assistantId });
61
- return { messageSid: "SM-mock", status: "queued" };
62
- },
63
- }));
64
-
65
46
  mock.module("../config/env.js", () => ({
66
47
  isHttpAuthDisabled: () => true,
67
48
  getGatewayInternalBaseUrl: () => "http://127.0.0.1:7830",
68
49
  }));
69
50
 
70
- // Telegram credential metadata mock
51
+ // Telegram bot username mock — production code now reads from config via getTelegramBotUsername()
71
52
  let mockBotUsername: string | undefined = "test_bot";
72
- mock.module("../tools/credentials/metadata-store.js", () => ({
73
- getCredentialMetadata: (_service: string, _key: string) =>
74
- mockBotUsername ? { accountInfo: mockBotUsername } : null,
75
- upsertCredentialMetadata: () => {},
76
- deleteCredentialMetadata: () => {},
53
+ mock.module("../telegram/bot-username.js", () => ({
54
+ getTelegramBotUsername: () => mockBotUsername,
77
55
  }));
78
56
 
79
57
  // Voice call mock
80
58
  const voiceCallInitCalls: Array<{
81
59
  phoneNumber: string;
82
- guardianVerificationSessionId: string;
60
+ verificationSessionId: string;
83
61
  assistantId?: string;
84
62
  originConversationId?: string;
85
63
  }> = [];
86
64
  mock.module("../calls/call-domain.js", () => ({
87
- startGuardianVerificationCall: async (input: {
65
+ startVerificationCall: async (input: {
88
66
  phoneNumber: string;
89
- guardianVerificationSessionId: string;
67
+ verificationSessionId: string;
90
68
  assistantId?: string;
91
69
  originConversationId?: string;
92
70
  }) => {
@@ -129,17 +107,17 @@ globalThis.fetch = (async (
129
107
  // ---------------------------------------------------------------------------
130
108
 
131
109
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
132
- import { updateSessionDelivery } from "../runtime/channel-guardian-service.js";
110
+ import { updateSessionDelivery } from "../runtime/channel-verification-service.js";
111
+ import {
112
+ handleCancelVerificationSession,
113
+ handleCreateVerificationSession,
114
+ handleResendVerificationSession,
115
+ } from "../runtime/routes/channel-verification-routes.js";
133
116
  import {
134
117
  cancelOutbound,
135
118
  resendOutbound,
136
119
  startOutbound,
137
- } from "../runtime/guardian-outbound-actions.js";
138
- import {
139
- handleCancelOutbound,
140
- handleResendOutbound,
141
- handleStartOutbound,
142
- } from "../runtime/routes/integration-routes.js";
120
+ } from "../runtime/verification-outbound-actions.js";
143
121
 
144
122
  // Initialize the database (creates all tables)
145
123
  initializeDb();
@@ -156,7 +134,7 @@ afterAll(() => {
156
134
 
157
135
  function resetTables(): void {
158
136
  const db = getDb();
159
- db.run("DELETE FROM channel_guardian_verification_challenges");
137
+ db.run("DELETE FROM channel_verification_sessions");
160
138
  try {
161
139
  db.run("DELETE FROM channel_guardian_approval_requests");
162
140
  } catch {
@@ -184,7 +162,6 @@ function jsonRequest(body: Record<string, unknown>): Request {
184
162
  // Reset mutable state between tests
185
163
  beforeEach(() => {
186
164
  resetTables();
187
- smsSendCalls.length = 0;
188
165
  telegramDeliverCalls.length = 0;
189
166
  voiceCallInitCalls.length = 0;
190
167
  mockBotUsername = "test_bot";
@@ -195,25 +172,25 @@ beforeEach(() => {
195
172
  // ===========================================================================
196
173
 
197
174
  describe("startOutbound", () => {
198
- test("SMS: returns missing_destination when destination is absent", async () => {
199
- const result = await startOutbound({ channel: "sms" });
175
+ test("Voice: returns missing_destination when destination is absent", async () => {
176
+ const result = await startOutbound({ channel: "phone" });
200
177
  expect(result.success).toBe(false);
201
178
  expect(result.error).toBe("missing_destination");
202
- expect(result.channel).toBe("sms");
179
+ expect(result.channel).toBe("phone");
203
180
  });
204
181
 
205
- test("SMS: returns invalid_destination for garbage phone number", async () => {
182
+ test("Voice: returns invalid_destination for garbage phone number", async () => {
206
183
  const result = await startOutbound({
207
- channel: "sms",
184
+ channel: "phone",
208
185
  destination: "notaphone",
209
186
  });
210
187
  expect(result.success).toBe(false);
211
188
  expect(result.error).toBe("invalid_destination");
212
189
  });
213
190
 
214
- test("SMS: succeeds with valid E.164 number", async () => {
191
+ test("Voice: succeeds with valid E.164 number", async () => {
215
192
  const result = await startOutbound({
216
- channel: "sms",
193
+ channel: "phone",
217
194
  destination: "+15551234567",
218
195
  });
219
196
  expect(result.success).toBe(true);
@@ -222,12 +199,12 @@ describe("startOutbound", () => {
222
199
  expect(result.expiresAt).toBeGreaterThan(Date.now());
223
200
  expect(result.nextResendAt).toBeGreaterThan(Date.now());
224
201
  expect(result.sendCount).toBe(1);
225
- expect(result.channel).toBe("sms");
202
+ expect(result.channel).toBe("phone");
226
203
  });
227
204
 
228
- test("SMS: succeeds with loose phone format (parentheses + dashes)", async () => {
205
+ test("Voice: succeeds with loose phone format (parentheses + dashes)", async () => {
229
206
  const result = await startOutbound({
230
- channel: "sms",
207
+ channel: "phone",
231
208
  destination: "(555) 987-6543",
232
209
  });
233
210
  expect(result.success).toBe(true);
@@ -284,14 +261,14 @@ describe("startOutbound", () => {
284
261
  });
285
262
 
286
263
  test("voice: returns missing_destination when absent", async () => {
287
- const result = await startOutbound({ channel: "voice" });
264
+ const result = await startOutbound({ channel: "phone" });
288
265
  expect(result.success).toBe(false);
289
266
  expect(result.error).toBe("missing_destination");
290
267
  });
291
268
 
292
269
  test("voice: returns invalid_destination for garbage", async () => {
293
270
  const result = await startOutbound({
294
- channel: "voice",
271
+ channel: "phone",
295
272
  destination: "badphone",
296
273
  });
297
274
  expect(result.success).toBe(false);
@@ -300,7 +277,7 @@ describe("startOutbound", () => {
300
277
 
301
278
  test("voice: succeeds with valid phone", async () => {
302
279
  const result = await startOutbound({
303
- channel: "voice",
280
+ channel: "phone",
304
281
  destination: "+15559876543",
305
282
  });
306
283
  expect(result.success).toBe(true);
@@ -309,10 +286,10 @@ describe("startOutbound", () => {
309
286
  expect(result.sendCount).toBe(1);
310
287
  });
311
288
 
312
- test("voice: passes originConversationId to startGuardianVerificationCall", async () => {
289
+ test("voice: passes originConversationId to startVerificationCall", async () => {
313
290
  voiceCallInitCalls.length = 0;
314
291
  const result = await startOutbound({
315
- channel: "voice",
292
+ channel: "phone",
316
293
  destination: "+15559876543",
317
294
  originConversationId: "conv-origin-linkage-test",
318
295
  });
@@ -325,7 +302,7 @@ describe("startOutbound", () => {
325
302
  test("voice: succeeds without originConversationId (backward compat)", async () => {
326
303
  voiceCallInitCalls.length = 0;
327
304
  const result = await startOutbound({
328
- channel: "voice",
305
+ channel: "phone",
329
306
  destination: "+15551119999",
330
307
  });
331
308
  expect(result.success).toBe(true);
@@ -346,15 +323,15 @@ describe("startOutbound", () => {
346
323
 
347
324
  describe("resendOutbound", () => {
348
325
  test("returns no_active_session when no session exists", () => {
349
- const result = resendOutbound({ channel: "sms" });
326
+ const result = resendOutbound({ channel: "phone" });
350
327
  expect(result.success).toBe(false);
351
328
  expect(result.error).toBe("no_active_session");
352
329
  });
353
330
 
354
- test("SMS: succeeds when an active session exists and cooldown has passed", async () => {
331
+ test("Voice: succeeds when an active session exists and cooldown has passed", async () => {
355
332
  // Start a session first
356
333
  const startResult = await startOutbound({
357
- channel: "sms",
334
+ channel: "phone",
358
335
  destination: "+15551112222",
359
336
  });
360
337
  expect(startResult.success).toBe(true);
@@ -369,15 +346,15 @@ describe("resendOutbound", () => {
369
346
  );
370
347
  }
371
348
 
372
- const resendResult = resendOutbound({ channel: "sms" });
349
+ const resendResult = resendOutbound({ channel: "phone" });
373
350
  expect(resendResult.success).toBe(true);
374
351
  expect(resendResult.verificationSessionId).toBeDefined();
375
352
  expect(resendResult.sendCount).toBe(2);
376
353
  });
377
354
 
378
- test("SMS: preserves originConversationId on resend", async () => {
355
+ test("Voice: preserves originConversationId on resend", async () => {
379
356
  const startResult = await startOutbound({
380
- channel: "sms",
357
+ channel: "phone",
381
358
  destination: "+15551113333",
382
359
  });
383
360
  expect(startResult.success).toBe(true);
@@ -392,17 +369,17 @@ describe("resendOutbound", () => {
392
369
  }
393
370
 
394
371
  const resendResult = resendOutbound({
395
- channel: "sms",
396
- originConversationId: "conv-resend-sms-origin",
372
+ channel: "phone",
373
+ originConversationId: "conv-resend-voice-origin",
397
374
  });
398
375
  expect(resendResult.success).toBe(true);
399
- expect(resendResult.originConversationId).toBe("conv-resend-sms-origin");
376
+ expect(resendResult.originConversationId).toBe("conv-resend-voice-origin");
400
377
  });
401
378
 
402
379
  test("voice: preserves originConversationId on resend and passes it to call initiation", async () => {
403
380
  voiceCallInitCalls.length = 0;
404
381
  const startResult = await startOutbound({
405
- channel: "voice",
382
+ channel: "phone",
406
383
  destination: "+15559991111",
407
384
  });
408
385
  expect(startResult.success).toBe(true);
@@ -417,7 +394,7 @@ describe("resendOutbound", () => {
417
394
  }
418
395
 
419
396
  const resendResult = resendOutbound({
420
- channel: "voice",
397
+ channel: "phone",
421
398
  originConversationId: "conv-resend-voice-origin",
422
399
  });
423
400
  expect(resendResult.success).toBe(true);
@@ -441,21 +418,21 @@ describe("resendOutbound", () => {
441
418
 
442
419
  describe("cancelOutbound", () => {
443
420
  test("returns no_active_session when no session exists", () => {
444
- const result = cancelOutbound({ channel: "sms" });
421
+ const result = cancelOutbound({ channel: "phone" });
445
422
  expect(result.success).toBe(false);
446
423
  expect(result.error).toBe("no_active_session");
447
424
  });
448
425
 
449
426
  test("succeeds when an active session exists", async () => {
450
427
  const startResult = await startOutbound({
451
- channel: "sms",
428
+ channel: "phone",
452
429
  destination: "+15553334444",
453
430
  });
454
431
  expect(startResult.success).toBe(true);
455
432
 
456
- const cancelResult = cancelOutbound({ channel: "sms" });
433
+ const cancelResult = cancelOutbound({ channel: "phone" });
457
434
  expect(cancelResult.success).toBe(true);
458
- expect(cancelResult.channel).toBe("sms");
435
+ expect(cancelResult.channel).toBe("phone");
459
436
  });
460
437
  });
461
438
 
@@ -463,10 +440,10 @@ describe("cancelOutbound", () => {
463
440
  // HTTP route handlers
464
441
  // ===========================================================================
465
442
 
466
- describe("HTTP route: handleStartOutbound", () => {
443
+ describe("HTTP route: handleCreateVerificationSession (guardian path)", () => {
467
444
  test("returns 400 when channel is missing", async () => {
468
445
  const req = jsonRequest({ destination: "+15551234567" });
469
- const resp = await handleStartOutbound(req);
446
+ const resp = await handleCreateVerificationSession(req, "self");
470
447
  expect(resp.status).toBe(400);
471
448
  const body = (await resp.json()) as {
472
449
  error: { message: string; code: string };
@@ -475,17 +452,19 @@ describe("HTTP route: handleStartOutbound", () => {
475
452
  expect(body.error.message).toContain("channel");
476
453
  });
477
454
 
478
- test("returns 400 for missing destination (SMS)", async () => {
479
- const req = jsonRequest({ channel: "sms" });
480
- const resp = await handleStartOutbound(req);
481
- expect(resp.status).toBe(400);
482
- const body = (await resp.json()) as { error?: string };
483
- expect(body.error).toBe("missing_destination");
455
+ test("creates inbound challenge when destination is absent", async () => {
456
+ // Without a destination, the unified handler takes the inbound challenge path.
457
+ const req = jsonRequest({ channel: "phone" });
458
+ const resp = await handleCreateVerificationSession(req, "self");
459
+ expect(resp.status).toBe(200);
460
+ const body = (await resp.json()) as Record<string, unknown>;
461
+ expect(body.success).toBe(true);
462
+ expect(body.channel).toBe("phone");
484
463
  });
485
464
 
486
- test("returns 200 for valid SMS start", async () => {
487
- const req = jsonRequest({ channel: "sms", destination: "+15559999999" });
488
- const resp = await handleStartOutbound(req);
465
+ test("returns 200 for valid voice start", async () => {
466
+ const req = jsonRequest({ channel: "phone", destination: "+15559999999" });
467
+ const resp = await handleCreateVerificationSession(req, "self");
489
468
  expect(resp.status).toBe(200);
490
469
  const body = (await resp.json()) as Record<string, unknown>;
491
470
  expect(body.success).toBe(true);
@@ -493,10 +472,10 @@ describe("HTTP route: handleStartOutbound", () => {
493
472
  });
494
473
  });
495
474
 
496
- describe("HTTP route: handleResendOutbound", () => {
475
+ describe("HTTP route: handleResendVerificationSession (guardian path)", () => {
497
476
  test("returns 400 when channel is missing", async () => {
498
477
  const req = jsonRequest({});
499
- const resp = await handleResendOutbound(req);
478
+ const resp = await handleResendVerificationSession(req);
500
479
  expect(resp.status).toBe(400);
501
480
  const body = (await resp.json()) as {
502
481
  error: { message: string; code: string };
@@ -506,8 +485,8 @@ describe("HTTP route: handleResendOutbound", () => {
506
485
  });
507
486
 
508
487
  test("returns 400 for no_active_session", async () => {
509
- const req = jsonRequest({ channel: "sms" });
510
- const resp = await handleResendOutbound(req);
488
+ const req = jsonRequest({ channel: "phone" });
489
+ const resp = await handleResendVerificationSession(req);
511
490
  expect(resp.status).toBe(400);
512
491
  const body = (await resp.json()) as { error?: string };
513
492
  expect(body.error).toBe("no_active_session");
@@ -516,10 +495,10 @@ describe("HTTP route: handleResendOutbound", () => {
516
495
  test("passes originConversationId through on successful resend", async () => {
517
496
  // Start a session first
518
497
  const startReq = jsonRequest({
519
- channel: "sms",
498
+ channel: "phone",
520
499
  destination: "+15556667777",
521
500
  });
522
- const startResp = await handleStartOutbound(startReq);
501
+ const startResp = await handleCreateVerificationSession(startReq, "self");
523
502
  expect(startResp.status).toBe(200);
524
503
  const startBody = (await startResp.json()) as Record<string, unknown>;
525
504
 
@@ -534,10 +513,10 @@ describe("HTTP route: handleResendOutbound", () => {
534
513
  }
535
514
 
536
515
  const resendReq = jsonRequest({
537
- channel: "sms",
516
+ channel: "phone",
538
517
  originConversationId: "conv-resend-http-origin",
539
518
  });
540
- const resendResp = await handleResendOutbound(resendReq);
519
+ const resendResp = await handleResendVerificationSession(resendReq);
541
520
  expect(resendResp.status).toBe(200);
542
521
  const resendBody = (await resendResp.json()) as Record<string, unknown>;
543
522
  expect(resendBody.success).toBe(true);
@@ -545,10 +524,10 @@ describe("HTTP route: handleResendOutbound", () => {
545
524
  });
546
525
  });
547
526
 
548
- describe("HTTP route: handleCancelOutbound", () => {
527
+ describe("HTTP route: handleCancelVerificationSession (guardian path)", () => {
549
528
  test("returns 400 when channel is missing", async () => {
550
529
  const req = jsonRequest({});
551
- const resp = await handleCancelOutbound(req);
530
+ const resp = await handleCancelVerificationSession(req);
552
531
  expect(resp.status).toBe(400);
553
532
  const body = (await resp.json()) as {
554
533
  error: { message: string; code: string };
@@ -557,26 +536,28 @@ describe("HTTP route: handleCancelOutbound", () => {
557
536
  expect(body.error.message).toContain("channel");
558
537
  });
559
538
 
560
- test("returns 400 for no_active_session", async () => {
561
- const req = jsonRequest({ channel: "sms" });
562
- const resp = await handleCancelOutbound(req);
563
- expect(resp.status).toBe(400);
564
- const body = (await resp.json()) as { error?: string };
565
- expect(body.error).toBe("no_active_session");
539
+ test("returns 200 even when no active session exists", async () => {
540
+ // The unified cancel handler silently cancels both inbound and outbound —
541
+ // no error if nothing is active.
542
+ const req = jsonRequest({ channel: "phone" });
543
+ const resp = await handleCancelVerificationSession(req);
544
+ expect(resp.status).toBe(200);
545
+ const body = (await resp.json()) as Record<string, unknown>;
546
+ expect(body.success).toBe(true);
566
547
  });
567
548
 
568
549
  test("returns 200 when active session is cancelled", async () => {
569
550
  // Start a session
570
551
  const startReq = jsonRequest({
571
- channel: "sms",
552
+ channel: "phone",
572
553
  destination: "+15558887777",
573
554
  });
574
- const startResp = await handleStartOutbound(startReq);
555
+ const startResp = await handleCreateVerificationSession(startReq, "self");
575
556
  expect(startResp.status).toBe(200);
576
557
 
577
558
  // Cancel it
578
- const cancelReq = jsonRequest({ channel: "sms" });
579
- const cancelResp = await handleCancelOutbound(cancelReq);
559
+ const cancelReq = jsonRequest({ channel: "phone" });
560
+ const cancelResp = await handleCancelVerificationSession(cancelReq);
580
561
  expect(cancelResp.status).toBe(200);
581
562
  const body = (await cancelResp.json()) as Record<string, unknown>;
582
563
  expect(body.success).toBe(true);
@@ -588,19 +569,19 @@ describe("HTTP route: handleCancelOutbound", () => {
588
569
  // ===========================================================================
589
570
 
590
571
  describe("origin conversation linkage", () => {
591
- test("startOutbound SMS echoes originConversationId in result", async () => {
572
+ test("startOutbound voice echoes originConversationId in result (first number)", async () => {
592
573
  const result = await startOutbound({
593
- channel: "sms",
574
+ channel: "phone",
594
575
  destination: "+15551119999",
595
- originConversationId: "conv-origin-sms-test",
576
+ originConversationId: "conv-origin-voice-test-1",
596
577
  });
597
578
  expect(result.success).toBe(true);
598
- expect(result.originConversationId).toBe("conv-origin-sms-test");
579
+ expect(result.originConversationId).toBe("conv-origin-voice-test-1");
599
580
  });
600
581
 
601
- test("startOutbound voice echoes originConversationId in result", async () => {
582
+ test("startOutbound voice echoes originConversationId in result (second number)", async () => {
602
583
  const result = await startOutbound({
603
- channel: "voice",
584
+ channel: "phone",
604
585
  destination: "+15552229999",
605
586
  originConversationId: "conv-origin-voice-test",
606
587
  });
@@ -620,20 +601,20 @@ describe("origin conversation linkage", () => {
620
601
 
621
602
  test("startOutbound without originConversationId returns undefined for field", async () => {
622
603
  const result = await startOutbound({
623
- channel: "sms",
604
+ channel: "phone",
624
605
  destination: "+15553338888",
625
606
  });
626
607
  expect(result.success).toBe(true);
627
608
  expect(result.originConversationId).toBeUndefined();
628
609
  });
629
610
 
630
- test("HTTP handleStartOutbound passes originConversationId through", async () => {
611
+ test("HTTP handleCreateVerificationSession passes originConversationId through", async () => {
631
612
  const req = jsonRequest({
632
- channel: "sms",
613
+ channel: "phone",
633
614
  destination: "+15557776666",
634
615
  originConversationId: "conv-origin-http-test",
635
616
  });
636
- const resp = await handleStartOutbound(req);
617
+ const resp = await handleCreateVerificationSession(req, "self");
637
618
  expect(resp.status).toBe(200);
638
619
  const body = (await resp.json()) as Record<string, unknown>;
639
620
  expect(body.success).toBe(true);
@@ -642,7 +623,7 @@ describe("origin conversation linkage", () => {
642
623
 
643
624
  test("voice call initiation receives originConversationId", async () => {
644
625
  const result = await startOutbound({
645
- channel: "voice",
626
+ channel: "phone",
646
627
  destination: "+15554443333",
647
628
  originConversationId: "conv-origin-voice-init",
648
629
  });
@@ -663,7 +644,7 @@ describe("origin conversation linkage", () => {
663
644
 
664
645
  // Start a voice session (no origin initially)
665
646
  const startResult = await startOutbound({
666
- channel: "voice",
647
+ channel: "phone",
667
648
  destination: "+15552228888",
668
649
  });
669
650
  expect(startResult.success).toBe(true);
@@ -680,7 +661,7 @@ describe("origin conversation linkage", () => {
680
661
 
681
662
  // Resend with origin conversation ID
682
663
  const resendResult = resendOutbound({
683
- channel: "voice",
664
+ channel: "phone",
684
665
  originConversationId: "conv-resend-origin-linkage",
685
666
  });
686
667
  expect(resendResult.success).toBe(true);