@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
@@ -1,3 +1,4 @@
1
+ import { getTwilioPhoneNumberEnv } from "../config/env.js";
1
2
  import { loadConfig } from "../config/loader.js";
2
3
  import {
3
4
  getPublicBaseUrl,
@@ -17,11 +18,35 @@ export interface TwilioConfig {
17
18
  wssBaseUrl: string;
18
19
  }
19
20
 
21
+ /**
22
+ * Resolve the Twilio phone number using a unified fallback chain so that
23
+ * all callers (calls, SMS adapter, readiness checks, invite transports)
24
+ * agree on the same number.
25
+ *
26
+ * Resolution order:
27
+ * 1. TWILIO_PHONE_NUMBER env var
28
+ * 2. config.twilio?.phoneNumber
29
+ * 3. ""
30
+ */
31
+ export function resolveTwilioPhoneNumber(): string {
32
+ const fromEnv = getTwilioPhoneNumberEnv();
33
+ if (fromEnv) return fromEnv;
34
+
35
+ try {
36
+ const config = loadConfig();
37
+ if (config.twilio?.phoneNumber) return config.twilio.phoneNumber;
38
+ } catch {
39
+ // Config may not be available yet during early startup
40
+ }
41
+
42
+ return "";
43
+ }
44
+
20
45
  export function getTwilioConfig(): TwilioConfig {
21
46
  const config = loadConfig();
22
47
  const accountSid = config.twilio?.accountSid || "";
23
- const authToken = getSecureKey("credential:twilio:auth_token");
24
- const phoneNumber = config.twilio?.phoneNumber || "";
48
+ const authToken = getSecureKey("credential:twilio:auth_token") || "";
49
+ const phoneNumber = resolveTwilioPhoneNumber();
25
50
  const webhookBaseUrl = getPublicBaseUrl(config);
26
51
 
27
52
  let wssBaseUrl: string;
@@ -33,7 +58,7 @@ export function getTwilioConfig(): TwilioConfig {
33
58
 
34
59
  if (!accountSid || !authToken) {
35
60
  throw new ConfigError(
36
- "Twilio credentials not configured. Set twilio.accountSid via config and twilio:auth_token via the credential_store tool.",
61
+ "Twilio credentials not configured. Set twilio.accountSid via config and store auth token via credential store.",
37
62
  );
38
63
  }
39
64
  if (!phoneNumber) {
@@ -16,7 +16,7 @@ const log = getLogger("twilio-provider");
16
16
  * Twilio ConversationRelay voice provider.
17
17
  *
18
18
  * Uses the Twilio REST API directly via fetch() — no twilio npm package.
19
- * Credentials are resolved lazily from the secure key store on each call.
19
+ * Credentials are resolved lazily from config on each call.
20
20
  */
21
21
  export class TwilioConversationRelayProvider implements VoiceProvider {
22
22
  readonly name = "twilio";
@@ -275,12 +275,12 @@ export class TwilioConversationRelayProvider implements VoiceProvider {
275
275
  // ── Webhook signature verification ──────────────────────────────────
276
276
 
277
277
  /**
278
- * Returns the Twilio auth token from the secure key store, or null if
279
- * not configured. Exposed as a static method so callers (e.g. the
280
- * HTTP server webhook middleware) can check availability independently.
278
+ * Returns the Twilio auth token from the credential store, or null if not configured.
279
+ * Exposed as a static method so callers (e.g. the HTTP server webhook
280
+ * middleware) can check availability independently.
281
281
  */
282
282
  static getAuthToken(): string | null {
283
- return getSecureKey("credential:twilio:auth_token") ?? null;
283
+ return getSecureKey("credential:twilio:auth_token") || null;
284
284
  }
285
285
 
286
286
  /**
@@ -2,7 +2,7 @@
2
2
  * Reusable Twilio REST API helpers.
3
3
  *
4
4
  * Provides low-level building blocks (auth header, base URL, credential
5
- * resolution) shared across the voice provider, SMS channel, and IPC
5
+ * resolution) shared across the voice provider and IPC
6
6
  * config handler. Uses fetch() directly — no twilio npm package.
7
7
  */
8
8
 
@@ -15,27 +15,29 @@ export interface TwilioCredentials {
15
15
  authToken: string;
16
16
  }
17
17
 
18
- /**
19
- * Resolve the Twilio Account SID from config.
20
- * Returns undefined if not found.
21
- */
18
+ /** Resolve the Twilio Account SID from config. */
22
19
  function resolveAccountSid(): string | undefined {
23
20
  try {
24
21
  const config = loadConfig();
25
- if (config.twilio?.accountSid) return config.twilio.accountSid;
22
+ return config.twilio?.accountSid || undefined;
26
23
  } catch {
27
24
  // Config may not be available during early startup
25
+ return undefined;
28
26
  }
29
- return undefined;
30
27
  }
31
28
 
32
- /** Resolve Twilio credentials from config and secure key store. Throws if not configured. */
29
+ /** Resolve the Twilio Auth Token from the credential store. */
30
+ function resolveAuthToken(): string | undefined {
31
+ return getSecureKey("credential:twilio:auth_token") || undefined;
32
+ }
33
+
34
+ /** Resolve Twilio credentials from config (SID) and credential store (token). Throws if not configured. */
33
35
  export function getTwilioCredentials(): TwilioCredentials {
34
36
  const accountSid = resolveAccountSid();
35
- const authToken = getSecureKey("credential:twilio:auth_token");
37
+ const authToken = resolveAuthToken();
36
38
  if (!accountSid || !authToken) {
37
39
  throw new ConfigError(
38
- "Twilio credentials not configured. Set twilio.accountSid via config and credential:twilio:auth_token via the credential_store tool.",
40
+ "Twilio credentials not configured. Set twilio.accountSid via config and store auth token via credential store.",
39
41
  );
40
42
  }
41
43
  return { accountSid, authToken };
@@ -43,9 +45,11 @@ export function getTwilioCredentials(): TwilioCredentials {
43
45
 
44
46
  /** Check whether Twilio credentials are present (non-throwing). */
45
47
  export function hasTwilioCredentials(): boolean {
46
- return (
47
- !!resolveAccountSid() && !!getSecureKey("credential:twilio:auth_token")
48
- );
48
+ try {
49
+ return !!resolveAccountSid() && !!resolveAuthToken();
50
+ } catch {
51
+ return false;
52
+ }
49
53
  }
50
54
 
51
55
  /** Build the HTTP Basic auth header for Twilio API requests. */
@@ -66,7 +70,7 @@ export function twilioBaseUrl(accountSid: string): string {
66
70
  export interface TwilioPhoneNumber {
67
71
  phoneNumber: string;
68
72
  friendlyName: string;
69
- capabilities: { voice: boolean; sms: boolean };
73
+ capabilities: { voice: boolean };
70
74
  }
71
75
 
72
76
  /** List incoming phone numbers owned by the account. */
@@ -95,21 +99,21 @@ export async function listIncomingPhoneNumbers(
95
99
  incoming_phone_numbers: Array<{
96
100
  phone_number: string;
97
101
  friendly_name: string;
98
- capabilities: { voice: boolean; sms: boolean };
102
+ capabilities: { voice: boolean };
99
103
  }>;
100
104
  };
101
105
 
102
106
  return data.incoming_phone_numbers.map((n) => ({
103
107
  phoneNumber: n.phone_number,
104
108
  friendlyName: n.friendly_name,
105
- capabilities: { voice: n.capabilities.voice, sms: n.capabilities.sms },
109
+ capabilities: { voice: n.capabilities.voice },
106
110
  }));
107
111
  }
108
112
 
109
113
  export interface AvailablePhoneNumber {
110
114
  phoneNumber: string;
111
115
  friendlyName: string;
112
- capabilities: { voice: boolean; sms: boolean };
116
+ capabilities: { voice: boolean };
113
117
  }
114
118
 
115
119
  /** Search for available phone numbers to purchase. */
@@ -148,14 +152,14 @@ export async function searchAvailableNumbers(
148
152
  available_phone_numbers: Array<{
149
153
  phone_number: string;
150
154
  friendly_name: string;
151
- capabilities: { voice: boolean; sms: boolean };
155
+ capabilities: { voice: boolean };
152
156
  }>;
153
157
  };
154
158
 
155
159
  return data.available_phone_numbers.map((n) => ({
156
160
  phoneNumber: n.phone_number,
157
161
  friendlyName: n.friendly_name,
158
- capabilities: { voice: n.capabilities.voice, sms: n.capabilities.sms },
162
+ capabilities: { voice: n.capabilities.voice },
159
163
  }));
160
164
  }
161
165
 
@@ -191,7 +195,7 @@ export async function provisionPhoneNumber(
191
195
  const data = (await res.json()) as {
192
196
  phone_number: string;
193
197
  friendly_name: string;
194
- capabilities: { voice: boolean; sms: boolean };
198
+ capabilities: { voice: boolean };
195
199
  };
196
200
 
197
201
  return {
@@ -199,7 +203,6 @@ export async function provisionPhoneNumber(
199
203
  friendlyName: data.friendly_name,
200
204
  capabilities: {
201
205
  voice: data.capabilities.voice,
202
- sms: data.capabilities.sms,
203
206
  },
204
207
  };
205
208
  }
@@ -245,15 +248,13 @@ export async function fetchMessageStatus(
245
248
  export interface WebhookUrls {
246
249
  voiceUrl: string;
247
250
  statusCallbackUrl: string;
248
- smsUrl: string;
249
251
  }
250
252
 
251
253
  /**
252
254
  * Update the webhook URLs on a Twilio IncomingPhoneNumber.
253
255
  *
254
- * Configures voice webhook, voice status callback, and SMS webhook so
255
- * that Twilio routes inbound calls and messages to the assistant's
256
- * gateway endpoints.
256
+ * Configures voice webhook and voice status callback so that Twilio
257
+ * routes inbound calls to the assistant's gateway endpoints.
257
258
  */
258
259
  export async function updatePhoneNumberWebhooks(
259
260
  accountSid: string,
@@ -303,8 +304,6 @@ export async function updatePhoneNumberWebhooks(
303
304
  VoiceMethod: "POST",
304
305
  StatusCallback: webhooks.statusCallbackUrl,
305
306
  StatusCallbackMethod: "POST",
306
- SmsUrl: webhooks.smsUrl,
307
- SmsMethod: "POST",
308
307
  });
309
308
 
310
309
  const updateRes = await fetch(
@@ -27,7 +27,6 @@ import {
27
27
  releaseCallbackClaim,
28
28
  updateCallSession,
29
29
  } from "./call-store.js";
30
- import { getTwilioConfig } from "./twilio-config.js";
31
30
  import type { CallStatus } from "./types.js";
32
31
  import { resolveVoiceQualityProfile } from "./voice-quality.js";
33
32
 
@@ -115,22 +114,6 @@ export function buildWelcomeGreeting(
115
114
  return "";
116
115
  }
117
116
 
118
- /**
119
- * Resolve the WebSocket relay URL from Twilio config.
120
- *
121
- * Treats wssBaseUrl as present only when it is non-empty after trimming.
122
- * Falls back to webhookBaseUrl, normalizing the scheme from http(s) to ws(s)
123
- * and stripping any trailing slash.
124
- */
125
- export function resolveRelayUrl(
126
- wssBaseUrl: string,
127
- webhookBaseUrl: string,
128
- ): string {
129
- const base = wssBaseUrl.trim() || webhookBaseUrl;
130
- const normalized = base.replace(/\/$/, "").replace(/^http(s?)/, "ws$1");
131
- return `${normalized}/v1/calls/relay`;
132
- }
133
-
134
117
  /**
135
118
  * Map Twilio call status strings to our internal CallStatus.
136
119
  */
@@ -198,7 +181,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
198
181
  return buildVoiceWebhookTwiml(
199
182
  session.id,
200
183
  session.task,
201
- session.guardianVerificationSessionId,
184
+ session.verificationSessionId,
202
185
  );
203
186
  }
204
187
 
@@ -226,7 +209,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
226
209
  return buildVoiceWebhookTwiml(
227
210
  callSessionId,
228
211
  session.task,
229
- session.guardianVerificationSessionId,
212
+ session.verificationSessionId,
230
213
  );
231
214
  }
232
215
 
@@ -235,7 +218,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
235
218
  * Resolves voice quality profile, relay URL, and welcome greeting,
236
219
  * then returns a Response with the generated TwiML.
237
220
  *
238
- * When `guardianVerificationSessionId` is provided, it is included as a
221
+ * When `verificationSessionId` is provided, it is included as a
239
222
  * `<Parameter>` in the TwiML for observability and compatibility with
240
223
  * the Twilio setup payload. The persisted call session mode is the
241
224
  * primary signal for deterministic flow selection in the relay server.
@@ -243,7 +226,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
243
226
  function buildVoiceWebhookTwiml(
244
227
  callSessionId: string,
245
228
  task: string | null,
246
- guardianVerificationSessionId?: string | null,
229
+ verificationSessionId?: string | null,
247
230
  ): Response {
248
231
  const profile = resolveVoiceQualityProfile(loadConfig());
249
232
 
@@ -252,28 +235,16 @@ function buildVoiceWebhookTwiml(
252
235
  "Voice quality profile resolved",
253
236
  );
254
237
 
255
- const twilioConfig = getTwilioConfig();
256
- let relayUrl: string;
257
- try {
258
- relayUrl = getTwilioRelayUrl(loadConfig());
259
- } catch {
260
- // Fallback to legacy resolution when ingress is not configured
261
- relayUrl = resolveRelayUrl(
262
- twilioConfig.wssBaseUrl,
263
- twilioConfig.webhookBaseUrl,
264
- );
265
- }
238
+ const relayUrl = getTwilioRelayUrl(loadConfig());
266
239
  const welcomeGreeting = buildWelcomeGreeting(task, getCallWelcomeGreeting());
267
240
 
268
241
  const relayToken = mintEdgeRelayToken();
269
242
 
270
- // Propagate guardianVerificationSessionId as a TwiML <Parameter> for
243
+ // Propagate verificationSessionId as a TwiML <Parameter> for
271
244
  // observability. This is not the sole source of truth; the relay
272
245
  // server reads the persisted call_mode from the call session first.
273
246
  const customParameters: Record<string, string> | undefined =
274
- guardianVerificationSessionId
275
- ? { guardianVerificationSessionId }
276
- : undefined;
247
+ verificationSessionId ? { verificationSessionId } : undefined;
277
248
 
278
249
  const twiml = generateTwiML(
279
250
  callSessionId,
@@ -348,6 +319,7 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
348
319
  return new Response(null, { status: 200 });
349
320
  }
350
321
 
322
+ let eventPersisted = false;
351
323
  try {
352
324
  const wasTerminal = isTerminalState(session.status);
353
325
 
@@ -366,9 +338,6 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
366
338
  updates.endedAt = Date.now();
367
339
  }
368
340
 
369
- updateCallSession(session.id, updates);
370
-
371
- // Record event
372
341
  const eventType = isTerminal
373
342
  ? mappedStatus === "completed"
374
343
  ? "call_ended"
@@ -377,18 +346,32 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
377
346
  ? "call_connected"
378
347
  : "call_started";
379
348
 
380
- recordCallEvent(session.id, eventType, {
381
- twilioStatus: callStatus,
382
- callSid,
349
+ // Record event after DB update but before lease sync: avoids duplicate
350
+ // events on retry (if update fails we never record), while ensuring the
351
+ // lease is only released after persistence so vellum sleep doesn't proceed
352
+ // before the call is fully recorded.
353
+ updateCallSession(session.id, updates, {
354
+ beforeLeaseSync: () => {
355
+ recordCallEvent(session.id, eventType, {
356
+ twilioStatus: callStatus,
357
+ callSid,
358
+ });
359
+ eventPersisted = true;
360
+ },
383
361
  });
384
362
 
385
- // Expire pending questions on terminal status
386
- if (isTerminal) {
387
- expirePendingQuestions(session.id);
388
-
389
- if (!wasTerminal) {
390
- persistCallCompletionMessage(session.conversationId, session.id).catch(
391
- (err) => {
363
+ // Post-persistence processing is best-effort failures must not
364
+ // propagate to the outer catch block, which would incorrectly treat
365
+ // them as lease-sync failures and finalize the dedupe claim.
366
+ try {
367
+ if (isTerminal) {
368
+ expirePendingQuestions(session.id);
369
+
370
+ if (!wasTerminal) {
371
+ persistCallCompletionMessage(
372
+ session.conversationId,
373
+ session.id,
374
+ ).catch((err) => {
392
375
  log.error(
393
376
  {
394
377
  err,
@@ -397,10 +380,15 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
397
380
  },
398
381
  "Failed to persist call completion message",
399
382
  );
400
- },
401
- );
402
- fireCallCompletionNotifier(session.conversationId, session.id);
383
+ });
384
+ fireCallCompletionNotifier(session.conversationId, session.id);
385
+ }
403
386
  }
387
+ } catch (postErr) {
388
+ log.error(
389
+ { err: postErr, callSid, callStatus, callSessionId: session.id },
390
+ "Post-persistence processing failed — event and claim are intact, but side effects may be incomplete",
391
+ );
404
392
  }
405
393
 
406
394
  // Mark the claim as permanently processed so it never expires.
@@ -416,8 +404,33 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
416
404
  );
417
405
  }
418
406
  } catch (err) {
419
- // Release claim so Twilio retries can reprocess
420
- releaseCallbackClaim(dedupeKey, claimId);
407
+ if (eventPersisted) {
408
+ // Event already written — releasing the claim would let Twilio
409
+ // retries insert a duplicate event. Finalize instead so the
410
+ // dedupe guard blocks subsequent attempts.
411
+ try {
412
+ finalizeCallbackClaim(dedupeKey, claimId);
413
+ log.warn(
414
+ { dedupeKey, claimId, callSid, callStatus, err },
415
+ "Post-persistence error — claim finalized to prevent duplicate events on retry",
416
+ );
417
+ } catch (finalizeErr) {
418
+ log.error(
419
+ { dedupeKey, claimId, callSid, callStatus, finalizeErr },
420
+ "Failed to finalize claim after event persistence — original error will still be re-thrown",
421
+ );
422
+ }
423
+ } else {
424
+ // Nothing persisted yet — safe to release so retries can reprocess
425
+ try {
426
+ releaseCallbackClaim(dedupeKey, claimId);
427
+ } catch (releaseErr) {
428
+ log.error(
429
+ { dedupeKey, claimId, callSid, callStatus, releaseErr },
430
+ "Failed to release claim — original error will still be re-thrown",
431
+ );
432
+ }
433
+ }
421
434
  throw err;
422
435
  }
423
436
 
@@ -19,12 +19,12 @@ export type CallEventType =
19
19
  | "callee_verification_started"
20
20
  | "callee_verification_succeeded"
21
21
  | "callee_verification_failed"
22
- | "guardian_voice_verification_started"
23
- | "guardian_voice_verification_succeeded"
24
- | "guardian_voice_verification_failed"
25
- | "outbound_guardian_voice_verification_started"
26
- | "outbound_guardian_voice_verification_succeeded"
27
- | "outbound_guardian_voice_verification_failed"
22
+ | "voice_verification_started"
23
+ | "voice_verification_succeeded"
24
+ | "voice_verification_failed"
25
+ | "outbound_voice_verification_started"
26
+ | "outbound_voice_verification_succeeded"
27
+ | "outbound_voice_verification_failed"
28
28
  | "guardian_consultation_timed_out"
29
29
  | "guardian_unavailable_skipped"
30
30
  | "guardian_consult_deferred"
@@ -58,7 +58,7 @@ export type PendingQuestionStatus =
58
58
  * uses this as the primary signal for deterministic flow selection,
59
59
  * with Twilio setup custom parameters as a secondary/observability signal.
60
60
  */
61
- export type CallMode = "normal" | "guardian_verification";
61
+ export type CallMode = "normal" | "verification";
62
62
 
63
63
  export interface CallSession {
64
64
  id: string;
@@ -70,7 +70,7 @@ export interface CallSession {
70
70
  task: string | null;
71
71
  status: CallStatus;
72
72
  callMode: CallMode | null;
73
- guardianVerificationSessionId: string | null;
73
+ verificationSessionId: string | null;
74
74
  callerIdentityMode: string | null;
75
75
  callerIdentitySource: string | null;
76
76
  initiatedFromConversationId?: string | null;
@@ -0,0 +1,110 @@
1
+ import { loadConfig } from "../config/loader.js";
2
+ import type { AssistantConfig } from "../config/types.js";
3
+ import { shouldUsePlatformCallbacks } from "../inbound/platform-callback-registration.js";
4
+ import { getPublicBaseUrl } from "../inbound/public-ingress-urls.js";
5
+
6
+ const SERVICE_UNAVAILABLE_STATUS = 503 as const;
7
+
8
+ export interface VoiceIngressPreflightSuccess {
9
+ ok: true;
10
+ ingressConfig: AssistantConfig;
11
+ publicBaseUrl: string;
12
+ }
13
+
14
+ export interface VoiceIngressPreflightFailure {
15
+ ok: false;
16
+ error: string;
17
+ status: typeof SERVICE_UNAVAILABLE_STATUS;
18
+ }
19
+
20
+ export type VoiceIngressPreflightResult =
21
+ | VoiceIngressPreflightSuccess
22
+ | VoiceIngressPreflightFailure;
23
+
24
+ function fail(error: string): VoiceIngressPreflightFailure {
25
+ return {
26
+ ok: false,
27
+ error,
28
+ status: SERVICE_UNAVAILABLE_STATUS,
29
+ };
30
+ }
31
+
32
+ function buildGatewayUnhealthyMessage(
33
+ target: string,
34
+ error: string | undefined,
35
+ afterRecoveryAttempt: boolean,
36
+ ): string {
37
+ const detail = error ?? "Unknown gateway health check failure";
38
+ if (afterRecoveryAttempt) {
39
+ return `Voice callback gateway is still unhealthy at ${target} after a local recovery attempt: ${detail}`;
40
+ }
41
+ return `Voice callback gateway is unhealthy at ${target}: ${detail}`;
42
+ }
43
+
44
+ export async function preflightVoiceIngress(): Promise<VoiceIngressPreflightResult> {
45
+ const ingressConfig = loadConfig();
46
+
47
+ // Platform-callback deployments register routes with the platform and receive
48
+ // stable callback URLs. No public ingress URL or local gateway is involved.
49
+ if (shouldUsePlatformCallbacks()) {
50
+ return {
51
+ ok: true,
52
+ ingressConfig,
53
+ publicBaseUrl: "",
54
+ };
55
+ }
56
+
57
+ let publicBaseUrl: string;
58
+ try {
59
+ publicBaseUrl = getPublicBaseUrl(ingressConfig);
60
+ } catch (err) {
61
+ const msg = err instanceof Error ? err.message : String(err);
62
+ return fail(
63
+ msg ||
64
+ "Outbound voice calls require public ingress to be enabled and a public base URL (ingress.publicBaseUrl or INGRESS_PUBLIC_BASE_URL).",
65
+ );
66
+ }
67
+
68
+ const { ensureLocalGatewayReady, probeLocalGatewayHealth } =
69
+ await import("../runtime/local-gateway-health.js");
70
+
71
+ const initialHealth = await probeLocalGatewayHealth();
72
+ if (!initialHealth.healthy && !initialHealth.localDeployment) {
73
+ return fail(
74
+ buildGatewayUnhealthyMessage(
75
+ initialHealth.target,
76
+ initialHealth.error,
77
+ false,
78
+ ),
79
+ );
80
+ }
81
+
82
+ if (initialHealth.localDeployment) {
83
+ const recovery = await ensureLocalGatewayReady();
84
+ // Re-probe after the wake flow so the dial path only continues when the
85
+ // current gateway process is demonstrably serving the callback stack.
86
+ const confirmedHealth = await probeLocalGatewayHealth();
87
+ if (!confirmedHealth.healthy) {
88
+ return fail(
89
+ buildGatewayUnhealthyMessage(
90
+ confirmedHealth.target,
91
+ confirmedHealth.error ?? recovery.error,
92
+ recovery.recoveryAttempted,
93
+ ),
94
+ );
95
+ }
96
+ }
97
+
98
+ return {
99
+ ok: true,
100
+ ingressConfig: {
101
+ ...ingressConfig,
102
+ ingress: {
103
+ ...(ingressConfig.ingress ?? {}),
104
+ enabled: true,
105
+ publicBaseUrl,
106
+ },
107
+ },
108
+ publicBaseUrl,
109
+ };
110
+ }
@@ -13,7 +13,7 @@
13
13
  import { consumeGrantForInvocation } from "../approvals/approval-primitive.js";
14
14
  import type { ChannelId } from "../channels/types.js";
15
15
  import { getConfig } from "../config/loader.js";
16
- import type { ServerMessage } from "../daemon/ipc-protocol.js";
16
+ import type { ServerMessage } from "../daemon/message-protocol.js";
17
17
  import type { Session } from "../daemon/session.js";
18
18
  import type { TrustContext } from "../daemon/session-runtime-assembly.js";
19
19
  import { resolveChannelCapabilities } from "../daemon/session-runtime-assembly.js";
@@ -219,7 +219,7 @@ function buildVoiceCallControlPrompt(opts: {
219
219
  * Execute a single voice turn through the daemon session pipeline.
220
220
  *
221
221
  * Manages the session directly with voice-specific defaults:
222
- * - sourceChannel: 'voice'
222
+ * - sourceChannel: 'phone'
223
223
  * - event sink wired to the provided callbacks
224
224
  * - abort propagated from the returned handle
225
225
  *
@@ -283,7 +283,7 @@ export async function startVoiceTurn(
283
283
 
284
284
  // Get or create the session
285
285
  const transport = {
286
- channelId: "voice" as ChannelId,
286
+ channelId: "phone" as ChannelId,
287
287
  };
288
288
  const session = await deps.getOrCreateSession(opts.conversationId, transport);
289
289
 
@@ -321,11 +321,11 @@ export async function startVoiceTurn(
321
321
  session.setTrustContext(opts.trustContext ?? null);
322
322
  session.setCommandIntent(null);
323
323
  session.setTurnChannelContext({
324
- userMessageChannel: "voice",
325
- assistantMessageChannel: "voice",
324
+ userMessageChannel: "phone",
325
+ assistantMessageChannel: "phone",
326
326
  });
327
327
  session.setChannelCapabilities(
328
- resolveChannelCapabilities("voice", undefined),
328
+ resolveChannelCapabilities("phone", undefined),
329
329
  );
330
330
  session.setVoiceCallControlPrompt(voiceCallControlPrompt);
331
331
 
@@ -392,7 +392,7 @@ export async function startVoiceTurn(
392
392
  toolName: msg.toolName,
393
393
  inputDigest,
394
394
  consumingRequestId: msg.requestId,
395
- executionChannel: "voice",
395
+ executionChannel: "phone",
396
396
  conversationId: opts.conversationId,
397
397
  callSessionId: opts.callSessionId,
398
398
  requesterExternalUserId:
@@ -45,15 +45,6 @@ const CHANNEL_POLICIES = {
45
45
  codeRedemptionEnabled: true,
46
46
  },
47
47
  },
48
- sms: {
49
- notification: {
50
- deliveryEnabled: true,
51
- conversationStrategy: "continue_existing_conversation",
52
- },
53
- invite: {
54
- codeRedemptionEnabled: true,
55
- },
56
- },
57
48
  whatsapp: {
58
49
  notification: {
59
50
  deliveryEnabled: false,
@@ -81,7 +72,7 @@ const CHANNEL_POLICIES = {
81
72
  codeRedemptionEnabled: true,
82
73
  },
83
74
  },
84
- voice: {
75
+ phone: {
85
76
  notification: {
86
77
  deliveryEnabled: false,
87
78
  conversationStrategy: "not_deliverable",
@@ -11,7 +11,7 @@
11
11
  * Each entry maps a channel ID to a ChannelPermissionProfile.
12
12
  */
13
13
 
14
- import { getConfig, saveConfig } from "./loader.js";
14
+ import { getConfig, saveConfig } from "../config/loader.js";
15
15
 
16
16
  // ── Types ───────────────────────────────────────────────────────────
17
17