@vellumai/assistant 0.4.42 → 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 (840) 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/calls/active-call-lease.ts +207 -0
  261. package/src/calls/call-constants.ts +0 -7
  262. package/src/calls/call-controller.ts +1 -1
  263. package/src/calls/call-conversation-messages.ts +6 -6
  264. package/src/calls/call-domain.ts +73 -38
  265. package/src/calls/call-pointer-message-composer.ts +6 -6
  266. package/src/calls/call-pointer-messages.ts +14 -13
  267. package/src/calls/call-recovery.ts +2 -0
  268. package/src/calls/call-store.ts +21 -28
  269. package/src/calls/guardian-action-sweep.ts +6 -8
  270. package/src/calls/guardian-dispatch.ts +2 -6
  271. package/src/calls/relay-access-wait.ts +4 -4
  272. package/src/calls/relay-server.ts +69 -80
  273. package/src/calls/relay-setup-router.ts +16 -21
  274. package/src/calls/relay-verification.ts +27 -28
  275. package/src/calls/twilio-config.ts +28 -3
  276. package/src/calls/twilio-provider.ts +5 -5
  277. package/src/calls/twilio-rest.ts +26 -27
  278. package/src/calls/twilio-routes.ts +67 -54
  279. package/src/calls/types.ts +8 -8
  280. package/src/calls/voice-ingress-preflight.ts +110 -0
  281. package/src/calls/voice-session-bridge.ts +7 -7
  282. package/src/channels/config.ts +1 -10
  283. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  284. package/src/channels/types.ts +2 -13
  285. package/src/cli/__tests__/notifications.test.ts +1 -1
  286. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  287. package/src/cli/{amazon.ts → commands/amazon/index.ts} +12 -17
  288. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  289. package/src/cli/commands/amazon/session.ts +116 -0
  290. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  291. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  292. package/src/cli/commands/browser-relay.ts +520 -0
  293. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  294. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  295. package/src/cli/{config.ts → commands/config.ts} +3 -5
  296. package/src/cli/{contacts.ts → commands/contacts.ts} +15 -17
  297. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  298. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  299. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  300. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  301. package/src/cli/{email.ts → commands/email.ts} +2 -2
  302. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  303. package/src/cli/{map.ts → commands/map.ts} +85 -93
  304. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  305. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  306. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  307. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  308. package/src/cli/commands/platform.ts +176 -0
  309. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  310. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  311. package/src/cli/commands/skills.ts +498 -0
  312. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  313. package/src/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
  314. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
  315. package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
  316. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
  317. package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
  318. package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
  319. package/src/cli/commands/twitter/router.ts +396 -0
  320. package/src/cli/commands/twitter/session.ts +121 -0
  321. package/src/cli/db.ts +1 -0
  322. package/src/cli/http-client.ts +87 -0
  323. package/src/cli/logger.ts +6 -0
  324. package/src/cli/main-screen.tsx +4 -3
  325. package/src/cli/output.ts +19 -0
  326. package/src/cli/program.ts +29 -27
  327. package/src/cli/reference.ts +27 -37
  328. package/src/cli.ts +452 -240
  329. package/src/config/assistant-feature-flags.ts +3 -15
  330. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  331. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  332. package/src/config/bundled-skills/amazon/SKILL.md +15 -5
  333. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  334. package/src/config/bundled-skills/app-builder/SKILL.md +4 -3
  335. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  336. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  337. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  338. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  339. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  340. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  341. package/src/config/bundled-skills/contacts/SKILL.md +23 -77
  342. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  343. package/src/config/bundled-skills/document/SKILL.md +4 -3
  344. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  345. package/src/config/bundled-skills/doordash/SKILL.md +4 -11
  346. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
  347. package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
  348. package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
  349. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  350. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  351. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  352. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  353. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  354. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  355. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  356. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  357. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  358. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  359. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  360. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  361. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  362. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  363. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  364. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  365. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  366. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  367. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  368. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  369. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  370. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  371. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  372. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  373. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  374. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  375. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  376. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  377. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  378. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  379. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  380. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  381. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  382. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  383. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  384. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  385. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  386. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  387. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  388. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  389. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  390. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  391. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  392. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  393. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  394. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  395. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  396. package/src/config/bundled-skills/twitter/SKILL.md +56 -14
  397. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  398. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  399. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  400. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  401. package/src/config/env-registry.ts +1 -10
  402. package/src/config/feature-flag-registry.json +0 -16
  403. package/src/config/loader.ts +78 -38
  404. package/src/config/schema.ts +143 -106
  405. package/src/config/schemas/channels.ts +80 -0
  406. package/src/config/schemas/heartbeat.ts +51 -0
  407. package/src/config/schemas/inference.ts +136 -0
  408. package/src/config/schemas/ingress.ts +81 -0
  409. package/src/config/schemas/logging.ts +21 -0
  410. package/src/config/schemas/memory-lifecycle.ts +67 -0
  411. package/src/config/schemas/memory-processing.ts +215 -0
  412. package/src/config/schemas/memory-retrieval.ts +222 -0
  413. package/src/config/schemas/memory-storage.ts +83 -0
  414. package/src/config/schemas/memory.ts +58 -0
  415. package/src/config/schemas/platform.ts +64 -0
  416. package/src/config/schemas/security.ts +54 -0
  417. package/src/config/schemas/swarm.ts +50 -0
  418. package/src/config/schemas/timeouts.ts +47 -0
  419. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  420. package/src/config/skill-state.ts +3 -13
  421. package/src/config/skills.ts +196 -75
  422. package/src/config/types.ts +1 -20
  423. package/src/contacts/contact-store.ts +12 -49
  424. package/src/contacts/contacts-write.ts +1 -5
  425. package/src/contacts/index.ts +0 -2
  426. package/src/contacts/types.ts +0 -8
  427. package/src/context/window-manager.ts +73 -14
  428. package/src/daemon/assistant-attachments.ts +9 -0
  429. package/src/daemon/computer-use-session.ts +3 -3
  430. package/src/daemon/connection-policy.ts +6 -21
  431. package/src/daemon/context-overflow-policy.ts +1 -1
  432. package/src/daemon/daemon-control.ts +46 -54
  433. package/src/daemon/doordash-steps.ts +1 -1
  434. package/src/daemon/handlers/config-channels.ts +407 -71
  435. package/src/daemon/handlers/config-ingress.ts +17 -85
  436. package/src/daemon/handlers/config-model.ts +145 -123
  437. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  438. package/src/daemon/handlers/config-telegram.ts +32 -27
  439. package/src/daemon/handlers/config-voice.ts +1 -4
  440. package/src/daemon/handlers/dictation.ts +11 -16
  441. package/src/daemon/handlers/identity.ts +5 -6
  442. package/src/daemon/handlers/pairing.ts +5 -13
  443. package/src/daemon/handlers/recording.ts +97 -199
  444. package/src/daemon/handlers/session-history.ts +110 -96
  445. package/src/daemon/handlers/session-user-message.ts +29 -57
  446. package/src/daemon/handlers/sessions.ts +240 -137
  447. package/src/daemon/handlers/shared.ts +62 -95
  448. package/src/daemon/handlers/skills.ts +492 -543
  449. package/src/daemon/lifecycle.ts +168 -55
  450. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  451. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  452. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  453. package/src/daemon/{ipc-contract → message-types}/integrations.ts +29 -13
  454. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  455. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  456. package/src/daemon/{ipc-contract → message-types}/sessions.ts +1 -0
  457. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  458. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  459. package/src/daemon/providers-setup.ts +0 -5
  460. package/src/daemon/recording-executor.ts +0 -7
  461. package/src/daemon/ride-shotgun-handler.ts +9 -13
  462. package/src/daemon/server.ts +136 -510
  463. package/src/daemon/session-agent-loop-handlers.ts +22 -7
  464. package/src/daemon/session-agent-loop.ts +86 -24
  465. package/src/daemon/session-attachments.ts +1 -1
  466. package/src/daemon/session-error.ts +1 -1
  467. package/src/daemon/session-history.ts +20 -15
  468. package/src/daemon/session-lifecycle.ts +9 -7
  469. package/src/daemon/session-memory.ts +15 -1
  470. package/src/daemon/session-messaging.ts +10 -6
  471. package/src/daemon/session-notifiers.ts +10 -8
  472. package/src/daemon/session-process.ts +34 -25
  473. package/src/daemon/session-queue-manager.ts +1 -1
  474. package/src/daemon/session-runtime-assembly.ts +6 -25
  475. package/src/daemon/session-surfaces.ts +2 -2
  476. package/src/daemon/session-tool-setup.ts +1 -1
  477. package/src/daemon/session-usage.ts +119 -18
  478. package/src/daemon/session.ts +13 -9
  479. package/src/daemon/tool-side-effects.ts +6 -5
  480. package/src/daemon/trace-emitter.ts +1 -1
  481. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  482. package/src/daemon/watch-handler.ts +2 -5
  483. package/src/email/service.ts +8 -8
  484. package/src/events/domain-events.ts +0 -1
  485. package/src/events/tool-notification-listener.ts +1 -1
  486. package/src/followups/followup-store.ts +1 -2
  487. package/src/followups/types.ts +0 -6
  488. package/src/heartbeat/heartbeat-service.ts +1 -1
  489. package/src/inbound/platform-callback-registration.ts +1 -1
  490. package/src/inbound/public-ingress-urls.ts +0 -8
  491. package/src/index.ts +12 -0
  492. package/src/mcp/client.ts +1 -1
  493. package/src/mcp/manager.ts +1 -1
  494. package/src/memory/app-store.ts +1 -42
  495. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  496. package/src/memory/conversation-attention-store.ts +154 -0
  497. package/src/memory/conversation-bootstrap.ts +1 -1
  498. package/src/memory/conversation-crud.ts +53 -1
  499. package/src/memory/conversation-display-order-migration.ts +2 -3
  500. package/src/memory/conversation-queries.ts +1 -29
  501. package/src/memory/conversation-title-service.ts +26 -21
  502. package/src/memory/db-connection.ts +1 -8
  503. package/src/memory/db-init.ts +20 -0
  504. package/src/memory/delivery-crud.ts +4 -34
  505. package/src/memory/external-conversation-store.ts +1 -1
  506. package/src/memory/format-recall.ts +47 -0
  507. package/src/memory/guardian-action-store.ts +4 -5
  508. package/src/memory/guardian-rate-limits.ts +0 -3
  509. package/src/memory/invite-store.ts +1 -1
  510. package/src/memory/job-handlers/backfill.ts +9 -2
  511. package/src/memory/job-handlers/extraction.ts +2 -7
  512. package/src/memory/job-handlers/summarization.ts +1 -1
  513. package/src/memory/llm-usage-store.ts +11 -0
  514. package/src/memory/migrations/114-notifications.ts +12 -40
  515. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  516. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  517. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  518. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  519. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  520. package/src/memory/migrations/index.ts +5 -0
  521. package/src/memory/migrations/registry.ts +30 -0
  522. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  523. package/src/memory/retriever.test.ts +707 -0
  524. package/src/memory/retriever.ts +120 -116
  525. package/src/memory/schema/calls.ts +3 -7
  526. package/src/memory/schema/guardian.ts +2 -2
  527. package/src/memory/search/lexical.ts +4 -1
  528. package/src/memory/search/query-expansion.test.ts +70 -0
  529. package/src/memory/search/query-expansion.ts +118 -0
  530. package/src/memory/search/types.ts +18 -17
  531. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  532. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  533. package/src/messaging/registry.ts +0 -1
  534. package/src/notifications/README.md +13 -22
  535. package/src/notifications/adapters/macos.ts +1 -1
  536. package/src/notifications/conversation-pairing.ts +2 -2
  537. package/src/notifications/copy-composer.ts +2 -2
  538. package/src/notifications/decision-engine.ts +1 -10
  539. package/src/notifications/destination-resolver.ts +2 -3
  540. package/src/notifications/emit-signal.ts +2 -8
  541. package/src/notifications/guardian-question-mode.ts +5 -8
  542. package/src/notifications/signal.ts +1 -2
  543. package/src/notifications/types.ts +1 -1
  544. package/src/oauth/token-persistence.ts +25 -1
  545. package/src/permissions/checker.ts +4 -29
  546. package/src/permissions/defaults.ts +6 -6
  547. package/src/permissions/prompter.ts +1 -1
  548. package/src/permissions/secret-prompter.ts +1 -1
  549. package/src/permissions/shell-identity.ts +1 -1
  550. package/src/permissions/trust-store.ts +13 -76
  551. package/src/permissions/workspace-policy.ts +1 -1
  552. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  553. package/src/{config → prompts}/system-prompt.ts +40 -21
  554. package/src/runtime/AGENTS.md +6 -8
  555. package/src/runtime/access-request-helper.ts +36 -55
  556. package/src/runtime/actor-trust-resolver.ts +1 -24
  557. package/src/runtime/approval-message-composer.ts +6 -2
  558. package/src/runtime/assistant-event.ts +1 -1
  559. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  560. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  561. package/src/runtime/auth/route-policy.ts +140 -24
  562. package/src/runtime/auth/subject.ts +9 -0
  563. package/src/runtime/auth/token-service.ts +11 -0
  564. package/src/runtime/auth/types.ts +1 -1
  565. package/src/runtime/channel-approval-types.ts +1 -1
  566. package/src/runtime/channel-approvals.ts +1 -1
  567. package/src/runtime/channel-invite-transport.ts +0 -2
  568. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  569. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  570. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  571. package/src/runtime/channel-readiness-service.ts +24 -159
  572. package/src/runtime/channel-readiness-types.ts +5 -1
  573. package/src/runtime/channel-reply-delivery.ts +43 -3
  574. package/src/runtime/channel-retry-sweep.ts +14 -22
  575. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  576. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  577. package/src/runtime/gateway-client.ts +12 -15
  578. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  579. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  580. package/src/runtime/guardian-action-message-composer.ts +4 -4
  581. package/src/runtime/guardian-reply-router.ts +3 -3
  582. package/src/runtime/http-server.ts +133 -24
  583. package/src/runtime/http-types.ts +34 -1
  584. package/src/runtime/invite-instruction-generator.ts +1 -3
  585. package/src/runtime/invite-redemption-service.ts +5 -5
  586. package/src/runtime/invite-service.ts +7 -7
  587. package/src/runtime/local-actor-identity.ts +28 -2
  588. package/src/runtime/local-gateway-health.ts +275 -0
  589. package/src/runtime/middleware/twilio-validation.ts +3 -3
  590. package/src/runtime/migrations/migration-transport.ts +18 -3
  591. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  592. package/src/runtime/nl-approval-parser.ts +2 -3
  593. package/src/runtime/routes/access-request-decision.ts +2 -2
  594. package/src/runtime/routes/app-management-routes.ts +921 -0
  595. package/src/runtime/routes/approval-routes.ts +76 -7
  596. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  597. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  598. package/src/runtime/routes/channel-route-shared.ts +1 -3
  599. package/src/runtime/routes/channel-routes.ts +1 -4
  600. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  601. package/src/runtime/routes/computer-use-routes.ts +595 -0
  602. package/src/runtime/routes/contact-routes.ts +1 -317
  603. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  604. package/src/runtime/routes/conversation-routes.ts +11 -18
  605. package/src/runtime/routes/debug-routes.ts +1 -1
  606. package/src/runtime/routes/diagnostics-routes.ts +813 -0
  607. package/src/runtime/routes/documents-routes.ts +227 -0
  608. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  609. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  610. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  611. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  612. package/src/runtime/routes/inbound-conversation.ts +3 -10
  613. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  614. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  615. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  616. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  617. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  618. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  619. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  620. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  621. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  622. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  623. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  624. package/src/runtime/routes/integrations/telegram.ts +111 -0
  625. package/src/runtime/routes/integrations/twilio.ts +451 -0
  626. package/src/runtime/routes/invite-routes.ts +2 -2
  627. package/src/runtime/routes/pairing-routes.ts +1 -1
  628. package/src/runtime/routes/recording-routes.ts +332 -0
  629. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  630. package/src/runtime/routes/session-management-routes.ts +167 -0
  631. package/src/runtime/routes/session-query-routes.ts +204 -0
  632. package/src/runtime/routes/settings-routes.ts +977 -0
  633. package/src/runtime/routes/skills-routes.ts +266 -0
  634. package/src/runtime/routes/subagents-routes.ts +246 -0
  635. package/src/runtime/routes/surface-action-routes.ts +100 -10
  636. package/src/runtime/routes/surface-content-routes.ts +1 -1
  637. package/src/runtime/routes/work-items-routes.ts +809 -0
  638. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  639. package/src/runtime/routes/workspace-routes.ts +410 -0
  640. package/src/runtime/routes/workspace-utils.ts +88 -0
  641. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  642. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  643. package/src/runtime/tool-grant-request-helper.ts +1 -2
  644. package/src/runtime/trust-context-resolver.ts +0 -1
  645. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  646. package/src/runtime/verification-rate-limiter.ts +2 -2
  647. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  648. package/src/schedule/integration-status.ts +2 -2
  649. package/src/schedule/schedule-store.ts +7 -9
  650. package/src/sequence/engine.ts +1 -1
  651. package/src/skills/active-skill-tools.ts +0 -8
  652. package/src/skills/clawhub.ts +1 -10
  653. package/src/skills/managed-store.ts +14 -4
  654. package/src/skills/slash-commands.ts +1 -1
  655. package/src/subagent/manager.ts +1 -1
  656. package/src/subagent/types.ts +1 -1
  657. package/src/tasks/SPEC.md +10 -10
  658. package/src/tasks/task-scheduler.ts +1 -1
  659. package/src/telegram/bot-username.ts +13 -0
  660. package/src/tools/assets/materialize.ts +1 -1
  661. package/src/tools/assets/search.ts +1 -1
  662. package/src/tools/browser/browser-execution.ts +2 -2
  663. package/src/tools/browser/browser-manager.ts +88 -11
  664. package/src/tools/browser/browser-screencast.ts +1 -1
  665. package/src/tools/browser/headless-browser.ts +0 -17
  666. package/src/tools/browser/jit-auth.ts +1 -1
  667. package/src/tools/browser/recording-store.ts +19 -1
  668. package/src/tools/browser/runtime-check.ts +4 -2
  669. package/src/tools/calls/call-start.ts +3 -3
  670. package/src/tools/credentials/metadata-store.ts +0 -13
  671. package/src/tools/credentials/vault.ts +7 -31
  672. package/src/tools/followups/followup_create.ts +0 -8
  673. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  674. package/src/tools/memory/definitions.ts +32 -10
  675. package/src/tools/memory/handlers.test.ts +573 -0
  676. package/src/tools/memory/handlers.ts +222 -65
  677. package/src/tools/memory/register.ts +53 -24
  678. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  679. package/src/tools/schedule/update.ts +0 -8
  680. package/src/tools/skills/load.ts +3 -3
  681. package/src/tools/subagent/read.ts +1 -1
  682. package/src/tools/system/voice-config.ts +2 -14
  683. package/src/tools/terminal/safe-env.ts +5 -18
  684. package/src/tools/tool-approval-handler.ts +4 -4
  685. package/src/tools/tool-manifest.ts +4 -2
  686. package/src/tools/types.ts +1 -1
  687. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  688. package/src/twitter/platform-proxy-client.ts +405 -0
  689. package/src/usage/types.ts +21 -0
  690. package/src/util/canonicalize-identity.ts +2 -6
  691. package/src/util/cookie-session.ts +35 -51
  692. package/src/util/platform.ts +93 -86
  693. package/src/util/pricing.ts +180 -43
  694. package/src/work-items/work-item-runner.ts +1 -1
  695. package/scripts/ipc/check-contract-inventory.ts +0 -107
  696. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  697. package/scripts/ipc/generate-swift.ts +0 -528
  698. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  699. package/src/__tests__/app-migration.test.ts +0 -148
  700. package/src/__tests__/config-loader-migration.test.ts +0 -85
  701. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  702. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  703. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  704. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  705. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  706. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  707. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  708. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  709. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  710. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  711. package/src/__tests__/integrations-cli.test.ts +0 -232
  712. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  713. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  714. package/src/__tests__/ipc-contract.test.ts +0 -76
  715. package/src/__tests__/ipc-protocol.test.ts +0 -120
  716. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  717. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  718. package/src/__tests__/ipc-validate.test.ts +0 -471
  719. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  720. package/src/__tests__/migration-ordering.test.ts +0 -267
  721. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  722. package/src/__tests__/platform-move-helper.test.ts +0 -108
  723. package/src/__tests__/platform-socket-path.test.ts +0 -52
  724. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  725. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  726. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  727. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  728. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  729. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  730. package/src/__tests__/work-item-output.test.ts +0 -150
  731. package/src/amazon/session.ts +0 -58
  732. package/src/cli/channels.ts +0 -51
  733. package/src/cli/influencer.ts +0 -319
  734. package/src/cli/integrations.ts +0 -372
  735. package/src/cli/ipc-client.ts +0 -88
  736. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  737. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  738. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  739. package/src/config/core-schema.ts +0 -434
  740. package/src/config/memory-schema.ts +0 -617
  741. package/src/daemon/auth-manager.ts +0 -106
  742. package/src/daemon/handlers/apps.ts +0 -783
  743. package/src/daemon/handlers/avatar.ts +0 -73
  744. package/src/daemon/handlers/browser.ts +0 -3
  745. package/src/daemon/handlers/computer-use.ts +0 -231
  746. package/src/daemon/handlers/config-dispatch.ts +0 -29
  747. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  748. package/src/daemon/handlers/config-inbox.ts +0 -457
  749. package/src/daemon/handlers/config-integrations.ts +0 -409
  750. package/src/daemon/handlers/config-platform.ts +0 -77
  751. package/src/daemon/handlers/config-slack.ts +0 -41
  752. package/src/daemon/handlers/config-tools.ts +0 -226
  753. package/src/daemon/handlers/config-trust.ts +0 -135
  754. package/src/daemon/handlers/config.ts +0 -64
  755. package/src/daemon/handlers/contacts.ts +0 -193
  756. package/src/daemon/handlers/diagnostics.ts +0 -382
  757. package/src/daemon/handlers/documents.ts +0 -188
  758. package/src/daemon/handlers/guardian-actions.ts +0 -82
  759. package/src/daemon/handlers/home-base.ts +0 -82
  760. package/src/daemon/handlers/index.ts +0 -222
  761. package/src/daemon/handlers/misc.ts +0 -1139
  762. package/src/daemon/handlers/navigate-settings.ts +0 -29
  763. package/src/daemon/handlers/oauth-connect.ts +0 -202
  764. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  765. package/src/daemon/handlers/publish.ts +0 -176
  766. package/src/daemon/handlers/signing.ts +0 -56
  767. package/src/daemon/handlers/subagents.ts +0 -286
  768. package/src/daemon/handlers/twitter-auth.ts +0 -220
  769. package/src/daemon/handlers/work-items.ts +0 -796
  770. package/src/daemon/handlers/workspace-files.ts +0 -84
  771. package/src/daemon/handlers.ts +0 -16
  772. package/src/daemon/ipc-blob-store.ts +0 -246
  773. package/src/daemon/ipc-contract-inventory.json +0 -348
  774. package/src/daemon/ipc-contract-inventory.ts +0 -202
  775. package/src/daemon/ipc-handler.ts +0 -120
  776. package/src/daemon/ipc-protocol.ts +0 -85
  777. package/src/daemon/ipc-validate.ts +0 -254
  778. package/src/memory/app-migration.ts +0 -114
  779. package/src/memory/channel-delivery-store.ts +0 -40
  780. package/src/memory/channel-guardian-store.ts +0 -83
  781. package/src/memory/conversation-store.ts +0 -102
  782. package/src/memory/schema-migration.ts +0 -38
  783. package/src/messaging/providers/sms/adapter.ts +0 -232
  784. package/src/messaging/providers/sms/client.ts +0 -93
  785. package/src/messaging/providers/sms/types.ts +0 -7
  786. package/src/migrations/config-merge.ts +0 -62
  787. package/src/migrations/data-layout.ts +0 -89
  788. package/src/migrations/data-merge.ts +0 -44
  789. package/src/migrations/hooks-merge.ts +0 -118
  790. package/src/migrations/index.ts +0 -6
  791. package/src/migrations/log.ts +0 -28
  792. package/src/migrations/skills-merge.ts +0 -44
  793. package/src/migrations/workspace-layout.ts +0 -94
  794. package/src/notifications/adapters/sms.ts +0 -94
  795. package/src/runtime/channel-approval-parser.ts +0 -123
  796. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  797. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  798. package/src/runtime/routes/integration-routes.ts +0 -381
  799. package/src/runtime/routes/twilio-routes.ts +0 -1251
  800. package/src/twitter/router.ts +0 -131
  801. package/src/twitter/session.ts +0 -54
  802. package/src/watcher/providers/slack.ts +0 -282
  803. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  804. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  805. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  806. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  807. /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
  808. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  809. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  810. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  811. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  812. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  813. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  814. /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
  815. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  816. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  817. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  818. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  819. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  820. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  821. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  822. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  823. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  824. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  825. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  826. /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
  827. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  828. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  829. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  830. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  831. /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
  832. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  833. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  834. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  835. /package/src/{config → prompts}/templates/USER.md +0 -0
  836. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  837. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  838. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  839. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  840. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -29,8 +29,6 @@ mock.module("../util/platform.js", () => ({
29
29
  getDbPath: () => join(testDir, "test.db"),
30
30
  getLogPath: () => join(testDir, "test.log"),
31
31
  ensureDataDir: () => {},
32
- migrateToDataLayout: () => {},
33
- migrateToWorkspaceLayout: () => {},
34
32
  }));
