@vellumai/assistant 0.4.26 → 0.4.29

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 (1301) hide show
  1. package/.env.example +2 -2
  2. package/AGENTS.md +5 -0
  3. package/ARCHITECTURE.md +169 -69
  4. package/Dockerfile +1 -1
  5. package/README.md +111 -112
  6. package/bun.lock +0 -3
  7. package/docs/architecture/integrations.md +0 -1
  8. package/docs/architecture/memory.md +100 -63
  9. package/docs/error-handling.md +71 -0
  10. package/docs/runbook-trusted-contacts.md +10 -9
  11. package/docs/trusted-contact-access.md +48 -46
  12. package/package.json +3 -3
  13. package/scripts/compare-benchmarks.sh +12 -5
  14. package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
  15. package/scripts/test.sh +89 -5
  16. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
  17. package/src/__tests__/access-request-decision.test.ts +0 -1
  18. package/src/__tests__/account-registry.test.ts +1 -1
  19. package/src/__tests__/actor-token-service.test.ts +36 -23
  20. package/src/__tests__/agent-loop-thinking.test.ts +29 -13
  21. package/src/__tests__/agent-loop.test.ts +2 -1
  22. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
  23. package/src/__tests__/approval-routes-http.test.ts +2 -2
  24. package/src/__tests__/asset-materialize-tool.test.ts +7 -7
  25. package/src/__tests__/asset-search-tool.test.ts +7 -7
  26. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  27. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
  28. package/src/__tests__/call-controller.test.ts +99 -69
  29. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  30. package/src/__tests__/channel-approval-routes.test.ts +113 -70
  31. package/src/__tests__/channel-guardian.test.ts +173 -282
  32. package/src/__tests__/channel-readiness-service.test.ts +6 -2
  33. package/src/__tests__/channel-reply-delivery.test.ts +2 -2
  34. package/src/__tests__/channel-retry-sweep.test.ts +14 -14
  35. package/src/__tests__/checker.test.ts +12 -31
  36. package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
  37. package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
  38. package/src/__tests__/compaction.benchmark.test.ts +6 -2
  39. package/src/__tests__/computer-use-tools.test.ts +1 -1
  40. package/src/__tests__/config-schema.test.ts +66 -7
  41. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
  42. package/src/__tests__/contacts-tools.test.ts +63 -2
  43. package/src/__tests__/context-overflow-approval.test.ts +141 -0
  44. package/src/__tests__/context-overflow-policy.test.ts +171 -0
  45. package/src/__tests__/context-overflow-reducer.test.ts +533 -0
  46. package/src/__tests__/context-window-manager.test.ts +97 -0
  47. package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
  48. package/src/__tests__/conversation-pairing.test.ts +2 -2
  49. package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
  50. package/src/__tests__/conversation-routes.test.ts +4 -7
  51. package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
  52. package/src/__tests__/credential-security-e2e.test.ts +1 -1
  53. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  54. package/src/__tests__/credential-vault-unit.test.ts +1 -1
  55. package/src/__tests__/credential-vault.test.ts +11 -8
  56. package/src/__tests__/daemon-lifecycle.test.ts +2 -2
  57. package/src/__tests__/daemon-server-session-init.test.ts +6 -6
  58. package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
  59. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
  60. package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
  61. package/src/__tests__/encrypted-store.test.ts +10 -7
  62. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  63. package/src/__tests__/file-edit-tool.test.ts +1 -1
  64. package/src/__tests__/file-read-tool.test.ts +1 -1
  65. package/src/__tests__/file-write-tool.test.ts +1 -1
  66. package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
  67. package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
  68. package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
  69. package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
  70. package/src/__tests__/followup-tools.test.ts +1 -1
  71. package/src/__tests__/gateway-only-guard.test.ts +3 -0
  72. package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
  73. package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
  74. package/src/__tests__/guardian-dispatch.test.ts +79 -1
  75. package/src/__tests__/guardian-grant-minting.test.ts +14 -14
  76. package/src/__tests__/guardian-outbound-http.test.ts +1 -2
  77. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
  78. package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
  79. package/src/__tests__/guardian-routing-state.test.ts +36 -52
  80. package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
  81. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  82. package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
  83. package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
  84. package/src/__tests__/handlers-telegram-config.test.ts +14 -14
  85. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
  86. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  87. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  88. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  89. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  90. package/src/__tests__/heartbeat-service.test.ts +45 -2
  91. package/src/__tests__/host-file-edit-tool.test.ts +1 -1
  92. package/src/__tests__/host-file-read-tool.test.ts +1 -1
  93. package/src/__tests__/host-file-write-tool.test.ts +1 -1
  94. package/src/__tests__/host-shell-tool.test.ts +1 -1
  95. package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
  96. package/src/__tests__/ingress-reconcile.test.ts +2 -2
  97. package/src/__tests__/ingress-routes-http.test.ts +2 -1
  98. package/src/__tests__/integrations-cli.test.ts +256 -0
  99. package/src/__tests__/intent-routing.test.ts +4 -5
  100. package/src/__tests__/invite-redemption-service.test.ts +4 -3
  101. package/src/__tests__/ipc-snapshot.test.ts +28 -0
  102. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
  103. package/src/__tests__/mcp-cli.test.ts +136 -57
  104. package/src/__tests__/mcp-client-auth.test.ts +95 -0
  105. package/src/__tests__/media-generate-image.test.ts +2 -2
  106. package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
  107. package/src/__tests__/memory-regressions.test.ts +6 -6
  108. package/src/__tests__/messaging-send-tool.test.ts +1 -1
  109. package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
  110. package/src/__tests__/migration-export-http.test.ts +540 -0
  111. package/src/__tests__/migration-import-commit-http.test.ts +823 -0
  112. package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
  113. package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
  114. package/src/__tests__/migration-transport.test.ts +904 -0
  115. package/src/__tests__/migration-validate-http.test.ts +698 -0
  116. package/src/__tests__/migration-wizard.test.ts +1289 -0
  117. package/src/__tests__/non-member-access-request.test.ts +17 -17
  118. package/src/__tests__/notification-decision-strategy.test.ts +110 -2
  119. package/src/__tests__/notification-deep-link.test.ts +18 -0
  120. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  121. package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
  122. package/src/__tests__/playbook-execution.test.ts +1 -1
  123. package/src/__tests__/playbook-tools.test.ts +1 -1
  124. package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
  125. package/src/__tests__/proxy-approval-callback.test.ts +1 -1
  126. package/src/__tests__/qdrant-manager.test.ts +40 -11
  127. package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
  128. package/src/__tests__/recording-handler.test.ts +2 -2
  129. package/src/__tests__/recording-intent-handler.test.ts +3 -3
  130. package/src/__tests__/recording-state-machine.test.ts +2 -2
  131. package/src/__tests__/relay-server.test.ts +506 -227
  132. package/src/__tests__/reminder-store.test.ts +8 -0
  133. package/src/__tests__/reminder.test.ts +8 -0
  134. package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
  135. package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
  136. package/src/__tests__/schedule-tools.test.ts +1 -1
  137. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  138. package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
  139. package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
  140. package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
  141. package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
  142. package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
  143. package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
  144. package/src/__tests__/script-proxy-policy.test.ts +2 -2
  145. package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
  146. package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
  147. package/src/__tests__/secret-onetime-send.test.ts +4 -4
  148. package/src/__tests__/secret-scanner-executor.test.ts +2 -2
  149. package/src/__tests__/send-endpoint-busy.test.ts +11 -9
  150. package/src/__tests__/send-notification-tool.test.ts +2 -2
  151. package/src/__tests__/session-abort-tool-results.test.ts +17 -2
  152. package/src/__tests__/session-agent-loop.test.ts +456 -35
  153. package/src/__tests__/session-confirmation-signals.test.ts +3 -2
  154. package/src/__tests__/session-conflict-gate.test.ts +20 -3
  155. package/src/__tests__/session-init.benchmark.test.ts +2 -2
  156. package/src/__tests__/session-load-history-repair.test.ts +7 -7
  157. package/src/__tests__/session-pre-run-repair.test.ts +17 -2
  158. package/src/__tests__/session-profile-injection.test.ts +20 -3
  159. package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
  160. package/src/__tests__/session-queue.test.ts +33 -18
  161. package/src/__tests__/session-runtime-assembly.test.ts +147 -1
  162. package/src/__tests__/session-runtime-workspace.test.ts +40 -0
  163. package/src/__tests__/session-slash-known.test.ts +21 -3
  164. package/src/__tests__/session-slash-queue.test.ts +17 -2
  165. package/src/__tests__/session-slash-unknown.test.ts +17 -2
  166. package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
  167. package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
  168. package/src/__tests__/session-workspace-injection.test.ts +17 -2
  169. package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
  170. package/src/__tests__/shell-credential-ref.test.ts +1 -1
  171. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  172. package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
  173. package/src/__tests__/skill-load-tool.test.ts +1 -1
  174. package/src/__tests__/skill-script-runner-host.test.ts +1 -1
  175. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
  176. package/src/__tests__/skill-script-runner.test.ts +1 -1
  177. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  178. package/src/__tests__/slack-skill.test.ts +3 -2
  179. package/src/__tests__/subagent-tools.test.ts +3 -3
  180. package/src/__tests__/swarm-recursion.test.ts +1 -1
  181. package/src/__tests__/swarm-session-integration.test.ts +1 -1
  182. package/src/__tests__/swarm-tool.test.ts +1 -1
  183. package/src/__tests__/task-management-tools.test.ts +1 -1
  184. package/src/__tests__/task-tools.test.ts +1 -1
  185. package/src/__tests__/terminal-tools.test.ts +1 -1
  186. package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
  187. package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
  188. package/src/__tests__/tool-approval-handler.test.ts +15 -15
  189. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
  190. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
  191. package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
  192. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  193. package/src/__tests__/tool-executor.test.ts +23 -182
  194. package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
  195. package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
  196. package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
  197. package/src/__tests__/trust-context-guards.test.ts +25 -29
  198. package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
  199. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
  202. package/src/__tests__/trusted-contact-verification.test.ts +63 -77
  203. package/src/__tests__/turn-commit.test.ts +18 -18
  204. package/src/__tests__/twilio-provider.test.ts +7 -7
  205. package/src/__tests__/validation-results-screen.test.ts +1107 -0
  206. package/src/__tests__/view-image-tool.test.ts +1 -1
  207. package/src/__tests__/voice-invite-redemption.test.ts +3 -2
  208. package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
  209. package/src/__tests__/voice-session-bridge.test.ts +24 -24
  210. package/src/agent/attachments.ts +3 -1
  211. package/src/agent/loop.ts +13 -13
  212. package/src/agent/message-types.ts +13 -7
  213. package/src/amazon/cart.ts +59 -32
  214. package/src/amazon/checkout.ts +25 -14
  215. package/src/amazon/client.ts +68 -48
  216. package/src/amazon/product-details.ts +3 -3
  217. package/src/amazon/request-extractor.ts +46 -31
  218. package/src/amazon/search.ts +6 -4
  219. package/src/amazon/session.ts +33 -24
  220. package/src/approvals/AGENTS.md +26 -0
  221. package/src/approvals/approval-primitive.ts +87 -64
  222. package/src/approvals/guardian-decision-primitive.ts +172 -81
  223. package/src/approvals/guardian-request-resolvers.ts +262 -155
  224. package/src/autonomy/autonomy-resolver.ts +7 -5
  225. package/src/autonomy/autonomy-store.ts +34 -19
  226. package/src/autonomy/disposition-mapper.ts +5 -5
  227. package/src/autonomy/index.ts +6 -6
  228. package/src/autonomy/types.ts +7 -3
  229. package/src/browser-extension-relay/client.ts +50 -19
  230. package/src/browser-extension-relay/protocol.ts +11 -11
  231. package/src/browser-extension-relay/server.ts +45 -20
  232. package/src/bundler/app-bundler.ts +75 -50
  233. package/src/bundler/bundle-scanner.ts +145 -41
  234. package/src/bundler/bundle-signer.ts +16 -14
  235. package/src/bundler/signature-verifier.ts +36 -33
  236. package/src/calls/call-constants.ts +10 -3
  237. package/src/calls/call-controller.ts +473 -214
  238. package/src/calls/call-conversation-messages.ts +25 -15
  239. package/src/calls/call-domain.ts +401 -148
  240. package/src/calls/call-pointer-message-composer.ts +26 -21
  241. package/src/calls/call-pointer-messages.ts +52 -28
  242. package/src/calls/call-recovery.ts +53 -37
  243. package/src/calls/call-state-machine.ts +37 -7
  244. package/src/calls/call-state.ts +35 -13
  245. package/src/calls/call-store.ts +165 -77
  246. package/src/calls/elevenlabs-client.ts +39 -20
  247. package/src/calls/guardian-action-sweep.ts +42 -24
  248. package/src/calls/guardian-dispatch.ts +79 -56
  249. package/src/calls/guardian-question-copy.ts +28 -23
  250. package/src/calls/relay-server.ts +1121 -532
  251. package/src/calls/speaker-identification.ts +21 -15
  252. package/src/calls/twilio-config.ts +34 -17
  253. package/src/calls/twilio-provider.ts +108 -55
  254. package/src/calls/twilio-rest.ts +212 -100
  255. package/src/calls/twilio-routes.ts +165 -92
  256. package/src/calls/types.ts +55 -7
  257. package/src/calls/voice-quality.ts +6 -4
  258. package/src/calls/voice-session-bridge.ts +181 -133
  259. package/src/channels/config.ts +17 -13
  260. package/src/channels/types.ts +38 -10
  261. package/src/cli/amazon.ts +333 -227
  262. package/src/cli/config-commands.ts +236 -146
  263. package/src/cli/core-commands.ts +403 -329
  264. package/src/cli/email-guardrails.ts +38 -19
  265. package/src/cli/email.ts +207 -153
  266. package/src/cli/influencer.ts +58 -56
  267. package/src/cli/integrations.ts +362 -0
  268. package/src/cli/ipc-client.ts +24 -19
  269. package/src/cli/map.ts +176 -129
  270. package/src/cli/mcp.ts +260 -152
  271. package/src/cli/sequence.ts +165 -107
  272. package/src/cli/twitter.ts +302 -218
  273. package/src/cli.ts +418 -279
  274. package/src/commands/cc-command-registry.ts +52 -27
  275. package/src/config/agent-schema.ts +217 -134
  276. package/src/config/assistant-feature-flags.ts +23 -18
  277. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
  278. package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
  279. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
  280. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
  281. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
  282. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
  283. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
  284. package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
  285. package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
  286. package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
  287. package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
  288. package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
  289. package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
  290. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
  291. package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
  292. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
  293. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
  294. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
  295. package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
  296. package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
  297. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
  298. package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
  299. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
  300. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
  301. package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
  302. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
  303. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  304. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
  305. package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
  306. package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
  307. package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
  308. package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
  309. package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
  310. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
  311. package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
  312. package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
  313. package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
  314. package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
  315. package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
  316. package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
  317. package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
  318. package/src/config/bundled-skills/contacts/SKILL.md +446 -15
  319. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
  320. package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
  321. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
  322. package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
  323. package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
  324. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
  325. package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
  326. package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
  327. package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
  328. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
  329. package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
  330. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
  331. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
  332. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
  333. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
  334. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
  335. package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
  336. package/src/config/bundled-skills/google-calendar/types.ts +3 -3
  337. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
  338. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
  339. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
  340. package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
  341. package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
  342. package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
  343. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
  344. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
  345. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
  346. package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
  347. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
  348. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
  349. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
  350. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
  351. package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
  352. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
  353. package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
  354. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
  355. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
  356. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
  357. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
  358. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
  359. package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
  360. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
  361. package/src/config/bundled-skills/messaging/SKILL.md +7 -5
  362. package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
  363. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
  364. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
  365. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
  366. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
  367. package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
  368. package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
  369. package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
  370. package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
  371. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
  372. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
  373. package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
  374. package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
  375. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
  376. package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
  377. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
  378. package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
  379. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
  380. package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
  381. package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
  382. package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
  383. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
  384. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
  385. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
  386. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
  387. package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
  388. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
  389. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
  390. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
  391. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
  392. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
  393. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
  394. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
  395. package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
  396. package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
  397. package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
  398. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
  399. package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
  400. package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
  401. package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
  402. package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
  403. package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
  404. package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
  405. package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
  406. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
  407. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
  408. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
  409. package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
  410. package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
  411. package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
  412. package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
  413. package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
  414. package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
  415. package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
  416. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
  417. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
  418. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
  419. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
  420. package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
  421. package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
  422. package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
  423. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
  424. package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
  425. package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
  426. package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
  427. package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
  428. package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
  429. package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
  430. package/src/config/bundled-skills/slack/TOOLS.json +33 -15
  431. package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
  432. package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
  433. package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
  434. package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
  435. package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
  436. package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
  437. package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
  438. package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
  439. package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
  440. package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
  441. package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
  442. package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
  443. package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
  444. package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
  445. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
  446. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
  447. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
  448. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
  449. package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
  450. package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
  451. package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
  452. package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
  453. package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
  454. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
  455. package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
  456. package/src/config/bundled-skills/twitter/SKILL.md +19 -2
  457. package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
  458. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
  459. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
  460. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
  461. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
  462. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
  463. package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
  464. package/src/config/calls-schema.ts +108 -63
  465. package/src/config/computer-use-prompt.ts +7 -7
  466. package/src/config/core-schema.ts +239 -155
  467. package/src/config/defaults.ts +2 -2
  468. package/src/config/elevenlabs-schema.ts +15 -15
  469. package/src/config/env-registry.ts +33 -33
  470. package/src/config/feature-flag-registry.json +31 -7
  471. package/src/config/loader.ts +118 -58
  472. package/src/config/mcp-schema.ts +29 -15
  473. package/src/config/memory-schema.ts +434 -229
  474. package/src/config/notifications-schema.ts +4 -4
  475. package/src/config/sandbox-schema.ts +2 -2
  476. package/src/config/schema.ts +12 -2
  477. package/src/config/skill-state.ts +27 -15
  478. package/src/config/skills-schema.ts +72 -23
  479. package/src/config/skills.ts +303 -143
  480. package/src/config/system-prompt.ts +25 -6
  481. package/src/config/types.ts +1 -1
  482. package/src/config/update-bulletin-format.ts +3 -3
  483. package/src/config/update-bulletin-state.ts +15 -6
  484. package/src/config/update-bulletin-template-path.ts +8 -4
  485. package/src/config/update-bulletin.ts +33 -14
  486. package/src/config/user-reference.ts +8 -8
  487. package/src/contacts/contact-events.ts +21 -0
  488. package/src/contacts/contact-store.ts +622 -100
  489. package/src/contacts/contacts-write.ts +287 -0
  490. package/src/contacts/index.ts +13 -4
  491. package/src/contacts/startup-migration.ts +21 -0
  492. package/src/contacts/types.ts +47 -2
  493. package/src/context/token-estimator.ts +54 -31
  494. package/src/context/tool-result-truncation.ts +41 -7
  495. package/src/context/window-manager.ts +225 -120
  496. package/src/daemon/approval-generators.ts +83 -55
  497. package/src/daemon/approved-devices-store.ts +33 -20
  498. package/src/daemon/assistant-attachments.ts +134 -98
  499. package/src/daemon/auth-manager.ts +17 -15
  500. package/src/daemon/classifier.ts +117 -46
  501. package/src/daemon/computer-use-session.ts +316 -187
  502. package/src/daemon/config-watcher.ts +91 -44
  503. package/src/daemon/connection-policy.ts +18 -10
  504. package/src/daemon/context-overflow-approval.ts +48 -0
  505. package/src/daemon/context-overflow-policy.ts +50 -0
  506. package/src/daemon/context-overflow-reducer.ts +300 -0
  507. package/src/daemon/daemon-control.ts +79 -51
  508. package/src/daemon/date-context.ts +119 -69
  509. package/src/daemon/dictation-profile-store.ts +94 -48
  510. package/src/daemon/dictation-text-processing.ts +33 -12
  511. package/src/daemon/doordash-steps.ts +92 -49
  512. package/src/daemon/guardian-action-generators.ts +62 -46
  513. package/src/daemon/guardian-verification-intent.ts +31 -18
  514. package/src/daemon/handlers/apps.ts +257 -111
  515. package/src/daemon/handlers/avatar.ts +20 -15
  516. package/src/daemon/handlers/computer-use.ts +82 -39
  517. package/src/daemon/handlers/config-channels.ts +146 -69
  518. package/src/daemon/handlers/config-heartbeat.ts +114 -59
  519. package/src/daemon/handlers/config-inbox.ts +277 -106
  520. package/src/daemon/handlers/config-ingress.ts +127 -55
  521. package/src/daemon/handlers/config-integrations.ts +145 -88
  522. package/src/daemon/handlers/config-model.ts +58 -22
  523. package/src/daemon/handlers/config-platform.ts +40 -16
  524. package/src/daemon/handlers/config-scheduling.ts +109 -48
  525. package/src/daemon/handlers/config-slack-channel.ts +67 -35
  526. package/src/daemon/handlers/config-slack.ts +21 -20
  527. package/src/daemon/handlers/config-telegram.ts +100 -70
  528. package/src/daemon/handlers/config-tools.ts +103 -55
  529. package/src/daemon/handlers/config-trust.ts +50 -20
  530. package/src/daemon/handlers/config.ts +72 -24
  531. package/src/daemon/handlers/contacts.ts +163 -0
  532. package/src/daemon/handlers/diagnostics.ts +90 -48
  533. package/src/daemon/handlers/documents.ts +74 -46
  534. package/src/daemon/handlers/guardian-actions.ts +118 -71
  535. package/src/daemon/handlers/home-base.ts +19 -16
  536. package/src/daemon/handlers/identity.ts +65 -45
  537. package/src/daemon/handlers/index.ts +78 -54
  538. package/src/daemon/handlers/misc.ts +664 -234
  539. package/src/daemon/handlers/navigate-settings.ts +14 -11
  540. package/src/daemon/handlers/oauth-connect.ts +48 -35
  541. package/src/daemon/handlers/open-bundle-handler.ts +31 -24
  542. package/src/daemon/handlers/pairing.ts +51 -25
  543. package/src/daemon/handlers/publish.ts +55 -33
  544. package/src/daemon/handlers/recording.ts +378 -162
  545. package/src/daemon/handlers/sessions.ts +923 -423
  546. package/src/daemon/handlers/shared.ts +202 -117
  547. package/src/daemon/handlers/signing.ts +25 -6
  548. package/src/daemon/handlers/subagents.ts +117 -56
  549. package/src/daemon/handlers/twitter-auth.ts +70 -49
  550. package/src/daemon/handlers/work-items.ts +264 -112
  551. package/src/daemon/handlers/workspace-files.ts +27 -20
  552. package/src/daemon/handlers.ts +2 -2
  553. package/src/daemon/history-repair.ts +16 -15
  554. package/src/daemon/identity-helpers.ts +4 -4
  555. package/src/daemon/install-cli-launchers.ts +33 -22
  556. package/src/daemon/ipc-blob-store.ts +38 -24
  557. package/src/daemon/ipc-contract/apps.ts +61 -49
  558. package/src/daemon/ipc-contract/computer-use.ts +47 -37
  559. package/src/daemon/ipc-contract/contacts.ts +69 -0
  560. package/src/daemon/ipc-contract/diagnostics.ts +14 -14
  561. package/src/daemon/ipc-contract/documents.ts +8 -8
  562. package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
  563. package/src/daemon/ipc-contract/inbox.ts +16 -16
  564. package/src/daemon/ipc-contract/integrations.ts +57 -44
  565. package/src/daemon/ipc-contract/memory.ts +3 -5
  566. package/src/daemon/ipc-contract/messages.ts +95 -69
  567. package/src/daemon/ipc-contract/notifications.ts +10 -6
  568. package/src/daemon/ipc-contract/pairing.ts +8 -8
  569. package/src/daemon/ipc-contract/schedules.ts +20 -20
  570. package/src/daemon/ipc-contract/sessions.ts +88 -57
  571. package/src/daemon/ipc-contract/settings.ts +12 -7
  572. package/src/daemon/ipc-contract/shared.ts +9 -7
  573. package/src/daemon/ipc-contract/skills.ts +46 -26
  574. package/src/daemon/ipc-contract/subagents.ts +9 -9
  575. package/src/daemon/ipc-contract/trust.ts +11 -11
  576. package/src/daemon/ipc-contract/work-items.ts +33 -28
  577. package/src/daemon/ipc-contract/workspace.ts +28 -21
  578. package/src/daemon/ipc-contract-inventory.json +8 -0
  579. package/src/daemon/ipc-contract-inventory.ts +29 -26
  580. package/src/daemon/ipc-contract.ts +111 -44
  581. package/src/daemon/ipc-handler.ts +27 -19
  582. package/src/daemon/ipc-protocol.ts +22 -12
  583. package/src/daemon/ipc-validate.ts +91 -46
  584. package/src/daemon/lifecycle.ts +25 -1
  585. package/src/daemon/main.ts +10 -8
  586. package/src/daemon/media-visibility-policy.ts +3 -1
  587. package/src/daemon/pairing-store.ts +72 -40
  588. package/src/daemon/providers-setup.ts +35 -25
  589. package/src/daemon/recording-executor.ts +37 -30
  590. package/src/daemon/recording-intent-fallback.ts +58 -28
  591. package/src/daemon/recording-intent.ts +71 -61
  592. package/src/daemon/ride-shotgun-handler.ts +201 -121
  593. package/src/daemon/seed-files.ts +28 -17
  594. package/src/daemon/server.ts +23 -14
  595. package/src/daemon/session-agent-loop-handlers.ts +261 -135
  596. package/src/daemon/session-agent-loop.ts +795 -253
  597. package/src/daemon/session-attachments.ts +104 -39
  598. package/src/daemon/session-conflict-gate.ts +72 -28
  599. package/src/daemon/session-dynamic-profile.ts +36 -22
  600. package/src/daemon/session-error.ts +50 -45
  601. package/src/daemon/session-evictor.ts +17 -10
  602. package/src/daemon/session-history.ts +201 -89
  603. package/src/daemon/session-lifecycle.ts +79 -42
  604. package/src/daemon/session-media-retry.ts +89 -41
  605. package/src/daemon/session-memory.ts +77 -55
  606. package/src/daemon/session-messaging.ts +261 -111
  607. package/src/daemon/session-notifiers.ts +57 -45
  608. package/src/daemon/session-process.ts +370 -154
  609. package/src/daemon/session-queue-manager.ts +30 -13
  610. package/src/daemon/session-runtime-assembly.ts +61 -15
  611. package/src/daemon/session-skill-tools.ts +84 -36
  612. package/src/daemon/session-slash.ts +178 -113
  613. package/src/daemon/session-surfaces.ts +498 -211
  614. package/src/daemon/session-tool-setup.ts +22 -17
  615. package/src/daemon/session-usage.ts +26 -13
  616. package/src/daemon/session-workspace.ts +7 -4
  617. package/src/daemon/session.ts +18 -19
  618. package/src/daemon/shutdown-handlers.ts +36 -33
  619. package/src/daemon/tls-certs.ts +90 -57
  620. package/src/daemon/tool-side-effects.ts +97 -65
  621. package/src/daemon/trace-emitter.ts +8 -7
  622. package/src/daemon/video-thumbnail.ts +55 -25
  623. package/src/daemon/watch-handler.ts +164 -86
  624. package/src/email/provider.ts +1 -1
  625. package/src/email/providers/agentmail.ts +87 -45
  626. package/src/email/providers/index.ts +19 -14
  627. package/src/email/service.ts +52 -24
  628. package/src/email/types.ts +2 -2
  629. package/src/errors.ts +1 -1
  630. package/src/events/bus.ts +30 -10
  631. package/src/events/domain-events.ts +19 -13
  632. package/src/events/index.ts +6 -6
  633. package/src/events/tool-audit-listener.ts +34 -20
  634. package/src/events/tool-domain-event-publisher.ts +22 -20
  635. package/src/events/tool-metrics-listener.ts +26 -21
  636. package/src/events/tool-notification-listener.ts +5 -5
  637. package/src/events/tool-profiling-listener.ts +33 -23
  638. package/src/events/tool-trace-listener.ts +70 -46
  639. package/src/export/formatter.ts +38 -32
  640. package/src/followups/followup-store.ts +43 -36
  641. package/src/followups/index.ts +2 -2
  642. package/src/followups/types.ts +1 -1
  643. package/src/gallery/default-gallery.ts +37 -34
  644. package/src/gallery/gallery-manifest.ts +9 -9
  645. package/src/heartbeat/heartbeat-service.ts +59 -37
  646. package/src/home-base/app-link-store.ts +14 -12
  647. package/src/home-base/bootstrap.ts +14 -8
  648. package/src/home-base/prebuilt/seed.ts +35 -26
  649. package/src/home-base/prebuilt-home-base-updater.ts +14 -8
  650. package/src/hooks/cli.ts +56 -43
  651. package/src/hooks/config.ts +27 -14
  652. package/src/hooks/discovery.ts +53 -33
  653. package/src/hooks/manager.ts +50 -26
  654. package/src/hooks/runner.ts +35 -29
  655. package/src/hooks/templates.ts +38 -15
  656. package/src/hooks/types.ts +13 -13
  657. package/src/inbound/platform-callback-registration.ts +21 -15
  658. package/src/inbound/public-ingress-urls.ts +9 -6
  659. package/src/index.ts +20 -19
  660. package/src/influencer/client.ts +269 -108
  661. package/src/instrument.ts +3 -1
  662. package/src/logfire.ts +64 -39
  663. package/src/mcp/client.ts +107 -55
  664. package/src/mcp/manager.ts +45 -18
  665. package/src/mcp/mcp-oauth-provider.ts +114 -62
  666. package/src/media/gemini-image-service.ts +28 -21
  667. package/src/memory/account-store.ts +16 -9
  668. package/src/memory/admin.ts +87 -57
  669. package/src/memory/app-git-service.ts +77 -47
  670. package/src/memory/app-store.ts +151 -77
  671. package/src/memory/attachments-store.ts +123 -53
  672. package/src/memory/canonical-guardian-store.ts +190 -48
  673. package/src/memory/channel-delivery-store.ts +5 -5
  674. package/src/memory/channel-guardian-store.ts +31 -16
  675. package/src/memory/checkpoints.ts +14 -7
  676. package/src/memory/clarification-resolver.ts +219 -104
  677. package/src/memory/conflict-intent.ts +74 -23
  678. package/src/memory/conflict-policy.ts +20 -7
  679. package/src/memory/conflict-store.ts +144 -94
  680. package/src/memory/contradiction-checker.ts +257 -132
  681. package/src/memory/conversation-attention-store.ts +72 -32
  682. package/src/memory/conversation-bootstrap.ts +28 -0
  683. package/src/memory/conversation-crud.ts +12 -5
  684. package/src/memory/conversation-display-order-migration.ts +7 -7
  685. package/src/memory/conversation-key-store.ts +18 -13
  686. package/src/memory/conversation-queries.ts +130 -52
  687. package/src/memory/conversation-store.ts +43 -26
  688. package/src/memory/conversation-title-service.ts +89 -66
  689. package/src/memory/db-init.ts +90 -2
  690. package/src/memory/db.ts +10 -3
  691. package/src/memory/delivery-channels.ts +12 -6
  692. package/src/memory/delivery-crud.ts +26 -12
  693. package/src/memory/delivery-status.ts +19 -16
  694. package/src/memory/embedding-backend.ts +205 -77
  695. package/src/memory/embedding-gemini.ts +23 -10
  696. package/src/memory/embedding-local.ts +89 -44
  697. package/src/memory/embedding-ollama.ts +25 -13
  698. package/src/memory/embedding-openai.ts +20 -11
  699. package/src/memory/embedding-runtime-manager.ts +163 -90
  700. package/src/memory/entity-extractor.ts +185 -123
  701. package/src/memory/external-conversation-store.ts +30 -12
  702. package/src/memory/fingerprint.ts +2 -2
  703. package/src/memory/fts-reconciler.ts +57 -28
  704. package/src/memory/guardian-action-store.ts +162 -100
  705. package/src/memory/guardian-approvals.ts +63 -129
  706. package/src/memory/guardian-rate-limits.ts +20 -9
  707. package/src/memory/guardian-verification.ts +82 -35
  708. package/src/memory/indexer.ts +96 -55
  709. package/src/memory/ingress-invite-store.ts +28 -169
  710. package/src/memory/items-extractor.ts +313 -157
  711. package/src/memory/job-handlers/backfill.ts +116 -63
  712. package/src/memory/job-handlers/cleanup.ts +64 -41
  713. package/src/memory/job-handlers/conflict.ts +90 -49
  714. package/src/memory/job-handlers/embedding.ts +32 -17
  715. package/src/memory/job-handlers/extraction.ts +58 -33
  716. package/src/memory/job-handlers/index-maintenance.ts +31 -17
  717. package/src/memory/job-handlers/media-processing.ts +65 -24
  718. package/src/memory/job-handlers/summarization.ts +186 -128
  719. package/src/memory/job-utils.ts +100 -57
  720. package/src/memory/jobs-store.ts +235 -142
  721. package/src/memory/jobs-worker.ts +167 -83
  722. package/src/memory/llm-request-log-store.ts +13 -11
  723. package/src/memory/llm-usage-store.ts +35 -26
  724. package/src/memory/media-store.ts +151 -44
  725. package/src/memory/message-content.ts +28 -18
  726. package/src/memory/migrations/001-job-deferrals.ts +11 -5
  727. package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
  728. package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
  729. package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
  730. package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
  731. package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
  732. package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
  733. package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
  734. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
  735. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
  736. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
  737. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
  738. package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
  739. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
  740. package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
  741. package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
  742. package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
  743. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
  744. package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
  745. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
  746. package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
  747. package/src/memory/migrations/022-add-origin-interface.ts +4 -2
  748. package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
  749. package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
  750. package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
  751. package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
  752. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
  753. package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
  754. package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
  755. package/src/memory/migrations/028-call-session-mode.ts +13 -3
  756. package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
  757. package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
  758. package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
  759. package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
  760. package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
  761. package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
  762. package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
  763. package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
  764. package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
  765. package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
  766. package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
  767. package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
  768. package/src/memory/migrations/038-actor-token-records.ts +5 -9
  769. package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
  770. package/src/memory/migrations/100-core-tables.ts +1 -1
  771. package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
  772. package/src/memory/migrations/103-complex-migrations.ts +9 -9
  773. package/src/memory/migrations/104-core-indexes.ts +188 -64
  774. package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
  775. package/src/memory/migrations/106-call-sessions.ts +58 -16
  776. package/src/memory/migrations/107-followups.ts +16 -6
  777. package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
  778. package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
  779. package/src/memory/migrations/110-channel-guardian.ts +48 -10
  780. package/src/memory/migrations/111-media-assets.ts +52 -18
  781. package/src/memory/migrations/112-assistant-inbox.ts +32 -12
  782. package/src/memory/migrations/113-late-migrations.ts +12 -12
  783. package/src/memory/migrations/114-notifications.ts +28 -12
  784. package/src/memory/migrations/115-sequences.ts +10 -4
  785. package/src/memory/migrations/116-messages-fts.ts +1 -1
  786. package/src/memory/migrations/117-conversation-attention.ts +16 -6
  787. package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
  788. package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
  789. package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
  790. package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
  791. package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
  792. package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
  793. package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
  794. package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
  795. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
  796. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
  797. package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
  798. package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
  799. package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
  800. package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
  801. package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
  802. package/src/memory/migrations/index.ts +82 -73
  803. package/src/memory/migrations/registry.ts +53 -37
  804. package/src/memory/migrations/validate-migration-state.ts +73 -46
  805. package/src/memory/profile-compiler.ts +58 -24
  806. package/src/memory/published-pages-store.ts +12 -16
  807. package/src/memory/qdrant-circuit-breaker.ts +28 -20
  808. package/src/memory/qdrant-client.ts +99 -63
  809. package/src/memory/qdrant-manager.ts +89 -57
  810. package/src/memory/query-builder.ts +9 -7
  811. package/src/memory/raw-query.ts +63 -14
  812. package/src/memory/recall-cache.ts +15 -8
  813. package/src/memory/retrieval-budget.ts +0 -1
  814. package/src/memory/retriever.ts +385 -192
  815. package/src/memory/schema-migration.ts +1 -1
  816. package/src/memory/schema.ts +44 -56
  817. package/src/memory/scoped-approval-grants.ts +99 -45
  818. package/src/memory/search/entity.ts +102 -40
  819. package/src/memory/search/formatting.ts +70 -52
  820. package/src/memory/search/lexical.ts +82 -43
  821. package/src/memory/search/ranking.ts +103 -39
  822. package/src/memory/search/semantic.ts +59 -35
  823. package/src/memory/search/types.ts +8 -8
  824. package/src/memory/segmenter.ts +20 -12
  825. package/src/memory/shared-app-links-store.ts +21 -16
  826. package/src/memory/task-memory-cleanup.ts +18 -8
  827. package/src/memory/tool-usage-store.ts +27 -19
  828. package/src/memory/validation.ts +4 -2
  829. package/src/messaging/activity-analyzer.ts +7 -7
  830. package/src/messaging/draft-store.ts +13 -10
  831. package/src/messaging/email-classifier.ts +73 -37
  832. package/src/messaging/index.ts +3 -3
  833. package/src/messaging/outreach-classifier.ts +76 -38
  834. package/src/messaging/provider-types.ts +2 -4
  835. package/src/messaging/provider.ts +37 -8
  836. package/src/messaging/providers/gmail/adapter.ts +183 -66
  837. package/src/messaging/providers/gmail/client.ts +3 -1
  838. package/src/messaging/providers/gmail/mime-builder.ts +21 -19
  839. package/src/messaging/providers/gmail/people-client.ts +22 -9
  840. package/src/messaging/providers/gmail/types.ts +6 -6
  841. package/src/messaging/providers/slack/adapter.ts +93 -43
  842. package/src/messaging/providers/slack/client.ts +100 -41
  843. package/src/messaging/providers/slack/types.ts +6 -0
  844. package/src/messaging/providers/sms/adapter.ts +76 -40
  845. package/src/messaging/providers/sms/client.ts +4 -4
  846. package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
  847. package/src/messaging/providers/telegram-bot/client.ts +7 -7
  848. package/src/messaging/providers/whatsapp/adapter.ts +58 -31
  849. package/src/messaging/providers/whatsapp/client.ts +4 -4
  850. package/src/messaging/registry.ts +9 -5
  851. package/src/messaging/style-analyzer.ts +69 -39
  852. package/src/messaging/thread-summarizer.ts +101 -53
  853. package/src/messaging/triage-engine.ts +111 -82
  854. package/src/messaging/types.ts +10 -10
  855. package/src/migrations/config-merge.ts +18 -10
  856. package/src/migrations/data-layout.ts +35 -22
  857. package/src/migrations/data-merge.ts +17 -7
  858. package/src/migrations/hooks-merge.ts +43 -16
  859. package/src/migrations/index.ts +6 -6
  860. package/src/migrations/log.ts +9 -5
  861. package/src/migrations/skills-merge.ts +17 -7
  862. package/src/migrations/workspace-layout.ts +39 -25
  863. package/src/notifications/AGENTS.md +5 -0
  864. package/src/notifications/adapters/macos.ts +21 -14
  865. package/src/notifications/adapters/sms.ts +28 -15
  866. package/src/notifications/adapters/telegram.ts +24 -15
  867. package/src/notifications/broadcaster.ts +108 -52
  868. package/src/notifications/conversation-pairing.ts +64 -29
  869. package/src/notifications/copy-composer.ts +165 -95
  870. package/src/notifications/decision-engine.ts +353 -147
  871. package/src/notifications/decisions-store.ts +26 -10
  872. package/src/notifications/deliveries-store.ts +23 -13
  873. package/src/notifications/destination-resolver.ts +42 -24
  874. package/src/notifications/deterministic-checks.ts +78 -27
  875. package/src/notifications/emit-signal.ts +83 -45
  876. package/src/notifications/events-store.ts +13 -7
  877. package/src/notifications/guardian-question-mode.ts +125 -75
  878. package/src/notifications/preference-extractor.ts +85 -53
  879. package/src/notifications/preference-summary.ts +31 -18
  880. package/src/notifications/preferences-store.ts +29 -18
  881. package/src/notifications/runtime-dispatch.ts +22 -12
  882. package/src/notifications/signal.ts +4 -4
  883. package/src/notifications/thread-candidates.ts +59 -23
  884. package/src/notifications/thread-seed-composer.ts +45 -27
  885. package/src/notifications/types.ts +19 -10
  886. package/src/oauth/connect-orchestrator.ts +105 -54
  887. package/src/oauth/connect-types.ts +3 -3
  888. package/src/oauth/provider-profiles.ts +80 -59
  889. package/src/oauth/scope-policy.ts +5 -2
  890. package/src/oauth/token-persistence.ts +58 -24
  891. package/src/outbound-proxy/certs.ts +284 -0
  892. package/src/outbound-proxy/config.ts +94 -0
  893. package/src/outbound-proxy/connect-tunnel.ts +84 -0
  894. package/src/outbound-proxy/health.ts +62 -0
  895. package/src/outbound-proxy/host-pattern-match.ts +67 -0
  896. package/src/outbound-proxy/http-forwarder.ts +162 -0
  897. package/src/outbound-proxy/index.ts +80 -0
  898. package/src/outbound-proxy/logging.ts +193 -0
  899. package/src/outbound-proxy/mitm-handler.ts +292 -0
  900. package/src/outbound-proxy/policy.ts +172 -0
  901. package/src/outbound-proxy/router.ts +64 -0
  902. package/src/outbound-proxy/server.ts +145 -0
  903. package/src/outbound-proxy/types.ts +150 -0
  904. package/src/permissions/checker.ts +481 -189
  905. package/src/permissions/defaults.ts +135 -108
  906. package/src/permissions/prompter.ts +53 -27
  907. package/src/permissions/secret-prompter.ts +21 -15
  908. package/src/permissions/shell-identity.ts +47 -16
  909. package/src/permissions/trust-store.ts +185 -73
  910. package/src/permissions/types.ts +22 -12
  911. package/src/permissions/workspace-policy.ts +47 -38
  912. package/src/playbooks/index.ts +10 -2
  913. package/src/playbooks/playbook-compiler.ts +30 -24
  914. package/src/playbooks/types.ts +11 -8
  915. package/src/providers/anthropic/client.ts +325 -168
  916. package/src/providers/failover.ts +57 -22
  917. package/src/providers/fireworks/client.ts +9 -5
  918. package/src/providers/gemini/client.ts +61 -39
  919. package/src/providers/model-intents.ts +40 -33
  920. package/src/providers/ollama/client.ts +7 -7
  921. package/src/providers/openai/client.ts +106 -68
  922. package/src/providers/openrouter/client.ts +9 -5
  923. package/src/providers/provider-send-message.ts +59 -27
  924. package/src/providers/ratelimit.ts +25 -8
  925. package/src/providers/registry.ts +86 -38
  926. package/src/providers/retry.ts +84 -36
  927. package/src/providers/stream-timeout.ts +5 -3
  928. package/src/providers/types.ts +7 -6
  929. package/src/runtime/AGENTS.md +42 -0
  930. package/src/runtime/access-request-helper.ts +118 -68
  931. package/src/runtime/actor-refresh-token-store.ts +21 -16
  932. package/src/runtime/actor-token-store.ts +25 -18
  933. package/src/runtime/actor-trust-resolver.ts +183 -80
  934. package/src/runtime/approval-conversation-turn.ts +39 -26
  935. package/src/runtime/approval-message-composer.ts +116 -84
  936. package/src/runtime/assistant-event-hub.ts +25 -6
  937. package/src/runtime/assistant-event.ts +4 -4
  938. package/src/runtime/assistant-scope.ts +1 -1
  939. package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
  940. package/src/runtime/auth/context.ts +8 -7
  941. package/src/runtime/auth/credential-service.ts +60 -38
  942. package/src/runtime/auth/external-assistant-id.ts +16 -8
  943. package/src/runtime/auth/index.ts +23 -16
  944. package/src/runtime/auth/route-policy.ts +170 -104
  945. package/src/runtime/auth/scopes.ts +22 -29
  946. package/src/runtime/auth/subject.ts +19 -13
  947. package/src/runtime/auth/token-service.ts +3 -3
  948. package/src/runtime/auth/types.ts +23 -23
  949. package/src/runtime/channel-approval-parser.ts +37 -14
  950. package/src/runtime/channel-approval-types.ts +12 -4
  951. package/src/runtime/channel-approvals.ts +41 -23
  952. package/src/runtime/channel-guardian-service.ts +144 -103
  953. package/src/runtime/channel-invite-transport.ts +4 -2
  954. package/src/runtime/channel-invite-transports/telegram.ts +16 -10
  955. package/src/runtime/channel-invite-transports/voice.ts +7 -7
  956. package/src/runtime/channel-readiness-service.ts +139 -90
  957. package/src/runtime/channel-readiness-types.ts +4 -2
  958. package/src/runtime/channel-reply-delivery.ts +21 -11
  959. package/src/runtime/channel-retry-sweep.ts +111 -62
  960. package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
  961. package/src/runtime/gateway-client.ts +86 -53
  962. package/src/runtime/guardian-action-conversation-turn.ts +34 -18
  963. package/src/runtime/guardian-action-followup-executor.ts +115 -45
  964. package/src/runtime/guardian-action-grant-minter.ts +40 -24
  965. package/src/runtime/guardian-action-message-composer.ts +105 -84
  966. package/src/runtime/guardian-decision-types.ts +28 -13
  967. package/src/runtime/guardian-outbound-actions.ts +9 -0
  968. package/src/runtime/guardian-reply-router.ts +274 -145
  969. package/src/runtime/guardian-vellum-migration.ts +38 -24
  970. package/src/runtime/guardian-verification-templates.ts +8 -11
  971. package/src/runtime/http-router.ts +175 -0
  972. package/src/runtime/http-server.ts +931 -669
  973. package/src/runtime/http-types.ts +2 -2
  974. package/src/runtime/ingress-service.ts +182 -89
  975. package/src/runtime/invite-redemption-service.ts +211 -134
  976. package/src/runtime/invite-redemption-templates.ts +18 -11
  977. package/src/runtime/local-actor-identity.ts +73 -55
  978. package/src/runtime/middleware/auth.ts +25 -14
  979. package/src/runtime/middleware/error-handler.ts +15 -11
  980. package/src/runtime/middleware/rate-limiter.ts +23 -17
  981. package/src/runtime/middleware/request-logger.ts +4 -4
  982. package/src/runtime/middleware/twilio-validation.ts +29 -20
  983. package/src/runtime/migrations/migration-transport.ts +575 -0
  984. package/src/runtime/migrations/migration-wizard.ts +715 -0
  985. package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
  986. package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
  987. package/src/runtime/migrations/validation-results-screen.ts +467 -0
  988. package/src/runtime/migrations/vbundle-builder.ts +295 -0
  989. package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
  990. package/src/runtime/migrations/vbundle-importer.ts +339 -0
  991. package/src/runtime/migrations/vbundle-validator.ts +356 -0
  992. package/src/runtime/pending-interactions.ts +16 -7
  993. package/src/runtime/routes/access-request-decision.ts +73 -52
  994. package/src/runtime/routes/app-routes.ts +56 -38
  995. package/src/runtime/routes/approval-routes.ts +165 -74
  996. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
  997. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
  998. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
  999. package/src/runtime/routes/attachment-routes.ts +59 -48
  1000. package/src/runtime/routes/brain-graph-routes.ts +85 -69
  1001. package/src/runtime/routes/call-routes.ts +79 -38
  1002. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
  1003. package/src/runtime/routes/channel-delivery-routes.ts +19 -14
  1004. package/src/runtime/routes/channel-guardian-routes.ts +3 -3
  1005. package/src/runtime/routes/channel-inbound-routes.ts +2 -2
  1006. package/src/runtime/routes/channel-readiness-routes.ts +12 -6
  1007. package/src/runtime/routes/channel-route-shared.ts +33 -25
  1008. package/src/runtime/routes/channel-routes.ts +4 -6
  1009. package/src/runtime/routes/contact-routes.ts +205 -16
  1010. package/src/runtime/routes/conversation-attention-routes.ts +57 -28
  1011. package/src/runtime/routes/conversation-routes.ts +321 -174
  1012. package/src/runtime/routes/debug-routes.ts +14 -10
  1013. package/src/runtime/routes/events-routes.ts +90 -57
  1014. package/src/runtime/routes/global-search-routes.ts +266 -0
  1015. package/src/runtime/routes/guardian-action-routes.ts +147 -56
  1016. package/src/runtime/routes/guardian-approval-interception.ts +255 -880
  1017. package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
  1018. package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
  1019. package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
  1020. package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
  1021. package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
  1022. package/src/runtime/routes/identity-routes.ts +71 -42
  1023. package/src/runtime/routes/inbound-conversation.ts +17 -11
  1024. package/src/runtime/routes/inbound-message-handler.ts +278 -1460
  1025. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
  1026. package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
  1027. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
  1028. package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
  1029. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
  1030. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
  1031. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
  1032. package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
  1033. package/src/runtime/routes/ingress-routes.ts +34 -23
  1034. package/src/runtime/routes/integration-routes.ts +60 -21
  1035. package/src/runtime/routes/migration-routes.ts +434 -0
  1036. package/src/runtime/routes/pairing-routes.ts +157 -79
  1037. package/src/runtime/routes/secret-routes.ts +6 -2
  1038. package/src/runtime/routes/twilio-routes.ts +443 -249
  1039. package/src/runtime/tool-grant-request-helper.ts +36 -27
  1040. package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
  1041. package/src/schedule/integration-status.ts +44 -9
  1042. package/src/schedule/recurrence-engine.ts +47 -24
  1043. package/src/schedule/recurrence-types.ts +12 -7
  1044. package/src/schedule/schedule-store.ts +166 -83
  1045. package/src/schedule/scheduler.ts +26 -22
  1046. package/src/security/encrypted-store.ts +68 -38
  1047. package/src/security/keychain.ts +183 -120
  1048. package/src/security/oauth-callback-registry.ts +3 -3
  1049. package/src/security/oauth2.ts +226 -138
  1050. package/src/security/redaction.ts +24 -24
  1051. package/src/security/secret-allowlist.ts +46 -21
  1052. package/src/security/secret-ingress.ts +15 -7
  1053. package/src/security/secret-scanner.ts +193 -104
  1054. package/src/security/secure-keys.ts +9 -3
  1055. package/src/security/token-manager.ts +99 -40
  1056. package/src/security/tool-approval-digest.ts +3 -3
  1057. package/src/sequence/analytics.ts +52 -27
  1058. package/src/sequence/engine.ts +135 -72
  1059. package/src/sequence/guardrails.ts +32 -20
  1060. package/src/sequence/importer.ts +75 -37
  1061. package/src/sequence/reply-matcher.ts +36 -18
  1062. package/src/sequence/store.ts +137 -75
  1063. package/src/sequence/types.ts +30 -16
  1064. package/src/services/published-app-updater.ts +26 -16
  1065. package/src/services/vercel-deploy.ts +19 -15
  1066. package/src/skills/active-skill-tools.ts +3 -3
  1067. package/src/skills/clawhub.ts +178 -90
  1068. package/src/skills/include-graph.ts +24 -17
  1069. package/src/skills/managed-store.ts +89 -42
  1070. package/src/skills/path-classifier.ts +10 -10
  1071. package/src/skills/remote-skill-policy.ts +31 -22
  1072. package/src/skills/slash-commands.ts +36 -30
  1073. package/src/skills/tool-manifest.ts +60 -31
  1074. package/src/skills/version-hash.ts +25 -15
  1075. package/src/slack/slack-webhook.ts +19 -15
  1076. package/src/subagent/index.ts +4 -8
  1077. package/src/subagent/manager.ts +119 -69
  1078. package/src/subagent/types.ts +9 -12
  1079. package/src/swarm/backend-claude-code.ts +124 -45
  1080. package/src/swarm/checkpoint.ts +36 -16
  1081. package/src/swarm/graph-utils.ts +1 -3
  1082. package/src/swarm/index.ts +38 -19
  1083. package/src/swarm/limits.ts +13 -4
  1084. package/src/swarm/orchestrator.ts +108 -57
  1085. package/src/swarm/plan-validator.ts +23 -17
  1086. package/src/swarm/router-planner.ts +51 -22
  1087. package/src/swarm/router-prompts.ts +4 -1
  1088. package/src/swarm/synthesizer.ts +26 -18
  1089. package/src/swarm/types.ts +14 -4
  1090. package/src/swarm/worker-backend.ts +36 -26
  1091. package/src/swarm/worker-prompts.ts +13 -9
  1092. package/src/swarm/worker-runner.ts +40 -34
  1093. package/src/tasks/candidate-store.ts +14 -6
  1094. package/src/tasks/ephemeral-permissions.ts +9 -5
  1095. package/src/tasks/task-compiler.ts +41 -38
  1096. package/src/tasks/task-runner.ts +54 -26
  1097. package/src/tasks/task-scheduler.ts +1 -1
  1098. package/src/tasks/task-store.ts +20 -7
  1099. package/src/tasks/tool-sanitizer.ts +3 -3
  1100. package/src/tools/apps/definitions.ts +23 -15
  1101. package/src/tools/apps/executors.ts +118 -37
  1102. package/src/tools/apps/open-proxy.ts +5 -5
  1103. package/src/tools/apps/registry.ts +2 -2
  1104. package/src/tools/assets/materialize.ts +59 -41
  1105. package/src/tools/assets/search.ts +86 -48
  1106. package/src/tools/browser/api-map.ts +52 -36
  1107. package/src/tools/browser/auth-cache.ts +21 -18
  1108. package/src/tools/browser/auth-detector.ts +43 -28
  1109. package/src/tools/browser/auto-navigate.ts +149 -68
  1110. package/src/tools/browser/browser-execution.ts +9 -3
  1111. package/src/tools/browser/headless-browser.ts +287 -150
  1112. package/src/tools/browser/jit-auth.ts +37 -21
  1113. package/src/tools/browser/network-recorder.ts +138 -56
  1114. package/src/tools/browser/recording-store.ts +22 -15
  1115. package/src/tools/browser/runtime-check.ts +8 -5
  1116. package/src/tools/browser/x-auto-navigate.ts +88 -47
  1117. package/src/tools/calls/call-end.ts +9 -6
  1118. package/src/tools/calls/call-start.ts +30 -20
  1119. package/src/tools/calls/call-status.ts +8 -5
  1120. package/src/tools/claude-code/claude-code.ts +301 -165
  1121. package/src/tools/computer-use/definitions.ts +159 -130
  1122. package/src/tools/computer-use/registry.ts +2 -2
  1123. package/src/tools/computer-use/request-computer-control.ts +21 -13
  1124. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
  1125. package/src/tools/credentials/account-registry.ts +52 -35
  1126. package/src/tools/credentials/broker-types.ts +1 -1
  1127. package/src/tools/credentials/broker.ts +97 -55
  1128. package/src/tools/credentials/domain-policy.ts +5 -2
  1129. package/src/tools/credentials/host-pattern-match.ts +15 -8
  1130. package/src/tools/credentials/metadata-store.ts +93 -43
  1131. package/src/tools/credentials/policy-types.ts +5 -2
  1132. package/src/tools/credentials/policy-validate.ts +21 -14
  1133. package/src/tools/credentials/post-connect-hooks.ts +18 -7
  1134. package/src/tools/credentials/resolve.ts +11 -10
  1135. package/src/tools/credentials/selection.ts +30 -25
  1136. package/src/tools/credentials/tool-policy.ts +5 -2
  1137. package/src/tools/credentials/vault.ts +452 -183
  1138. package/src/tools/document/document-tool.ts +23 -17
  1139. package/src/tools/document/editor-template.ts +12 -7
  1140. package/src/tools/execution-target.ts +13 -10
  1141. package/src/tools/execution-timeout.ts +6 -5
  1142. package/src/tools/executor.ts +141 -74
  1143. package/src/tools/filesystem/edit.ts +82 -45
  1144. package/src/tools/filesystem/fuzzy-match.ts +70 -32
  1145. package/src/tools/filesystem/read.ts +46 -28
  1146. package/src/tools/filesystem/view-image.ts +86 -42
  1147. package/src/tools/filesystem/write.ts +53 -32
  1148. package/src/tools/followups/followup_create.ts +43 -17
  1149. package/src/tools/followups/followup_list.ts +28 -13
  1150. package/src/tools/followups/followup_resolve.ts +9 -6
  1151. package/src/tools/guardian-control-plane-policy.ts +15 -14
  1152. package/src/tools/host-filesystem/edit.ts +77 -42
  1153. package/src/tools/host-filesystem/read.ts +52 -33
  1154. package/src/tools/host-filesystem/write.ts +50 -29
  1155. package/src/tools/host-terminal/host-shell.ts +97 -61
  1156. package/src/tools/mcp/mcp-tool-factory.ts +21 -14
  1157. package/src/tools/memory/definitions.ts +60 -28
  1158. package/src/tools/memory/handlers.ts +149 -77
  1159. package/src/tools/memory/register.ts +39 -16
  1160. package/src/tools/network/__tests__/web-search.test.ts +236 -177
  1161. package/src/tools/network/domain-normalize.ts +13 -9
  1162. package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
  1163. package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
  1164. package/src/tools/network/script-proxy/index.ts +1 -17
  1165. package/src/tools/network/script-proxy/session-manager.ts +151 -84
  1166. package/src/tools/network/url-safety.ts +56 -34
  1167. package/src/tools/network/web-fetch.ts +273 -155
  1168. package/src/tools/network/web-search.ts +166 -81
  1169. package/src/tools/permission-checker.ts +6 -25
  1170. package/src/tools/policy-context.ts +8 -5
  1171. package/src/tools/registry.ts +73 -46
  1172. package/src/tools/reminder/reminder-store.ts +65 -44
  1173. package/src/tools/reminder/reminder.ts +76 -35
  1174. package/src/tools/schedule/create.ts +44 -21
  1175. package/src/tools/schedule/delete.ts +8 -5
  1176. package/src/tools/schedule/list.ts +39 -19
  1177. package/src/tools/schedule/update.ts +49 -26
  1178. package/src/tools/secret-detection-handler.ts +130 -49
  1179. package/src/tools/sensitive-output-placeholders.ts +15 -8
  1180. package/src/tools/shared/filesystem/edit-engine.ts +45 -14
  1181. package/src/tools/shared/filesystem/errors.ts +18 -18
  1182. package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
  1183. package/src/tools/shared/filesystem/format-diff.ts +21 -11
  1184. package/src/tools/shared/filesystem/path-policy.ts +17 -13
  1185. package/src/tools/shared/filesystem/size-guard.ts +8 -4
  1186. package/src/tools/shared/filesystem/types.ts +2 -2
  1187. package/src/tools/shared/shell-output.ts +4 -3
  1188. package/src/tools/side-effects.ts +36 -28
  1189. package/src/tools/skills/delete-managed.ts +30 -17
  1190. package/src/tools/skills/load.ts +88 -46
  1191. package/src/tools/skills/sandbox-runner.ts +62 -46
  1192. package/src/tools/skills/scaffold-managed.ts +98 -48
  1193. package/src/tools/skills/script-contract.ts +5 -2
  1194. package/src/tools/skills/skill-script-runner.ts +29 -13
  1195. package/src/tools/skills/skill-tool-factory.ts +20 -10
  1196. package/src/tools/subagent/abort.ts +10 -4
  1197. package/src/tools/subagent/message.ts +14 -8
  1198. package/src/tools/subagent/read.ts +20 -11
  1199. package/src/tools/subagent/spawn.ts +14 -6
  1200. package/src/tools/subagent/status.ts +7 -4
  1201. package/src/tools/swarm/delegate.ts +75 -49
  1202. package/src/tools/system/avatar-generator.ts +46 -33
  1203. package/src/tools/system/navigate-settings.ts +29 -19
  1204. package/src/tools/system/open-system-settings.ts +30 -20
  1205. package/src/tools/system/request-permission.ts +59 -44
  1206. package/src/tools/system/version.ts +27 -16
  1207. package/src/tools/system/voice-config.ts +116 -53
  1208. package/src/tools/tasks/index.ts +8 -8
  1209. package/src/tools/tasks/task-delete.ts +61 -22
  1210. package/src/tools/tasks/task-list.ts +23 -11
  1211. package/src/tools/tasks/task-run.ts +41 -16
  1212. package/src/tools/tasks/task-save.ts +27 -10
  1213. package/src/tools/tasks/work-item-enqueue.ts +114 -48
  1214. package/src/tools/tasks/work-item-list.ts +20 -10
  1215. package/src/tools/tasks/work-item-remove.ts +49 -15
  1216. package/src/tools/tasks/work-item-run.ts +34 -13
  1217. package/src/tools/tasks/work-item-update.ts +84 -31
  1218. package/src/tools/terminal/backends/native.ts +64 -35
  1219. package/src/tools/terminal/backends/types.ts +6 -2
  1220. package/src/tools/terminal/parser.ts +200 -125
  1221. package/src/tools/terminal/safe-env.ts +27 -21
  1222. package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
  1223. package/src/tools/terminal/sandbox.ts +10 -6
  1224. package/src/tools/terminal/shell.ts +124 -68
  1225. package/src/tools/tool-approval-handler.ts +193 -138
  1226. package/src/tools/types.ts +43 -23
  1227. package/src/tools/ui-surface/definitions.ts +124 -89
  1228. package/src/tools/ui-surface/registry.ts +2 -2
  1229. package/src/tools/watch/screen-watch.ts +50 -32
  1230. package/src/tools/watch/watch-state.ts +41 -15
  1231. package/src/tools/watcher/create.ts +37 -15
  1232. package/src/tools/watcher/delete.ts +9 -6
  1233. package/src/tools/watcher/digest.ts +10 -6
  1234. package/src/tools/watcher/list.ts +37 -14
  1235. package/src/tools/watcher/update.ts +33 -18
  1236. package/src/tools/weather/service.ts +331 -174
  1237. package/src/twitter/client.ts +261 -138
  1238. package/src/twitter/oauth-client.ts +17 -13
  1239. package/src/twitter/router.ts +51 -23
  1240. package/src/twitter/session.ts +27 -18
  1241. package/src/types/qrcode.d.ts +6 -3
  1242. package/src/usage/actors.ts +16 -16
  1243. package/src/usage/types.ts +3 -3
  1244. package/src/util/bundled-asset.ts +10 -6
  1245. package/src/util/canonicalize-identity.ts +11 -4
  1246. package/src/util/clipboard.ts +7 -7
  1247. package/src/util/content-id.ts +3 -3
  1248. package/src/util/debounce.ts +3 -2
  1249. package/src/util/diff.ts +55 -33
  1250. package/src/util/errors.ts +26 -26
  1251. package/src/util/fs.ts +8 -2
  1252. package/src/util/log-redact.ts +12 -12
  1253. package/src/util/logger.ts +112 -51
  1254. package/src/util/network-info.ts +13 -5
  1255. package/src/util/object.ts +4 -2
  1256. package/src/util/phone.ts +4 -4
  1257. package/src/util/platform.ts +80 -58
  1258. package/src/util/pricing.ts +49 -31
  1259. package/src/util/retry.ts +18 -7
  1260. package/src/util/row-mapper.ts +7 -4
  1261. package/src/util/silently.ts +7 -4
  1262. package/src/util/spawn.ts +48 -0
  1263. package/src/util/spinner.ts +9 -7
  1264. package/src/util/time.ts +16 -3
  1265. package/src/util/truncate.ts +1 -1
  1266. package/src/util/voice-code.ts +6 -4
  1267. package/src/util/xml.ts +5 -1
  1268. package/src/version.ts +12 -8
  1269. package/src/watcher/engine.ts +71 -44
  1270. package/src/watcher/provider-registry.ts +1 -1
  1271. package/src/watcher/providers/github.ts +40 -23
  1272. package/src/watcher/providers/gmail.ts +59 -38
  1273. package/src/watcher/providers/google-calendar.ts +62 -48
  1274. package/src/watcher/providers/linear.ts +219 -150
  1275. package/src/watcher/providers/slack.ts +93 -27
  1276. package/src/watcher/watcher-store.ts +75 -55
  1277. package/src/work-items/work-item-runner.ts +62 -29
  1278. package/src/work-items/work-item-store.ts +137 -47
  1279. package/src/workspace/commit-message-enrichment-service.ts +65 -25
  1280. package/src/workspace/commit-message-provider.ts +14 -12
  1281. package/src/workspace/git-service.ts +355 -239
  1282. package/src/workspace/heartbeat-service.ts +74 -37
  1283. package/src/workspace/provider-commit-message-generator.ts +95 -70
  1284. package/src/workspace/top-level-renderer.ts +10 -8
  1285. package/src/workspace/top-level-scanner.ts +9 -3
  1286. package/src/workspace/turn-commit.ts +63 -36
  1287. package/src/__tests__/ingress-member-store.test.ts +0 -294
  1288. package/src/__tests__/script-proxy-router.test.ts +0 -215
  1289. package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
  1290. package/src/memory/guardian-bindings.ts +0 -158
  1291. package/src/memory/ingress-member-store.ts +0 -352
  1292. package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
  1293. package/src/tools/network/script-proxy/certs.ts +0 -7
  1294. package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
  1295. package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
  1296. package/src/tools/network/script-proxy/logging.ts +0 -12
  1297. package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
  1298. package/src/tools/network/script-proxy/policy.ts +0 -4
  1299. package/src/tools/network/script-proxy/router.ts +0 -2
  1300. package/src/tools/network/script-proxy/server.ts +0 -5
  1301. package/src/tools/network/script-proxy/types.ts +0 -19
