@vellumai/assistant 0.4.41 → 0.4.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (843) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +131 -393
  4. package/Dockerfile +0 -1
  5. package/README.md +73 -83
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +16 -21
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -1
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  33. package/src/__tests__/call-controller.test.ts +4 -8
  34. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  35. package/src/__tests__/call-domain.test.ts +250 -8
  36. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  37. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  38. package/src/__tests__/call-recovery.test.ts +47 -0
  39. package/src/__tests__/call-routes-http.test.ts +13 -0
  40. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  41. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  42. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  43. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  44. package/src/__tests__/channel-approval.test.ts +0 -201
  45. package/src/__tests__/channel-approvals.test.ts +2 -2
  46. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  47. package/src/__tests__/channel-guardian.test.ts +641 -740
  48. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  49. package/src/__tests__/channel-policy.test.ts +9 -12
  50. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  51. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  52. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  53. package/src/__tests__/checker.test.ts +10 -7
  54. package/src/__tests__/chrome-cdp.test.ts +57 -17
  55. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  56. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  57. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  58. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  59. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  60. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  61. package/src/__tests__/config-watcher.test.ts +1 -5
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  63. package/src/__tests__/connection-policy.test.ts +3 -62
  64. package/src/__tests__/contacts-tools.test.ts +0 -2
  65. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  66. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  67. package/src/__tests__/context-window-manager.test.ts +220 -61
  68. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  69. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  70. package/src/__tests__/conversation-pairing.test.ts +14 -14
  71. package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
  72. package/src/__tests__/conversation-store.test.ts +2 -2
  73. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  74. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  75. package/src/__tests__/credential-security-invariants.test.ts +9 -16
  76. package/src/__tests__/credentials-cli.test.ts +49 -5
  77. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  78. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  79. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  80. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  81. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  82. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  83. package/src/__tests__/email-cli.test.ts +12 -12
  84. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  86. package/src/__tests__/event-bus.test.ts +0 -1
  87. package/src/__tests__/followup-tools.test.ts +0 -2
  88. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  89. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  90. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  91. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  92. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  93. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  94. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  95. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  96. package/src/__tests__/guardian-action-store.test.ts +2 -2
  97. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  98. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  99. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  100. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  101. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  102. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  103. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  104. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  105. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  106. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  107. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  108. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  109. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  110. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  111. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  112. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  113. package/src/__tests__/heartbeat-service.test.ts +1 -1
  114. package/src/__tests__/home-base-bootstrap.test.ts +0 -2
  115. package/src/__tests__/host-shell-tool.test.ts +3 -12
  116. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  117. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  118. package/src/__tests__/integration-status.test.ts +8 -8
  119. package/src/__tests__/intent-routing.test.ts +9 -13
  120. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  121. package/src/__tests__/invite-routes-http.test.ts +10 -10
  122. package/src/__tests__/llm-usage-store.test.ts +45 -9
  123. package/src/__tests__/local-gateway-health.test.ts +209 -0
  124. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  125. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  126. package/src/__tests__/managed-store.test.ts +29 -12
  127. package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
  128. package/src/__tests__/mcp-cli.test.ts +1 -1
  129. package/src/__tests__/mcp-health-check.test.ts +1 -1
  130. package/src/__tests__/media-generate-image.test.ts +1 -1
  131. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  132. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  133. package/src/__tests__/memory-regressions.test.ts +1 -166
  134. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  135. package/src/__tests__/migration-export-http.test.ts +2 -2
  136. package/src/__tests__/migration-transport.test.ts +44 -0
  137. package/src/__tests__/non-member-access-request.test.ts +49 -36
  138. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  139. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  140. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  141. package/src/__tests__/notification-deep-link.test.ts +3 -3
  142. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  143. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  144. package/src/__tests__/oauth-cli.test.ts +1 -1
  145. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  146. package/src/__tests__/onboarding-template-contract.test.ts +2 -2
  147. package/src/__tests__/platform.test.ts +168 -5
  148. package/src/__tests__/playbook-execution.test.ts +0 -2
  149. package/src/__tests__/playbook-tools.test.ts +0 -2
  150. package/src/__tests__/pricing.test.ts +125 -0
  151. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  152. package/src/__tests__/recording-handler.test.ts +46 -80
  153. package/src/__tests__/recording-state-machine.test.ts +112 -183
  154. package/src/__tests__/registry.test.ts +1 -1
  155. package/src/__tests__/relay-server.test.ts +69 -71
  156. package/src/__tests__/reminder-store.test.ts +3 -3
  157. package/src/__tests__/request-file-tool.test.ts +2 -2
  158. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  159. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  160. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  162. package/src/__tests__/schedule-store.test.ts +13 -4
  163. package/src/__tests__/schedule-tools.test.ts +0 -2
  164. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  165. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  168. package/src/__tests__/secret-response-routing.test.ts +1 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  170. package/src/__tests__/sequence-store.test.ts +0 -2
  171. package/src/__tests__/server-history-render.test.ts +2 -199
  172. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  173. package/src/__tests__/session-agent-loop.test.ts +107 -3
  174. package/src/__tests__/session-confirmation-signals.test.ts +10 -4
  175. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  176. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  177. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  178. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  179. package/src/__tests__/session-profile-injection.test.ts +9 -3
  180. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  181. package/src/__tests__/session-queue.test.ts +10 -4
  182. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  183. package/src/__tests__/session-skill-tools.test.ts +2 -3
  184. package/src/__tests__/session-slash-known.test.ts +11 -4
  185. package/src/__tests__/session-slash-queue.test.ts +11 -4
  186. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  187. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  188. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  189. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  190. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  191. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  192. package/src/__tests__/session-usage.test.ts +180 -0
  193. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  194. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  195. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  196. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  197. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  198. package/src/__tests__/skill-include-graph.test.ts +1 -0
  199. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  200. package/src/__tests__/skill-load-tool.test.ts +90 -12
  201. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  202. package/src/__tests__/skills-uninstall.test.ts +131 -0
  203. package/src/__tests__/skills.test.ts +32 -16
  204. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  205. package/src/__tests__/slack-channel-config.test.ts +71 -12
  206. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  207. package/src/__tests__/slack-share-routes.test.ts +1 -1
  208. package/src/__tests__/slack-skill.test.ts +2 -2
  209. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  210. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  211. package/src/__tests__/starter-task-flow.test.ts +1 -1
  212. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  213. package/src/__tests__/subagent-tools.test.ts +2 -2
  214. package/src/__tests__/system-prompt.test.ts +4 -8
  215. package/src/__tests__/task-compiler.test.ts +0 -2
  216. package/src/__tests__/task-management-tools.test.ts +0 -2
  217. package/src/__tests__/task-runner.test.ts +0 -2
  218. package/src/__tests__/task-scheduler.test.ts +2 -2
  219. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  220. package/src/__tests__/terminal-tools.test.ts +1 -11
  221. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  222. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  223. package/src/__tests__/tool-executor.test.ts +2 -2
  224. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  225. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  226. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  227. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  228. package/src/__tests__/trace-emitter.test.ts +1 -1
  229. package/src/__tests__/trust-context-guards.test.ts +1 -1
  230. package/src/__tests__/trust-store.test.ts +44 -395
  231. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  232. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  233. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  234. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  235. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  236. package/src/__tests__/twilio-config.test.ts +11 -2
  237. package/src/__tests__/twilio-provider.test.ts +6 -4
  238. package/src/__tests__/twilio-routes.test.ts +408 -86
  239. package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
  240. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  241. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  242. package/src/__tests__/update-bulletin.test.ts +4 -8
  243. package/src/__tests__/update-template-contract.test.ts +1 -1
  244. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  245. package/src/__tests__/usage-routes.test.ts +23 -5
  246. package/src/__tests__/user-reference.test.ts +1 -1
  247. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  248. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  249. package/src/__tests__/view-image-tool.test.ts +0 -2
  250. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  251. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  252. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  253. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  254. package/src/__tests__/workspace-policy.test.ts +1 -1
  255. package/src/approvals/AGENTS.md +4 -4
  256. package/src/approvals/approval-primitive.ts +2 -2
  257. package/src/approvals/guardian-decision-primitive.ts +1 -1
  258. package/src/approvals/guardian-request-resolvers.ts +3 -4
  259. package/src/bundler/app-bundler.ts +29 -217
  260. package/src/bundler/app-compiler.ts +131 -103
  261. package/src/bundler/compiler-tools.ts +248 -0
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +12 -17
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +116 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +263 -16
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
  316. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
  317. package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
  318. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
  319. package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
  320. package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
  321. package/src/cli/commands/twitter/router.ts +396 -0
  322. package/src/cli/commands/twitter/session.ts +121 -0
  323. package/src/cli/db.ts +1 -0
  324. package/src/cli/http-client.ts +87 -0
  325. package/src/cli/logger.ts +6 -0
  326. package/src/cli/main-screen.tsx +4 -3
  327. package/src/cli/output.ts +19 -0
  328. package/src/cli/program.ts +29 -27
  329. package/src/cli/reference.ts +27 -37
  330. package/src/cli.ts +452 -240
  331. package/src/config/assistant-feature-flags.ts +3 -15
  332. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  333. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  334. package/src/config/bundled-skills/amazon/SKILL.md +15 -5
  335. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  336. package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +87 -229
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -11
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
  350. package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +56 -14
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +0 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +233 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +110 -96
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +168 -55
  452. package/src/daemon/main.ts +1 -0
  453. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +29 -13
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +1 -0
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  462. package/src/daemon/providers-setup.ts +0 -5
  463. package/src/daemon/recording-executor.ts +0 -7
  464. package/src/daemon/ride-shotgun-handler.ts +9 -13
  465. package/src/daemon/server.ts +136 -510
  466. package/src/daemon/session-agent-loop-handlers.ts +22 -7
  467. package/src/daemon/session-agent-loop.ts +86 -24
  468. package/src/daemon/session-attachments.ts +1 -1
  469. package/src/daemon/session-error.ts +1 -1
  470. package/src/daemon/session-history.ts +20 -15
  471. package/src/daemon/session-lifecycle.ts +9 -7
  472. package/src/daemon/session-memory.ts +15 -1
  473. package/src/daemon/session-messaging.ts +10 -6
  474. package/src/daemon/session-notifiers.ts +10 -8
  475. package/src/daemon/session-process.ts +34 -25
  476. package/src/daemon/session-queue-manager.ts +1 -1
  477. package/src/daemon/session-runtime-assembly.ts +6 -25
  478. package/src/daemon/session-surfaces.ts +2 -2
  479. package/src/daemon/session-tool-setup.ts +1 -1
  480. package/src/daemon/session-usage.ts +119 -18
  481. package/src/daemon/session.ts +13 -9
  482. package/src/daemon/tool-side-effects.ts +6 -5
  483. package/src/daemon/trace-emitter.ts +1 -1
  484. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  485. package/src/daemon/watch-handler.ts +2 -5
  486. package/src/email/service.ts +8 -8
  487. package/src/events/domain-events.ts +0 -1
  488. package/src/events/tool-notification-listener.ts +1 -1
  489. package/src/followups/followup-store.ts +1 -2
  490. package/src/followups/types.ts +0 -6
  491. package/src/heartbeat/heartbeat-service.ts +1 -1
  492. package/src/inbound/platform-callback-registration.ts +1 -1
  493. package/src/inbound/public-ingress-urls.ts +0 -8
  494. package/src/index.ts +12 -0
  495. package/src/mcp/client.ts +1 -1
  496. package/src/mcp/manager.ts +1 -1
  497. package/src/memory/app-store.ts +1 -42
  498. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  499. package/src/memory/conversation-attention-store.ts +154 -0
  500. package/src/memory/conversation-bootstrap.ts +1 -1
  501. package/src/memory/conversation-crud.ts +53 -1
  502. package/src/memory/conversation-display-order-migration.ts +2 -3
  503. package/src/memory/conversation-queries.ts +1 -29
  504. package/src/memory/conversation-title-service.ts +26 -21
  505. package/src/memory/db-connection.ts +1 -8
  506. package/src/memory/db-init.ts +20 -0
  507. package/src/memory/delivery-crud.ts +4 -34
  508. package/src/memory/external-conversation-store.ts +1 -1
  509. package/src/memory/format-recall.ts +47 -0
  510. package/src/memory/guardian-action-store.ts +4 -5
  511. package/src/memory/guardian-rate-limits.ts +0 -3
  512. package/src/memory/invite-store.ts +1 -1
  513. package/src/memory/job-handlers/backfill.ts +9 -2
  514. package/src/memory/job-handlers/extraction.ts +2 -7
  515. package/src/memory/job-handlers/summarization.ts +1 -1
  516. package/src/memory/llm-usage-store.ts +11 -0
  517. package/src/memory/migrations/114-notifications.ts +12 -40
  518. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  519. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  520. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  521. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  522. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  523. package/src/memory/migrations/index.ts +5 -0
  524. package/src/memory/migrations/registry.ts +30 -0
  525. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  526. package/src/memory/retriever.test.ts +707 -0
  527. package/src/memory/retriever.ts +120 -116
  528. package/src/memory/schema/calls.ts +3 -7
  529. package/src/memory/schema/guardian.ts +2 -2
  530. package/src/memory/search/lexical.ts +4 -1
  531. package/src/memory/search/query-expansion.test.ts +70 -0
  532. package/src/memory/search/query-expansion.ts +118 -0
  533. package/src/memory/search/types.ts +18 -17
  534. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  535. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  536. package/src/messaging/registry.ts +0 -1
  537. package/src/notifications/README.md +13 -22
  538. package/src/notifications/adapters/macos.ts +1 -1
  539. package/src/notifications/conversation-pairing.ts +2 -2
  540. package/src/notifications/copy-composer.ts +2 -2
  541. package/src/notifications/decision-engine.ts +1 -10
  542. package/src/notifications/destination-resolver.ts +2 -3
  543. package/src/notifications/emit-signal.ts +2 -8
  544. package/src/notifications/guardian-question-mode.ts +5 -8
  545. package/src/notifications/signal.ts +1 -2
  546. package/src/notifications/types.ts +1 -1
  547. package/src/oauth/token-persistence.ts +25 -1
  548. package/src/permissions/checker.ts +4 -29
  549. package/src/permissions/defaults.ts +6 -6
  550. package/src/permissions/prompter.ts +1 -1
  551. package/src/permissions/secret-prompter.ts +1 -1
  552. package/src/permissions/shell-identity.ts +1 -1
  553. package/src/permissions/trust-store.ts +13 -76
  554. package/src/permissions/workspace-policy.ts +1 -1
  555. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  556. package/src/{config → prompts}/system-prompt.ts +40 -21
  557. package/src/runtime/AGENTS.md +6 -8
  558. package/src/runtime/access-request-helper.ts +36 -55
  559. package/src/runtime/actor-trust-resolver.ts +1 -24
  560. package/src/runtime/approval-message-composer.ts +6 -2
  561. package/src/runtime/assistant-event.ts +1 -1
  562. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  563. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  564. package/src/runtime/auth/route-policy.ts +140 -24
  565. package/src/runtime/auth/subject.ts +9 -0
  566. package/src/runtime/auth/token-service.ts +11 -0
  567. package/src/runtime/auth/types.ts +1 -1
  568. package/src/runtime/channel-approval-types.ts +1 -1
  569. package/src/runtime/channel-approvals.ts +1 -1
  570. package/src/runtime/channel-invite-transport.ts +0 -2
  571. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  572. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  573. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  574. package/src/runtime/channel-readiness-service.ts +24 -159
  575. package/src/runtime/channel-readiness-types.ts +5 -1
  576. package/src/runtime/channel-reply-delivery.ts +43 -3
  577. package/src/runtime/channel-retry-sweep.ts +14 -22
  578. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  579. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  580. package/src/runtime/gateway-client.ts +12 -15
  581. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  582. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  583. package/src/runtime/guardian-action-message-composer.ts +4 -4
  584. package/src/runtime/guardian-reply-router.ts +3 -3
  585. package/src/runtime/http-server.ts +133 -24
  586. package/src/runtime/http-types.ts +34 -1
  587. package/src/runtime/invite-instruction-generator.ts +1 -3
  588. package/src/runtime/invite-redemption-service.ts +5 -5
  589. package/src/runtime/invite-service.ts +7 -7
  590. package/src/runtime/local-actor-identity.ts +28 -2
  591. package/src/runtime/local-gateway-health.ts +275 -0
  592. package/src/runtime/middleware/twilio-validation.ts +3 -3
  593. package/src/runtime/migrations/migration-transport.ts +18 -3
  594. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  595. package/src/runtime/nl-approval-parser.ts +2 -3
  596. package/src/runtime/routes/access-request-decision.ts +2 -2
  597. package/src/runtime/routes/app-management-routes.ts +921 -0
  598. package/src/runtime/routes/approval-routes.ts +76 -7
  599. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  600. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  601. package/src/runtime/routes/channel-route-shared.ts +1 -3
  602. package/src/runtime/routes/channel-routes.ts +1 -4
  603. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  604. package/src/runtime/routes/computer-use-routes.ts +595 -0
  605. package/src/runtime/routes/contact-routes.ts +1 -317
  606. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  607. package/src/runtime/routes/conversation-routes.ts +11 -18
  608. package/src/runtime/routes/debug-routes.ts +1 -1
  609. package/src/runtime/routes/diagnostics-routes.ts +813 -0
  610. package/src/runtime/routes/documents-routes.ts +227 -0
  611. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  612. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  613. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  614. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  615. package/src/runtime/routes/inbound-conversation.ts +3 -10
  616. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  617. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  618. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  619. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  620. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  621. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  622. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  623. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  624. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  625. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  626. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  627. package/src/runtime/routes/integrations/telegram.ts +111 -0
  628. package/src/runtime/routes/integrations/twilio.ts +451 -0
  629. package/src/runtime/routes/invite-routes.ts +2 -2
  630. package/src/runtime/routes/pairing-routes.ts +1 -1
  631. package/src/runtime/routes/recording-routes.ts +332 -0
  632. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  633. package/src/runtime/routes/session-management-routes.ts +167 -0
  634. package/src/runtime/routes/session-query-routes.ts +204 -0
  635. package/src/runtime/routes/settings-routes.ts +977 -0
  636. package/src/runtime/routes/skills-routes.ts +266 -0
  637. package/src/runtime/routes/subagents-routes.ts +246 -0
  638. package/src/runtime/routes/surface-action-routes.ts +100 -10
  639. package/src/runtime/routes/surface-content-routes.ts +1 -1
  640. package/src/runtime/routes/work-items-routes.ts +809 -0
  641. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  642. package/src/runtime/routes/workspace-routes.ts +410 -0
  643. package/src/runtime/routes/workspace-utils.ts +88 -0
  644. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  645. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  646. package/src/runtime/tool-grant-request-helper.ts +1 -2
  647. package/src/runtime/trust-context-resolver.ts +0 -1
  648. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  649. package/src/runtime/verification-rate-limiter.ts +2 -2
  650. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  651. package/src/schedule/integration-status.ts +2 -2
  652. package/src/schedule/schedule-store.ts +7 -9
  653. package/src/sequence/engine.ts +1 -1
  654. package/src/skills/active-skill-tools.ts +0 -8
  655. package/src/skills/clawhub.ts +1 -10
  656. package/src/skills/managed-store.ts +14 -4
  657. package/src/skills/slash-commands.ts +1 -1
  658. package/src/subagent/manager.ts +1 -1
  659. package/src/subagent/types.ts +1 -1
  660. package/src/tasks/SPEC.md +10 -10
  661. package/src/tasks/task-scheduler.ts +1 -1
  662. package/src/telegram/bot-username.ts +13 -0
  663. package/src/tools/assets/materialize.ts +1 -1
  664. package/src/tools/assets/search.ts +1 -1
  665. package/src/tools/browser/browser-execution.ts +2 -2
  666. package/src/tools/browser/browser-manager.ts +88 -11
  667. package/src/tools/browser/browser-screencast.ts +1 -1
  668. package/src/tools/browser/headless-browser.ts +0 -17
  669. package/src/tools/browser/jit-auth.ts +1 -1
  670. package/src/tools/browser/recording-store.ts +19 -1
  671. package/src/tools/browser/runtime-check.ts +4 -2
  672. package/src/tools/calls/call-start.ts +3 -3
  673. package/src/tools/credentials/metadata-store.ts +0 -13
  674. package/src/tools/credentials/vault.ts +7 -31
  675. package/src/tools/followups/followup_create.ts +0 -8
  676. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  677. package/src/tools/memory/definitions.ts +32 -10
  678. package/src/tools/memory/handlers.test.ts +573 -0
  679. package/src/tools/memory/handlers.ts +222 -65
  680. package/src/tools/memory/register.ts +53 -24
  681. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  682. package/src/tools/schedule/update.ts +0 -8
  683. package/src/tools/skills/load.ts +3 -3
  684. package/src/tools/subagent/read.ts +1 -1
  685. package/src/tools/system/voice-config.ts +2 -14
  686. package/src/tools/terminal/safe-env.ts +5 -18
  687. package/src/tools/tool-approval-handler.ts +4 -4
  688. package/src/tools/tool-manifest.ts +4 -2
  689. package/src/tools/types.ts +1 -1
  690. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  691. package/src/twitter/platform-proxy-client.ts +405 -0
  692. package/src/usage/types.ts +21 -0
  693. package/src/util/canonicalize-identity.ts +2 -6
  694. package/src/util/cookie-session.ts +35 -51
  695. package/src/util/platform.ts +93 -86
  696. package/src/util/pricing.ts +180 -43
  697. package/src/work-items/work-item-runner.ts +1 -1
  698. package/scripts/ipc/check-contract-inventory.ts +0 -107
  699. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  700. package/scripts/ipc/generate-swift.ts +0 -528
  701. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  702. package/src/__tests__/app-migration.test.ts +0 -148
  703. package/src/__tests__/config-loader-migration.test.ts +0 -85
  704. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  705. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  706. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  707. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  708. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  709. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  710. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  711. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  712. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  713. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  714. package/src/__tests__/integrations-cli.test.ts +0 -232
  715. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  716. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  717. package/src/__tests__/ipc-contract.test.ts +0 -76
  718. package/src/__tests__/ipc-protocol.test.ts +0 -120
  719. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  720. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  721. package/src/__tests__/ipc-validate.test.ts +0 -471
  722. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  723. package/src/__tests__/migration-ordering.test.ts +0 -267
  724. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  725. package/src/__tests__/platform-move-helper.test.ts +0 -108
  726. package/src/__tests__/platform-socket-path.test.ts +0 -52
  727. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  728. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  729. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  730. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  731. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  732. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  733. package/src/__tests__/work-item-output.test.ts +0 -150
  734. package/src/amazon/session.ts +0 -58
  735. package/src/cli/channels.ts +0 -51
  736. package/src/cli/influencer.ts +0 -319
  737. package/src/cli/integrations.ts +0 -372
  738. package/src/cli/ipc-client.ts +0 -88
  739. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  740. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  741. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  742. package/src/config/core-schema.ts +0 -434
  743. package/src/config/memory-schema.ts +0 -617
  744. package/src/daemon/auth-manager.ts +0 -106
  745. package/src/daemon/handlers/apps.ts +0 -758
  746. package/src/daemon/handlers/avatar.ts +0 -73
  747. package/src/daemon/handlers/browser.ts +0 -3
  748. package/src/daemon/handlers/computer-use.ts +0 -231
  749. package/src/daemon/handlers/config-dispatch.ts +0 -29
  750. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  751. package/src/daemon/handlers/config-inbox.ts +0 -457
  752. package/src/daemon/handlers/config-integrations.ts +0 -409
  753. package/src/daemon/handlers/config-platform.ts +0 -77
  754. package/src/daemon/handlers/config-slack.ts +0 -41
  755. package/src/daemon/handlers/config-tools.ts +0 -226
  756. package/src/daemon/handlers/config-trust.ts +0 -135
  757. package/src/daemon/handlers/config.ts +0 -64
  758. package/src/daemon/handlers/contacts.ts +0 -193
  759. package/src/daemon/handlers/diagnostics.ts +0 -382
  760. package/src/daemon/handlers/documents.ts +0 -188
  761. package/src/daemon/handlers/guardian-actions.ts +0 -82
  762. package/src/daemon/handlers/home-base.ts +0 -82
  763. package/src/daemon/handlers/index.ts +0 -222
  764. package/src/daemon/handlers/misc.ts +0 -1139
  765. package/src/daemon/handlers/navigate-settings.ts +0 -29
  766. package/src/daemon/handlers/oauth-connect.ts +0 -202
  767. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  768. package/src/daemon/handlers/publish.ts +0 -176
  769. package/src/daemon/handlers/signing.ts +0 -56
  770. package/src/daemon/handlers/subagents.ts +0 -286
  771. package/src/daemon/handlers/twitter-auth.ts +0 -220
  772. package/src/daemon/handlers/work-items.ts +0 -796
  773. package/src/daemon/handlers/workspace-files.ts +0 -84
  774. package/src/daemon/handlers.ts +0 -16
  775. package/src/daemon/ipc-blob-store.ts +0 -246
  776. package/src/daemon/ipc-contract-inventory.json +0 -348
  777. package/src/daemon/ipc-contract-inventory.ts +0 -202
  778. package/src/daemon/ipc-handler.ts +0 -120
  779. package/src/daemon/ipc-protocol.ts +0 -85
  780. package/src/daemon/ipc-validate.ts +0 -254
  781. package/src/memory/app-migration.ts +0 -114
  782. package/src/memory/channel-delivery-store.ts +0 -40
  783. package/src/memory/channel-guardian-store.ts +0 -83
  784. package/src/memory/conversation-store.ts +0 -102
  785. package/src/memory/schema-migration.ts +0 -38
  786. package/src/messaging/providers/sms/adapter.ts +0 -232
  787. package/src/messaging/providers/sms/client.ts +0 -93
  788. package/src/messaging/providers/sms/types.ts +0 -7
  789. package/src/migrations/config-merge.ts +0 -62
  790. package/src/migrations/data-layout.ts +0 -89
  791. package/src/migrations/data-merge.ts +0 -44
  792. package/src/migrations/hooks-merge.ts +0 -118
  793. package/src/migrations/index.ts +0 -6
  794. package/src/migrations/log.ts +0 -28
  795. package/src/migrations/skills-merge.ts +0 -44
  796. package/src/migrations/workspace-layout.ts +0 -94
  797. package/src/notifications/adapters/sms.ts +0 -94
  798. package/src/runtime/channel-approval-parser.ts +0 -123
  799. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  800. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  801. package/src/runtime/routes/integration-routes.ts +0 -381
  802. package/src/runtime/routes/twilio-routes.ts +0 -1251
  803. package/src/twitter/router.ts +0 -131
  804. package/src/twitter/session.ts +0 -54
  805. package/src/watcher/providers/slack.ts +0 -282
  806. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  807. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  808. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  809. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  810. /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
  811. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  812. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  813. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  814. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  815. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  816. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  817. /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
  818. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  819. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  820. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  821. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  822. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  823. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  824. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  825. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  826. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  827. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  828. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  829. /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
  830. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  831. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  832. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  833. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  834. /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
  835. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  836. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  837. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  838. /package/src/{config → prompts}/templates/USER.md +0 -0
  839. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  840. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  841. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  842. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  843. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -15,6 +15,11 @@ import {
15
15
  getMemoryBackendStatus,
16
16
  logMemoryEmbeddingWarning,
17
17
  } from "./embedding-backend.js";
