@vellumai/assistant 0.4.42 → 0.4.44

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 (867) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +140 -403
  4. package/Dockerfile +0 -1
  5. package/README.md +81 -92
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +81 -104
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -3
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-asset.test.ts +1 -1
  33. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  34. package/src/__tests__/call-controller.test.ts +4 -8
  35. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  36. package/src/__tests__/call-domain.test.ts +250 -8
  37. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  38. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  39. package/src/__tests__/call-recovery.test.ts +47 -0
  40. package/src/__tests__/call-routes-http.test.ts +13 -0
  41. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  42. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  43. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  44. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  45. package/src/__tests__/channel-approval.test.ts +0 -201
  46. package/src/__tests__/channel-approvals.test.ts +2 -2
  47. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  48. package/src/__tests__/channel-guardian.test.ts +641 -740
  49. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  50. package/src/__tests__/channel-policy.test.ts +9 -12
  51. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  52. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  53. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  54. package/src/__tests__/checker.test.ts +41 -35
  55. package/src/__tests__/chrome-cdp.test.ts +57 -17
  56. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  57. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  58. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  59. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  60. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  61. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  62. package/src/__tests__/config-watcher.test.ts +1 -5
  63. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  64. package/src/__tests__/connection-policy.test.ts +3 -62
  65. package/src/__tests__/contacts-tools.test.ts +0 -2
  66. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  67. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  68. package/src/__tests__/context-window-manager.test.ts +220 -61
  69. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  70. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  71. package/src/__tests__/conversation-pairing.test.ts +14 -14
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +7 -7
  73. package/src/__tests__/conversation-store.test.ts +2 -2
  74. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  75. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +10 -16
  77. package/src/__tests__/credentials-cli.test.ts +49 -5
  78. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  79. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  80. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  81. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  82. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  84. package/src/__tests__/email-cli.test.ts +12 -12
  85. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  86. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  87. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  88. package/src/__tests__/event-bus.test.ts +0 -1
  89. package/src/__tests__/followup-tools.test.ts +0 -2
  90. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  91. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  92. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  95. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  97. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  98. package/src/__tests__/guardian-action-store.test.ts +2 -2
  99. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  101. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  102. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  103. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  104. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  105. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  106. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  109. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  110. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  111. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  112. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  113. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  114. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  115. package/src/__tests__/heartbeat-service.test.ts +1 -1
  116. package/src/__tests__/host-shell-tool.test.ts +3 -12
  117. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  118. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  119. package/src/__tests__/integration-status.test.ts +8 -8
  120. package/src/__tests__/intent-routing.test.ts +9 -13
  121. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  122. package/src/__tests__/invite-routes-http.test.ts +10 -10
  123. package/src/__tests__/llm-usage-store.test.ts +45 -9
  124. package/src/__tests__/local-gateway-health.test.ts +209 -0
  125. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  126. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  127. package/src/__tests__/managed-store.test.ts +29 -12
  128. package/src/__tests__/managed-twitter-guardrails.test.ts +357 -0
  129. package/src/__tests__/mcp-cli.test.ts +1 -1
  130. package/src/__tests__/mcp-health-check.test.ts +1 -1
  131. package/src/__tests__/media-generate-image.test.ts +1 -1
  132. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  133. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  134. package/src/__tests__/memory-regressions.test.ts +1 -166
  135. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  136. package/src/__tests__/migration-export-http.test.ts +2 -2
  137. package/src/__tests__/migration-transport.test.ts +44 -0
  138. package/src/__tests__/non-member-access-request.test.ts +49 -36
  139. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  140. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  141. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  142. package/src/__tests__/notification-deep-link.test.ts +3 -3
  143. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  144. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  145. package/src/__tests__/oauth-cli.test.ts +1 -1
  146. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  147. package/src/__tests__/onboarding-template-contract.test.ts +2 -12
  148. package/src/__tests__/platform.test.ts +168 -5
  149. package/src/__tests__/playbook-execution.test.ts +0 -2
  150. package/src/__tests__/playbook-tools.test.ts +0 -2
  151. package/src/__tests__/pricing.test.ts +125 -0
  152. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  153. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  154. package/src/__tests__/recording-handler.test.ts +46 -80
  155. package/src/__tests__/recording-state-machine.test.ts +112 -183
  156. package/src/__tests__/registry.test.ts +1 -1
  157. package/src/__tests__/relay-server.test.ts +69 -71
  158. package/src/__tests__/reminder-store.test.ts +3 -3
  159. package/src/__tests__/request-file-tool.test.ts +2 -2
  160. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  163. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  164. package/src/__tests__/schedule-store.test.ts +13 -4
  165. package/src/__tests__/schedule-tools.test.ts +0 -2
  166. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  167. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  168. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  169. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  170. package/src/__tests__/secret-response-routing.test.ts +1 -1
  171. package/src/__tests__/send-endpoint-busy.test.ts +1 -4
  172. package/src/__tests__/sequence-store.test.ts +0 -2
  173. package/src/__tests__/server-history-render.test.ts +2 -199
  174. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  175. package/src/__tests__/session-agent-loop.test.ts +107 -3
  176. package/src/__tests__/session-confirmation-signals.test.ts +17 -49
  177. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  178. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  179. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  180. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  181. package/src/__tests__/session-profile-injection.test.ts +9 -3
  182. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  183. package/src/__tests__/session-queue.test.ts +10 -4
  184. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  185. package/src/__tests__/session-skill-tools.test.ts +2 -3
  186. package/src/__tests__/session-slash-known.test.ts +11 -4
  187. package/src/__tests__/session-slash-queue.test.ts +11 -4
  188. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  189. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  190. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  191. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  192. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  193. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  194. package/src/__tests__/session-usage.test.ts +180 -0
  195. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  196. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  199. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  200. package/src/__tests__/skill-include-graph.test.ts +1 -0
  201. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  202. package/src/__tests__/skill-load-tool.test.ts +90 -12
  203. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  204. package/src/__tests__/skills-uninstall.test.ts +131 -0
  205. package/src/__tests__/skills.test.ts +32 -16
  206. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  207. package/src/__tests__/slack-channel-config.test.ts +71 -12
  208. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  209. package/src/__tests__/slack-share-routes.test.ts +1 -1
  210. package/src/__tests__/slack-skill.test.ts +2 -2
  211. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  212. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  213. package/src/__tests__/starter-task-flow.test.ts +10 -20
  214. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  215. package/src/__tests__/subagent-tools.test.ts +2 -2
  216. package/src/__tests__/system-prompt.test.ts +7 -12
  217. package/src/__tests__/task-compiler.test.ts +0 -2
  218. package/src/__tests__/task-management-tools.test.ts +0 -2
  219. package/src/__tests__/task-runner.test.ts +0 -2
  220. package/src/__tests__/task-scheduler.test.ts +2 -2
  221. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  222. package/src/__tests__/terminal-tools.test.ts +1 -11
  223. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  224. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  225. package/src/__tests__/tool-executor.test.ts +2 -2
  226. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  227. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  228. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  229. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  230. package/src/__tests__/trace-emitter.test.ts +1 -1
  231. package/src/__tests__/trust-context-guards.test.ts +1 -1
  232. package/src/__tests__/trust-store.test.ts +48 -399
  233. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  234. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  235. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  236. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  237. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  238. package/src/__tests__/twilio-config.test.ts +11 -2
  239. package/src/__tests__/twilio-provider.test.ts +6 -4
  240. package/src/__tests__/twilio-routes.test.ts +408 -86
  241. package/src/__tests__/twitter-platform-proxy-client.test.ts +475 -0
  242. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  243. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  244. package/src/__tests__/update-bulletin.test.ts +4 -8
  245. package/src/__tests__/update-template-contract.test.ts +1 -1
  246. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  247. package/src/__tests__/usage-routes.test.ts +23 -5
  248. package/src/__tests__/user-reference.test.ts +1 -1
  249. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  250. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  251. package/src/__tests__/view-image-tool.test.ts +0 -2
  252. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  253. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  254. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  255. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  256. package/src/__tests__/workspace-policy.test.ts +1 -1
  257. package/src/approvals/AGENTS.md +4 -4
  258. package/src/approvals/approval-primitive.ts +2 -2
  259. package/src/approvals/guardian-decision-primitive.ts +1 -1
  260. package/src/approvals/guardian-request-resolvers.ts +3 -4
  261. package/src/bundler/app-bundler.ts +29 -217
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +14 -54
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +108 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +15 -17
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +345 -0
  316. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +252 -0
  317. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -48
  318. package/src/cli/commands/twitter/index.ts +420 -0
  319. package/src/{twitter → cli/commands/twitter}/oauth-client.ts +1 -35
  320. package/src/cli/commands/twitter/router.ts +351 -0
  321. package/src/cli/commands/twitter/types.ts +30 -0
  322. package/src/cli/db.ts +1 -0
  323. package/src/cli/http-client.ts +87 -0
  324. package/src/cli/logger.ts +6 -0
  325. package/src/cli/main-screen.tsx +4 -3
  326. package/src/cli/output.ts +19 -0
  327. package/src/cli/program.ts +29 -27
  328. package/src/cli/reference.ts +27 -37
  329. package/src/cli.ts +452 -240
  330. package/src/config/assistant-feature-flags.ts +3 -15
  331. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  332. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  333. package/src/config/bundled-skills/amazon/SKILL.md +15 -6
  334. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  335. package/src/config/bundled-skills/app-builder/SKILL.md +4 -9
  336. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +23 -77
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -12
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -90
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +132 -109
  350. package/src/config/bundled-skills/doordash/lib/session.ts +22 -19
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +73 -144
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +8 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +196 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +151 -105
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +155 -55
  452. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  453. package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -25
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +30 -20
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +7 -1
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/surfaces.ts +2 -0
  462. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  463. package/src/daemon/providers-setup.ts +0 -5
  464. package/src/daemon/recording-executor.ts +0 -7
  465. package/src/daemon/ride-shotgun-handler.ts +42 -14
  466. package/src/daemon/seed-files.ts +3 -27
  467. package/src/daemon/server.ts +134 -524
  468. package/src/daemon/session-agent-loop-handlers.ts +46 -9
  469. package/src/daemon/session-agent-loop.ts +86 -24
  470. package/src/daemon/session-attachments.ts +1 -1
  471. package/src/daemon/session-error.ts +1 -1
  472. package/src/daemon/session-history.ts +20 -15
  473. package/src/daemon/session-lifecycle.ts +9 -7
  474. package/src/daemon/session-memory.ts +15 -1
  475. package/src/daemon/session-messaging.ts +10 -6
  476. package/src/daemon/session-notifiers.ts +10 -8
  477. package/src/daemon/session-process.ts +34 -25
  478. package/src/daemon/session-queue-manager.ts +1 -1
  479. package/src/daemon/session-runtime-assembly.ts +6 -32
  480. package/src/daemon/session-surfaces.ts +187 -35
  481. package/src/daemon/session-tool-setup.ts +1 -1
  482. package/src/daemon/session-usage.ts +119 -18
  483. package/src/daemon/session.ts +11 -33
  484. package/src/daemon/tool-side-effects.ts +6 -5
  485. package/src/daemon/trace-emitter.ts +1 -1
  486. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  487. package/src/daemon/watch-handler.ts +2 -5
  488. package/src/email/service.ts +8 -8
  489. package/src/events/domain-events.ts +0 -1
  490. package/src/events/tool-notification-listener.ts +1 -1
  491. package/src/followups/followup-store.ts +1 -2
  492. package/src/followups/types.ts +0 -6
  493. package/src/heartbeat/heartbeat-service.ts +1 -1
  494. package/src/inbound/platform-callback-registration.ts +1 -1
  495. package/src/inbound/public-ingress-urls.ts +0 -8
  496. package/src/index.ts +12 -0
  497. package/src/mcp/client.ts +1 -1
  498. package/src/mcp/manager.ts +1 -1
  499. package/src/memory/app-store.ts +1 -60
  500. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  501. package/src/memory/conversation-attention-store.ts +154 -0
  502. package/src/memory/conversation-bootstrap.ts +1 -1
  503. package/src/memory/conversation-crud.ts +53 -1
  504. package/src/memory/conversation-display-order-migration.ts +2 -3
  505. package/src/memory/conversation-queries.ts +1 -29
  506. package/src/memory/conversation-title-service.ts +26 -21
  507. package/src/memory/db-connection.ts +1 -8
  508. package/src/memory/db-init.ts +20 -0
  509. package/src/memory/delivery-crud.ts +4 -34
  510. package/src/memory/external-conversation-store.ts +1 -1
  511. package/src/memory/format-recall.ts +47 -0
  512. package/src/memory/guardian-action-store.ts +4 -5
  513. package/src/memory/guardian-rate-limits.ts +0 -3
  514. package/src/memory/invite-store.ts +1 -1
  515. package/src/memory/job-handlers/backfill.ts +9 -2
  516. package/src/memory/job-handlers/extraction.ts +2 -7
  517. package/src/memory/job-handlers/summarization.ts +1 -1
  518. package/src/memory/llm-usage-store.ts +11 -0
  519. package/src/memory/migrations/114-notifications.ts +12 -40
  520. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  521. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  522. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  523. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  524. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  525. package/src/memory/migrations/index.ts +5 -0
  526. package/src/memory/migrations/registry.ts +30 -0
  527. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  528. package/src/memory/retriever.test.ts +707 -0
  529. package/src/memory/retriever.ts +120 -116
  530. package/src/memory/schema/calls.ts +3 -7
  531. package/src/memory/schema/guardian.ts +2 -2
  532. package/src/memory/schema/infrastructure.ts +0 -8
  533. package/src/memory/search/lexical.ts +4 -1
  534. package/src/memory/search/query-expansion.test.ts +70 -0
  535. package/src/memory/search/query-expansion.ts +118 -0
  536. package/src/memory/search/types.ts +18 -17
  537. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  538. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  539. package/src/messaging/registry.ts +0 -1
  540. package/src/notifications/README.md +13 -22
  541. package/src/notifications/adapters/macos.ts +1 -1
  542. package/src/notifications/conversation-pairing.ts +2 -2
  543. package/src/notifications/copy-composer.ts +2 -2
  544. package/src/notifications/decision-engine.ts +1 -10
  545. package/src/notifications/destination-resolver.ts +2 -3
  546. package/src/notifications/emit-signal.ts +2 -8
  547. package/src/notifications/guardian-question-mode.ts +5 -8
  548. package/src/notifications/signal.ts +1 -2
  549. package/src/notifications/types.ts +1 -1
  550. package/src/oauth/token-persistence.ts +25 -1
  551. package/src/permissions/checker.ts +4 -29
  552. package/src/permissions/defaults.ts +9 -9
  553. package/src/permissions/prompter.ts +1 -1
  554. package/src/permissions/secret-prompter.ts +1 -1
  555. package/src/permissions/shell-identity.ts +1 -1
  556. package/src/permissions/trust-store.ts +13 -76
  557. package/src/permissions/workspace-policy.ts +1 -1
  558. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  559. package/src/{config → prompts}/system-prompt.ts +44 -26
  560. package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -3
  561. package/src/providers/registry.ts +2 -4
  562. package/src/runtime/AGENTS.md +6 -8
  563. package/src/runtime/access-request-helper.ts +36 -55
  564. package/src/runtime/actor-trust-resolver.ts +1 -24
  565. package/src/runtime/approval-message-composer.ts +6 -2
  566. package/src/runtime/assistant-event.ts +1 -1
  567. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  568. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  569. package/src/runtime/auth/__tests__/scopes.test.ts +2 -1
  570. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  571. package/src/runtime/auth/route-policy.ts +137 -25
  572. package/src/runtime/auth/scopes.ts +1 -0
  573. package/src/runtime/auth/subject.ts +9 -0
  574. package/src/runtime/auth/token-service.ts +12 -1
  575. package/src/runtime/auth/types.ts +1 -1
  576. package/src/runtime/channel-approval-types.ts +1 -1
  577. package/src/runtime/channel-approvals.ts +1 -1
  578. package/src/runtime/channel-invite-transport.ts +0 -2
  579. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  580. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  581. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  582. package/src/runtime/channel-readiness-service.ts +24 -159
  583. package/src/runtime/channel-readiness-types.ts +5 -1
  584. package/src/runtime/channel-reply-delivery.ts +43 -3
  585. package/src/runtime/channel-retry-sweep.ts +14 -22
  586. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  587. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  588. package/src/runtime/gateway-client.ts +12 -15
  589. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  590. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  591. package/src/runtime/guardian-action-message-composer.ts +4 -4
  592. package/src/runtime/guardian-reply-router.ts +3 -3
  593. package/src/runtime/http-server.ts +133 -24
  594. package/src/runtime/http-types.ts +44 -1
  595. package/src/runtime/invite-instruction-generator.ts +1 -3
  596. package/src/runtime/invite-redemption-service.ts +5 -5
  597. package/src/runtime/invite-service.ts +7 -7
  598. package/src/runtime/local-actor-identity.ts +28 -2
  599. package/src/runtime/local-gateway-health.ts +275 -0
  600. package/src/runtime/middleware/error-handler.ts +14 -1
  601. package/src/runtime/middleware/twilio-validation.ts +3 -3
  602. package/src/runtime/migrations/migration-transport.ts +18 -3
  603. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  604. package/src/runtime/nl-approval-parser.ts +2 -3
  605. package/src/runtime/routes/access-request-decision.ts +2 -2
  606. package/src/runtime/routes/app-management-routes.ts +918 -0
  607. package/src/runtime/routes/approval-routes.ts +76 -7
  608. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  609. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  610. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  611. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  612. package/src/runtime/routes/channel-route-shared.ts +1 -3
  613. package/src/runtime/routes/channel-routes.ts +1 -4
  614. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  615. package/src/runtime/routes/computer-use-routes.ts +595 -0
  616. package/src/runtime/routes/contact-routes.ts +1 -317
  617. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  618. package/src/runtime/routes/conversation-routes.ts +20 -24
  619. package/src/runtime/routes/debug-routes.ts +1 -1
  620. package/src/runtime/routes/diagnostics-routes.ts +890 -0
  621. package/src/runtime/routes/documents-routes.ts +227 -0
  622. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  623. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  624. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  625. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  626. package/src/runtime/routes/inbound-conversation.ts +3 -10
  627. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  628. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  629. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  630. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  631. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  632. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  633. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  634. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  635. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  636. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  637. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  638. package/src/runtime/routes/integrations/telegram.ts +111 -0
  639. package/src/runtime/routes/integrations/twilio.ts +451 -0
  640. package/src/runtime/routes/invite-routes.ts +2 -2
  641. package/src/runtime/routes/pairing-routes.ts +1 -1
  642. package/src/runtime/routes/recording-routes.ts +332 -0
  643. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  644. package/src/runtime/routes/session-management-routes.ts +167 -0
  645. package/src/runtime/routes/session-query-routes.ts +204 -0
  646. package/src/runtime/routes/settings-routes.ts +887 -0
  647. package/src/runtime/routes/skills-routes.ts +266 -0
  648. package/src/runtime/routes/subagents-routes.ts +246 -0
  649. package/src/runtime/routes/surface-action-routes.ts +100 -10
  650. package/src/runtime/routes/surface-content-routes.ts +1 -1
  651. package/src/runtime/routes/work-items-routes.ts +809 -0
  652. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  653. package/src/runtime/routes/workspace-routes.ts +410 -0
  654. package/src/runtime/routes/workspace-utils.ts +88 -0
  655. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  656. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  657. package/src/runtime/tool-grant-request-helper.ts +1 -2
  658. package/src/runtime/trust-context-resolver.ts +0 -1
  659. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  660. package/src/runtime/verification-rate-limiter.ts +2 -2
  661. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  662. package/src/schedule/integration-status.ts +2 -2
  663. package/src/schedule/schedule-store.ts +7 -9
  664. package/src/sequence/engine.ts +1 -1
  665. package/src/skills/active-skill-tools.ts +0 -8
  666. package/src/skills/clawhub.ts +1 -10
  667. package/src/skills/managed-store.ts +14 -4
  668. package/src/skills/slash-commands.ts +1 -1
  669. package/src/subagent/manager.ts +1 -1
  670. package/src/subagent/types.ts +1 -1
  671. package/src/tasks/SPEC.md +10 -10
  672. package/src/tasks/task-scheduler.ts +1 -1
  673. package/src/telegram/bot-username.ts +13 -0
  674. package/src/tools/AGENTS.md +38 -0
  675. package/src/tools/apps/executors.ts +0 -6
  676. package/src/tools/assets/materialize.ts +1 -1
  677. package/src/tools/assets/search.ts +1 -1
  678. package/src/tools/browser/browser-execution.ts +2 -2
  679. package/src/tools/browser/browser-manager.ts +88 -11
  680. package/src/tools/browser/browser-screencast.ts +1 -1
  681. package/src/tools/browser/headless-browser.ts +0 -17
  682. package/src/tools/browser/jit-auth.ts +1 -1
  683. package/src/tools/browser/recording-store.ts +19 -1
  684. package/src/tools/browser/runtime-check.ts +4 -2
  685. package/src/tools/calls/call-start.ts +3 -3
  686. package/src/tools/credentials/metadata-store.ts +0 -13
  687. package/src/tools/credentials/vault.ts +7 -31
  688. package/src/tools/document/editor-template.ts +10 -8
  689. package/src/tools/followups/followup_create.ts +0 -8
  690. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  691. package/src/tools/memory/definitions.ts +32 -10
  692. package/src/tools/memory/handlers.test.ts +573 -0
  693. package/src/tools/memory/handlers.ts +222 -65
  694. package/src/tools/memory/register.ts +53 -24
  695. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  696. package/src/tools/schedule/update.ts +0 -8
  697. package/src/tools/skills/load.ts +3 -3
  698. package/src/tools/subagent/read.ts +1 -1
  699. package/src/tools/system/voice-config.ts +2 -14
  700. package/src/tools/terminal/safe-env.ts +5 -18
  701. package/src/tools/tool-approval-handler.ts +4 -4
  702. package/src/tools/tool-manifest.ts +4 -2
  703. package/src/tools/types.ts +1 -1
  704. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  705. package/src/twitter/platform-proxy-client.ts +408 -0
  706. package/src/usage/types.ts +21 -0
  707. package/src/util/canonicalize-identity.ts +2 -6
  708. package/src/util/errors.ts +12 -0
  709. package/src/util/platform.ts +93 -86
  710. package/src/util/pricing.ts +180 -43
  711. package/src/work-items/work-item-runner.ts +1 -1
  712. package/scripts/ipc/check-contract-inventory.ts +0 -107
  713. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  714. package/scripts/ipc/generate-swift.ts +0 -528
  715. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  716. package/src/__tests__/app-migration.test.ts +0 -148
  717. package/src/__tests__/config-loader-migration.test.ts +0 -85
  718. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  719. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  720. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  721. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  722. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  723. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  724. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  725. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  726. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  727. package/src/__tests__/home-base-bootstrap.test.ts +0 -86
  728. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  729. package/src/__tests__/integrations-cli.test.ts +0 -232
  730. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  731. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  732. package/src/__tests__/ipc-contract.test.ts +0 -76
  733. package/src/__tests__/ipc-protocol.test.ts +0 -120
  734. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  735. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  736. package/src/__tests__/ipc-validate.test.ts +0 -471
  737. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  738. package/src/__tests__/migration-ordering.test.ts +0 -267
  739. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  740. package/src/__tests__/platform-move-helper.test.ts +0 -108
  741. package/src/__tests__/platform-socket-path.test.ts +0 -52
  742. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  743. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  744. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  745. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  746. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  747. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  748. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  749. package/src/__tests__/twitter-cli-error-shaping.test.ts +0 -224
  750. package/src/__tests__/twitter-cli-routing.test.ts +0 -286
  751. package/src/__tests__/work-item-output.test.ts +0 -150
  752. package/src/amazon/session.ts +0 -58
  753. package/src/cli/channels.ts +0 -51
  754. package/src/cli/influencer.ts +0 -319
  755. package/src/cli/integrations.ts +0 -372
  756. package/src/cli/ipc-client.ts +0 -88
  757. package/src/cli/twitter.ts +0 -1111
  758. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  759. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  760. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  761. package/src/config/core-schema.ts +0 -434
  762. package/src/config/memory-schema.ts +0 -617
  763. package/src/daemon/auth-manager.ts +0 -106
  764. package/src/daemon/handlers/apps.ts +0 -783
  765. package/src/daemon/handlers/avatar.ts +0 -73
  766. package/src/daemon/handlers/browser.ts +0 -3
  767. package/src/daemon/handlers/computer-use.ts +0 -231
  768. package/src/daemon/handlers/config-dispatch.ts +0 -29
  769. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  770. package/src/daemon/handlers/config-inbox.ts +0 -457
  771. package/src/daemon/handlers/config-integrations.ts +0 -409
  772. package/src/daemon/handlers/config-platform.ts +0 -77
  773. package/src/daemon/handlers/config-slack.ts +0 -41
  774. package/src/daemon/handlers/config-tools.ts +0 -226
  775. package/src/daemon/handlers/config-trust.ts +0 -135
  776. package/src/daemon/handlers/config.ts +0 -64
  777. package/src/daemon/handlers/contacts.ts +0 -193
  778. package/src/daemon/handlers/diagnostics.ts +0 -382
  779. package/src/daemon/handlers/documents.ts +0 -188
  780. package/src/daemon/handlers/guardian-actions.ts +0 -82
  781. package/src/daemon/handlers/home-base.ts +0 -82
  782. package/src/daemon/handlers/index.ts +0 -222
  783. package/src/daemon/handlers/misc.ts +0 -1139
  784. package/src/daemon/handlers/navigate-settings.ts +0 -29
  785. package/src/daemon/handlers/oauth-connect.ts +0 -202
  786. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  787. package/src/daemon/handlers/publish.ts +0 -176
  788. package/src/daemon/handlers/signing.ts +0 -56
  789. package/src/daemon/handlers/subagents.ts +0 -286
  790. package/src/daemon/handlers/twitter-auth.ts +0 -220
  791. package/src/daemon/handlers/work-items.ts +0 -796
  792. package/src/daemon/handlers/workspace-files.ts +0 -84
  793. package/src/daemon/handlers.ts +0 -16
  794. package/src/daemon/ipc-blob-store.ts +0 -246
  795. package/src/daemon/ipc-contract-inventory.json +0 -348
  796. package/src/daemon/ipc-contract-inventory.ts +0 -202
  797. package/src/daemon/ipc-handler.ts +0 -120
  798. package/src/daemon/ipc-protocol.ts +0 -85
  799. package/src/daemon/ipc-validate.ts +0 -254
  800. package/src/home-base/app-link-store.ts +0 -78
  801. package/src/home-base/bootstrap.ts +0 -74
  802. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  803. package/src/home-base/prebuilt/index.html +0 -702
  804. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  805. package/src/home-base/prebuilt/seed.ts +0 -122
  806. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  807. package/src/memory/app-migration.ts +0 -114
  808. package/src/memory/channel-delivery-store.ts +0 -40
  809. package/src/memory/channel-guardian-store.ts +0 -83
  810. package/src/memory/conversation-store.ts +0 -102
  811. package/src/memory/schema-migration.ts +0 -38
  812. package/src/messaging/providers/sms/adapter.ts +0 -232
  813. package/src/messaging/providers/sms/client.ts +0 -93
  814. package/src/messaging/providers/sms/types.ts +0 -7
  815. package/src/migrations/config-merge.ts +0 -62
  816. package/src/migrations/data-layout.ts +0 -89
  817. package/src/migrations/data-merge.ts +0 -44
  818. package/src/migrations/hooks-merge.ts +0 -118
  819. package/src/migrations/index.ts +0 -6
  820. package/src/migrations/log.ts +0 -28
  821. package/src/migrations/skills-merge.ts +0 -44
  822. package/src/migrations/workspace-layout.ts +0 -94
  823. package/src/notifications/adapters/sms.ts +0 -94
  824. package/src/runtime/channel-approval-parser.ts +0 -123
  825. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  826. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  827. package/src/runtime/routes/integration-routes.ts +0 -381
  828. package/src/runtime/routes/twilio-routes.ts +0 -1251
  829. package/src/twitter/client.ts +0 -979
  830. package/src/twitter/router.ts +0 -131
  831. package/src/twitter/session.ts +0 -54
  832. package/src/util/cookie-session.ts +0 -114
  833. package/src/watcher/providers/slack.ts +0 -282
  834. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  835. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  836. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  837. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  838. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  839. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  840. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  841. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  842. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  843. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  844. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  845. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  846. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  847. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  848. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  849. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  850. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  851. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  852. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  853. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  854. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  855. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  856. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  857. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  858. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  859. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  860. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  861. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  862. /package/src/{config → prompts}/templates/USER.md +0 -0
  863. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  864. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  865. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  866. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  867. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -22,8 +22,6 @@ mock.module("../util/platform.js", () => ({
22
22
  getDbPath: () => join(testDir, "test.db"),
23
23
  getLogPath: () => join(testDir, "test.log"),
24
24
  ensureDataDir: () => {},
25
- migrateToDataLayout: () => {},
26
- migrateToWorkspaceLayout: () => {},
27
25
  }));