35
33
 
36
34
  mock.module("../util/logger.js", () => ({
@@ -159,6 +157,23 @@ function clearTables(): void {
159
157
  }
160
158
  }
161
159
 
160
+ // ── Shared mock generators ──────────────────────────────────────────
161
+
162
+ const approveOnceGenerator: ApprovalConversationGenerator = async () => ({
163
+ disposition: "approve_once",
164
+ replyText: "Approved.",
165
+ });
166
+
167
+ const rejectGenerator: ApprovalConversationGenerator = async () => ({
168
+ disposition: "reject",
169
+ replyText: "Denied.",
170
+ });
171
+
172
+ const keepPendingGenerator: ApprovalConversationGenerator = async () => ({
173
+ disposition: "keep_pending",
174
+ replyText: "Could you clarify?",
175
+ });
176
+
162
177
  // ── Tests ───────────────────────────────────────────────────────────
163
178
 
164
179
  describe("guardian-action grant mint -> voice consume integration", () => {
@@ -174,7 +189,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
174
189
  // (simulates the voice ASK_GUARDIAN path)
175
190
  const request = createGuardianActionRequest({
176
191
  kind: "ask_guardian",
177
- sourceChannel: "voice",
192
+ sourceChannel: "phone",
178
193
  sourceConversationId: CONVERSATION_ID,
179
194
  callSessionId: CALL_SESSION_ID,
180
195
  pendingQuestionId: nextPendingQuestionId(),
@@ -204,6 +219,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
204
219
  answerText: "yes",
205
220
  decisionChannel: "telegram",
206
221
  guardianExternalUserId: "guardian-user-123",
222
+ approvalConversationGenerator: approveOnceGenerator,
207
223
  });
208
224
 
209
225
  // Verify the grant was created
@@ -221,7 +237,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
221
237
  toolName: TOOL_NAME,
222
238
  inputDigest,
223
239
  consumingRequestId: "voice-req-1",
224
- executionChannel: "voice",
240
+ executionChannel: "phone",
225
241
  callSessionId: CALL_SESSION_ID,
226
242
  conversationId: CONVERSATION_ID,
227
243
  });
@@ -235,7 +251,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
235
251
  toolName: TOOL_NAME,
236
252
  inputDigest,
237
253
  consumingRequestId: "voice-req-2",
238
- executionChannel: "voice",
254
+ executionChannel: "phone",
239
255
  callSessionId: CALL_SESSION_ID,
240
256
  conversationId: CONVERSATION_ID,
241
257
  });