18
+ import { formatRecallText } from "./format-recall.js";
19
+ import {
20
+ isQdrantBreakerOpen,
21
+ QdrantCircuitOpenError,
22
+ } from "./qdrant-circuit-breaker.js";
18
23
  import {
19
24
  getCachedRecall,
20
25
  getMemoryVersion,
@@ -22,27 +27,28 @@ import {
22
27
  } from "./recall-cache.js";
23
28
  import { memoryItemSources } from "./schema.js";
24
29
  import { entitySearch } from "./search/entity.js";
25
- import { buildInjectedText, MEMORY_CONTEXT_ACK } from "./search/formatting.js";
30
+ import { MEMORY_CONTEXT_ACK } from "./search/formatting.js";
26
31
  import {
27
32
  directItemSearch,
28
33
  lexicalSearch,
29
34
  recencySearch,
30
35
  } from "./search/lexical.js";
36
+ import { buildFTSQuery, expandQueryForFTS } from "./search/query-expansion.js";
31
37
  import {
32
38
  applySourceCaps,
33
- markItemUsage,
34
39
  mergeCandidates,
35
40
  rerankWithLLM,
36
- trimToTokenBudget,
37
41
  } from "./search/ranking.js";
38
42
  import { isQdrantConnectionError, semanticSearch } from "./search/semantic.js";
39
43
  import type {
40
44
  Candidate,
41
45
  CollectedCandidates,
46
+ DegradationReason,
47
+ DegradationStatus,
48
+ FallbackSource,
42
49
  MemoryRecallCandiateDebug,
43
50
  MemoryRecallOptions,
44
51
  MemoryRecallResult,
45
- MemorySearchResult,
46
52
  ScopePolicyOverride,
47
53
  } from "./search/types.js";
48
54
 
@@ -53,9 +59,11 @@ export {
53
59
  formatRelativeTime,
54
60
  } from "./search/formatting.js";
55
61
  export type {
62
+ DegradationReason,
63
+ DegradationStatus,
64
+ FallbackSource,
56
65
  MemoryRecallCandiateDebug,
57
66
  MemoryRecallResult,
58
- MemorySearchResult,
59
67
  ScopePolicyOverride,
60
68
  } from "./search/types.js";
61
69
 
@@ -84,7 +92,7 @@ const EMBED_BASE_DELAY_MS = 500;
84
92
  * Wrap embedWithBackend with retry + exponential backoff for transient failures
85
93
  * (network errors, 429s, 5xx). Aborts immediately if the caller's signal fires.
86
94
  */
87
- async function embedWithRetry(
95
+ export async function embedWithRetry(
88
96
  config: AssistantConfig,
89
97
  texts: string[],
90
98
  opts?: { signal?: AbortSignal },
@@ -146,10 +154,9 @@ function buildScopeFilter(
146
154
  /**
147
155
  * Shared retrieval pipeline: collect candidates from all available sources
148
156
  * (lexical, recency, semantic, entity, direct item search) and merge them
149
- * using RRF. Used by both `buildMemoryRecall()` (auto recall) and
150
- * `searchMemoryItems()` (memory_search tool) for consistent behavior.
157
+ * using RRF.
151
158
  */
152
- async function collectAndMergeCandidates(
159
+ export async function collectAndMergeCandidates(
153
160
  query: string,
154
161
  config: AssistantConfig,
155
162
  opts?: {
@@ -175,19 +182,46 @@ async function collectAndMergeCandidates(
175
182
  );
176
183
 
177
184
  let semanticSearchFailed = false;
185
+ let semanticSearchError: unknown;
186
+
187
+ // Detect when semantic search won't be available so we can compensate
188
+ // by boosting lexical/recency/direct item limits.
189
+ const semanticUnavailable = !queryVector || isQdrantBreakerOpen();
190
+ if (semanticUnavailable) {
191
+ log.debug("Semantic search unavailable — boosting lexical limits");
192
+ }
178
193
 
179
194
  // -- Phase 1: cheap local searches (always run) --
195
+ const lexicalTopK = semanticUnavailable
196
+ ? config.memory.retrieval.lexicalTopK * 2
197
+ : config.memory.retrieval.lexicalTopK;
198
+
199
+ // When semantic search is unavailable, expand the conversational query
200
+ // into meaningful keywords for better FTS recall. This compensates for
201
+ // the lack of vector-based semantic matching.
202
+ const expandedFtsQuery = semanticUnavailable
203
+ ? buildFTSQuery(expandQueryForFTS(query))
204
+ : undefined;
205
+
180
206
  const lexical = lexicalSearch(
181
207
  query,
182
- config.memory.retrieval.lexicalTopK,
208
+ lexicalTopK,
183
209
  excludeMessageIds,
184
210
  scopeIds,
211
+ expandedFtsQuery,
185
212
  );
186
213
 
214
+ const baseRecencyLimit = Math.max(
215
+ 10,
216
+ Math.floor(config.memory.retrieval.semanticTopK / 2),
217
+ );
218
+ const recencyLimit = semanticUnavailable
219
+ ? Math.ceil(baseRecencyLimit * 1.5)
220
+ : baseRecencyLimit;
187
221
  const recency = opts?.conversationId
188
222
  ? recencySearch(
189
223
  opts.conversationId,
190
- Math.max(10, Math.floor(config.memory.retrieval.semanticTopK / 2)),
224
+ recencyLimit,
191
225
  excludeMessageIds,
192
226
  scopeIds,
193
227
  )
@@ -196,7 +230,10 @@ async function collectAndMergeCandidates(
196
230
  // Direct item search supplements FTS with LIKE-based matching.
197
231
  // When exclusions are present, adaptively increase the fetch size until
198
232
  // we collect directLimit valid (non-excluded) items or exhaust the DB.
199
- const directLimit = Math.max(10, config.memory.retrieval.lexicalTopK);
233
+ const baseDirectLimit = Math.max(10, config.memory.retrieval.lexicalTopK);
234
+ const directLimit = semanticUnavailable
235
+ ? baseDirectLimit * 2
236
+ : baseDirectLimit;
200
237
 
201
238
  // Helper: filter fetched direct items to those with at least one non-excluded source.
202
239
  const filterDirectItems = (items: Candidate[]): Candidate[] => {
@@ -301,8 +338,14 @@ async function collectAndMergeCandidates(
301
338
  // not query-match relevance. Common tokens can produce many high-confidence
302
339
  // but weakly relevant items that would skip semantic search exactly when
303
340
  // it's needed most. Instead, check lexical score (query-match relevance).
341
+ //
342
+ // Disable early termination when semantic search is unavailable: boosted
343
+ // limits inflate cheap candidate counts, making this gate trigger more
344
+ // easily. Skipping entity retrieval on top of losing semantic search
345
+ // would reduce recall quality further.
304
346
  const canTerminateEarly =
305
347
  etConfig.enabled &&
348
+ !semanticUnavailable &&
306
349
  cheapCandidates.length >= etConfig.minCandidates &&
307
350
  cheapCandidates.filter((c) => c.lexical >= etConfig.confidenceThreshold)
308
351
  .length >= etConfig.minHighConfidence;
@@ -329,6 +372,7 @@ async function collectAndMergeCandidates(
329
372
  scopeIds,
330
373
  ).catch((err): Candidate[] => {
331
374
  semanticSearchFailed = true;
375
+ semanticSearchError = err;
332
376
  if (isQdrantConnectionError(err)) {
333
377
  log.warn(
334
378
  { err },
@@ -411,16 +455,42 @@ async function collectAndMergeCandidates(
411
455
  relationExpandedItemCount,
412
456
  earlyTerminated: canTerminateEarly,
413
457
  semanticSearchFailed,
458
+ semanticUnavailable,
459
+ semanticSearchError,
414
460
  merged,
415
461
  };
416
462
  }
417
463
 
464
+ /**
465
+ * Build a structured degradation status describing which retrieval
466
+ * capabilities are unavailable and what fallback sources remain.
467
+ */
468
+ function buildDegradationStatus(
469
+ reason: DegradationReason,
470
+ config: AssistantConfig,
471
+ ): DegradationStatus {
472
+ const fallbackSources: FallbackSource[] = [
473
+ "lexical",
474
+ "recency",
475
+ "direct_item",
476
+ ];
477
+ if (config.memory.entity.enabled) {
478
+ fallbackSources.push("entity");
479
+ }
480
+ return {
481
+ semanticUnavailable: true,
482
+ reason,
483
+ fallbackSources,
484
+ };
485
+ }
486
+
418
487
  /** Result of the embedding generation stage. */
419
488
  interface EmbeddingResult {
420
489
  queryVector: number[] | null;
421
490
  provider: string | undefined;
422
491
  model: string | undefined;
423
492
  degraded: boolean;
493
+ degradation: DegradationStatus | undefined;
424
494
  reason: string | undefined;
425
495
  }
426
496
 
@@ -443,6 +513,7 @@ async function generateQueryEmbedding(
443
513
  let provider: string | undefined;
444
514
  let model: string | undefined;
445
515
  let degraded = backendStatus.degraded;
516
+ let degradation: DegradationStatus | undefined;
446
517
  let reason = backendStatus.reason ?? undefined;
447
518
 
448
519
  if (backendStatus.provider) {
@@ -471,11 +542,16 @@ async function generateQueryEmbedding(
471
542
  reason = `memory.embedding_failure: ${
472
543
  err instanceof Error ? err.message : String(err)
473
544
  }`;
545
+ degradation = buildDegradationStatus(
546
+ "embedding_generation_failed",
547
+ config,
548
+ );
474
549
  if (config.memory.embeddings.required) {
475
550
  return {
476
551
  earlyExit: emptyResult({
477
552
  enabled: true,
478
553
  degraded,
554
+ degradation,
479
555
  reason,
480
556
  provider: backendStatus.provider,
481
557
  model: backendStatus.model ?? undefined,
@@ -485,17 +561,19 @@ async function generateQueryEmbedding(
485
561
  }
486
562
  }
487
563
  } else if (config.memory.embeddings.required) {
564
+ degradation = buildDegradationStatus("embedding_provider_down", config);
488
565
  return {
489
566
  earlyExit: emptyResult({
490
567
  enabled: true,
491
568
  degraded: true,
569
+ degradation,
492
570
  reason: reason ?? "memory.embedding_backend_missing",
493
571
  latencyMs: Date.now() - start,
494
572
  }),
495
573
  };
496
574
  }
497
575
 
498
- return { queryVector, provider, model, degraded, reason };
576
+ return { queryVector, provider, model, degraded, degradation, reason };
499
577
  }
500
578
 
501
579
  /** Result of the re-ranking stage. */
@@ -586,48 +664,12 @@ function formatRecallResult(
586
664
  ),
587
665
  );
588
666
 
589
- // Reserve token budget for the degradation notice so it doesn't push
590
- // injected text over maxInjectTokens when appended after trimming.
591
- const degradationNotice = collected.semanticSearchFailed
592
- ? "[Note: Semantic search is currently unavailable. Memory recall is limited to lexical and recency matching — results may be incomplete or miss semantically relevant memories.]"
593
- : undefined;
594
- const noticeOnlyTokenCost = degradationNotice
595
- ? estimateTextTokens(degradationNotice)
596
- : 0;
597
- // +2 for '\n\n' separator — only needed when candidates are also present
598
- const noticeTokenCost = noticeOnlyTokenCost + (degradationNotice ? 2 : 0);
599
- // When the notice alone exceeds the budget, skip it entirely so
600
- // injectedText never exceeds maxInjectTokens.
601
- const budgetForNotice = noticeTokenCost <= maxInjectTokens;
602
- const candidateBudget = budgetForNotice
603
- ? maxInjectTokens - noticeTokenCost
604
- : maxInjectTokens;
605
-
606
- const selected = trimToTokenBudget(
607
- merged,
608
- candidateBudget,
609
- config.memory.retrieval.injectionFormat,
610
- );
611
- markItemUsage(selected);
612
-
613
- let injectedText = buildInjectedText(
614
- selected,
615
- config.memory.retrieval.injectionFormat,
616
- );
617
-
618
- // Show the notice if it fits: when candidates are present the separator
619
- // cost was already reserved; when no candidates were selected, the notice
620
- // alone (without separator) may still fit even if the full cost didn't.
621
- const canShowNotice =
622
- degradationNotice &&
623
- (budgetForNotice ||
624
- (selected.length === 0 && noticeOnlyTokenCost <= maxInjectTokens));
625
- if (canShowNotice) {
626
- injectedText =
627
- injectedText.length > 0
628
- ? injectedText + "\n\n" + degradationNotice
629
- : degradationNotice;
630
- }
667
+ const formatted = formatRecallText(merged, {
668
+ format: config.memory.retrieval.injectionFormat,
669
+ maxTokens: maxInjectTokens,
670
+ });
671
+ const { selected } = formatted;
672
+ const injectedText = formatted.text;
631
673
 
632
674
  const topCandidates: MemoryRecallCandiateDebug[] = selected
633
675
  .slice(0, 10)
@@ -667,6 +709,7 @@ function formatRecallResult(
667
709
  return {
668
710
  enabled: true,
669
711
  degraded: embedding.degraded,
712
+ degradation: embedding.degradation,
670
713
  reason: embedding.reason,
671
714
  provider: embedding.provider,
672
715
  model: embedding.model,
@@ -781,11 +824,29 @@ export async function buildMemoryRecall(
781
824
  });
782
825
  }
783
826
 
784
- // Propagate semantic search failure into degradation state
785
- if (collected.semanticSearchFailed) {
827
+ // Propagate semantic search failure or breaker-based unavailability into
828
+ // degradation state. This ensures results computed with boosted limits
829
+ // are marked degraded and excluded from the recall cache — preventing
830
+ // stale boosted results from being served after the breaker closes.
831
+ if (collected.semanticSearchFailed || collected.semanticUnavailable) {
786
832
  embeddingResult.degraded = true;
787
833
  embeddingResult.reason =
788
- embeddingResult.reason ?? "memory.semantic_search_failure";
834
+ embeddingResult.reason ??
835
+ (collected.semanticUnavailable
836
+ ? embeddingResult.queryVector != null
837
+ ? "memory.qdrant_circuit_open"
838
+ : "memory.embedding_unavailable"
839
+ : "memory.semantic_search_failure");
840
+ if (!embeddingResult.degradation) {
841
+ const isQdrantIssue =
842
+ embeddingResult.queryVector != null ||
843
+ isQdrantConnectionError(collected.semanticSearchError) ||
844
+ collected.semanticSearchError instanceof QdrantCircuitOpenError;
845
+ const reason: DegradationReason = isQdrantIssue
846
+ ? "qdrant_unavailable"
847
+ : "embedding_generation_failed";
848
+ embeddingResult.degradation = buildDegradationStatus(reason, config);
849
+ }
789
850
  }
790
851
 
791
852
  // Stage 3: Source caps + LLM re-ranking
@@ -967,64 +1028,6 @@ export function queryMemoryForCli(
967
1028
  return buildMemoryRecall(query, conversationId, config);
968
1029
  }
969
1030
 
970
- /**
971
- * Search memory items using the same unified retrieval pipeline as
972
- * automatic recall: lexical, recency, semantic (when available), entity,
973
- * and direct item search -- merged via RRF.
974
- * Returns a simplified result set suitable for the memory_search tool.
975
- */
976
- export async function searchMemoryItems(
977
- query: string,
978
- limit: number,
979
- config: AssistantConfig,
980
- scopeId?: string,
981
- scopePolicyOverride?: ScopePolicyOverride,
982
- ): Promise<MemorySearchResult[]> {
983
- const trimmed = query.trim();
984
- if (trimmed.length === 0 || limit <= 0) return [];
985
-
986
- // Compute embedding vector when available (same as auto recall)
987
- let queryVector: number[] | null = null;
988
- let provider: string | undefined;
989
- let model: string | undefined;
990
- const backendStatus = getMemoryBackendStatus(config);
991
- if (backendStatus.provider) {
992
- try {
993
- const embedded = await embedWithRetry(config, [trimmed]);
994
- queryVector = embedded.vectors[0] ?? null;
995
- provider = embedded.provider;
996
- model = embedded.model;
997
- } catch {
998
- // Gracefully degrade to non-semantic search
999
- }
1000
- }
1001
-
1002
- const result = await collectAndMergeCandidates(trimmed, config, {
1003
- queryVector,
1004
- provider,
1005
- model,
1006
- scopeId,
1007
- scopePolicyOverride,
1008
- });
1009
- const merged = result.merged;
1010
-
1011
- return merged.slice(0, limit).map((c) => ({
1012
- id: c.id,
1013
- type: c.type,
1014
- kind: c.kind,
1015
- text: c.text,
1016
- confidence: c.confidence,
1017
- importance: c.importance,
1018
- createdAt: c.createdAt,
1019
- finalScore: c.finalScore,
1020
- scores: {
1021
- lexical: c.lexical,
1022
- semantic: c.semantic,
1023
- recency: c.recency,
1024
- },
1025
- }));
1026
- }
1027
-
1028
1031
  function emptyResult(
1029
1032
  init: Partial<MemoryRecallResult> &
1030
1033
  Pick<MemoryRecallResult, "enabled" | "degraded" | "latencyMs">,
@@ -1032,6 +1035,7 @@ function emptyResult(
1032
1035
  return {
1033
1036
  enabled: init.enabled,
1034
1037
  degraded: init.degraded,
1038
+ degradation: init.degradation,
1035
1039
  reason: init.reason,
1036
1040
  provider: init.provider,
1037
1041
  model: init.model,
@@ -22,7 +22,7 @@ export const callSessions = sqliteTable(
22
22
  task: text("task"),
23
23
  status: text("status").notNull().default("initiated"),
24
24
  callMode: text("call_mode"),
25
- guardianVerificationSessionId: text("guardian_verification_session_id"),
25
+ verificationSessionId: text("verification_session_id"),
26
26
  callerIdentityMode: text("caller_identity_mode"),
27
27
  callerIdentitySource: text("caller_identity_source"),
28
28
  initiatedFromConversationId: text("initiated_from_conversation_id"),
@@ -85,8 +85,8 @@ export const externalConversationBindings = sqliteTable(
85
85
  },
86
86
  );
87
87
 
88
- export const channelGuardianVerificationChallenges = sqliteTable(
89
- "channel_guardian_verification_challenges",
88
+ export const channelVerificationSessions = sqliteTable(
89
+ "channel_verification_sessions",
90
90
  {
91
91
  id: text("id").primaryKey(),
92
92
  channel: text("channel").notNull(),
@@ -148,10 +148,6 @@ export const channelGuardianRateLimits = sqliteTable(
148
148
  channel: text("channel").notNull(),
149
149
  actorExternalUserId: text("actor_external_user_id").notNull(),
150
150
  actorChatId: text("actor_chat_id").notNull(),
151
- // Legacy columns kept with defaults for backward compatibility with upgraded databases
152
- // that still have the old NOT NULL columns without DEFAULT. Not read by app logic.
153
- invalidAttempts: integer("invalid_attempts").notNull().default(0),
154
- windowStartedAt: integer("window_started_at").notNull().default(0),
155
151
  attemptTimestampsJson: text("attempt_timestamps_json")
156
152
  .notNull()
157
153
  .default("[]"),
@@ -7,7 +7,7 @@ export const guardianActionRequests = sqliteTable(
7
7
  {
8
8
  id: text("id").primaryKey(),
9
9
  kind: text("kind").notNull(), // 'ask_guardian'
10
- sourceChannel: text("source_channel").notNull(), // 'voice'
10
+ sourceChannel: text("source_channel").notNull(), // 'phone'
11
11
  sourceConversationId: text("source_conversation_id").notNull(),
12
12
  callSessionId: text("call_session_id")
13
13
  .notNull()
@@ -52,7 +52,7 @@ export const guardianActionDeliveries = sqliteTable(
52
52
  requestId: text("request_id")
53
53
  .notNull()
54
54
  .references(() => guardianActionRequests.id, { onDelete: "cascade" }),
55
- destinationChannel: text("destination_channel").notNull(), // 'telegram' | 'sms' | 'vellum'
55
+ destinationChannel: text("destination_channel").notNull(), // 'telegram' | 'vellum'
56
56
  destinationConversationId: text("destination_conversation_id"),
57
57
  destinationChatId: text("destination_chat_id"),
58
58
  destinationExternalUserId: text("destination_external_user_id"),
@@ -42,10 +42,13 @@ export function lexicalSearch(
42
42
  limit: number,
43
43
  excludedMessageIds: string[] = [],
44
44
  scopeIds?: string[],
45
+ expandedQuery?: string,
45
46
  ): Candidate[] {
46
47
  const trimmed = query.trim();
47
48
  if (trimmed.length === 0 || limit <= 0) return [];
48
- const matchQuery = buildFtsMatchQuery(trimmed);
49
+ // When an expanded query is provided (e.g. from query expansion in degraded
50
+ // mode), use it instead of building one from the raw conversational query.
51
+ const matchQuery = expandedQuery ?? buildFtsMatchQuery(trimmed);
49
52
  if (!matchQuery) return [];
50
53
  const excluded = new Set(excludedMessageIds);
51
54
  const scopeClause = scopeIds
@@ -0,0 +1,70 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { buildFTSQuery, expandQueryForFTS } from "./query-expansion.js";
4
+
5
+ describe("expandQueryForFTS", () => {
6
+ test("extracts meaningful keywords from conversational input", () => {
7
+ const result = expandQueryForFTS(
8
+ "what did we discuss about the API design?",
9
+ );
10
+ expect(result).toEqual(["discuss", "API", "design"]);
11
+ });
12
+
13
+ test("extracts all tokens from technical input (no stop words)", () => {
14
+ const result = expandQueryForFTS("React component lifecycle hooks");
15
+ expect(result).toEqual(["React", "component", "lifecycle", "hooks"]);
16
+ });
17
+
18
+ test("returns single keyword as-is", () => {
19
+ const result = expandQueryForFTS("authentication");
20
+ expect(result).toEqual(["authentication"]);
21
+ });
22
+
23
+ test("returns empty array for empty input", () => {
24
+ expect(expandQueryForFTS("")).toEqual([]);
25
+ });
26
+
27
+ test("returns empty array for whitespace-only input", () => {
28
+ expect(expandQueryForFTS(" ")).toEqual([]);
29
+ });
30
+
31
+ test("returns empty array for punctuation-only input", () => {
32
+ expect(expandQueryForFTS("???")).toEqual([]);
33
+ });
34
+
35
+ test("returns original tokens when all are stop words", () => {
36
+ const result = expandQueryForFTS("what is the");
37
+ expect(result).toEqual(["what", "is", "the"]);
38
+ });
39
+
40
+ test("splits punctuation-delimited words into separate tokens", () => {
41
+ const result = expandQueryForFTS("error-handling config.yaml");
42
+ expect(result).toEqual(["error", "handling", "config", "yaml"]);
43
+ });
44
+
45
+ test("normalizes contractions instead of splitting on apostrophes", () => {
46
+ const result = expandQueryForFTS("can't we discuss what's happening?");
47
+ expect(result).toEqual(["cant", "discuss", "whats", "happening"]);
48
+ });
49
+ });
50
+
51
+ describe("buildFTSQuery", () => {
52
+ test("joins multiple keywords with OR", () => {
53
+ const result = buildFTSQuery(["API", "design"]);
54
+ expect(result).toBe('"API" OR "design"');
55
+ });
56
+
57
+ test("wraps single keyword in quotes", () => {
58
+ const result = buildFTSQuery(["auth"]);
59
+ expect(result).toBe('"auth"');
60
+ });
61
+
62
+ test("strips double-quote characters from keywords", () => {
63
+ const result = buildFTSQuery(['say "hello"', "world"]);
64
+ expect(result).toBe('"say hello" OR "world"');
65
+ });
66
+
67
+ test("returns undefined for empty keywords", () => {
68
+ expect(buildFTSQuery([])).toBeUndefined();
69
+ });
70
+ });
@@ -0,0 +1,118 @@
1
+ // Stop words filtered out during query expansion to focus on meaningful keywords.
2
+ const STOP_WORDS = new Set([
3
+ "a",
4
+ "an",
5
+ "the",
6
+ "is",
7
+ "are",
8
+ "was",
9
+ "were",
10
+ "be",
11
+ "been",
12
+ "being",
13
+ "do",
14
+ "does",
15
+ "did",
16
+ "have",
17
+ "has",
18
+ "had",
19
+ "will",
20
+ "would",
21
+ "could",
22
+ "should",
23
+ "can",
24
+ "may",
25
+ "might",
26
+ "shall",
27
+ "that",
28
+ "this",
29
+ "these",
30
+ "those",
31
+ "which",
32
+ "what",
33
+ "how",
34
+ "who",
35
+ "whom",
36
+ "where",
37
+ "when",
38
+ "why",
39
+ "it",
40
+ "its",
41
+ "i",
42
+ "me",
43
+ "my",
44
+ "we",
45
+ "us",
46
+ "our",
47
+ "you",
48
+ "your",
49
+ "he",
50
+ "she",
51
+ "they",
52
+ "them",
53
+ "his",
54
+ "her",
55
+ "of",
56
+ "in",
57
+ "on",
58
+ "at",
59
+ "to",
60
+ "for",
61
+ "with",
62
+ "by",
63
+ "from",
64
+ "about",
65
+ "and",
66
+ "or",
67
+ "but",
68
+ "not",
69
+ "so",
70
+ "if",
71
+ "then",
72
+ ]);
73
+
74
+ /**
75
+ * Extract meaningful keywords from a conversational query by tokenizing,
76
+ * stripping punctuation, and removing stop words.
77
+ *
78
+ * Returns an empty array for empty/punctuation-only input so the caller
79
+ * can fall through to the default FTS query builder.
80
+ */
81
+ export function expandQueryForFTS(query: string): string[] {
82
+ const trimmed = query.trim();
83
+ if (trimmed.length === 0) {
84
+ return [];
85
+ }
86
+
87
+ const normalized = trimmed.replace(/(\w)'(\w)/g, "$1$2");
88
+ const tokens = normalized.split(/[^\w]+/).filter((token) => token.length > 0);
89
+
90
+ if (tokens.length === 0) {
91
+ return [];
92
+ }
93
+
94
+ const keywords = tokens.filter(
95
+ (token) => !STOP_WORDS.has(token.toLowerCase()),
96
+ );
97
+
98
+ // If every token was a stop word, return the original tokens rather than
99
+ // discarding the entire query.
100
+ if (keywords.length === 0) {
101
+ return tokens;
102
+ }
103
+
104
+ return keywords;
105
+ }
106
+
107
+ /**
108
+ * Build an FTS5 query string from keywords using OR operators.
109
+ *
110
+ * Example: `["discuss", "API", "design"]` -> `"discuss" OR "API" OR "design"`
111
+ */
112
+ export function buildFTSQuery(keywords: string[]): string | undefined {
113
+ if (keywords.length === 0) {
114
+ return undefined;
115
+ }
116
+
117
+ return keywords.map((kw) => `"${kw.replaceAll('"', "")}"`).join(" OR ");
118
+ }