@@ -110,9 +110,10 @@ globalThis.fetch = (async (
110
110
  return new Response(JSON.stringify({ ok: true }), { status: 200 });
111
111
  }
112
112
  return originalFetch(input, init as never);
113
- }) as typeof fetch;
113
+ }) as unknown as typeof fetch;
114
114
  import { eq } from "drizzle-orm";
115
115
 
116
+ import { createGuardianBinding } from "../contacts/contacts-write.js";
116
117
  import {
117
118
  handleGuardianVerification,
118
119
  MAX_SENDS_PER_SESSION,
@@ -127,7 +128,6 @@ import {
127
128
  bindSessionIdentity as _storeBindSessionIdentity,
128
129
  consumeChallenge,
129
130
  createApprovalRequest,
130
- createBinding,
131
131
  createChallenge,
132
132
  createVerificationSession,
133
133
  findActiveSession as storeFindActiveSession,
@@ -135,19 +135,21 @@ import {
135
135
  findPendingChallengeForChannel,
136
136
  findSessionByBootstrapTokenHash as _storeFindSessionByBootstrapTokenHash,
137
137
  findSessionByIdentity as _storeFindSessionByIdentity,
138
- getActiveBinding,
139
138
  getPendingApprovalByGuardianChat,
140
- getPendingApprovalForRun,
139
+ getPendingApprovalForRequest,
141
140
  getRateLimit,
142
141
  recordInvalidAttempt,
143
142
  resetRateLimit,
144
- revokeBinding,
145
143
  updateApprovalDecision,
146
144
  updateSessionDelivery as storeUpdateSessionDelivery,
147
145
  updateSessionStatus as _storeUpdateSessionStatus,
148
146
  } from "../memory/channel-guardian-store.js";
149
147
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
150
- import { channelGuardianVerificationChallenges } from "../memory/schema.js";
148
+ import { upsertBinding as upsertExternalBinding } from "../memory/external-conversation-store.js";
149
+ import {
150
+ channelGuardianVerificationChallenges,
151
+ conversations,
152
+ } from "../memory/schema.js";
151
153
  import {
152
154
  bindSessionIdentity as serviceBindSessionIdentity,
153
155
  createOutboundSession,
@@ -182,135 +184,18 @@ afterAll(() => {
182
184
 
183
185
  function resetTables(): void {
184
186
  const db = getDb();
185
- db.run("DELETE FROM channel_guardian_bindings");
186
187
  db.run("DELETE FROM channel_guardian_verification_challenges");
187
188
  db.run("DELETE FROM channel_guardian_approval_requests");
188
189
  db.run("DELETE FROM channel_guardian_rate_limits");
190
+ db.run("DELETE FROM contact_channels");
191
+ db.run("DELETE FROM contacts");
192
+ db.run("DELETE FROM external_conversation_bindings");
189
193
  smsSendCalls.length = 0;
190
194
  telegramDeliverCalls.length = 0;
191
195
  voiceCallInitCalls.length = 0;
192
196
  mockBotUsername = "test_bot";
193
197
  }
194
198
 
195
- // ═══════════════════════════════════════════════════════════════════════════
196
- // 1. Guardian Binding CRUD (Store)
197
- // ═══════════════════════════════════════════════════════════════════════════
198
-
199
- describe("guardian binding CRUD", () => {
200
- beforeEach(() => {
201
- resetTables();
202
- });
203
-
204
- test("createBinding creates an active binding with correct fields", () => {
205
- const binding = createBinding({
206
- assistantId: "asst-1",
207
- channel: "telegram",
208
- guardianExternalUserId: "user-42",
209
- guardianPrincipalId: "user-42",
210
- guardianDeliveryChatId: "chat-42",
211
- });
212
-
213
- expect(binding.id).toBeDefined();
214
- expect(binding.assistantId).toBe("asst-1");
215
- expect(binding.channel).toBe("telegram");
216
- expect(binding.guardianExternalUserId).toBe("user-42");
217
- expect(binding.guardianDeliveryChatId).toBe("chat-42");
218
- expect(binding.status).toBe("active");
219
- expect(binding.verifiedVia).toBe("challenge");
220
- expect(binding.verifiedAt).toBeGreaterThan(0);
221
- expect(binding.createdAt).toBeGreaterThan(0);
222
- expect(binding.updatedAt).toBeGreaterThan(0);
223
- });
224
-
225
- test("getActiveBinding returns the active binding", () => {
226
- createBinding({
227
- assistantId: "asst-1",
228
- channel: "telegram",
229
- guardianExternalUserId: "user-42",
230
- guardianPrincipalId: "user-42",
231
- guardianDeliveryChatId: "chat-42",
232
- });
233
-
234
- const found = getActiveBinding("asst-1", "telegram");
235
- expect(found).not.toBeNull();
236
- expect(found!.guardianExternalUserId).toBe("user-42");
237
- });
238
-
239
- test("getActiveBinding returns null when no binding exists", () => {
240
- const found = getActiveBinding("asst-1", "telegram");
241
- expect(found).toBeNull();
242
- });
243
-
244
- test("getActiveBinding returns null for different assistant", () => {
245
- createBinding({
246
- assistantId: "asst-1",
247
- channel: "telegram",
248
- guardianExternalUserId: "user-42",
249
- guardianPrincipalId: "user-42",
250
- guardianDeliveryChatId: "chat-42",
251
- });
252
-
253
- const found = getActiveBinding("asst-2", "telegram");
254
- expect(found).toBeNull();
255
- });
256
-
257
- test("getActiveBinding returns null for different channel", () => {
258
- createBinding({
259
- assistantId: "asst-1",
260
- channel: "telegram",
261
- guardianExternalUserId: "user-42",
262
- guardianPrincipalId: "user-42",
263
- guardianDeliveryChatId: "chat-42",
264
- });
265
-
266
- const found = getActiveBinding("asst-1", "slack");
267
- expect(found).toBeNull();
268
- });
269
-
270
- test("revokeBinding transitions active binding to revoked", () => {
271
- createBinding({
272
- assistantId: "asst-1",
273
- channel: "telegram",
274
- guardianExternalUserId: "user-42",
275
- guardianPrincipalId: "user-42",
276
- guardianDeliveryChatId: "chat-42",
277
- });
278
-
279
- const result = revokeBinding("asst-1", "telegram");
280
- expect(result).toBe(true);
281
-
282
- const found = getActiveBinding("asst-1", "telegram");
283
- expect(found).toBeNull();
284
- });
285
-
286
- test("revokeBinding returns false when no active binding exists", () => {
287
- const result = revokeBinding("asst-1", "telegram");
288
- expect(result).toBe(false);
289
- });
290
-
291
- test("revokeBinding does not affect bindings on other channels", () => {
292
- createBinding({
293
- assistantId: "asst-1",
294
- channel: "telegram",
295
- guardianExternalUserId: "user-42",
296
- guardianPrincipalId: "user-42",
297
- guardianDeliveryChatId: "chat-42",
298
- });
299
- createBinding({
300
- assistantId: "asst-1",
301
- channel: "slack",
302
- guardianExternalUserId: "user-99",
303
- guardianPrincipalId: "user-99",
304
- guardianDeliveryChatId: "chat-99",
305
- });
306
-
307
- revokeBinding("asst-1", "telegram");
308
-
309
- expect(getActiveBinding("asst-1", "telegram")).toBeNull();
310
- expect(getActiveBinding("asst-1", "slack")).not.toBeNull();
311
- });
312
- });
313
-
314
199
  // ═══════════════════════════════════════════════════════════════════════════
315
200
  // 2. Verification Challenge Lifecycle (Store)
316
201
  // ═══════════════════════════════════════════════════════════════════════════
@@ -509,12 +394,10 @@ describe("guardian service challenge validation", () => {
509
394
  );
510
395
 
511
396
  expect(result.success).toBe(true);
512
- if (result.success && result.verificationType === "guardian") {
513
- expect(result.bindingId).toBeDefined();
514
- }
397
+ expect(result.verificationType).toBe("guardian");
515
398
  });
516
399
 
517
- test("validateAndConsumeChallenge creates a guardian binding", () => {
400
+ test("validateAndConsumeChallenge does not create a guardian binding (caller responsibility)", () => {
518
401
  const { secret } = createVerificationChallenge("asst-1", "telegram");
519
402
 
520
403
  validateAndConsumeChallenge(
@@ -525,11 +408,8 @@ describe("guardian service challenge validation", () => {
525
408
  "chat-42",
526
409
  );
527
410
 
528
- const binding = getActiveBinding("asst-1", "telegram");
529
- expect(binding).not.toBeNull();
530
- expect(binding!.guardianExternalUserId).toBe("user-42");
531
- expect(binding!.guardianDeliveryChatId).toBe("chat-42");
532
- expect(binding!.verifiedVia).toBe("challenge");
411
+ const binding = getGuardianBinding("asst-1", "telegram");
412
+ expect(binding).toBeNull();
533
413
  });
534
414
 
535
415
  test("validateAndConsumeChallenge fails with wrong secret", () => {
@@ -617,16 +497,12 @@ describe("guardian service challenge validation", () => {
617
497
  );
618
498
 
619
499
  expect(result.success).toBe(true);
620
- if (result.success && result.verificationType === "guardian") {
621
- expect(result.bindingId).toBeDefined();
622
- }
500
+ expect(result.verificationType).toBe("guardian");
623
501
 
624
- // Verify the binding was created for the sms channel
625
- const binding = getActiveBinding("asst-1", "sms");
626
- expect(binding).not.toBeNull();
627
- expect(binding!.guardianExternalUserId).toBe("phone-user-1");
628
- expect(binding!.guardianDeliveryChatId).toBe("sms-chat-1");
629
- expect(binding!.channel).toBe("sms");
502
+ // validateAndConsumeChallenge no longer creates bindings that is
503
+ // now handled by the caller (verification-intercept / relay-server).
504
+ const binding = getGuardianBinding("asst-1", "sms");
505
+ expect(binding).toBeNull();
630
506
  });
631
507
 
632
508
  test("sms and telegram guardian challenges are independent", () => {
@@ -664,9 +540,9 @@ describe("guardian service challenge validation", () => {
664
540
  expect(telegramResult.success).toBe(true);
665
541
  });
666
542
 
667
- test("validateAndConsumeChallenge revokes existing binding before creating new one", () => {
543
+ test("validateAndConsumeChallenge succeeds even with existing binding (conflict check is caller responsibility)", () => {
668
544
  // Create initial guardian binding
669
- createBinding({
545
+ createGuardianBinding({
670
546
  assistantId: "asst-1",
671
547
  channel: "telegram",
672
548
  guardianExternalUserId: "old-user",
@@ -674,12 +550,10 @@ describe("guardian service challenge validation", () => {
674
550
  guardianDeliveryChatId: "old-chat",
675
551
  });
676
552
 
677
- const oldBinding = getActiveBinding("asst-1", "telegram");
553
+ const oldBinding = getGuardianBinding("asst-1", "telegram");
678
554
  expect(oldBinding).not.toBeNull();
679
555
  expect(oldBinding!.guardianExternalUserId).toBe("old-user");
680
556
 
681
- // Attempt verification with a different user — should be rejected
682
- // because a different guardian is already bound for this channel.
683
557
  const { secret } = createVerificationChallenge("asst-1", "telegram");
684
558
  const result = validateAndConsumeChallenge(
685
559
  "asst-1",
@@ -689,11 +563,10 @@ describe("guardian service challenge validation", () => {
689
563
  "new-chat",
690
564
  );
691
565
 
692
- // The different-user takeover should be blocked
693
- expect(result.success).toBe(false);
566
+ // Challenge validation succeeds the caller decides how to handle binding conflicts
567
+ expect(result.success).toBe(true);
694
568
 
695
- // The original binding should remain active
696
- const binding = getActiveBinding("asst-1", "telegram");
569
+ const binding = getGuardianBinding("asst-1", "telegram");
697
570
  expect(binding).not.toBeNull();
698
571
  expect(binding!.guardianExternalUserId).toBe("old-user");
699
572
  });
@@ -709,7 +582,7 @@ describe("guardian identity check", () => {
709
582
  });
710
583
 
711
584
  test("isGuardian returns true for matching user", () => {
712
- createBinding({
585
+ createGuardianBinding({
713
586
  assistantId: "asst-1",
714
587
  channel: "telegram",
715
588
  guardianExternalUserId: "user-42",
@@ -721,7 +594,7 @@ describe("guardian identity check", () => {
721
594
  });
722
595
 
723
596
  test("isGuardian returns false for non-matching user", () => {
724
- createBinding({
597
+ createGuardianBinding({
725
598
  assistantId: "asst-1",
726
599
  channel: "telegram",
727
600
  guardianExternalUserId: "user-42",
@@ -737,7 +610,7 @@ describe("guardian identity check", () => {
737
610
  });
738
611
 
739
612
  test("isGuardian returns false after binding is revoked", () => {
740
- createBinding({
613
+ createGuardianBinding({
741
614
  assistantId: "asst-1",
742
615
  channel: "telegram",
743
616
  guardianExternalUserId: "user-42",
@@ -745,13 +618,13 @@ describe("guardian identity check", () => {
745
618
  guardianDeliveryChatId: "chat-42",
746
619
  });
747
620
 
748
- revokeBinding("asst-1", "telegram");
621
+ serviceRevokeBinding("asst-1", "telegram");
749
622
 
750
623
  expect(isGuardian("asst-1", "telegram", "user-42")).toBe(false);
751
624
  });
752
625
 
753
626
  test("getGuardianBinding returns the active binding", () => {
754
- createBinding({
627
+ createGuardianBinding({
755
628
  assistantId: "asst-1",
756
629
  channel: "telegram",
757
630
  guardianExternalUserId: "user-42",
@@ -770,7 +643,7 @@ describe("guardian identity check", () => {
770
643
  });
771
644
 
772
645
  test("isGuardian works for sms channel", () => {
773
- createBinding({
646
+ createGuardianBinding({
774
647
  assistantId: "asst-1",
775
648
  channel: "sms",
776
649
  guardianExternalUserId: "phone-user-1",
@@ -785,7 +658,7 @@ describe("guardian identity check", () => {
785
658
  });
786
659
 
787
660
  test("serviceRevokeBinding revokes the active binding", () => {
788
- createBinding({
661
+ createGuardianBinding({
789
662
  assistantId: "asst-1",
790
663
  channel: "telegram",
791
664
  guardianExternalUserId: "user-42",
@@ -811,6 +684,7 @@ describe("guardian approval request CRUD", () => {
811
684
  test("createApprovalRequest creates a pending request", () => {
812
685
  const request = createApprovalRequest({
813
686
  runId: "run-1",
687
+ requestId: "req-1",
814
688
  conversationId: "conv-1",
815
689
  channel: "telegram",
816
690
  requesterExternalUserId: "user-99",
@@ -825,6 +699,7 @@ describe("guardian approval request CRUD", () => {
825
699
 
826
700
  expect(request.id).toBeDefined();
827
701
  expect(request.runId).toBe("run-1");
702
+ expect(request.requestId).toBe("req-1");
828
703
  expect(request.status).toBe("pending");
829
704
  expect(request.toolName).toBe("shell");
830
705
  expect(request.riskLevel).toBe("high");
@@ -832,9 +707,10 @@ describe("guardian approval request CRUD", () => {
832
707
  expect(request.decidedByExternalUserId).toBeNull();
833
708
  });
834
709
 
835
- test("getPendingApprovalForRun returns the pending request", () => {
710
+ test("getPendingApprovalForRequest returns the pending request", () => {
836
711
  createApprovalRequest({
837
712
  runId: "run-1",
713
+ requestId: "req-1",
838
714
  conversationId: "conv-1",
839
715
  channel: "telegram",
840
716
  requesterExternalUserId: "user-99",
@@ -845,20 +721,21 @@ describe("guardian approval request CRUD", () => {
845
721
  expiresAt: Date.now() + 300_000,
846
722
  });
847
723
 
848
- const found = getPendingApprovalForRun("run-1");
724
+ const found = getPendingApprovalForRequest("req-1");
849
725
  expect(found).not.toBeNull();
850
- expect(found!.runId).toBe("run-1");
726
+ expect(found!.requestId).toBe("req-1");
851
727
  expect(found!.status).toBe("pending");
852
728
  });
853
729
 
854
- test("getPendingApprovalForRun returns null when no pending request exists", () => {
855
- const found = getPendingApprovalForRun("run-nonexistent");
730
+ test("getPendingApprovalForRequest returns null when no pending request exists", () => {
731
+ const found = getPendingApprovalForRequest("req-nonexistent");
856
732
  expect(found).toBeNull();
857
733
  });
858
734
 
859
735
  test("getPendingApprovalByGuardianChat returns pending request for guardian chat", () => {
860
736
  createApprovalRequest({
861
737
  runId: "run-1",
738
+ requestId: "req-1",
862
739
  conversationId: "conv-1",
863
740
  channel: "telegram",
864
741
  requesterExternalUserId: "user-99",
@@ -877,6 +754,7 @@ describe("guardian approval request CRUD", () => {
877
754
  test("getPendingApprovalByGuardianChat returns null for wrong channel", () => {
878
755
  createApprovalRequest({
879
756
  runId: "run-1",
757
+ requestId: "req-1",
880
758
  conversationId: "conv-1",
881
759
  channel: "telegram",
882
760
  requesterExternalUserId: "user-99",
@@ -894,6 +772,7 @@ describe("guardian approval request CRUD", () => {
894
772
  test("updateApprovalDecision updates status to approved", () => {
895
773
  const request = createApprovalRequest({
896
774
  runId: "run-1",
775
+ requestId: "req-1",
897
776
  conversationId: "conv-1",
898
777
  channel: "telegram",
899
778
  requesterExternalUserId: "user-99",
@@ -909,14 +788,15 @@ describe("guardian approval request CRUD", () => {
909
788
  decidedByExternalUserId: "user-42",
910
789
  });
911
790
 
912
- // After approval, getPendingApprovalForRun should return null
913
- const found = getPendingApprovalForRun("run-1");
791
+ // After approval, getPendingApprovalForRequest should return null
792
+ const found = getPendingApprovalForRequest("req-1");
914
793
  expect(found).toBeNull();
915
794
  });
916
795
 
917
796
  test("updateApprovalDecision updates status to denied", () => {
918
797
  const request = createApprovalRequest({
919
798
  runId: "run-1",
799
+ requestId: "req-1",
920
800
  conversationId: "conv-1",
921
801
  channel: "telegram",
922
802
  requesterExternalUserId: "user-99",
@@ -932,13 +812,14 @@ describe("guardian approval request CRUD", () => {
932
812
  decidedByExternalUserId: "user-42",
933
813
  });
934
814
 
935
- const found = getPendingApprovalForRun("run-1");
815
+ const found = getPendingApprovalForRequest("req-1");
936
816
  expect(found).toBeNull();
937
817
  });
938
818
 
939
819
  test("multiple approval requests for different runs are independent", () => {
940
820
  createApprovalRequest({
941
821
  runId: "run-1",
822
+ requestId: "req-1",
942
823
  conversationId: "conv-1",
943
824
  channel: "telegram",
944
825
  requesterExternalUserId: "user-99",
@@ -951,6 +832,7 @@ describe("guardian approval request CRUD", () => {
951
832
 
952
833
  createApprovalRequest({
953
834
  runId: "run-2",
835
+ requestId: "req-2",
954
836
  conversationId: "conv-2",
955
837
  channel: "telegram",
956
838
  requesterExternalUserId: "user-88",
@@ -961,8 +843,8 @@ describe("guardian approval request CRUD", () => {
961
843
  expiresAt: Date.now() + 300_000,
962
844
  });
963
845
 
964
- const found1 = getPendingApprovalForRun("run-1");
965
- const found2 = getPendingApprovalForRun("run-2");
846
+ const found1 = getPendingApprovalForRequest("req-1");
847
+ const found2 = getPendingApprovalForRequest("req-2");
966
848
  expect(found1).not.toBeNull();
967
849
  expect(found2).not.toBeNull();
968
850
  expect(found1!.toolName).toBe("shell");
@@ -972,6 +854,7 @@ describe("guardian approval request CRUD", () => {
972
854
  test("createApprovalRequest works for sms channel", () => {
973
855
  const request = createApprovalRequest({
974
856
  runId: "run-sms-1",
857
+ requestId: "req-sms-1",
975
858
  conversationId: "conv-sms-1",
976
859
  channel: "sms",
977
860
  requesterExternalUserId: "phone-user-99",
@@ -984,10 +867,11 @@ describe("guardian approval request CRUD", () => {
984
867
 
985
868
  expect(request.id).toBeDefined();
986
869
  expect(request.runId).toBe("run-sms-1");
870
+ expect(request.requestId).toBe("req-sms-1");
987
871
  expect(request.channel).toBe("sms");
988
872
  expect(request.status).toBe("pending");
989
873
 
990
- const found = getPendingApprovalForRun("run-sms-1");
874
+ const found = getPendingApprovalForRequest("req-sms-1");
991
875
  expect(found).not.toBeNull();
992
876
  expect(found!.channel).toBe("sms");
993
877
  });
@@ -995,6 +879,7 @@ describe("guardian approval request CRUD", () => {
995
879
  test("getPendingApprovalByGuardianChat works for sms channel", () => {
996
880
  createApprovalRequest({
997
881
  runId: "run-sms-2",
882
+ requestId: "req-sms-2",
998
883
  conversationId: "conv-sms-2",
999
884
  channel: "sms",
1000
885
  requesterExternalUserId: "phone-user-99",
@@ -1020,6 +905,7 @@ describe("guardian approval request CRUD", () => {
1020
905
  test("createApprovalRequest with optional fields omitted defaults to null", () => {
1021
906
  const request = createApprovalRequest({
1022
907
  runId: "run-1",
908
+ requestId: "req-1",
1023
909
  conversationId: "conv-1",
1024
910
  channel: "telegram",
1025
911
  requesterExternalUserId: "user-99",
@@ -1345,134 +1231,130 @@ describe("guardian service rate limiting", () => {
1345
1231
  });
1346
1232
 
1347
1233
  // ═══════════════════════════════════════════════════════════════════════════
1348
- // 8. Assistant-scoped guardian resolution
1234
+ // 8. Channel-scoped guardian resolution
1349
1235
  // ═══════════════════════════════════════════════════════════════════════════
1350
1236
 
1351
- describe("assistant-scoped guardian resolution", () => {
1237
+ describe("channel-scoped guardian resolution", () => {
1352
1238
  beforeEach(() => {
1353
1239
  resetTables();
1354
1240
  });
1355
1241
 
1356
- test("isGuardian resolves independently per assistantId", () => {
1357
- // Create guardian binding for asst-A on telegram
1358
- createBinding({
1359
- assistantId: "asst-A",
1242
+ test("isGuardian resolves independently per channel", () => {
1243
+ // Create guardian binding on telegram
1244
+ createGuardianBinding({
1245
+ assistantId: "self",
1360
1246
  channel: "telegram",
1361
1247
  guardianExternalUserId: "user-alpha",
1362
1248
  guardianPrincipalId: "user-alpha",
1363
1249
  guardianDeliveryChatId: "chat-alpha",
1364
1250
  });
1365
- // Create guardian binding for asst-B on telegram with a different user
1366
- createBinding({
1367
- assistantId: "asst-B",
1368
- channel: "telegram",
1251
+ // Create guardian binding on sms with a different user
1252
+ createGuardianBinding({
1253
+ assistantId: "self",
1254
+ channel: "sms",
1369
1255
  guardianExternalUserId: "user-beta",
1370
1256
  guardianPrincipalId: "user-beta",
1371
1257
  guardianDeliveryChatId: "chat-beta",
1372
1258
  });
1373
1259
 
1374
- // user-alpha is guardian for asst-A but not asst-B
1375
- expect(isGuardian("asst-A", "telegram", "user-alpha")).toBe(true);
1376
- expect(isGuardian("asst-B", "telegram", "user-alpha")).toBe(false);
1260
+ // user-alpha is guardian for telegram but not sms
1261
+ expect(isGuardian("self", "telegram", "user-alpha")).toBe(true);
1262
+ expect(isGuardian("self", "sms", "user-alpha")).toBe(false);
1377
1263
 
1378
- // user-beta is guardian for asst-B but not asst-A
1379
- expect(isGuardian("asst-B", "telegram", "user-beta")).toBe(true);
1380
- expect(isGuardian("asst-A", "telegram", "user-beta")).toBe(false);
1264
+ // user-beta is guardian for sms but not telegram
1265
+ expect(isGuardian("self", "sms", "user-beta")).toBe(true);
1266
+ expect(isGuardian("self", "telegram", "user-beta")).toBe(false);
1381
1267
  });
1382
1268
 
1383
- test("getGuardianBinding returns different bindings for different assistants", () => {
1384
- createBinding({
1385
- assistantId: "asst-A",
1269
+ test("getGuardianBinding returns different bindings for different channels", () => {
1270
+ createGuardianBinding({
1271
+ assistantId: "self",
1386
1272
  channel: "telegram",
1387
1273
  guardianExternalUserId: "user-alpha",
1388
1274
  guardianPrincipalId: "user-alpha",
1389
1275
  guardianDeliveryChatId: "chat-alpha",
1390
1276
  });
1391
- createBinding({
1392
- assistantId: "asst-B",
1393
- channel: "telegram",
1277
+ createGuardianBinding({
1278
+ assistantId: "self",
1279
+ channel: "sms",
1394
1280
  guardianExternalUserId: "user-beta",
1395
1281
  guardianPrincipalId: "user-beta",
1396
1282
  guardianDeliveryChatId: "chat-beta",
1397
1283
  });
1398
1284
 
1399
- const bindingA = getGuardianBinding("asst-A", "telegram");
1400
- const bindingB = getGuardianBinding("asst-B", "telegram");
1285
+ const bindingTelegram = getGuardianBinding("self", "telegram");
1286
+ const bindingSms = getGuardianBinding("self", "sms");
1401
1287
 
1402
- expect(bindingA).not.toBeNull();
1403
- expect(bindingB).not.toBeNull();
1404
- expect(bindingA!.guardianExternalUserId).toBe("user-alpha");
1405
- expect(bindingB!.guardianExternalUserId).toBe("user-beta");
1288
+ expect(bindingTelegram).not.toBeNull();
1289
+ expect(bindingSms).not.toBeNull();
1290
+ expect(bindingTelegram!.guardianExternalUserId).toBe("user-alpha");
1291
+ expect(bindingSms!.guardianExternalUserId).toBe("user-beta");
1406
1292
  });
1407
1293
 
1408
- test("revoking binding for one assistant does not affect another", () => {
1409
- createBinding({
1410
- assistantId: "asst-A",
1294
+ test("revoking binding for one channel does not affect another", () => {
1295
+ createGuardianBinding({
1296
+ assistantId: "self",
1411
1297
  channel: "telegram",
1412
1298
  guardianExternalUserId: "user-alpha",
1413
1299
  guardianPrincipalId: "user-alpha",
1414
1300
  guardianDeliveryChatId: "chat-alpha",
1415
1301
  });
1416
- createBinding({
1417
- assistantId: "asst-B",
1418
- channel: "telegram",
1302
+ createGuardianBinding({
1303
+ assistantId: "self",
1304
+ channel: "sms",
1419
1305
  guardianExternalUserId: "user-beta",
1420
1306
  guardianPrincipalId: "user-beta",
1421
1307
  guardianDeliveryChatId: "chat-beta",
1422
1308
  });
1423
1309
 
1424
- serviceRevokeBinding("asst-A", "telegram");
1310
+ serviceRevokeBinding("self", "telegram");
1425
1311
 
1426
- expect(getGuardianBinding("asst-A", "telegram")).toBeNull();
1427
- expect(getGuardianBinding("asst-B", "telegram")).not.toBeNull();
1312
+ expect(getGuardianBinding("self", "telegram")).toBeNull();
1313
+ expect(getGuardianBinding("self", "sms")).not.toBeNull();
1428
1314
  });
1429
1315
 
1430
- test("validateAndConsumeChallenge scoped to assistantId", () => {
1431
- // Create challenge for asst-A
1432
- const { secret: secretA } = createVerificationChallenge(
1433
- "asst-A",
1434
- "telegram",
1435
- );
1436
- // Create challenge for asst-B
1437
- const { secret: secretB } = createVerificationChallenge(
1438
- "asst-B",
1316
+ test("validateAndConsumeChallenge scoped to channel", () => {
1317
+ // Create challenge on telegram
1318
+ const { secret: secretTelegram } = createVerificationChallenge(
1319
+ "self",
1439
1320
  "telegram",
1440
1321
  );
1322
+ // Create challenge on sms
1323
+ const { secret: secretSms } = createVerificationChallenge("self", "sms");
1441
1324
 
1442
- // Attempting to consume asst-A challenge with asst-B should fail
1325
+ // Attempting to consume telegram challenge on sms should fail
1443
1326
  const crossResult = validateAndConsumeChallenge(
1444
- "asst-B",
1445
- "telegram",
1446
- secretA,
1327
+ "self",
1328
+ "sms",
1329
+ secretTelegram,
1447
1330
  "user-1",
1448
1331
  "chat-1",
1449
1332
  );
1450
1333
  expect(crossResult.success).toBe(false);
1451
1334
 
1452
- // Consuming with correct assistantId should succeed
1453
- const resultA = validateAndConsumeChallenge(
1454
- "asst-A",
1335
+ // Consuming with correct channel should succeed
1336
+ const resultTelegram = validateAndConsumeChallenge(
1337
+ "self",
1455
1338
  "telegram",
1456
- secretA,
1339
+ secretTelegram,
1457
1340
  "user-1",
1458
1341
  "chat-1",
1459
1342
  );
1460
- expect(resultA.success).toBe(true);
1343
+ expect(resultTelegram.success).toBe(true);
1461
1344
 
1462
- const resultB = validateAndConsumeChallenge(
1463
- "asst-B",
1464
- "telegram",
1465
- secretB,
1345
+ const resultSms = validateAndConsumeChallenge(
1346
+ "self",
1347
+ "sms",
1348
+ secretSms,
1466
1349
  "user-2",
1467
1350
  "chat-2",
1468
1351
  );
1469
- expect(resultB.success).toBe(true);
1352
+ expect(resultSms.success).toBe(true);
1470
1353
 
1471
- // Verify bindings are scoped correctly
1472
- const bindingA = getGuardianBinding("asst-A", "telegram");
1473
- const bindingB = getGuardianBinding("asst-B", "telegram");
1474
- expect(bindingA!.guardianExternalUserId).toBe("user-1");
1475
- expect(bindingB!.guardianExternalUserId).toBe("user-2");
1354
+ const bindingTelegram = getGuardianBinding("self", "telegram");
1355
+ const bindingSms = getGuardianBinding("self", "sms");
1356
+ expect(bindingTelegram).toBeNull();
1357
+ expect(bindingSms).toBeNull();
1476
1358
  });
1477
1359
  });
1478
1360
 
@@ -1488,6 +1370,7 @@ describe("assistant-scoped approval request lookups", () => {
1488
1370
  test("createApprovalRequest stores assistantId and defaults to self", () => {
1489
1371
  const reqWithoutId = createApprovalRequest({
1490
1372
  runId: "run-1",
1373
+ requestId: "req-1",
1491
1374
  conversationId: "conv-1",
1492
1375
  channel: "telegram",
1493
1376
  requesterExternalUserId: "user-99",
@@ -1501,6 +1384,7 @@ describe("assistant-scoped approval request lookups", () => {
1501
1384
 
1502
1385
  const reqWithId = createApprovalRequest({
1503
1386
  runId: "run-2",
1387
+ requestId: "req-2",
1504
1388
  conversationId: "conv-2",
1505
1389
  assistantId: "asst-A",
1506
1390
  channel: "telegram",
@@ -1517,6 +1401,7 @@ describe("assistant-scoped approval request lookups", () => {
1517
1401
  test("approval requests from different assistants are independent", () => {
1518
1402
  createApprovalRequest({
1519
1403
  runId: "run-A",
1404
+ requestId: "req-A",
1520
1405
  conversationId: "conv-A",
1521
1406
  assistantId: "asst-A",
1522
1407
  channel: "telegram",
@@ -1529,6 +1414,7 @@ describe("assistant-scoped approval request lookups", () => {
1529
1414
  });
1530
1415
  createApprovalRequest({
1531
1416
  runId: "run-B",
1417
+ requestId: "req-B",
1532
1418
  conversationId: "conv-B",
1533
1419
  assistantId: "asst-B",
1534
1420
  channel: "telegram",
@@ -1540,8 +1426,8 @@ describe("assistant-scoped approval request lookups", () => {
1540
1426
  expiresAt: Date.now() + 300_000,
1541
1427
  });
1542
1428
 
1543
- const foundA = getPendingApprovalForRun("run-A");
1544
- const foundB = getPendingApprovalForRun("run-B");
1429
+ const foundA = getPendingApprovalForRequest("req-A");
1430
+ const foundB = getPendingApprovalForRequest("req-B");
1545
1431
  expect(foundA).not.toBeNull();
1546
1432
  expect(foundB).not.toBeNull();
1547
1433
  expect(foundA!.assistantId).toBe("asst-A");
@@ -1634,7 +1520,7 @@ describe("IPC handler channel-aware guardian status", () => {
1634
1520
  });
1635
1521
 
1636
1522
  test("status action returns guardianDeliveryChatId when bound", () => {
1637
- createBinding({
1523
+ createGuardianBinding({
1638
1524
  assistantId: "self",
1639
1525
  channel: "telegram",
1640
1526
  guardianExternalUserId: "user-42",
@@ -1662,7 +1548,7 @@ describe("IPC handler channel-aware guardian status", () => {
1662
1548
  });
1663
1549
 
1664
1550
  test("status action returns guardian username/displayName from binding metadata", () => {
1665
- createBinding({
1551
+ createGuardianBinding({
1666
1552
  assistantId: "self",
1667
1553
  channel: "telegram",
1668
1554
  guardianExternalUserId: "user-43",
@@ -1674,6 +1560,27 @@ describe("IPC handler channel-aware guardian status", () => {
1674
1560
  }),
1675
1561
  });
1676
1562
 
1563
+ // The contacts table stores displayName but not username.
1564
+ // The handler falls back to externalConversationStore for username,
1565
+ // so populate it here to ensure identity data is fully surfaced.
1566
+ const now = Date.now();
1567
+ getDb()
1568
+ .insert(conversations)
1569
+ .values({
1570
+ id: "conv-guardian-43",
1571
+ createdAt: now,
1572
+ updatedAt: now,
1573
+ })
1574
+ .run();
1575
+ upsertExternalBinding({
1576
+ conversationId: "conv-guardian-43",
1577
+ sourceChannel: "telegram",
1578
+ externalChatId: "chat-43",
1579
+ externalUserId: "user-43",
1580
+ username: "guardian_handle",
1581
+ displayName: "Guardian Name",
1582
+ });
1583
+
1677
1584
  const { ctx, lastResponse } = createMockCtx();
1678
1585
  const msg: GuardianVerificationRequest = {
1679
1586
  type: "guardian_verification",
@@ -1850,12 +1757,10 @@ describe("voice guardian challenge validation", () => {
1850
1757
  );
1851
1758
 
1852
1759
  expect(result.success).toBe(true);
1853
- if (result.success && result.verificationType === "guardian") {
1854
- expect(result.bindingId).toBeDefined();
1855
- }
1760
+ expect(result.verificationType).toBe("guardian");
1856
1761
  });
1857
1762
 
1858
- test("validateAndConsumeChallenge creates a guardian binding for voice", () => {
1763
+ test("validateAndConsumeChallenge does not create a guardian binding for voice (caller responsibility)", () => {
1859
1764
  const { secret } = createVerificationChallenge("asst-1", "voice");
1860
1765
 
1861
1766
  validateAndConsumeChallenge(
@@ -1866,12 +1771,8 @@ describe("voice guardian challenge validation", () => {
1866
1771
  "voice-chat-1",
1867
1772
  );
1868
1773
 
1869
- const binding = getActiveBinding("asst-1", "voice");
1870
- expect(binding).not.toBeNull();
1871
- expect(binding!.guardianExternalUserId).toBe("voice-user-1");
1872
- expect(binding!.guardianDeliveryChatId).toBe("voice-chat-1");
1873
- expect(binding!.channel).toBe("voice");
1874
- expect(binding!.verifiedVia).toBe("challenge");
1774
+ const binding = getGuardianBinding("asst-1", "voice");
1775
+ expect(binding).toBeNull();
1875
1776
  });
1876
1777
 
1877
1778
  test("validateAndConsumeChallenge fails with wrong voice secret", () => {
@@ -1950,8 +1851,8 @@ describe("voice guardian challenge validation", () => {
1950
1851
  expect(result2.success).toBe(false);
1951
1852
  });
1952
1853
 
1953
- test("validateAndConsumeChallenge revokes existing voice binding before creating new one", () => {
1954
- createBinding({
1854
+ test("validateAndConsumeChallenge succeeds even with existing voice binding (conflict check is caller responsibility)", () => {
1855
+ createGuardianBinding({
1955
1856
  assistantId: "asst-1",
1956
1857
  channel: "voice",
1957
1858
  guardianExternalUserId: "old-voice-user",
@@ -1959,11 +1860,10 @@ describe("voice guardian challenge validation", () => {
1959
1860
  guardianDeliveryChatId: "old-voice-chat",
1960
1861
  });
1961
1862
 
1962
- const oldBinding = getActiveBinding("asst-1", "voice");
1863
+ const oldBinding = getGuardianBinding("asst-1", "voice");
1963
1864
  expect(oldBinding).not.toBeNull();
1964
1865
  expect(oldBinding!.guardianExternalUserId).toBe("old-voice-user");
1965
1866
 
1966
- // Attempt verification with a different user — should be rejected
1967
1867
  const { secret } = createVerificationChallenge("asst-1", "voice");
1968
1868
  const result = validateAndConsumeChallenge(
1969
1869
  "asst-1",
@@ -1973,11 +1873,11 @@ describe("voice guardian challenge validation", () => {
1973
1873
  "new-voice-chat",
1974
1874
  );
1975
1875
 
1976
- // The different-user takeover should be blocked
1977
- expect(result.success).toBe(false);
1876
+ // Challenge validation succeeds
1877
+ expect(result.success).toBe(true);
1978
1878
 
1979
- // The original binding should remain active
1980
- const binding = getActiveBinding("asst-1", "voice");
1879
+ // The original binding is untouched (no side effects)
1880
+ const binding = getGuardianBinding("asst-1", "voice");
1981
1881
  expect(binding).not.toBeNull();
1982
1882
  expect(binding!.guardianExternalUserId).toBe("old-voice-user");
1983
1883
  });
@@ -1993,7 +1893,7 @@ describe("voice guardian identity and revocation", () => {
1993
1893
  });
1994
1894
 
1995
1895
  test("isGuardian works for voice channel", () => {
1996
- createBinding({
1896
+ createGuardianBinding({
1997
1897
  assistantId: "asst-1",
1998
1898
  channel: "voice",
1999
1899
  guardianExternalUserId: "voice-user-1",
@@ -2008,7 +1908,7 @@ describe("voice guardian identity and revocation", () => {
2008
1908
  });
2009
1909
 
2010
1910
  test("getGuardianBinding returns voice binding", () => {
2011
- createBinding({
1911
+ createGuardianBinding({
2012
1912
  assistantId: "asst-1",
2013
1913
  channel: "voice",
2014
1914
  guardianExternalUserId: "voice-user-1",
@@ -2023,7 +1923,7 @@ describe("voice guardian identity and revocation", () => {
2023
1923
  });
2024
1924
 
2025
1925
  test("revokeBinding clears active voice guardian binding", () => {
2026
- createBinding({
1926
+ createGuardianBinding({
2027
1927
  assistantId: "asst-1",
2028
1928
  channel: "voice",
2029
1929
  guardianExternalUserId: "voice-user-1",
@@ -2037,14 +1937,14 @@ describe("voice guardian identity and revocation", () => {
2037
1937
  });
2038
1938
 
2039
1939
  test("revokeBinding for voice does not affect telegram binding", () => {
2040
- createBinding({
1940
+ createGuardianBinding({
2041
1941
  assistantId: "asst-1",
2042
1942
  channel: "voice",
2043
1943
  guardianExternalUserId: "voice-user-1",
2044
1944
  guardianPrincipalId: "voice-user-1",
2045
1945
  guardianDeliveryChatId: "voice-chat-1",
2046
1946
  });
2047
- createBinding({
1947
+ createGuardianBinding({
2048
1948
  assistantId: "asst-1",
2049
1949
  channel: "telegram",
2050
1950
  guardianExternalUserId: "tg-user-1",
@@ -2272,7 +2172,7 @@ describe("IPC handler voice guardian verification", () => {
2272
2172
  });
2273
2173
 
2274
2174
  test("status for voice reflects bound state", () => {
2275
- createBinding({
2175
+ createGuardianBinding({
2276
2176
  assistantId: "self",
2277
2177
  channel: "voice",
2278
2178
  guardianExternalUserId: "voice-user-1",
@@ -2299,7 +2199,7 @@ describe("IPC handler voice guardian verification", () => {
2299
2199
  });
2300
2200
 
2301
2201
  test("revoke for voice clears active binding", () => {
2302
- createBinding({
2202
+ createGuardianBinding({
2303
2203
  assistantId: "self",
2304
2204
  channel: "voice",
2305
2205
  guardianExternalUserId: "voice-user-1",
@@ -2326,14 +2226,14 @@ describe("IPC handler voice guardian verification", () => {
2326
2226
  });
2327
2227
 
2328
2228
  test("revoke for voice does not affect telegram binding", () => {
2329
- createBinding({
2229
+ createGuardianBinding({
2330
2230
  assistantId: "self",
2331
2231
  channel: "voice",
2332
2232
  guardianExternalUserId: "voice-user-1",
2333
2233
  guardianPrincipalId: "voice-user-1",
2334
2234
  guardianDeliveryChatId: "voice-chat-1",
2335
2235
  });
2336
- createBinding({
2236
+ createGuardianBinding({
2337
2237
  assistantId: "self",
2338
2238
  channel: "telegram",
2339
2239
  guardianExternalUserId: "tg-user-1",
@@ -2592,9 +2492,7 @@ describe("outbound verification sessions", () => {
2592
2492
  );
2593
2493
 
2594
2494
  expect(result.success).toBe(true);
2595
- if (result.success && result.verificationType === "guardian") {
2596
- expect(result.bindingId).toBeDefined();
2597
- }
2495
+ expect(result.verificationType).toBe("guardian");
2598
2496
  });
2599
2497
 
2600
2498
  // ── Session state transitions ──
@@ -2892,7 +2790,7 @@ describe("outbound SMS verification", () => {
2892
2790
 
2893
2791
  test("start_outbound rejects when active binding exists (rebind=false)", () => {
2894
2792
  // Create an existing guardian binding
2895
- createBinding({
2793
+ createGuardianBinding({
2896
2794
  assistantId: "self",
2897
2795
  channel: "sms",
2898
2796
  guardianExternalUserId: "+15551234567",
@@ -2919,7 +2817,7 @@ describe("outbound SMS verification", () => {
2919
2817
 
2920
2818
  test("start_outbound allows rebind when rebind=true", () => {
2921
2819
  // Create an existing guardian binding
2922
- createBinding({
2820
+ createGuardianBinding({
2923
2821
  assistantId: "self",
2924
2822
  channel: "sms",
2925
2823
  guardianExternalUserId: "+15551234567",
@@ -3124,14 +3022,7 @@ describe("outbound SMS verification", () => {
3124
3022
  );
3125
3023
 
3126
3024
  expect(result.success).toBe(true);
3127
- if (result.success) {
3128
- // Guardian outbound sessions (no verificationPurpose override) create
3129
- // guardian bindings on success
3130
- expect(result.verificationType).toBe("guardian");
3131
- if (result.verificationType === "guardian") {
3132
- expect(result.bindingId).toBeDefined();
3133
- }
3134
- }
3025
+ expect(result.verificationType).toBe("guardian");
3135
3026
  });
3136
3027
 
3137
3028
  test("inbound SMS from wrong identity + correct code is rejected", () => {
@@ -3432,7 +3323,7 @@ describe("outbound Telegram verification", () => {
3432
3323
  });
3433
3324
 
3434
3325
  test("start_outbound for telegram rejects when active binding exists (rebind=false)", () => {
3435
- createBinding({
3326
+ createGuardianBinding({
3436
3327
  assistantId: "self",
3437
3328
  channel: "telegram",
3438
3329
  guardianExternalUserId: "user-42",
@@ -3956,7 +3847,7 @@ describe("outbound voice verification", () => {
3956
3847
  });
3957
3848
 
3958
3849
  test("start_outbound for voice rejects when binding exists (rebind=false)", () => {
3959
- createBinding({
3850
+ createGuardianBinding({
3960
3851
  assistantId: "self",
3961
3852
  channel: "voice",
3962
3853
  guardianExternalUserId: "+15551234567",