@vellumai/assistant 0.8.0 → 0.8.1

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 (692) hide show
  1. package/AGENTS.md +11 -0
  2. package/Dockerfile +5 -4
  3. package/README.md +2 -2
  4. package/docker-entrypoint.sh +16 -0
  5. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
  6. package/eslint-rules/cli-no-daemon-internals.js +283 -0
  7. package/eslint.config.mjs +12 -0
  8. package/knip.json +2 -1
  9. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
  10. package/openapi.yaml +4847 -1698
  11. package/package.json +3 -1
  12. package/scripts/generate-openapi.ts +52 -4
  13. package/scripts/sync-llm-catalog.ts +165 -0
  14. package/scripts/sync-web-search-catalog.ts +107 -0
  15. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
  16. package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
  17. package/src/__tests__/anthropic-provider.test.ts +92 -2
  18. package/src/__tests__/app-control-flow.test.ts +7 -0
  19. package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
  20. package/src/__tests__/avatar-identity-sync.test.ts +87 -0
  21. package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
  22. package/src/__tests__/btw-routes.test.ts +1 -0
  23. package/src/__tests__/call-site-routing-provider.test.ts +172 -45
  24. package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
  25. package/src/__tests__/channel-policy.test.ts +12 -0
  26. package/src/__tests__/checker.test.ts +89 -0
  27. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
  28. package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
  29. package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
  30. package/src/__tests__/config-loader-backfill.test.ts +526 -102
  31. package/src/__tests__/config-loader-corrupt.test.ts +68 -0
  32. package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
  33. package/src/__tests__/config-schema-cmd.test.ts +63 -29
  34. package/src/__tests__/config-schema.test.ts +14 -3
  35. package/src/__tests__/config-set-platform-guard.test.ts +75 -152
  36. package/src/__tests__/config-set-route.test.ts +198 -0
  37. package/src/__tests__/config-watcher.test.ts +6 -0
  38. package/src/__tests__/contacts-tools.test.ts +51 -199
  39. package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
  40. package/src/__tests__/context-search-agent-runner.test.ts +22 -138
  41. package/src/__tests__/context-search-conversations-source.test.ts +42 -16
  42. package/src/__tests__/context-search-fanout.test.ts +20 -157
  43. package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
  44. package/src/__tests__/context-search-types.test.ts +7 -2
  45. package/src/__tests__/context-window-manager.test.ts +389 -1
  46. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
  47. package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
  48. package/src/__tests__/conversation-error.test.ts +38 -0
  49. package/src/__tests__/conversation-fork-crud.test.ts +241 -1
  50. package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
  51. package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
  52. package/src/__tests__/conversation-lifecycle.test.ts +124 -0
  53. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
  54. package/src/__tests__/conversation-process-callsite.test.ts +21 -1
  55. package/src/__tests__/conversation-runtime-assembly.test.ts +4 -4
  56. package/src/__tests__/conversation-slash-commands.test.ts +194 -2
  57. package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
  58. package/src/__tests__/credential-security-invariants.test.ts +5 -6
  59. package/src/__tests__/daemon-credential-client.test.ts +56 -1
  60. package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
  61. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
  62. package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
  63. package/src/__tests__/db-proxy-transaction.test.ts +206 -0
  64. package/src/__tests__/external-plugin-loader.test.ts +458 -0
  65. package/src/__tests__/filing-service.test.ts +23 -3
  66. package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
  67. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  68. package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
  69. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -8
  70. package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
  71. package/src/__tests__/heartbeat-service.test.ts +50 -233
  72. package/src/__tests__/history-repair.test.ts +89 -0
  73. package/src/__tests__/host-app-control-proxy.test.ts +109 -1
  74. package/src/__tests__/host-app-control-routes.test.ts +247 -1
  75. package/src/__tests__/host-browser-proxy.test.ts +416 -20
  76. package/src/__tests__/host-browser-routes.test.ts +325 -33
  77. package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
  78. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
  79. package/src/__tests__/inference-profile-reaper.test.ts +154 -0
  80. package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
  81. package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
  82. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
  83. package/src/__tests__/install-skill-routing.test.ts +2 -2
  84. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +15 -0
  85. package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
  86. package/src/__tests__/llm-catalog-parity.test.ts +146 -0
  87. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
  88. package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
  89. package/src/__tests__/llm-resolver.test.ts +46 -0
  90. package/src/__tests__/managed-profile-guard.test.ts +131 -2
  91. package/src/__tests__/mcp-auth-routes.test.ts +1 -0
  92. package/src/__tests__/mcp-cli.test.ts +182 -220
  93. package/src/__tests__/mcp-health-check.test.ts +56 -27
  94. package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
  95. package/src/__tests__/message-complete-display-id.test.ts +175 -0
  96. package/src/__tests__/notification-platform-adapter.test.ts +229 -0
  97. package/src/__tests__/oauth-cli.test.ts +38 -2009
  98. package/src/__tests__/oauth-commands-routes.test.ts +711 -0
  99. package/src/__tests__/oauth-connect-routes.test.ts +174 -11
  100. package/src/__tests__/oauth-providers-routes.test.ts +14 -10
  101. package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
  102. package/src/__tests__/openai-responses-provider.test.ts +17 -0
  103. package/src/__tests__/plugin-bootstrap.test.ts +31 -2
  104. package/src/__tests__/plugin-route-contribution.test.ts +31 -3
  105. package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
  106. package/src/__tests__/plugin-types.test.ts +13 -11
  107. package/src/__tests__/process-message-background-slack.test.ts +46 -0
  108. package/src/__tests__/profile-entry-status.test.ts +43 -0
  109. package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
  110. package/src/__tests__/provider-registry-ollama.test.ts +12 -4
  111. package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
  112. package/src/__tests__/relay-server.test.ts +118 -0
  113. package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
  114. package/src/__tests__/schedule-retry.test.ts +56 -4
  115. package/src/__tests__/schedule-routes.test.ts +104 -0
  116. package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
  117. package/src/__tests__/scheduler-recurrence.test.ts +87 -34
  118. package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
  119. package/src/__tests__/scheduler-wake.test.ts +0 -63
  120. package/src/__tests__/secret-allowlist.test.ts +1 -0
  121. package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
  122. package/src/__tests__/shell-credential-ref.test.ts +95 -3
  123. package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
  124. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  125. package/src/__tests__/skill-load-tool.test.ts +2 -4
  126. package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
  127. package/src/__tests__/suggestion-routes.test.ts +3 -3
  128. package/src/__tests__/sync-message-contract.test.ts +63 -0
  129. package/src/__tests__/task-scheduler.test.ts +88 -23
  130. package/src/__tests__/update-bulletin-job.test.ts +96 -193
  131. package/src/__tests__/usage-cli.test.ts +11 -73
  132. package/src/__tests__/user-plugin-loader.test.ts +145 -0
  133. package/src/__tests__/vercel-config.test.ts +168 -0
  134. package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
  135. package/src/__tests__/web-search.test.ts +303 -2
  136. package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
  137. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
  138. package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
  139. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
  140. package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
  141. package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
  142. package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
  143. package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
  144. package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
  145. package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
  146. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
  147. package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
  148. package/src/acp/__tests__/helpers/which-stub.ts +4 -2
  149. package/src/acp/resolve-agent.test.ts +25 -0
  150. package/src/acp/resolve-agent.ts +13 -2
  151. package/src/acp/session-manager.ts +14 -0
  152. package/src/approvals/guardian-request-resolvers.ts +32 -87
  153. package/src/calls/relay-server.ts +35 -0
  154. package/src/calls/relay-setup-router.ts +36 -0
  155. package/src/calls/types.ts +1 -0
  156. package/src/calls/voice-session-bridge.ts +23 -4
  157. package/src/channels/config.ts +14 -1
  158. package/src/channels/types.ts +1 -0
  159. package/src/cli/AGENTS.md +164 -4
  160. package/src/cli/__tests__/notifications.test.ts +54 -0
  161. package/src/cli/commands/__tests__/avatar.test.ts +540 -0
  162. package/src/cli/commands/__tests__/backup.test.ts +236 -776
  163. package/src/cli/commands/__tests__/cache.test.ts +1 -1
  164. package/src/cli/commands/__tests__/changelog.test.ts +593 -0
  165. package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
  166. package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
  167. package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
  168. package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
  169. package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
  170. package/src/cli/commands/__tests__/email-core.test.ts +579 -0
  171. package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
  172. package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
  173. package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
  174. package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
  175. package/src/cli/commands/__tests__/skills.test.ts +563 -0
  176. package/src/cli/commands/__tests__/status.test.ts +249 -0
  177. package/src/cli/commands/__tests__/stt.test.ts +320 -0
  178. package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
  179. package/src/cli/commands/__tests__/tts.test.ts +321 -0
  180. package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
  181. package/src/cli/commands/attachment.ts +8 -3
  182. package/src/cli/commands/audit.ts +95 -64
  183. package/src/cli/commands/auth.ts +61 -58
  184. package/src/cli/commands/avatar.ts +276 -390
  185. package/src/cli/commands/backup.ts +409 -505
  186. package/src/cli/commands/bash.ts +9 -5
  187. package/src/cli/commands/browser.ts +28 -9
  188. package/src/cli/commands/cache.ts +9 -4
  189. package/src/cli/commands/changelog.ts +414 -0
  190. package/src/cli/commands/channel-verification-sessions.ts +238 -317
  191. package/src/cli/commands/clients.ts +8 -3
  192. package/src/cli/commands/completions.ts +9 -9
  193. package/src/cli/commands/config.ts +102 -72
  194. package/src/cli/commands/contacts.ts +575 -696
  195. package/src/cli/commands/conversations-defer.ts +17 -69
  196. package/src/cli/commands/conversations-import.ts +90 -253
  197. package/src/cli/commands/conversations.ts +346 -436
  198. package/src/cli/commands/credential-execution.ts +9 -6
  199. package/src/cli/commands/credentials.ts +456 -736
  200. package/src/cli/commands/domain.ts +128 -206
  201. package/src/cli/commands/email.ts +606 -794
  202. package/src/cli/commands/gateway.ts +8 -1
  203. package/src/cli/commands/image-generation.ts +157 -205
  204. package/src/cli/commands/inference-providers.ts +352 -0
  205. package/src/cli/commands/inference-session.ts +415 -0
  206. package/src/cli/commands/inference.ts +87 -65
  207. package/src/cli/commands/keys.ts +8 -3
  208. package/src/cli/commands/mcp.ts +103 -287
  209. package/src/cli/commands/memory-v2.ts +162 -516
  210. package/src/cli/commands/notifications.ts +33 -7
  211. package/src/cli/commands/oauth/apps.ts +292 -261
  212. package/src/cli/commands/oauth/connect.ts +176 -297
  213. package/src/cli/commands/oauth/disconnect.ts +16 -215
  214. package/src/cli/commands/oauth/index.ts +49 -45
  215. package/src/cli/commands/oauth/mode.ts +43 -199
  216. package/src/cli/commands/oauth/ping.ts +17 -125
  217. package/src/cli/commands/oauth/providers.ts +732 -921
  218. package/src/cli/commands/oauth/request.ts +60 -350
  219. package/src/cli/commands/oauth/shared.ts +11 -121
  220. package/src/cli/commands/oauth/status.ts +31 -121
  221. package/src/cli/commands/oauth/token.ts +13 -55
  222. package/src/cli/commands/pending.ts +19 -10
  223. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
  224. package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
  225. package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
  226. package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
  227. package/src/cli/commands/platform/connect.ts +16 -80
  228. package/src/cli/commands/platform/disconnect.ts +14 -112
  229. package/src/cli/commands/platform/index.ts +177 -246
  230. package/src/cli/commands/routes.ts +153 -336
  231. package/src/cli/commands/sequence.ts +316 -360
  232. package/src/cli/commands/skills.ts +449 -671
  233. package/src/cli/commands/status.ts +58 -37
  234. package/src/cli/commands/stt.ts +94 -262
  235. package/src/cli/commands/task.ts +14 -40
  236. package/src/cli/commands/trust.ts +8 -3
  237. package/src/cli/commands/tts.ts +162 -167
  238. package/src/cli/commands/ui.ts +35 -42
  239. package/src/cli/commands/usage.ts +188 -126
  240. package/src/cli/commands/watchers.ts +8 -3
  241. package/src/cli/commands/webhooks.ts +99 -193
  242. package/src/cli/lib/__tests__/register-command.test.ts +85 -0
  243. package/src/cli/lib/daemon-credential-client.ts +4 -5
  244. package/src/cli/lib/nested-value.ts +44 -0
  245. package/src/cli/lib/open-browser.ts +36 -0
  246. package/src/cli/lib/register-command.ts +19 -0
  247. package/src/cli/lib/time-ago.ts +34 -0
  248. package/src/cli/program.ts +2 -4
  249. package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
  250. package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
  251. package/src/cli/utils/conversation-id.ts +30 -0
  252. package/src/cli/utils/parse-duration.ts +41 -0
  253. package/src/config/acp-defaults.test.ts +5 -1
  254. package/src/config/acp-defaults.ts +11 -4
  255. package/src/config/bundled-skills/acp/TOOLS.json +2 -2
  256. package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
  257. package/src/config/bundled-skills/contacts/SKILL.md +12 -45
  258. package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
  259. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
  260. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
  261. package/src/config/bundled-tool-registry.ts +0 -2
  262. package/src/config/feature-flag-registry.json +16 -0
  263. package/src/config/llm-resolver.ts +16 -1
  264. package/src/config/loader.ts +76 -14
  265. package/src/config/raw-config-utils.ts +2 -30
  266. package/src/config/schema.ts +4 -0
  267. package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
  268. package/src/config/schemas/call-site-catalog.ts +29 -7
  269. package/src/config/schemas/llm-request-logs.ts +57 -0
  270. package/src/config/schemas/llm.ts +52 -2
  271. package/src/config/schemas/memory-retrospective.ts +48 -0
  272. package/src/config/schemas/memory-v2.ts +32 -1
  273. package/src/config/schemas/memory.ts +4 -0
  274. package/src/config/schemas/services.ts +15 -12
  275. package/src/config/seed-inference-profiles.ts +195 -134
  276. package/src/contacts/contact-store.ts +0 -61
  277. package/src/context/window-manager.ts +191 -5
  278. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +79 -0
  279. package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
  280. package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
  281. package/src/daemon/approval-generators.ts +23 -29
  282. package/src/daemon/config-watcher.ts +2 -0
  283. package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
  284. package/src/daemon/conversation-agent-loop.ts +127 -97
  285. package/src/daemon/conversation-error.ts +21 -0
  286. package/src/daemon/conversation-lifecycle.ts +46 -5
  287. package/src/daemon/conversation-process.ts +36 -19
  288. package/src/daemon/conversation-runtime-assembly.ts +14 -5
  289. package/src/daemon/conversation-slash.ts +175 -23
  290. package/src/daemon/conversation-store.ts +17 -10
  291. package/src/daemon/conversation-surfaces.ts +76 -12
  292. package/src/daemon/conversation-tool-setup.ts +24 -14
  293. package/src/daemon/conversation.ts +48 -9
  294. package/src/daemon/external-plugins-bootstrap.ts +18 -8
  295. package/src/daemon/guardian-action-generators.ts +7 -22
  296. package/src/daemon/handlers/config-model.ts +8 -126
  297. package/src/daemon/handlers/config-slack-channel.ts +10 -7
  298. package/src/daemon/handlers/config-vercel.ts +3 -1
  299. package/src/daemon/handlers/skills.ts +84 -5
  300. package/src/daemon/history-repair.ts +33 -6
  301. package/src/daemon/host-app-control-proxy.ts +44 -19
  302. package/src/daemon/host-bash-proxy.ts +85 -158
  303. package/src/daemon/host-browser-proxy.ts +96 -35
  304. package/src/daemon/host-proxy-base.ts +13 -1
  305. package/src/daemon/host-proxy-preactivation.ts +25 -1
  306. package/src/daemon/identity-helpers.ts +19 -0
  307. package/src/daemon/lifecycle.ts +42 -43
  308. package/src/daemon/meet-host-supervisor.ts +15 -15
  309. package/src/daemon/memory-v2-startup.ts +9 -2
  310. package/src/daemon/message-protocol.ts +6 -0
  311. package/src/daemon/message-types/bookmarks.ts +18 -0
  312. package/src/daemon/message-types/conversations.ts +12 -9
  313. package/src/daemon/message-types/messages.ts +9 -1
  314. package/src/daemon/message-types/sync.ts +60 -0
  315. package/src/daemon/pkb-reminder-builder.test.ts +54 -13
  316. package/src/daemon/pkb-reminder-builder.ts +21 -7
  317. package/src/daemon/process-message.ts +56 -23
  318. package/src/daemon/server.ts +23 -18
  319. package/src/daemon/shutdown-handlers.ts +0 -2
  320. package/src/daemon/tool-setup-types.ts +9 -0
  321. package/src/daemon/tool-side-effects.ts +6 -4
  322. package/src/daemon/wake-target-adapter.ts +11 -0
  323. package/src/export/transcript-formatter.ts +61 -2
  324. package/src/filing/filing-service.ts +40 -53
  325. package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
  326. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  327. package/src/heartbeat/heartbeat-service.ts +148 -127
  328. package/src/home/__tests__/feed-types.test.ts +63 -131
  329. package/src/home/__tests__/feed-writer.test.ts +77 -278
  330. package/src/home/__tests__/post-connect-feed.test.ts +9 -12
  331. package/src/home/feed-types.ts +19 -73
  332. package/src/home/feed-writer.ts +25 -156
  333. package/src/home/post-connect-feed.ts +1 -3
  334. package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
  335. package/src/ipc/__tests__/email-ipc.test.ts +506 -0
  336. package/src/ipc/__tests__/exit-helper.test.ts +104 -0
  337. package/src/ipc/__tests__/streaming-client.test.ts +237 -0
  338. package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
  339. package/src/ipc/assistant-server.ts +55 -6
  340. package/src/ipc/cli-client.ts +370 -50
  341. package/src/ipc/routes/db-proxy-transaction.ts +151 -0
  342. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
  343. package/src/ipc/skill-routes/events.ts +30 -3
  344. package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
  345. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
  346. package/src/live-voice/live-voice-session-manager.ts +11 -4
  347. package/src/live-voice/live-voice-session.ts +14 -6
  348. package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
  349. package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
  350. package/src/memory/__tests__/conversation-types.test.ts +36 -0
  351. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
  352. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
  353. package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
  354. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
  355. package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
  356. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
  357. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
  358. package/src/memory/bookmark-crud.ts +179 -0
  359. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
  360. package/src/memory/context-search/agent-protocol.ts +5 -1
  361. package/src/memory/context-search/agent-runner.ts +60 -85
  362. package/src/memory/context-search/limits.ts +1 -4
  363. package/src/memory/context-search/search.ts +23 -113
  364. package/src/memory/context-search/sources/conversations.ts +18 -6
  365. package/src/memory/context-search/sources/memory-v2.ts +39 -14
  366. package/src/memory/context-search/sources/memory.ts +7 -0
  367. package/src/memory/context-search/sources/workspace.ts +13 -10
  368. package/src/memory/context-search/types.ts +1 -1
  369. package/src/memory/conversation-bootstrap.ts +11 -0
  370. package/src/memory/conversation-crud.ts +312 -10
  371. package/src/memory/conversation-queries.ts +9 -5
  372. package/src/memory/conversation-title-service.ts +1 -0
  373. package/src/memory/conversation-types.ts +16 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +2 -1
  376. package/src/memory/embedding-runtime-manager.ts +1 -2
  377. package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
  378. package/src/memory/graph/conversation-graph-memory.ts +76 -5
  379. package/src/memory/graph/extraction.ts +4 -0
  380. package/src/memory/graph/graph-memory-state-store.ts +16 -3
  381. package/src/memory/graph/tool-handlers.ts +17 -7
  382. package/src/memory/graph/tools.ts +44 -5
  383. package/src/memory/indexer.ts +17 -0
  384. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +13 -15
  385. package/src/memory/jobs/embed-concept-page.ts +45 -9
  386. package/src/memory/jobs-store.ts +51 -1
  387. package/src/memory/jobs-worker.ts +52 -3
  388. package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
  389. package/src/memory/llm-request-log-source-local.ts +26 -0
  390. package/src/memory/llm-request-log-source.ts +97 -0
  391. package/src/memory/llm-request-log-store.ts +1 -1
  392. package/src/memory/memory-retrospective-constants.ts +13 -0
  393. package/src/memory/memory-retrospective-enqueue.ts +114 -0
  394. package/src/memory/memory-retrospective-job.ts +351 -0
  395. package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
  396. package/src/memory/memory-retrospective-state.ts +162 -0
  397. package/src/memory/memory-retrospective-trigger-check.ts +91 -0
  398. package/src/memory/memory-v2-activation-log-store.ts +49 -5
  399. package/src/memory/memory-v2-concept-frequency.ts +4 -0
  400. package/src/memory/message-content.ts +38 -1
  401. package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
  402. package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
  403. package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
  404. package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
  405. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
  406. package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
  407. package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
  408. package/src/memory/migrations/242-message-bookmarks.ts +38 -0
  409. package/src/memory/migrations/243-provider-connections.ts +68 -0
  410. package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
  411. package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
  412. package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
  413. package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
  414. package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
  415. package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
  416. package/src/memory/migrations/index.ts +7 -0
  417. package/src/memory/published-pages-store.ts +16 -0
  418. package/src/memory/schema/bookmarks.ts +38 -0
  419. package/src/memory/schema/conversations.ts +2 -0
  420. package/src/memory/schema/index.ts +2 -0
  421. package/src/memory/schema/inference.ts +29 -0
  422. package/src/memory/schema/memory-core.ts +9 -0
  423. package/src/memory/search/semantic.ts +1 -4
  424. package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
  425. package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
  426. package/src/memory/v2/__tests__/activation.test.ts +11 -4
  427. package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
  428. package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
  429. package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
  430. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
  431. package/src/memory/v2/__tests__/injection.test.ts +628 -10
  432. package/src/memory/v2/__tests__/migration.test.ts +7 -3
  433. package/src/memory/v2/__tests__/page-index.test.ts +277 -0
  434. package/src/memory/v2/__tests__/page-store.test.ts +14 -1
  435. package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
  436. package/src/memory/v2/__tests__/qdrant.test.ts +72 -0
  437. package/src/memory/v2/__tests__/reranker.test.ts +4 -4
  438. package/src/memory/v2/__tests__/router.test.ts +516 -0
  439. package/src/memory/v2/__tests__/sim.test.ts +45 -1
  440. package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
  441. package/src/memory/v2/__tests__/static-context.test.ts +7 -22
  442. package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
  443. package/src/memory/v2/activation-store.ts +34 -5
  444. package/src/memory/v2/activation.ts +40 -27
  445. package/src/memory/v2/backfill-jobs.ts +17 -84
  446. package/src/memory/v2/consolidation-job.ts +85 -78
  447. package/src/memory/v2/frontmatter-sweep.ts +91 -0
  448. package/src/memory/v2/injection.ts +440 -109
  449. package/src/memory/v2/migration.ts +117 -20
  450. package/src/memory/v2/page-index.ts +191 -0
  451. package/src/memory/v2/page-store.ts +3 -0
  452. package/src/memory/v2/prompts/consolidation.ts +9 -7
  453. package/src/memory/v2/prompts/router.ts +192 -0
  454. package/src/memory/v2/qdrant.ts +100 -87
  455. package/src/memory/v2/reranker.ts +14 -7
  456. package/src/memory/v2/router.ts +322 -0
  457. package/src/memory/v2/sim.ts +25 -12
  458. package/src/memory/v2/skill-store.ts +118 -29
  459. package/src/memory/v2/static-context.ts +16 -9
  460. package/src/memory/v2/sweep-job.ts +122 -96
  461. package/src/memory/v2/types.ts +10 -6
  462. package/src/memory/validation.ts +13 -0
  463. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
  464. package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
  465. package/src/notifications/__tests__/signal-registry.test.ts +17 -0
  466. package/src/notifications/adapters/platform.ts +171 -0
  467. package/src/notifications/conversation-pairing.ts +2 -2
  468. package/src/notifications/copy-composer.ts +15 -0
  469. package/src/notifications/destination-resolver.ts +21 -0
  470. package/src/notifications/emit-signal.ts +28 -1
  471. package/src/notifications/home-feed-side-effect.ts +111 -0
  472. package/src/notifications/signal.ts +5 -0
  473. package/src/permissions/checker.ts +12 -0
  474. package/src/permissions/ipc-risk-types.ts +2 -0
  475. package/src/plugin-api/index.ts +13 -0
  476. package/src/plugin-api/package.json +12 -0
  477. package/src/plugin-api/types.ts +62 -0
  478. package/src/plugins/defaults/injectors.ts +19 -3
  479. package/src/plugins/external-plugin-loader.ts +294 -0
  480. package/src/plugins/types.ts +46 -30
  481. package/src/plugins/user-loader.ts +64 -41
  482. package/src/proactive-artifact/job.test.ts +12 -4
  483. package/src/proactive-artifact/job.ts +4 -0
  484. package/src/proactive-artifact/trigger-state.test.ts +9 -0
  485. package/src/proactive-artifact/trigger-state.ts +4 -0
  486. package/src/prompts/__tests__/system-prompt.test.ts +105 -0
  487. package/src/prompts/system-prompt.ts +22 -1
  488. package/src/prompts/update-bulletin-job.ts +61 -73
  489. package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
  490. package/src/providers/__tests__/inference.test.ts +288 -0
  491. package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
  492. package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
  493. package/src/providers/__tests__/retry-callsite.test.ts +14 -32
  494. package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
  495. package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
  496. package/src/providers/anthropic/client.ts +95 -26
  497. package/src/providers/call-site-routing.ts +94 -16
  498. package/src/providers/connection-resolution.ts +163 -0
  499. package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
  500. package/src/providers/inference/adapter-factory.ts +173 -0
  501. package/src/providers/inference/auth.ts +112 -0
  502. package/src/providers/inference/backfill.ts +196 -0
  503. package/src/providers/inference/connections.ts +356 -0
  504. package/src/providers/inference/resolve-auth.ts +65 -0
  505. package/src/providers/model-catalog.ts +104 -6
  506. package/src/providers/openai/responses-provider.ts +4 -2
  507. package/src/providers/provider-env-vars.ts +17 -7
  508. package/src/providers/provider-secret-catalog.ts +49 -30
  509. package/src/providers/provider-send-message.ts +41 -20
  510. package/src/providers/registry.ts +143 -159
  511. package/src/providers/retry.ts +18 -10
  512. package/src/providers/search-provider-catalog.ts +121 -0
  513. package/src/runtime/AGENTS.md +18 -5
  514. package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
  515. package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
  516. package/src/runtime/actor-trust-resolver.ts +32 -10
  517. package/src/runtime/agent-wake.ts +35 -6
  518. package/src/runtime/assistant-event-hub.ts +3 -85
  519. package/src/runtime/auth/route-policy.ts +303 -8
  520. package/src/runtime/auth/same-actor.ts +2 -0
  521. package/src/runtime/background-job-runner.ts +339 -0
  522. package/src/runtime/btw-sidechain.ts +1 -0
  523. package/src/runtime/http-router.ts +36 -1
  524. package/src/runtime/http-server.ts +31 -5
  525. package/src/runtime/http-types.ts +2 -0
  526. package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
  527. package/src/runtime/middleware/request-logger.ts +62 -1
  528. package/src/runtime/pre-first-message-gate.ts +83 -0
  529. package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
  530. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
  531. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
  532. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
  533. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
  534. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
  535. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
  536. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
  537. package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
  538. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
  539. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  540. package/src/runtime/routes/acp-routes.ts +10 -8
  541. package/src/runtime/routes/app-management-routes.ts +228 -3
  542. package/src/runtime/routes/approval-routes.ts +0 -18
  543. package/src/runtime/routes/audit-routes.ts +43 -0
  544. package/src/runtime/routes/auth-routes.ts +72 -0
  545. package/src/runtime/routes/avatar-routes.ts +273 -20
  546. package/src/runtime/routes/backup-routes.ts +406 -2
  547. package/src/runtime/routes/bookmark-routes.ts +154 -0
  548. package/src/runtime/routes/channel-verification-routes.ts +2 -1
  549. package/src/runtime/routes/contact-routes.ts +0 -160
  550. package/src/runtime/routes/conversation-cli-routes.ts +192 -0
  551. package/src/runtime/routes/conversation-management-routes.ts +30 -43
  552. package/src/runtime/routes/conversation-query-routes.ts +334 -86
  553. package/src/runtime/routes/conversation-routes.ts +31 -10
  554. package/src/runtime/routes/conversations-import-routes.ts +229 -0
  555. package/src/runtime/routes/credential-routes.ts +540 -0
  556. package/src/runtime/routes/debug-routes.ts +2 -2
  557. package/src/runtime/routes/document-pdf-renderer.ts +5 -1
  558. package/src/runtime/routes/domain-routes.ts +167 -0
  559. package/src/runtime/routes/email-routes.ts +603 -0
  560. package/src/runtime/routes/errors.ts +2 -2
  561. package/src/runtime/routes/events-routes.ts +192 -0
  562. package/src/runtime/routes/home-feed-routes.ts +6 -78
  563. package/src/runtime/routes/host-app-control-routes.ts +44 -2
  564. package/src/runtime/routes/host-browser-routes.ts +103 -22
  565. package/src/runtime/routes/http-adapter.ts +2 -0
  566. package/src/runtime/routes/identity-routes.ts +5 -0
  567. package/src/runtime/routes/image-generation-routes.ts +99 -0
  568. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
  569. package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
  570. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
  571. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
  572. package/src/runtime/routes/index.ts +36 -0
  573. package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
  574. package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
  575. package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
  576. package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
  577. package/src/runtime/routes/inference-send-routes.ts +115 -0
  578. package/src/runtime/routes/integrations/twilio.ts +1 -0
  579. package/src/runtime/routes/mcp-auth-routes.ts +283 -9
  580. package/src/runtime/routes/memory-v2-routes.ts +13 -398
  581. package/src/runtime/routes/notification-routes.ts +2 -0
  582. package/src/runtime/routes/oauth-apps.ts +112 -7
  583. package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
  584. package/src/runtime/routes/oauth-connect-routes.ts +67 -5
  585. package/src/runtime/routes/oauth-providers.ts +298 -8
  586. package/src/runtime/routes/platform-routes.ts +336 -0
  587. package/src/runtime/routes/playground/inject-failures.ts +2 -1
  588. package/src/runtime/routes/playground/reset-circuit.ts +2 -1
  589. package/src/runtime/routes/playground/state.ts +2 -1
  590. package/src/runtime/routes/publish-routes.ts +221 -0
  591. package/src/runtime/routes/schedule-routes.ts +82 -0
  592. package/src/runtime/routes/sequence-routes.ts +291 -0
  593. package/src/runtime/routes/settings-routes.ts +2 -10
  594. package/src/runtime/routes/skills-routes.ts +31 -1
  595. package/src/runtime/routes/stt-routes.ts +240 -3
  596. package/src/runtime/routes/surface-action-routes.ts +43 -7
  597. package/src/runtime/routes/tts-routes.ts +67 -0
  598. package/src/runtime/routes/types.ts +32 -0
  599. package/src/runtime/routes/user-routes-cli.ts +243 -0
  600. package/src/runtime/routes/webhook-routes.ts +165 -0
  601. package/src/runtime/sync/resource-sync-events.ts +25 -0
  602. package/src/runtime/sync/sync-publisher.test.ts +105 -0
  603. package/src/runtime/sync/sync-publisher.ts +21 -0
  604. package/src/schedule/scheduler.ts +200 -123
  605. package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
  606. package/src/security/secret-patterns.ts +3 -0
  607. package/src/sequence/engine.ts +38 -40
  608. package/src/subagent/manager.ts +20 -15
  609. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
  610. package/src/tools/browser/browser-execution.ts +15 -4
  611. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
  612. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
  613. package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
  614. package/src/tools/browser/cdp-client/factory.ts +66 -5
  615. package/src/tools/browser/runtime-check.ts +77 -0
  616. package/src/tools/memory/register.test.ts +3 -3
  617. package/src/tools/memory/register.ts +9 -1
  618. package/src/tools/network/__tests__/web-search.test.ts +156 -0
  619. package/src/tools/network/web-search.ts +280 -37
  620. package/src/tools/permission-checker.ts +13 -5
  621. package/src/tools/subagent/spawn.ts +3 -3
  622. package/src/tools/terminal/shell.ts +44 -0
  623. package/src/usage/attribution.ts +3 -2
  624. package/src/util/pricing.ts +86 -160
  625. package/src/watcher/__tests__/engine.test.ts +301 -0
  626. package/src/watcher/constants.ts +7 -0
  627. package/src/watcher/engine.ts +90 -90
  628. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
  629. package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
  630. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
  631. package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
  632. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
  633. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
  634. package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
  635. package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
  636. package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
  637. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
  638. package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
  639. package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
  640. package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
  641. package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
  642. package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
  643. package/src/workspace/migrations/registry.ts +22 -0
  644. package/src/workspace/migrations/runner.ts +13 -2
  645. package/src/workspace/migrations/types.ts +13 -3
  646. package/src/workspace/provider-commit-message-generator.ts +3 -2
  647. package/src/__tests__/context-search-pkb-source.test.ts +0 -498
  648. package/src/__tests__/credentials-cli.test.ts +0 -1225
  649. package/src/__tests__/memory-admin-recall.test.ts +0 -213
  650. package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
  651. package/src/cli/commands/__tests__/email-download.test.ts +0 -260
  652. package/src/cli/commands/__tests__/email-list.test.ts +0 -216
  653. package/src/cli/commands/__tests__/email-register.test.ts +0 -186
  654. package/src/cli/commands/__tests__/email-send.test.ts +0 -416
  655. package/src/cli/commands/__tests__/email-status.test.ts +0 -185
  656. package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
  657. package/src/cli/commands/__tests__/routes.test.ts +0 -562
  658. package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
  659. package/src/cli/commands/autonomy.ts +0 -365
  660. package/src/cli/commands/memory.ts +0 -424
  661. package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
  662. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
  663. package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
  664. package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
  665. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
  666. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
  667. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
  668. package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
  669. package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
  670. package/src/cli/lib/daemon-avatar-client.ts +0 -37
  671. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
  672. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
  673. package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
  674. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
  675. package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
  676. package/src/home/__tests__/emit-feed-event.test.ts +0 -169
  677. package/src/home/__tests__/feed-population-integration.test.ts +0 -312
  678. package/src/home/__tests__/feed-scheduler.test.ts +0 -222
  679. package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
  680. package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
  681. package/src/home/__tests__/rollup-producer.test.ts +0 -507
  682. package/src/home/assistant-feed-authoring.ts +0 -135
  683. package/src/home/emit-feed-event.ts +0 -169
  684. package/src/home/feed-scheduler.ts +0 -281
  685. package/src/home/platform-gmail-digest.ts +0 -163
  686. package/src/home/rewrite-command-preview.ts +0 -66
  687. package/src/home/rewrite-feed-title.ts +0 -58
  688. package/src/home/rollup-producer.ts +0 -426
  689. package/src/memory/admin.ts +0 -326
  690. package/src/memory/context-search/sources/pkb.ts +0 -476
  691. package/src/memory/graph/compaction.ts +0 -299
  692. /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
