@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,9 +1,9 @@
1
1
  /**
2
- * Channel guardian verification service.
2
+ * Channel verification service.
3
3
  *
4
- * Encapsulates the business logic for the guardian verification challenge
5
- * lifecycle: creating challenges with cryptographic secrets, validating
6
- * and consuming them, and managing guardian bindings.
4
+ * Encapsulates the business logic for the verification session lifecycle:
5
+ * creating sessions with cryptographic secrets, validating and consuming
6
+ * them, and managing guardian bindings.
7
7
  */
8
8
 
9
9
  import { createHash, randomBytes } from "crypto";
@@ -15,27 +15,29 @@ import type {
15
15
  GuardianBinding,
16
16
  IdentityBindingStatus,
17
17
  SessionStatus,
18
- VerificationChallenge,
19
18
  VerificationPurpose,
20
- } from "../memory/channel-guardian-store.js";
19
+ VerificationSession,
20
+ } from "../memory/channel-verification-sessions.js";
21
21
  import {
22
22
  bindSessionIdentity as storeBindSessionIdentity,
23
- consumeChallenge,
23
+ consumeSession,
24
24
  countRecentSendsToDestination as storeCountRecentSendsToDestination,
25
- createChallenge,
25
+ createInboundSession,
26
26
  createVerificationSession,
27
27
  findActiveSession as storeFindActiveSession,
28
- findPendingChallengeByHash,
29
- findPendingChallengeForChannel,
28
+ findPendingSessionByHash,
29
+ findPendingSessionForChannel,
30
30
  findSessionByBootstrapTokenHash as storeFindSessionByBootstrapTokenHash,
31
31
  findSessionByIdentity as storeFindSessionByIdentity,
32
+ revokePendingSessions as storeRevokePendingSessions,
33
+ updateSessionDelivery as storeUpdateSessionDelivery,
34
+ updateSessionStatus as storeUpdateSessionStatus,
35
+ } from "../memory/channel-verification-sessions.js";
36
+ import {
32
37
  getRateLimit,
33
38
  recordInvalidAttempt,
34
39
  resetRateLimit,
35
- revokePendingChallenges as storeRevokePendingChallenges,
36
- updateSessionDelivery as storeUpdateSessionDelivery,
37
- updateSessionStatus as storeUpdateSessionStatus,
38
- } from "../memory/channel-guardian-store.js";
40
+ } from "../memory/guardian-rate-limits.js";
39
41
  import { composeApprovalMessage } from "./approval-message-composer.js";
40
42
 
41
43
  // ---------------------------------------------------------------------------
@@ -58,7 +60,7 @@ const RATE_LIMIT_LOCKOUT_MS = 30 * 60 * 1000;
58
60
  // Types
59
61
  // ---------------------------------------------------------------------------
60
62
 
