@vellumai/assistant 0.4.42 → 0.4.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (867) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +140 -403
  4. package/Dockerfile +0 -1
  5. package/README.md +81 -92
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +81 -104
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -3
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-asset.test.ts +1 -1
  33. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  34. package/src/__tests__/call-controller.test.ts +4 -8
  35. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  36. package/src/__tests__/call-domain.test.ts +250 -8
  37. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  38. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  39. package/src/__tests__/call-recovery.test.ts +47 -0
  40. package/src/__tests__/call-routes-http.test.ts +13 -0
  41. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  42. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  43. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  44. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  45. package/src/__tests__/channel-approval.test.ts +0 -201
  46. package/src/__tests__/channel-approvals.test.ts +2 -2
  47. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  48. package/src/__tests__/channel-guardian.test.ts +641 -740
  49. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  50. package/src/__tests__/channel-policy.test.ts +9 -12
  51. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  52. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  53. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  54. package/src/__tests__/checker.test.ts +41 -35
  55. package/src/__tests__/chrome-cdp.test.ts +57 -17
  56. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  57. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  58. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  59. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  60. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  61. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  62. package/src/__tests__/config-watcher.test.ts +1 -5
  63. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  64. package/src/__tests__/connection-policy.test.ts +3 -62
  65. package/src/__tests__/contacts-tools.test.ts +0 -2
  66. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  67. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  68. package/src/__tests__/context-window-manager.test.ts +220 -61
  69. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  70. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  71. package/src/__tests__/conversation-pairing.test.ts +14 -14
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +7 -7
  73. package/src/__tests__/conversation-store.test.ts +2 -2
  74. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  75. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +10 -16
  77. package/src/__tests__/credentials-cli.test.ts +49 -5
  78. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  79. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  80. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  81. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  82. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  84. package/src/__tests__/email-cli.test.ts +12 -12
  85. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  86. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  87. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  88. package/src/__tests__/event-bus.test.ts +0 -1
  89. package/src/__tests__/followup-tools.test.ts +0 -2
  90. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  91. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  92. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  95. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  97. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  98. package/src/__tests__/guardian-action-store.test.ts +2 -2
  99. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  101. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  102. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  103. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  104. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  105. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  106. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  109. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  110. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  111. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  112. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  113. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  114. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  115. package/src/__tests__/heartbeat-service.test.ts +1 -1
  116. package/src/__tests__/host-shell-tool.test.ts +3 -12
  117. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  118. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  119. package/src/__tests__/integration-status.test.ts +8 -8
  120. package/src/__tests__/intent-routing.test.ts +9 -13
  121. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  122. package/src/__tests__/invite-routes-http.test.ts +10 -10
  123. package/src/__tests__/llm-usage-store.test.ts +45 -9
  124. package/src/__tests__/local-gateway-health.test.ts +209 -0
  125. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  126. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  127. package/src/__tests__/managed-store.test.ts +29 -12
  128. package/src/__tests__/managed-twitter-guardrails.test.ts +357 -0
  129. package/src/__tests__/mcp-cli.test.ts +1 -1
  130. package/src/__tests__/mcp-health-check.test.ts +1 -1
  131. package/src/__tests__/media-generate-image.test.ts +1 -1
  132. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  133. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  134. package/src/__tests__/memory-regressions.test.ts +1 -166
  135. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  136. package/src/__tests__/migration-export-http.test.ts +2 -2
  137. package/src/__tests__/migration-transport.test.ts +44 -0
  138. package/src/__tests__/non-member-access-request.test.ts +49 -36
  139. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  140. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  141. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  142. package/src/__tests__/notification-deep-link.test.ts +3 -3
  143. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  144. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  145. package/src/__tests__/oauth-cli.test.ts +1 -1
  146. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  147. package/src/__tests__/onboarding-template-contract.test.ts +2 -12
  148. package/src/__tests__/platform.test.ts +168 -5
  149. package/src/__tests__/playbook-execution.test.ts +0 -2
  150. package/src/__tests__/playbook-tools.test.ts +0 -2
  151. package/src/__tests__/pricing.test.ts +125 -0
  152. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  153. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  154. package/src/__tests__/recording-handler.test.ts +46 -80
  155. package/src/__tests__/recording-state-machine.test.ts +112 -183
  156. package/src/__tests__/registry.test.ts +1 -1
  157. package/src/__tests__/relay-server.test.ts +69 -71
  158. package/src/__tests__/reminder-store.test.ts +3 -3
  159. package/src/__tests__/request-file-tool.test.ts +2 -2
  160. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  163. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  164. package/src/__tests__/schedule-store.test.ts +13 -4
  165. package/src/__tests__/schedule-tools.test.ts +0 -2
  166. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  167. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  168. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  169. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  170. package/src/__tests__/secret-response-routing.test.ts +1 -1
  171. package/src/__tests__/send-endpoint-busy.test.ts +1 -4
  172. package/src/__tests__/sequence-store.test.ts +0 -2
  173. package/src/__tests__/server-history-render.test.ts +2 -199
  174. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  175. package/src/__tests__/session-agent-loop.test.ts +107 -3
  176. package/src/__tests__/session-confirmation-signals.test.ts +17 -49
  177. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  178. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  179. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  180. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  181. package/src/__tests__/session-profile-injection.test.ts +9 -3
  182. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  183. package/src/__tests__/session-queue.test.ts +10 -4
  184. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  185. package/src/__tests__/session-skill-tools.test.ts +2 -3
  186. package/src/__tests__/session-slash-known.test.ts +11 -4
  187. package/src/__tests__/session-slash-queue.test.ts +11 -4
  188. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  189. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  190. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  191. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  192. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  193. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  194. package/src/__tests__/session-usage.test.ts +180 -0
  195. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  196. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  199. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  200. package/src/__tests__/skill-include-graph.test.ts +1 -0
  201. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  202. package/src/__tests__/skill-load-tool.test.ts +90 -12
  203. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  204. package/src/__tests__/skills-uninstall.test.ts +131 -0
  205. package/src/__tests__/skills.test.ts +32 -16
  206. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  207. package/src/__tests__/slack-channel-config.test.ts +71 -12
  208. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  209. package/src/__tests__/slack-share-routes.test.ts +1 -1
  210. package/src/__tests__/slack-skill.test.ts +2 -2
  211. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  212. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  213. package/src/__tests__/starter-task-flow.test.ts +10 -20
  214. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  215. package/src/__tests__/subagent-tools.test.ts +2 -2
  216. package/src/__tests__/system-prompt.test.ts +7 -12
  217. package/src/__tests__/task-compiler.test.ts +0 -2
  218. package/src/__tests__/task-management-tools.test.ts +0 -2
  219. package/src/__tests__/task-runner.test.ts +0 -2
  220. package/src/__tests__/task-scheduler.test.ts +2 -2
  221. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  222. package/src/__tests__/terminal-tools.test.ts +1 -11
  223. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  224. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  225. package/src/__tests__/tool-executor.test.ts +2 -2
  226. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  227. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  228. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  229. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  230. package/src/__tests__/trace-emitter.test.ts +1 -1
  231. package/src/__tests__/trust-context-guards.test.ts +1 -1
  232. package/src/__tests__/trust-store.test.ts +48 -399
  233. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  234. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  235. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  236. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  237. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  238. package/src/__tests__/twilio-config.test.ts +11 -2
  239. package/src/__tests__/twilio-provider.test.ts +6 -4
  240. package/src/__tests__/twilio-routes.test.ts +408 -86
  241. package/src/__tests__/twitter-platform-proxy-client.test.ts +475 -0
  242. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  243. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  244. package/src/__tests__/update-bulletin.test.ts +4 -8
  245. package/src/__tests__/update-template-contract.test.ts +1 -1
  246. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  247. package/src/__tests__/usage-routes.test.ts +23 -5
  248. package/src/__tests__/user-reference.test.ts +1 -1
  249. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  250. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  251. package/src/__tests__/view-image-tool.test.ts +0 -2
  252. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  253. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  254. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  255. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  256. package/src/__tests__/workspace-policy.test.ts +1 -1
  257. package/src/approvals/AGENTS.md +4 -4
  258. package/src/approvals/approval-primitive.ts +2 -2
  259. package/src/approvals/guardian-decision-primitive.ts +1 -1
  260. package/src/approvals/guardian-request-resolvers.ts +3 -4
  261. package/src/bundler/app-bundler.ts +29 -217
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +14 -54
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +108 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +15 -17
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +345 -0
  316. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +252 -0
  317. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -48
  318. package/src/cli/commands/twitter/index.ts +420 -0
  319. package/src/{twitter → cli/commands/twitter}/oauth-client.ts +1 -35
  320. package/src/cli/commands/twitter/router.ts +351 -0
  321. package/src/cli/commands/twitter/types.ts +30 -0
  322. package/src/cli/db.ts +1 -0
  323. package/src/cli/http-client.ts +87 -0
  324. package/src/cli/logger.ts +6 -0
  325. package/src/cli/main-screen.tsx +4 -3
  326. package/src/cli/output.ts +19 -0
  327. package/src/cli/program.ts +29 -27
  328. package/src/cli/reference.ts +27 -37
  329. package/src/cli.ts +452 -240
  330. package/src/config/assistant-feature-flags.ts +3 -15
  331. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  332. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  333. package/src/config/bundled-skills/amazon/SKILL.md +15 -6
  334. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  335. package/src/config/bundled-skills/app-builder/SKILL.md +4 -9
  336. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +23 -77
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -12
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -90
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +132 -109
  350. package/src/config/bundled-skills/doordash/lib/session.ts +22 -19
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +73 -144
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +8 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +196 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +151 -105
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +155 -55
  452. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  453. package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -25
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +30 -20
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +7 -1
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/surfaces.ts +2 -0
  462. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  463. package/src/daemon/providers-setup.ts +0 -5
  464. package/src/daemon/recording-executor.ts +0 -7
  465. package/src/daemon/ride-shotgun-handler.ts +42 -14
  466. package/src/daemon/seed-files.ts +3 -27
  467. package/src/daemon/server.ts +134 -524
  468. package/src/daemon/session-agent-loop-handlers.ts +46 -9
  469. package/src/daemon/session-agent-loop.ts +86 -24
  470. package/src/daemon/session-attachments.ts +1 -1
  471. package/src/daemon/session-error.ts +1 -1
  472. package/src/daemon/session-history.ts +20 -15
  473. package/src/daemon/session-lifecycle.ts +9 -7
  474. package/src/daemon/session-memory.ts +15 -1
  475. package/src/daemon/session-messaging.ts +10 -6
  476. package/src/daemon/session-notifiers.ts +10 -8
  477. package/src/daemon/session-process.ts +34 -25
  478. package/src/daemon/session-queue-manager.ts +1 -1
  479. package/src/daemon/session-runtime-assembly.ts +6 -32
  480. package/src/daemon/session-surfaces.ts +187 -35
  481. package/src/daemon/session-tool-setup.ts +1 -1
  482. package/src/daemon/session-usage.ts +119 -18
  483. package/src/daemon/session.ts +11 -33
  484. package/src/daemon/tool-side-effects.ts +6 -5
  485. package/src/daemon/trace-emitter.ts +1 -1
  486. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  487. package/src/daemon/watch-handler.ts +2 -5
  488. package/src/email/service.ts +8 -8
  489. package/src/events/domain-events.ts +0 -1
  490. package/src/events/tool-notification-listener.ts +1 -1
  491. package/src/followups/followup-store.ts +1 -2
  492. package/src/followups/types.ts +0 -6
  493. package/src/heartbeat/heartbeat-service.ts +1 -1
  494. package/src/inbound/platform-callback-registration.ts +1 -1
  495. package/src/inbound/public-ingress-urls.ts +0 -8
  496. package/src/index.ts +12 -0
  497. package/src/mcp/client.ts +1 -1
  498. package/src/mcp/manager.ts +1 -1
  499. package/src/memory/app-store.ts +1 -60
  500. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  501. package/src/memory/conversation-attention-store.ts +154 -0
  502. package/src/memory/conversation-bootstrap.ts +1 -1
  503. package/src/memory/conversation-crud.ts +53 -1
  504. package/src/memory/conversation-display-order-migration.ts +2 -3
  505. package/src/memory/conversation-queries.ts +1 -29
  506. package/src/memory/conversation-title-service.ts +26 -21
  507. package/src/memory/db-connection.ts +1 -8
  508. package/src/memory/db-init.ts +20 -0
  509. package/src/memory/delivery-crud.ts +4 -34
  510. package/src/memory/external-conversation-store.ts +1 -1
  511. package/src/memory/format-recall.ts +47 -0
  512. package/src/memory/guardian-action-store.ts +4 -5
  513. package/src/memory/guardian-rate-limits.ts +0 -3
  514. package/src/memory/invite-store.ts +1 -1
  515. package/src/memory/job-handlers/backfill.ts +9 -2
  516. package/src/memory/job-handlers/extraction.ts +2 -7
  517. package/src/memory/job-handlers/summarization.ts +1 -1
  518. package/src/memory/llm-usage-store.ts +11 -0
  519. package/src/memory/migrations/114-notifications.ts +12 -40
  520. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  521. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  522. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  523. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  524. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  525. package/src/memory/migrations/index.ts +5 -0
  526. package/src/memory/migrations/registry.ts +30 -0
  527. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  528. package/src/memory/retriever.test.ts +707 -0
  529. package/src/memory/retriever.ts +120 -116
  530. package/src/memory/schema/calls.ts +3 -7
  531. package/src/memory/schema/guardian.ts +2 -2
  532. package/src/memory/schema/infrastructure.ts +0 -8
  533. package/src/memory/search/lexical.ts +4 -1
  534. package/src/memory/search/query-expansion.test.ts +70 -0
  535. package/src/memory/search/query-expansion.ts +118 -0
  536. package/src/memory/search/types.ts +18 -17
  537. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  538. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  539. package/src/messaging/registry.ts +0 -1
  540. package/src/notifications/README.md +13 -22
  541. package/src/notifications/adapters/macos.ts +1 -1
  542. package/src/notifications/conversation-pairing.ts +2 -2
  543. package/src/notifications/copy-composer.ts +2 -2
  544. package/src/notifications/decision-engine.ts +1 -10
  545. package/src/notifications/destination-resolver.ts +2 -3
  546. package/src/notifications/emit-signal.ts +2 -8
  547. package/src/notifications/guardian-question-mode.ts +5 -8
  548. package/src/notifications/signal.ts +1 -2
  549. package/src/notifications/types.ts +1 -1
  550. package/src/oauth/token-persistence.ts +25 -1
  551. package/src/permissions/checker.ts +4 -29
  552. package/src/permissions/defaults.ts +9 -9
  553. package/src/permissions/prompter.ts +1 -1
  554. package/src/permissions/secret-prompter.ts +1 -1
  555. package/src/permissions/shell-identity.ts +1 -1
  556. package/src/permissions/trust-store.ts +13 -76
  557. package/src/permissions/workspace-policy.ts +1 -1
  558. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  559. package/src/{config → prompts}/system-prompt.ts +44 -26
  560. package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -3
  561. package/src/providers/registry.ts +2 -4
  562. package/src/runtime/AGENTS.md +6 -8
  563. package/src/runtime/access-request-helper.ts +36 -55
  564. package/src/runtime/actor-trust-resolver.ts +1 -24
  565. package/src/runtime/approval-message-composer.ts +6 -2
  566. package/src/runtime/assistant-event.ts +1 -1
  567. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  568. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  569. package/src/runtime/auth/__tests__/scopes.test.ts +2 -1
  570. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  571. package/src/runtime/auth/route-policy.ts +137 -25
  572. package/src/runtime/auth/scopes.ts +1 -0
  573. package/src/runtime/auth/subject.ts +9 -0
  574. package/src/runtime/auth/token-service.ts +12 -1
  575. package/src/runtime/auth/types.ts +1 -1
  576. package/src/runtime/channel-approval-types.ts +1 -1
  577. package/src/runtime/channel-approvals.ts +1 -1
  578. package/src/runtime/channel-invite-transport.ts +0 -2
  579. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  580. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  581. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  582. package/src/runtime/channel-readiness-service.ts +24 -159
  583. package/src/runtime/channel-readiness-types.ts +5 -1
  584. package/src/runtime/channel-reply-delivery.ts +43 -3
  585. package/src/runtime/channel-retry-sweep.ts +14 -22
  586. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  587. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  588. package/src/runtime/gateway-client.ts +12 -15
  589. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  590. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  591. package/src/runtime/guardian-action-message-composer.ts +4 -4
  592. package/src/runtime/guardian-reply-router.ts +3 -3
  593. package/src/runtime/http-server.ts +133 -24
  594. package/src/runtime/http-types.ts +44 -1
  595. package/src/runtime/invite-instruction-generator.ts +1 -3
  596. package/src/runtime/invite-redemption-service.ts +5 -5
  597. package/src/runtime/invite-service.ts +7 -7
  598. package/src/runtime/local-actor-identity.ts +28 -2
  599. package/src/runtime/local-gateway-health.ts +275 -0
  600. package/src/runtime/middleware/error-handler.ts +14 -1
  601. package/src/runtime/middleware/twilio-validation.ts +3 -3
  602. package/src/runtime/migrations/migration-transport.ts +18 -3
  603. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  604. package/src/runtime/nl-approval-parser.ts +2 -3
  605. package/src/runtime/routes/access-request-decision.ts +2 -2
  606. package/src/runtime/routes/app-management-routes.ts +918 -0
  607. package/src/runtime/routes/approval-routes.ts +76 -7
  608. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  609. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  610. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  611. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  612. package/src/runtime/routes/channel-route-shared.ts +1 -3
  613. package/src/runtime/routes/channel-routes.ts +1 -4
  614. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  615. package/src/runtime/routes/computer-use-routes.ts +595 -0
  616. package/src/runtime/routes/contact-routes.ts +1 -317
  617. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  618. package/src/runtime/routes/conversation-routes.ts +20 -24
  619. package/src/runtime/routes/debug-routes.ts +1 -1
  620. package/src/runtime/routes/diagnostics-routes.ts +890 -0
  621. package/src/runtime/routes/documents-routes.ts +227 -0
  622. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  623. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  624. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  625. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  626. package/src/runtime/routes/inbound-conversation.ts +3 -10
  627. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  628. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  629. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  630. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  631. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  632. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  633. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  634. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  635. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  636. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  637. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  638. package/src/runtime/routes/integrations/telegram.ts +111 -0
  639. package/src/runtime/routes/integrations/twilio.ts +451 -0
  640. package/src/runtime/routes/invite-routes.ts +2 -2
  641. package/src/runtime/routes/pairing-routes.ts +1 -1
  642. package/src/runtime/routes/recording-routes.ts +332 -0
  643. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  644. package/src/runtime/routes/session-management-routes.ts +167 -0
  645. package/src/runtime/routes/session-query-routes.ts +204 -0
  646. package/src/runtime/routes/settings-routes.ts +887 -0
  647. package/src/runtime/routes/skills-routes.ts +266 -0
  648. package/src/runtime/routes/subagents-routes.ts +246 -0
  649. package/src/runtime/routes/surface-action-routes.ts +100 -10
  650. package/src/runtime/routes/surface-content-routes.ts +1 -1
  651. package/src/runtime/routes/work-items-routes.ts +809 -0
  652. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  653. package/src/runtime/routes/workspace-routes.ts +410 -0
  654. package/src/runtime/routes/workspace-utils.ts +88 -0
  655. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  656. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  657. package/src/runtime/tool-grant-request-helper.ts +1 -2
  658. package/src/runtime/trust-context-resolver.ts +0 -1
  659. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  660. package/src/runtime/verification-rate-limiter.ts +2 -2
  661. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  662. package/src/schedule/integration-status.ts +2 -2
  663. package/src/schedule/schedule-store.ts +7 -9
  664. package/src/sequence/engine.ts +1 -1
  665. package/src/skills/active-skill-tools.ts +0 -8
  666. package/src/skills/clawhub.ts +1 -10
  667. package/src/skills/managed-store.ts +14 -4
  668. package/src/skills/slash-commands.ts +1 -1
  669. package/src/subagent/manager.ts +1 -1
  670. package/src/subagent/types.ts +1 -1
  671. package/src/tasks/SPEC.md +10 -10
  672. package/src/tasks/task-scheduler.ts +1 -1
  673. package/src/telegram/bot-username.ts +13 -0
  674. package/src/tools/AGENTS.md +38 -0
  675. package/src/tools/apps/executors.ts +0 -6
  676. package/src/tools/assets/materialize.ts +1 -1
  677. package/src/tools/assets/search.ts +1 -1
  678. package/src/tools/browser/browser-execution.ts +2 -2
  679. package/src/tools/browser/browser-manager.ts +88 -11
  680. package/src/tools/browser/browser-screencast.ts +1 -1
  681. package/src/tools/browser/headless-browser.ts +0 -17
  682. package/src/tools/browser/jit-auth.ts +1 -1
  683. package/src/tools/browser/recording-store.ts +19 -1
  684. package/src/tools/browser/runtime-check.ts +4 -2
  685. package/src/tools/calls/call-start.ts +3 -3
  686. package/src/tools/credentials/metadata-store.ts +0 -13
  687. package/src/tools/credentials/vault.ts +7 -31
  688. package/src/tools/document/editor-template.ts +10 -8
  689. package/src/tools/followups/followup_create.ts +0 -8
  690. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  691. package/src/tools/memory/definitions.ts +32 -10
  692. package/src/tools/memory/handlers.test.ts +573 -0
  693. package/src/tools/memory/handlers.ts +222 -65
  694. package/src/tools/memory/register.ts +53 -24
  695. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  696. package/src/tools/schedule/update.ts +0 -8
  697. package/src/tools/skills/load.ts +3 -3
  698. package/src/tools/subagent/read.ts +1 -1
  699. package/src/tools/system/voice-config.ts +2 -14
  700. package/src/tools/terminal/safe-env.ts +5 -18
  701. package/src/tools/tool-approval-handler.ts +4 -4
  702. package/src/tools/tool-manifest.ts +4 -2
  703. package/src/tools/types.ts +1 -1
  704. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  705. package/src/twitter/platform-proxy-client.ts +408 -0
  706. package/src/usage/types.ts +21 -0
  707. package/src/util/canonicalize-identity.ts +2 -6
  708. package/src/util/errors.ts +12 -0
  709. package/src/util/platform.ts +93 -86
  710. package/src/util/pricing.ts +180 -43
  711. package/src/work-items/work-item-runner.ts +1 -1
  712. package/scripts/ipc/check-contract-inventory.ts +0 -107
  713. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  714. package/scripts/ipc/generate-swift.ts +0 -528
  715. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  716. package/src/__tests__/app-migration.test.ts +0 -148
  717. package/src/__tests__/config-loader-migration.test.ts +0 -85
  718. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  719. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  720. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  721. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  722. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  723. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  724. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  725. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  726. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  727. package/src/__tests__/home-base-bootstrap.test.ts +0 -86
  728. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  729. package/src/__tests__/integrations-cli.test.ts +0 -232
  730. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  731. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  732. package/src/__tests__/ipc-contract.test.ts +0 -76
  733. package/src/__tests__/ipc-protocol.test.ts +0 -120
  734. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  735. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  736. package/src/__tests__/ipc-validate.test.ts +0 -471
  737. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  738. package/src/__tests__/migration-ordering.test.ts +0 -267
  739. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  740. package/src/__tests__/platform-move-helper.test.ts +0 -108
  741. package/src/__tests__/platform-socket-path.test.ts +0 -52
  742. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  743. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  744. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  745. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  746. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  747. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  748. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  749. package/src/__tests__/twitter-cli-error-shaping.test.ts +0 -224
  750. package/src/__tests__/twitter-cli-routing.test.ts +0 -286
  751. package/src/__tests__/work-item-output.test.ts +0 -150
  752. package/src/amazon/session.ts +0 -58
  753. package/src/cli/channels.ts +0 -51
  754. package/src/cli/influencer.ts +0 -319
  755. package/src/cli/integrations.ts +0 -372
  756. package/src/cli/ipc-client.ts +0 -88
  757. package/src/cli/twitter.ts +0 -1111
  758. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  759. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  760. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  761. package/src/config/core-schema.ts +0 -434
  762. package/src/config/memory-schema.ts +0 -617
  763. package/src/daemon/auth-manager.ts +0 -106
  764. package/src/daemon/handlers/apps.ts +0 -783
  765. package/src/daemon/handlers/avatar.ts +0 -73
  766. package/src/daemon/handlers/browser.ts +0 -3
  767. package/src/daemon/handlers/computer-use.ts +0 -231
  768. package/src/daemon/handlers/config-dispatch.ts +0 -29
  769. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  770. package/src/daemon/handlers/config-inbox.ts +0 -457
  771. package/src/daemon/handlers/config-integrations.ts +0 -409
  772. package/src/daemon/handlers/config-platform.ts +0 -77
  773. package/src/daemon/handlers/config-slack.ts +0 -41
  774. package/src/daemon/handlers/config-tools.ts +0 -226
  775. package/src/daemon/handlers/config-trust.ts +0 -135
  776. package/src/daemon/handlers/config.ts +0 -64
  777. package/src/daemon/handlers/contacts.ts +0 -193
  778. package/src/daemon/handlers/diagnostics.ts +0 -382
  779. package/src/daemon/handlers/documents.ts +0 -188
  780. package/src/daemon/handlers/guardian-actions.ts +0 -82
  781. package/src/daemon/handlers/home-base.ts +0 -82
  782. package/src/daemon/handlers/index.ts +0 -222
  783. package/src/daemon/handlers/misc.ts +0 -1139
  784. package/src/daemon/handlers/navigate-settings.ts +0 -29
  785. package/src/daemon/handlers/oauth-connect.ts +0 -202
  786. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  787. package/src/daemon/handlers/publish.ts +0 -176
  788. package/src/daemon/handlers/signing.ts +0 -56
  789. package/src/daemon/handlers/subagents.ts +0 -286
  790. package/src/daemon/handlers/twitter-auth.ts +0 -220
  791. package/src/daemon/handlers/work-items.ts +0 -796
  792. package/src/daemon/handlers/workspace-files.ts +0 -84
  793. package/src/daemon/handlers.ts +0 -16
  794. package/src/daemon/ipc-blob-store.ts +0 -246
  795. package/src/daemon/ipc-contract-inventory.json +0 -348
  796. package/src/daemon/ipc-contract-inventory.ts +0 -202
  797. package/src/daemon/ipc-handler.ts +0 -120
  798. package/src/daemon/ipc-protocol.ts +0 -85
  799. package/src/daemon/ipc-validate.ts +0 -254
  800. package/src/home-base/app-link-store.ts +0 -78
  801. package/src/home-base/bootstrap.ts +0 -74
  802. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  803. package/src/home-base/prebuilt/index.html +0 -702
  804. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  805. package/src/home-base/prebuilt/seed.ts +0 -122
  806. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  807. package/src/memory/app-migration.ts +0 -114
  808. package/src/memory/channel-delivery-store.ts +0 -40
  809. package/src/memory/channel-guardian-store.ts +0 -83
  810. package/src/memory/conversation-store.ts +0 -102
  811. package/src/memory/schema-migration.ts +0 -38
  812. package/src/messaging/providers/sms/adapter.ts +0 -232
  813. package/src/messaging/providers/sms/client.ts +0 -93
  814. package/src/messaging/providers/sms/types.ts +0 -7
  815. package/src/migrations/config-merge.ts +0 -62
  816. package/src/migrations/data-layout.ts +0 -89
  817. package/src/migrations/data-merge.ts +0 -44
  818. package/src/migrations/hooks-merge.ts +0 -118
  819. package/src/migrations/index.ts +0 -6
  820. package/src/migrations/log.ts +0 -28
  821. package/src/migrations/skills-merge.ts +0 -44
  822. package/src/migrations/workspace-layout.ts +0 -94
  823. package/src/notifications/adapters/sms.ts +0 -94
  824. package/src/runtime/channel-approval-parser.ts +0 -123
  825. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  826. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  827. package/src/runtime/routes/integration-routes.ts +0 -381
  828. package/src/runtime/routes/twilio-routes.ts +0 -1251
  829. package/src/twitter/client.ts +0 -979
  830. package/src/twitter/router.ts +0 -131
  831. package/src/twitter/session.ts +0 -54
  832. package/src/util/cookie-session.ts +0 -114
  833. package/src/watcher/providers/slack.ts +0 -282
  834. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  835. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  836. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  837. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  838. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  839. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  840. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  841. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  842. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  843. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  844. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  845. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  846. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  847. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  848. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  849. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  850. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  851. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  852. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  853. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  854. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  855. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  856. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  857. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  858. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  859. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  860. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  861. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  862. /package/src/{config → prompts}/templates/USER.md +0 -0
  863. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  864. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  865. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  866. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  867. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -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);