28
26
 
29
27
  mock.module("../util/logger.js", () => ({
@@ -41,7 +39,7 @@ mock.module("../security/secret-ingress.js", () => ({
41
39
  }));
42
40
 
43
41
  // Mock render to return the raw content as text
44
- mock.module("../daemon/handlers.js", () => ({
42
+ mock.module("../daemon/handlers/shared.js", () => ({
45
43
  renderHistoryContent: (content: unknown) => ({
46
44
  text: typeof content === "string" ? content : JSON.stringify(content),
47
45
  }),
@@ -50,8 +48,8 @@ mock.module("../daemon/handlers.js", () => ({
50
48
  import { eq } from "drizzle-orm";
51
49
 
52
50
  import { upsertContact } from "../contacts/contact-store.js";
53
- import * as channelDeliveryStore from "../memory/channel-delivery-store.js";
54
51
  import { getDb, initializeDb, resetDb, resetTestTables } from "../memory/db.js";
52
+ import * as deliveryChannels from "../memory/delivery-channels.js";
55
53
  import { attachments, conversationAttentionEvents } from "../memory/schema.js";
56
54
  import * as pendingInteractions from "../runtime/pending-interactions.js";
57
55
  import { handleChannelInbound } from "../runtime/routes/channel-routes.js";
@@ -76,7 +74,7 @@ function resetTables(): void {
76
74
  "conversation_attention_events",
77
75
  "conversation_assistant_attention_state",
78
76
  "channel_guardian_approval_requests",
79
- "channel_guardian_verification_challenges",
77
+ "channel_verification_sessions",
80
78
  "conversation_keys",
81
79
  "message_runs",
82
80
  "channel_inbound_events",
@@ -85,7 +83,7 @@ function resetTables(): void {
85
83
  "contact_channels",
86
84
  "contacts",
87
85
  );
88
- channelDeliveryStore.resetAllRunDeliveryClaims();
86
+ deliveryChannels.resetAllRunDeliveryClaims();
89
87
  pendingInteractions.clear();
90
88
  }
91
89
 
@@ -384,12 +382,11 @@ describe("duplicate event deduplication", () => {
384
382
  // ═══════════════════════════════════════════════════════════════════════════
385
383
 
386
384
  describe("non-Telegram channel filtering", () => {
387
- test("SMS inbound message does not record a Telegram seen signal", async () => {
388
- // Override contact store for SMS channel
385
+ test("email inbound message does not record a Telegram seen signal", async () => {
389
386
  const req = makeInboundRequest({
390
- sourceChannel: "sms",
391
- interface: "sms",
392
- content: "sms message",
387
+ sourceChannel: "email",
388
+ interface: "email",
389
+ content: "email message",
393
390
  });
394
391
 
395
392
  const res = await handleChannelInbound(
@@ -51,7 +51,7 @@ const getConversationMock = mock((id: string) => {
51
51
  return mockExistingConversations[id] ?? null;
52
52
  });
53
53
 
54
- mock.module("../memory/conversation-store.js", () => ({
54
+ mock.module("../memory/conversation-crud.js", () => ({
55
55
  getConversationThreadType: () => "default",
56
56
  setConversationOriginChannelIfUnset: () => {},
57
57
  updateConversationContextWindow: () => {},
@@ -405,22 +405,22 @@ describe("pairDeliveryWithConversation", () => {
405
405
  source: "user",
406
406
  title: "User Thread",
407
407
  };
408
- mockBindings["notification:sms:+15551234567"] = {
408
+ mockBindings["notification:slack:C0123ABCDEF"] = {
409
409
  conversationId: "conv-user-owned",
410
- sourceChannel: "notification:sms",
411
- externalChatId: "+15551234567",
410
+ sourceChannel: "notification:slack",
411
+ externalChatId: "C0123ABCDEF",
412
412
  };
413
413
 
414
414
  const signal = makeSignal();
415
415
  const copy = makeCopy();
416
416
  const bindingContext: DestinationBindingContext = {
417
- sourceChannel: "sms" as NotificationChannel,
418
- externalChatId: "+15551234567",
417
+ sourceChannel: "slack" as NotificationChannel,
418
+ externalChatId: "C0123ABCDEF",
419
419
  };
420
420
 
421
421
  const result = await pairDeliveryWithConversation(
422
422
  signal,
423
- "sms" as NotificationChannel,
423
+ "slack" as NotificationChannel,
424
424
  copy,
425
425
  { bindingContext },
426
426
  );
@@ -436,7 +436,7 @@ describe("pairDeliveryWithConversation", () => {
436
436
  unknown
437
437
  >;
438
438
  expect(upsertArgs.conversationId).toBe("conv-001");
439
- expect(upsertArgs.sourceChannel).toBe("notification:sms");
439
+ expect(upsertArgs.sourceChannel).toBe("notification:slack");
440
440
  });
441
441
 
442
442
  test("falls back to new conversation when bound conversation no longer exists", async () => {
@@ -546,13 +546,13 @@ describe("pairDeliveryWithConversation", () => {
546
546
  conversationId: "conv-gone",
547
547
  };
548
548
  const bindingContext: DestinationBindingContext = {
549
- sourceChannel: "sms" as NotificationChannel,
550
- externalChatId: "+15559876543",
549
+ sourceChannel: "slack" as NotificationChannel,
550
+ externalChatId: "C9876ZYXWVU",
551
551
  };
552
552
 
553
553
  const result = await pairDeliveryWithConversation(
554
554
  signal,
555
- "sms" as NotificationChannel,
555
+ "slack" as NotificationChannel,
556
556
  copy,
557
557
  { threadAction, bindingContext },
558
558
  );
@@ -567,8 +567,8 @@ describe("pairDeliveryWithConversation", () => {
567
567
  unknown
568
568
  >;
569
569
  expect(upsertArgs.conversationId).toBe("conv-001");
570
- expect(upsertArgs.sourceChannel).toBe("notification:sms");
571
- expect(upsertArgs.externalChatId).toBe("+15559876543");
570
+ expect(upsertArgs.sourceChannel).toBe("notification:slack");
571
+ expect(upsertArgs.externalChatId).toBe("C9876ZYXWVU");
572
572
  });
573
573
 
574
574
  test("explicit reuse_existing takes precedence over binding-key reuse", async () => {
@@ -663,7 +663,7 @@ describe("pairDeliveryWithConversation", () => {
663
663
  // accepts NotificationChannel which is then cast internally to ChannelId.
664
664
  const result = await pairDeliveryWithConversation(
665
665
  signal,
666
- "voice" as NotificationChannel,
666
+ "phone" as NotificationChannel,
667
667
  copy,
668
668
  );
669
669
 
@@ -76,7 +76,7 @@ mock.module("../runtime/confirmation-request-guardian-bridge.js", () => ({
76
76
  bridgeConfirmationRequestToGuardian: async () => undefined,
77
77
  }));
78
78
 
79
- mock.module("../memory/conversation-store.js", () => ({
79
+ mock.module("../memory/conversation-crud.js", () => ({
80
80
  addMessage: (
81
81
  conversationId: string,
82
82
  role: string,
@@ -152,7 +152,7 @@ describe("handleSendMessage canonical guardian reply interception", () => {
152
152
  const runAgentLoop = mock(async () => undefined);
153
153
  const session = {
154
154
  setTrustContext: () => {},
155
- setStateSignalListener: () => {},
155
+ updateClient: () => {},
156
156
  emitConfirmationStateChanged: () => {},
157
157
  emitActivityState: () => {},
158
158
  setTurnChannelContext: () => {},
@@ -223,7 +223,7 @@ describe("handleSendMessage canonical guardian reply interception", () => {
223
223
  const runAgentLoop = mock(async () => undefined);
224
224
  const session = {
225
225
  setTrustContext: () => {},
226
- setStateSignalListener: () => {},
226
+ updateClient: () => {},
227
227
  emitConfirmationStateChanged: () => {},
228
228
  emitActivityState: () => {},
229
229
  setTurnChannelContext: () => {},
@@ -289,7 +289,7 @@ describe("handleSendMessage canonical guardian reply interception", () => {
289
289
  const runAgentLoop = mock(async () => undefined);
290
290
  const session = {
291
291
  setTrustContext: () => {},
292
- setStateSignalListener: () => {},
292
+ updateClient: () => {},
293
293
  emitConfirmationStateChanged: () => {},
294
294
  emitActivityState: () => {},
295
295
  setTurnChannelContext: () => {},
@@ -361,7 +361,7 @@ describe("handleSendMessage canonical guardian reply interception", () => {
361
361
  const runAgentLoop = mock(async () => undefined);
362
362
  const session = {
363
363
  setTrustContext: () => {},
364
- setStateSignalListener: () => {},
364
+ updateClient: () => {},
365
365
  emitConfirmationStateChanged: () => {},
366
366
  emitActivityState: () => {},
367
367
  setTurnChannelContext: () => {},
@@ -428,7 +428,7 @@ describe("handleSendMessage canonical guardian reply interception", () => {
428
428
  const runAgentLoop = mock(async () => undefined);
429
429
  const session = {
430
430
  setTrustContext: () => {},
431
- setStateSignalListener: () => {},
431
+ updateClient: () => {},
432
432
  emitConfirmationStateChanged: () => {},
433
433
  emitActivityState: () => {},
434
434
  setTurnChannelContext: () => {},
@@ -489,7 +489,7 @@ describe("handleSendMessage canonical guardian reply interception", () => {
489
489
  const runAgentLoop = mock(async () => undefined);
490
490
  const session = {
491
491
  setTrustContext: () => {},
492
- setStateSignalListener: () => {},
492
+ updateClient: () => {},
493
493
  emitConfirmationStateChanged: () => {},
494
494
  emitActivityState: () => {},
495
495
  setTurnChannelContext: () => {},
@@ -39,8 +39,8 @@ import {
39
39
  getConversationMemoryScopeId,
40
40
  getConversationThreadType,
41
41
  getMessages,
42
- isLastUserMessageToolResult,
43
- } from "../memory/conversation-store.js";
42
+ } from "../memory/conversation-crud.js";
43
+ import { isLastUserMessageToolResult } from "../memory/conversation-queries.js";
44
44
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
45
45
 
46
46
  // Initialize db once before all tests
@@ -0,0 +1,155 @@
1
+ import { mkdtempSync, realpathSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
5
+
6
+ const testDir = realpathSync(
7
+ mkdtempSync(join(tmpdir(), "conversation-unread-route-test-")),
8
+ );
9
+
10
+ mock.module("../util/platform.js", () => ({
11
+ getRootDir: () => testDir,
12
+ getDataDir: () => testDir,
13
+ isMacOS: () => process.platform === "darwin",
14
+ isLinux: () => process.platform === "linux",
15
+ isWindows: () => process.platform === "win32",
16
+ getSocketPath: () => join(testDir, "test.sock"),
17
+ getPidPath: () => join(testDir, "test.pid"),
18
+ getDbPath: () => join(testDir, "test.db"),
19
+ getLogPath: () => join(testDir, "test.log"),
20
+ ensureDataDir: () => {},
21
+ }));
22
+
23
+ mock.module("../util/logger.js", () => ({
24
+ getLogger: () =>
25
+ new Proxy({} as Record<string, unknown>, {
26
+ get: () => () => {},
27
+ }),
28
+ }));
29
+
30
+ mock.module("../config/env.js", () => ({
31
+ isHttpAuthDisabled: () => true,
32
+ hasUngatedHttpAuthDisabled: () => false,
33
+ getGatewayInternalBaseUrl: () => "http://127.0.0.1:7830",
34
+ getGatewayPort: () => 7830,
35
+ getRuntimeHttpPort: () => 7821,
36
+ getRuntimeHttpHost: () => "127.0.0.1",
37
+ getRuntimeGatewayOriginSecret: () => undefined,
38
+ getIngressPublicBaseUrl: () => undefined,
39
+ setIngressPublicBaseUrl: () => {},
40
+ }));
41
+
42
+ const mockMarkConversationUnread = mock((_conversationId: string) => {});
43
+
44
+ mock.module("../memory/conversation-attention-store.js", () => ({
45
+ getAttentionStateByConversationIds: () => new Map(),
46
+ recordConversationSeenSignal: () => ({}),
47
+ markConversationUnread: mockMarkConversationUnread,
48
+ }));
49
+
50
+ import { getPolicy } from "../runtime/auth/route-policy.js";
51
+ import { RuntimeHttpServer } from "../runtime/http-server.js";
52
+ import { UserError } from "../util/errors.js";
53
+
54
+ describe("POST /v1/conversations/unread", () => {
55
+ let server: RuntimeHttpServer;
56
+ let port: number;
57
+
58
+ beforeEach(() => {
59
+ mockMarkConversationUnread.mockReset();
60
+ });
61
+
62
+ afterAll(async () => {
63
+ await server?.stop();
64
+ try {
65
+ rmSync(testDir, { recursive: true, force: true });
66
+ } catch {
67
+ /* best effort */
68
+ }
69
+ });
70
+
71
+ async function startServer(): Promise<void> {
72
+ port = 20000 + Math.floor(Math.random() * 1000);
73
+ server = new RuntimeHttpServer({ port, bearerToken: "test-bearer-token" });
74
+ await server.start();
75
+ }
76
+
77
+ async function stopServer(): Promise<void> {
78
+ await server?.stop();
79
+ }
80
+
81
+ function unreadUrl(): string {
82
+ return `http://127.0.0.1:${port}/v1/conversations/unread`;
83
+ }
84
+
85
+ test("registers the unread route with chat.write policy", () => {
86
+ expect(getPolicy("conversations/unread")).toEqual({
87
+ requiredScopes: ["chat.write"],
88
+ allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "ipc"],
89
+ });
90
+ });
91
+
92
+ test("returns BAD_REQUEST when conversationId is missing", async () => {
93
+ await startServer();
94
+
95
+ const res = await fetch(unreadUrl(), {
96
+ method: "POST",
97
+ headers: { "Content-Type": "application/json" },
98
+ body: JSON.stringify({}),
99
+ });
100
+
101
+ expect(res.status).toBe(400);
102
+ expect(await res.json()).toEqual({
103
+ error: {
104
+ code: "BAD_REQUEST",
105
+ message: "Missing conversationId",
106
+ },
107
+ });
108
+ expect(mockMarkConversationUnread).not.toHaveBeenCalled();
109
+
110
+ await stopServer();
111
+ });
112
+
113
+ test("marks a conversation unread", async () => {
114
+ await startServer();
115
+
116
+ const res = await fetch(unreadUrl(), {
117
+ method: "POST",
118
+ headers: { "Content-Type": "application/json" },
119
+ body: JSON.stringify({ conversationId: "conv-123" }),
120
+ });
121
+
122
+ expect(res.status).toBe(200);
123
+ expect(await res.json()).toEqual({ ok: true });
124
+ expect(mockMarkConversationUnread).toHaveBeenCalledTimes(1);
125
+ expect(mockMarkConversationUnread).toHaveBeenCalledWith("conv-123");
126
+
127
+ await stopServer();
128
+ });
129
+
130
+ test("returns UNPROCESSABLE_ENTITY when the conversation has no assistant message", async () => {
131
+ mockMarkConversationUnread.mockImplementationOnce(() => {
132
+ throw new UserError(
133
+ "Conversation has no assistant message to mark unread",
134
+ );
135
+ });
136
+
137
+ await startServer();
138
+
139
+ const res = await fetch(unreadUrl(), {
140
+ method: "POST",
141
+ headers: { "Content-Type": "application/json" },
142
+ body: JSON.stringify({ conversationId: "conv-no-assistant" }),
143
+ });
144
+
145
+ expect(res.status).toBe(422);
146
+ expect(await res.json()).toEqual({
147
+ error: {
148
+ code: "UNPROCESSABLE_ENTITY",
149
+ message: "Conversation has no assistant message to mark unread",
150
+ },
151
+ });
152
+
153
+ await stopServer();
154
+ });
155
+ });
@@ -502,7 +502,6 @@ describe("credential metadata store", () => {
502
502
  allowedDomains: ["github.com"],
503
503
  usageDescription: "GitHub PAT",
504
504
  grantedScopes: ["repo", "user"],
505
- accountInfo: "octocat",
506
505
  createdAt: 1700000000000,
507
506
  updatedAt: 1700000000000,
508
507
  },
@@ -542,7 +541,6 @@ describe("credential metadata store", () => {
542
541
 
543
542
  // Original v1 fields preserved
544
543
  expect(records[0].grantedScopes).toEqual(["repo", "user"]);
545
- expect(records[0].accountInfo).toBe("octocat");
546
544
  expect(records[1].expiresAt).toBe(1800000000000);
547
545
  expect(records[2].oauth2TokenUrl).toBe(
548
546
  "https://connect.stripe.com/oauth/token",
@@ -199,17 +199,12 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
199
199
  // Hard boundary: only these production files may import from secure-keys.
200
200
  // Any new import must be reviewed for secret-leak risk and added here.
201
201
  const ALLOWED_IMPORTERS = new Set([
202
- "security/secure-keys.ts", // self (re-export infrastructure)
203
- "index.ts", // daemon startup / API key config
204
202
  "config/loader.ts", // config management (API keys)
205
203
  "tools/credentials/vault.ts", // credential store tool
206
204
  "tools/credentials/broker.ts", // brokered credential access
207
205
  "tools/network/web-search.ts", // web search API key lookup
208
- "daemon/handlers.ts", // Vercel API token + integration OAuth
209
- "daemon/handlers/config-integrations.ts", // Vercel API token + Twitter integration OAuth
210
206
  "daemon/handlers/config-telegram.ts", // Telegram bot token management
211
- "daemon/handlers/config-ingress.ts", // Ingress config (reads Twilio credentials for webhook sync)
212
- "runtime/routes/twilio-routes.ts", // Twilio credential management (HTTP control-plane)
207
+ "runtime/routes/integrations/twilio.ts", // Twilio credential management (HTTP control-plane)
213
208
  "security/token-manager.ts", // OAuth token refresh flow
214
209
  "email/providers/index.ts", // email provider API key lookup
215
210
  "tools/network/script-proxy/session-manager.ts", // proxy credential injection at runtime
@@ -218,26 +213,25 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
218
213
  "calls/twilio-config.ts", // call infrastructure credential lookup
219
214
  "calls/twilio-provider.ts", // call infrastructure credential lookup
220
215
  "calls/twilio-rest.ts", // Twilio REST API credential lookup
221
- "runtime/channel-invite-transports/sms.ts", // SMS invite transport phone number lookup
222
216
  "runtime/channel-invite-transports/telegram.ts", // Telegram invite transport bot token lookup
223
- "cli/keys.ts", // CLI credential management commands
224
- "cli/credentials.ts", // CLI credential management commands
225
- "runtime/http-server.ts", // HTTP server credential lookup
226
- "daemon/handlers/twitter-auth.ts", // Twitter OAuth token storage
227
- "twitter/oauth-client.ts", // Twitter OAuth API client (reads access token for API calls)
217
+ "cli/commands/keys.ts", // CLI credential management commands
218
+ "cli/commands/credentials.ts", // CLI credential management commands
228
219
  "messaging/providers/telegram-bot/adapter.ts", // Telegram bot token lookup for connectivity check
229
- "messaging/providers/sms/adapter.ts", // Twilio credential lookup for SMS connectivity check
230
- "runtime/channel-readiness-service.ts", // channel readiness probes for SMS/Telegram connectivity
220
+ "runtime/channel-readiness-service.ts", // channel readiness probes for Telegram connectivity
231
221
  "messaging/providers/whatsapp/adapter.ts", // WhatsApp credential lookup for connectivity check
232
222
  "schedule/integration-status.ts", // integration status checks for scheduled reports
233
- "daemon/handlers/oauth-connect.ts", // OAuth connect handler for integration setup
234
223
  "daemon/handlers/config-slack-channel.ts", // Slack channel config credential management
224
+ "media/managed-avatar-client.ts", // managed avatar API key lookup for platform authentication
235
225
  "providers/managed-proxy/context.ts", // managed proxy API key lookup for provider initialization
236
226
  "mcp/mcp-oauth-provider.ts", // MCP OAuth token/client/discovery persistence
227
+ "runtime/routes/integrations/slack/share.ts", // Slack share routes credential lookup
237
228
  "mcp/client.ts", // MCP client cached-token lookup
238
229
  "oauth/token-persistence.ts", // OAuth token persistence (set/delete tokens)
239
230
  "runtime/routes/secret-routes.ts", // HTTP secret management routes (set/delete secrets)
231
+ "daemon/ride-shotgun-handler.ts", // learn session cookie persistence
240
232
  "daemon/session-messaging.ts", // credential storage during session messaging
233
+ "runtime/routes/settings-routes.ts", // settings routes OAuth credential lookup (client_id/client_secret/access tokens)
234
+ "twitter/platform-proxy-client.ts", // managed Twitter proxy auth token lookup
241
235
  ]);
242
236
 
243
237
  const thisDir = dirname(fileURLToPath(import.meta.url));
@@ -329,7 +323,7 @@ describe("Invariant 3: secrets never logged in plaintext", () => {
329
323
  test(`${tc.label}`, () => {
330
324
  const thisDir = dirname(fileURLToPath(import.meta.url));
331
325
  const ipcSrc = readFileSync(
332
- resolve(thisDir, "../daemon/ipc-protocol.ts"),
326
+ resolve(thisDir, "../daemon/message-protocol.ts"),
333
327
  "utf-8",
334
328
  );
335
329
  // Verify log calls never include raw content fields — only safe
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from "bun:test";
1
+ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  import { Command } from "commander";
4
4
 
@@ -93,7 +93,6 @@ mock.module("../tools/credentials/metadata-store.js", () => ({
93
93
  usageDescription?: string;
94
94
  expiresAt?: number | null;
95
95
  grantedScopes?: string[];
96
- accountInfo?: string | null;
97
96
  alias?: string | null;
98
97
  injectionTemplates?: unknown[] | null;
99
98
  },
@@ -168,7 +167,8 @@ mock.module("../tools/credentials/metadata-store.js", () => ({
168
167
  // Import the module under test (after mocks are registered)
169
168
  // ---------------------------------------------------------------------------
170
169
 
171
- const { registerCredentialsCommand } = await import("../cli/credentials.js");
170
+ const { registerCredentialsCommand } =
171
+ await import("../cli/commands/credentials.js");
172
172
 
173
173
  // ---------------------------------------------------------------------------
174
174
  // Test helper
@@ -317,7 +317,6 @@ describe("assistant credentials CLI", () => {
317
317
  expect(cred).toHaveProperty("usageDescription");
318
318
  expect(cred).toHaveProperty("allowedTools");
319
319
  expect(cred).toHaveProperty("allowedDomains");
320
- expect(cred).toHaveProperty("accountInfo");
321
320
  expect(cred).toHaveProperty("grantedScopes");
322
321
  expect(cred).toHaveProperty("expiresAt");
323
322
  expect(cred).toHaveProperty("createdAt");
@@ -634,7 +633,6 @@ describe("assistant credentials CLI", () => {
634
633
  expect(parsed).toHaveProperty("usageDescription");
635
634
  expect(parsed).toHaveProperty("allowedTools");
636
635
  expect(parsed).toHaveProperty("allowedDomains");
637
- expect(parsed).toHaveProperty("accountInfo");
638
636
  expect(parsed).toHaveProperty("grantedScopes");
639
637
  expect(parsed).toHaveProperty("expiresAt");
640
638
  expect(parsed).toHaveProperty("injectionTemplateCount");
@@ -796,6 +794,52 @@ describe("assistant credentials CLI", () => {
796
794
  });
797
795
  });
798
796
 
797
+ // =========================================================================
798
+ // instance-scoped BASE_DATA_DIR
799
+ // =========================================================================
800
+
801
+ describe("instance-scoped BASE_DATA_DIR", () => {
802
+ let savedBaseDataDir: string | undefined;
803
+
804
+ beforeEach(() => {
805
+ savedBaseDataDir = process.env.BASE_DATA_DIR;
806
+ });
807
+
808
+ afterEach(() => {
809
+ if (savedBaseDataDir === undefined) {
810
+ delete process.env.BASE_DATA_DIR;
811
+ } else {
812
+ process.env.BASE_DATA_DIR = savedBaseDataDir;
813
+ }
814
+ });
815
+
816
+ test("credential reveal reads from instance-scoped store when BASE_DATA_DIR is set", async () => {
817
+ // Point BASE_DATA_DIR to a temp directory (simulating instance-scoped dir)
818
+ const tmpDir = (await import("node:os")).tmpdir();
819
+ const instanceDir = (await import("node:path")).join(
820
+ tmpDir,
821
+ `vellum-test-instance-${Date.now()}`,
822
+ );
823
+ process.env.BASE_DATA_DIR = instanceDir;
824
+
825
+ // Seed a credential in the mock store
826
+ seedCredential("twilio", "auth_token", "instance_secret_abc123");
827
+
828
+ // Run `credentials reveal twilio:auth_token`
829
+ const result = await runCli(["reveal", "twilio:auth_token", "--json"]);
830
+ expect(result.exitCode).toBe(0);
831
+ const parsed = JSON.parse(result.stdout);
832
+ expect(parsed.ok).toBe(true);
833
+ expect(parsed.value).toBe("instance_secret_abc123");
834
+
835
+ // Verify the correct key was looked up in the secure store
836
+ expect(secureKeyStore.has("credential:twilio:auth_token")).toBe(true);
837
+ expect(secureKeyStore.get("credential:twilio:auth_token")).toBe(
838
+ "instance_secret_abc123",
839
+ );
840
+ });
841
+ });
842
+
799
843
  // =========================================================================
800
844
  // help text quality
801
845
  // =========================================================================
@@ -6,7 +6,6 @@
6
6
  * - send() → one mirrored assistant event per message
7
7
  * - broadcast() → one mirrored assistant event per message (not per socket)
8
8
  */
9
- import * as net from "node:net";
10
9
  import { describe, expect, mock, test } from "bun:test";
11
10
 
12
11
  // ── Platform mock (must happen before imports that read it) ─────────────────
@@ -28,7 +27,6 @@ mock.module("../util/platform.js", () => ({
28
27
  getLogPath: () => "/tmp/test.log",
29
28
  getDbPath: () => "/tmp/test.db",
30
29
  ensureDataDir: () => {},
31
- removeSocketFile: () => {},
32
30
  }));
33
31
 
34
32
  mock.module("../util/logger.js", () => ({
@@ -39,23 +37,13 @@ mock.module("../util/logger.js", () => ({
39
37
  }));
40
38
 
41
39
  // ── Imports (after mocks) ────────────────────────────────────────────────────
42
- import type { ServerMessage } from "../daemon/ipc-protocol.js";
40
+ import type { ServerMessage } from "../daemon/message-protocol.js";
43
41
  import type { AssistantEvent } from "../runtime/assistant-event.js";
44
42
  import { buildAssistantEvent } from "../runtime/assistant-event.js";
45
43
  import { AssistantEventHub } from "../runtime/assistant-event-hub.js";
46
44
 
47
45
  // ── Helpers ──────────────────────────────────────────────────────────────────
48
46
 
49
- function makeFakeSocket(destroyed = false): net.Socket {
50
- const s = Object.create(net.Socket.prototype) as net.Socket;
51
- Object.assign(s, {
52
- destroyed,
53
- write: () => true,
54
- on: () => s,
55
- });
56
- return s;
57
- }
58
-
59
47
  // ── buildAssistantEvent factory ───────────────────────────────────────────────
60
48
 
61
49
  describe("buildAssistantEvent", () => {
@@ -115,7 +103,7 @@ describe("daemon send → one mirrored assistant event", () => {
115
103
  expect(received[0].message.type).toBe("assistant_text_delta");
116
104
  });
117
105
 
118
- test("sessionId falls back to socket binding when message lacks it", async () => {
106
+ test("sessionId falls back to explicit parameter when message lacks it", async () => {
119
107
  const hub = new AssistantEventHub();
120
108
  const received: AssistantEvent[] = [];
121
109
 
@@ -123,19 +111,13 @@ describe("daemon send → one mirrored assistant event", () => {
123
111
  received.push(e);
124
112
  });
125
113
 
126
- // Simulate server.ts resolving sessionId from socket→session map
127
- const socketSessionMap = new Map<object, string>();
128
- const fakeSocket = makeFakeSocket();
129
- socketSessionMap.set(fakeSocket, "sess_from_socket");
130
-
131
114
  const msg: ServerMessage = { type: "pong" }; // no sessionId field
132
- const sessionId = socketSessionMap.get(fakeSocket);
133
- const event = buildAssistantEvent("ast_ipc", msg, sessionId);
115
+ const event = buildAssistantEvent("ast_ipc", msg, "sess_explicit");
134
116
 
135
117
  await hub.publish(event);
136
118
 
137
119
  expect(received).toHaveLength(1);
138
- expect(received[0].sessionId).toBe("sess_from_socket");
120
+ expect(received[0].sessionId).toBe("sess_explicit");
139
121
  });
140
122
  });
141
123
 
@@ -16,7 +16,6 @@ import { describe, expect, test } from "bun:test";
16
16
  import { drizzle } from "drizzle-orm/bun-sqlite";
17
17
 
18
18
  import { getSqliteFrom } from "../memory/db-connection.js";
19
- import * as schema from "../memory/schema.js";
20
19
  import {
21
20
  migrateJobDeferrals,
22
21
  migrateMemoryEntityRelationDedup,
@@ -24,7 +23,8 @@ import {
24
23
  MIGRATION_REGISTRY,
25
24
  type MigrationValidationResult,
26
25
  validateMigrationState,
27
- } from "../memory/schema-migration.js";
26
+ } from "../memory/migrations/index.js";
27
+ import * as schema from "../memory/schema.js";
28
28
 
29
29
  // ---------------------------------------------------------------------------
30
30
  // Helpers