@vellumai/assistant 0.4.41 → 0.4.43

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