61
- export interface CreateChallengeResult {
63
+ export interface CreateVerificationSessionResult {
62
64
  challengeId: string;
63
65
  secret: string;
64
66
  verifyCommand: string;
@@ -66,7 +68,7 @@ export interface CreateChallengeResult {
66
68
  instruction: string;
67
69
  }
68
70
 
69
- export type ValidateChallengeResult =
71
+ export type ValidateVerificationResult =
70
72
  | { success: true; verificationType: "guardian" | "trusted_contact" }
71
73
  | { success: false; reason: string };
72
74
 
@@ -96,24 +98,24 @@ function generateNumericSecret(digits: number = 6): string {
96
98
  }
97
99
 
98
100
  /**
99
- * Create a new verification challenge for a guardian candidate.
101
+ * Create a new inbound verification session for a guardian candidate.
100
102
  *
101
- * Inbound challenges are not identity-bound: `validateAndConsumeChallenge`
102
- * skips the identity check when no expected-identity fields are set, so
103
- * code secrecy is the only protection against brute-force guessing during
104
- * the TTL window. A 32-byte hex secret provides ~2^128 entropy, making
103
+ * Inbound sessions are not identity-bound (`identityBindingStatus: null`),
104
+ * so `validateAndConsumeVerification` skips the identity check and code
105
+ * secrecy is the only protection against brute-force guessing during the
106
+ * TTL window. A 32-byte hex secret provides ~2^128 entropy, making
105
107
  * enumeration infeasible. Identity-bound outbound sessions (created via
106
108
  * `createOutboundSession`) use shorter 6-digit numeric codes because the
107
109
  * identity check adds a second layer of protection.
108
110
  *
109
- * Hashes the secret (SHA-256) and stores the challenge record with a
111
+ * Hashes the secret (SHA-256) and stores the session record with a
110
112
  * 10-minute TTL. The raw secret is returned so it can be displayed to
111
113
  * the user; only the hash is persisted.
112
114
  */
113
- export function createVerificationChallenge(
115
+ export function createInboundVerificationSession(
114
116
  channel: string,
115
117
  sessionId?: string,
116
- ): CreateChallengeResult {
118
+ ): CreateVerificationSessionResult {
117
119
  // High-entropy hex for unbound inbound challenges — 6-digit numeric
118
120
  // codes are only safe when identity binding provides a second factor.
119
121
  const secret = randomBytes(32).toString("hex");
@@ -121,7 +123,7 @@ export function createVerificationChallenge(
121
123
  const challengeId = uuid();
122
124
  const expiresAt = Date.now() + CHALLENGE_TTL_MS;
123
125
 
124
- createChallenge({
126
+ createInboundSession({
125
127
  id: challengeId,
126
128
  channel,
127
129
  challengeHash,
@@ -159,14 +161,14 @@ export function createVerificationChallenge(
159
161
  * exceeding the threshold the actor is locked out for a cooldown
160
162
  * period. On success the counter resets.
161
163
  */
162
- export function validateAndConsumeChallenge(
164
+ export function validateAndConsumeVerification(
163
165
  channel: string,
164
166
  secret: string,
165
167
  actorExternalUserId: string,
166
168
  actorChatId: string,
167
169
  _actorUsername?: string,
168
170
  _actorDisplayName?: string,
169
- ): ValidateChallengeResult {
171
+ ): ValidateVerificationResult {
170
172
  // ── Rate-limit check ──
171
173
  const existing = getRateLimit(channel, actorExternalUserId, actorChatId);
172
174
  if (
@@ -187,7 +189,7 @@ export function validateAndConsumeChallenge(
187
189
 
188
190
  const challengeHash = hashSecret(secret);
189
191
 
190
- const challenge = findPendingChallengeByHash(channel, challengeHash);
192
+ const challenge = findPendingSessionByHash(channel, challengeHash);
191
193
  if (!challenge) {
192
194
  recordInvalidAttempt(
193
195
  channel,
@@ -225,11 +227,11 @@ export function validateAndConsumeChallenge(
225
227
  }
226
228
 
227
229
  // ── Expected-identity check (outbound sessions) ──
228
- // If the session has identity binding fields set and is in 'bound' state,
229
- // verify the actor matches the expected identity. If identity_binding_status
230
- // is 'pending_bootstrap', allow consumption (bootstrap path handles binding
231
- // separately). If no expected identity fields are set (legacy/inbound-only),
232
- // skip identity check for backward compatibility.
230
+ // If the session is in 'bound' state AND has at least one expected-identity
231
+ // field, verify the actor matches. Inbound-only sessions have no expected
232
+ // identity and rely on code secrecy alone. If identity_binding_status is
233
+ // 'pending_bootstrap', allow consumption (bootstrap path handles binding
234
+ // separately).
233
235
  const hasExpectedIdentity =
234
236
  challenge.expectedExternalUserId != null ||
235
237
  challenge.expectedChatId != null ||
@@ -238,7 +240,7 @@ export function validateAndConsumeChallenge(
238
240
  if (hasExpectedIdentity && challenge.identityBindingStatus === "bound") {
239
241
  let identityMatch = false;
240
242
 
241
- // For SMS/voice: verify actorExternalUserId matches expectedPhoneE164
243
+ // For voice: verify actorExternalUserId matches expectedPhoneE164
242
244
  // OR actorExternalUserId matches expectedExternalUserId
243
245
  if (challenge.expectedPhoneE164 != null) {
244
246
  if (
@@ -298,10 +300,9 @@ export function validateAndConsumeChallenge(
298
300
  }
299
301
  }
300
302
  // pending_bootstrap: allow consumption without identity check
301
- // no expected identity: legacy/inbound-only, skip identity check
302
303
 
303
304
  // Consume the challenge so it cannot be reused
304
- consumeChallenge(challenge.id, actorExternalUserId, actorChatId);
305
+ consumeSession(challenge.id, actorExternalUserId, actorChatId);
305
306
 
306
307
  // Reset the rate-limit counter on success
307
308
  resetRateLimit(channel, actorExternalUserId, actorChatId);
@@ -321,7 +322,7 @@ export function validateAndConsumeChallenge(
321
322
  /**
322
323
  * Look up the active guardian binding for a given assistant and channel.
323
324
  * Reads from the contacts table via findGuardianForChannel and
324
- * synthesizes a GuardianBinding-shaped object for backward compatibility.
325
+ * synthesizes a GuardianBinding-shaped object.
325
326
  * Returns null when no contacts match.
326
327
  */
327
328
  export function getGuardianBinding(
@@ -374,23 +375,21 @@ export function revokeBinding(assistantId: string, channel: string): boolean {
374
375
  }
375
376
 
376
377
  /**
377
- * Revoke all pending challenges for a given channel.
378
- * Called when the user cancels verification so that stale challenges
378
+ * Revoke all pending sessions for a given channel.
379
+ * Called when the user cancels verification so that stale sessions
379
380
  * don't gate inbound calls.
380
381
  */
381
- export function revokePendingChallenges(channel: string): void {
382
- storeRevokePendingChallenges(channel);
382
+ export function revokePendingSessions(channel: string): void {
383
+ storeRevokePendingSessions(channel);
383
384
  }
384
385
 
385
386
  /**
386
- * Look up a pending (non-expired) verification challenge for a given
387
+ * Look up a pending (non-expired) verification session for a given
387
388
  * channel. Used by relay setup to detect whether an active
388
389
  * voice verification session exists.
389
390
  */
390
- export function getPendingChallenge(
391
- channel: string,
392
- ): VerificationChallenge | null {
393
- return findPendingChallengeForChannel(channel);
391
+ export function getPendingSession(channel: string): VerificationSession | null {
392
+ return findPendingSessionForChannel(channel);
394
393
  }
395
394
 
396
395
  // ---------------------------------------------------------------------------
@@ -409,7 +408,7 @@ export interface CreateOutboundSessionResult {
409
408
  * Create an outbound verification session with expected identity pre-set.
410
409
  * Returns session info including the secret for outbound delivery.
411
410
  *
412
- * Channels where identity is pre-bound (SMS, voice, Telegram with known
411
+ * Channels where identity is pre-bound (voice, Telegram with known
413
412
  * chat ID) use 6-digit numeric codes for ease of entry. Unbound bootstrap
414
413
  * sessions (e.g. Telegram handle where identity is not yet known) use
415
414
  * high-entropy 32-byte hex secrets to prevent brute-force guessing during
@@ -470,9 +469,7 @@ export function createOutboundSession(params: {
470
469
  /**
471
470
  * Find the most recent active outbound session for a given channel.
472
471
  */
473
- export function findActiveSession(
474
- channel: string,
475
- ): VerificationChallenge | null {
472
+ export function findActiveSession(channel: string): VerificationSession | null {
476
473
  return storeFindActiveSession(channel);
477
474
  }
478
475
 
@@ -484,7 +481,7 @@ export function findSessionByIdentity(
484
481
  externalUserId?: string,
485
482
  chatId?: string,
486
483
  phoneE164?: string,
487
- ): VerificationChallenge | null {
484
+ ): VerificationSession | null {
488
485
  return storeFindSessionByIdentity(channel, externalUserId, chatId, phoneE164);
489
486
  }
490
487
 
@@ -515,7 +512,7 @@ export function updateSessionDelivery(
515
512
  }
516
513
 
517
514
  /**
518
- * Count total SMS sends to a destination across all sessions within a
515
+ * Count total sends to a destination across all sessions within a
519
516
  * rolling time window. Prevents circumvention of per-session limits by
520
517
  * repeatedly creating new sessions to the same phone number.
521
518
  */
@@ -550,7 +547,7 @@ export function bindSessionIdentity(
550
547
  export function resolveBootstrapToken(
551
548
  channel: string,
552
549
  token: string,
553
- ): VerificationChallenge | null {
550
+ ): VerificationSession | null {
554
551
  const tokenHash = hashSecret(token);
555
552
  return storeFindSessionByBootstrapTokenHash(channel, tokenHash);
556
553
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * When a trusted-contact channel session creates a confirmation_request (tool approval),
5
5
  * this helper emits a guardian.question notification signal and persists canonical
6
- * delivery rows to guardian destinations (Telegram/SMS/Vellum), enabling the guardian
6
+ * delivery rows to guardian destinations (Telegram/Slack/Vellum), enabling the guardian
7
7
  * to approve via callback/request-code path.
8
8
  *
9
9
  * Modeled after the tool-grant-request-helper pattern. Designed to be called from
@@ -22,7 +22,7 @@ import type { NotificationSourceChannel } from "../notifications/signal.js";
22
22
  import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
23
23
  import { getLogger } from "../util/logger.js";
24
24
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "./assistant-scope.js";
25
- import { getGuardianBinding } from "./channel-guardian-service.js";
25
+ import { getGuardianBinding } from "./channel-verification-service.js";
26
26
 
27
27
  const log = getLogger("confirmation-request-guardian-bridge");
28
28
 
@@ -181,7 +181,6 @@ export function bridgeConfirmationRequestToGuardian(
181
181
  .then((signalResult) => {
182
182
  for (const result of signalResult.deliveryResults) {
183
183
  if (result.channel === "vellum") continue; // handled in onThreadCreated
184
- if (result.channel !== "telegram" && result.channel !== "sms") continue;
185
184
  createCanonicalGuardianDelivery({
186
185
  requestId: canonicalRequest.id,
187
186
  destinationChannel: result.channel,
@@ -13,8 +13,6 @@ const MANAGED_CALLBACK_TOKEN_HEADER = "X-Managed-Gateway-Callback-Token";
13
13
  const MANAGED_IDEMPOTENCY_HEADER = "X-Idempotency-Key";
14
14
  const MANAGED_OUTBOUND_MAX_ATTEMPTS = 3;
15
15
  const MANAGED_OUTBOUND_RETRY_BASE_MS = 150;
16
- const SMS_ATTACHMENTS_FALLBACK_TEXT =
17
- "I have a media attachment to share, but SMS currently supports text only.";
18
16
 
19
17
  export interface ChannelReplyPayload {
20
18
  chatId: string;
@@ -33,6 +31,8 @@ export interface ChannelReplyPayload {
33
31
  ephemeral?: boolean;
34
32
  /** Slack user ID — required when `ephemeral` is true. */
35
33
  user?: string;
34
+ /** Telegram message_id for editing an existing message instead of sending a new one. */
35
+ messageId?: number;
36
36
  /** When provided, instructs the delivery endpoint to update an existing message instead of posting a new one. */
37
37
  messageTs?: string;
38
38
  /** When true, auto-generate Block Kit blocks from text via textToBlocks(). */
@@ -45,13 +45,15 @@ export interface ChannelDeliveryResult {
45
45
  ok: boolean;
46
46
  /** The message timestamp returned by the delivery endpoint (e.g. Slack message ts). */
47
47
  ts?: string;
48
+ /** The Telegram message_id returned when a new message was sent. */
49
+ messageId?: number;
48
50
  }
49
51
 
50
52
  interface ManagedOutboundCallbackContext {
51
53
  requestUrl: string;
52
54
  routeId: string;
53
55
  assistantId: string;
54
- sourceChannel: "sms" | "voice";
56
+ sourceChannel: "phone";
55
57
  sourceUpdateId?: string;
56
58
  callbackToken?: string;
57
59
  }
@@ -92,11 +94,14 @@ export async function deliverChannelReply(
92
94
  );
93
95
  }
94
96
 
95
- let result: ChannelDeliveryResult = { ok: true };
97
+ const result: ChannelDeliveryResult = { ok: true };
96
98
  try {
97
99
  const responseBody = (await response.json()) as Record<string, unknown>;
98
100
  if (typeof responseBody.ts === "string") {
99
- result = { ok: true, ts: responseBody.ts };
101
+ result.ts = responseBody.ts;
102
+ }
103
+ if (typeof responseBody.messageId === "number") {
104
+ result.messageId = responseBody.messageId;
100
105
  }
101
106
  } catch {
102
107
  // Response may not be JSON for non-Slack channels; that's fine.
@@ -138,11 +143,7 @@ function parseManagedOutboundCallback(
138
143
  const assistantId = parsed.searchParams.get("assistant_id")?.trim();
139
144
  const sourceChannel = parsed.searchParams.get("source_channel")?.trim();
140
145
 
141
- if (
142
- !routeId ||
143
- !assistantId ||
144
- (sourceChannel !== "sms" && sourceChannel !== "voice")
145
- ) {
146
+ if (!routeId || !assistantId || sourceChannel !== "phone") {
146
147
  throw new Error(
147
148
  "Managed outbound callback URL is missing required route_id, assistant_id, or source_channel.",
148
149
  );
@@ -185,11 +186,7 @@ async function deliverManagedOutboundReply(
185
186
  Array.isArray(payload.attachments) && payload.attachments.length > 0;
186
187
  const text = payload.approval?.plainTextFallback ?? payload.text;
187
188
  const normalizedText =
188
- typeof text === "string" && text.trim().length > 0
189
- ? text
190
- : hasAttachments
191
- ? SMS_ATTACHMENTS_FALLBACK_TEXT
192
- : "";
189
+ typeof text === "string" && text.trim().length > 0 ? text : "";
193
190
  if (!normalizedText) {
194
191
  throw new Error(
195
192
  "Managed outbound delivery requires text or plainTextFallback.",
@@ -2,11 +2,9 @@
2
2
  * Guardian action follow-up executor.
3
3
  *
4
4
  * After the conversation engine classifies the guardian's reply as
5
- * `call_back` or `message_back` and transitions the follow-up state to
6
- * `dispatching`, this module executes the actual action:
5
+ * `call_back` and transitions the follow-up state to `dispatching`,
6
+ * this module executes the actual action:
7
7
  *
8
- * - **message_back**: Generates outbound SMS text and sends it to the
9
- * counterparty phone number via the gateway's /deliver/sms endpoint.
10
8
  * - **call_back**: Starts an outbound call to the counterparty with
11
9
  * context about the guardian's answer.
12
10
  *
@@ -14,13 +12,12 @@
14
12
  * dispatches the appropriate action, and returns a result with generated
15
13
  * reply text for the guardian's confirmation message.
16
14
  *
17
- * This module is channel-agnostic: both inbound-message-handler (Telegram,
18
- * SMS channels) and session-process (mac/IPC channel) use it.
15
+ * This module is channel-agnostic: both inbound-message-handler (Telegram
16
+ * channels) and session-process (mac/IPC channel) use it.
19
17
  */
20
18
 
21
19
  import { startCall } from "../calls/call-domain.js";
22
20
  import { getCallSession } from "../calls/call-store.js";
23
- import { getGatewayInternalBaseUrl } from "../config/env.js";
24
21
  import { getOrCreateConversation } from "../memory/conversation-key-store.js";
25
22
  import {
26
23
  finalizeFollowup,
@@ -30,8 +27,6 @@ import {
30
27
  } from "../memory/guardian-action-store.js";
31
28
  import { getLogger } from "../util/logger.js";
32
29
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "./assistant-scope.js";
33
- import { mintDaemonDeliveryToken } from "./auth/token-service.js";
34
- import { deliverChannelReply } from "./gateway-client.js";
35
30
  import { composeGuardianActionMessageGenerative } from "./guardian-action-message-composer.js";
36
31
  import type { GuardianActionCopyGenerator } from "./http-types.js";
37
32
 
@@ -105,62 +100,6 @@ export function resolveCounterparty(
105
100
  // Action dispatchers
106
101
  // ---------------------------------------------------------------------------
107
102
 
108
- /**
109
- * Send an SMS to the counterparty with the guardian's answer context.
110
- * Uses the gateway's /deliver/sms endpoint (same path as the SMS notification adapter).
111
- */
112
- async function executeMessageBack(
113
- request: GuardianActionRequest,
114
- counterparty: CounterpartyInfo,
115
- generator?: GuardianActionCopyGenerator,
116
- ): Promise<{ ok: true } | { ok: false; error: string }> {
117
- try {
118
- // Generate the outbound SMS text using the composer
119
- const messageText = await composeGuardianActionMessageGenerative(
120
- {
121
- scenario: "outbound_message_copy",
122
- questionText: request.questionText,
123
- lateAnswerText: request.lateAnswerText ?? undefined,
124
- callerIdentifier: counterparty.displayIdentifier,
125
- },
126
- {},
127
- generator,
128
- );
129
-
130
- const gatewayBase = getGatewayInternalBaseUrl();
131
- const deliverUrl = `${gatewayBase}/deliver/sms`;
132
- const bearerToken = mintDaemonDeliveryToken();
133
-
134
- await deliverChannelReply(
135
- deliverUrl,
136
- {
137
- chatId: counterparty.phoneNumber,
138
- text: messageText,
139
- assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
140
- },
141
- bearerToken,
142
- );
143
-
144
- log.info(
145
- { requestId: request.id, counterpartyPhone: counterparty.phoneNumber },
146
- "Follow-up message_back SMS sent successfully",
147
- );
148
-
149
- return { ok: true };
150
- } catch (err) {
151
- const message = err instanceof Error ? err.message : String(err);
152
- log.error(
153
- {
154
- err,
155
- requestId: request.id,
156
- counterpartyPhone: counterparty.phoneNumber,
157
- },
158
- "Failed to send follow-up message_back SMS",
159
- );
160
- return { ok: false, error: message };
161
- }
162
- }
163
-
164
103
  /**
165
104
  * Start an outbound call to the counterparty with context about the
166
105
  * guardian's answer. Uses the existing call start domain flow.
@@ -307,12 +246,11 @@ export async function executeFollowupAction(
307
246
  // Execute the action
308
247
  let actionResult: { ok: true } | { ok: false; error: string };
309
248
 
310
- if (action === "message_back") {
311
- actionResult = await executeMessageBack(request, counterparty, generator);
312
- } else if (action === "call_back") {
249
+ if (action === "call_back") {
313
250
  actionResult = await executeCallBack(request, counterparty);
314
251
  } else {
315
- // decline is already handled in M5 — should not reach the executor
252
+ // decline is already handled in M5 — should not reach the executor.
253
+ // message_back (SMS) is no longer supported.
316
254
  finalizeFollowup(requestId, "failed");
317
255
  const errorText = await composeGuardianActionMessageGenerative(
318
256
  {
@@ -333,10 +271,7 @@ export async function executeFollowupAction(
333
271
  if (actionResult.ok) {
334
272
  finalizeFollowup(requestId, "completed");
335
273
 
336
- const scenario =
337
- action === "message_back"
338
- ? ("followup_message_sent" as const)
339
- : ("followup_call_started" as const);
274
+ const scenario = "followup_call_started" as const;
340
275
  const confirmText = await composeGuardianActionMessageGenerative(
341
276
  {
342
277
  scenario,
@@ -11,7 +11,6 @@ import { mintGrantFromDecision } from "../approvals/approval-primitive.js";
11
11
  import type { GuardianActionRequest } from "../memory/guardian-action-store.js";
12
12
  import { getLogger } from "../util/logger.js";
13
13
  import { runApprovalConversationTurn } from "./approval-conversation-turn.js";
14
- import { parseApprovalDecision } from "./channel-approval-parser.js";
15
14
  import type { ApprovalConversationGenerator } from "./http-types.js";
16
15
 
17
16
  const log = getLogger("guardian-action-grant-minter");
@@ -23,14 +22,13 @@ export const GUARDIAN_ACTION_GRANT_TTL_MS = 5 * 60 * 1000;
23
22
  * Mint a `tool_signature` scoped grant when a guardian-action request is
24
23
  * resolved and the request carries tool metadata (toolName + inputDigest).
25
24
  *
26
- * Uses two-tier classification:
27
- * 1. Deterministic fast path via parseApprovalDecision (exact keyword match).
28
- * 2. LLM fallback via runApprovalConversationTurn when the deterministic
29
- * parser returns null and an approvalConversationGenerator is provided.
25
+ * Classifies the guardian's answer via the conversational approval engine
26
+ * (`runApprovalConversationTurn`). Only `approve_once` produces a grant
27
+ * guardian-action grants are always single-use `tool_signature` scoped.
30
28
  *
31
29
  * Skips silently when:
32
30
  * - The resolved request has no toolName/inputDigest (informational consult).
33
- * - The guardian's answer is not classified as approval by either tier (fail-closed).
31
+ * - The guardian's answer is not classified as approval (fail-closed).
34
32
  *
35
33
  * Fails silently on error -- grant minting is best-effort and must never
36
34
  * block the guardian-action answer flow.
@@ -40,7 +38,7 @@ export async function tryMintGuardianActionGrant(params: {
40
38
  answerText: string;
41
39
  decisionChannel: string;
42
40
  guardianExternalUserId?: string;
43
- approvalConversationGenerator?: ApprovalConversationGenerator;
41
+ approvalConversationGenerator: ApprovalConversationGenerator;
44
42
  }): Promise<void> {
45
43
  const {
46
44
  request,
@@ -56,63 +54,50 @@ export async function tryMintGuardianActionGrant(params: {
56
54
  return;
57
55
  }
58
56
 
59
- // Tier 1: Deterministic fast path -- try exact keyword matching first.
60
- // Guardian-action invariant: grants are always one-time `tool_signature`
61
- // scoped. We treat `approve_always` from the deterministic parser the
62
- // same as `approve_once` -- the grant is still single-use. This keeps
63
- // the guardian-action path aligned with the primary approval interception
64
- // flow where guardians are limited to approve_once / reject.
65
- const decision = parseApprovalDecision(answerText);
66
- let isApproval =
67
- decision?.action === "approve_once" ||
68
- decision?.action === "approve_always";
69
-
70
- // Tier 2: LLM fallback -- when the deterministic parser found no match
71
- // and a generator is available, delegate to the conversational engine.
57
+ // Classify the guardian's answer via the conversational approval engine.
72
58
  // Only allow approve_once (not approve_always) to keep guardian-action
73
59
  // grants strictly one-time and consistent with guardian policy.
74
- if (!isApproval && !decision && approvalConversationGenerator) {
75
- try {
76
- const llmResult = await runApprovalConversationTurn(
77
- {
78
- toolName: request.toolName,
79
- allowedActions: ["approve_once", "reject"],
80
- role: "guardian",
81
- pendingApprovals: [
82
- { requestId: request.id, toolName: request.toolName },
83
- ],
84
- userMessage: answerText,
85
- },
86
- approvalConversationGenerator,
87
- );
60
+ let isApproval = false;
61
+ try {
62
+ const llmResult = await runApprovalConversationTurn(
63
+ {
64
+ toolName: request.toolName,
65
+ allowedActions: ["approve_once", "reject"],
66
+ role: "guardian",
67
+ pendingApprovals: [
68
+ { requestId: request.id, toolName: request.toolName },
69
+ ],
70
+ userMessage: answerText,
71
+ },
72
+ approvalConversationGenerator,
73
+ );
88
74
 
89
- isApproval = llmResult.disposition === "approve_once";
75
+ isApproval = llmResult.disposition === "approve_once";
90
76
 
91
- log.info(
92
- {
93
- event: "guardian_action_grant_llm_fallback",
94
- toolName: request.toolName,
95
- requestId: request.id,
96
- answerText,
97
- llmDisposition: llmResult.disposition,
98
- matched: isApproval,
99
- decisionChannel,
100
- },
101
- `LLM fallback classifier returned disposition: ${llmResult.disposition}`,
102
- );
103
- } catch (err) {
104
- // Fail-closed: generator errors must not produce grants.
105
- log.warn(
106
- {
107
- event: "guardian_action_grant_llm_fallback_error",
108
- toolName: request.toolName,
109
- requestId: request.id,
110
- err,
111
- decisionChannel,
112
- },
113
- "LLM fallback classifier threw an error; treating as non-approval (fail-closed)",
114
- );
115
- }
77
+ log.info(
78
+ {
79
+ event: "guardian_action_grant_classification",
80
+ toolName: request.toolName,
81
+ requestId: request.id,
82
+ answerText,
83
+ llmDisposition: llmResult.disposition,
84
+ matched: isApproval,
85
+ decisionChannel,
86
+ },
87
+ `Approval classifier returned disposition: ${llmResult.disposition}`,
88
+ );
89
+ } catch (err) {
90
+ // Fail-closed: generator errors must not produce grants.
91
+ log.warn(
92
+ {
93
+ event: "guardian_action_grant_classification_error",
94
+ toolName: request.toolName,
95
+ requestId: request.id,
96
+ err,
97
+ decisionChannel,
98
+ },
99
+ "Approval classifier threw an error; treating as non-approval (fail-closed)",
100
+ );
116
101
  }
117
102
 
118
103
  if (!isApproval) {
@@ -122,7 +107,6 @@ export async function tryMintGuardianActionGrant(params: {
122
107
  toolName: request.toolName,
123
108
  requestId: request.id,
124
109
  answerText,
125
- parsedAction: decision?.action ?? null,
126
110
  decisionChannel,
127
111
  },
128
112
  "Skipped grant minting: guardian answer not classified as approval",