@@ -63,11 +63,11 @@ mock.module("../security/secure-keys.js", () => ({
63
63
  mock.module("../config/loader.js", () => ({
64
64
  getConfig: () => ({
65
65
  llm: mockLlmConfig,
66
- services: { inference: { mode: "your-own" } },
66
+ services: { inference: {} },
67
67
  }),
68
68
  }));
69
69
 
70
- import { LLMSchema } from "../config/schemas/llm.js";
70
+ import { type LLMConfigBase, LLMSchema } from "../config/schemas/llm.js";
71
71
  import type { ProvidersConfig } from "../providers/registry.js";
72
72
  import {
73
73
  getProvider,
@@ -77,9 +77,10 @@ import {
77
77
  } from "../providers/registry.js";
78
78
 
79
79
  function makeProvidersConfig(provider: string, model: string): ProvidersConfig {
80
+ const baseLlm = LLMSchema.parse({});
80
81
  return {
81
82
  services: {
82
- inference: { mode: "your-own" },
83
+ inference: {},
83
84
  "image-generation": {
84
85
  mode: "your-own",
85
86
  provider: "gemini",
@@ -87,7 +88,14 @@ function makeProvidersConfig(provider: string, model: string): ProvidersConfig {
87
88
  },
88
89
  "web-search": { mode: "your-own", provider: "inference-provider-native" },
89
90
  },
90
- llm: { default: { provider, model } },
91
+ llm: {
92
+ ...baseLlm,
93
+ default: {
94
+ ...baseLlm.default,
95
+ provider: provider as LLMConfigBase["provider"],
96
+ model,
97
+ },
98
+ },
91
99
  };
92
100
  }
93
101
 
@@ -7,19 +7,20 @@ mock.module("../security/secure-keys.js", () => ({
7
7
  getSecureKeyAsync: async () => undefined,
8
8
  }));
9
9
 
10
+ import { LLMSchema } from "../config/schemas/llm.js";
10
11
  import {
11
12
  getProvider,
12
13
  initializeProviders,
13
14
  listProviders,
14
15
  } from "../providers/registry.js";
15
16
 
17
+ const baseLlm = LLMSchema.parse({});
18
+
16
19
  describe("provider registry (ollama)", () => {
17
20
  test("registers ollama when selected provider has no API key", async () => {
18
21
  await initializeProviders({
19
22
  services: {
20
- inference: {
21
- mode: "your-own",
22
- },
23
+ inference: {},
23
24
  "image-generation": {
24
25
  mode: "your-own",
25
26
  provider: "gemini",
@@ -30,7 +31,14 @@ describe("provider registry (ollama)", () => {
30
31
  provider: "inference-provider-native",
31
32
  },
32
33
  },
33
- llm: { default: { provider: "ollama", model: "claude-opus-4-6" } },
34
+ llm: {
35
+ ...baseLlm,
36
+ default: {
37
+ ...baseLlm.default,
38
+ provider: "ollama" as const,
39
+ model: "claude-opus-4-6",
40
+ },
41
+ },
34
42
  });
35
43
 
36
44
  const provider = getProvider("ollama");
@@ -144,11 +144,15 @@ describe("SendMessageOptions.config.overrideProfile", () => {
144
144
  expect(captured?.callSite).toBeUndefined();
145
145
  });
146
146
 
147
- test("CallSiteRoutingProvider switches transport when overrideProfile changes the provider", async () => {
147
+ test("CallSiteRoutingProvider switches transport when overrideProfile changes the provider (via provider_connection)", async () => {
148
148
  setLlmConfig({
149
149
  default: { provider: "anthropic", model: "claude-opus-4-7" },
150
150
  profiles: {
151
- fast: { provider: "openai", model: "gpt-5.4" },
151
+ fast: {
152
+ provider: "openai",
153
+ provider_connection: "openai-conn",
154
+ model: "gpt-5.4",
155
+ },
152
156
  },
153
157
  });
154
158
 
@@ -168,8 +172,10 @@ describe("SendMessageOptions.config.overrideProfile", () => {
168
172
  },
169
173
  };
170
174
 
171
- const wrapped = new CallSiteRoutingProvider(defaultProvider, (name) =>
172
- name === "openai" ? altProvider : undefined,
175
+ const wrapped = new CallSiteRoutingProvider(
176
+ defaultProvider,
177
+ async (connectionName) =>
178
+ connectionName === "openai-conn" ? altProvider : null,
173
179
  );
174
180
 
175
181
  const response = await wrapped.sendMessage(
@@ -2305,6 +2305,124 @@ describe("relay-server", () => {
2305
2305
  relay.destroy();
2306
2306
  });
2307
2307
 
2308
+ test("inbound voice: guardian's unverified channel gets self-verify guidance", async () => {
2309
+ ensureConversation("conv-unverified-guardian");
2310
+ const session = createCallSession({
2311
+ conversationId: "conv-unverified-guardian",
2312
+ provider: "twilio",
2313
+ fromNumber: "+15558886666",
2314
+ toNumber: "+15551111111",
2315
+ });
2316
+
2317
+ upsertContactChannel({
2318
+ sourceChannel: "phone",
2319
+ externalUserId: "+15558886666",
2320
+ externalChatId: "+15558886666",
2321
+ displayName: "Vargas",
2322
+ role: "guardian",
2323
+ status: "unverified",
2324
+ policy: "allow",
2325
+ });
2326
+
2327
+ const { ws, relay } = createMockWs(session.id);
2328
+
2329
+ await relay.handleMessage(
2330
+ JSON.stringify({
2331
+ type: "setup",
2332
+ callSid: "CA_unverified_guardian",
2333
+ from: "+15558886666",
2334
+ to: "+15551111111",
2335
+ }),
2336
+ );
2337
+
2338
+ // Should be disconnecting (not awaiting_name, not normal_call)
2339
+ expect(relay.getConnectionState()).toBe("disconnecting");
2340
+
2341
+ const updated = getCallSession(session.id);
2342
+ expect(updated).not.toBeNull();
2343
+ expect(updated!.status).toBe("failed");
2344
+
2345
+ const textMessages = ws.sentMessages
2346
+ .map((raw) => JSON.parse(raw) as { type: string; token?: string })
2347
+ .filter((m) => m.type === "text");
2348
+ const promptText = textMessages.map((m) => m.token ?? "").join("");
2349
+ expect(promptText).toContain("Vargas");
2350
+ expect(promptText).toContain("has not been verified yet");
2351
+ expect(promptText).toContain("contacts page");
2352
+ expect(promptText).not.toContain("reach out to the account guardian");
2353
+ expect(promptText).not.toContain("don't recognize");
2354
+
2355
+ const events = getCallEvents(session.id);
2356
+ const aclEvent = events.find(
2357
+ (e) => e.eventType === "inbound_acl_unverified_caller",
2358
+ );
2359
+ expect(aclEvent).toBeTruthy();
2360
+ expect(
2361
+ (JSON.parse(aclEvent!.payloadJson) as { isGuardian?: boolean })
2362
+ .isGuardian,
2363
+ ).toBe(true);
2364
+
2365
+ // Let delayed endSession callback flush
2366
+ await new Promise((resolve) => setTimeout(resolve, 10));
2367
+
2368
+ relay.destroy();
2369
+ });
2370
+
2371
+ test("inbound voice: non-guardian contact with pending channel gets reach-out copy", async () => {
2372
+ ensureConversation("conv-pending-contact");
2373
+ const session = createCallSession({
2374
+ conversationId: "conv-pending-contact",
2375
+ provider: "twilio",
2376
+ fromNumber: "+15558887777",
2377
+ toNumber: "+15551111111",
2378
+ });
2379
+
2380
+ upsertContactChannel({
2381
+ sourceChannel: "phone",
2382
+ externalUserId: "+15558887777",
2383
+ externalChatId: "+15558887777",
2384
+ displayName: "Pending Pat",
2385
+ // role defaults to "contact" — exercises the non-guardian branch
2386
+ status: "pending",
2387
+ policy: "allow",
2388
+ });
2389
+
2390
+ const { ws, relay } = createMockWs(session.id);
2391
+
2392
+ await relay.handleMessage(
2393
+ JSON.stringify({
2394
+ type: "setup",
2395
+ callSid: "CA_pending_contact",
2396
+ from: "+15558887777",
2397
+ to: "+15551111111",
2398
+ }),
2399
+ );
2400
+
2401
+ expect(relay.getConnectionState()).toBe("disconnecting");
2402
+
2403
+ const textMessages = ws.sentMessages
2404
+ .map((raw) => JSON.parse(raw) as { type: string; token?: string })
2405
+ .filter((m) => m.type === "text");
2406
+ const promptText = textMessages.map((m) => m.token ?? "").join("");
2407
+ expect(promptText).toContain("Pending Pat");
2408
+ expect(promptText).toContain("has not been verified yet");
2409
+ expect(promptText).toContain("reach out to the account guardian");
2410
+ expect(promptText).not.toContain("contacts page");
2411
+
2412
+ const events = getCallEvents(session.id);
2413
+ const aclEvent = events.find(
2414
+ (e) => e.eventType === "inbound_acl_unverified_caller",
2415
+ );
2416
+ expect(aclEvent).toBeTruthy();
2417
+ expect(
2418
+ (JSON.parse(aclEvent!.payloadJson) as { isGuardian?: boolean })
2419
+ .isGuardian,
2420
+ ).toBe(false);
2421
+
2422
+ await new Promise((resolve) => setTimeout(resolve, 10));
2423
+ relay.destroy();
2424
+ });
2425
+
2308
2426
  test("inbound voice: unknown caller name capture uses fallback when assistant name is unavailable", async () => {
2309
2427
  const prevName = mockAssistantName;
2310
2428
  mockAssistantName = null;
@@ -164,6 +164,21 @@ describe("retry normalization: thinking + forced tool_choice", () => {
164
164
  expect(lastConfig()?.thinking).toEqual({ type: "disabled" });
165
165
  });
166
166
 
167
+ test("normalizes raw { enabled: false } from pass-through callers to wire shape", async () => {
168
+ // Pass-through callers (e.g. host.providers.llm.complete) may forward the
169
+ // schema-shape `{ enabled: false }` without a callSite. The normalizer must
170
+ // convert it to Anthropic's wire shape `{ type: "disabled" }`, otherwise
171
+ // Anthropic rejects the request with a 400 on malformed `thinking`.
172
+ const { provider, lastConfig } = makePipeline("anthropic");
173
+ await provider.sendMessage([userMessage], undefined, undefined, {
174
+ config: {
175
+ thinking: { enabled: false },
176
+ tool_choice: { type: "tool", name: "select_memories" },
177
+ },
178
+ });
179
+ expect(lastConfig()?.thinking).toEqual({ type: "disabled" });
180
+ });
181
+
167
182
  test("preserves resolved thinking: disabled with forced tool_choice", async () => {
168
183
  setLlmConfig({
169
184
  default: {
@@ -8,9 +8,39 @@ mock.module("../util/logger.js", () => ({
8
8
  truncateForLog: (value: string) => value,
9
9
  }));
10
10
 
11
- const mockEmitFeedEvent = mock(() => Promise.resolve());
12
- mock.module("../home/emit-feed-event.js", () => ({
13
- emitFeedEvent: mockEmitFeedEvent,
11
+ // The scheduler's fresh-bootstrap path routes through `runBackgroundJob`,
12
+ // which invokes the real `processMessage` from `daemon/process-message.ts`
13
+ // instead of the test-injected callback. To keep these tests focused on
14
+ // the scheduler's retry policy (not on the runner's plumbing or on having
15
+ // a real provider configured), redirect every `runBackgroundJob` call back
16
+ // to the injected `processMessage` so a single test scenario controls
17
+ // success-vs-failure deterministically.
18
+ let injectedProcessMessageForRunner:
19
+ | ((conversationId: string, message: string) => Promise<unknown>)
20
+ | null = null;
21
+ mock.module("../runtime/background-job-runner.js", () => ({
22
+ runBackgroundJob: async (opts: {
23
+ jobName: string;
24
+ prompt: string;
25
+ onConversationCreated?: (conversationId: string) => void;
26
+ }) => {
27
+ const conversationId = `mock-conv-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
28
+ opts.onConversationCreated?.(conversationId);
29
+ try {
30
+ if (injectedProcessMessageForRunner) {
31
+ await injectedProcessMessageForRunner(conversationId, opts.prompt);
32
+ }
33
+ return { conversationId, ok: true };
34
+ } catch (err) {
35
+ const error = err instanceof Error ? err : new Error(String(err));
36
+ return {
37
+ conversationId,
38
+ ok: false,
39
+ error,
40
+ errorKind: "exception" as const,
41
+ };
42
+ }
43
+ },
14
44
  }));
15
45
 
16
46
  import { getDb } from "../memory/db-connection.js";
@@ -28,7 +58,29 @@ import {
28
58
  scheduleRetry,
29
59
  } from "../schedule/schedule-store.js";
30
60
  import type { SchedulerHandle } from "../schedule/scheduler.js";
31
- import { startScheduler } from "../schedule/scheduler.js";
61
+ import { startScheduler as startSchedulerReal } from "../schedule/scheduler.js";
62
+ import type { ScheduleMessageProcessor } from "../schedule/scheduler-types.js";
63
+
64
+ /**
65
+ * Wrap `startScheduler` so the same `processMessage` the scheduler holds for
66
+ * its conversation-reuse path is also handed to the mocked
67
+ * `runBackgroundJob` for the fresh-bootstrap path. The two paths in scheduler
68
+ * production code dispatch through different mechanisms; tests exercise both
69
+ * deterministically through this single callback.
70
+ */
71
+ function startScheduler(
72
+ processMessage: ScheduleMessageProcessor,
73
+ notifyScheduleOneShot: Parameters<typeof startSchedulerReal>[1],
74
+ options?: Parameters<typeof startSchedulerReal>[2],
75
+ ): SchedulerHandle {
76
+ injectedProcessMessageForRunner = async (
77
+ conversationId: string,
78
+ message: string,
79
+ ) => {
80
+ await processMessage(conversationId, message, { trustClass: "guardian" });
81
+ };
82
+ return startSchedulerReal(processMessage, notifyScheduleOneShot, options);
83
+ }
32
84
 
33
85
  initializeDb();
34
86
 
@@ -334,6 +334,110 @@ describe("schedule runs list — limit handling", () => {
334
334
  });
335
335
  });
336
336
 
337
+ // ── POST /schedules — create ─────────────────────────────────────────────
338
+
339
+ describe("POST /schedules — create", () => {
340
+ beforeEach(() => {
341
+ clearTables();
342
+ });
343
+
344
+ function postCreate(body: Record<string, unknown>) {
345
+ const route = findRoute("schedules", "POST");
346
+ return route.handler({ body }) as { schedules: Array<{ id: string }> };
347
+ }
348
+
349
+ test("creates a recurring execute schedule with defaults", () => {
350
+ const result = postCreate({
351
+ name: "Morning ping",
352
+ expression: "0 9 * * *",
353
+ message: "good morning",
354
+ });
355
+ expect(result.schedules).toHaveLength(1);
356
+ const job = listSchedules()[0];
357
+ expect(job.name).toBe("Morning ping");
358
+ expect(job.mode).toBe("execute");
359
+ expect(job.expression).toBe("0 9 * * *");
360
+ expect(job.syntax).toBe("cron");
361
+ expect(job.enabled).toBe(true);
362
+ expect(job.timezone).toBeNull();
363
+ });
364
+
365
+ test("trims whitespace and accepts an explicit timezone", () => {
366
+ postCreate({
367
+ name: " Trimmed ",
368
+ expression: " 0 9 * * * ",
369
+ message: "hi",
370
+ timezone: " America/New_York ",
371
+ });
372
+ const job = listSchedules()[0];
373
+ expect(job.name).toBe("Trimmed");
374
+ expect(job.expression).toBe("0 9 * * *");
375
+ expect(job.timezone).toBe("America/New_York");
376
+ });
377
+
378
+ test("accepts an rrule expression and detects syntax", () => {
379
+ const expression = "DTSTART:20260101T000000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO";
380
+ postCreate({
381
+ name: "Weekly",
382
+ expression,
383
+ message: "monday wake",
384
+ });
385
+ const job = listSchedules()[0];
386
+ expect(job.syntax).toBe("rrule");
387
+ expect(job.expression).toBe(expression);
388
+ });
389
+
390
+ test("rejects missing required fields", () => {
391
+ expect(() => postCreate({ expression: "* * * * *", message: "hi" })).toThrow(
392
+ "name is required",
393
+ );
394
+ expect(() => postCreate({ name: "x", message: "hi" })).toThrow(
395
+ "expression is required",
396
+ );
397
+ expect(() => postCreate({ name: "x", expression: "* * * * *" })).toThrow(
398
+ "message is required",
399
+ );
400
+ });
401
+
402
+ test("rejects non-execute modes", () => {
403
+ expect(() =>
404
+ postCreate({
405
+ name: "x",
406
+ expression: "* * * * *",
407
+ message: "hi",
408
+ mode: "notify",
409
+ }),
410
+ ).toThrow("Only 'execute' mode is supported");
411
+ });
412
+
413
+ test("rejects an unparseable expression", () => {
414
+ expect(() =>
415
+ postCreate({ name: "x", expression: "not-a-cron", message: "hi" }),
416
+ ).toThrow("could not be parsed");
417
+ });
418
+
419
+ test("surfaces invalid-cron errors from the store as 400s", () => {
420
+ expect(() =>
421
+ postCreate({
422
+ name: "x",
423
+ expression: "99 99 99 99 99",
424
+ message: "hi",
425
+ }),
426
+ ).toThrow();
427
+ });
428
+
429
+ test("respects enabled=false", () => {
430
+ postCreate({
431
+ name: "Off",
432
+ expression: "0 9 * * *",
433
+ message: "hi",
434
+ enabled: false,
435
+ });
436
+ const job = listSchedules()[0];
437
+ expect(job.enabled).toBe(false);
438
+ });
439
+ });
440
+
337
441
  // ── Wake mode support ─────────────────────────────────────────────────────
338
442
 
339
443
  describe("wake mode in schedule routes", () => {
@@ -16,10 +16,6 @@ mock.module("../runtime/agent-wake.js", () => ({
16
16
  ),
17
17
  }));
18
18
 
19
- mock.module("../home/emit-feed-event.js", () => ({
20
- emitFeedEvent: mock(() => Promise.resolve()),
21
- }));
22
-
23
19
  mock.module("../config/loader.js", () => ({
24
20
  getConfig: () => ({}),
25
21
  loadConfig: () => ({}),
@@ -16,6 +16,40 @@ mock.module("../util/logger.js", () => ({
16
16
  truncateForLog: (value: string) => value,
17
17
  }));
18
18
 
19
+ // Mock the shared `runBackgroundJob` runner so the scheduler's fresh-bootstrap
20
+ // talk-mode path stays observable in unit tests. Each invocation creates a new
21
+ // conversation row (so downstream lookups reflect reality) and pushes the
22
+ // prompt onto the per-test message log via the supplied `onPrompt` hook.
23
+ let onRunBackgroundJobPrompt:
24
+ | ((info: { conversationId: string; prompt: string }) => void)
25
+ | null = null;
26
+ let runBackgroundJobShouldFail = false;
27
+ mock.module("../runtime/background-job-runner.js", () => ({
28
+ runBackgroundJob: async (opts: { prompt: string; groupId?: string }) => {
29
+ const { createConversation } =
30
+ await import("../memory/conversation-crud.js");
31
+ const conv = createConversation({
32
+ title: "(test stub)",
33
+ conversationType: "background",
34
+ source: "schedule",
35
+ ...(opts.groupId ? { groupId: opts.groupId } : {}),
36
+ });
37
+ onRunBackgroundJobPrompt?.({
38
+ conversationId: conv.id,
39
+ prompt: opts.prompt,
40
+ });
41
+ if (runBackgroundJobShouldFail) {
42
+ return {
43
+ conversationId: conv.id,
44
+ ok: false,
45
+ error: new Error("Simulated failure"),
46
+ errorKind: "exception" as const,
47
+ };
48
+ }
49
+ return { conversationId: conv.id, ok: true };
50
+ },
51
+ }));
52
+
19
53
  import { getDb } from "../memory/db-connection.js";
20
54
  import { initializeDb } from "../memory/db-init.js";
21
55
  import {
@@ -102,6 +136,8 @@ describe("scheduler RRULE execution", () => {
102
136
  db.run("DELETE FROM tasks");
103
137
  db.run("DELETE FROM messages");
104
138
  db.run("DELETE FROM conversations");
139
+ onRunBackgroundJobPrompt = null;
140
+ runBackgroundJobShouldFail = false;
105
141
  });
106
142
 
107
143
  test("RRULE schedule fires and creates cron_runs entry", async () => {
@@ -123,15 +159,18 @@ describe("scheduler RRULE execution", () => {
123
159
  forceScheduleDue(schedule.id);
124
160
 
125
161
  const processedMessages: { conversationId: string; message: string }[] = [];
126
- const processMessage = async (conversationId: string, message: string) => {
127
- processedMessages.push({ conversationId, message });
162
+ onRunBackgroundJobPrompt = ({ conversationId, prompt }) => {
163
+ processedMessages.push({ conversationId, message: prompt });
128
164
  };
129
165
 
130
- const scheduler = startScheduler(processMessage, () => {});
166
+ const scheduler = startScheduler(
167
+ async () => {},
168
+ () => {},
169
+ );
131
170
  await new Promise((resolve) => setTimeout(resolve, 500));
132
171
  scheduler.stop();
133
172
 
134
- // processMessage should have been called with the RRULE message
173
+ // The runner should have been invoked with the RRULE message
135
174
  expect(
136
175
  processedMessages.some((m) => m.message === "Hello from RRULE"),
137
176
  ).toBe(true);
@@ -227,12 +266,15 @@ describe("scheduler RRULE execution", () => {
227
266
  );
228
267
 
229
268
  const processedMessages: string[] = [];
230
- const processMessage = async (_conversationId: string, message: string) => {
231
- processedMessages.push(message);
269
+ onRunBackgroundJobPrompt = ({ prompt }) => {
270
+ processedMessages.push(prompt);
232
271
  };
233
272
 
234
273
  // First tick: the expired schedule should fire its final due run
235
- const scheduler1 = startScheduler(processMessage, () => {});
274
+ const scheduler1 = startScheduler(
275
+ async () => {},
276
+ () => {},
277
+ );
236
278
  await new Promise((resolve) => setTimeout(resolve, 500));
237
279
  scheduler1.stop();
238
280
 
@@ -252,7 +294,10 @@ describe("scheduler RRULE execution", () => {
252
294
 
253
295
  // Second tick: the disabled schedule must NOT fire again
254
296
  processedMessages.length = 0;
255
- const scheduler2 = startScheduler(processMessage, () => {});
297
+ const scheduler2 = startScheduler(
298
+ async () => {},
299
+ () => {},
300
+ );
256
301
  await new Promise((resolve) => setTimeout(resolve, 500));
257
302
  scheduler2.stop();
258
303
 
@@ -278,15 +323,18 @@ describe("scheduler RRULE execution", () => {
278
323
  forceScheduleDue(schedule.id);
279
324
 
280
325
  const processedMessages: { conversationId: string; message: string }[] = [];
281
- const processMessage = async (conversationId: string, message: string) => {
282
- processedMessages.push({ conversationId, message });
326
+ onRunBackgroundJobPrompt = ({ conversationId, prompt }) => {
327
+ processedMessages.push({ conversationId, message: prompt });
283
328
  };
284
329
 
285
- const scheduler = startScheduler(processMessage, () => {});
330
+ const scheduler = startScheduler(
331
+ async () => {},
332
+ () => {},
333
+ );
286
334
  await new Promise((resolve) => setTimeout(resolve, 500));
287
335
  scheduler.stop();
288
336
 
289
- // processMessage should have been called with the cron message
337
+ // The runner should have been invoked with the cron message
290
338
  expect(processedMessages.some((m) => m.message === "Cron message")).toBe(
291
339
  true,
292
340
  );
@@ -337,12 +385,10 @@ describe("scheduler RRULE execution", () => {
337
385
  // Force the schedule to be due
338
386
  forceScheduleDue(schedule.id);
339
387
 
340
- const processedMessages: string[] = [];
341
- const processMessage = async (_conversationId: string, message: string) => {
342
- processedMessages.push(message);
343
- };
344
-
345
- const scheduler = startScheduler(processMessage, () => {});
388
+ const scheduler = startScheduler(
389
+ async () => {},
390
+ () => {},
391
+ );
346
392
  await new Promise((resolve) => setTimeout(resolve, 500));
347
393
  scheduler.stop();
348
394
 
@@ -387,11 +433,14 @@ describe("scheduler RRULE execution", () => {
387
433
  forceScheduleDue(schedule.id);
388
434
 
389
435
  const processedMessages: string[] = [];
390
- const processMessage = async (_conversationId: string, message: string) => {
391
- processedMessages.push(message);
436
+ onRunBackgroundJobPrompt = ({ prompt }) => {
437
+ processedMessages.push(prompt);
392
438
  };
393
439
 
394
- const scheduler = startScheduler(processMessage, () => {});
440
+ const scheduler = startScheduler(
441
+ async () => {},
442
+ () => {},
443
+ );
395
444
  await new Promise((resolve) => setTimeout(resolve, 500));
396
445
  scheduler.stop();
397
446
 
@@ -463,14 +512,14 @@ describe("scheduler RRULE execution", () => {
463
512
  forceScheduleDue(schedule.id);
464
513
 
465
514
  const processedMessages: string[] = [];
466
- const processMessage = async (
467
- _conversationId: string,
468
- message: string,
469
- ) => {
470
- processedMessages.push(message);
515
+ onRunBackgroundJobPrompt = ({ prompt }) => {
516
+ processedMessages.push(prompt);
471
517
  };
472
518
 
473
- const scheduler = startScheduler(processMessage, () => {});
519
+ const scheduler = startScheduler(
520
+ async () => {},
521
+ () => {},
522
+ );
474
523
  await new Promise((resolve) => setTimeout(resolve, 500));
475
524
  scheduler.stop();
476
525
 
@@ -536,11 +585,14 @@ describe("scheduler RRULE execution", () => {
536
585
  expect(getSchedule(schedule.id)!.status).toBe("active");
537
586
 
538
587
  const processedMessages: { conversationId: string; message: string }[] = [];
539
- const processMessage = async (conversationId: string, message: string) => {
540
- processedMessages.push({ conversationId, message });
588
+ onRunBackgroundJobPrompt = ({ conversationId, prompt }) => {
589
+ processedMessages.push({ conversationId, message: prompt });
541
590
  };
542
591
 
543
- const scheduler = startScheduler(processMessage, () => {});
592
+ const scheduler = startScheduler(
593
+ async () => {},
594
+ () => {},
595
+ );
544
596
  await new Promise((resolve) => setTimeout(resolve, 500));
545
597
  scheduler.stop();
546
598
 
@@ -617,11 +669,12 @@ describe("scheduler RRULE execution", () => {
617
669
 
618
670
  expect(getSchedule(schedule.id)!.status).toBe("active");
619
671
 
620
- const processMessage = async () => {
621
- throw new Error("Simulated failure");
622
- };
672
+ runBackgroundJobShouldFail = true;
623
673
 
624
- const scheduler = startScheduler(processMessage, () => {});
674
+ const scheduler = startScheduler(
675
+ async () => {},
676
+ () => {},
677
+ );
625
678
  await new Promise((resolve) => setTimeout(resolve, 500));
626
679
  scheduler.stop();
627
680