@@ -247,7 +263,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
247
263
  // Create a request without toolName/inputDigest (informational consult)
248
264
  const request = createGuardianActionRequest({
249
265
  kind: "ask_guardian",
250
- sourceChannel: "voice",
266
+ sourceChannel: "phone",
251
267
  sourceConversationId: CONVERSATION_ID,
252
268
  callSessionId: CALL_SESSION_ID,
253
269
  pendingQuestionId: nextPendingQuestionId(),
@@ -267,6 +283,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
267
283
  request: resolved!,
268
284
  answerText: "Tell them to call back",
269
285
  decisionChannel: "vellum",
286
+ approvalConversationGenerator: approveOnceGenerator,
270
287
  });
271
288
 
272
289
  // No grant should have been created
@@ -280,7 +297,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
280
297
 
281
298
  const request = createGuardianActionRequest({
282
299
  kind: "ask_guardian",
283
- sourceChannel: "voice",
300
+ sourceChannel: "phone",
284
301
  sourceConversationId: CONVERSATION_ID,
285
302
  callSessionId: CALL_SESSION_ID,
286
303
  pendingQuestionId: nextPendingQuestionId(),
@@ -303,6 +320,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
303
320
  request: resolved!,
304
321
  answerText: "approve",
305
322
  decisionChannel: "vellum",
323
+ approvalConversationGenerator: approveOnceGenerator,
306
324
  });