@@ -87,10 +87,9 @@ describe("guardian-question-mode", () => {
87
87
 
88
88
  expect(resolved.mode).toBe("answer");
89
89
  expect(resolved.requestKind).toBe("pending_question");
90
- expect(resolved.legacyFallbackUsed).toBe(false);
91
90
  });
92
91
 
93
- test("resolve mode uses legacy fallback when requestKind is missing", () => {
92
+ test("resolve mode defaults to approval when requestKind is missing", () => {
94
93
  const resolved = resolveGuardianQuestionInstructionMode({
95
94
  requestCode: "A1B2C3",
96
95
  questionText: "Allow host bash?",
@@ -99,7 +98,6 @@ describe("guardian-question-mode", () => {
99
98
 
100
99
  expect(resolved.mode).toBe("approval");
101
100
  expect(resolved.requestKind).toBeNull();
102
- expect(resolved.legacyFallbackUsed).toBe(true);
103
101
  });
104
102
 
105
103
  test("resolve mode treats pending_question with toolName as approval-mode", () => {
@@ -115,7 +113,6 @@ describe("guardian-question-mode", () => {
115
113
 
116
114
  expect(resolved.mode).toBe("approval");
117
115
  expect(resolved.requestKind).toBe("pending_question");
118
- expect(resolved.legacyFallbackUsed).toBe(false);
119
116
  });
120
117
 
121
118
  test("resolveGuardianInstructionModeFromFields returns null for unknown request kind", () => {
@@ -36,8 +36,6 @@ mock.module("../util/platform.js", () => ({
36
36
  getDbPath: () => join(testDir, "test.db"),
37
37
  getLogPath: () => join(testDir, "test.log"),
38
38
  ensureDataDir: () => {},
39
- migrateToDataLayout: () => {},
40
- migrateToWorkspaceLayout: () => {},
41
39
  }));
42
40
 
43
41
  mock.module("../util/logger.js", () => ({
@@ -178,7 +176,7 @@ describe("routing invariant: all decision paths reference applyCanonicalGuardian
178
176
  path: string;
179
177
  symbols: string[];
180
178
  }> = [
181
- // Inbound channel router (Telegram/SMS/WhatsApp)
179
+ // Inbound channel router (Telegram/WhatsApp)
182
180
  {
183
181
  path: "runtime/guardian-reply-router.ts",
184
182
  symbols: ["applyCanonicalGuardianDecision"],
@@ -189,12 +187,6 @@ describe("routing invariant: all decision paths reference applyCanonicalGuardian
189
187
  path: "runtime/routes/guardian-action-routes.ts",
190
188
  symbols: ["processGuardianDecision"],
191
189
  },
192
- // IPC handler (desktop socket clients) — uses processGuardianDecision
193
- // which is a shared wrapper around applyCanonicalGuardianDecision
194
- {
195
- path: "daemon/handlers/guardian-actions.ts",
196
- symbols: ["processGuardianDecision"],
197
- },
198
190
  // Shared service where processGuardianDecision is defined — must route
199
191
  // through the canonical primitive to complete the chain:
200
192
  // entrypoint → processGuardianDecision → applyCanonicalGuardianDecision
@@ -525,7 +517,7 @@ describe("routing invariant: code-only messages return clarification", () => {
525
517
  const req = createCanonicalGuardianRequest({
526
518
  kind: "pending_question",
527
519
  sourceType: "voice",
528
- sourceChannel: "voice",
520
+ sourceChannel: "phone",
529
521
  conversationId: "conv-1",
530
522
  guardianExternalUserId: "guardian-1",
531
523
  guardianPrincipalId: TEST_PRINCIPAL_ID,
@@ -559,7 +551,7 @@ describe("routing invariant: code-only messages return clarification", () => {
559
551
  const req = createCanonicalGuardianRequest({
560
552
  kind: "pending_question",
561
553
  sourceType: "voice",
562
- sourceChannel: "voice",
554
+ sourceChannel: "phone",
563
555
  conversationId: "conv-1",
564
556
  guardianExternalUserId: "guardian-1",
565
557
  guardianPrincipalId: TEST_PRINCIPAL_ID,
@@ -843,7 +835,7 @@ describe("routing invariant: disambiguation stays fail-closed", () => {
843
835
  const answerRequest = createCanonicalGuardianRequest({
844
836
  kind: "pending_question",
845
837
  sourceType: "voice",
846
- sourceChannel: "voice",
838
+ sourceChannel: "phone",
847
839
  conversationId: "conv-1",
848
840
  guardianExternalUserId: "guardian-1",
849
841
  guardianPrincipalId: TEST_PRINCIPAL_ID,
@@ -857,7 +849,7 @@ describe("routing invariant: disambiguation stays fail-closed", () => {
857
849
  const approvalRequest = createCanonicalGuardianRequest({
858
850
  kind: "pending_question",
859
851
  sourceType: "voice",
860
- sourceChannel: "voice",
852
+ sourceChannel: "phone",
861
853
  conversationId: "conv-1",
862
854
  guardianExternalUserId: "guardian-1",
863
855
  guardianPrincipalId: TEST_PRINCIPAL_ID,
@@ -40,8 +40,8 @@ mock.module("../security/secret-ingress.js", () => ({
40
40
  import { upsertContact } from "../contacts/contact-store.js";
41
41
  import { createGuardianBinding } from "../contacts/contacts-write.js";
42
42
  import type { TrustContext } from "../daemon/session-runtime-assembly.js";
43
- import * as channelDeliveryStore from "../memory/channel-delivery-store.js";
44
43
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
44
+ import * as deliveryCrud from "../memory/delivery-crud.js";
45
45
  import { channelInboundEvents, messages } from "../memory/schema.js";
46
46
  import { sweepFailedEvents } from "../runtime/channel-retry-sweep.js";
47
47
  import { handleChannelInbound } from "../runtime/routes/channel-routes.js";
@@ -402,12 +402,12 @@ describe("channel-retry-sweep routing state", () => {
402
402
  trustClass: "guardian" | "trusted_contact" | "unknown",
403
403
  guardianExternalUserId?: string,
404
404
  ): string {
405
- const inbound = channelDeliveryStore.recordInbound(
405
+ const inbound = deliveryCrud.recordInbound(
406
406
  "telegram",
407
407
  `chat-${trustClass}`,
408
408
  `msg-${trustClass}-${Date.now()}`,
409
409
  );
410
- channelDeliveryStore.storePayload(inbound.eventId, {
410
+ deliveryCrud.storePayload(inbound.eventId, {
411
411
  content: "retry me",
412
412
  sourceChannel: "telegram",
413
413
  interface: "telegram",