@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
@@ -54,19 +54,35 @@ mock.module("../util/platform.js", () => ({
54
54
  getWorkspaceDir: () => mockWorkspaceDir,
55
55
  }));
56
56
 
57
- mock.module("../util/logger.js", () => ({
58
- getLogger: () => ({
59
- debug: () => {},
60
- info: (...args: unknown[]) => {
61
- logInfoCalls.push(args as [unknown, string]);
62
- },
63
- warn: (...args: unknown[]) => {
64
- logWarnCalls.push(args as [unknown, string]);
65
- },
66
- error: (...args: unknown[]) => {
67
- logErrorCalls.push(args as [unknown, string]);
68
- },
69
- }),
57
+ mock.module("pino", () => {
58
+ function createLogger() {
59
+ return {
60
+ child: () => createLogger(),
61
+ debug: () => {},
62
+ info: (...args: unknown[]) => {
63
+ logInfoCalls.push(args as [unknown, string]);
64
+ },
65
+ warn: (...args: unknown[]) => {
66
+ logWarnCalls.push(args as [unknown, string]);
67
+ },
68
+ error: (...args: unknown[]) => {
69
+ logErrorCalls.push(args as [unknown, string]);
70
+ },
71
+ };
72
+ }
73
+
74
+ const pino = Object.assign(() => createLogger(), {
75
+ destination: () => ({ write: () => true }),
76
+ multistream: () => ({ write: () => true }),
77
+ });
78
+
79
+ return {
80
+ default: pino,
81
+ };
82
+ });
83
+
84
+ mock.module("pino-pretty", () => ({
85
+ default: () => ({ write: () => true }),
70
86
  }));
71
87
 
72
88
  mock.module("node:fs", () => ({
@@ -428,23 +444,27 @@ describe("avatar E2E integration", () => {
428
444
  // 9. Correlation ID propagation
429
445
  // -----------------------------------------------------------------------
430
446
 
431
- test("managed success — correlation ID from response is logged", async () => {
447
+ test("managed success — correlation ID from response is propagated through the pipeline", async () => {
432
448
  mockStrategy = "managed_required";
433
449
  const response = managedPlatformResponse();
434
450
  response.correlation_id = "unique-corr-id-xyz";
435
451
  mockFetchReturning({ ok: true, status: 200, body: response });
436
452
 
437
- await executeAvatar("a robot");
453
+ const result = await executeAvatar("a robot");
454
+
455
+ // The managed path succeeded and wrote the avatar file
456
+ expect(result.isError).toBe(false);
457
+ expect(writeFileSyncFn).toHaveBeenCalled();
438
458
 
439
- // Look for the correlation ID in info log calls
440
- const correlationLogged = logInfoCalls.some(([meta]) => {
441
- if (meta && typeof meta === "object" && "correlationId" in meta) {
442
- return (
443
- (meta as { correlationId: string }).correlationId ===
444
- "unique-corr-id-xyz"
445
- );
459
+ const correlationLogged = logInfoCalls.some(([meta, message]) => {
460
+ if (message !== "Avatar saved successfully") return false;
461
+ if (!meta || typeof meta !== "object" || !("correlationId" in meta)) {
462
+ return false;
446
463
  }
447
- return false;
464
+ return (
465
+ (meta as { correlationId?: unknown }).correlationId ===
466
+ "unique-corr-id-xyz"
467
+ );
448
468
  });
449
469
 
450
470
  expect(correlationLogged).toBe(true);
@@ -76,7 +76,7 @@ mock.module("../tools/credentials/metadata-store.js", () => ({
76
76
  _setMetadataPath: () => {},
77
77
  }));
78
78
 
79
- import { executeBrowserFillCredential } from "../tools/browser/headless-browser.js";
79
+ import { executeBrowserFillCredential } from "../tools/browser/browser-execution.js";
80
80
  import type { ToolContext } from "../tools/types.js";
81
81
 
82
82
  const ctx: ToolContext = {
@@ -42,7 +42,7 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
42
42
  {
43
43
  skillPath: "guardian-verify-setup/SKILL.md",
44
44
  bannedSnippets: [
45
- 'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/integrations/guardian/status',
45
+ 'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/channel-verification-sessions/status',
46
46
  ],
47
47
  },
48
48
  {
@@ -51,12 +51,6 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
51
51
  'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/integrations/telegram/config',
52
52
  ],
53
53
  },
54
- {
55
- skillPath: "sms-setup/SKILL.md",
56
- bannedSnippets: [
57
- 'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/integrations/twilio/sms/compliance"',
58
- ],
59
- },
60
54
  {
61
55
  skillPath: "contacts/SKILL.md",
62
56
  bannedSnippets: [
@@ -82,9 +76,9 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
82
76
  {
83
77
  skillPath: "public-ingress/SKILL.md",
84
78
  bannedSnippets: [
79
+ 'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/',
85
80
  "security find-generic-password",
86
81
  "secret-tool lookup service vellum-assistant account credential:ngrok:authtoken",
87
- "INTERNAL_GATEWAY_BASE_URL",
88
82
  ],
89
83
  },
90
84
  {
@@ -118,7 +112,6 @@ const HOST_BASH_RETRIEVAL_ALLOWLIST = new Set<string>([
118
112
  ]);
119
113
 
120
114
  const RETRIEVAL_MARKERS = [
121
- "assistant integrations ",
122
115
  "assistant config get",
123
116
  "assistant email status",
124
117
  "assistant email inbox list",
@@ -82,9 +82,6 @@ mock.module("../calls/call-constants.js", () => ({
82
82
  getMaxCallDurationMs: () => 12 * 60 * 1000,
83
83
  getUserConsultationTimeoutMs: () => mockConsultationTimeoutMs,
84
84
  getSilenceTimeoutMs: () => mockSilenceTimeoutMs,
85
- SILENCE_TIMEOUT_MS: 30_000,
86
- MAX_CALL_DURATION_MS: 3600 * 1000,
87
- USER_CONSULTATION_TIMEOUT_MS: 120 * 1000,
88
85
  }));
89
86
 
90
87
  // ── Voice session bridge mock ────────────────────────────────────────
@@ -166,7 +163,7 @@ import {
166
163
  getCanonicalGuardianRequest,
167
164
  getPendingCanonicalRequestByCallSessionId,
168
165
  } from "../memory/canonical-guardian-store.js";
169
- import { getMessages } from "../memory/conversation-store.js";
166
+ import { getMessages } from "../memory/conversation-crud.js";
170
167
  import { getDb, initializeDb, resetDb, resetTestTables } from "../memory/db.js";
171
168
  import { conversations } from "../memory/schema.js";
172
169
 
@@ -871,7 +868,7 @@ describe("call-controller", () => {
871
868
 
872
869
  test("handleCallerUtterance: passes guardian context to startVoiceTurn", async () => {
873
870
  const trustCtx = {
874
- sourceChannel: "voice" as const,
871
+ sourceChannel: "phone" as const,
875
872
  trustClass: "trusted_contact" as const,
876
873
  guardianExternalUserId: "+15550009999",
877
874
  guardianChatId: "+15550009999",
@@ -931,13 +928,12 @@ describe("call-controller", () => {
931
928
 
932
929
  test("setTrustContext: subsequent turns use updated guardian context", async () => {
933
930
  const initialCtx = {
934
- sourceChannel: "voice" as const,
931
+ sourceChannel: "phone" as const,
935
932
  trustClass: "unknown" as const,
936
- denialReason: "no_binding" as const,
937
933
  };
938
934
 
939
935
  const upgradedCtx = {
940
- sourceChannel: "voice" as const,
936
+ sourceChannel: "phone" as const,
941
937
  trustClass: "guardian" as const,
942
938
  guardianExternalUserId: "+15550003333",
943
939
  guardianChatId: "+15550003333",
@@ -33,7 +33,7 @@ import {
33
33
  recordCallEvent,
34
34
  updateCallSession,
35
35
  } from "../calls/call-store.js";
36
- import { getMessages } from "../memory/conversation-store.js";
36
+ import { getMessages } from "../memory/conversation-crud.js";
37
37
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
38
38
  import { conversations } from "../memory/schema.js";
39
39
 
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * Validates:
6
6
  * - Strict implicit-default policy for caller identity.
7
+ * - Voice-ingress preflight blocks doomed outbound calls before Twilio dialing.
7
8
  * - Pointer messages are written on successful call start and on failure.
8
9
  */
9
10
  import { mkdtempSync, realpathSync, rmSync } from "node:fs";
@@ -35,6 +36,51 @@ mock.module("../util/logger.js", () => ({
35
36
 
36
37
  // Track whether the Twilio provider's initiateCall should succeed or throw
37
38
  let twilioInitiateCallBehavior: "success" | "error" = "success";
39
+ let twilioInitiateCallCount = 0;
40
+ let twilioInitiateCallArgs: Array<Record<string, unknown>> = [];
41
+ let mockIngressEnabled = true;
42
+ let mockIngressPublicBaseUrl = "https://test.example.com";
43
+
44
+ interface MockGatewayHealthResult {
45
+ target: string;
46
+ healthy: boolean;
47
+ localDeployment: boolean;
48
+ error?: string;
49
+ }
50
+
51
+ interface MockEnsureLocalGatewayReadyResult extends MockGatewayHealthResult {
52
+ recovered: boolean;
53
+ recoveryAttempted: boolean;
54
+ recoverySkipped: boolean;
55
+ }
56
+
57
+ let probeLocalGatewayHealthResults: MockGatewayHealthResult[] = [];
58
+ let probeLocalGatewayHealthCallCount = 0;
59
+ let ensureLocalGatewayReadyResult: MockEnsureLocalGatewayReadyResult;
60
+ let ensureLocalGatewayReadyCallCount = 0;
61
+
62
+ function makeGatewayHealthResult(
63
+ overrides: Partial<MockGatewayHealthResult> = {},
64
+ ): MockGatewayHealthResult {
65
+ return {
66
+ target: "http://127.0.0.1:7830",
67
+ healthy: true,
68
+ localDeployment: true,
69
+ ...overrides,
70
+ };
71
+ }
72
+
73
+ function makeRecoveryResult(
74
+ overrides: Partial<MockEnsureLocalGatewayReadyResult> = {},
75
+ ): MockEnsureLocalGatewayReadyResult {
76
+ return {
77
+ ...makeGatewayHealthResult(),
78
+ recovered: false,
79
+ recoveryAttempted: false,
80
+ recoverySkipped: false,
81
+ ...overrides,
82
+ };
83
+ }
38
84
 
39
85
  mock.module("../calls/twilio-config.js", () => ({
40
86
  getTwilioConfig: (assistantId?: string) => ({
@@ -55,11 +101,16 @@ mock.module("../calls/twilio-provider.js", () => ({
55
101
  reason: `${number} is not eligible as a caller ID`,
56
102
  };
57
103
  }
58
- async initiateCall() {
104
+ async initiateCall(args: Record<string, unknown>) {
105
+ twilioInitiateCallCount++;
106
+ twilioInitiateCallArgs.push(args);
59
107
  if (twilioInitiateCallBehavior === "error")
60
108
  throw new Error("Twilio unavailable");
61
109
  return { callSid: "CA_test_123" };
62
110
  }
111
+ async endCall() {
112
+ return;
113
+ }
63
114
  },
64
115
  }));
65
116
 
@@ -74,6 +125,10 @@ mock.module("../config/loader.js", () => ({
74
125
  provider: "twilio",
75
126
  callerIdentity: { allowPerCallOverride: true },
76
127
  },
128
+ ingress: {
129
+ enabled: mockIngressEnabled,
130
+ publicBaseUrl: mockIngressPublicBaseUrl,
131
+ },
77
132
  memory: { enabled: false },
78
133
  }),
79
134
  getConfig: () => ({
@@ -82,12 +137,17 @@ mock.module("../config/loader.js", () => ({
82
137
  provider: "twilio",
83
138
  callerIdentity: { allowPerCallOverride: true },
84
139
  },
140
+ ingress: {
141
+ enabled: mockIngressEnabled,
142
+ publicBaseUrl: mockIngressPublicBaseUrl,
143
+ },
85
144
  memory: { enabled: false },
86
145
  }),
87
146
  }));
88
147
 
89
148
  mock.module("../inbound/platform-callback-registration.js", () => ({
90
149
  resolveCallbackUrl: async (fn: () => string) => fn(),
150
+ shouldUsePlatformCallbacks: () => false,
91
151
  }));
92
152
 
93
153
  mock.module("../inbound/public-ingress-urls.js", () => ({
@@ -101,14 +161,59 @@ mock.module("../memory/conversation-title-service.js", () => ({
101
161
  queueGenerateConversationTitle: () => {},
102
162
  }));
103
163
 
104
- import { resolveCallerIdentity, startCall } from "../calls/call-domain.js";
164
+ mock.module("../runtime/local-gateway-health.js", () => ({
165
+ probeLocalGatewayHealth: async () => {
166
+ probeLocalGatewayHealthCallCount++;
167
+ const next =
168
+ probeLocalGatewayHealthResults.shift() ?? makeGatewayHealthResult();
169
+ return next;
170
+ },
171
+ ensureLocalGatewayReady: async () => {
172
+ ensureLocalGatewayReadyCallCount++;
173
+ return ensureLocalGatewayReadyResult;
174
+ },
175
+ }));
176
+
177
+ mock.module("../daemon/handlers/config-ingress.js", () => ({
178
+ computeGatewayTarget: () => "http://127.0.0.1:7830",
179
+ handleIngressConfig: async () => {},
180
+ syncTwilioWebhooks: async () => ({ success: true }),
181
+ }));
182
+
183
+ import {
184
+ clearActiveCallLeases,
185
+ getActiveCallLease,
186
+ listActiveCallLeases,
187
+ } from "../calls/active-call-lease.js";
188
+ import {
189
+ cancelCall,
190
+ resolveCallerIdentity,
191
+ startCall,
192
+ } from "../calls/call-domain.js";
105
193
  import type { AssistantConfig } from "../config/types.js";
106
- import { getMessages } from "../memory/conversation-store.js";
194
+ import { getMessages } from "../memory/conversation-crud.js";
107
195
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
108
196
  import { conversations } from "../memory/schema.js";
109
197
 
110
198
  initializeDb();
111
199
 
200
+ beforeEach(() => {
201
+ resetTables();
202
+ clearActiveCallLeases();
203
+ twilioInitiateCallBehavior = "success";
204
+ twilioInitiateCallCount = 0;
205
+ twilioInitiateCallArgs = [];
206
+ mockIngressEnabled = true;
207
+ mockIngressPublicBaseUrl = "https://test.example.com";
208
+ probeLocalGatewayHealthResults = [
209
+ makeGatewayHealthResult(),
210
+ makeGatewayHealthResult(),
211
+ ];
212
+ probeLocalGatewayHealthCallCount = 0;
213
+ ensureLocalGatewayReadyResult = makeRecoveryResult();
214
+ ensureLocalGatewayReadyCallCount = 0;
215
+ });
216
+
112
217
  let ensuredConvIds = new Set<string>();
113
218
  function ensureConversation(id: string): void {
114
219
  if (ensuredConvIds.has(id)) return;
@@ -288,11 +393,6 @@ describe("resolveCallerIdentity — strict implicit-default policy", () => {
288
393
  // ── Pointer message regression tests ──────────────────────────────
289
394
 
290
395
  describe("startCall — pointer message regression", () => {
291
- beforeEach(() => {
292
- resetTables();
293
- twilioInitiateCallBehavior = "success";
294
- });
295
-
296
396
  test("successful call writes a started pointer to the initiating conversation", async () => {
297
397
  const convId = "conv-domain-ptr-start";
298
398
  ensureConversation(convId);
@@ -304,6 +404,24 @@ describe("startCall — pointer message regression", () => {
304
404
  });
305
405
 
306
406
  expect(result.ok).toBe(true);
407
+ expect(twilioInitiateCallCount).toBe(1);
408
+ expect(twilioInitiateCallArgs).toEqual([
409
+ {
410
+ from: "+15550001111",
411
+ to: "+15559876543",
412
+ webhookUrl: "https://test.example.com/webhooks/twilio/voice/test",
413
+ statusCallbackUrl: "https://test.example.com/webhooks/twilio/status",
414
+ },
415
+ ]);
416
+ // Gateway reconcile triggers have been removed; the gateway reads
417
+ // credentials and config via TTL caches.
418
+ if (result.ok) {
419
+ expect(getActiveCallLease(result.session.id)).toEqual({
420
+ callSessionId: result.session.id,
421
+ providerCallSid: "CA_test_123",
422
+ updatedAt: expect.any(Number),
423
+ });
424
+ }
307
425
  // Allow async pointer write to flush
308
426
  await new Promise((r) => setTimeout(r, 50));
309
427
 
@@ -313,6 +431,102 @@ describe("startCall — pointer message regression", () => {
313
431
  expect(text!).toContain("started");
314
432
  });
315
433
 
434
+ test("fails fast when ingress is disabled and never reaches Twilio dialing", async () => {
435
+ const convId = "conv-domain-ingress-disabled";
436
+ ensureConversation(convId);
437
+ mockIngressEnabled = false;
438
+
439
+ const result = await startCall({
440
+ phoneNumber: "+15559876543",
441
+ task: "Test call",
442
+ conversationId: convId,
443
+ });
444
+
445
+ expect(result.ok).toBe(false);
446
+ if (!result.ok) {
447
+ expect(result.status).toBe(503);
448
+ expect(result.error).toContain("Public ingress");
449
+ }
450
+ expect(probeLocalGatewayHealthCallCount).toBe(0);
451
+ expect(ensureLocalGatewayReadyCallCount).toBe(0);
452
+ // No reconcile calls expected (reconcile triggers removed).
453
+ expect(twilioInitiateCallCount).toBe(0);
454
+
455
+ await new Promise((r) => setTimeout(r, 50));
456
+
457
+ const text = getLatestAssistantText(convId);
458
+ expect(text).not.toBeNull();
459
+ expect(text!).toContain("+15559876543");
460
+ expect(text!).toContain("failed");
461
+ });
462
+
463
+ test("never dials Twilio when the local callback gateway stays unhealthy", async () => {
464
+ const convId = "conv-domain-preflight-unhealthy";
465
+ ensureConversation(convId);
466
+ probeLocalGatewayHealthResults = [
467
+ makeGatewayHealthResult({
468
+ healthy: false,
469
+ error: "Gateway health check returned HTTP 503",
470
+ }),
471
+ makeGatewayHealthResult({
472
+ healthy: false,
473
+ error: "Gateway health check returned HTTP 503",
474
+ }),
475
+ ];
476
+ ensureLocalGatewayReadyResult = makeRecoveryResult({
477
+ healthy: false,
478
+ error: "Gateway health check returned HTTP 503",
479
+ recovered: false,
480
+ recoveryAttempted: true,
481
+ });
482
+
483
+ const result = await startCall({
484
+ phoneNumber: "+15559876543",
485
+ task: "Test call",
486
+ conversationId: convId,
487
+ });
488
+
489
+ expect(result.ok).toBe(false);
490
+ if (!result.ok) {
491
+ expect(result.status).toBe(503);
492
+ expect(result.error).toContain("still unhealthy");
493
+ }
494
+ expect(probeLocalGatewayHealthCallCount).toBe(2);
495
+ expect(ensureLocalGatewayReadyCallCount).toBe(1);
496
+ // No reconcile calls expected (reconcile triggers removed).
497
+ expect(twilioInitiateCallCount).toBe(0);
498
+ });
499
+
500
+ test("can recover a local gateway and then place exactly one outbound Twilio call", async () => {
501
+ const convId = "conv-domain-preflight-recovery";
502
+ ensureConversation(convId);
503
+ probeLocalGatewayHealthResults = [
504
+ makeGatewayHealthResult({
505
+ healthy: false,
506
+ error: "Gateway health check returned HTTP 503",
507
+ }),
508
+ makeGatewayHealthResult(),
509
+ ];
510
+ ensureLocalGatewayReadyResult = makeRecoveryResult({
511
+ healthy: true,
512
+ recovered: true,
513
+ recoveryAttempted: true,
514
+ });
515
+
516
+ const result = await startCall({
517
+ phoneNumber: "+15559876543",
518
+ task: "Test call",
519
+ conversationId: convId,
520
+ });
521
+
522
+ expect(result.ok).toBe(true);
523
+ expect(probeLocalGatewayHealthCallCount).toBe(2);
524
+ expect(ensureLocalGatewayReadyCallCount).toBe(1);
525
+ // Gateway reconcile triggers have been removed; the gateway reads
526
+ // credentials and config via TTL caches.
527
+ expect(twilioInitiateCallCount).toBe(1);
528
+ });
529
+
316
530
  test("failed call writes a failed pointer to the initiating conversation", async () => {
317
531
  const convId = "conv-domain-ptr-fail";
318
532
  ensureConversation(convId);
@@ -325,6 +539,8 @@ describe("startCall — pointer message regression", () => {
325
539
  });
326
540
 
327
541
  expect(result.ok).toBe(false);
542
+ expect(twilioInitiateCallCount).toBe(1);
543
+ expect(listActiveCallLeases()).toHaveLength(0);
328
544
  // Allow async pointer write to flush
329
545
  await new Promise((r) => setTimeout(r, 50));
330
546
 
@@ -333,4 +549,30 @@ describe("startCall — pointer message regression", () => {
333
549
  expect(text!).toContain("+15559876543");
334
550
  expect(text!).toContain("failed");
335
551
  });
552
+
553
+ test("canceling an active call releases its persisted keepalive lease", async () => {
554
+ const convId = "conv-domain-cancel-releases-lease";
555
+ ensureConversation(convId);
556
+
557
+ const startResult = await startCall({
558
+ phoneNumber: "+15559876543",
559
+ task: "Test call",
560
+ conversationId: convId,
561
+ });
562
+
563
+ expect(startResult.ok).toBe(true);
564
+ if (!startResult.ok) {
565
+ return;
566
+ }
567
+
568
+ expect(getActiveCallLease(startResult.session.id)).not.toBeNull();
569
+
570
+ const cancelResult = await cancelCall({
571
+ callSessionId: startResult.session.id,
572
+ reason: "User requested",
573
+ });
574
+
575
+ expect(cancelResult.ok).toBe(true);
576
+ expect(getActiveCallLease(startResult.session.id)).toBeNull();
577
+ });
336
578
  });
@@ -74,36 +74,36 @@ describe("getPointerFallbackMessage", () => {
74
74
  expect(msg).toContain("failed: no answer");
75
75
  });
76
76
 
77
- test("guardian_verification_succeeded defaults to voice channel", () => {
77
+ test("verification_succeeded defaults to phone channel", () => {
78
78
  const msg = getPointerFallbackMessage({
79
- scenario: "guardian_verification_succeeded",
79
+ scenario: "verification_succeeded",
80
80
  phoneNumber: "+15559876543",
81
81
  });
82
- expect(msg).toContain("Guardian verification (voice)");
82
+ expect(msg).toContain("Guardian verification (phone)");
83
83
  expect(msg).toContain("succeeded");
84
84
  });
85
85
 
86
- test("guardian_verification_succeeded with custom channel", () => {
86
+ test("verification_succeeded with explicit phone channel", () => {
87
87
  const msg = getPointerFallbackMessage({
88
- scenario: "guardian_verification_succeeded",
88
+ scenario: "verification_succeeded",
89
89
  phoneNumber: "+15559876543",
90
- channel: "sms",
90
+ channel: "phone",
91
91
  });
92
- expect(msg).toContain("Guardian verification (sms)");
92
+ expect(msg).toContain("Guardian verification (phone)");
93
93
  });
94
94
 
95
- test("guardian_verification_failed without reason", () => {
95
+ test("verification_failed without reason", () => {
96
96
  const msg = getPointerFallbackMessage({
97
- scenario: "guardian_verification_failed",
97
+ scenario: "verification_failed",
98
98
  phoneNumber: "+15559876543",
99
99
  });
100
100
  expect(msg).toContain("Guardian verification");
101
101
  expect(msg).toContain("failed");
102
102
  });
103
103
 
104
- test("guardian_verification_failed with reason", () => {
104
+ test("verification_failed with reason", () => {
105
105
  const msg = getPointerFallbackMessage({
106
- scenario: "guardian_verification_failed",
106
+ scenario: "verification_failed",
107
107
  phoneNumber: "+15559876543",
108
108
  reason: "Max attempts exceeded",
109
109
  });
@@ -159,12 +159,12 @@ describe("buildPointerInstruction", () => {
159
159
 
160
160
  test("includes channel when provided", () => {
161
161
  const ctx: CallPointerMessageContext = {
162
- scenario: "guardian_verification_succeeded",
162
+ scenario: "verification_succeeded",
163
163
  phoneNumber: "+15559876543",
164
- channel: "sms",
164
+ channel: "phone",
165
165
  };
166
166
  const instruction = buildPointerInstruction(ctx);
167
- expect(instruction).toContain("Channel: sms");
167
+ expect(instruction).toContain("Channel: phone");
168
168
  });
169
169
 
170
170
  test("omits optional fields when not provided", () => {
@@ -38,7 +38,7 @@ import {
38
38
  resetPointerMessageProcessor,
39
39
  setPointerMessageProcessor,
40
40
  } from "../calls/call-pointer-messages.js";
41
- import { addMessage, getMessages } from "../memory/conversation-store.js";
41
+ import { addMessage, getMessages } from "../memory/conversation-crud.js";
42
42
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
43
43
  import { conversations } from "../memory/schema.js";
44
44
 
@@ -201,34 +201,30 @@ describe("addPointerMessage", () => {
201
201
  expect(text).toContain("failed: no answer");
202
202
  });
203
203
 
204
- test("adds a guardian_verification_succeeded pointer message", () => {
204
+ test("adds a verification_succeeded pointer message", () => {
205
205
  const convId = "conv-ptr-gv-success";
206
206
  ensureConversation(convId);
207
- addPointerMessage(
208
- convId,
209
- "guardian_verification_succeeded",
210
- "+15559876543",
211
- );
207
+ addPointerMessage(convId, "verification_succeeded", "+15559876543");
212
208
  const text = getLatestAssistantText(convId);
213
209
  expect(text).toContain("Guardian verification");
214
210
  expect(text).toContain("+15559876543");
215
211
  expect(text).toContain("succeeded");
216
212
  });
217
213
 
218
- test("adds a guardian_verification_failed pointer message without reason", () => {
214
+ test("adds a verification_failed pointer message without reason", () => {
219
215
  const convId = "conv-ptr-gv-fail";
220
216
  ensureConversation(convId);
221
- addPointerMessage(convId, "guardian_verification_failed", "+15559876543");
217
+ addPointerMessage(convId, "verification_failed", "+15559876543");
222
218
  const text = getLatestAssistantText(convId);
223
219
  expect(text).toContain("Guardian verification");
224
220
  expect(text).toContain("+15559876543");
225
221
  expect(text).toContain("failed");
226
222
  });
227
223
 
228
- test("adds a guardian_verification_failed pointer message with reason", () => {
224
+ test("adds a verification_failed pointer message with reason", () => {
229
225
  const convId = "conv-ptr-gv-fail-r";
230
226
  ensureConversation(convId);
231
- addPointerMessage(convId, "guardian_verification_failed", "+15559876543", {
227
+ addPointerMessage(convId, "verification_failed", "+15559876543", {
232
228
  reason: "Max attempts exceeded",
233
229
  });
234
230
  const text = getLatestAssistantText(convId);