307
325
 
308
326
  // The grant should have executionChannel: null (wildcard), so voice can consume
@@ -310,7 +328,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
310
328
  toolName: TOOL_NAME,
311
329
  inputDigest,
312
330
  consumingRequestId: "voice-req-desktop",
313
- executionChannel: "voice",
331
+ executionChannel: "phone",
314
332
  callSessionId: CALL_SESSION_ID,
315
333
  conversationId: CONVERSATION_ID,
316
334
  });
@@ -322,7 +340,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
322
340
 
323
341
  const request = createGuardianActionRequest({
324
342
  kind: "ask_guardian",
325
- sourceChannel: "voice",
343
+ sourceChannel: "phone",
326
344
  sourceConversationId: CONVERSATION_ID,
327
345
  callSessionId: CALL_SESSION_ID,
328
346
  pendingQuestionId: nextPendingQuestionId(),
@@ -346,6 +364,7 @@ describe("guardian-action grant mint -> voice consume integration", () => {
346
364
  answerText: "No",
347
365
  decisionChannel: "telegram",
348
366
  guardianExternalUserId: "guardian-user-456",
367
+ approvalConversationGenerator: rejectGenerator,
349
368
  });
350
369
 
351
370
  // No grant should have been created for a denial
@@ -354,131 +373,57 @@ describe("guardian-action grant mint -> voice consume integration", () => {
354
373
  expect(grants.length).toBe(0);
355
374
  });
356
375
 
357
- test.each(["no", "reject", "deny", "cancel"])(
358
- "no grant minted for denial keyword: %s",
359
- async (denialWord) => {
360
- const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
361
-
362
- const request = createGuardianActionRequest({
363
- kind: "ask_guardian",
364
- sourceChannel: "voice",
365
- sourceConversationId: CONVERSATION_ID,
366
- callSessionId: CALL_SESSION_ID,
367
- pendingQuestionId: nextPendingQuestionId(),
368
- questionText: "Permission to execute?",
369
- expiresAt: Date.now() + 60_000,
370
- toolName: TOOL_NAME,
371
- inputDigest,
372
- });
373
-
374
- const resolved = resolveGuardianActionRequest(
375
- request.id,
376
- denialWord,
377
- "telegram",
378
- );
379
- expect(resolved).not.toBeNull();
380
-
381
- await tryMintGuardianActionGrant({
382
- request: resolved!,
383
- answerText: denialWord,
384
- decisionChannel: "telegram",
385
- });
386
-
387
- const db = getDb();
388
- const grants = db.select().from(scopedApprovalGrants).all();
389
- expect(grants.length).toBe(0);
390
- },
391
- );
392
-
393
- test("no grant minted for unrecognised free-form answer without generator (fail-closed)", async () => {
376
+ test("no grant minted when classifier returns reject", async () => {
394
377
  const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
395
378
 
396
379
  const request = createGuardianActionRequest({
397
380
  kind: "ask_guardian",
398
- sourceChannel: "voice",
381
+ sourceChannel: "phone",
399
382
  sourceConversationId: CONVERSATION_ID,
400
383
  callSessionId: CALL_SESSION_ID,
401
384
  pendingQuestionId: nextPendingQuestionId(),
402
- questionText: "Can I run the command?",
385
+ questionText: "Permission to execute?",
403
386
  expiresAt: Date.now() + 60_000,
404
387
  toolName: TOOL_NAME,
405
388
  inputDigest,
406
389
  });
407
390
 
408
- // Free-form text that doesn't match a known approval phrase
409
391
  const resolved = resolveGuardianActionRequest(
410
392
  request.id,
411
- "Sure, go ahead and run it",
393
+ "deny",
412
394
  "telegram",
413
395
  );
414
396
  expect(resolved).not.toBeNull();
415
397
 
416
398
  await tryMintGuardianActionGrant({
417
399
  request: resolved!,
418
- answerText: "Sure, go ahead and run it",
400
+ answerText: "deny",
419
401
  decisionChannel: "telegram",
402
+ approvalConversationGenerator: rejectGenerator,
420
403
  });
421
404
 
422
- // No grant — unrecognised text is not treated as approval (fail-closed)
423
405
  const db = getDb();
424
406
  const grants = db.select().from(scopedApprovalGrants).all();
425
407
  expect(grants.length).toBe(0);
426
408
  });
427
-
428
- test.each(["yes", "approve", "approve once", "allow", "go ahead"])(
429
- "grant IS minted for approval keyword: %s",
430
- async (approveWord) => {
431
- const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
432
-
433
- const request = createGuardianActionRequest({
434
- kind: "ask_guardian",
435
- sourceChannel: "voice",
436
- sourceConversationId: CONVERSATION_ID,
437
- callSessionId: CALL_SESSION_ID,
438
- pendingQuestionId: nextPendingQuestionId(),
439
- questionText: "Can I run the command?",
440
- expiresAt: Date.now() + 60_000,
441
- toolName: TOOL_NAME,
442
- inputDigest,
443
- });
444
-
445
- const resolved = resolveGuardianActionRequest(
446
- request.id,
447
- approveWord,
448
- "telegram",
449
- );
450
- expect(resolved).not.toBeNull();
451
-
452
- await tryMintGuardianActionGrant({
453
- request: resolved!,
454
- answerText: approveWord,
455
- decisionChannel: "telegram",
456
- });
457
-
458
- const db = getDb();
459
- const grants = db.select().from(scopedApprovalGrants).all();
460
- expect(grants.length).toBe(1);
461
- expect(grants[0].toolName).toBe(TOOL_NAME);
462
- },
463
- );
464
409
  });
465
410
 
466
411
  // ---------------------------------------------------------------------------
467
- // LLM fallback two-tier classification tests
412
+ // Conversational engine classification tests
468
413
  // ---------------------------------------------------------------------------
469
414
 
470
- describe("guardian-action grant minter: two-tier classification (deterministic + LLM fallback)", () => {
415
+ describe("guardian-action grant minter: conversational engine classification", () => {
471
416
  beforeEach(() => {
472
417
  clearTables();
473
418
  ensureFkParents();
474
419
  });
475
420
 
476
- test("deterministic parser works for exact phrases without needing the generator", async () => {
421
+ test("approval via conversational engine mints a grant", async () => {
477
422
  const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
478
423
 
479
424
  const request = createGuardianActionRequest({
480
425
  kind: "ask_guardian",
481
- sourceChannel: "voice",
426
+ sourceChannel: "phone",
482
427
  sourceConversationId: CONVERSATION_ID,
483
428
  callSessionId: CALL_SESSION_ID,
484
429
  pendingQuestionId: nextPendingQuestionId(),
@@ -495,16 +440,11 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
495
440
  );
496
441
  expect(resolved).not.toBeNull();
497
442
 
498
- // Provide a generator that should NOT be called (deterministic match first)
499
- const generatorSpy: ApprovalConversationGenerator = async () => {
500
- throw new Error("Generator should not be called for exact phrase match");
501
- };
502
-
503
443
  await tryMintGuardianActionGrant({
504
444
  request: resolved!,
505
445
  answerText: "yes",
506
446
  decisionChannel: "telegram",
507
- approvalConversationGenerator: generatorSpy,
447
+ approvalConversationGenerator: approveOnceGenerator,
508
448
  });
509
449
 
510
450
  const db = getDb();
@@ -513,12 +453,12 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
513
453
  expect(grants[0].toolName).toBe(TOOL_NAME);
514
454
  });
515
455
 
516
- test("free-form approval via LLM fallback mints a grant", async () => {
456
+ test("free-form approval via conversational engine mints a grant", async () => {
517
457
  const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
518
458
 
519
459
  const request = createGuardianActionRequest({
520
460
  kind: "ask_guardian",
521
- sourceChannel: "voice",
461
+ sourceChannel: "phone",
522
462
  sourceConversationId: CONVERSATION_ID,
523
463
  callSessionId: CALL_SESSION_ID,
524
464
  pendingQuestionId: nextPendingQuestionId(),
@@ -535,16 +475,11 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
535
475
  );
536
476
  expect(resolved).not.toBeNull();
537
477
 
538
- const mockGenerator: ApprovalConversationGenerator = async () => ({
539
- disposition: "approve_once",
540
- replyText: "Approved.",
541
- });
542
-
543
478
  await tryMintGuardianActionGrant({
544
479
  request: resolved!,
545
480
  answerText: "Sure, go ahead and run it",
546
481
  decisionChannel: "telegram",
547
- approvalConversationGenerator: mockGenerator,
482
+ approvalConversationGenerator: approveOnceGenerator,
548
483
  });
549
484
 
550
485
  const db = getDb();
@@ -558,7 +493,7 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
558
493
 
559
494
  const request = createGuardianActionRequest({
560
495
  kind: "ask_guardian",
561
- sourceChannel: "voice",
496
+ sourceChannel: "phone",
562
497
  sourceConversationId: CONVERSATION_ID,
563
498
  callSessionId: CALL_SESSION_ID,
564
499
  pendingQuestionId: nextPendingQuestionId(),
@@ -575,16 +510,11 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
575
510
  );
576
511
  expect(resolved).not.toBeNull();
577
512
 
578
- const mockGenerator: ApprovalConversationGenerator = async () => ({
579
- disposition: "keep_pending",
580
- replyText: "Could you clarify?",
581
- });
582
-
583
513
  await tryMintGuardianActionGrant({
584
514
  request: resolved!,
585
515
  answerText: "I'm not sure about this",
586
516
  decisionChannel: "telegram",
587
- approvalConversationGenerator: mockGenerator,
517
+ approvalConversationGenerator: keepPendingGenerator,
588
518
  });
589
519
 
590
520
  const db = getDb();
@@ -597,7 +527,7 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
597
527
 
598
528
  const request = createGuardianActionRequest({
599
529
  kind: "ask_guardian",
600
- sourceChannel: "voice",
530
+ sourceChannel: "phone",
601
531
  sourceConversationId: CONVERSATION_ID,
602
532
  callSessionId: CALL_SESSION_ID,
603
533
  pendingQuestionId: nextPendingQuestionId(),
@@ -630,88 +560,12 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
630
560
  expect(grants.length).toBe(0);
631
561
  });
632
562
 
633
- test("no generator provided and unrecognised text produces no grant", async () => {
634
- const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
635
-
636
- const request = createGuardianActionRequest({
637
- kind: "ask_guardian",
638
- sourceChannel: "voice",
639
- sourceConversationId: CONVERSATION_ID,
640
- callSessionId: CALL_SESSION_ID,
641
- pendingQuestionId: nextPendingQuestionId(),
642
- questionText: "Can I run the command?",
643
- expiresAt: Date.now() + 60_000,
644
- toolName: TOOL_NAME,
645
- inputDigest,
646
- });
647
-
648
- const resolved = resolveGuardianActionRequest(
649
- request.id,
650
- "Sure, go ahead and run it",
651
- "telegram",
652
- );
653
- expect(resolved).not.toBeNull();
654
-
655
- // No generator provided — behaves like before, no LLM fallback
656
- await tryMintGuardianActionGrant({
657
- request: resolved!,
658
- answerText: "Sure, go ahead and run it",
659
- decisionChannel: "telegram",
660
- });
661
-
662
- const db = getDb();
663
- const grants = db.select().from(scopedApprovalGrants).all();
664
- expect(grants.length).toBe(0);
665
- });
666
-
667
- test('deterministic "approve always" still mints a one-time grant (normalized to approve_once semantics)', async () => {
668
- const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
669
-
670
- const request = createGuardianActionRequest({
671
- kind: "ask_guardian",
672
- sourceChannel: "voice",
673
- sourceConversationId: CONVERSATION_ID,
674
- callSessionId: CALL_SESSION_ID,
675
- pendingQuestionId: nextPendingQuestionId(),
676
- questionText: "Can I run the command?",
677
- expiresAt: Date.now() + 60_000,
678
- toolName: TOOL_NAME,
679
- inputDigest,
680
- });
681
-
682
- const resolved = resolveGuardianActionRequest(
683
- request.id,
684
- "approve always",
685
- "telegram",
686
- );
687
- expect(resolved).not.toBeNull();
688
-
689
- // Generator should NOT be called -- deterministic parser matches "approve always"
690
- const generatorSpy: ApprovalConversationGenerator = async () => {
691
- throw new Error("Generator should not be called for deterministic match");
692
- };
693
-
694
- await tryMintGuardianActionGrant({
695
- request: resolved!,
696
- answerText: "approve always",
697
- decisionChannel: "telegram",
698
- approvalConversationGenerator: generatorSpy,
699
- });
700
-
701
- // Grant is minted (approve_always treated as approval), but it is still
702
- // a one-time tool_signature grant -- no broader privilege is granted.
703
- const db = getDb();
704
- const grants = db.select().from(scopedApprovalGrants).all();
705
- expect(grants.length).toBe(1);
706
- expect(grants[0].scopeMode).toBe("tool_signature");
707
- });
708
-
709
- test("LLM fallback allowedActions excludes approve_always (guardian invariant)", async () => {
563
+ test("allowedActions excludes approve_always (guardian invariant)", async () => {
710
564
  const inputDigest = computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT);
711
565
 
712
566
  const request = createGuardianActionRequest({
713
567
  kind: "ask_guardian",
714
- sourceChannel: "voice",
568
+ sourceChannel: "phone",
715
569
  sourceConversationId: CONVERSATION_ID,
716
570
  callSessionId: CALL_SESSION_ID,
717
571
  pendingQuestionId: nextPendingQuestionId(),
@@ -743,7 +597,7 @@ describe("guardian-action grant minter: two-tier classification (deterministic +
743
597
  approvalConversationGenerator: mockGenerator,
744
598
  });
745
599
 
746
- // No grant -- approve_always is not in LLM fallback allowedActions,
600
+ // No grant -- approve_always is not in allowedActions,
747
601
  // so the disposition gets normalized to keep_pending (fail-closed).
748
602
  const db = getDb();
749
603
  const grants = db.select().from(scopedApprovalGrants).all();
@@ -94,7 +94,7 @@ function createExpiredRequest(
94
94
  const pq = createPendingQuestion(session.id, "What is the gate code?");
95
95
  const request = createGuardianActionRequest({
96
96
  kind: "ask_guardian",
97
- sourceChannel: "voice",
97
+ sourceChannel: "phone",
98
98
  sourceConversationId: convId,
99
99
  callSessionId: session.id,
100
100
  pendingQuestionId: pq.id,
@@ -162,7 +162,7 @@ describe("guardian-action-late-reply", () => {
162
162
  test("getExpiredDeliveriesByDestination returns empty for non-matching channel", () => {
163
163
  createExpiredRequest("conv-late-2", { chatId: "chat-abc" });
164
164
 
165
- const deliveries = getExpiredDeliveriesByDestination("sms", "chat-abc");
165
+ const deliveries = getExpiredDeliveriesByDestination("phone", "chat-abc");
166
166
  expect(deliveries).toHaveLength(0);
167
167
  });
168
168
 
@@ -250,7 +250,7 @@ describe("guardian-action-late-reply", () => {
250
250
  const pq = createPendingQuestion(session.id, "Still pending question");
251
251
  const request = createGuardianActionRequest({
252
252
  kind: "ask_guardian",
253
- sourceChannel: "voice",
253
+ sourceChannel: "phone",
254
254
  sourceConversationId: convId,
255
255
  callSessionId: session.id,
256
256
  pendingQuestionId: pq.id,
@@ -276,7 +276,7 @@ describe("guardian-action-late-reply", () => {
276
276
  const pq = createPendingQuestion(session.id, "Already answered question");
277
277
  const request = createGuardianActionRequest({
278
278
  kind: "ask_guardian",
279
- sourceChannel: "voice",
279
+ sourceChannel: "phone",
280
280
  sourceConversationId: convId,
281
281
  callSessionId: session.id,
282
282
  pendingQuestionId: pq.id,
@@ -364,7 +364,7 @@ describe("guardian-action-late-reply", () => {
364
364
  );
365
365
  const request = createGuardianActionRequest({
366
366
  kind: "ask_guardian",
367
- sourceChannel: "voice",
367
+ sourceChannel: "phone",
368
368
  sourceConversationId: sourceConvId,
369
369
  callSessionId: session.id,
370
370
  pendingQuestionId: pq.id,
@@ -522,7 +522,7 @@ describe("guardian-action-late-reply", () => {
522
522
  );
523
523
  const oldRequest = createGuardianActionRequest({
524
524
  kind: "ask_guardian",
525
- sourceChannel: "voice",
525
+ sourceChannel: "phone",
526
526
  sourceConversationId: convId,
527
527
  callSessionId: session.id,
528
528
  pendingQuestionId: pqOld.id,
@@ -556,7 +556,7 @@ describe("guardian-action-late-reply", () => {
556
556
  );
557
557
  const newRequest = createGuardianActionRequest({
558
558
  kind: "ask_guardian",
559
- sourceChannel: "voice",
559
+ sourceChannel: "phone",
560
560
  sourceConversationId: convId,
561
561
  callSessionId: session.id,
562
562
  pendingQuestionId: pqNew.id,
@@ -643,7 +643,7 @@ describe("guardian-action-late-reply", () => {
643
643
  const pq = createPendingQuestion(session.id, "What is the code?");
644
644
  const request = createGuardianActionRequest({
645
645
  kind: "ask_guardian",
646
- sourceChannel: "voice",
646
+ sourceChannel: "phone",
647
647
  sourceConversationId: convId,
648
648
  callSessionId: session.id,
649
649
  pendingQuestionId: pq.id,
@@ -696,7 +696,7 @@ describe("guardian-action-late-reply", () => {
696
696
  const pq = createPendingQuestion(session.id, "What is the code?");
697
697
  const request = createGuardianActionRequest({
698
698
  kind: "ask_guardian",
699
- sourceChannel: "voice",
699
+ sourceChannel: "phone",
700
700
  sourceConversationId: convId,
701
701
  callSessionId: session.id,
702
702
  pendingQuestionId: pq.id,
@@ -806,7 +806,7 @@ describe("guardian-action-late-reply", () => {
806
806
  );
807
807
  const request = createGuardianActionRequest({
808
808
  kind: "ask_guardian",
809
- sourceChannel: "voice",
809
+ sourceChannel: "phone",
810
810
  sourceConversationId: sourceConvId,
811
811
  callSessionId: session.id,
812
812
  pendingQuestionId: pq.id,
@@ -905,7 +905,7 @@ describe("guardian-action-late-reply", () => {
905
905
  const pqOld = createPendingQuestion(session.id, "Old question?");
906
906
  const oldRequest = createGuardianActionRequest({
907
907
  kind: "ask_guardian",
908
- sourceChannel: "voice",
908
+ sourceChannel: "phone",
909
909
  sourceConversationId: convId,
910
910
  callSessionId: session.id,
911
911
  pendingQuestionId: pqOld.id,
@@ -930,7 +930,7 @@ describe("guardian-action-late-reply", () => {
930
930
  const pqNew = createPendingQuestion(session.id, "New question?");
931
931
  const newRequest = createGuardianActionRequest({
932
932
  kind: "ask_guardian",
933
- sourceChannel: "voice",
933
+ sourceChannel: "phone",
934
934
  sourceConversationId: convId,
935
935
  callSessionId: session.id,
936
936
  pendingQuestionId: pqNew.id,
@@ -101,7 +101,7 @@ describe("guardian-action-store", () => {
101
101
  const pq = createPendingQuestion(session.id, `Question for ${convId}`);
102
102
  const request = createGuardianActionRequest({
103
103
  kind: "ask_guardian",
104
- sourceChannel: "voice",
104
+ sourceChannel: "phone",
105
105
  sourceConversationId: convId,
106
106
  callSessionId: session.id,
107
107
  pendingQuestionId: pq.id,
@@ -319,7 +319,7 @@ describe("guardian-action-store", () => {
319
319
 
320
320
  const request = createGuardianActionRequest({
321
321
  kind: "ask_guardian",
322
- sourceChannel: "voice",
322
+ sourceChannel: "phone",
323
323
  sourceConversationId: conversationId,
324
324
  callSessionId: session.id,
325
325
  pendingQuestionId: pendingQuestion.id,
@@ -112,7 +112,7 @@ describe("guardian-action-sweep", () => {
112
112
  // Create request that has already expired
113
113
  const request = createGuardianActionRequest({
114
114
  kind: "ask_guardian",
115
- sourceChannel: "voice",
115
+ sourceChannel: "phone",
116
116
  sourceConversationId: convId,
117
117
  callSessionId: session.id,
118
118
  pendingQuestionId: pq.id,
@@ -158,7 +158,7 @@ describe("guardian-action-sweep", () => {
158
158
 
159
159
  createGuardianActionRequest({
160
160
  kind: "ask_guardian",
161
- sourceChannel: "voice",
161
+ sourceChannel: "phone",
162
162
  sourceConversationId: convId,
163
163
  callSessionId: session.id,
164
164
  pendingQuestionId: pq.id,
@@ -190,7 +190,7 @@ describe("guardian-action-sweep", () => {
190
190
  // Request that expires in the future
191
191
  const request = createGuardianActionRequest({
192
192
  kind: "ask_guardian",
193
- sourceChannel: "voice",
193
+ sourceChannel: "phone",
194
194
  sourceConversationId: convId,
195
195
  callSessionId: session.id,
196
196
  pendingQuestionId: pq.id,
@@ -219,7 +219,7 @@ describe("guardian-action-sweep", () => {
219
219
 
220
220
  const request = createGuardianActionRequest({
221
221
  kind: "ask_guardian",
222
- sourceChannel: "voice",
222
+ sourceChannel: "phone",
223
223
  sourceConversationId: convId,
224
224
  callSessionId: session.id,
225
225
  pendingQuestionId: pq.id,
@@ -257,7 +257,7 @@ describe("guardian-action-sweep", () => {
257
257
 
258
258
  const request = createGuardianActionRequest({
259
259
  kind: "ask_guardian",
260
- sourceChannel: "voice",
260
+ sourceChannel: "phone",
261
261
  sourceConversationId: convId,
262
262
  callSessionId: session.id,
263
263
  pendingQuestionId: pq.id,
@@ -15,8 +15,6 @@ mock.module("../util/platform.js", () => ({
15
15
  getDbPath: () => join(testDir, "test.db"),
16
16
  getLogPath: () => join(testDir, "test.log"),
17
17
  ensureDataDir: () => {},
18
- migrateToDataLayout: () => {},
19
- migrateToWorkspaceLayout: () => {},
20
18
  }));
21
19
 
22
20
  mock.module("../util/logger.js", () => ({
@@ -533,7 +531,7 @@ describe("applyCanonicalGuardianDecision", () => {
533
531
  const req = createCanonicalGuardianRequest({
534
532
  kind: "unknown_kind",
535
533
  sourceType: "voice",
536
- sourceChannel: "voice",
534
+ sourceChannel: "phone",
537
535
  conversationId: "conv-voice-1",
538
536
  callSessionId: "call-voice-1",
539
537
  toolName: "host_bash",